Pixel Manager for WooCommerce – Track Google Analytics, Google Ads, Facebook and more - Version 1.15.2

Version Description

21.03.2022

  • Tweak: Silenced status icon on compatibility mode setting when disabled
  • Tweak: Made Autoptimize, FlyingPress, Async JavaScript, Optimocha and WP Optimize JavaScript optimization disabler optional through compatibility mode
  • Tweak: Made Litespeed Cache and SG Optimizer JavaScript optimization disabler mostly optional through compatibility mode. Some exclusion have been left permanent without which the tracking scripts would break.
  • Fix: Added safeguard if old version of FlyingPress is being used and compatibility mode is enabled
  • Fix: Added safeguard if old version of WP Rocket is being used and compatibility mode is enabled
  • Fix: Added safeguard if Yoast SEO is being used and compatibility mode is enabled
Download this release

Release Info

Developer alekv
Plugin Icon 128x128 Pixel Manager for WooCommerce – Track Google Analytics, Google Ads, Facebook and more
Version 1.15.2
Comparing to
See all releases

Code changes from version 1.16.6 to 1.15.2

Files changed (42) hide show
  1. classes/admin/class-admin.php +213 -87
  2. classes/admin/class-ask-for-rating.php +2 -2
  3. classes/admin/class-environment-check.php +3 -4
  4. classes/admin/class-notifications.php +2 -2
  5. classes/class-default-options.php +13 -49
  6. classes/pixels/class-cookie-consent-management.php +2 -2
  7. classes/pixels/class-pixel-manager.php +42 -34
  8. classes/pixels/class-pixel.php +6 -0
  9. classes/pixels/class-script-manager.php +13 -17
  10. classes/pixels/class-shortcodes.php +54 -57
  11. classes/pixels/google/class-google-analytics-refund.php +1 -0
  12. classes/pixels/google/class-google-pixel-manager.php +9 -14
  13. classes/pixels/google/class-google.php +16 -398
  14. classes/pixels/google/trait-google.php +61 -54
  15. classes/pixels/trait-product.php +61 -41
  16. classes/pixels/trait-shop.php +376 -282
  17. css/admin.css +2 -2
  18. js/admin/wpm-admin-freemius.p1.min.js +1 -1
  19. js/admin/wpm-admin-freemius.p1.min.js.map +1 -1
  20. js/admin/wpm-admin.p1.min.js +1 -1
  21. js/public/facebook.js +307 -0
  22. js/public/google-ads.js +305 -0
  23. js/public/google-ga-4.js +83 -0
  24. js/public/google-ga-ua.js +89 -0
  25. js/public/google-optimize.js +34 -0
  26. js/public/google.js +279 -0
  27. js/public/hotjar.js +39 -0
  28. js/public/main-free.js +27 -0
  29. js/public/main-premium.js +57 -0
  30. js/public/main.js +33 -0
  31. js/public/wpm-loader.js +17 -0
  32. js/public/wpm-public.p1.min.js +1 -1
  33. js/public/wpm-public.p1.min.js.map +1 -1
  34. js/public/wpm-public__premium_only.p1.min.js +2 -0
  35. js/public/wpm-public__premium_only.p1.min.js.map +1 -0
  36. js/public/wpm.js +1905 -0
  37. languages/woocommerce-google-adwords-conversion-tracking-tag.pot +214 -186
  38. readme.txt +23 -95
  39. vendor/freemius/wordpress-sdk/assets/img/plugin-icon.png +0 -0
  40. vendor/freemius/wordpress-sdk/assets/img/theme-icon.png +0 -0
  41. vendor/freemius/wordpress-sdk/assets/img/woocommerce-google-adwords-conversion-tracking-tag.png +0 -0
  42. wgact.php +11 -6
classes/admin/class-admin.php CHANGED
@@ -1,10 +1,13 @@
1
  <?php
2
 
3
  // TODO move script for copying debug info into a proper .js enqueued file, or switch tabs to JavaScript switching and always save all settings at the same time
 
4
  namespace WCPM\Classes\Admin;
5
 
6
- use WCPM\Classes\Pixels\Google\Google ;
 
7
  use WCPM\Classes\Pixels\Trait_Shop ;
 
8
 
9
  if ( !defined( 'ABSPATH' ) ) {
10
  exit;
@@ -13,6 +16,7 @@ if ( !defined( 'ABSPATH' ) ) {
13
 
14
  class Admin
15
  {
 
16
  use Trait_Shop ;
17
  public $ip ;
18
  protected $text_domain ;
@@ -21,13 +25,11 @@ class Admin
21
  protected $documentation ;
22
  private $consent_mode_regions ;
23
  private $validations ;
24
- private $google ;
25
  public function __construct( $options )
26
  {
27
  $this->options = $options;
28
  $this->plugin_hook = 'woocommerce_page_wpm';
29
  $this->documentation = new Documentation();
30
- $this->google = new Google( $this->options );
31
  add_action( 'admin_enqueue_scripts', [ $this, 'wpm_admin_scripts' ] );
32
  // add the admin options page
33
  add_action( 'admin_menu', [ $this, 'wpm_plugin_admin_add_page' ], 99 );
@@ -46,7 +48,7 @@ class Admin
46
 
47
  protected function if_is_wpm_admin_page()
48
  {
49
- $_get = filter_input_array( INPUT_GET, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
50
 
51
  if ( !empty($_get['page']) && 'wpm' === $_get['page'] ) {
52
  return true;
@@ -75,7 +77,7 @@ class Admin
75
 
76
  public function my_after_purchase_js( $js_function )
77
  {
78
- return "function ( response ) {\n\n let\n isTrial = (null != response.purchase.trial_ends),\n isSubscription = (null != response.purchase.initial_amount),\n total = isTrial ? 0 : (isSubscription ? response.purchase.initial_amount : response.purchase.gross).toString(),\n productName = 'WooCommerce Pixel Manager',\n // storeUrl = 'https://sweetcode.com',\n storeName = 'SweetCode';\n \n window.dataLayer = window.dataLayer || [];\n\n function gtag() {\n dataLayer.push(arguments);\n }\n \n gtag('js', new Date()); \n \n gtag('config', 'UA-39746956-10', {'anonymize_ip': true});\n gtag('config', 'G-2QE000DX8D');\n gtag('config', 'AW-406204436');\n \n gtag('event', 'purchase', {\n 'send_to':['UA-39746956-10', 'G-2QE000DX8D'],\n 'transaction_id':response.purchase.id.toString(),\n 'currency': response.purchase.currency.toUpperCase(),\n 'discount':0,\n 'items':[{\n 'id':response.purchase.plan_id.toString(),\n 'quantity':1,\n 'price':total,\n 'name':productName,\n 'category': 'Plugin',\n }],\n 'affiliation': storeName,\n 'value':response.purchase.initial_amount.toString()\n });\n \n gtag('event', 'conversion', {\n 'send_to': 'AW-406204436/XrUYCK3J8YoCEJTg2MEB',\n 'value': response.purchase.initial_amount.toString(),\n 'currency': response.purchase.currency.toUpperCase(),\n 'transaction_id': response.purchase.id.toString()\n });\n \n !function(f,b,e,v,n,t,s)\n {if(f.fbq)return;n=f.fbq=function(){n.callMethod?\n n.callMethod.apply(n,arguments):n.queue.push(arguments)};\n if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';\n n.queue=[];t=b.createElement(e);t.async=!0;\n t.src=v;s=b.getElementsByTagName(e)[0];\n s.parentNode.insertBefore(t,s)}(window, document,'script',\n 'https://connect.facebook.net/en_US/fbevents.js');\n fbq('init', '257839909406661');\n fbq('track', 'PageView');\n \n fbq('track', 'Purchase', {\n currency: 'USD',\n value: total\n });\n \n var _dcq = _dcq || [];\n\t\t\tvar _dcs = _dcs || {};\n\t\t\t_dcs.account = '5594556';\n\t\n\t\t\t(function() {\n\t\t\t\tvar dc = document.createElement('script');\n\t\t\t\tdc.type = 'text/javascript'; dc.async = true;\n\t\t\t\tdc.src = '//tag.getdrip.com/5594556.js';\n\t\t\t\tvar s = document.getElementsByTagName('script')[0];\n\t\t\t\ts.parentNode.insertBefore(dc, s);\n\t\t\t})();\n\t\t\t\n\t\t\twindow._dcq.push([\n\t\t\t\t'track',\n\t\t\t\t'Placed an order',\n\t\t\t]);\n\t\t\t\n\t\t\twindow._dcq.push([\n\t\t\t\t'track',\n\t\t\t\t'purchase,\n\t\t\t\t{\n\t\t\t\t\tvalue: total * 100,\n\t\t\t\t\tcurrency_code: response.purchase.currency.toUpperCase(),\n\t\t\t\t}\n\t\t\t]);\n \n }";
79
  }
80
 
81
  public function my_checkout_enrich( $html )
@@ -234,7 +236,7 @@ class Admin
234
  public function add_section_main_subsection_facebook( $section_ids )
235
  {
236
  $sub_section_ids = [
237
- 'title' => esc_html__( 'Meta (Facebook)', 'woocommerce-google-adwords-conversion-tracking-tag' ),
238
  'slug' => 'facebook',
239
  ];
240
  add_settings_field(
@@ -249,7 +251,7 @@ class Admin
249
  // add the field for the conversion label
250
  add_settings_field(
251
  'wpm_plugin_facebook_pixel_id',
252
- esc_html__( 'Meta (Facebook) pixel ID', 'woocommerce-google-adwords-conversion-tracking-tag' ),
253
  [ $this, 'wpm_option_html_facebook_pixel_id' ],
254
  'wpm_plugin_options_page',
255
  $section_ids['settings_name']
@@ -388,16 +390,6 @@ class Admin
388
  'wpm_plugin_options_page',
389
  $section_ids['settings_name']
390
  );
391
- if ( wpm_fs()->is__premium_only() || $this->options['general']['pro_version_demo'] ) {
392
- // add checkbox for disabling tracking for user roles
393
- add_settings_field(
394
- 'wpm_setting_disable_tracking_for_user_roles',
395
- esc_html__( 'Disable Tracking for User Roles', 'woocommerce-google-adwords-conversion-tracking-tag' ),
396
- [ $this, 'wpm_setting_html_disable_tracking_for_user_roles' ],
397
- 'wpm_plugin_options_page',
398
- $section_ids['settings_name']
399
- );
400
- }
401
  }
402
 
403
  public function add_section_advanced_subsection_google( $section_ids )
@@ -415,6 +407,16 @@ class Admin
415
  'wpm_plugin_options_page',
416
  $section_ids['settings_name']
417
  );
 
 
 
 
 
 
 
 
 
 
418
  // add the field for the aw_merchant_id
419
  add_settings_field(
420
  'wpm_plugin_aw_merchant_id',
@@ -607,7 +609,7 @@ class Admin
607
  public function add_section_advanced_subsection_facebook( $section_ids )
608
  {
609
  $sub_section_ids = [
610
- 'title' => 'Meta (Facebook)',
611
  'slug' => 'facebook',
612
  ];
613
  add_settings_field(
@@ -622,7 +624,7 @@ class Admin
622
  // add field for the Facebook CAPI token
623
  add_settings_field(
624
  'wpm_setting_facebook_capi_token',
625
- esc_html__( 'Meta (Facebook) CAPI: token', 'woocommerce-google-adwords-conversion-tracking-tag' ),
626
  [ $this, 'wpm_setting_html_facebook_capi_token' ],
627
  'wpm_plugin_options_page',
628
  $section_ids['settings_name']
@@ -630,7 +632,7 @@ class Admin
630
  // add field for the Facebook CAPI user transparency process anonymous hits
631
  add_settings_field(
632
  'wpm_setting_facebook_capi_user_transparency_process_anonymous_hits',
633
- esc_html__( 'Meta (Facebook) CAPI: process anonymous hits', 'woocommerce-google-adwords-conversion-tracking-tag' ),
634
  [ $this, 'wpm_setting_facebook_capi_user_transparency_process_anonymous_hits' ],
635
  'wpm_plugin_options_page',
636
  $section_ids['settings_name']
@@ -638,7 +640,7 @@ class Admin
638
  // add field for the Facebook CAPI user transparency send additional client identifiers
639
  add_settings_field(
640
  'wpm_setting_facebook_capi_user_transparency_send_additional_client_identifiers',
641
- esc_html__( 'Meta (Facebook) CAPI: send additional visitor identifiers', 'woocommerce-google-adwords-conversion-tracking-tag' ),
642
  [ $this, 'wpm_setting_facebook_capi_user_transparency_send_additional_client_identifiers' ],
643
  'wpm_plugin_options_page',
644
  $section_ids['settings_name']
@@ -646,7 +648,7 @@ class Admin
646
  // add fields for Facebook microdata
647
  add_settings_field(
648
  'wpm_setting_facebook_microdata_active',
649
- esc_html__( 'Meta (Facebook) Microdata Tags for Catalogues', 'woocommerce-google-adwords-conversion-tracking-tag' ),
650
  [ $this, 'wpm_setting_html_facebook_microdata' ],
651
  'wpm_plugin_options_page',
652
  $section_ids['settings_name']
@@ -668,6 +670,39 @@ class Admin
668
  [ $this, 'wpm_plugin_section_add_cart_data_description' ],
669
  'wpm_plugin_options_page'
670
  );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
671
  // add checkbox for dynamic remarketing
672
  add_settings_field(
673
  'wpm_plugin_option_gads_dynamic_remarketing',
@@ -785,7 +820,7 @@ class Admin
785
 
786
  <script>
787
  if (typeof wpm_hide_script_blocker_warning === "function") {
788
- wpm_hide_script_blocker_warning()
789
  }
790
  </script>
791
 
@@ -1149,7 +1184,7 @@ class Admin
1149
  $this->get_status_icon_new( $this->options['facebook']['pixel_id'] );
1150
  $this->get_documentation_html_by_key( 'facebook_pixel_id' );
1151
  echo '<br><br>' ;
1152
- esc_html_e( 'The Meta (Facebook) pixel ID looks similar to this:', 'woocommerce-google-adwords-conversion-tracking-tag' );
1153
  echo '&nbsp;<i>765432112345678</i>' ;
1154
  }
1155
 
@@ -1335,7 +1370,7 @@ class Admin
1335
  <a class="documentation-icon" href="<?php
1336
  echo esc_url( $path ) ;
1337
  ?>" target="_blank">
1338
- <span style="vertical-align: top; margin-top: 0" class="dashicons dashicons-info-outline tooltip"><span
1339
  class="tooltiptext">
1340
  <?php
1341
  esc_html_e( 'open the documentation', 'woocommerce-google-adwords-conversion-tracking-tag' );
@@ -1345,6 +1380,42 @@ class Admin
1345
  <?php
1346
  }
1347
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1348
  public function wpm_setting_html_google_consent_mode_active()
1349
  {
1350
  // adding the hidden input is a hack to make WordPress save the option with the value zero,
@@ -1395,7 +1466,7 @@ class Admin
1395
  <option value="<?php
1396
  esc_html_e( $region_code );
1397
  ?>" <?php
1398
- esc_html_e( ( in_array( $region_code, $this->options['google']['consent_mode']['regions'], true ) ? 'selected' : '' ) );
1399
  ?>><?php
1400
  esc_html_e( $region_name );
1401
  ?></option>
@@ -1405,9 +1476,9 @@ class Admin
1405
 
1406
  </select>
1407
  <script>
1408
- jQuery("#wpm_setting_google_consent_regions").select2({
1409
  // theme: "classic"
1410
- })
1411
  </script>
1412
  <?php
1413
  $this->get_documentation_html_by_key( 'google_consent_regions' );
@@ -1553,7 +1624,7 @@ class Admin
1553
  ?>
1554
  </label>
1555
  <?php
1556
- $this->get_status_icon_new( $this->options['google']['user_id'], $this->options['google']['analytics']['universal']['property_id'] || $this->options['google']['analytics']['ga4']['measurement_id'] || $this->google->is_google_ads_active(), true );
1557
  $this->html_pro_feature();
1558
  // echo $this->get_documentation_html('/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=google-consent-mode#/consent-mgmt/google-consent-mode');
1559
  ?>
@@ -1590,13 +1661,13 @@ class Admin
1590
  ?>
1591
  </label>
1592
  <?php
1593
- $this->get_status_icon_new( $this->options['google']['ads']['enhanced_conversions'], $this->google->is_google_ads_active(), false );
1594
  $this->html_pro_feature();
1595
  $this->get_documentation_html_by_key( 'google_ads_enhanced_conversions' );
1596
  ?>
1597
  <?php
1598
 
1599
- if ( !$this->google->is_google_ads_active() ) {
1600
  echo '<p></p><span class="dashicons dashicons-info"></span>' ;
1601
  esc_html_e( 'You need to activate Google Ads', 'woocommerce-google-adwords-conversion-tracking-tag' );
1602
  echo '</p><br>' ;
@@ -1750,7 +1821,7 @@ class Admin
1750
 
1751
  if ( !$this->options['facebook']['pixel_id'] ) {
1752
  echo '<p></p><span class="dashicons dashicons-info"></span>' ;
1753
- esc_html_e( 'You need to activate the Meta (Facebook) pixel', 'woocommerce-google-adwords-conversion-tracking-tag' );
1754
  echo '</p><br>' ;
1755
  }
1756
 
@@ -1780,7 +1851,7 @@ class Admin
1780
  ?>
1781
  />
1782
  <?php
1783
- esc_html_e( 'Send CAPI hits for anonymous visitors who likely have blocked the Meta (Facebook) pixel.', 'woocommerce-google-adwords-conversion-tracking-tag' );
1784
  ?>
1785
  </label>
1786
  <?php
@@ -1790,7 +1861,7 @@ class Admin
1790
 
1791
  if ( $this->options['facebook']['capi']['user_transparency']['process_anonymous_hits'] && !$this->options['facebook']['pixel_id'] ) {
1792
  echo '<p></p><span class="dashicons dashicons-info"></span>' ;
1793
- esc_html_e( 'You need to activate the Meta (Facebook) pixel', 'woocommerce-google-adwords-conversion-tracking-tag' );
1794
  echo '</p><br>' ;
1795
  }
1796
 
@@ -1826,7 +1897,7 @@ class Admin
1826
 
1827
  if ( $this->options['facebook']['capi']['user_transparency']['send_additional_client_identifiers'] && !$this->options['facebook']['pixel_id'] ) {
1828
  echo '<p></p><span class="dashicons dashicons-info"></span>' ;
1829
- esc_html_e( 'You need to activate the Meta (Facebook) pixel', 'woocommerce-google-adwords-conversion-tracking-tag' );
1830
  echo '</p><br>' ;
1831
  }
1832
 
@@ -1851,7 +1922,7 @@ class Admin
1851
  ?>
1852
  />
1853
  <?php
1854
- esc_html_e( 'Enable Meta (Facebook) product microdata output', 'woocommerce-google-adwords-conversion-tracking-tag' );
1855
  ?>
1856
  </label>
1857
  <?php
@@ -1861,12 +1932,44 @@ class Admin
1861
 
1862
  if ( $this->options['facebook']['microdata'] && !$this->options['facebook']['pixel_id'] ) {
1863
  echo '<p></p><span class="dashicons dashicons-info"></span>' ;
1864
- esc_html_e( 'You need to activate the Meta (Facebook) pixel', 'woocommerce-google-adwords-conversion-tracking-tag' );
1865
  echo '</p><br>' ;
1866
  }
1867
 
1868
  }
1869
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1870
  public function wpm_setting_html_order_duplication_prevention()
1871
  {
1872
  // adding the hidden input is a hack to make WordPress save the option with the value zero,
@@ -1920,45 +2023,6 @@ class Admin
1920
  $this->get_documentation_html_by_key( 'maximum_compatibility_mode' );
1921
  }
1922
 
1923
- public function wpm_setting_html_disable_tracking_for_user_roles()
1924
- {
1925
- // https://semantic-ui.com/modules/dropdown.html#multiple-selection
1926
- // https://developer.woocommerce.com/2017/08/08/selectwoo-an-accessible-replacement-for-select2/
1927
- // https://github.com/woocommerce/selectWoo
1928
- ?>
1929
- <select id="wpm_setting_disable_tracking_for_user_roles" multiple="multiple"
1930
- name="wgact_plugin_options[shop][disable_tracking_for][]"
1931
- style="width:350px; padding-left: 10px" data-placeholder="Choose roles&hellip;" aria-label="Roles"
1932
- class="wc-enhanced-select"
1933
- <?php
1934
- esc_html_e( $this->disable_if_demo() );
1935
- ?>
1936
- >
1937
- <?php
1938
- foreach ( get_editable_roles() as $role => $details ) {
1939
- ?>
1940
- <option value="<?php
1941
- esc_html_e( $role );
1942
- ?>" <?php
1943
- esc_html_e( ( in_array( $role, $this->options['shop']['disable_tracking_for'], true ) ? 'selected' : '' ) );
1944
- ?>><?php
1945
- esc_html_e( $details['name'] );
1946
- ?></option>
1947
- <?php
1948
- }
1949
- ?>
1950
-
1951
- </select>
1952
- <script>
1953
- jQuery("#wpm_setting_disable_tracking_for_user_roles").select2({
1954
- // theme: "classic"
1955
- })
1956
- </script>
1957
- <?php
1958
- // $this->get_documentation_html_by_key('google_consent_regions');
1959
- $this->html_pro_feature();
1960
- }
1961
-
1962
  private function get_order_duplication_prevention_text()
1963
  {
1964
  esc_html_e( 'Basic order duplication prevention is ', 'woocommerce-google-adwords-conversion-tracking-tag' );
@@ -2191,6 +2255,67 @@ class Admin
2191
  esc_html_e( 'ID of your Google Merchant Center account. It looks like this: 12345678', 'woocommerce-google-adwords-conversion-tracking-tag' );
2192
  }
2193
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2194
  public function wpm_plugin_option_product_identifier()
2195
  {
2196
  ?>
@@ -2442,7 +2567,7 @@ class Admin
2442
 
2443
  if ( !$this->validations->is_facebook_pixel_id( $input['facebook']['pixel_id'] ) ) {
2444
  $input['facebook']['pixel_id'] = ( isset( $this->options['facebook']['pixel_id'] ) ? $this->options['facebook']['pixel_id'] : '' );
2445
- add_settings_error( 'wgact_plugin_options', 'invalid-facebook-pixel-id', esc_html__( 'You have entered an invalid Meta (Facebook) pixel ID. It only contains 14 to 16 digits.', 'woocommerce-google-adwords-conversion-tracking-tag' ) );
2446
  }
2447
 
2448
  }
@@ -2451,7 +2576,7 @@ class Admin
2451
 
2452
  if ( !$this->validations->is_facebook_capi_token( $input['facebook']['capi']['token'] ) ) {
2453
  $input['facebook']['capi']['token'] = ( isset( $this->options['facebook']['capi']['token'] ) ? $this->options['facebook']['capi']['token'] : '' );
2454
- add_settings_error( 'wgact_plugin_options', 'invalid-facebook-pixel-id', esc_html__( 'You have entered an invalid Meta (Facebook) CAPI token.', 'woocommerce-google-adwords-conversion-tracking-tag' ) );
2455
  }
2456
 
2457
  }
@@ -2509,12 +2634,16 @@ class Admin
2509
  }
2510
 
2511
  }
2512
- /**
2513
- * Merging with the existing options and overwriting old values
2514
- * since disabling a checkbox doesn't send a value,
2515
- * we need to set one to overwrite the old value
2516
- */
2517
- return array_replace_recursive( $this->non_form_keys( $input ), $input );
 
 
 
 
2518
  }
2519
 
2520
  // Recursively go through the array and merge (overwrite old values with new ones
@@ -2554,9 +2683,6 @@ class Admin
2554
  // but should be preserved
2555
  $non_form_keys = [
2556
  'db_version' => $this->options['db_version'],
2557
- 'shop' => [
2558
- 'disable_tracking_for' => [],
2559
- ],
2560
  ];
2561
  // in case the form field input is missing
2562
  // if (!array_key_exists('google_business_vertical', $input['google']['ads'])) {
1
  <?php
2
 
3
  // TODO move script for copying debug info into a proper .js enqueued file, or switch tabs to JavaScript switching and always save all settings at the same time
4
+ // TODO debug info list of active payment gateways
5
  namespace WCPM\Classes\Admin;
6
 
7
+ use WC_Geolocation ;
8
+ use WCPM\Classes\Pixels\Google\Trait_Google ;
9
  use WCPM\Classes\Pixels\Trait_Shop ;
10
+ use WP_Screen ;
11
 
12
  if ( !defined( 'ABSPATH' ) ) {
13
  exit;
16
 
17
  class Admin
18
  {
19
+ use Trait_Google ;
20
  use Trait_Shop ;
21
  public $ip ;
22
  protected $text_domain ;
25
  protected $documentation ;
26
  private $consent_mode_regions ;
27
  private $validations ;
 
28
  public function __construct( $options )
29
  {
30
  $this->options = $options;
31
  $this->plugin_hook = 'woocommerce_page_wpm';
32
  $this->documentation = new Documentation();
 
33
  add_action( 'admin_enqueue_scripts', [ $this, 'wpm_admin_scripts' ] );
34
  // add the admin options page
35
  add_action( 'admin_menu', [ $this, 'wpm_plugin_admin_add_page' ], 99 );
48
 
49
  protected function if_is_wpm_admin_page()
50
  {
51
+ $_get = filter_input_array( INPUT_GET, FILTER_SANITIZE_STRING );
52
 
53
  if ( !empty($_get['page']) && 'wpm' === $_get['page'] ) {
54
  return true;
77
 
78
  public function my_after_purchase_js( $js_function )
79
  {
80
+ return "function ( response ) {\n\n let\n isTrial = (null != response.purchase.trial_ends),\n isSubscription = (null != response.purchase.initial_amount),\n total = isTrial ? 0 : (isSubscription ? response.purchase.initial_amount : response.purchase.gross).toString(),\n productName = 'WooCommerce Pixel Manager',\n // storeUrl = 'https://sweetcode.com',\n storeName = 'SweetCode';\n \n window.dataLayer = window.dataLayer || [];\n\n function gtag() {\n dataLayer.push(arguments);\n }\n \n gtag('js', new Date()); \n \n gtag('config', 'UA-39746956-10', {'anonymize_ip':'true'});\n gtag('config', 'G-2QE000DX8D');\n gtag('config', 'AW-406204436');\n \n gtag('event', 'purchase', {\n 'send_to':['UA-39746956-10', 'G-2QE000DX8D'],\n 'transaction_id':response.purchase.id.toString(),\n 'currency': response.purchase.currency.toUpperCase(),\n 'discount':0,\n 'items':[{\n 'id':response.purchase.plan_id.toString(),\n 'quantity':1,\n 'price':total,\n 'name':productName,\n 'category': 'Plugin',\n }],\n 'affiliation': storeName,\n 'value':response.purchase.initial_amount.toString()\n });\n \n gtag('event', 'conversion', {\n 'send_to': 'AW-406204436/XrUYCK3J8YoCEJTg2MEB',\n 'value': response.purchase.initial_amount.toString(),\n 'currency': response.purchase.currency.toUpperCase(),\n 'transaction_id': response.purchase.id.toString()\n });\n \n !function(f,b,e,v,n,t,s)\n {if(f.fbq)return;n=f.fbq=function(){n.callMethod?\n n.callMethod.apply(n,arguments):n.queue.push(arguments)};\n if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';\n n.queue=[];t=b.createElement(e);t.async=!0;\n t.src=v;s=b.getElementsByTagName(e)[0];\n s.parentNode.insertBefore(t,s)}(window, document,'script',\n 'https://connect.facebook.net/en_US/fbevents.js');\n fbq('init', '257839909406661');\n fbq('track', 'PageView');\n \n fbq('track', 'Purchase', {\n currency: 'USD',\n value: total\n });\n }";
81
  }
82
 
83
  public function my_checkout_enrich( $html )
236
  public function add_section_main_subsection_facebook( $section_ids )
237
  {
238
  $sub_section_ids = [
239
+ 'title' => esc_html__( 'Facebook', 'woocommerce-google-adwords-conversion-tracking-tag' ),
240
  'slug' => 'facebook',
241
  ];
242
  add_settings_field(
251
  // add the field for the conversion label
252
  add_settings_field(
253
  'wpm_plugin_facebook_pixel_id',
254
+ esc_html__( 'Facebook pixel ID', 'woocommerce-google-adwords-conversion-tracking-tag' ),
255
  [ $this, 'wpm_option_html_facebook_pixel_id' ],
256
  'wpm_plugin_options_page',
257
  $section_ids['settings_name']
390
  'wpm_plugin_options_page',
391
  $section_ids['settings_name']
392
  );
 
 
 
 
 
 
 
 
 
 
393
  }
394
 
395
  public function add_section_advanced_subsection_google( $section_ids )
407
  'wpm_plugin_options_page',
408
  $section_ids['settings_name']
409
  );
410
+ if ( $this->options['google']['gtag']['deactivation'] ) {
411
+ // add fields for the gtag insertion
412
+ add_settings_field(
413
+ 'wpm_plugin_option_gtag_deactivation',
414
+ esc_html__( 'gtag Deactivation', 'woocommerce-google-adwords-conversion-tracking-tag' ),
415
+ [ $this, 'wpm_setting_html_google_gtag_deactivation' ],
416
+ 'wpm_plugin_options_page',
417
+ $section_ids['settings_name']
418
+ );
419
+ }
420
  // add the field for the aw_merchant_id
421
  add_settings_field(
422
  'wpm_plugin_aw_merchant_id',
609
  public function add_section_advanced_subsection_facebook( $section_ids )
610
  {
611
  $sub_section_ids = [
612
+ 'title' => 'Facebook',
613
  'slug' => 'facebook',
614
  ];
615
  add_settings_field(
624
  // add field for the Facebook CAPI token
625
  add_settings_field(
626
  'wpm_setting_facebook_capi_token',
627
+ esc_html__( 'Facebook CAPI: token', 'woocommerce-google-adwords-conversion-tracking-tag' ),
628
  [ $this, 'wpm_setting_html_facebook_capi_token' ],
629
  'wpm_plugin_options_page',
630
  $section_ids['settings_name']
632
  // add field for the Facebook CAPI user transparency process anonymous hits
633
  add_settings_field(
634
  'wpm_setting_facebook_capi_user_transparency_process_anonymous_hits',
635
+ esc_html__( 'Facebook CAPI: process anonymous hits', 'woocommerce-google-adwords-conversion-tracking-tag' ),
636
  [ $this, 'wpm_setting_facebook_capi_user_transparency_process_anonymous_hits' ],
637
  'wpm_plugin_options_page',
638
  $section_ids['settings_name']
640
  // add field for the Facebook CAPI user transparency send additional client identifiers
641
  add_settings_field(
642
  'wpm_setting_facebook_capi_user_transparency_send_additional_client_identifiers',
643
+ esc_html__( 'Facebook CAPI: send additional visitor identifiers', 'woocommerce-google-adwords-conversion-tracking-tag' ),
644
  [ $this, 'wpm_setting_facebook_capi_user_transparency_send_additional_client_identifiers' ],
645
  'wpm_plugin_options_page',
646
  $section_ids['settings_name']
648
  // add fields for Facebook microdata
649
  add_settings_field(
650
  'wpm_setting_facebook_microdata_active',
651
+ esc_html__( 'Facebook Microdata Tags for Catalogues', 'woocommerce-google-adwords-conversion-tracking-tag' ),
652
  [ $this, 'wpm_setting_html_facebook_microdata' ],
653
  'wpm_plugin_options_page',
654
  $section_ids['settings_name']
670
  [ $this, 'wpm_plugin_section_add_cart_data_description' ],
671
  'wpm_plugin_options_page'
672
  );
673
+ // add fields for cart data
674
+ // add_settings_field(
675
+ // 'wgact_plugin_add_cart_data',
676
+ // esc_html__(
677
+ // 'Activation',
678
+ // 'woocommerce-google-adwords-conversion-tracking-tag'
679
+ // ),
680
+ // [$this, 'wgact_option_html_google_ads_add_cart_data'],
681
+ // 'wpm_plugin_options_page',
682
+ // 'wpm_plugin_beta_section'
683
+ // );
684
+ // add the field for the aw_feed_country
685
+ // add_settings_field(
686
+ // 'wgact_plugin_aw_feed_country',
687
+ // esc_html__(
688
+ // 'aw_feed_country',
689
+ // 'woocommerce-google-adwords-conversion-tracking-tag'
690
+ // ),
691
+ // [$this, 'wgact_plugin_setting_aw_feed_country'],
692
+ // 'wpm_plugin_options_page',
693
+ // 'wpm_plugin_beta_section'
694
+ // );
695
+ // add the field for the aw_feed_language
696
+ // add_settings_field(
697
+ // 'wgact_plugin_aw_feed_language',
698
+ // esc_html__(
699
+ // 'aw_feed_language',
700
+ // 'woocommerce-google-adwords-conversion-tracking-tag'
701
+ // ),
702
+ // [$this, 'wgact_plugin_setting_aw_feed_language'],
703
+ // 'wpm_plugin_options_page',
704
+ // 'wpm_plugin_beta_section'
705
+ // );
706
  // add checkbox for dynamic remarketing
707
  add_settings_field(
708
  'wpm_plugin_option_gads_dynamic_remarketing',
820
 
821
  <script>
822
  if (typeof wpm_hide_script_blocker_warning === "function") {
823
+ wpm_hide_script_blocker_warning();
824
  }
825
  </script>
826
 
1184
  $this->get_status_icon_new( $this->options['facebook']['pixel_id'] );
1185
  $this->get_documentation_html_by_key( 'facebook_pixel_id' );
1186
  echo '<br><br>' ;
1187
+ esc_html_e( 'The Facebook pixel ID looks similar to this:', 'woocommerce-google-adwords-conversion-tracking-tag' );
1188
  echo '&nbsp;<i>765432112345678</i>' ;
1189
  }
1190
 
1370
  <a class="documentation-icon" href="<?php
1371
  echo esc_url( $path ) ;
1372
  ?>" target="_blank">
1373
+ <span style="vertical-align: top; margin-top: 0px" class="dashicons dashicons-info-outline tooltip"><span
1374
  class="tooltiptext">
1375
  <?php
1376
  esc_html_e( 'open the documentation', 'woocommerce-google-adwords-conversion-tracking-tag' );
1380
  <?php
1381
  }
1382
 
1383
+ public function wpm_setting_html_google_gtag_deactivation()
1384
+ {
1385
+ // adding the hidden input is a hack to make WordPress save the option with the value zero,
1386
+ // instead of not saving it and remove that array key entirely
1387
+ // https://stackoverflow.com/a/1992745/4688612
1388
+ ?>
1389
+ <label>
1390
+ <input type='hidden' value='0' name='wgact_plugin_options[google][gtag][deactivation]'>
1391
+ <input type='checkbox' id='wpm_plugin_option_gtag_deactivation'
1392
+ name='wgact_plugin_options[google][gtag][deactivation]'
1393
+ value='1' <?php
1394
+ checked( $this->options['google']['gtag']['deactivation'] );
1395
+ ?> />
1396
+ <?php
1397
+ esc_html_e( 'Disable gtag.js insertion, if another plugin is inserting it already', 'woocommerce-google-adwords-conversion-tracking-tag' );
1398
+ ?>
1399
+ </label>
1400
+ <?php
1401
+ $this->get_documentation_html_by_key( 'google_gtag_deactivation' );
1402
+ ?>
1403
+ <br>
1404
+ <p>
1405
+ <span class="dashicons dashicons-info"></span>
1406
+ <?php
1407
+ esc_html_e( 'Only do this, if the other plugin does insert the gtag above this pixel. If not, keep the gtag active.', 'woocommerce-google-adwords-conversion-tracking-tag' );
1408
+ ?>
1409
+ </p>
1410
+ <p>
1411
+ <span class="dashicons dashicons-info"></span>
1412
+ <?php
1413
+ esc_html_e( 'This setting is deprecated. It will be removed in future versions of the plugin. Read more about it in the documentation.', 'woocommerce-google-adwords-conversion-tracking-tag' );
1414
+ ?>
1415
+ </p>
1416
+ <?php
1417
+ }
1418
+
1419
  public function wpm_setting_html_google_consent_mode_active()
1420
  {
1421
  // adding the hidden input is a hack to make WordPress save the option with the value zero,
1466
  <option value="<?php
1467
  esc_html_e( $region_code );
1468
  ?>" <?php
1469
+ esc_html_e( ( in_array( $region_code, $this->options['google']['consent_mode']['regions'] ) ? 'selected' : '' ) );
1470
  ?>><?php
1471
  esc_html_e( $region_name );
1472
  ?></option>
1476
 
1477
  </select>
1478
  <script>
1479
+ jQuery('#wpm_setting_google_consent_regions').select2({
1480
  // theme: "classic"
1481
+ });
1482
  </script>
1483
  <?php
1484
  $this->get_documentation_html_by_key( 'google_consent_regions' );
1624
  ?>
1625
  </label>
1626
  <?php
1627
+ $this->get_status_icon_new( $this->options['google']['user_id'], $this->options['google']['analytics']['universal']['property_id'] || $this->options['google']['analytics']['ga4']['measurement_id'] || $this->is_google_ads_active(), true );
1628
  $this->html_pro_feature();
1629
  // echo $this->get_documentation_html('/wgact/?utm_source=woocommerce-plugin&utm_medium=documentation-link&utm_campaign=woocommerce-pixel-manager-docs&utm_content=google-consent-mode#/consent-mgmt/google-consent-mode');
1630
  ?>
1661
  ?>
1662
  </label>
1663
  <?php
1664
+ $this->get_status_icon_new( $this->options['google']['ads']['enhanced_conversions'], $this->is_google_ads_active(), false );
1665
  $this->html_pro_feature();
1666
  $this->get_documentation_html_by_key( 'google_ads_enhanced_conversions' );
1667
  ?>
1668
  <?php
1669
 
1670
+ if ( !$this->is_google_ads_active() ) {
1671
  echo '<p></p><span class="dashicons dashicons-info"></span>' ;
1672
  esc_html_e( 'You need to activate Google Ads', 'woocommerce-google-adwords-conversion-tracking-tag' );
1673
  echo '</p><br>' ;
1821
 
1822
  if ( !$this->options['facebook']['pixel_id'] ) {
1823
  echo '<p></p><span class="dashicons dashicons-info"></span>' ;
1824
+ esc_html_e( 'You need to activate the Facebook pixel', 'woocommerce-google-adwords-conversion-tracking-tag' );
1825
  echo '</p><br>' ;
1826
  }
1827
 
1851
  ?>
1852
  />
1853
  <?php
1854
+ esc_html_e( 'Send CAPI hits for anonymous visitors who likely have blocked the Facebook pixel.', 'woocommerce-google-adwords-conversion-tracking-tag' );
1855
  ?>
1856
  </label>
1857
  <?php
1861
 
1862
  if ( $this->options['facebook']['capi']['user_transparency']['process_anonymous_hits'] && !$this->options['facebook']['pixel_id'] ) {
1863
  echo '<p></p><span class="dashicons dashicons-info"></span>' ;
1864
+ esc_html_e( 'You need to activate the Facebook pixel', 'woocommerce-google-adwords-conversion-tracking-tag' );
1865
  echo '</p><br>' ;
1866
  }
1867
 
1897
 
1898
  if ( $this->options['facebook']['capi']['user_transparency']['send_additional_client_identifiers'] && !$this->options['facebook']['pixel_id'] ) {
1899
  echo '<p></p><span class="dashicons dashicons-info"></span>' ;
1900
+ esc_html_e( 'You need to activate the Facebook pixel', 'woocommerce-google-adwords-conversion-tracking-tag' );
1901
  echo '</p><br>' ;
1902
  }
1903
 
1922
  ?>
1923
  />
1924
  <?php
1925
+ esc_html_e( 'Enable Facebook product microdata output', 'woocommerce-google-adwords-conversion-tracking-tag' );
1926
  ?>
1927
  </label>
1928
  <?php
1932
 
1933
  if ( $this->options['facebook']['microdata'] && !$this->options['facebook']['pixel_id'] ) {
1934
  echo '<p></p><span class="dashicons dashicons-info"></span>' ;
1935
+ esc_html_e( 'You need to activate the Facebook pixel', 'woocommerce-google-adwords-conversion-tracking-tag' );
1936
  echo '</p><br>' ;
1937
  }
1938
 
1939
  }
1940
 
1941
+ public function wgact_option_html_google_ads_add_cart_data()
1942
+ {
1943
+ // adding the hidden input is a hack to make WordPress save the option with the value zero,
1944
+ // instead of not saving it and remove that array key entirely
1945
+ // https://stackoverflow.com/a/1992745/4688612
1946
+ ?>
1947
+ <label>
1948
+ <input type='hidden' value='0' name='wgact_plugin_options[google][ads][add_cart_data]'>
1949
+ <input type='checkbox' id='wgact_plugin_option_gads_add_cart_data'
1950
+ name='wgact_plugin_options[google][ads][add_cart_data]'
1951
+ value='1' <?php
1952
+ checked( $this->options['google']['ads']['add_cart_data'] );
1953
+ ?> />
1954
+ <?php
1955
+ esc_html_e( 'Add the cart data to the conversion event', 'woocommerce-google-adwords-conversion-tracking-tag' );
1956
+ ?>
1957
+ </label>
1958
+ <?php
1959
+ $this->get_status_icon_new( $this->options['google']['ads']['add_cart_data'], $this->add_to_cart_requirements_fulfilled() );
1960
+
1961
+ if ( !$this->add_to_cart_requirements_fulfilled() ) {
1962
+ ?>
1963
+ <p><span class="dashicons dashicons-info"></span>
1964
+ <?php
1965
+ esc_html_e( 'Requires an active Google Ads Conversion ID, an active Conversion Label and an active Google Merchant Center ID (aw_merchant_id)', 'woocommerce-google-adwords-conversion-tracking-tag' );
1966
+ ?>
1967
+ </p>
1968
+ <?php
1969
+ }
1970
+
1971
+ }
1972
+
1973
  public function wpm_setting_html_order_duplication_prevention()
1974
  {
1975
  // adding the hidden input is a hack to make WordPress save the option with the value zero,
2023
  $this->get_documentation_html_by_key( 'maximum_compatibility_mode' );
2024
  }
2025
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2026
  private function get_order_duplication_prevention_text()
2027
  {
2028
  esc_html_e( 'Basic order duplication prevention is ', 'woocommerce-google-adwords-conversion-tracking-tag' );
2255
  esc_html_e( 'ID of your Google Merchant Center account. It looks like this: 12345678', 'woocommerce-google-adwords-conversion-tracking-tag' );
2256
  }
2257
 
2258
+ public function wgact_plugin_setting_aw_feed_country()
2259
+ {
2260
+ ?>
2261
+ <b><?php
2262
+ esc_html_e( $this->get_visitor_country() );
2263
+ ?></b>
2264
+ <div style="margin-top:10px">
2265
+ <?php
2266
+ esc_html_e( 'Currently the plugin automatically detects the location of the visitor for this setting. In most, if not all, cases this will work fine. Please let us know if you have a use case where you need another output:', 'woocommerce-google-adwords-conversion-tracking-tag' );
2267
+ ?>
2268
+ <a href="mailto:support@sweetcode.com">support@sweetcode.com</a>
2269
+ </div>
2270
+ <?php
2271
+ }
2272
+
2273
+ // dupe in pixel
2274
+ public function get_visitor_country()
2275
+ {
2276
+
2277
+ if ( $this->is_localhost() ) {
2278
+ // error_log('check external ip');
2279
+ $this->ip = WC_Geolocation::get_external_ip_address();
2280
+ } else {
2281
+ // error_log('check regular ip');
2282
+ $this->ip = WC_Geolocation::get_ip_address();
2283
+ }
2284
+
2285
+ $location = WC_Geolocation::geolocate_ip( $this->ip );
2286
+ // error_log ('ip: ' . $this->>$ip);
2287
+ // error_log ('country: ' . $location['country']);
2288
+ return $location['country'];
2289
+ }
2290
+
2291
+ // dupe in pixel
2292
+ public function is_localhost()
2293
+ {
2294
+ $_server = filter_input_array( INPUT_SERVER, FILTER_SANITIZE_STRING );
2295
+ return in_array( $_server['REMOTE_ADDR'], [ '127.0.0.1', '::1' ] );
2296
+ }
2297
+
2298
+ public function wgact_plugin_setting_aw_feed_language()
2299
+ {
2300
+ ?>
2301
+ <b><?php
2302
+ esc_html_e( $this->get_gmc_language() );
2303
+ ?></b>
2304
+ <div style="margin-top:10px">
2305
+ <?php
2306
+ esc_html_e( 'The plugin will use the WordPress default language for this setting. If the shop uses translations, in theory we could also use the visitors locale. But, if that language is not set up in the Google Merchant Center we might run into issues. If you need more options here let us know:', 'woocommerce-google-adwords-conversion-tracking-tag' );
2307
+ ?>
2308
+ <a href=\"mailto:support@sweetcode.com\">support@sweetcode.com</a>
2309
+ </div>
2310
+ <?php
2311
+ }
2312
+
2313
+ // dupe in pixel
2314
+ public function get_gmc_language()
2315
+ {
2316
+ return strtoupper( substr( get_locale(), 0, 2 ) );
2317
+ }
2318
+
2319
  public function wpm_plugin_option_product_identifier()
2320
  {
2321
  ?>
2567
 
2568
  if ( !$this->validations->is_facebook_pixel_id( $input['facebook']['pixel_id'] ) ) {
2569
  $input['facebook']['pixel_id'] = ( isset( $this->options['facebook']['pixel_id'] ) ? $this->options['facebook']['pixel_id'] : '' );
2570
+ add_settings_error( 'wgact_plugin_options', 'invalid-facebook-pixel-id', esc_html__( 'You have entered an invalid Facebook pixel ID. It only contains 14 to 16 digits.', 'woocommerce-google-adwords-conversion-tracking-tag' ) );
2571
  }
2572
 
2573
  }
2576
 
2577
  if ( !$this->validations->is_facebook_capi_token( $input['facebook']['capi']['token'] ) ) {
2578
  $input['facebook']['capi']['token'] = ( isset( $this->options['facebook']['capi']['token'] ) ? $this->options['facebook']['capi']['token'] : '' );
2579
+ add_settings_error( 'wgact_plugin_options', 'invalid-facebook-pixel-id', esc_html__( 'You have entered an invalid Facebook CAPI token.', 'woocommerce-google-adwords-conversion-tracking-tag' ) );
2580
  }
2581
 
2582
  }
2634
  }
2635
 
2636
  }
2637
+ // merging with the existing options
2638
+ // and overwriting old values
2639
+ // since disabling a checkbox doesn't send a value,
2640
+ // we need to set one to overwrite the old value
2641
+ $input = array_replace_recursive( $this->non_form_keys( $input ), $input );
2642
+ // error_log(print_r($input, true));
2643
+ // $input = $this->merge_options($this->options, $input);
2644
+ // error_log('input merged');
2645
+ // error_log(print_r($input, true));
2646
+ return $input;
2647
  }
2648
 
2649
  // Recursively go through the array and merge (overwrite old values with new ones
2683
  // but should be preserved
2684
  $non_form_keys = [
2685
  'db_version' => $this->options['db_version'],
 
 
 
2686
  ];
2687
  // in case the form field input is missing
2688
  // if (!array_key_exists('google_business_vertical', $input['google']['ads'])) {
classes/admin/class-ask-for-rating.php CHANGED
@@ -36,7 +36,7 @@ class Ask_For_Rating {
36
  // server side php ajax handler for the admin rating notice
37
  public function ajax_rating_notice_handler() {
38
 
39
- $_post = filter_input_array(INPUT_POST, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
40
 
41
  $set = $_post['set'];
42
 
@@ -151,7 +151,7 @@ class Ask_For_Rating {
151
  <?php esc_html_e('I already did', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
152
  </a>
153
  </div>
154
- <div style="white-space:normal; bottom:0; right: 0; margin-bottom: 0; margin-right: 5px;align-self: flex-end;">
155
  <a href="<?php echo esc_url(( new Documentation() )->get_link('the_dismiss_button_doesnt_work_why')); ?>"
156
  target="_blank">
157
  <?php esc_html_e('If the dismiss button is not working, here\'s why >>', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
36
  // server side php ajax handler for the admin rating notice
37
  public function ajax_rating_notice_handler() {
38
 
39
+ $_post = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
40
 
41
  $set = $_post['set'];
42
 
151
  <?php esc_html_e('I already did', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
152
  </a>
153
  </div>
154
+ <div style="white-space:normal; bottom:0; right: 0; margin-bottom: 0px; margin-right: 5px;align-self: flex-end;">
155
  <a href="<?php echo esc_url(( new Documentation() )->get_link('the_dismiss_button_doesnt_work_why')); ?>"
156
  target="_blank">
157
  <?php esc_html_e('If the dismiss button is not working, here\'s why >>', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
classes/admin/class-environment-check.php CHANGED
@@ -340,7 +340,7 @@ class Environment_Check {
340
 
341
  public function ajax_environment_check_handler() {
342
 
343
- $_post = filter_input_array(INPUT_POST, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
344
 
345
  if (isset($_post['set'])) {
346
 
@@ -594,7 +594,7 @@ class Environment_Check {
594
 
595
  public function is_hosting_cloudways() {
596
 
597
- $_server = filter_input_array(INPUT_SERVER, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
598
 
599
  return array_key_exists('cw_allowed_ip', $_server) || preg_match('~/home/.*?cloudways.*~', __FILE__);
600
  }
@@ -1156,8 +1156,7 @@ class Environment_Check {
1156
 
1157
  // https://stackoverflow.com/questions/8429342/php-get-headers-set-temporary-stream-context
1158
  protected function get_headers_with_stream_context( $url, $context, $assoc = 0 ) {
1159
-
1160
- $fp = @fopen($url, 'r', null, $context);
1161
 
1162
  if (!is_bool($fp)) {
1163
 
340
 
341
  public function ajax_environment_check_handler() {
342
 
343
+ $_post = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
344
 
345
  if (isset($_post['set'])) {
346
 
594
 
595
  public function is_hosting_cloudways() {
596
 
597
+ $_server = filter_input_array(INPUT_SERVER, FILTER_SANITIZE_STRING);
598
 
599
  return array_key_exists('cw_allowed_ip', $_server) || preg_match('~/home/.*?cloudways.*~', __FILE__);
600
  }
1156
 
1157
  // https://stackoverflow.com/questions/8429342/php-get-headers-set-temporary-stream-context
1158
  protected function get_headers_with_stream_context( $url, $context, $assoc = 0 ) {
1159
+ $fp = fopen($url, 'r', null, $context);
 
1160
 
1161
  if (!is_bool($fp)) {
1162
 
classes/admin/class-notifications.php CHANGED
@@ -125,7 +125,7 @@ class Notifications {
125
  <div id="wpm-paypal-standard-error-dismissal-button" class="button" style="white-space:normal;">
126
  <?php esc_html_e('Click here to dismiss this warning forever', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
127
  </div>
128
- <div style="white-space:normal; bottom:0; right: 0; margin-bottom: 0; margin-right: 5px;align-self: flex-end;">
129
  <a href="<?php echo esc_url(( new Documentation() )->get_link('the_dismiss_button_doesnt_work_why')); ?>"
130
  target="_blank">
131
  <?php esc_html_e('If the dismiss button is not working, here\'s why >>', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
@@ -174,7 +174,7 @@ class Notifications {
174
  data-plugin-slug="<?php echo esc_js($slug); ?>">
175
  <?php esc_html_e('Click here to dismiss this warning forever', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
176
  </div>
177
- <div style="white-space:normal; bottom:0; right: 0; margin-bottom: 0; margin-right: 5px;align-self: flex-end;">
178
  <a href="<?php echo esc_url(( new Documentation() )->get_link('the_dismiss_button_doesnt_work_why')); ?>"
179
  target="_blank">
180
  <?php esc_html_e('If the dismiss button is not working, here\'s why >>', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
125
  <div id="wpm-paypal-standard-error-dismissal-button" class="button" style="white-space:normal;">
126
  <?php esc_html_e('Click here to dismiss this warning forever', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
127
  </div>
128
+ <div style="white-space:normal; bottom:0; right: 0; margin-bottom: 0px; margin-right: 5px;align-self: flex-end;">
129
  <a href="<?php echo esc_url(( new Documentation() )->get_link('the_dismiss_button_doesnt_work_why')); ?>"
130
  target="_blank">
131
  <?php esc_html_e('If the dismiss button is not working, here\'s why >>', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
174
  data-plugin-slug="<?php echo esc_js($slug); ?>">
175
  <?php esc_html_e('Click here to dismiss this warning forever', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
176
  </div>
177
+ <div style="white-space:normal; bottom:0; right: 0; margin-bottom: 0px; margin-right: 5px;align-self: flex-end;">
178
  <a href="<?php echo esc_url(( new Documentation() )->get_link('the_dismiss_button_doesnt_work_why')); ?>"
179
  target="_blank">
180
  <?php esc_html_e('If the dismiss button is not working, here\'s why >>', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
classes/class-default-options.php CHANGED
@@ -77,18 +77,14 @@ class Default_Options {
77
  'site_id' => ''
78
  ],
79
  'shop' => [
80
- 'order_total_logic' => 0,
81
- 'cookie_consent_mgmt' => [
82
  'cookiebot' => [ // This Cookiebot setting is deprecated. Not in use anymore.
83
- 'active' => 0
84
  ],
85
  'explicit_consent' => 0,
86
  ],
87
- 'order_deduplication' => 1,
88
- 'disable_tracking_for' => [
89
- 'administrator',
90
- 'shop_manager',
91
- ],
92
  ],
93
  'general' => [
94
  'variations_output' => 1,
@@ -99,49 +95,17 @@ class Default_Options {
99
  ];
100
  }
101
 
102
- public function update_with_defaults( $target_array, $default_array ) {
103
-
104
- // error_log(print_r($target_array, true));
105
-
106
- // Walk through every key in the default array
107
- foreach ($default_array as $default_key => $default_value) {
108
-
109
- // If the target key doesn't exist yet
110
- // copy all default values,
111
- // including the subtree if one exists,
112
- // into the target array.
113
- if (!isset($target_array[$default_key])) {
114
- $target_array[$default_key] = $default_value;
115
-
116
- // We only want to keep going down the tree
117
- // if the array contains more settings in an associative array,
118
- // otherwise we keep the settings of what's in the target array.
119
- } elseif ($this->is_associative_array($default_value)) {
120
-
121
- $target_array[$default_key] = $this->update_with_defaults($target_array[$default_key], $default_value);
122
  }
123
  }
124
 
125
- // error_log(print_r($target_array, true));
126
- return $target_array;
127
- }
128
-
129
- protected function does_contain_nested_arrays( $array ) {
130
-
131
- foreach ($array as $key) {
132
- if (is_array($key)) {
133
- return true;
134
- }
135
- }
136
-
137
- return false;
138
- }
139
-
140
- protected function is_associative_array( $array ) {
141
- if (is_array($array)) {
142
- return ( array_values($array) !== $array );
143
- } else {
144
- return false;
145
- }
146
  }
147
  }
77
  'site_id' => ''
78
  ],
79
  'shop' => [
80
+ 'order_total_logic' => 0,
81
+ 'cookie_consent_mgmt' => [
82
  'cookiebot' => [ // This Cookiebot setting is deprecated. Not in use anymore.
83
+ 'active' => 0
84
  ],
85
  'explicit_consent' => 0,
86
  ],
87
+ 'order_deduplication' => 1
 
 
 
 
88
  ],
89
  'general' => [
90
  'variations_output' => 1,
95
  ];
96
  }
97
 
98
+ public function update_with_defaults( $array_input, $array_default ) {
99
+ foreach ($array_default as $key => $value) {
100
+ if (array_key_exists($key, $array_input)) {
101
+ if (is_array($value)) {
102
+ $array_input[$key] = $this->update_with_defaults($array_input[$key], $value);
103
+ }
104
+ } else {
105
+ $array_input[$key] = $value;
 
 
 
 
 
 
 
 
 
 
 
 
106
  }
107
  }
108
 
109
+ return $array_input;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
110
  }
111
  }
classes/pixels/class-cookie-consent-management.php CHANGED
@@ -88,7 +88,7 @@ class Cookie_Consent_Management {
88
  // return the cookie contents, if the cookie is set
89
  public function get_cookie( $cookie_name ) {
90
 
91
- $_cookie = filter_input_array(INPUT_COOKIE, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
92
 
93
  return $_cookie[$cookie_name] ? $_cookie[$cookie_name] : null;
94
  }
@@ -121,7 +121,7 @@ class Cookie_Consent_Management {
121
  // https://wordpress.org/plugins/gdpr-cookie-compliance/
122
  public function is_moove_cookie_prevention_active() {
123
 
124
- $_cookie = filter_input_array(INPUT_COOKIE, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
125
 
126
  if (isset($_cookie['moove_gdpr_popup'])) {
127
 
88
  // return the cookie contents, if the cookie is set
89
  public function get_cookie( $cookie_name ) {
90
 
91
+ $_cookie = filter_input_array(INPUT_COOKIE, FILTER_SANITIZE_STRING);
92
 
93
  return $_cookie[$cookie_name] ? $_cookie[$cookie_name] : null;
94
  }
121
  // https://wordpress.org/plugins/gdpr-cookie-compliance/
122
  public function is_moove_cookie_prevention_active() {
123
 
124
+ $_cookie = filter_input_array(INPUT_COOKIE, FILTER_SANITIZE_STRING);
125
 
126
  if (isset($_cookie['moove_gdpr_popup'])) {
127
 
classes/pixels/class-pixel-manager.php CHANGED
@@ -2,11 +2,12 @@
2
 
3
  namespace WCPM\Classes\Pixels;
4
 
 
5
  use WCPM\Classes\Pixels\Facebook\Facebook_Pixel_Manager ;
6
  use WCPM\Classes\Pixels\Facebook\Facebook_Pixel_Manager_Microdata ;
7
- use WCPM\Classes\Pixels\Google\Google ;
8
  use WCPM\Classes\Pixels\Google\Google_Analytics_Refund ;
9
  use WCPM\Classes\Pixels\Google\Google_Pixel_Manager ;
 
10
 
11
  if ( !defined( 'ABSPATH' ) ) {
12
  exit;
@@ -16,6 +17,7 @@ if ( !defined( 'ABSPATH' ) ) {
16
  class Pixel_Manager extends Script_Manager
17
  {
18
  use Trait_Product ;
 
19
  use Trait_Shop ;
20
  protected $options ;
21
  protected $options_obj ;
@@ -25,7 +27,6 @@ class Pixel_Manager extends Script_Manager
25
  protected $dyn_r_ids ;
26
  protected $transaction_deduper_timeout = 1000 ;
27
  protected $position = 1 ;
28
- protected $google ;
29
  public function __construct( $options )
30
  {
31
  /**
@@ -38,9 +39,7 @@ class Pixel_Manager extends Script_Manager
38
  * Set a few states
39
  */
40
  $this->facebook_active = !empty($this->options_obj->facebook->pixel_id);
41
- // $this->google_active = $this->google_active();
42
- $this->google = new Google( $this->options );
43
- $this->google_active = $this->google->google_active();
44
  /**
45
  * Inject pixel snippets in head
46
  */
@@ -70,9 +69,7 @@ class Pixel_Manager extends Script_Manager
70
  /**
71
  * Front-end script section
72
  */
73
- if ( $this->track_user() ) {
74
- add_action( 'wp_enqueue_scripts', [ $this, 'wpm_front_end_scripts' ] );
75
- }
76
  add_action( 'wp_ajax_wpm_get_cart_items', [ $this, 'ajax_wpm_get_cart_items' ] );
77
  add_action( 'wp_ajax_nopriv_wpm_get_cart_items', [ $this, 'ajax_wpm_get_cart_items' ] );
78
  add_action( 'wp_ajax_wpm_get_product_ids', [ $this, 'ajax_wpm_get_product_ids' ] );
@@ -242,7 +239,7 @@ class Pixel_Manager extends Script_Manager
242
  {
243
  ?>
244
 
245
- <script>
246
 
247
  window.wpmDataLayer = window.wpmDataLayer || {}
248
  window.wpmDataLayer = <?php
@@ -283,7 +280,7 @@ class Pixel_Manager extends Script_Manager
283
  ],
284
  'google' => [
285
  'ads' => [
286
- 'conversionIds' => (object) $this->google->get_google_ads_conversion_ids( is_order_received_page() ),
287
  'dynamic_remarketing' => [
288
  'status' => (bool) $this->options_obj->google->ads->dynamic_remarketing,
289
  'id_type' => $this->get_dyn_r_id_type( 'google' ),
@@ -294,29 +291,29 @@ class Pixel_Manager extends Script_Manager
294
  'wpm_send_events_with_parent_ids'
295
  ) ),
296
  ],
297
- 'google_business_vertical' => $this->google->get_google_business_vertical( $this->options['google']['ads']['google_business_vertical'] ),
298
  'phone_conversion_label' => $this->options_obj->google->ads->phone_conversion_label,
299
  'phone_conversion_number' => $this->options_obj->google->ads->phone_conversion_number,
300
  ],
301
  'analytics' => [
302
  'universal' => [
303
  'property_id' => $this->options_obj->google->analytics->universal->property_id,
304
- 'parameters' => (object) $this->google->get_ga_ua_parameters( $this->options_obj->google->analytics->universal->property_id ),
305
  'mp_active' => wpm_fs()->is__premium_only(),
306
  ],
307
  'ga4' => [
308
  'measurement_id' => $this->options_obj->google->analytics->ga4->measurement_id,
309
- 'parameters' => (object) $this->google->get_ga4_parameters( $this->options_obj->google->analytics->ga4->measurement_id ),
310
  'mp_active' => $this->options_obj->google->analytics->ga4->api_secret && wpm_fs()->is__premium_only(),
311
  ],
312
- 'id_type' => $this->google->get_ga_id_type(),
313
  'eec' => (bool) $this->options_obj->google->analytics->eec,
314
  ],
315
  'optimize' => [
316
  'container_id' => $this->options_obj->google->optimize->container_id,
317
  ],
318
  'linker' => [
319
- 'settings' => $this->google->get_google_linker_settings(),
320
  ],
321
  'user_id' => (bool) $this->options_obj->google->user_id,
322
  ],
@@ -334,7 +331,7 @@ class Pixel_Manager extends Script_Manager
334
  '1.13.0',
335
  'wpm_pinterest_enhanced_match'
336
  ) ),
337
- 'enhanced_match_email' => $this->get_user_email(),
338
  ],
339
  'snapchat' => [
340
  'pixel_id' => $this->options_obj->snapchat->pixel_id,
@@ -360,8 +357,7 @@ class Pixel_Manager extends Script_Manager
360
  $data['shop'] = $this->get_shop_data();
361
  $data['general'] = $this->get_general_data();
362
  $data['user'] = $this->get_user_data();
363
- // Return and optionally modify the wpm data layer
364
- return apply_filters( 'wpm_experimental_data_layer', $data );
365
  }
366
 
367
  protected function get_order_data()
@@ -389,7 +385,7 @@ class Pixel_Manager extends Script_Manager
389
  'coupon' => implode( ',', $order->get_coupon_codes() ),
390
  'aw_merchant_id' => ( (int) $this->options['google']['ads']['aw_merchant_id'] ? (int) $this->options['google']['ads']['aw_merchant_id'] : '' ),
391
  'aw_feed_country' => (string) $this->get_visitor_country(),
392
- 'aw_feed_language' => (string) $this->google->get_gmc_language(),
393
  'new_customer' => !$this->is_existing_customer( $order ),
394
  'quantity' => (int) count( $this->wpm_get_order_items( $order ) ),
395
  'items' => $this->get_front_end_order_items( $order ),
@@ -560,7 +556,7 @@ class Pixel_Manager extends Script_Manager
560
 
561
  public function ajax_wpm_get_product_ids()
562
  {
563
- $_get = filter_input_array( INPUT_GET, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
564
  $product_ids = $_get['productIds'];
565
 
566
  if ( !$product_ids ) {
@@ -595,7 +591,7 @@ class Pixel_Manager extends Script_Manager
595
  // error_log('Invalid security token sent.');
596
  // wp_die();
597
  // }
598
- $_post = filter_input_array( INPUT_POST, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
599
  $order_id = $_post['order_id'];
600
  update_post_meta( $order_id, '_wpm_conversion_pixel_fired', true );
601
  wp_send_json_success();
@@ -718,23 +714,13 @@ class Pixel_Manager extends Script_Manager
718
  }
719
 
720
  $data['currency'] = get_woocommerce_currency();
721
- // $data['mini_cart']['track'] = apply_filters_deprecated('wooptpm_track_mini_cart', [true], '1.13.0', 'wpm_track_mini_cart');
722
- // $data['mini_cart']['track'] = apply_filters('wpm_track_mini_cart', $data['mini_cart']['track']);
723
- $mini_cart_filter_deprecation_message = 'The filter has become obsolete since WPM now tracks cart item data using the browser cache and doesn\'t rely entirely on the server anymore.';
724
- apply_filters_deprecated(
725
  'wooptpm_track_mini_cart',
726
  [ true ],
727
  '1.13.0',
728
- '',
729
- $mini_cart_filter_deprecation_message
730
- );
731
- apply_filters_deprecated(
732
- 'wpm_track_mini_cart',
733
- [ true ],
734
- '1.15.5',
735
- '',
736
- $mini_cart_filter_deprecation_message
737
  );
 
738
  $data['cookie_consent_mgmt'] = [
739
  'explicit_consent' => (bool) $this->options_obj->shop->cookie_consent_mgmt->explicit_consent,
740
  ];
@@ -749,5 +735,27 @@ class Pixel_Manager extends Script_Manager
749
  ];
750
  return $data;
751
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
752
 
753
  }
2
 
3
  namespace WCPM\Classes\Pixels;
4
 
5
+ use WCPM\Classes\Admin\Environment_Check ;
6
  use WCPM\Classes\Pixels\Facebook\Facebook_Pixel_Manager ;
7
  use WCPM\Classes\Pixels\Facebook\Facebook_Pixel_Manager_Microdata ;
 
8
  use WCPM\Classes\Pixels\Google\Google_Analytics_Refund ;
9
  use WCPM\Classes\Pixels\Google\Google_Pixel_Manager ;
10
+ use WCPM\Classes\Pixels\Google\Trait_Google ;
11
 
12
  if ( !defined( 'ABSPATH' ) ) {
13
  exit;
17
  class Pixel_Manager extends Script_Manager
18
  {
19
  use Trait_Product ;
20
+ use Trait_Google ;
21
  use Trait_Shop ;
22
  protected $options ;
23
  protected $options_obj ;
27
  protected $dyn_r_ids ;
28
  protected $transaction_deduper_timeout = 1000 ;
29
  protected $position = 1 ;
 
30
  public function __construct( $options )
31
  {
32
  /**
39
  * Set a few states
40
  */
41
  $this->facebook_active = !empty($this->options_obj->facebook->pixel_id);
42
+ $this->google_active = $this->google_active();
 
 
43
  /**
44
  * Inject pixel snippets in head
45
  */
69
  /**
70
  * Front-end script section
71
  */
72
+ add_action( 'wp_enqueue_scripts', [ $this, 'wpm_front_end_scripts' ] );
 
 
73
  add_action( 'wp_ajax_wpm_get_cart_items', [ $this, 'ajax_wpm_get_cart_items' ] );
74
  add_action( 'wp_ajax_nopriv_wpm_get_cart_items', [ $this, 'ajax_wpm_get_cart_items' ] );
75
  add_action( 'wp_ajax_wpm_get_product_ids', [ $this, 'ajax_wpm_get_product_ids' ] );
239
  {
240
  ?>
241
 
242
+ <script data-cfasync="false">
243
 
244
  window.wpmDataLayer = window.wpmDataLayer || {}
245
  window.wpmDataLayer = <?php
280
  ],
281
  'google' => [
282
  'ads' => [
283
+ 'conversionIds' => (object) $this->get_google_ads_conversion_ids( is_order_received_page() ),
284
  'dynamic_remarketing' => [
285
  'status' => (bool) $this->options_obj->google->ads->dynamic_remarketing,
286
  'id_type' => $this->get_dyn_r_id_type( 'google' ),
291
  'wpm_send_events_with_parent_ids'
292
  ) ),
293
  ],
294
+ 'google_business_vertical' => $this->get_google_business_vertical( $this->options['google']['ads']['google_business_vertical'] ),
295
  'phone_conversion_label' => $this->options_obj->google->ads->phone_conversion_label,
296
  'phone_conversion_number' => $this->options_obj->google->ads->phone_conversion_number,
297
  ],
298
  'analytics' => [
299
  'universal' => [
300
  'property_id' => $this->options_obj->google->analytics->universal->property_id,
301
+ 'parameters' => (object) $this->get_ga_ua_parameters( $this->options_obj->google->analytics->universal->property_id ),
302
  'mp_active' => wpm_fs()->is__premium_only(),
303
  ],
304
  'ga4' => [
305
  'measurement_id' => $this->options_obj->google->analytics->ga4->measurement_id,
306
+ 'parameters' => (object) $this->get_ga4_parameters( $this->options_obj->google->analytics->ga4->measurement_id ),
307
  'mp_active' => $this->options_obj->google->analytics->ga4->api_secret && wpm_fs()->is__premium_only(),
308
  ],
309
+ 'id_type' => $this->get_ga_id_type(),
310
  'eec' => (bool) $this->options_obj->google->analytics->eec,
311
  ],
312
  'optimize' => [
313
  'container_id' => $this->options_obj->google->optimize->container_id,
314
  ],
315
  'linker' => [
316
+ 'settings' => $this->get_google_linker_settings(),
317
  ],
318
  'user_id' => (bool) $this->options_obj->google->user_id,
319
  ],
331
  '1.13.0',
332
  'wpm_pinterest_enhanced_match'
333
  ) ),
334
+ 'enhanced_match_email' => $this->get_pinterest_enhanced_match_email(),
335
  ],
336
  'snapchat' => [
337
  'pixel_id' => $this->options_obj->snapchat->pixel_id,
357
  $data['shop'] = $this->get_shop_data();
358
  $data['general'] = $this->get_general_data();
359
  $data['user'] = $this->get_user_data();
360
+ return $data;
 
361
  }
362
 
363
  protected function get_order_data()
385
  'coupon' => implode( ',', $order->get_coupon_codes() ),
386
  'aw_merchant_id' => ( (int) $this->options['google']['ads']['aw_merchant_id'] ? (int) $this->options['google']['ads']['aw_merchant_id'] : '' ),
387
  'aw_feed_country' => (string) $this->get_visitor_country(),
388
+ 'aw_feed_language' => (string) $this->get_gmc_language(),
389
  'new_customer' => !$this->is_existing_customer( $order ),
390
  'quantity' => (int) count( $this->wpm_get_order_items( $order ) ),
391
  'items' => $this->get_front_end_order_items( $order ),
556
 
557
  public function ajax_wpm_get_product_ids()
558
  {
559
+ $_get = filter_input_array( INPUT_GET, FILTER_SANITIZE_STRING );
560
  $product_ids = $_get['productIds'];
561
 
562
  if ( !$product_ids ) {
591
  // error_log('Invalid security token sent.');
592
  // wp_die();
593
  // }
594
+ $_post = filter_input_array( INPUT_POST, FILTER_SANITIZE_STRING );
595
  $order_id = $_post['order_id'];
596
  update_post_meta( $order_id, '_wpm_conversion_pixel_fired', true );
597
  wp_send_json_success();
714
  }
715
 
716
  $data['currency'] = get_woocommerce_currency();
717
+ $data['mini_cart']['track'] = apply_filters_deprecated(
 
 
 
718
  'wooptpm_track_mini_cart',
719
  [ true ],
720
  '1.13.0',
721
+ 'wpm_track_mini_cart'
 
 
 
 
 
 
 
 
722
  );
723
+ $data['mini_cart']['track'] = apply_filters( 'wpm_track_mini_cart', $data['mini_cart']['track'] );
724
  $data['cookie_consent_mgmt'] = [
725
  'explicit_consent' => (bool) $this->options_obj->shop->cookie_consent_mgmt->explicit_consent,
726
  ];
735
  ];
736
  return $data;
737
  }
738
+
739
+ protected function get_pinterest_enhanced_match_email()
740
+ {
741
+
742
+ if ( is_user_logged_in() ) {
743
+ $current_user = wp_get_current_user();
744
+ $email = $current_user->user_email;
745
+ } elseif ( is_order_received_page() ) {
746
+ $order = $this->get_order_from_order_received_page();
747
+
748
+ if ( $order ) {
749
+ $email = $order->get_billing_email();
750
+ } else {
751
+ $email = '';
752
+ }
753
+
754
+ } else {
755
+ $email = '';
756
+ }
757
+
758
+ return $email;
759
+ }
760
 
761
  }
classes/pixels/class-pixel.php CHANGED
@@ -17,6 +17,7 @@ class Pixel {
17
  protected $conversion_label;
18
  protected $dynamic_remarketing;
19
  protected $google_business_vertical;
 
20
  protected $ip;
21
  protected $order_total_logic;
22
  protected $product_identifier;
@@ -32,6 +33,7 @@ class Pixel {
32
  $this->options = $options;
33
  $this->options_obj = json_decode(wp_json_encode($this->options));
34
 
 
35
  $this->options_obj->shop->currency = get_woocommerce_currency();
36
 
37
  $this->order_total_logic = $this->options['shop']['order_total_logic'];
@@ -41,5 +43,9 @@ class Pixel {
41
  $this->conversion_label = $this->options['google']['ads']['conversion_label'];
42
  $this->dynamic_remarketing = $this->options['google']['ads']['dynamic_remarketing'];
43
  $this->product_identifier = $this->options['google']['ads']['product_identifier'];
 
 
 
 
44
  }
45
  }
17
  protected $conversion_label;
18
  protected $dynamic_remarketing;
19
  protected $google_business_vertical;
20
+ protected $gtag_deactivation;
21
  protected $ip;
22
  protected $order_total_logic;
23
  protected $product_identifier;
33
  $this->options = $options;
34
  $this->options_obj = json_decode(wp_json_encode($this->options));
35
 
36
+ $this->options_obj->shop->currency = new stdClass();
37
  $this->options_obj->shop->currency = get_woocommerce_currency();
38
 
39
  $this->order_total_logic = $this->options['shop']['order_total_logic'];
43
  $this->conversion_label = $this->options['google']['ads']['conversion_label'];
44
  $this->dynamic_remarketing = $this->options['google']['ads']['dynamic_remarketing'];
45
  $this->product_identifier = $this->options['google']['ads']['product_identifier'];
46
+
47
+ if (array_key_exists('gtag', $this->options['google'])) {
48
+ $this->gtag_deactivation = $this->options['google']['gtag']['deactivation'];
49
+ }
50
  }
51
  }
classes/pixels/class-script-manager.php CHANGED
@@ -40,7 +40,7 @@ class Script_Manager
40
  public function inject_head_pixels()
41
  {
42
  global $woocommerce ;
43
- $_post = filter_input_array( INPUT_POST, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
44
  $this->inject_opening_script_tag();
45
  $this->inject_everywhere();
46
 
@@ -145,9 +145,11 @@ class Script_Manager
145
  // error_log('order number: ' . $order->get_order_number());
146
  // error_log('get_post_meta($order->get_order_number(), \'_wpm_conversion_pixel_fired\', true): ' . get_post_meta($order->get_order_number(), '_wpm_conversion_pixel_fired', true));
147
 
148
- if ( $this->is_nodedupe_parameter_set() || !$order->has_status( 'failed' ) && $this->track_user() && false == $conversion_prevention && (!$this->options['shop']['order_deduplication'] || $this->has_conversion_pixel_already_fired( $order ) != true) ) {
 
149
  return true;
150
  } else {
 
151
  return false;
152
  }
153
 
@@ -192,7 +194,7 @@ class Script_Manager
192
 
193
  protected function is_nodedupe_parameter_set()
194
  {
195
- $_get = filter_input_array( INPUT_GET, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
196
 
197
  if ( isset( $_get['nodedupe'] ) ) {
198
  return true;
@@ -204,7 +206,7 @@ class Script_Manager
204
 
205
  protected function query_string_contains_all_variation_attributes( $product )
206
  {
207
- $_server = filter_input_array( INPUT_SERVER, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
208
 
209
  if ( !empty($_server['QUERY_STRING']) ) {
210
  parse_str( $_server['QUERY_STRING'], $query_string_attributes );
@@ -222,7 +224,7 @@ class Script_Manager
222
 
223
  protected function get_variation_from_query_string( $product_id, $product )
224
  {
225
- $_server = filter_input_array( INPUT_SERVER, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
226
  parse_str( $_server['QUERY_STRING'], $query_string_attributes );
227
  $search_variation_attributes = [];
228
  foreach ( array_keys( $product->get_attributes() ) as $variation_attribute => $value ) {
@@ -240,22 +242,16 @@ class Script_Manager
240
  {
241
  ?>
242
 
243
- <!-- ----------------------------------------------------------------------------------------------------
244
- The conversion pixels have not been fired. Possible reasons:
245
- - The user role has been disabled for tracking.
246
- - The order payment has failed.
247
- - The pixels have already been fired. To prevent double counting the pixels are only fired once.
248
-
249
  If you want to test the order you have two options:
250
- - Turn off order duplication prevention in the advanced settings
251
- - Add the '&nodedupe' parameter to the order confirmation URL like this:
252
- https://example.test/checkout/order-received/123/?key=wc_order_123abc&nodedupe
253
-
254
  More info on testing: <?php
255
  esc_html_e( ( new Documentation() )->get_link( 'test_order' ) );
256
  ?>
257
-
258
- ----------------------------------------------------------------------------------------------------
259
  -->
260
  <?php
261
  }
40
  public function inject_head_pixels()
41
  {
42
  global $woocommerce ;
43
+ $_post = filter_input_array( INPUT_POST, FILTER_SANITIZE_STRING );
44
  $this->inject_opening_script_tag();
45
  $this->inject_everywhere();
46
 
145
  // error_log('order number: ' . $order->get_order_number());
146
  // error_log('get_post_meta($order->get_order_number(), \'_wpm_conversion_pixel_fired\', true): ' . get_post_meta($order->get_order_number(), '_wpm_conversion_pixel_fired', true));
147
 
148
+ if ( $this->is_nodedupe_parameter_set() || !$order->has_status( 'failed' ) && !current_user_can( 'edit_others_pages' ) && false == $conversion_prevention && (!$this->options['shop']['order_deduplication'] || $this->has_conversion_pixel_already_fired( $order ) != true) ) {
149
+ // error_log('fire pixels: true' . PHP_EOL);
150
  return true;
151
  } else {
152
+ // error_log('fire pixels: false' . PHP_EOL);
153
  return false;
154
  }
155
 
194
 
195
  protected function is_nodedupe_parameter_set()
196
  {
197
+ $_get = filter_input_array( INPUT_GET, FILTER_SANITIZE_STRING );
198
 
199
  if ( isset( $_get['nodedupe'] ) ) {
200
  return true;
206
 
207
  protected function query_string_contains_all_variation_attributes( $product )
208
  {
209
+ $_server = filter_input_array( INPUT_SERVER, FILTER_SANITIZE_STRING );
210
 
211
  if ( !empty($_server['QUERY_STRING']) ) {
212
  parse_str( $_server['QUERY_STRING'], $query_string_attributes );
224
 
225
  protected function get_variation_from_query_string( $product_id, $product )
226
  {
227
+ $_server = filter_input_array( INPUT_SERVER, FILTER_SANITIZE_STRING );
228
  parse_str( $_server['QUERY_STRING'], $query_string_attributes );
229
  $search_variation_attributes = [];
230
  foreach ( array_keys( $product->get_attributes() ) as $variation_attribute => $value ) {
242
  {
243
  ?>
244
 
245
+ <!-- The conversion pixels have not been inserted. Possible reasons:
246
+ You are logged into WooCommerce as admin or shop manager.
247
+ The order payment has failed.
248
+ The pixels have already been fired. To prevent double counting the pixels are only fired once.
 
 
249
  If you want to test the order you have two options:
250
+ - Turn off order deduplication in the advanced settings
251
+ - Add the '&nodedupe' parameter to the order confirmation URL like this: https://example.test/checkout/order-received/123/?key=wc_order_123abc&nodedupe
 
 
252
  More info on testing: <?php
253
  esc_html_e( ( new Documentation() )->get_link( 'test_order' ) );
254
  ?>
 
 
255
  -->
256
  <?php
257
  }
classes/pixels/class-shortcodes.php CHANGED
@@ -2,22 +2,19 @@
2
 
3
  namespace WCPM\Classes\Pixels;
4
 
5
- use WCPM\Classes\Pixels\Google\Google;
6
 
7
  if (!defined('ABSPATH')) {
8
  exit; // Exit if accessed directly
9
  }
10
 
11
  class Shortcodes extends Pixel {
 
12
  use Trait_Product;
13
 
14
- private $google;
15
-
16
  public function __construct( $options ) {
17
  parent::__construct($options);
18
 
19
- $this->google = new Google($options);
20
-
21
  add_shortcode('view-item', [$this, 'wpm_view_item']);
22
  add_shortcode('conversion-pixel', [$this, 'wpm_conversion_pixel']);
23
  }
@@ -42,9 +39,9 @@ class Shortcodes extends Pixel {
42
  ?>
43
 
44
  <script>
45
- jQuery(window).on("wpmLoad", function () {
46
- jQuery(document).trigger("wpmViewItem", wpm.getProductDetailsFormattedForEvent(<?php echo esc_js($shortcode_attributes['product-id']); ?>))
47
- })
48
  </script>
49
  <?php
50
  }
@@ -72,10 +69,10 @@ class Shortcodes extends Pixel {
72
  $shortcode_attributes = shortcode_atts($pairs, $attributes);
73
 
74
  if ('google-ads' === $shortcode_attributes['pixel']) {
75
- if ($this->google->is_google_ads_active()) {
76
  $this->conversion_html_google_ads($shortcode_attributes);
77
  }
78
- } elseif ('facebook' === $shortcode_attributes['pixel'] || 'meta' === $shortcode_attributes['pixel']) {
79
  if ($this->options_obj->facebook->pixel_id) {
80
  $this->conversion_html_facebook($shortcode_attributes);
81
  }
@@ -100,7 +97,7 @@ class Shortcodes extends Pixel {
100
  $this->conversion_html_tiktok($shortcode_attributes);
101
  }
102
  } elseif ('all' === $shortcode_attributes['pixel']) {
103
- if ($this->google->is_google_ads_active()) {
104
  $this->conversion_html_google_ads($shortcode_attributes);
105
  }
106
  if ($this->options_obj->facebook->pixel_id) {
@@ -129,9 +126,9 @@ class Shortcodes extends Pixel {
129
  ?>
130
 
131
  <script>
132
- wpmFunctionExists("snaptr").then(function () {
133
- snaptr("track", '<?php echo esc_js($shortcode_attributes['snap-event']); ?>')
134
- },
135
  )
136
  </script>
137
  <?php
@@ -142,9 +139,9 @@ class Shortcodes extends Pixel {
142
  ?>
143
 
144
  <script>
145
- wpmFunctionExists("ttq").then(function () {
146
- ttq.track('<?php echo esc_js($shortcode_attributes['tiktok-event']); ?>')
147
- },
148
  )
149
  </script>
150
  <?php
@@ -155,9 +152,9 @@ class Shortcodes extends Pixel {
155
  ?>
156
 
157
  <script>
158
- wpmFunctionExists("gtag").then(function () {
159
- if (wpm.googleConfigConditionsMet("ads")) gtag("event", "conversion", {"send_to": 'AW-<?php echo esc_js($shortcode_attributes['gads-conversion-id']); ?>/<?php echo esc_js($shortcode_attributes['gads-conversion-label']); ?>'})
160
- },
161
  )
162
  </script>
163
  <?php
@@ -170,24 +167,24 @@ class Shortcodes extends Pixel {
170
  ?>
171
 
172
  <script>
173
- jQuery(window).on("wpmLoad", function () {
174
 
175
- let eventId = wpm.getRandomEventId()
176
 
177
- wpmFunctionExists("fbq").then(function () {
178
- fbq("track", '<?php echo esc_js($shortcode_attributes['fbc-event']); ?>', {}, {
179
  eventID: eventId,
180
- })
181
- },
182
  )
183
 
184
- jQuery(document).trigger("wpmFbCapiEvent", {
185
  event_name : "<?php echo esc_js($shortcode_attributes['fbc-event']); ?>",
186
  event_id : eventId,
187
  user_data : wpm.getFbUserData(),
188
- event_source_url: window.location.href,
189
- })
190
- })
191
 
192
  </script>
193
  <?php
@@ -195,9 +192,9 @@ class Shortcodes extends Pixel {
195
  ?>
196
 
197
  <script>
198
- wpmFunctionExists("fbq").then(function () {
199
- fbq("track", '<?php echo esc_js($shortcode_attributes['fbc-event']); ?>')
200
- },
201
  )
202
  </script>
203
  <?php
@@ -210,9 +207,9 @@ class Shortcodes extends Pixel {
210
  ?>
211
 
212
  <script>
213
- wpmFunctionExists("twq").then(function () {
214
- twq("track", '<?php echo esc_js($shortcode_attributes['twc-event']); ?>')
215
- },
216
  )
217
  </script>
218
  <?php
@@ -226,9 +223,9 @@ class Shortcodes extends Pixel {
226
  ?>
227
 
228
  <script>
229
- wpmFunctionExists("pintrk").then(function () {
230
- pintrk("track", '<?php echo esc_js($shortcode_attributes['pinc-event']); ?>')
231
- },
232
  )
233
  </script>
234
  <?php
@@ -236,11 +233,11 @@ class Shortcodes extends Pixel {
236
  ?>
237
 
238
  <script>
239
- wpmFunctionExists("pintrk").then(function () {
240
- pintrk("track", '<?php echo esc_js($shortcode_attributes['pinc-event']); ?>', {
241
- lead_type: '<?php echo esc_js($shortcode_attributes['pinc-lead-type']); ?>',
242
- })
243
- },
244
  )
245
  </script>
246
  <?php
@@ -252,14 +249,14 @@ class Shortcodes extends Pixel {
252
  ?>
253
 
254
  <script>
255
- wpmFunctionExists("uetq").then(function () {
256
- window.uetq = window.uetq || []
257
- window.uetq.push("event", '<?php echo esc_js($shortcode_attributes['ms-ads-event']); ?>', {
258
- "event_category": '<?php echo esc_js($shortcode_attributes['ms-ads-event-category']); ?>',
259
- "event_label" : '<?php echo esc_js($shortcode_attributes['ms-ads-event-label']); ?>',
260
- "event_value" : '<?php echo esc_js($shortcode_attributes['ms-ads-event-value']); ?>',
261
- })
262
- },
263
  )
264
  </script>
265
  <?php
@@ -269,14 +266,14 @@ class Shortcodes extends Pixel {
269
  ?>
270
 
271
  <script>
272
- if (typeof wpmFunctionExists !== "function") {
273
  window.wpmFunctionExists = function (functionName) {
274
  return new Promise(function (resolve) {
275
  (function waitForVar() {
276
- if (typeof window[functionName] !== "undefined") return resolve()
277
- setTimeout(waitForVar, 1000)
278
- })()
279
- })
280
  }
281
  }
282
  </script>
2
 
3
  namespace WCPM\Classes\Pixels;
4
 
5
+ use WCPM\Classes\Pixels\Google\Trait_Google;
6
 
7
  if (!defined('ABSPATH')) {
8
  exit; // Exit if accessed directly
9
  }
10
 
11
  class Shortcodes extends Pixel {
12
+ use Trait_Google;
13
  use Trait_Product;
14
 
 
 
15
  public function __construct( $options ) {
16
  parent::__construct($options);
17
 
 
 
18
  add_shortcode('view-item', [$this, 'wpm_view_item']);
19
  add_shortcode('conversion-pixel', [$this, 'wpm_conversion_pixel']);
20
  }
39
  ?>
40
 
41
  <script>
42
+ jQuery(window).on('wpmLoad', function () {
43
+ jQuery(document).trigger('wpmViewItem', wpm.getProductDetailsFormattedForEvent(<?php echo esc_js($shortcode_attributes['product-id']); ?>));
44
+ });
45
  </script>
46
  <?php
47
  }
69
  $shortcode_attributes = shortcode_atts($pairs, $attributes);
70
 
71
  if ('google-ads' === $shortcode_attributes['pixel']) {
72
+ if ($this->is_google_ads_active()) {
73
  $this->conversion_html_google_ads($shortcode_attributes);
74
  }
75
+ } elseif ('facebook' === $shortcode_attributes['pixel']) {
76
  if ($this->options_obj->facebook->pixel_id) {
77
  $this->conversion_html_facebook($shortcode_attributes);
78
  }
97
  $this->conversion_html_tiktok($shortcode_attributes);
98
  }
99
  } elseif ('all' === $shortcode_attributes['pixel']) {
100
+ if ($this->is_google_ads_active()) {
101
  $this->conversion_html_google_ads($shortcode_attributes);
102
  }
103
  if ($this->options_obj->facebook->pixel_id) {
126
  ?>
127
 
128
  <script>
129
+ wpmFunctionExists('snaptr').then(function () {
130
+ snaptr('track', '<?php echo esc_js($shortcode_attributes['snap-event']); ?>');
131
+ }
132
  )
133
  </script>
134
  <?php
139
  ?>
140
 
141
  <script>
142
+ wpmFunctionExists('ttq').then(function () {
143
+ ttq.track('<?php echo esc_js($shortcode_attributes['tiktok-event']); ?>');
144
+ }
145
  )
146
  </script>
147
  <?php
152
  ?>
153
 
154
  <script>
155
+ wpmFunctionExists('gtag').then(function () {
156
+ if (wpm.googleConfigConditionsMet('ads')) gtag('event', 'conversion', {'send_to': 'AW-<?php echo esc_js($shortcode_attributes['gads-conversion-id']); ?>/<?php echo esc_js($shortcode_attributes['gads-conversion-label']); ?>'});
157
+ }
158
  )
159
  </script>
160
  <?php
167
  ?>
168
 
169
  <script>
170
+ jQuery(window).on('wpmLoad', function () {
171
 
172
+ let eventId = wpm.getRandomEventId();
173
 
174
+ wpmFunctionExists('fbq').then(function () {
175
+ fbq('track', '<?php echo esc_js($shortcode_attributes['fbc-event']); ?>', {}, {
176
  eventID: eventId,
177
+ });
178
+ }
179
  )
180
 
181
+ jQuery(document).trigger('wpmFbCapiEvent', {
182
  event_name : "<?php echo esc_js($shortcode_attributes['fbc-event']); ?>",
183
  event_id : eventId,
184
  user_data : wpm.getFbUserData(),
185
+ event_source_url: window.location.href
186
+ });
187
+ });
188
 
189
  </script>
190
  <?php
192
  ?>
193
 
194
  <script>
195
+ wpmFunctionExists('fbq').then(function () {
196
+ fbq('track', '<?php echo esc_js($shortcode_attributes['fbc-event']); ?>');
197
+ }
198
  )
199
  </script>
200
  <?php
207
  ?>
208
 
209
  <script>
210
+ wpmFunctionExists('twq').then(function () {
211
+ twq('track', '<?php echo esc_js($shortcode_attributes['twc-event']); ?>');
212
+ }
213
  )
214
  </script>
215
  <?php
223
  ?>
224
 
225
  <script>
226
+ wpmFunctionExists('pintrk').then(function () {
227
+ pintrk('track', '<?php echo esc_js($shortcode_attributes['pinc-event']); ?>');
228
+ }
229
  )
230
  </script>
231
  <?php
233
  ?>
234
 
235
  <script>
236
+ wpmFunctionExists('pintrk').then(function () {
237
+ pintrk('track', '<?php echo esc_js($shortcode_attributes['pinc-event']); ?>', {
238
+ lead_type: '<?php echo esc_js($shortcode_attributes['pinc-lead-type']); ?>'
239
+ });
240
+ }
241
  )
242
  </script>
243
  <?php
249
  ?>
250
 
251
  <script>
252
+ wpmFunctionExists('uetq').then(function () {
253
+ window.uetq = window.uetq || [];
254
+ window.uetq.push('event', '<?php echo esc_js($shortcode_attributes['ms-ads-event']); ?>', {
255
+ 'event_category': '<?php echo esc_js($shortcode_attributes['ms-ads-event-category']); ?>',
256
+ 'event_label' : '<?php echo esc_js($shortcode_attributes['ms-ads-event-label']); ?>',
257
+ 'event_value' : '<?php echo esc_js($shortcode_attributes['ms-ads-event-value']); ?>'
258
+ });
259
+ }
260
  )
261
  </script>
262
  <?php
266
  ?>
267
 
268
  <script>
269
+ if (typeof wpmFunctionExists !== 'function') {
270
  window.wpmFunctionExists = function (functionName) {
271
  return new Promise(function (resolve) {
272
  (function waitForVar() {
273
+ if (typeof window[functionName] !== 'undefined') return resolve();
274
+ setTimeout(waitForVar, 1000);
275
+ })();
276
+ });
277
  }
278
  }
279
  </script>
classes/pixels/google/class-google-analytics-refund.php CHANGED
@@ -12,6 +12,7 @@ if ( !defined( 'ABSPATH' ) ) {
12
 
13
  class Google_Analytics_Refund extends Google_Analytics
14
  {
 
15
  public function __construct( $options )
16
  {
17
  parent::__construct( $options );
12
 
13
  class Google_Analytics_Refund extends Google_Analytics
14
  {
15
+ use Trait_Google ;
16
  public function __construct( $options )
17
  {
18
  parent::__construct( $options );
classes/pixels/google/class-google-pixel-manager.php CHANGED
@@ -13,9 +13,16 @@ if ( !defined( 'ABSPATH' ) ) {
13
 
14
  class Google_Pixel_Manager extends Script_Manager
15
  {
 
16
  private $google_pixel ;
 
 
 
 
17
  private $google_analytics_ua_http_mp ;
18
  private $google_analytics_4_http_mp ;
 
 
19
  private $cid_key_ga_ua ;
20
  private $cid_key_ga4 ;
21
  public function __construct( $options )
@@ -24,28 +31,16 @@ class Google_Pixel_Manager extends Script_Manager
24
  $this->google_pixel = new Google( $options );
25
  }
26
 
27
- protected function log_prevented_order_report_for_user( $order )
28
- {
29
-
30
- if ( is_user_logged_in() ) {
31
- $user_info = $order->get_user();
32
- wc_get_logger()->debug( 'Prevented order ID ' . $order->get_id() . ' to be reported through the Measurement Protocol for user ' . $user_info->user_login . ' (roles: ' . implode( ', ', $user_info->roles ) . ')', [
33
- 'source' => 'wpm',
34
- ] );
35
- }
36
-
37
- }
38
-
39
  public function inject_order_received_page_dedupe( $order, $order_total, $is_new_customer )
40
  {
41
- if ( $this->google_pixel->is_google_ads_active() && wpm_fs()->is__premium_only() ) {
42
  $this->save_gclid_in_order__premium_only( $order );
43
  }
44
  }
45
 
46
  public function inject_order_received_page_no_dedupe( $order, $order_total, $is_new_customer )
47
  {
48
- if ( $this->google_pixel->is_google_ads_active() && wpm_fs()->is__premium_only() ) {
49
  $this->save_gclid_in_order__premium_only( $order );
50
  }
51
  }
13
 
14
  class Google_Pixel_Manager extends Script_Manager
15
  {
16
+ use Trait_Google ;
17
  private $google_pixel ;
18
+ private $google_ads_pixel ;
19
+ private $google_analytics_ua_standard_pixel ;
20
+ private $google_analytics_4_standard_pixel ;
21
+ private $google_analytics_ua_eec_pixel ;
22
  private $google_analytics_ua_http_mp ;
23
  private $google_analytics_4_http_mp ;
24
+ // private $google_analytics_ua_refund_pixel;
25
+ private $google_analytics_4_eec_pixel ;
26
  private $cid_key_ga_ua ;
27
  private $cid_key_ga4 ;
28
  public function __construct( $options )
31
  $this->google_pixel = new Google( $options );
32
  }
33
 
 
 
 
 
 
 
 
 
 
 
 
 
34
  public function inject_order_received_page_dedupe( $order, $order_total, $is_new_customer )
35
  {
36
+ if ( $this->is_google_ads_active() && wpm_fs()->is__premium_only() ) {
37
  $this->save_gclid_in_order__premium_only( $order );
38
  }
39
  }
40
 
41
  public function inject_order_received_page_no_dedupe( $order, $order_total, $is_new_customer )
42
  {
43
+ if ( $this->is_google_ads_active() && wpm_fs()->is__premium_only() ) {
44
  $this->save_gclid_in_order__premium_only( $order );
45
  }
46
  }
classes/pixels/google/class-google.php CHANGED
@@ -2,405 +2,23 @@
2
 
3
  namespace WCPM\Classes\Pixels\Google;
4
 
5
- use WCPM\Classes\Admin\Environment_Check ;
6
- use WCPM\Classes\Pixels\Pixel ;
7
- use WCPM\Classes\Pixels\Trait_Shop ;
8
 
9
- if ( !defined( 'ABSPATH' ) ) {
10
- exit;
11
- // Exit if accessed directly
12
  }
13
 
14
- class Google extends Pixel
15
- {
16
- use Trait_Shop ;
17
- public function __construct( $options )
18
- {
19
- parent::__construct( $options );
20
- $this->google_business_vertical = $this->get_google_business_vertical( $this->options['google']['ads']['google_business_vertical'] );
21
- $this->pixel_name = 'google';
22
- }
23
-
24
- public function get_order_item_data( $order_item )
25
- {
26
- $product = $order_item->get_product();
27
-
28
- if ( !is_object( $product ) ) {
29
- wc_get_logger()->debug( 'get_order_item_data received an order item which is not a valid product: ' . $order_item->get_id(), [
30
- 'source' => 'wpm',
31
- ] );
32
- return [];
33
- }
34
-
35
- $dyn_r_ids = $this->get_dyn_r_ids( $product );
36
-
37
- if ( $product->get_type() === 'variation' ) {
38
- $parent_product = wc_get_product( $product->get_parent_id() );
39
- $name = $parent_product->get_name();
40
- } else {
41
- $name = $product->get_name();
42
- }
43
-
44
- return [
45
- 'id' => (string) $dyn_r_ids[$this->get_ga_id_type()],
46
- 'name' => (string) $name,
47
- 'quantity' => (int) $order_item['quantity'],
48
- 'affiliation' => (string) get_bloginfo( 'name' ),
49
- 'brand' => (string) $this->get_brand_name( $product->get_id() ),
50
- 'category' => implode( ',', $this->get_product_category( $product->get_id() ) ),
51
- 'category_array' => $this->get_product_category( $product->get_id() ),
52
- 'variant' => ( (string) ($product->get_type() === 'variation') ? $this->get_formatted_variant_text( $product ) : '' ),
53
- 'price' => (double) $this->wpm_get_order_item_price( $order_item, $product ),
54
- ];
55
- }
56
-
57
- public function get_ga_id_type()
58
- {
59
- $ga_id_type = 'post_id';
60
- $ga_id_type = apply_filters_deprecated(
61
- 'wooptpm_product_id_type_for_google_analytics',
62
- [ $ga_id_type ],
63
- '1.13.0',
64
- 'wpm_product_id_type_for_google_analytics'
65
- );
66
- // Change the output of the product ID type for Google Analytics
67
- return apply_filters( 'wpm_product_id_type_for_google_analytics', $ga_id_type );
68
- }
69
-
70
- public function google_active()
71
- {
72
-
73
- if ( $this->options_obj->google->analytics->universal->property_id ) {
74
- return true;
75
- } elseif ( $this->options_obj->google->analytics->ga4->measurement_id ) {
76
- return true;
77
- } elseif ( $this->options_obj->google->ads->conversion_id ) {
78
- return true;
79
- } else {
80
- return false;
81
- }
82
-
83
- }
84
-
85
- public function is_google_ads_active()
86
- {
87
-
88
- if ( $this->options['google']['ads']['conversion_id'] ) {
89
- return true;
90
- } else {
91
- return false;
92
- }
93
-
94
- }
95
-
96
- public function is_google_analytics_active()
97
- {
98
-
99
- if ( $this->is_google_analytics_ua_active() || $this->is_google_analytics_4_active() ) {
100
- return true;
101
- } else {
102
- return false;
103
- }
104
-
105
- }
106
-
107
- public function is_google_analytics_ua_active()
108
- {
109
-
110
- if ( $this->options_obj->google->analytics->universal->property_id ) {
111
- return true;
112
- } else {
113
- return false;
114
- }
115
-
116
- }
117
-
118
- protected function is_google_analytics_4_active()
119
- {
120
-
121
- if ( $this->options_obj->google->analytics->ga4->measurement_id ) {
122
- return true;
123
- } else {
124
- return false;
125
- }
126
-
127
- }
128
-
129
- public function is_google_analytics_4_mp_active()
130
- {
131
-
132
- if ( $this->options_obj->google->analytics->ga4->measurement_id && $this->options_obj->google->analytics->ga4->api_secret ) {
133
- return true;
134
- } else {
135
- return false;
136
- }
137
-
138
- }
139
-
140
- public function wpm_get_order_item_price( $order_item, $product )
141
- {
142
-
143
- if ( ( new Environment_Check( $this->options ) )->is_woo_discount_rules_active() ) {
144
- $item_value = $order_item->get_meta( '_advanced_woo_discount_item_total_discount' );
145
-
146
- if ( is_array( $item_value ) && array_key_exists( 'discounted_price', $item_value ) && 0 != $item_value['discounted_price'] ) {
147
- return (double) $item_value['discounted_price'];
148
- } elseif ( is_array( $item_value ) && array_key_exists( 'initial_price', $item_value ) && 0 != $item_value['initial_price'] ) {
149
- return (double) $item_value['initial_price'];
150
- } else {
151
- return (double) $product->get_price();
152
- }
153
-
154
- } else {
155
- return (double) $product->get_price();
156
- }
157
-
158
- }
159
-
160
- public function add_categories_to_ga4_product_items( $item_details_array, $categories )
161
- {
162
- $categories = array_unique( $categories );
163
-
164
- if ( count( $categories ) > 0 ) {
165
- $max_categories = 5;
166
- $item_details_array['item_category'] = $categories[0];
167
- $max = ( count( $categories ) > $max_categories ? $max_categories : count( $categories ) );
168
- for ( $i = 1 ; $i < $max ; $i++ ) {
169
- $item_details_array['item_category' . ($i + 1)] = $categories[$i];
170
- }
171
- }
172
-
173
- return $item_details_array;
174
- }
175
-
176
- public function get_google_business_vertical( $id )
177
- {
178
- $verticals = [
179
- 0 => 'retail',
180
- 1 => 'education',
181
- 2 => 'flights',
182
- 3 => 'hotel_rental',
183
- 4 => 'jobs',
184
- 5 => 'local',
185
- 6 => 'real_estate',
186
- 7 => 'travel',
187
- 8 => 'custom',
188
- ];
189
- return $verticals[$id];
190
- }
191
-
192
- public function get_google_ads_conversion_ids( $purchase = false )
193
- {
194
- $this->google_ads_conversion_identifiers[$this->options['google']['ads']['conversion_id']] = $this->options['google']['ads']['conversion_label'];
195
- $this->google_ads_conversion_identifiers = apply_filters_deprecated(
196
- 'wgact_google_ads_conversion_identifiers',
197
- [ $this->google_ads_conversion_identifiers ],
198
- '1.10.2',
199
- 'wooptpm_google_ads_conversion_identifiers'
200
- );
201
- $this->google_ads_conversion_identifiers = apply_filters_deprecated(
202
- 'wooptpm_google_ads_conversion_identifiers',
203
- [ $this->google_ads_conversion_identifiers ],
204
- '1.13.0',
205
- 'wpm_google_ads_conversion_identifiers'
206
- );
207
- $this->google_ads_conversion_identifiers = apply_filters( 'wpm_google_ads_conversion_identifiers', $this->google_ads_conversion_identifiers );
208
- $formatted_conversion_ids = [];
209
-
210
- if ( $purchase ) {
211
- foreach ( $this->google_ads_conversion_identifiers as $conversion_id => $conversion_label ) {
212
- $conversion_id = $this->extract_google_ads_id( $conversion_id );
213
- if ( $conversion_id ) {
214
- $formatted_conversion_ids['AW-' . $conversion_id] = $conversion_label;
215
- }
216
- }
217
- } else {
218
- foreach ( $this->google_ads_conversion_identifiers as $conversion_id => $conversion_label ) {
219
- $conversion_id = $this->extract_google_ads_id( $conversion_id );
220
- if ( $conversion_id ) {
221
- $formatted_conversion_ids['AW-' . $conversion_id] = '';
222
- }
223
- }
224
- }
225
-
226
- return $formatted_conversion_ids;
227
- }
228
-
229
- protected function extract_google_ads_id( $string )
230
- {
231
- $re = '/\\d{9,11}/';
232
-
233
- if ( $string ) {
234
- preg_match(
235
- $re,
236
- $string,
237
- $matches,
238
- PREG_OFFSET_CAPTURE,
239
- 0
240
- );
241
- if ( is_array( $matches[0] ) ) {
242
- return $matches[0][0];
243
- }
244
- }
245
-
246
- return '';
247
- }
248
-
249
- public function get_google_ads_enhanced_conversion_data( $order )
250
- {
251
- $customer_data = [];
252
- if ( $order->get_billing_email() ) {
253
- $customer_data['email'] = (string) $order->get_billing_email();
254
- }
255
- if ( $order->get_billing_phone() ) {
256
- $customer_data['phone_number'] = $this->get_e164_formatted_phone_number( (string) $order->get_billing_phone(), (string) $order->get_billing_country() );
257
- }
258
-
259
- if ( $this->are_billing_and_shipping_addresses_equal( $order ) ) {
260
- $customer_data['address'] = $this->get_billing_address_details( $order );
261
- } else {
262
- $customer_data['address'][] = $this->get_billing_address_details( $order );
263
- $customer_data['address'][] = $this->get_shipping_address_details( $order );
264
- }
265
-
266
- return $customer_data;
267
- }
268
-
269
- protected function get_billing_address_details( $order )
270
- {
271
- $customer_data = [];
272
- if ( $order->get_billing_first_name() ) {
273
- $customer_data['first_name'] = (string) $order->get_billing_first_name();
274
- }
275
- if ( $order->get_billing_last_name() ) {
276
- $customer_data['last_name'] = (string) $order->get_billing_last_name();
277
- }
278
- if ( $order->get_billing_address_1() ) {
279
- $customer_data['street'] = (string) $order->get_billing_address_1();
280
- }
281
- if ( $order->get_billing_city() ) {
282
- $customer_data['city'] = (string) $order->get_billing_city();
283
- }
284
- if ( $order->get_billing_state() ) {
285
- $customer_data['region'] = (string) $order->get_billing_state();
286
- }
287
- if ( $order->get_billing_postcode() ) {
288
- $customer_data['postal_code'] = (string) $order->get_billing_postcode();
289
- }
290
- if ( $order->get_billing_country() ) {
291
- $customer_data['country'] = (string) $order->get_billing_country();
292
- }
293
- return $customer_data;
294
- }
295
-
296
- protected function get_shipping_address_details( $order )
297
- {
298
- $customer_data = [];
299
- if ( $order->get_shipping_first_name() ) {
300
- $customer_data['first_name'] = (string) $order->get_shipping_first_name();
301
- }
302
- if ( $order->get_shipping_last_name() ) {
303
- $customer_data['last_name'] = (string) $order->get_shipping_last_name();
304
- }
305
- if ( $order->get_shipping_address_1() ) {
306
- $customer_data['street'] = (string) $order->get_shipping_address_1();
307
- }
308
- if ( $order->get_shipping_city() ) {
309
- $customer_data['city'] = (string) $order->get_shipping_city();
310
- }
311
- if ( $order->get_shipping_state() ) {
312
- $customer_data['region'] = (string) $order->get_shipping_state();
313
- }
314
- if ( $order->get_shipping_postcode() ) {
315
- $customer_data['postal_code'] = (string) $order->get_shipping_postcode();
316
- }
317
- if ( $order->get_shipping_country() ) {
318
- $customer_data['country'] = (string) $order->get_shipping_country();
319
- }
320
- return $customer_data;
321
- }
322
-
323
- private function are_billing_and_shipping_addresses_equal( $order )
324
- {
325
-
326
- if ( $order->get_billing_first_name() === $order->get_shipping_first_name() && $order->get_billing_last_name() === $order->get_shipping_last_name() && $order->get_billing_address_1() === $order->get_shipping_address_1() && $order->get_billing_city() === $order->get_shipping_city() && $order->get_billing_state() === $order->get_shipping_state() && $order->get_billing_postcode() === $order->get_shipping_postcode() && $order->get_billing_country() === $order->get_shipping_country() ) {
327
- return true;
328
- } else {
329
- return false;
330
- }
331
-
332
- }
333
-
334
- public function get_gmc_language()
335
- {
336
- return strtoupper( substr( get_locale(), 0, 2 ) );
337
- }
338
-
339
- // https://developers.google.com/gtagjs/devguide/linker
340
- public function get_google_linker_settings()
341
- {
342
- $linker_settings = apply_filters_deprecated(
343
- 'wooptpm_google_cross_domain_linker_settings',
344
- [ null ],
345
- '1.13.0',
346
- 'wpm_google_cross_domain_linker_settings'
347
- );
348
- return apply_filters( 'wpm_google_cross_domain_linker_settings', $linker_settings );
349
- }
350
-
351
- public function get_ga4_parameters( $id )
352
- {
353
- $ga_4_parameters = [];
354
- if ( $this->options_obj->google->user_id && is_user_logged_in() ) {
355
- $ga_4_parameters = [
356
- 'user_id' => get_current_user_id(),
357
- ];
358
- }
359
- $ga_4_parameters = apply_filters_deprecated(
360
- 'wooptpm_ga_4_parameters',
361
- [ $ga_4_parameters, $id ],
362
- '1.13.0',
363
- 'wpm_ga_4_parameters'
364
- );
365
- return apply_filters( 'wpm_ga_4_parameters', $ga_4_parameters, $id );
366
- }
367
-
368
- public function get_ga_ua_parameters( $id )
369
- {
370
- $ga_ua_parameters = [
371
- 'anonymize_ip' => true,
372
- 'link_attribution' => (bool) $this->options_obj->google->analytics->link_attribution,
373
- ];
374
- if ( $this->options_obj->google->user_id && is_user_logged_in() ) {
375
- $ga_ua_parameters['user_id'] = get_current_user_id();
376
- }
377
- $ga_ua_parameters = apply_filters_deprecated(
378
- 'woopt_pm_analytics_parameters',
379
- [ $ga_ua_parameters, $id ],
380
- '1.10.10',
381
- 'wooptpm_ga_ua_parameters'
382
- );
383
- $ga_ua_parameters = apply_filters_deprecated(
384
- 'wooptpm_ga_ua_parameters',
385
- [ $ga_ua_parameters, $id ],
386
- '1.13.0',
387
- 'wpm_ga_ua_parameters'
388
- );
389
- return apply_filters( 'wpm_ga_ua_parameters', $ga_ua_parameters, $id );
390
- }
391
-
392
- public function get_all_refund_products( $refund )
393
- {
394
- $data = [];
395
- $item_index = 1;
396
- foreach ( $refund->get_items() as $item_id => $item ) {
397
- // $product = new WC_Product($refund_item->get_product_id());
398
- $order_item_data = $this->google->get_order_item_data( $item );
399
- $data['pr' . $item_index . 'id'] = $order_item_data['id'];
400
- $data['pr' . $item_index . 'qt'] = -1 * $order_item_data['quantity'];
401
- $item_index++;
402
- }
403
- return $data;
404
- }
405
 
406
- }
 
 
 
 
 
 
 
 
2
 
3
  namespace WCPM\Classes\Pixels\Google;
4
 
5
+ use WCPM\Classes\Pixels\Pixel;
6
+ use WCPM\Classes\Pixels\Trait_Shop;
 
7
 
8
+ if (!defined('ABSPATH')) {
9
+ exit; // Exit if accessed directly
 
10
  }
11
 
12
+ class Google extends Pixel {
13
+ use Trait_Google;
14
+ use Trait_Shop;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
 
16
+
17
+ public function __construct( $options ) {
18
+ parent::__construct($options);
19
+
20
+ $this->google_business_vertical = $this->get_google_business_vertical($this->options['google']['ads']['google_business_vertical']);
21
+
22
+ $this->pixel_name = 'google';
23
+ }
24
+ }
classes/pixels/google/trait-google.php CHANGED
@@ -2,8 +2,10 @@
2
 
3
  namespace WCPM\Classes\Pixels\Google;
4
 
 
 
 
5
  use WCPM\Classes\Admin\Environment_Check ;
6
- use WCPM\Classes\Pixels\Trait_Shop ;
7
 
8
  if ( !defined( 'ABSPATH' ) ) {
9
  exit;
@@ -12,7 +14,6 @@ if ( !defined( 'ABSPATH' ) ) {
12
 
13
  trait Trait_Google
14
  {
15
- use Trait_Shop ;
16
  protected $google_ads_conversion_identifiers ;
17
  protected function get_ga_id_type()
18
  {
@@ -248,75 +249,81 @@ trait Trait_Google
248
  if ( $order->get_billing_phone() ) {
249
  $customer_data['phone_number'] = $this->get_e164_formatted_phone_number( (string) $order->get_billing_phone(), (string) $order->get_billing_country() );
250
  }
251
-
252
- if ( $this->are_billing_and_shipping_addresses_equal( $order ) ) {
253
- $customer_data['address'] = $this->get_billing_address_details( $order );
254
- } else {
255
- $customer_data['address'][] = $this->get_billing_address_details( $order );
256
- $customer_data['address'][] = $this->get_shipping_address_details( $order );
257
- }
258
-
259
- return $customer_data;
260
- }
261
-
262
- protected function get_billing_address_details( $order )
263
- {
264
- $customer_data = [];
265
  if ( $order->get_billing_first_name() ) {
266
  $customer_data['first_name'] = (string) $order->get_billing_first_name();
267
  }
268
  if ( $order->get_billing_last_name() ) {
269
  $customer_data['last_name'] = (string) $order->get_billing_last_name();
270
  }
271
- if ( $order->get_billing_address_1() ) {
272
- $customer_data['street'] = (string) $order->get_billing_address_1();
273
- }
274
- if ( $order->get_billing_city() ) {
275
- $customer_data['city'] = (string) $order->get_billing_city();
276
- }
277
- if ( $order->get_billing_state() ) {
278
- $customer_data['region'] = (string) $order->get_billing_state();
279
- }
280
- if ( $order->get_billing_postcode() ) {
281
- $customer_data['postal_code'] = (string) $order->get_billing_postcode();
282
- }
283
- if ( $order->get_billing_country() ) {
284
- $customer_data['country'] = (string) $order->get_billing_country();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
285
  }
 
286
  return $customer_data;
287
  }
288
 
289
- protected function get_shipping_address_details( $order )
290
  {
291
- $customer_data = [];
292
- if ( $order->get_shipping_first_name() ) {
293
- $customer_data['first_name'] = (string) $order->get_shipping_first_name();
294
- }
295
- if ( $order->get_shipping_last_name() ) {
296
- $customer_data['last_name'] = (string) $order->get_shipping_last_name();
297
- }
298
- if ( $order->get_shipping_address_1() ) {
299
- $customer_data['street'] = (string) $order->get_shipping_address_1();
300
  }
301
- if ( $order->get_shipping_city() ) {
302
- $customer_data['city'] = (string) $order->get_shipping_city();
303
- }
304
- if ( $order->get_shipping_state() ) {
305
- $customer_data['region'] = (string) $order->get_shipping_state();
306
- }
307
- if ( $order->get_shipping_postcode() ) {
308
- $customer_data['postal_code'] = (string) $order->get_shipping_postcode();
309
- }
310
- if ( $order->get_shipping_country() ) {
311
- $customer_data['country'] = (string) $order->get_shipping_country();
312
- }
313
- return $customer_data;
314
  }
315
 
316
  private function are_billing_and_shipping_addresses_equal( $order )
317
  {
318
 
319
- if ( $order->get_billing_first_name() === $order->get_shipping_first_name() && $order->get_billing_last_name() === $order->get_shipping_last_name() && $order->get_billing_address_1() === $order->get_shipping_address_1() && $order->get_billing_city() === $order->get_shipping_city() && $order->get_billing_state() === $order->get_shipping_state() && $order->get_billing_postcode() === $order->get_shipping_postcode() && $order->get_billing_country() === $order->get_shipping_country() ) {
320
  return true;
321
  } else {
322
  return false;
2
 
3
  namespace WCPM\Classes\Pixels\Google;
4
 
5
+ use libphonenumber\NumberParseException ;
6
+ use libphonenumber\PhoneNumberFormat ;
7
+ use libphonenumber\PhoneNumberUtil ;
8
  use WCPM\Classes\Admin\Environment_Check ;
 
9
 
10
  if ( !defined( 'ABSPATH' ) ) {
11
  exit;
14
 
15
  trait Trait_Google
16
  {
 
17
  protected $google_ads_conversion_identifiers ;
18
  protected function get_ga_id_type()
19
  {
249
  if ( $order->get_billing_phone() ) {
250
  $customer_data['phone_number'] = $this->get_e164_formatted_phone_number( (string) $order->get_billing_phone(), (string) $order->get_billing_country() );
251
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
252
  if ( $order->get_billing_first_name() ) {
253
  $customer_data['first_name'] = (string) $order->get_billing_first_name();
254
  }
255
  if ( $order->get_billing_last_name() ) {
256
  $customer_data['last_name'] = (string) $order->get_billing_last_name();
257
  }
258
+
259
+ if ( $this->are_billing_and_shipping_addresses_equal( $order ) ) {
260
+ if ( $order->get_billing_address_1() ) {
261
+ $customer_data['home_address']['street'] = (string) $order->get_billing_address_1();
262
+ }
263
+ if ( $order->get_billing_city() ) {
264
+ $customer_data['home_address']['city'] = (string) $order->get_billing_city();
265
+ }
266
+ if ( $order->get_billing_state() ) {
267
+ $customer_data['home_address']['region'] = (string) $order->get_billing_state();
268
+ }
269
+ if ( $order->get_billing_postcode() ) {
270
+ $customer_data['home_address']['postal_code'] = (string) $order->get_billing_postcode();
271
+ }
272
+ if ( $order->get_billing_country() ) {
273
+ $customer_data['home_address']['country'] = (string) $order->get_billing_country();
274
+ }
275
+ } else {
276
+ if ( $order->get_billing_address_1() ) {
277
+ $customer_data['address'][0]['street'] = (string) $order->get_billing_address_1();
278
+ }
279
+ if ( $order->get_billing_city() ) {
280
+ $customer_data['address'][0]['city'] = (string) $order->get_billing_city();
281
+ }
282
+ if ( $order->get_billing_state() ) {
283
+ $customer_data['address'][0]['region'] = (string) $order->get_billing_state();
284
+ }
285
+ if ( $order->get_billing_postcode() ) {
286
+ $customer_data['address'][0]['postal_code'] = (string) $order->get_billing_postcode();
287
+ }
288
+ if ( $order->get_billing_country() ) {
289
+ $customer_data['address'][0]['country'] = (string) $order->get_billing_country();
290
+ }
291
+ if ( $order->get_shipping_address_1() ) {
292
+ $customer_data['address'][1]['street'] = (string) $order->get_shipping_address_1();
293
+ }
294
+ if ( $order->get_shipping_city() ) {
295
+ $customer_data['address'][1]['city'] = (string) $order->get_shipping_city();
296
+ }
297
+ if ( $order->get_shipping_state() ) {
298
+ $customer_data['address'][1]['region'] = (string) $order->get_shipping_state();
299
+ }
300
+ if ( $order->get_shipping_postcode() ) {
301
+ $customer_data['address'][1]['postal_code'] = (string) $order->get_shipping_postcode();
302
+ }
303
+ if ( $order->get_shipping_country() ) {
304
+ $customer_data['address'][1]['country'] = (string) $order->get_shipping_country();
305
+ }
306
  }
307
+
308
  return $customer_data;
309
  }
310
 
311
+ private function get_e164_formatted_phone_number( $number, $country )
312
  {
313
+ try {
314
+ $phone_util = PhoneNumberUtil::getInstance();
315
+ $number_parsed = $phone_util->parse( $number, $country );
316
+ return $phone_util->format( $number_parsed, PhoneNumberFormat::E164 );
317
+ } catch ( NumberParseException $e ) {
318
+ error_log( $e );
319
+ return $number;
 
 
320
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
321
  }
322
 
323
  private function are_billing_and_shipping_addresses_equal( $order )
324
  {
325
 
326
+ if ( $order->get_billing_address_1() === $order->get_shipping_address_1() && $order->get_billing_city() === $order->get_shipping_city() && $order->get_billing_state() === $order->get_shipping_state() && $order->get_billing_postcode() === $order->get_shipping_postcode() && $order->get_billing_country() === $order->get_shipping_country() ) {
327
  return true;
328
  } else {
329
  return false;
classes/pixels/trait-product.php CHANGED
@@ -3,14 +3,12 @@
3
  namespace WCPM\Classes\Pixels;
4
 
5
  use WCPM\Classes\Admin\Environment_Check;
6
- use WCPM\Classes\Pixels\Google\Google;
7
 
8
  if (!defined('ABSPATH')) {
9
  exit; // Exit if accessed directly
10
  }
11
 
12
  trait Trait_Product {
13
-
14
  protected function get_formatted_variant_text( $product ) {
15
  $variant_text_array = [];
16
 
@@ -27,8 +25,7 @@ trait Trait_Product {
27
  }
28
 
29
  protected function get_variation_or_product_id( $item, $variations_output = true ) {
30
-
31
- if (0 <> $item['variation_id'] && true === $variations_output) {
32
  return $item['variation_id'];
33
  } else {
34
  return $item['product_id'];
@@ -38,13 +35,19 @@ trait Trait_Product {
38
  // https://stackoverflow.com/a/56278308/4688612
39
  // https://stackoverflow.com/a/39034036/4688612
40
  public function get_brand_name( $product_id ) {
 
 
 
 
41
 
42
  $brand_taxonomy = 'pa_brand';
43
 
44
  if (( new Environment_Check($this->options) )->is_yith_wc_brands_active()) {
45
  $brand_taxonomy = 'yith_product_brand';
46
- } elseif (( new Environment_Check($this->options) )->is_woocommerce_brands_active()) {
47
- $brand_taxonomy = 'product_brand';
 
 
48
  }
49
 
50
  $brand_taxonomy = apply_filters_deprecated('wooptpm_custom_brand_taxonomy', [$brand_taxonomy], '1.13.0', 'wpm_custom_brand_taxonomy');
@@ -52,6 +55,10 @@ trait Trait_Product {
52
  // Use custom brand_taxonomy
53
  $brand_taxonomy = apply_filters('wpm_custom_brand_taxonomy', $brand_taxonomy);
54
 
 
 
 
 
55
  if ($this->get_brand_by_taxonomy($product_id, $brand_taxonomy)) {
56
  return $this->get_brand_by_taxonomy($product_id, $brand_taxonomy);
57
  } elseif ($this->get_brand_by_taxonomy($product_id, 'pa_' . $brand_taxonomy)) {
@@ -62,7 +69,6 @@ trait Trait_Product {
62
  }
63
 
64
  public function get_brand_by_taxonomy( $product_id, $taxonomy ) {
65
-
66
  if (taxonomy_exists($taxonomy)) {
67
  $brand_names = wp_get_post_terms($product_id, $taxonomy, ['fields' => 'names']);
68
  return reset($brand_names);
@@ -73,19 +79,13 @@ trait Trait_Product {
73
 
74
  // get an array with all product categories
75
  public function get_product_category( $product_id ) {
76
-
77
- if ($this->is_variable_product_by_id($product_id)) {
78
- $product = wc_get_product($product_id);
79
- $product_id = $product->get_parent_id();
80
- }
81
-
82
  $prod_cats = get_the_terms($product_id, 'product_cat');
83
  $prod_cats_output = [];
84
 
85
  // only continue with the loop if one or more product categories have been set for the product
86
  if (!empty($prod_cats)) {
87
  foreach ((array) $prod_cats as $key) {
88
- $prod_cats_output[] = $key->name;
89
  }
90
 
91
  // apply filter to the $prod_cats_output array
@@ -95,15 +95,7 @@ trait Trait_Product {
95
  return $prod_cats_output;
96
  }
97
 
98
- protected function is_variable_product_by_id( $product_id ) {
99
-
100
- $product = wc_get_product($product_id);
101
-
102
- return $product->get_type() === 'variable';
103
- }
104
-
105
  protected function get_compiled_product_id( $product_id, $product_sku, $options, $channel = '' ) {
106
-
107
  // depending on setting use product IDs or SKUs
108
  if (0 == $this->options['google']['ads']['product_identifier'] || 'ga_ua' === $channel || 'ga_4' === $channel) {
109
  return (string) $product_id;
@@ -121,7 +113,6 @@ trait Trait_Product {
121
  }
122
 
123
  protected function get_dyn_r_ids( $product ) {
124
-
125
  $dyn_r_ids = [
126
  'post_id' => (string) $product->get_id(),
127
  'sku' => (string) $product->get_sku() ? $product->get_sku() : $product->get_id(),
@@ -135,7 +126,6 @@ trait Trait_Product {
135
  }
136
 
137
  protected function log_problematic_product_id( $product_id = 0 ) {
138
-
139
  wc_get_logger()->debug(
140
  'WooCommerce detects the page ID ' . $product_id . ' as product, but when invoked by wc_get_product( ' . $product_id . ' ) it returns no product object',
141
  ['source' => 'wpm']
@@ -158,6 +148,7 @@ trait Trait_Product {
158
 
159
  $dyn_r_ids = $this->get_dyn_r_ids($product);
160
  $product_id_compiled = $dyn_r_ids[$this->get_dyn_r_id_type()];
 
161
  array_push($order_items_array, $product_id_compiled);
162
  } else {
163
 
@@ -169,7 +160,6 @@ trait Trait_Product {
169
  }
170
 
171
  protected function get_order_items_formatted_for_purchase_event( $order ) {
172
-
173
  $order_items = $this->wpm_get_order_items($order);
174
  $order_items_formatted = [];
175
 
@@ -185,6 +175,7 @@ trait Trait_Product {
185
 
186
  $dyn_r_ids = $this->get_dyn_r_ids($product);
187
  $product_id_compiled = $dyn_r_ids[$this->get_dyn_r_id_type()];
 
188
 
189
  $product_details['id'] = $product_id_compiled;
190
  $product_details['name'] = $product->get_name();
@@ -193,6 +184,8 @@ trait Trait_Product {
193
  $product_details['brand'] = $this->get_brand_name($product_id);
194
  $product_details['category'] = implode(',', $this->get_product_category($product_id));
195
 
 
 
196
  if ($product->is_type('variation')) {
197
  $product_details['variant'] = $this->get_formatted_variant_text($product);
198
 
@@ -205,6 +198,7 @@ trait Trait_Product {
205
  }
206
 
207
  $order_items_formatted[] = $product_details;
 
208
  } else {
209
 
210
  $this->log_problematic_product_id($product_id);
@@ -214,7 +208,9 @@ trait Trait_Product {
214
  return $order_items_formatted;
215
  }
216
 
 
217
  protected function get_dyn_r_id_type( $pixel_name = null ) {
 
218
 
219
  if ($pixel_name) {
220
  $this->pixel_name = $pixel_name;
@@ -230,7 +226,7 @@ trait Trait_Product {
230
  $this->dyn_r_id_type = 'gla';
231
  }
232
 
233
- // If you want to change the dyn_r_id type programmatically
234
  $this->dyn_r_id_type = apply_filters_deprecated('wooptpm_product_id_type_for_' . $this->pixel_name, [$this->dyn_r_id_type], '1.13.0', 'wpm_product_id_type_for_');
235
  $this->dyn_r_id_type = apply_filters('wpm_product_id_type_for_' . $this->pixel_name, $this->dyn_r_id_type);
236
 
@@ -238,16 +234,11 @@ trait Trait_Product {
238
  }
239
 
240
  protected function wpm_get_order_items( $order ) {
241
-
242
  $order_items = apply_filters_deprecated('wooptpm_order_items', [$order->get_items(), $order], '1.13.0', 'wpm_order_items');
243
-
244
- // Give option to filter order items
245
- // then return
246
  return apply_filters('wpm_order_items', $order_items, $order);
247
  }
248
 
249
  protected function get_front_end_order_items( $order ) {
250
-
251
  $order_items = $this->wpm_get_order_items($order);
252
  $order_items_formatted = [];
253
 
@@ -268,7 +259,7 @@ trait Trait_Product {
268
  'variation_id' => $order_item_data['variation_id'],
269
  'name' => $order_item_data['name'],
270
  'quantity' => $order_item_data['quantity'],
271
- 'price' => ( new Google($this->options) )->wpm_get_order_item_price($order_item, $product),
272
  'subtotal' => (float) number_format($order_item_data['subtotal'], 2, '.', ''),
273
  'subtotal_tax' => (float) number_format($order_item_data['subtotal_tax'], 2, '.', ''),
274
  'total' => (float) number_format($order_item_data['total'], 2, '.', ''),
@@ -289,23 +280,50 @@ trait Trait_Product {
289
  }
290
 
291
  public function get_product_data_layer_script( $product, $set_position = true, $meta_tag = false ) {
292
-
293
  if (!is_object($product)) {
 
 
294
  wc_get_logger()->debug('get_product_data_layer_script received an invalid product', ['source' => 'wpm']);
 
295
  return '';
296
  }
297
 
298
  $data = $this->get_product_details_for_datalayer($product);
299
 
300
- // If placed in <head> it must be a <meta> tag else, it can be an <input> tag
301
- // Added name and content to meta in order to pass W3 validation test at https://validator.w3.org/nu/
 
302
  $tag = $meta_tag ? "meta name='wpm-dataLayer-meta' content='" . $product->get_id() . "'" : "input type='hidden'";
303
 
 
 
 
 
 
 
304
  $this->get_product_data_layer_script_html_part_1($tag, $product, $data, $set_position, $meta_tag);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
305
  }
306
 
307
  protected function get_product_data_layer_script_html_part_1( $tag, $product, $data, $set_position, $meta_tag ) {
308
-
309
  if ($meta_tag) {
310
  ?>
311
  <meta name="pm-dataLayer-meta" content="<?php esc_html_e($product->get_id()); ?>" class="wpmProductId"
@@ -318,22 +336,24 @@ trait Trait_Product {
318
  }
319
 
320
  ?>
321
- <script>
322
- (window.wpmDataLayer = window.wpmDataLayer || {}).products = window.wpmDataLayer.products || {}
323
  window.wpmDataLayer.products[<?php esc_html_e($product->get_id()); ?>] = <?php echo wp_json_encode($data); ?>;
324
  <?php $set_position ? $this->get_product_data_layer_script_html_part_2($product) : ''; ?>
325
  </script>
326
  <?php
 
327
  }
328
 
329
  protected function get_product_data_layer_script_html_part_2( $product ) {
330
  ?>
331
  window.wpmDataLayer.products[<?php esc_html_e($product->get_id()); ?>]['position'] = window.wpmDataLayer.position++
332
  <?php
 
333
  }
334
 
335
- public function get_product_details_for_datalayer( $product ) {
336
 
 
337
  global $woocommerce_wpml;
338
 
339
  $dyn_r_ids = $this->get_dyn_r_ids($product);
@@ -353,11 +373,11 @@ trait Trait_Product {
353
  'category' => $this->get_product_category($product->get_id()),
354
  'quantity' => 1,
355
  'dyn_r_ids' => $dyn_r_ids,
356
- 'isVariable' => $product->get_type() === 'variable',
357
  'isVariation' => false,
358
  ];
359
 
360
- if ($product->get_type() === 'variation') {
361
 
362
  $parent_product = wc_get_product($product->get_parent_id());
363
  if ($parent_product) {
3
  namespace WCPM\Classes\Pixels;
4
 
5
  use WCPM\Classes\Admin\Environment_Check;
 
6
 
7
  if (!defined('ABSPATH')) {
8
  exit; // Exit if accessed directly
9
  }
10
 
11
  trait Trait_Product {
 
12
  protected function get_formatted_variant_text( $product ) {
13
  $variant_text_array = [];
14
 
25
  }
26
 
27
  protected function get_variation_or_product_id( $item, $variations_output = true ) {
28
+ if (0 <> $item['variation_id'] && true == $variations_output) {
 
29
  return $item['variation_id'];
30
  } else {
31
  return $item['product_id'];
35
  // https://stackoverflow.com/a/56278308/4688612
36
  // https://stackoverflow.com/a/39034036/4688612
37
  public function get_brand_name( $product_id ) {
38
+ // return $this->get_brand_by_taxonomy($product_id, 'product_brand') ?: // for Woocommerce Brands plugin
39
+ // $this->get_brand_by_taxonomy($product_id, 'yith_product_brand') ?: // for YITH WooCommerce Brands plugin
40
+ // $this->get_brand_by_taxonomy($product_id, 'pa_brand') ?: // for a custom product attribute
41
+ // '';
42
 
43
  $brand_taxonomy = 'pa_brand';
44
 
45
  if (( new Environment_Check($this->options) )->is_yith_wc_brands_active()) {
46
  $brand_taxonomy = 'yith_product_brand';
47
+ } else {
48
+ if (( new Environment_Check($this->options) )->is_woocommerce_brands_active()) {
49
+ $brand_taxonomy = 'product_brand';
50
+ }
51
  }
52
 
53
  $brand_taxonomy = apply_filters_deprecated('wooptpm_custom_brand_taxonomy', [$brand_taxonomy], '1.13.0', 'wpm_custom_brand_taxonomy');
55
  // Use custom brand_taxonomy
56
  $brand_taxonomy = apply_filters('wpm_custom_brand_taxonomy', $brand_taxonomy);
57
 
58
+ // return $this->get_brand_by_taxonomy($product_id, $brand_taxonomy) ?:
59
+ // $this->get_brand_by_taxonomy($product_id, 'pa_' . $brand_taxonomy) ?:
60
+ // '';
61
+
62
  if ($this->get_brand_by_taxonomy($product_id, $brand_taxonomy)) {
63
  return $this->get_brand_by_taxonomy($product_id, $brand_taxonomy);
64
  } elseif ($this->get_brand_by_taxonomy($product_id, 'pa_' . $brand_taxonomy)) {
69
  }
70
 
71
  public function get_brand_by_taxonomy( $product_id, $taxonomy ) {
 
72
  if (taxonomy_exists($taxonomy)) {
73
  $brand_names = wp_get_post_terms($product_id, $taxonomy, ['fields' => 'names']);
74
  return reset($brand_names);
79
 
80
  // get an array with all product categories
81
  public function get_product_category( $product_id ) {
 
 
 
 
 
 
82
  $prod_cats = get_the_terms($product_id, 'product_cat');
83
  $prod_cats_output = [];
84
 
85
  // only continue with the loop if one or more product categories have been set for the product
86
  if (!empty($prod_cats)) {
87
  foreach ((array) $prod_cats as $key) {
88
+ array_push($prod_cats_output, $key->name);
89
  }
90
 
91
  // apply filter to the $prod_cats_output array
95
  return $prod_cats_output;
96
  }
97
 
 
 
 
 
 
 
 
98
  protected function get_compiled_product_id( $product_id, $product_sku, $options, $channel = '' ) {
 
99
  // depending on setting use product IDs or SKUs
100
  if (0 == $this->options['google']['ads']['product_identifier'] || 'ga_ua' === $channel || 'ga_4' === $channel) {
101
  return (string) $product_id;
113
  }
114
 
115
  protected function get_dyn_r_ids( $product ) {
 
116
  $dyn_r_ids = [
117
  'post_id' => (string) $product->get_id(),
118
  'sku' => (string) $product->get_sku() ? $product->get_sku() : $product->get_id(),
126
  }
127
 
128
  protected function log_problematic_product_id( $product_id = 0 ) {
 
129
  wc_get_logger()->debug(
130
  'WooCommerce detects the page ID ' . $product_id . ' as product, but when invoked by wc_get_product( ' . $product_id . ' ) it returns no product object',
131
  ['source' => 'wpm']
148
 
149
  $dyn_r_ids = $this->get_dyn_r_ids($product);
150
  $product_id_compiled = $dyn_r_ids[$this->get_dyn_r_id_type()];
151
+ // $product_id_compiled = $this->get_compiled_product_id($product_id, $product->get_sku(), $this->options, '');
152
  array_push($order_items_array, $product_id_compiled);
153
  } else {
154
 
160
  }
161
 
162
  protected function get_order_items_formatted_for_purchase_event( $order ) {
 
163
  $order_items = $this->wpm_get_order_items($order);
164
  $order_items_formatted = [];
165
 
175
 
176
  $dyn_r_ids = $this->get_dyn_r_ids($product);
177
  $product_id_compiled = $dyn_r_ids[$this->get_dyn_r_id_type()];
178
+ // $product_id_compiled = $this->get_compiled_product_id($product_id, $product->get_sku(), $this->options, '');
179
 
180
  $product_details['id'] = $product_id_compiled;
181
  $product_details['name'] = $product->get_name();
184
  $product_details['brand'] = $this->get_brand_name($product_id);
185
  $product_details['category'] = implode(',', $this->get_product_category($product_id));
186
 
187
+ // error_log('type: ' . $product->get_type());
188
+
189
  if ($product->is_type('variation')) {
190
  $product_details['variant'] = $this->get_formatted_variant_text($product);
191
 
198
  }
199
 
200
  $order_items_formatted[] = $product_details;
201
+ // array_push($order_items_formatted, $product_details);
202
  } else {
203
 
204
  $this->log_problematic_product_id($product_id);
208
  return $order_items_formatted;
209
  }
210
 
211
+
212
  protected function get_dyn_r_id_type( $pixel_name = null ) {
213
+ // $dyn_r_id_type = '';
214
 
215
  if ($pixel_name) {
216
  $this->pixel_name = $pixel_name;
226
  $this->dyn_r_id_type = 'gla';
227
  }
228
 
229
+ // if you want to change the dyn_r_id type for Google programmatically
230
  $this->dyn_r_id_type = apply_filters_deprecated('wooptpm_product_id_type_for_' . $this->pixel_name, [$this->dyn_r_id_type], '1.13.0', 'wpm_product_id_type_for_');
231
  $this->dyn_r_id_type = apply_filters('wpm_product_id_type_for_' . $this->pixel_name, $this->dyn_r_id_type);
232
 
234
  }
235
 
236
  protected function wpm_get_order_items( $order ) {
 
237
  $order_items = apply_filters_deprecated('wooptpm_order_items', [$order->get_items(), $order], '1.13.0', 'wpm_order_items');
 
 
 
238
  return apply_filters('wpm_order_items', $order_items, $order);
239
  }
240
 
241
  protected function get_front_end_order_items( $order ) {
 
242
  $order_items = $this->wpm_get_order_items($order);
243
  $order_items_formatted = [];
244
 
259
  'variation_id' => $order_item_data['variation_id'],
260
  'name' => $order_item_data['name'],
261
  'quantity' => $order_item_data['quantity'],
262
+ 'price' => $this->wpm_get_order_item_price($order_item, $product),
263
  'subtotal' => (float) number_format($order_item_data['subtotal'], 2, '.', ''),
264
  'subtotal_tax' => (float) number_format($order_item_data['subtotal_tax'], 2, '.', ''),
265
  'total' => (float) number_format($order_item_data['total'], 2, '.', ''),
280
  }
281
 
282
  public function get_product_data_layer_script( $product, $set_position = true, $meta_tag = false ) {
 
283
  if (!is_object($product)) {
284
+
285
+ // $this->log_problematic_product_id();
286
  wc_get_logger()->debug('get_product_data_layer_script received an invalid product', ['source' => 'wpm']);
287
+
288
  return '';
289
  }
290
 
291
  $data = $this->get_product_details_for_datalayer($product);
292
 
293
+ // if placed in <head> it must be a <meta> tag else, it can be an <input> tag
294
+ // $tag = $meta_tag ? "meta" : "input";
295
+ // added name and content to meta in order to pass W3 validation test at https://validator.w3.org/nu/
296
  $tag = $meta_tag ? "meta name='wpm-dataLayer-meta' content='" . $product->get_id() . "'" : "input type='hidden'";
297
 
298
+ // $html = "
299
+ // <$tag class='wpmProductId' data-id='" . $product->get_id() . "'>
300
+ // <script type=\"text/javascript\" data-cfasync=\"false\">
301
+ // window.wpmDataLayer.products = window.wpmDataLayer.products || {};
302
+ // window.wpmDataLayer.products[" . $product->get_id() . "] = " . wp_json_encode($data) . ";";
303
+
304
  $this->get_product_data_layer_script_html_part_1($tag, $product, $data, $set_position, $meta_tag);
305
+
306
+ // $html = '
307
+ // <' . $tag . ' class="wpmProductId" data-id="' . $product->get_id() . '">
308
+ // <script type="text/javascript" data-cfasync="false">
309
+ // window.wpmDataLayer.products = window.wpmDataLayer.products || {};
310
+ // window.wpmDataLayer.products[' . $product->get_id() . '] = ' . wp_json_encode($data) . ';';
311
+
312
+ // if (true === $set_position) {
313
+ //
314
+ //// $html .= "
315
+ //// window.wpmDataLayer.products[{$product->get_id()}]['position'] = window.wpmDataLayer.position++;";
316
+ ////
317
+ // $this->get_product_data_layer_script_html_part_2($product);
318
+ // }
319
+
320
+ // $html .= '</script>';
321
+ // echo '</script>';
322
+
323
+ // return $html;
324
  }
325
 
326
  protected function get_product_data_layer_script_html_part_1( $tag, $product, $data, $set_position, $meta_tag ) {
 
327
  if ($meta_tag) {
328
  ?>
329
  <meta name="pm-dataLayer-meta" content="<?php esc_html_e($product->get_id()); ?>" class="wpmProductId"
336
  }
337
 
338
  ?>
339
+ <script type="text/javascript" data-cfasync="false">
340
+ window.wpmDataLayer.products = window.wpmDataLayer.products || {};
341
  window.wpmDataLayer.products[<?php esc_html_e($product->get_id()); ?>] = <?php echo wp_json_encode($data); ?>;
342
  <?php $set_position ? $this->get_product_data_layer_script_html_part_2($product) : ''; ?>
343
  </script>
344
  <?php
345
+
346
  }
347
 
348
  protected function get_product_data_layer_script_html_part_2( $product ) {
349
  ?>
350
  window.wpmDataLayer.products[<?php esc_html_e($product->get_id()); ?>]['position'] = window.wpmDataLayer.position++
351
  <?php
352
+
353
  }
354
 
 
355
 
356
+ public function get_product_details_for_datalayer( $product ) {
357
  global $woocommerce_wpml;
358
 
359
  $dyn_r_ids = $this->get_dyn_r_ids($product);
373
  'category' => $this->get_product_category($product->get_id()),
374
  'quantity' => 1,
375
  'dyn_r_ids' => $dyn_r_ids,
376
+ 'isVariable' => $product->get_type() == 'variable',
377
  'isVariation' => false,
378
  ];
379
 
380
+ if ($product->get_type() == 'variation') {
381
 
382
  $parent_product = wc_get_product($product->get_parent_id());
383
  if ($parent_product) {
classes/pixels/trait-shop.php CHANGED
@@ -2,288 +2,382 @@
2
 
3
  namespace WCPM\Classes\Pixels;
4
 
5
- use libphonenumber\NumberParseException;
6
- use libphonenumber\PhoneNumberFormat;
7
- use libphonenumber\PhoneNumberUtil;
8
- use WC_Geolocation;
9
 
10
- if (!defined('ABSPATH')) {
11
- exit; // Exit if accessed directly
12
- }
13
-
14
- trait Trait_Shop {
15
-
16
- protected function get_list_name_suffix() {
17
- $list_suffix = '';
18
-
19
- if (is_product_category()) {
20
-
21
- $category = get_queried_object();
22
- $list_suffix = ' | ' . $category->name;
23
- $list_suffix = $this->add_parent_category_name($category, $list_suffix);
24
- } else {
25
- if (is_product_tag()) {
26
- $tag = get_queried_object();
27
- $list_suffix = ' | ' . $tag->name;
28
- }
29
- }
30
-
31
- return $list_suffix;
32
- }
33
-
34
- protected function add_parent_category_name( $category, $list_suffix ) {
35
- if ($category->parent > 0) {
36
-
37
- $parent_category = get_term_by('id', $category->parent, 'product_cat');
38
- $list_suffix = ' | ' . $parent_category->name . $list_suffix;
39
- $list_suffix = $this->add_parent_category_name($parent_category, $list_suffix);
40
- }
41
-
42
- return $list_suffix;
43
- }
44
-
45
- protected function get_list_id_suffix() {
46
- $list_suffix = '';
47
-
48
- if (is_product_category()) {
49
- $category = get_queried_object();
50
- $list_suffix = '.' . $category->slug;
51
- $list_suffix = $this->add_parent_category_id($category, $list_suffix);
52
- } else {
53
- if (is_product_tag()) {
54
- $tag = get_queried_object();
55
- $list_suffix = '.' . $tag->slug;
56
- }
57
- }
58
-
59
- return $list_suffix;
60
- }
61
-
62
- protected function add_parent_category_id( $category, $list_suffix ) {
63
- if ($category->parent > 0) {
64
-
65
- $parent_category = get_term_by('id', $category->parent, 'product_cat');
66
- $list_suffix = '.' . $parent_category->slug . $list_suffix;
67
- $list_suffix = $this->add_parent_category_id($parent_category, $list_suffix);
68
- }
69
-
70
- return $list_suffix;
71
- }
72
-
73
- // https://stackoverflow.com/a/49616130/4688612
74
- protected function get_order_from_order_received_page() {
75
- if ($this->get_order_from_query_vars()) {
76
- return $this->get_order_from_query_vars();
77
- } else {
78
- if ($this->get_order_with_url_order_key()) {
79
- return $this->get_order_with_url_order_key();
80
- } else {
81
- return false;
82
- }
83
- }
84
- }
85
-
86
- protected function wpm_get_order_total( $order ) {
87
-
88
- $order_total = 0 == $this->options_obj->shop->order_total_logic ? $order->get_subtotal() - $order->get_total_discount() : $order->get_total();
89
-
90
- // filter to adjust the order value
91
- $order_total = apply_filters_deprecated('wgact_conversion_value_filter', [$order_total, $order], '1.10.2', 'wooptpm_conversion_value_filter');
92
- $order_total = apply_filters_deprecated('wooptpm_conversion_value_filter', [$order_total, $order], '1.13.0', 'wpm_conversion_value_filter');
93
- $order_total = apply_filters('wpm_conversion_value_filter', $order_total, $order);
94
-
95
- return number_format((float) $order_total, 2, '.', '');
96
-
97
- }
98
-
99
- protected function get_order_from_query_vars() {
100
- global $wp;
101
-
102
- $order_id = absint($wp->query_vars['order-received']);
103
-
104
- if ($order_id && 0 != $order_id && wc_get_order($order_id)) {
105
-
106
- return wc_get_order($order_id);
107
- } else {
108
-
109
- wc_get_logger()->debug(
110
- 'WooCommerce couldn\'t retrieve the order ID from $wp->query_vars[\'order-received\']',
111
- ['source' => 'wpm']
112
- );
113
-
114
- wc_get_logger()->debug(
115
- print_r($wp->query_vars, true),
116
- ['source' => 'wpm']
117
- );
118
-
119
- return false;
120
- }
121
- }
122
-
123
- protected function get_order_with_url_order_key() {
124
-
125
- $_get = filter_input_array(INPUT_GET, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
126
-
127
- if (isset($_get['key'])) {
128
- $order_key = $_get['key'];
129
- return wc_get_order(wc_get_order_id_by_order_key($order_key));
130
- } else {
131
-
132
- wc_get_logger()->debug(
133
- 'WooCommerce couldn\'t retrieve the order ID from order key in the URL',
134
- ['source' => 'wpm']
135
- );
136
-
137
- $order_key = $_get['key'] ? $_get['key'] : '';
138
- wc_get_logger()->debug(
139
- 'URL order key: ' . $order_key,
140
- ['source' => 'wpm']
141
- );
142
-
143
- return false;
144
- }
145
- }
146
-
147
- protected function get_order_currency( $order ) {
148
- // use the right function to get the currency depending on the WooCommerce version
149
- return $this->woocommerce_3_and_above() ? $order->get_currency() : $order->get_order_currency();
150
- }
151
-
152
- protected function woocommerce_3_and_above() {
153
- global $woocommerce;
154
- if (version_compare($woocommerce->version, 3.0, '>=')) {
155
- return true;
156
- } else {
157
- return false;
158
- }
159
- }
160
-
161
- // https://stackoverflow.com/a/46216073/4688612
162
- // https://github.com/woocommerce/woocommerce/wiki/wc_get_orders-and-WC_Order_Query#description
163
- protected function is_existing_customer( $order, $value = 0 ) {
164
-
165
- if (is_numeric($value)) { // Based on user ID (registered users)
166
- $meta_key = '_customer_user';
167
- $meta_value = 0 == $value ? get_current_user_id() : (int) $value;
168
- } else { // Based on billing email (Guest users)
169
- $meta_key = '_billing_email';
170
- $meta_value = sanitize_email($value);
171
- }
172
-
173
- $orders = wc_get_orders([
174
- 'return' => 'ids',
175
- 'meta_key' => $meta_key,
176
- 'meta_value' => $meta_value,
177
- // 'orderby' => 'date',
178
- // 'order' => 'DESC',
179
- 'post_status' => wc_get_is_paid_statuses(),
180
- 'limit' => 1,
181
- ]);
182
-
183
- // Return a boolean value based on orders count
184
- return count($orders) > 0;
185
- }
186
-
187
- protected function get_user_ip() {
188
-
189
- if ($this->is_localhost()) {
190
- $ip = WC_Geolocation::get_external_ip_address();
191
- } else {
192
- $ip = WC_Geolocation::get_ip_address();
193
- }
194
-
195
- // only set the IP if it is a public address
196
- $ip = filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);
197
-
198
- // Remove the IPv6 to IPv4 mapping in case the IP contains one
199
- // and return the IP plain public IPv4 or IPv6 IP
200
- // https://en.wikipedia.org/wiki/IPv6_address
201
- return str_replace('::ffff:', '', $ip);
202
- }
203
-
204
- protected function get_visitor_country() {
205
-
206
- $location = WC_Geolocation::geolocate_ip($this->get_user_ip());
207
-
208
- return $location['country'];
209
- }
210
-
211
- protected function is_localhost() {
212
-
213
- $_server = filter_input_array(INPUT_SERVER, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
214
-
215
- // If the IP is local, return true, else false
216
- // https://stackoverflow.com/a/13818647/4688612
217
- return !filter_var(
218
- $_server['REMOTE_ADDR'],
219
- FILTER_VALIDATE_IP,
220
- FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE
221
- );
222
- }
223
-
224
- protected function get_user_email( $algo = null ) {
225
-
226
- if (is_user_logged_in()) {
227
- $current_user = wp_get_current_user();
228
- $email = $current_user->user_email;
229
- } elseif (is_order_received_page()) {
230
- $order = $this->get_order_from_order_received_page();
231
-
232
- if ($order) {
233
- $email = $order->get_billing_email();
234
- } else {
235
- $email = '';
236
- }
237
- } else {
238
- $email = '';
239
- }
240
-
241
- // encrypt email
242
- if ($email && $algo && in_array($algo, hash_algos(), true)) {
243
- $email = hash($algo, $email);
244
- }
245
-
246
- return $email;
247
- }
248
-
249
- private function get_e164_formatted_phone_number( $number, $country ) {
250
- try {
251
- $phone_util = PhoneNumberUtil::getInstance();
252
- $number_parsed = $phone_util->parse($number, $country);
253
- return $phone_util->format($number_parsed, PhoneNumberFormat::E164);
254
- } catch (NumberParseException $e) {
255
- error_log($e);
256
- return $number;
257
- }
258
- }
259
-
260
- protected function track_user( $user_id = null ) {
261
-
262
- $user = null;
263
-
264
- if (0 === $user_id) { // If anonymous visitor then track
265
- return true;
266
- } elseif ($user_id && 0 <= $user_id) { // If user ID is known, get the user
267
- $user = get_user_by('id', $user_id);
268
- } elseif (null === $user_id && is_user_logged_in()) { // If user id is not given, but the user is logged in, get the user
269
- $user = wp_get_current_user();
270
- }
271
-
272
- // Find out if the user has a role that is restricted from tracking
273
- if ($user) {
274
-
275
- foreach ($user->roles as $role) {
276
- if (in_array($role, $this->options_obj->shop->disable_tracking_for, true)) {
277
- return false;
278
- }
279
- }
280
- }
281
-
282
- return true;
283
- }
284
-
285
- protected function do_not_track_user( $user_id = null ) {
286
- return !$this->track_user($user_id);
287
- }
288
  }
289
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
 
3
  namespace WCPM\Classes\Pixels;
4
 
5
+ use WC_Geolocation ;
 
 
 
6
 
7
+ if ( !defined( 'ABSPATH' ) ) {
8
+ exit;
9
+ // Exit if accessed directly
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  }
11
 
12
+ trait Trait_Shop
13
+ {
14
+ protected function get_formatted_script_tag_new( $components )
15
+ {
16
+ $allowed_protocols = [
17
+ 'http' => [],
18
+ 'https' => [],
19
+ ];
20
+ echo PHP_EOL ;
21
+
22
+ if ( $components['src'] ) {
23
+ echo "\t" . '<script ' . wp_kses( $this->print_script_components( $components ), [], $allowed_protocols ) . '></script>' ;
24
+ } else {
25
+ echo "\t" . '<script ' . wp_kses( $this->print_script_components( $components ), [], $allowed_protocols ) . '>' ;
26
+ }
27
+
28
+ echo PHP_EOL ;
29
+ }
30
+
31
+ protected function print_script_components( $components )
32
+ {
33
+ $attributes[] = $this->get_script_async_defer( $components );
34
+ $attributes[] = $this->get_script_src( $components['src'] );
35
+ $attributes[] = $this->get_script_type_value( $components['cookie_category'] );
36
+ $attributes[] = $this->get_script_cookie_category( $components['cookie_category'] );
37
+ $attributes[] = $this->get_script_data_wpm_pixel_name( $components['pixel_name'] );
38
+ $attributes[] = $this->get_script_cfasync( $components['inject_cfasync'] );
39
+ $attributes[] = $this->get_script_cookiebot_cookieconsent( $components );
40
+ return implode( ' ', array_filter( $attributes ) );
41
+ }
42
+
43
+ protected function get_script_cookiebot_cookieconsent( $components )
44
+ {
45
+ if ( array_key_exists( 'cookiebot-cookieconsent', $components ) && $components['cookiebot-cookieconsent'] ) {
46
+ return 'data-cookieconsent="ignore"';
47
+ }
48
+ }
49
+
50
+ protected function get_script_cfasync( $cfasync )
51
+ {
52
+ if ( $cfasync ) {
53
+ return 'data-cfasync="false"';
54
+ }
55
+ }
56
+
57
+ protected function get_script_data_wpm_pixel_name( $pixel_name )
58
+ {
59
+ return 'data-wpm-pixel-name="' . $pixel_name . '"';
60
+ }
61
+
62
+ protected function get_script_src( $src )
63
+ {
64
+
65
+ if ( $src ) {
66
+ if ( !$this->options_obj->shop->cookie_consent_mgmt->explicit_consent ) {
67
+ return $this->print_script_src_orig( $src );
68
+ }
69
+ return $this->print_script_src_data_wpm( $src );
70
+ }
71
+
72
+ }
73
+
74
+ protected function print_script_src_orig( $src )
75
+ {
76
+ return 'src="' . $src . '"';
77
+ }
78
+
79
+ protected function print_script_src_data_wpm( $src )
80
+ {
81
+ return 'data-wpm-src="' . $src . '"';
82
+ }
83
+
84
+ private function get_script_async_defer( $components )
85
+ {
86
+ if ( $components['src'] ) {
87
+ // A script tag can't have both async and defer attributes,
88
+ // therefore fall back to a default if both are set.
89
+ // Otherwise, use the one that is set.
90
+
91
+ if ( $components['async'] && $components['defer'] ) {
92
+ return 'async';
93
+ } else {
94
+
95
+ if ( $components['async'] ) {
96
+ return 'async';
97
+ } else {
98
+ if ( $components['defer'] ) {
99
+ return 'defer';
100
+ }
101
+ }
102
+
103
+ }
104
+
105
+ }
106
+ }
107
+
108
+ public function get_script_type_value( $cookie_category )
109
+ {
110
+ return 'type="text/javascript"';
111
+ }
112
+
113
+ protected function get_script_cookie_category( $cookie_category )
114
+ {
115
+ return 'data-wpm-cookie-category="' . $cookie_category . '"';
116
+ }
117
+
118
+ protected function get_list_name_suffix()
119
+ {
120
+ $list_suffix = '';
121
+
122
+ if ( is_product_category() ) {
123
+ $category = get_queried_object();
124
+ $list_suffix = ' | ' . $category->name;
125
+ $list_suffix = $this->add_parent_category_name( $category, $list_suffix );
126
+ } else {
127
+
128
+ if ( is_product_tag() ) {
129
+ $tag = get_queried_object();
130
+ $list_suffix = ' | ' . $tag->name;
131
+ }
132
+
133
+ }
134
+
135
+ return $list_suffix;
136
+ }
137
+
138
+ protected function add_parent_category_name( $category, $list_suffix )
139
+ {
140
+
141
+ if ( $category->parent > 0 ) {
142
+ $parent_category = get_term_by( 'id', $category->parent, 'product_cat' );
143
+ $list_suffix = ' | ' . $parent_category->name . $list_suffix;
144
+ $list_suffix = $this->add_parent_category_name( $parent_category, $list_suffix );
145
+ }
146
+
147
+ return $list_suffix;
148
+ }
149
+
150
+ protected function get_list_id_suffix()
151
+ {
152
+ $list_suffix = '';
153
+
154
+ if ( is_product_category() ) {
155
+ $category = get_queried_object();
156
+ $list_suffix = '.' . $category->slug;
157
+ $list_suffix = $this->add_parent_category_id( $category, $list_suffix );
158
+ } else {
159
+
160
+ if ( is_product_tag() ) {
161
+ $tag = get_queried_object();
162
+ $list_suffix = '.' . $tag->slug;
163
+ }
164
+
165
+ }
166
+
167
+ return $list_suffix;
168
+ }
169
+
170
+ protected function add_parent_category_id( $category, $list_suffix )
171
+ {
172
+
173
+ if ( $category->parent > 0 ) {
174
+ $parent_category = get_term_by( 'id', $category->parent, 'product_cat' );
175
+ $list_suffix = '.' . $parent_category->slug . $list_suffix;
176
+ $list_suffix = $this->add_parent_category_id( $parent_category, $list_suffix );
177
+ }
178
+
179
+ return $list_suffix;
180
+ }
181
+
182
+ // https://stackoverflow.com/a/49616130/4688612
183
+ protected function get_order_from_order_received_page()
184
+ {
185
+
186
+ if ( $this->get_order_from_query_vars() ) {
187
+ return $this->get_order_from_query_vars();
188
+ } else {
189
+
190
+ if ( $this->get_order_with_url_order_key() ) {
191
+ return $this->get_order_with_url_order_key();
192
+ } else {
193
+ return false;
194
+ }
195
+
196
+ }
197
+
198
+ }
199
+
200
+ protected function wpm_get_order_total( $order )
201
+ {
202
+ $order_total = ( 0 == $this->options_obj->shop->order_total_logic ? $order->get_subtotal() - $order->get_total_discount() : $order->get_total() );
203
+ // filter to adjust the order value
204
+ $order_total = apply_filters_deprecated(
205
+ 'wgact_conversion_value_filter',
206
+ [ $order_total, $order ],
207
+ '1.10.2',
208
+ 'wooptpm_conversion_value_filter'
209
+ );
210
+ $order_total = apply_filters_deprecated(
211
+ 'wooptpm_conversion_value_filter',
212
+ [ $order_total, $order ],
213
+ '1.13.0',
214
+ 'wpm_conversion_value_filter'
215
+ );
216
+ $order_total = apply_filters( 'wpm_conversion_value_filter', $order_total, $order );
217
+ return number_format(
218
+ (double) $order_total,
219
+ 2,
220
+ '.',
221
+ ''
222
+ );
223
+ }
224
+
225
+ protected function get_order_from_query_vars()
226
+ {
227
+ global $wp ;
228
+ $order_id = absint( $wp->query_vars['order-received'] );
229
+
230
+ if ( $order_id && 0 != $order_id && wc_get_order( $order_id ) ) {
231
+ return wc_get_order( $order_id );
232
+ } else {
233
+ wc_get_logger()->debug( 'WooCommerce couldn\'t retrieve the order ID from $wp->query_vars[\'order-received\']', [
234
+ 'source' => 'wpm',
235
+ ] );
236
+ wc_get_logger()->debug( print_r( $wp->query_vars, true ), [
237
+ 'source' => 'wpm',
238
+ ] );
239
+ return false;
240
+ }
241
+
242
+ }
243
+
244
+ protected function get_order_with_url_order_key()
245
+ {
246
+ $_get = filter_input_array( INPUT_GET, FILTER_SANITIZE_STRING );
247
+
248
+ if ( isset( $_get['key'] ) ) {
249
+ $order_key = $_get['key'];
250
+ return wc_get_order( wc_get_order_id_by_order_key( $order_key ) );
251
+ } else {
252
+ wc_get_logger()->debug( 'WooCommerce couldn\'t retrieve the order ID from order key in the URL', [
253
+ 'source' => 'wpm',
254
+ ] );
255
+ $order_key = ( $_get['key'] ? $_get['key'] : '' );
256
+ wc_get_logger()->debug( 'URL order key: ' . $order_key, [
257
+ 'source' => 'wpm',
258
+ ] );
259
+ return false;
260
+ }
261
+
262
+ }
263
+
264
+ protected function get_order_currency( $order )
265
+ {
266
+ // use the right function to get the currency depending on the WooCommerce version
267
+ return ( $this->woocommerce_3_and_above() ? $order->get_currency() : $order->get_order_currency() );
268
+ }
269
+
270
+ protected function woocommerce_3_and_above()
271
+ {
272
+ global $woocommerce ;
273
+
274
+ if ( version_compare( $woocommerce->version, 3.0, '>=' ) ) {
275
+ return true;
276
+ } else {
277
+ return false;
278
+ }
279
+
280
+ }
281
+
282
+ // https://stackoverflow.com/a/46216073/4688612
283
+ // https://github.com/woocommerce/woocommerce/wiki/wc_get_orders-and-WC_Order_Query#description
284
+ protected function is_existing_customer( $order, $value = 0 )
285
+ {
286
+
287
+ if ( is_numeric( $value ) ) {
288
+ // Based on user ID (registered users)
289
+ $meta_key = '_customer_user';
290
+ $meta_value = ( 0 == $value ? get_current_user_id() : (int) $value );
291
+ } else {
292
+ // Based on billing email (Guest users)
293
+ $meta_key = '_billing_email';
294
+ $meta_value = sanitize_email( $value );
295
+ }
296
+
297
+ $orders = wc_get_orders( [
298
+ 'return' => 'ids',
299
+ 'meta_key' => $meta_key,
300
+ 'meta_value' => $meta_value,
301
+ 'post_status' => wc_get_is_paid_statuses(),
302
+ 'limit' => 1,
303
+ ] );
304
+ // Return a boolean value based on orders count
305
+ return count( $orders ) > 0;
306
+ }
307
+
308
+ // https://stackoverflow.com/a/46216073/4688612
309
+ // protected function is_existing_customer( $order, $value = 0 ) {
310
+ // global $wpdb;
311
+ //
312
+ // // Based on user ID (registered users)
313
+ // if (is_numeric($value)) {
314
+ // $meta_key = '_customer_user';
315
+ // $meta_value = 0 == $value ? get_current_user_id() : (int) $value;
316
+ // } else { // Based on billing email (Guest users)
317
+ // $meta_key = '_billing_email';
318
+ // $meta_value = sanitize_email($value);
319
+ // }
320
+ //
321
+ // $paid_order_statuses = array_map('esc_sql', wc_get_is_paid_statuses());
322
+ //
323
+ // $count = $wpdb->get_var($wpdb->prepare("
324
+ // SELECT COUNT(p.ID) FROM {$wpdb->prefix}posts AS p
325
+ // INNER JOIN {$wpdb->prefix}postmeta AS pm ON p.ID = pm.post_id
326
+ // WHERE p.post_status IN ( 'wc-" . implode("','wc-", $paid_order_statuses) . "' )
327
+ // AND p.post_type LIKE 'shop_order'
328
+ // AND p.ID <> {$order->get_id()}
329
+ // AND pm.meta_key = '%s'
330
+ // AND pm.meta_value = %s
331
+ // LIMIT 1
332
+ // ", $meta_key, $meta_value)
333
+ // );
334
+ //
335
+ // // Return a boolean value based on orders count
336
+ // return $count > 0;
337
+ // }
338
+ protected function get_visitor_country()
339
+ {
340
+
341
+ if ( $this->is_localhost() ) {
342
+ $this->ip = WC_Geolocation::get_external_ip_address();
343
+ } else {
344
+ $this->ip = WC_Geolocation::get_ip_address();
345
+ }
346
+
347
+ $location = WC_Geolocation::geolocate_ip( $this->ip );
348
+ return $location['country'];
349
+ }
350
+
351
+ protected function is_localhost()
352
+ {
353
+ $_server = filter_input_array( INPUT_SERVER, FILTER_SANITIZE_STRING );
354
+ return in_array( $_server['REMOTE_ADDR'], [ '127.0.0.1', '::1' ], true );
355
+ }
356
+
357
+ protected function get_user_email( $algo = '' )
358
+ {
359
+
360
+ if ( is_user_logged_in() ) {
361
+ $current_user = wp_get_current_user();
362
+ $email = $current_user->user_email;
363
+ } elseif ( is_order_received_page() ) {
364
+ $order = $this->get_order_from_order_received_page();
365
+
366
+ if ( $order ) {
367
+ $email = $order->get_billing_email();
368
+ } else {
369
+ $email = '';
370
+ }
371
+
372
+ } else {
373
+ $email = '';
374
+ }
375
+
376
+ // encrypt email
377
+ if ( $email && in_array( $algo, hash_algos(), true ) ) {
378
+ $email = hash( $algo, $email );
379
+ }
380
+ return $email;
381
+ }
382
+
383
+ }
css/admin.css CHANGED
@@ -47,7 +47,7 @@
47
  .developer-banner {
48
  background: #f3f5f6;
49
  color: #0071a1;
50
- padding: 0 10px;
51
  margin-bottom: 20px;
52
  border-radius: 3px;
53
  border-style: solid;
@@ -174,4 +174,4 @@ input:checked + .slider:before {
174
  text-decoration: none;
175
  margin-left: 5px;
176
  margin-right: 5px;
177
- }
47
  .developer-banner {
48
  background: #f3f5f6;
49
  color: #0071a1;
50
+ padding: 0px 10px;
51
  margin-bottom: 20px;
52
  border-radius: 3px;
53
  border-style: solid;
174
  text-decoration: none;
175
  margin-left: 5px;
176
  margin-right: 5px;
177
+ }
js/admin/wpm-admin-freemius.p1.min.js CHANGED
@@ -1,2 +1,2 @@
1
- (()=>{var e={92:()=>{!function(){try{new MutationObserver((function(e){e.forEach((function(e){"class"===e.attributeName&&jQuery(e.target).prop(e.attributeName).includes("disabled")&&jQuery(".fs-modal").find(".button-deactivate").removeClass("disabled")}))})).observe(jQuery(".fs-modal").find(".button-deactivate")[0],{attributes:!0})}catch(e){console.error(e)}}()}},t={};function r(o){var a=t[o];if(void 0!==a)return a.exports;var n=t[o]={exports:{}};return e[o](n,n.exports,r),n.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";r(92)})()})();
2
  //# sourceMappingURL=wpm-admin-freemius.p1.min.js.map
1
+ (()=>{var e={309:()=>{!function(){try{new MutationObserver((function(e){e.forEach((function(e){"class"===e.attributeName&&jQuery(e.target).prop(e.attributeName).includes("disabled")&&jQuery(".fs-modal").find(".button-deactivate").removeClass("disabled")}))})).observe(jQuery(".fs-modal").find(".button-deactivate")[0],{attributes:!0})}catch(e){console.error(e)}}()}},t={};function r(o){var a=t[o];if(void 0!==a)return a.exports;var n=t[o]={exports:{}};return e[o](n,n.exports,r),n.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";r(309)})()})();
2
  //# sourceMappingURL=wpm-admin-freemius.p1.min.js.map
js/admin/wpm-admin-freemius.p1.min.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"wpm-admin-freemius.p1.min.js","mappings":"sBAAA,WACC,IAEgB,IAAIA,kBAAiB,SAAUC,GAC7CA,EAAUC,SAAQ,SAAUC,GACI,UAA3BA,EAASC,eACSC,OAAOF,EAASG,QAAQC,KAAKJ,EAASC,eACxCI,SAAS,aAC3BH,OAAO,aAAaI,KAAK,sBAAsBC,YAAY,kBAMtDC,QAAQN,OAAO,aAAaI,KAAK,sBAAsB,GAAI,CACnEG,YAAY,IAGZ,MAAOC,GACRC,QAAQD,MAAMA,IAnBhB,KCCIE,EAA2B,GAG/B,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBE,IAAjBD,EACH,OAAOA,EAAaE,QAGrB,IAAIC,EAASN,EAAyBE,GAAY,CAGjDG,QAAS,IAOV,OAHAE,EAAoBL,GAAUI,EAAQA,EAAOD,QAASJ,GAG/CK,EAAOD,QCpBfJ,EAAoBO,EAAKF,IACxB,IAAIG,EAASH,GAAUA,EAAOI,WAC7B,IAAOJ,EAAiB,QACxB,IAAM,EAEP,OADAL,EAAoBU,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,GCLRR,EAAoBU,EAAI,CAACN,EAASQ,KACjC,IAAI,IAAIC,KAAOD,EACXZ,EAAoBc,EAAEF,EAAYC,KAASb,EAAoBc,EAAEV,EAASS,IAC5EE,OAAOC,eAAeZ,EAASS,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,MCJ3Eb,EAAoBc,EAAI,CAACK,EAAK5B,IAAUwB,OAAOK,UAAUC,eAAeC,KAAKH,EAAK5B,G","sources":["webpack://WooCommerce-Pixel-Manager/./src/js/admin/freemius-keep-deactivate-button-enabled.js","webpack://WooCommerce-Pixel-Manager/webpack/bootstrap","webpack://WooCommerce-Pixel-Manager/webpack/runtime/compat get default export","webpack://WooCommerce-Pixel-Manager/webpack/runtime/define property getters","webpack://WooCommerce-Pixel-Manager/webpack/runtime/hasOwnProperty shorthand"],"sourcesContent":["(function () {\n\ttry {\n\n\t\tlet observer = new MutationObserver(function (mutations) {\n\t\t\tmutations.forEach(function (mutation) {\n\t\t\t\tif (mutation.attributeName === \"class\") {\n\t\t\t\t\tlet attributeValue = jQuery(mutation.target).prop(mutation.attributeName);\n\t\t\t\t\tif (attributeValue.includes('disabled')) {\n\t\t\t\t\t\tjQuery('.fs-modal').find('.button-deactivate').removeClass('disabled');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tobserver.observe(jQuery('.fs-modal').find('.button-deactivate')[0], {\n\t\t\tattributes: true\n\t\t});\n\n\t} catch (error) {\n\t\tconsole.error(error);\n\t}\n})();\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))"],"names":["MutationObserver","mutations","forEach","mutation","attributeName","jQuery","target","prop","includes","find","removeClass","observe","attributes","error","console","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prototype","hasOwnProperty","call"],"sourceRoot":""}
1
+ {"version":3,"file":"wpm-admin-freemius.p1.min.js","mappings":"uBAAA,WACC,IAEgB,IAAIA,kBAAiB,SAAUC,GAC7CA,EAAUC,SAAQ,SAAUC,GACI,UAA3BA,EAASC,eACSC,OAAOF,EAASG,QAAQC,KAAKJ,EAASC,eACxCI,SAAS,aAC3BH,OAAO,aAAaI,KAAK,sBAAsBC,YAAY,kBAMtDC,QAAQN,OAAO,aAAaI,KAAK,sBAAsB,GAAI,CACnEG,YAAY,IAGZ,MAAOC,GACRC,QAAQD,MAAMA,IAnBhB,KCCIE,EAA2B,GAG/B,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBE,IAAjBD,EACH,OAAOA,EAAaE,QAGrB,IAAIC,EAASN,EAAyBE,GAAY,CAGjDG,QAAS,IAOV,OAHAE,EAAoBL,GAAUI,EAAQA,EAAOD,QAASJ,GAG/CK,EAAOD,QCpBfJ,EAAoBO,EAAKF,IACxB,IAAIG,EAASH,GAAUA,EAAOI,WAC7B,IAAOJ,EAAiB,QACxB,IAAM,EAEP,OADAL,EAAoBU,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,GCLRR,EAAoBU,EAAI,CAACN,EAASQ,KACjC,IAAI,IAAIC,KAAOD,EACXZ,EAAoBc,EAAEF,EAAYC,KAASb,EAAoBc,EAAEV,EAASS,IAC5EE,OAAOC,eAAeZ,EAASS,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,MCJ3Eb,EAAoBc,EAAI,CAACK,EAAK5B,IAAUwB,OAAOK,UAAUC,eAAeC,KAAKH,EAAK5B,G","sources":["webpack://WooCommerce-Pixel-Manager/./src/js/admin/freemius-keep-deactivate-button-enabled.js","webpack://WooCommerce-Pixel-Manager/webpack/bootstrap","webpack://WooCommerce-Pixel-Manager/webpack/runtime/compat get default export","webpack://WooCommerce-Pixel-Manager/webpack/runtime/define property getters","webpack://WooCommerce-Pixel-Manager/webpack/runtime/hasOwnProperty shorthand"],"sourcesContent":["(function () {\n\ttry {\n\n\t\tlet observer = new MutationObserver(function (mutations) {\n\t\t\tmutations.forEach(function (mutation) {\n\t\t\t\tif (mutation.attributeName === \"class\") {\n\t\t\t\t\tlet attributeValue = jQuery(mutation.target).prop(mutation.attributeName);\n\t\t\t\t\tif (attributeValue.includes('disabled')) {\n\t\t\t\t\t\tjQuery('.fs-modal').find('.button-deactivate').removeClass('disabled');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tobserver.observe(jQuery('.fs-modal').find('.button-deactivate')[0], {\n\t\t\tattributes: true\n\t\t});\n\n\t} catch (error) {\n\t\tconsole.error(error);\n\t}\n})();\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))"],"names":["MutationObserver","mutations","forEach","mutation","attributeName","jQuery","target","prop","includes","find","removeClass","observe","attributes","error","console","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prototype","hasOwnProperty","call"],"sourceRoot":""}
js/admin/wpm-admin.p1.min.js CHANGED
@@ -1,2 +1,2 @@
1
- (()=>{var e={684:()=>{jQuery((function(){function e(e,t){e.preventDefault();let n={action:"wpm_dismissed_notice_handler",set:t};jQuery.post(ajaxurl,n,(function(e){})),jQuery(".wpm-rating-success-notice").remove()}jQuery(".wpm-rating-success-notice").show(),jQuery(document).on("click","#wpm-rate-it",(function(t){e(t,"rating_done"),window.open("https://wordpress.org/support/view/plugin-reviews/woocommerce-google-adwords-conversion-tracking-tag?rate=5#postform","_blank").focus()})),jQuery(document).on("click","#wpm-already-did",(function(t){e(t,"rating_done")})),jQuery(document).on("click","#wpm-maybe-later",(function(t){e(t,"later")}))}))},940:()=>{function e(e){jQuery.post(ajaxurl,e,(function(e){location.reload()}))}jQuery((function(){jQuery(document).on("click",".incompatible-plugin-error-dismissal-button",(function(t){t.preventDefault(),e({action:"environment_check_handler",disable_warning:jQuery(this).data("plugin-slug")})})),jQuery(document).on("click","#wpm-wp-rocket-js-concatenation-disable",(function(t){t.preventDefault(),e({action:"environment_check_handler",set:"disable_wp_rocket_javascript_concatenation"})})),jQuery(document).on("click","#wpm-dismiss-wp-rocket-js-concatenation-error",(function(t){t.preventDefault(),e({action:"environment_check_handler",set:"dismiss_wp_rocket_javascript_concatenation_error"})})),jQuery(document).on("click","#wpm-litespeed-inline-js-dom-ready-disable",(function(t){t.preventDefault(),e({action:"environment_check_handler",set:"disable_litespeed_inline_js_dom_ready"})})),jQuery(document).on("click","#wpm-dismiss-litespeed-inline-js-dom-ready-error",(function(t){t.preventDefault(),e({action:"environment_check_handler",set:"dismiss_litespeed_inline_js_dom_ready"})})),jQuery(document).on("click","#wpm-paypal-standard-error-dismissal-button",(function(t){t.preventDefault(),e({action:"environment_check_handler",set:"dismiss_paypal_standard_warning"})}))}))},663:()=>{jQuery((function(){jQuery("#debug-info-button").click((function(){jQuery("#debug-info-textarea").select(),document.execCommand("copy")})),jQuery("#wpm_pro_version_demo").on("click",(function(){jQuery("#submit").click()}))}))},958:()=>{function e(){jQuery("#script-blocker-notice").hide()}e(),jQuery((function(){e()}))},966:()=>{function e(){const e=window.location.search,t=new URLSearchParams(e);return!!t.get("section")&&{section:t.get("section"),subsection:t.get("subsection")}}function t(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const i=window.location.search,s=new URLSearchParams(i);s.delete("section"),s.delete("subsection");let a="section="+e;a+=t?"&subsection="+t:"",history.pushState("","wpm"+e,document.location.pathname+"?page=wpm&"+a),jQuery('input[name ="_wp_http_referer"]').val(n()+"?page=wpm&"+a+"&settings-updated=true")}function n(){return new URL(jQuery("#wp-admin-canonical").attr("href")).pathname}jQuery((function(){let n=[],i={};if(jQuery(".section").closest("tr").hide(),jQuery(".section").each((function(){n.push({slug:jQuery(this).data("sectionSlug"),title:jQuery(this).data("sectionTitle")})})),jQuery(".subsection").each((function(){i[jQuery(this).data("sectionSlug")]=i[jQuery(this).data("sectionSlug")]||[],i[jQuery(this).data("sectionSlug")].push({title:jQuery(this).data("subsectionTitle"),slug:jQuery(this).data("subsectionSlug")})})),n.forEach((function(e){jQuery(".nav-tab-wrapper").append('<a href="#" class="nav-tab" data-section-slug="'+e.slug+'">'+e.title+"</a>")})),jQuery(".nav-tab-wrapper").after(function(e){let t=Object.keys(e),n="";return t.forEach((function(t){n+='<ul class="subnav-tabs" data-section-slug="'+t+'">',e[t].forEach((function(e){n+='<li class="subnav-li subnav-li-inactive" data-subsection-slug="'+e.slug+'">'+e.title+"</li>"})),n+="</ul>"})),n}(i)),jQuery(".nav-tab-wrapper a").on("click",(function(e){e.preventDefault(),jQuery(this).addClass("nav-tab-active").siblings().removeClass("nav-tab-active");let s=jQuery(this).data("section-slug");!function(e,n){jQuery("#wpm_settings_form > h2").nextUntil(".submit").andSelf().hide(),jQuery(".subnav-tabs").hide(),jQuery(".subnav-tabs[data-section-slug="+e+"]").show();let i=n.findIndex((t=>t.slug===e));jQuery("div[data-section-slug="+e+"]").closest("table").prevAll("h2:first").next().nextUntil("h2, .submit").andSelf().show(),t(n[i].slug)}(s,n),s in i&&jQuery("ul[data-section-slug="+s+"]").children(":first").trigger("click")})),jQuery(".subnav-li").on("click",(function(e){var n,i;e.preventDefault(),jQuery(this).addClass("subnav-li-active").removeClass("subnav-li-inactive").siblings().addClass("subnav-li-inactive").removeClass("subnav-li-active"),n=jQuery(this).parent().data("section-slug"),i=jQuery(this).data("subsection-slug"),jQuery("#wpm_settings_form > h2").nextUntil(".submit").andSelf().hide(),jQuery("[data-section-slug="+n+"][data-subsection-slug="+i+"]").closest("tr").siblings().andSelf().hide(),jQuery("[data-section-slug="+n+"][data-subsection-slug="+i+"]").closest("table").show(),jQuery("[data-section-slug="+n+"][data-subsection-slug="+i+"]").closest("tr").nextUntil(jQuery("[data-section-slug="+n+"][data-subsection-slug]").closest("tr")).show(),t(n,i)})),e()){let t=e();jQuery("a[data-section-slug="+t.section+"]").trigger("click"),!1!==t.subsection&&jQuery("ul[data-section-slug="+t.section+"]").children("[data-subsection-slug="+t.subsection+"]").trigger("click")}else jQuery("a[data-section-slug="+n[0].slug+"]").trigger("click")}))}},t={};function n(i){var s=t[i];if(void 0!==s)return s.exports;var a=t[i]={exports:{}};return e[i](a,a.exports,n),a.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var i in t)n.o(t,i)&&!n.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";n(684),n(940),n(663),n(958),n(966)})()})();
2
  //# sourceMappingURL=wpm-admin.p1.min.js.map
1
+ (()=>{var e={331:()=>{jQuery((function(){function e(e,t){e.preventDefault();let n={action:"wpm_dismissed_notice_handler",set:t};jQuery.post(ajaxurl,n,(function(e){})),jQuery(".wpm-rating-success-notice").remove()}jQuery(".wpm-rating-success-notice").show(),jQuery(document).on("click","#wpm-rate-it",(function(t){e(t,"rating_done"),window.open("https://wordpress.org/support/view/plugin-reviews/woocommerce-google-adwords-conversion-tracking-tag?rate=5#postform","_blank").focus()})),jQuery(document).on("click","#wpm-already-did",(function(t){e(t,"rating_done")})),jQuery(document).on("click","#wpm-maybe-later",(function(t){e(t,"later")}))}))},178:()=>{function e(e){jQuery.post(ajaxurl,e,(function(e){location.reload()}))}jQuery((function(){jQuery(document).on("click",".incompatible-plugin-error-dismissal-button",(function(t){t.preventDefault(),e({action:"environment_check_handler",disable_warning:jQuery(this).data("plugin-slug")})})),jQuery(document).on("click","#wpm-wp-rocket-js-concatenation-disable",(function(t){t.preventDefault(),e({action:"environment_check_handler",set:"disable_wp_rocket_javascript_concatenation"})})),jQuery(document).on("click","#wpm-dismiss-wp-rocket-js-concatenation-error",(function(t){t.preventDefault(),e({action:"environment_check_handler",set:"dismiss_wp_rocket_javascript_concatenation_error"})})),jQuery(document).on("click","#wpm-litespeed-inline-js-dom-ready-disable",(function(t){t.preventDefault(),e({action:"environment_check_handler",set:"disable_litespeed_inline_js_dom_ready"})})),jQuery(document).on("click","#wpm-dismiss-litespeed-inline-js-dom-ready-error",(function(t){t.preventDefault(),e({action:"environment_check_handler",set:"dismiss_litespeed_inline_js_dom_ready"})})),jQuery(document).on("click","#wpm-paypal-standard-error-dismissal-button",(function(t){t.preventDefault(),e({action:"environment_check_handler",set:"dismiss_paypal_standard_warning"})}))}))},649:()=>{jQuery((function(){jQuery("#debug-info-button").click((function(){jQuery("#debug-info-textarea").select(),document.execCommand("copy")})),jQuery("#wpm_pro_version_demo").on("click",(function(){jQuery("#submit").click()}))}))},740:()=>{function e(){jQuery("#script-blocker-notice").hide()}e(),jQuery((function(){e()}))},110:()=>{function e(){const e=window.location.search,t=new URLSearchParams(e);return!!t.get("section")&&{section:t.get("section"),subsection:t.get("subsection")}}function t(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const i=window.location.search,s=new URLSearchParams(i);s.delete("section"),s.delete("subsection");let a="section="+e;a+=t?"&subsection="+t:"",history.pushState("","wpm"+e,document.location.pathname+"?page=wpm&"+a),jQuery('input[name ="_wp_http_referer"]').val(n()+"?page=wpm&"+a+"&settings-updated=true")}function n(){return new URL(jQuery("#wp-admin-canonical").attr("href")).pathname}jQuery((function(){let n=[],i={};if(jQuery(".section").closest("tr").hide(),jQuery(".section").each((function(){n.push({slug:jQuery(this).data("sectionSlug"),title:jQuery(this).data("sectionTitle")})})),jQuery(".subsection").each((function(){i[jQuery(this).data("sectionSlug")]=i[jQuery(this).data("sectionSlug")]||[],i[jQuery(this).data("sectionSlug")].push({title:jQuery(this).data("subsectionTitle"),slug:jQuery(this).data("subsectionSlug")})})),n.forEach((function(e){jQuery(".nav-tab-wrapper").append('<a href="#" class="nav-tab" data-section-slug="'+e.slug+'">'+e.title+"</a>")})),jQuery(".nav-tab-wrapper").after(function(e){let t=Object.keys(e),n="";return t.forEach((function(t){n+='<ul class="subnav-tabs" data-section-slug="'+t+'">',e[t].forEach((function(e){n+='<li class="subnav-li subnav-li-inactive" data-subsection-slug="'+e.slug+'">'+e.title+"</li>"})),n+="</ul>"})),n}(i)),jQuery(".nav-tab-wrapper a").on("click",(function(e){e.preventDefault(),jQuery(this).addClass("nav-tab-active").siblings().removeClass("nav-tab-active");let s=jQuery(this).data("section-slug");!function(e,n){jQuery("#wpm_settings_form > h2").nextUntil(".submit").andSelf().hide(),jQuery(".subnav-tabs").hide(),jQuery(".subnav-tabs[data-section-slug="+e+"]").show();let i=n.findIndex((t=>t.slug===e));jQuery("div[data-section-slug="+e+"]").closest("table").prevAll("h2:first").next().nextUntil("h2, .submit").andSelf().show(),t(n[i].slug)}(s,n),s in i&&jQuery("ul[data-section-slug="+s+"]").children(":first").trigger("click")})),jQuery(".subnav-li").on("click",(function(e){var n,i;e.preventDefault(),jQuery(this).addClass("subnav-li-active").removeClass("subnav-li-inactive").siblings().addClass("subnav-li-inactive").removeClass("subnav-li-active"),n=jQuery(this).parent().data("section-slug"),i=jQuery(this).data("subsection-slug"),jQuery("#wpm_settings_form > h2").nextUntil(".submit").andSelf().hide(),jQuery("[data-section-slug="+n+"][data-subsection-slug="+i+"]").closest("tr").siblings().andSelf().hide(),jQuery("[data-section-slug="+n+"][data-subsection-slug="+i+"]").closest("table").show(),jQuery("[data-section-slug="+n+"][data-subsection-slug="+i+"]").closest("tr").nextUntil(jQuery("[data-section-slug="+n+"][data-subsection-slug]").closest("tr")).show(),t(n,i)})),e()){let t=e();jQuery("a[data-section-slug="+t.section+"]").trigger("click"),!1!==t.subsection&&jQuery("ul[data-section-slug="+t.section+"]").children("[data-subsection-slug="+t.subsection+"]").trigger("click")}else jQuery("a[data-section-slug="+n[0].slug+"]").trigger("click")}))}},t={};function n(i){var s=t[i];if(void 0!==s)return s.exports;var a=t[i]={exports:{}};return e[i](a,a.exports,n),a.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var i in t)n.o(t,i)&&!n.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";n(331),n(178),n(649),n(740),n(110)})()})();
2
  //# sourceMappingURL=wpm-admin.p1.min.js.map
js/public/facebook.js ADDED
@@ -0,0 +1,307 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Add functions for Facebook
3
+ * */
4
+
5
+ (function (wpm, $, undefined) {
6
+
7
+ let fBUserData
8
+
9
+ wpm.loadFacebookPixel = function () {
10
+
11
+ try {
12
+ if (wpmDataLayer?.pixels?.facebook?.pixel_id) {
13
+
14
+ wpmDataLayer.pixels.facebook.loaded = true
15
+
16
+ // @formatter:off
17
+ !function(f,b,e,v,n,t,s)
18
+ {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
19
+ n.callMethod.apply(n,arguments):n.queue.push(arguments)};
20
+ if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
21
+ n.queue=[];t=b.createElement(e);t.async=!0;
22
+ t.src=v;s=b.getElementsByTagName(e)[0];
23
+ s.parentNode.insertBefore(t,s)}(window, document,'script',
24
+ 'https://connect.facebook.net/en_US/fbevents.js');
25
+ // @formatter:on
26
+
27
+ fbq("init", wpmDataLayer.pixels.facebook.pixel_id)
28
+ fbq("track", "PageView")
29
+ }
30
+ } catch (e) {
31
+ console.error(e)
32
+ }
33
+ }
34
+
35
+ wpm.getRandomEventId = function () {
36
+ return (Math.random() + 1).toString(36).substring(2)
37
+ }
38
+
39
+ wpm.getFbUserData = function () {
40
+ // We need the first one for InitiateCheckout
41
+ // where getting the user_data from the browser is too slow
42
+ // using wpm.getCookie(), so we cache the user_data earlier.
43
+ // And we need the second one because the ViewContent hit happens too fast
44
+ // after adding a variation to the cart because the function to cache
45
+ // the user_data is too slow. But we can get the user_data using wpm.getCookie()
46
+ // because we don't move away from the page and can wait for the browser
47
+ // to get it.
48
+ if (fBUserData) {
49
+ return fBUserData
50
+ } else {
51
+ return wpm.getFbUserDataFromBrowser()
52
+ }
53
+ }
54
+
55
+ wpm.setFbUserData = function () {
56
+ fBUserData = wpm.getFbUserDataFromBrowser()
57
+ }
58
+
59
+ wpm.getFbUserDataFromBrowser = function () {
60
+ return {
61
+ fbp : wpm.getCookie("_fbp"),
62
+ fbc : wpm.getCookie("_fbc"),
63
+ client_user_agent: navigator.userAgent,
64
+ }
65
+ }
66
+
67
+ wpm.fbViewContent = function (product) {
68
+
69
+ try {
70
+ if (!wpmDataLayer?.pixels?.facebook?.loaded) return
71
+
72
+ let eventId = wpm.getRandomEventId()
73
+
74
+ fbq("track", "ViewContent", {
75
+ content_type: "product",
76
+ content_name: product.name,
77
+ // content_category: product.category,
78
+ content_ids: product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],
79
+ currency : wpmDataLayer.shop.currency,
80
+ value : product.price,
81
+ }, {
82
+ eventID: eventId,
83
+ })
84
+
85
+ product["currency"] = wpmDataLayer.shop.currency
86
+
87
+ jQuery(document).trigger("wpmFbCapiEvent", {
88
+ event_name : "ViewContent",
89
+ event_id : eventId,
90
+ user_data : wpm.getFbUserData(),
91
+ product_data : product,
92
+ product_id : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],
93
+ event_source_url: window.location.href,
94
+ })
95
+ } catch (e) {
96
+ console.error(e)
97
+ }
98
+ }
99
+
100
+ wpm.facebookContentIds = function () {
101
+ let prodIds = []
102
+
103
+ for (const [key, item] of Object.entries(wpmDataLayer.order.items)) {
104
+
105
+ if (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {
106
+ prodIds.push(String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type]))
107
+ } else {
108
+ prodIds.push(String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type]))
109
+ }
110
+ }
111
+
112
+ return prodIds
113
+ }
114
+
115
+ }(window.wpm = window.wpm || {}, jQuery));
116
+
117
+
118
+ /**
119
+ * Execute as soon as possible
120
+ * */
121
+
122
+ (function () {
123
+
124
+ jQuery(document).on("wpmLoadPixels", function () {
125
+
126
+ if (wpm.canIFire("ads", "facebook-ads") && !wpmDataLayer?.pixels?.facebook?.loaded) wpm.loadFacebookPixel()
127
+
128
+ })
129
+
130
+ })()
131
+
132
+
133
+ /**
134
+ * All event listeners
135
+ * */
136
+
137
+ // AddToCart event
138
+ jQuery(document).on("wpmAddToCart", function (event, product) {
139
+
140
+ try {
141
+ if (!wpmDataLayer?.pixels?.facebook?.loaded) return
142
+
143
+ let eventId = wpm.getRandomEventId()
144
+
145
+ // console.log('eventId: ' + eventId);
146
+
147
+ fbq("track", "AddToCart", {
148
+ content_type: "product",
149
+ content_name: product.name,
150
+ content_ids : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],
151
+ value : parseFloat(product.quantity * product.price),
152
+ currency : product.currency,
153
+ }, {
154
+ eventID: eventId,
155
+ })
156
+
157
+
158
+ product["currency"] = wpmDataLayer.shop.currency
159
+
160
+ jQuery(document).trigger("wpmFbCapiEvent", {
161
+ event_name : "AddToCart",
162
+ event_id : eventId,
163
+ user_data : wpm.getFbUserData(),
164
+ product_data : product,
165
+ product_id : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],
166
+ event_source_url: window.location.href,
167
+ })
168
+ } catch (e) {
169
+ console.error(e)
170
+ }
171
+ })
172
+
173
+ // InitiateCheckout event
174
+ jQuery(document).on("wpmBeginCheckout", function (event) {
175
+
176
+ try {
177
+ // console.log('firing facebook ads InitiateCheckout event');
178
+
179
+ if (!wpmDataLayer?.pixels?.facebook?.loaded) return
180
+
181
+ let eventId = wpm.getRandomEventId()
182
+
183
+ fbq("track", "InitiateCheckout", {}, {
184
+ eventID: eventId,
185
+ })
186
+
187
+ jQuery(document).trigger("wpmFbCapiEvent", {
188
+ event_name : "InitiateCheckout",
189
+ event_id : eventId,
190
+ user_data : wpm.getFbUserData(),
191
+ event_source_url: window.location.href,
192
+ })
193
+ } catch (e) {
194
+ console.error(e)
195
+ }
196
+ })
197
+
198
+ // AddToWishlist event
199
+ jQuery(document).on("wpmAddToWishlist", function (event, product) {
200
+
201
+ try {
202
+ // console.log('firing facebook ads AddToWishlist event');
203
+ // console.log(product);
204
+
205
+ if (!wpmDataLayer?.pixels?.facebook?.loaded) return
206
+
207
+ let eventId = wpm.getRandomEventId()
208
+
209
+ fbq("track", "AddToWishlist", {
210
+ content_type: "product",
211
+ content_name: product.name,
212
+ content_ids : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],
213
+ value : parseFloat(product.quantity * product.price),
214
+ currency : product.currency,
215
+ }, {
216
+ eventID: eventId,
217
+ })
218
+
219
+
220
+ product["currency"] = wpmDataLayer.shop.currency
221
+
222
+ jQuery(document).trigger("wpmFbCapiEvent", {
223
+ event_name : "AddToWishlist",
224
+ event_id : eventId,
225
+ user_data : wpm.getFbUserData(),
226
+ product_data : product,
227
+ product_id : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],
228
+ event_source_url: window.location.href,
229
+ })
230
+ } catch (e) {
231
+ console.error(e)
232
+ }
233
+ })
234
+
235
+ // ViewContent event
236
+ jQuery(document).on("wpmViewItem", function (event, product) {
237
+
238
+ try {
239
+ // console.log('firing facebook ads ViewContent event');
240
+ // console.log(product);
241
+
242
+ if (!wpmDataLayer?.pixels?.facebook?.loaded) return
243
+
244
+ wpm.fbViewContent(product)
245
+ } catch (e) {
246
+ console.error(e)
247
+ }
248
+ })
249
+
250
+ // view search event
251
+ jQuery(document).on("wpmSearch", function () {
252
+
253
+ try {
254
+ if (!wpmDataLayer?.pixels?.facebook?.loaded) return
255
+
256
+ let eventId = wpm.getRandomEventId()
257
+
258
+ fbq("track", "Search", {}, {
259
+ eventID: eventId,
260
+ })
261
+
262
+ jQuery(document).trigger("wpmFbCapiEvent", {
263
+ event_name : "Search",
264
+ event_id : eventId,
265
+ user_data : wpm.getFbUserData(),
266
+ event_source_url: window.location.href,
267
+ })
268
+ } catch (e) {
269
+ console.error(e)
270
+ }
271
+ })
272
+
273
+ // load always event
274
+ jQuery(document).on("wpmLoadAlways", function () {
275
+
276
+ try {
277
+ if (!wpmDataLayer?.pixels?.facebook?.loaded) return
278
+
279
+ wpm.setFbUserData()
280
+ } catch (e) {
281
+ console.error(e)
282
+ }
283
+ })
284
+
285
+ // view order received page event
286
+ // https://developers.pinterest.com/docs/tag/conversion/
287
+ jQuery(document).on("wpmOrderReceivedPage", function () {
288
+
289
+ try {
290
+ if (!wpmDataLayer?.pixels?.facebook?.loaded) return
291
+
292
+ fbq("track", "Purchase",
293
+ {
294
+ content_type: "product",
295
+ value : wpmDataLayer.order.value_filtered,
296
+ currency : wpmDataLayer.order.currency,
297
+ content_ids : wpm.facebookContentIds(),
298
+ },
299
+ {eventID: wpmDataLayer.order.id},
300
+ )
301
+
302
+
303
+ // console.log(wpm.facebookContentIds())
304
+ } catch (e) {
305
+ console.error(e)
306
+ }
307
+ })
js/public/google-ads.js ADDED
@@ -0,0 +1,305 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Add functions for Google Ads
3
+ * */
4
+
5
+ (function (wpm, $, undefined) {
6
+
7
+ let conversionIdentifiers = []
8
+
9
+ wpm.getGoogleAdsConversionIdentifiersWithLabel = function () {
10
+ for (const [key, item] of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds)) {
11
+ conversionIdentifiers.push(key + "/" + item)
12
+ }
13
+ return conversionIdentifiers
14
+ }
15
+
16
+ wpm.getGoogleAdsConversionIdentifiers = function () {
17
+
18
+ let conversionIdentifiers = []
19
+ for (const [key, item] of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds)) {
20
+ conversionIdentifiers.push(key)
21
+ }
22
+
23
+ return conversionIdentifiers
24
+ }
25
+
26
+ wpm.getGoogleAdsRegularOrderItems = function () {
27
+ // "id" : "gla_34",
28
+ // "quantity": 1,
29
+ // "price" : 45
30
+
31
+ let orderItems = []
32
+
33
+ for (const [key, item] of Object.entries(wpmDataLayer.order.items)) {
34
+
35
+ let orderItem
36
+
37
+ orderItem = {
38
+ quantity: item.quantity,
39
+ price : item.price,
40
+ }
41
+
42
+ if (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {
43
+
44
+ orderItem.id = String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type])
45
+ orderItems.push(orderItem)
46
+ } else {
47
+
48
+ orderItem.id = String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type])
49
+ orderItems.push(orderItem)
50
+ }
51
+ }
52
+
53
+ return orderItems
54
+ }
55
+
56
+ wpm.getGoogleAdsDynamicRemarketingOrderItems = function () {
57
+ // "id" : "gla_34",
58
+ // "quantity" : 1,
59
+ // "price" : 45,
60
+ // "google_business_vertical": "retail"
61
+
62
+ let orderItems = []
63
+
64
+ for (const [key, item] of Object.entries(wpmDataLayer.order.items)) {
65
+
66
+ let orderItem
67
+
68
+ orderItem = {
69
+ quantity : item.quantity,
70
+ price : item.price,
71
+ google_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,
72
+ }
73
+
74
+ if (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {
75
+
76
+ orderItem.id = String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type])
77
+ orderItems.push(orderItem)
78
+ } else {
79
+
80
+ orderItem.id = String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type])
81
+ orderItems.push(orderItem)
82
+ }
83
+ }
84
+
85
+ return orderItems
86
+ }
87
+
88
+ }(window.wpm = window.wpm || {}, jQuery))
89
+
90
+
91
+ /**
92
+ * All event listeners
93
+ * */
94
+
95
+ // view_item_list event
96
+ jQuery(document).on("wpmViewItemList", function (event, product) {
97
+
98
+ try {
99
+ if(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return
100
+ if (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return
101
+ if (!wpm.googleConfigConditionsMet("ads")) return
102
+
103
+
104
+ if (
105
+ wpmDataLayer?.general?.variationsOutput &&
106
+ product.isVariable &&
107
+ wpmDataLayer.pixels.google.ads.dynamic_remarketing.send_events_with_parent_ids === false
108
+ ) return
109
+
110
+ // try to prevent that WC sends cached hits to Google
111
+ if (!product) return
112
+
113
+ wpm.gtagLoaded().then(function () {
114
+ gtag("event", "view_item_list", {
115
+ send_to: wpm.getGoogleAdsConversionIdentifiers(),
116
+ items : [{
117
+ id : product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],
118
+ google_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,
119
+ }],
120
+ })
121
+ })
122
+ } catch (e) {
123
+ console.error(e)
124
+ }
125
+ })
126
+
127
+ // add_to_cart event
128
+ jQuery(document).on("wpmAddToCart", function (event, product) {
129
+
130
+ try {
131
+ if(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return
132
+ if (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return
133
+ if (!wpm.googleConfigConditionsMet("ads")) return
134
+
135
+ wpm.gtagLoaded().then(function () {
136
+ gtag("event", "add_to_cart", {
137
+ send_to: wpm.getGoogleAdsConversionIdentifiers(),
138
+ value : product.quantity * product.price,
139
+ items : [{
140
+ id : product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],
141
+ quantity : product.quantity,
142
+ price : product.price,
143
+ google_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,
144
+ }],
145
+ })
146
+ })
147
+ } catch (e) {
148
+ console.error(e)
149
+ }
150
+ })
151
+
152
+ // view_item event
153
+ jQuery(document).on("wpmViewItem", function (event, product) {
154
+
155
+ try {
156
+ if(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return
157
+ if (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return
158
+ if (!wpm.googleConfigConditionsMet("ads")) return
159
+
160
+
161
+ wpm.gtagLoaded().then(function () {
162
+ gtag("event", "view_item", {
163
+ send_to: wpm.getGoogleAdsConversionIdentifiers(),
164
+ value : (product.quantity ? product.quantity : 1) * product.price,
165
+ items : [{
166
+ id : product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],
167
+ quantity : (product.quantity ? product.quantity : 1),
168
+ price : product.price,
169
+ google_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,
170
+ }],
171
+ })
172
+ })
173
+ } catch (e) {
174
+ console.error(e)
175
+ }
176
+ })
177
+
178
+
179
+ // view search event
180
+ jQuery(document).on("wpmSearch", function () {
181
+
182
+ try {
183
+ if(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return
184
+ if (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return
185
+ if (!wpm.googleConfigConditionsMet("ads")) return
186
+
187
+
188
+ let products = []
189
+
190
+ for (const [key, product] of Object.entries(wpmDataLayer.products)) {
191
+
192
+ if (
193
+ wpmDataLayer?.general?.variationsOutput &&
194
+ product.isVariable &&
195
+ wpmDataLayer.pixels.google.ads.dynamic_remarketing.send_events_with_parent_ids === false
196
+ ) return
197
+
198
+ products.push({
199
+ id : product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],
200
+ google_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,
201
+ })
202
+ }
203
+
204
+ // console.log(products);
205
+
206
+ wpm.gtagLoaded().then(function () {
207
+ gtag("event", "view_search_results", {
208
+ send_to: wpm.getGoogleAdsConversionIdentifiers(),
209
+ // value : 1 * product.price,
210
+ items: products,
211
+ })
212
+ })
213
+ } catch (e) {
214
+ console.error(e)
215
+ }
216
+ })
217
+
218
+
219
+ // view order received page event
220
+ // TODO distinguish with or without cart data active
221
+ jQuery(document).on("wpmOrderReceivedPage", function () {
222
+
223
+ try {
224
+ if(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return
225
+ if (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return
226
+ if (!wpm.googleConfigConditionsMet("ads")) return
227
+
228
+ wpm.gtagLoaded().then(function () {
229
+ gtag("event", "purchase", {
230
+ send_to: wpm.getGoogleAdsConversionIdentifiers(),
231
+ value : wpmDataLayer.order.value_filtered,
232
+ items : wpm.getGoogleAdsDynamicRemarketingOrderItems(),
233
+ })
234
+ })
235
+
236
+ // console.log(wpm.getGoogleAdsDynamicRemarketingOrderItems())
237
+ } catch (e) {
238
+ console.error(e)
239
+ }
240
+ })
241
+
242
+ // user log in event
243
+ jQuery(document).on("wpmLogin", function () {
244
+
245
+ try {
246
+ if(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return
247
+ if (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return
248
+ if (!wpm.googleConfigConditionsMet("ads")) return
249
+
250
+
251
+ wpm.gtagLoaded().then(function () {
252
+ gtag("event", "login", {
253
+ send_to: wpm.getGoogleAdsConversionIdentifiers(),
254
+ })
255
+ })
256
+ } catch (e) {
257
+ console.error(e)
258
+ }
259
+ })
260
+
261
+ // view order received page event
262
+ // new_customer parameter: https://support.google.com/google-ads/answer/9917012
263
+ jQuery(document).on("wpmOrderReceivedPage", function () {
264
+
265
+ try {
266
+ if(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return
267
+ if (!wpm.googleConfigConditionsMet("ads")) return
268
+
269
+ let data_basic = {}
270
+ let data_with_cart = {}
271
+
272
+ data_basic = {
273
+ send_to : wpm.getGoogleAdsConversionIdentifiersWithLabel(),
274
+ transaction_id: wpmDataLayer.order.number,
275
+ value : wpmDataLayer.order.value_filtered,
276
+ currency : wpmDataLayer.order.currency,
277
+ new_customer : wpmDataLayer.order.new_customer,
278
+ }
279
+
280
+ if (wpmDataLayer?.order?.aw_merchant_id) {
281
+ data_with_cart = {
282
+ discount : wpmDataLayer.order.discount,
283
+ aw_merchant_id : wpmDataLayer.order.aw_merchant_id,
284
+ aw_feed_country : wpmDataLayer.order.aw_feed_country,
285
+ aw_feed_language: wpmDataLayer.order.aw_feed_language,
286
+ items : wpm.getGoogleAdsRegularOrderItems(),
287
+ }
288
+ }
289
+
290
+ wpm.gtagLoaded().then(function () {
291
+ gtag("event", "conversion", {...data_basic, ...data_with_cart})
292
+ })
293
+
294
+ // console.log({...data_basic,...data_with_cart})
295
+
296
+ // console.log(wpm.getGoogleAdsOrderItems())
297
+ } catch (e) {
298
+ console.error(e)
299
+ }
300
+ })
301
+
302
+
303
+
304
+
305
+
js/public/google-ga-4.js ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Add functions for Google Analytics 4
3
+ * */
4
+
5
+ (function (wpm, $, undefined) {
6
+
7
+ wpm.getGA4OrderItems = function () {
8
+
9
+ // "item_id" : "34",
10
+ // "item_name" : "Hoodie",
11
+ // "quantity" : 1,
12
+ // "item_brand" : "",
13
+ // "item_variant" : "Color: blue | Logo: yes",
14
+ // "price" : 45,
15
+ // "currency" : "CHF",
16
+ // "item_category": "Hoodies"
17
+
18
+
19
+ let orderItems = []
20
+
21
+ for (const [key, item] of Object.entries(wpmDataLayer.order.items)) {
22
+
23
+ let orderItem
24
+
25
+ orderItem = {
26
+ quantity : item.quantity,
27
+ price : item.price,
28
+ item_name : item.name,
29
+ currency : wpmDataLayer.order.currency,
30
+ item_category: wpmDataLayer.products[item.id].category.join("/"),
31
+ }
32
+
33
+ if (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {
34
+
35
+ orderItem.item_id = String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type])
36
+ orderItem.item_variant = wpmDataLayer.products[item.variation_id].variant_name
37
+ orderItem.item_brand = wpmDataLayer.products[item.variation_id].brand
38
+ orderItems.push(orderItem)
39
+ } else {
40
+
41
+ orderItem.item_id = String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type])
42
+ orderItem.item_brand = wpmDataLayer.products[item.id].brand
43
+ orderItems.push(orderItem)
44
+ }
45
+ }
46
+
47
+ return orderItems
48
+ }
49
+
50
+ }(window.wpm = window.wpm || {}, jQuery))
51
+
52
+
53
+ /**
54
+ * All event listeners
55
+ * */
56
+
57
+
58
+ // view order received page event
59
+ jQuery(document).on("wpmOrderReceivedPage", function () {
60
+
61
+ try {
62
+ if (!wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) return
63
+ if (wpmDataLayer?.pixels?.google?.analytics?.ga4?.mp_active) return
64
+ if (!wpm.googleConfigConditionsMet("analytics")) return
65
+
66
+ wpm.gtagLoaded().then(function () {
67
+ gtag("event", "purchase", {
68
+ send_to : [wpmDataLayer.pixels.google.analytics.ga4.measurement_id],
69
+ transaction_id: wpmDataLayer.order.number,
70
+ affiliation : wpmDataLayer.order.affiliation,
71
+ currency : wpmDataLayer.order.currency,
72
+ value : wpmDataLayer.order.value_regular,
73
+ discount : wpmDataLayer.order.discount,
74
+ tax : wpmDataLayer.order.tax,
75
+ shipping : wpmDataLayer.order.shipping,
76
+ coupon : wpmDataLayer.order.coupon,
77
+ items : wpm.getGA4OrderItems(),
78
+ })
79
+ })
80
+ } catch (e) {
81
+ console.error(e)
82
+ }
83
+ })
js/public/google-ga-ua.js ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Add functions for Google Analytics Universal
3
+ * */
4
+
5
+ (function (wpm, $, undefined) {
6
+
7
+ wpm.getGAUAOrderItems = function () {
8
+
9
+ // "id" : "34",
10
+ // "name" : "Hoodie",
11
+ // "brand" : "",
12
+ // "category" : "Hoodies",
13
+ // "list_position": 1,
14
+ // "price" : 45,
15
+ // "quantity" : 1,
16
+ // "variant" : "Color: blue | Logo: yes"
17
+
18
+
19
+ let orderItems = [],
20
+ list_position = 1
21
+
22
+ for (const [key, item] of Object.entries(wpmDataLayer.order.items)) {
23
+
24
+ let orderItem
25
+
26
+ orderItem = {
27
+ quantity : item.quantity,
28
+ price : item.price,
29
+ item_name : item.name,
30
+ currency : wpmDataLayer.order.currency,
31
+ item_category: wpmDataLayer.products[item.id].category.join("/"),
32
+ list_position: list_position,
33
+ }
34
+
35
+ if (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {
36
+
37
+ orderItem.id = String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type])
38
+ orderItem.variant = wpmDataLayer.products[item.variation_id].variant_name
39
+ orderItem.item_brand = wpmDataLayer.products[item.variation_id].brand
40
+ orderItems.push(orderItem)
41
+ } else {
42
+
43
+ orderItem.id = String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type])
44
+ orderItem.item_brand = wpmDataLayer.products[item.id].brand
45
+ orderItems.push(orderItem)
46
+ }
47
+
48
+ list_position++
49
+ }
50
+
51
+ return orderItems
52
+ }
53
+
54
+ }(window.wpm = window.wpm || {}, jQuery))
55
+
56
+
57
+ /**
58
+ * All event listeners
59
+ * */
60
+
61
+
62
+ // view order received page event
63
+ jQuery(document).on("wpmOrderReceivedPage", function () {
64
+
65
+ try {
66
+ if (!wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) return
67
+ if (wpmDataLayer?.pixels?.google?.analytics?.universal?.mp_active) return
68
+ if (!wpm.googleConfigConditionsMet("analytics")) return
69
+
70
+ wpm.gtagLoaded().then(function () {
71
+ gtag("event", "purchase", {
72
+ send_to : [wpmDataLayer.pixels.google.analytics.universal.property_id],
73
+ transaction_id: wpmDataLayer.order.number,
74
+ affiliation : wpmDataLayer.order.affiliation,
75
+ currency : wpmDataLayer.order.currency,
76
+ value : wpmDataLayer.order.value_regular,
77
+ discount : wpmDataLayer.order.discount,
78
+ tax : wpmDataLayer.order.tax,
79
+ shipping : wpmDataLayer.order.shipping,
80
+ coupon : wpmDataLayer.order.coupon,
81
+ items : wpm.getGAUAOrderItems(),
82
+ })
83
+ })
84
+
85
+ // console.log(wpm.getGAUAOrderItems())
86
+ } catch (e) {
87
+ console.error(e)
88
+ }
89
+ })
js/public/google-optimize.js ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (function (wpm, $, undefined) {
2
+
3
+ wpm.load_google_optimize_pixel = function () {
4
+
5
+ try {
6
+ if (wpmDataLayer?.pixels?.google?.optimize?.container_id) {
7
+
8
+ wpmDataLayer.pixels.google.optimize.loaded = true
9
+
10
+ wpm.loadScriptAndCacheIt("https://www.googleoptimize.com/optimize.js?id=" + wpmDataLayer.pixels.google.optimize.container_id)
11
+ // .done(function (script, textStatus) {
12
+ // console.log('Google Optimize loaded')
13
+ // });
14
+ }
15
+ } catch (e) {
16
+ console.error(e)
17
+ }
18
+ }
19
+
20
+ }(window.wpm = window.wpm || {}, jQuery));
21
+
22
+
23
+ (function () {
24
+
25
+ jQuery(document).on("wpmLoadPixels", function () {
26
+
27
+ if (wpm.canIFire("analytics", "google-optimize") && !wpmDataLayer?.pixels?.google?.optimize?.loaded) wpm.load_google_optimize_pixel()
28
+
29
+ })
30
+
31
+ })()
32
+
33
+
34
+
js/public/google.js ADDED
@@ -0,0 +1,279 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Add functions for Google
3
+ * */
4
+
5
+ (function (wpm, $, undefined) {
6
+
7
+ wpm.googleConfigConditionsMet = function (type) {
8
+ // always returns true if Google Consent Mode is active
9
+ if (wpmDataLayer?.pixels?.google?.consent_mode?.active) {
10
+ return true
11
+ } else if (wpm.getConsentValues().mode === "category") {
12
+ return wpm.getConsentValues().categories[type] === true
13
+ } else if (wpm.getConsentValues().mode === "pixel") {
14
+ return wpm.getConsentValues().pixels.includes("google-" + type)
15
+ } else {
16
+ return false
17
+ }
18
+ }
19
+
20
+ wpm.getVisitorConsentStatusAndUpdateGoogleConsentSettings = function (google_consent_settings) {
21
+
22
+ if (wpm.getConsentValues().mode === "category") {
23
+ if (wpm.getConsentValues().categories.analytics) google_consent_settings.analytics_storage = "granted"
24
+ if (wpm.getConsentValues().categories.ads) google_consent_settings.ad_storage = "granted"
25
+ } else if ((wpm.getConsentValues().mode === "pixel")) {
26
+ google_consent_settings.analytics_storage = wpm.getConsentValues().pixels.includes("google-analytics") ? "granted" : "denied"
27
+ google_consent_settings.ad_storage = wpm.getConsentValues().pixels.includes("google-ads") ? "granted" : "denied"
28
+ }
29
+
30
+ return google_consent_settings
31
+ }
32
+
33
+ wpm.updateGoogleConsentMode = function (analytics = true, ads = true) {
34
+
35
+ try {
36
+ if (
37
+ !window.gtag ||
38
+ !wpmDataLayer.shop.cookie_consent_mgmt.explicit_consent
39
+ ) return
40
+
41
+ gtag("consent", "update", {
42
+ analytics_storage: analytics ? "granted" : "denied",
43
+ ad_storage : ads ? "granted" : "denied",
44
+ })
45
+ } catch (e) {
46
+ console.error(e)
47
+ }
48
+ }
49
+
50
+ wpm.fireGtagGoogleAds = function () {
51
+ try {
52
+ wpmDataLayer.pixels.google.ads.state = "loading"
53
+
54
+ if (wpmDataLayer?.pixels?.google?.ads?.enhanced_conversions?.active) {
55
+ for (const [key, item] of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds)) {
56
+ gtag("config", key, {"allow_enhanced_conversions": true})
57
+ }
58
+ } else {
59
+ for (const [key, item] of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds)) {
60
+ gtag("config", key)
61
+ }
62
+ }
63
+
64
+ if (wpmDataLayer?.pixels?.google?.ads?.conversionIds && wpmDataLayer?.pixels?.google?.ads?.phone_conversion_label && wpmDataLayer?.pixels?.google?.ads?.phone_conversion_number) {
65
+ gtag("config", Object.keys(wpmDataLayer.pixels.google.ads.conversionIds)[0] + "/" + wpmDataLayer.pixels.google.ads.phone_conversion_label, {
66
+ phone_conversion_number: wpmDataLayer.pixels.google.ads.phone_conversion_number,
67
+ })
68
+ }
69
+
70
+ // ! enhanced_conversion_data needs to be var
71
+ // https://support.google.com/google-ads/answer/9888145#zippy=%2Cvalidate-your-implementation-using-chrome-developer-tools
72
+ if ("order_received_page" === wpmDataLayer.shop.page_type && wpmDataLayer?.order?.google?.ads?.enhanced_conversion_data) {
73
+ window.enhanced_conversion_data = wpmDataLayer.order.google.ads.enhanced_conversion_data
74
+ }
75
+
76
+ wpmDataLayer.pixels.google.ads.state = "ready"
77
+ } catch (e) {
78
+ console.error(e)
79
+ }
80
+ }
81
+
82
+ wpm.fireGtagGoogleAnalyticsUA = function () {
83
+ try {
84
+ wpmDataLayer.pixels.google.analytics.universal.state = "loading"
85
+
86
+ gtag("config", wpmDataLayer.pixels.google.analytics.universal.property_id, wpmDataLayer.pixels.google.analytics.universal.parameters)
87
+ wpmDataLayer.pixels.google.analytics.universal.state = "ready"
88
+ } catch (e) {
89
+ console.error(e)
90
+ }
91
+ }
92
+
93
+ wpm.fireGtagGoogleAnalyticsGA4 = function () {
94
+ try {
95
+ wpmDataLayer.pixels.google.analytics.ga4.state = "loading"
96
+
97
+ gtag("config", wpmDataLayer.pixels.google.analytics.ga4.measurement_id, wpmDataLayer.pixels.google.analytics.ga4.parameters)
98
+ wpmDataLayer.pixels.google.analytics.ga4.state = "ready"
99
+ } catch (e) {
100
+ console.error(e)
101
+ }
102
+ }
103
+
104
+ wpm.isGoogleActive = function () {
105
+ if (
106
+ wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id ||
107
+ wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id ||
108
+ !jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)
109
+ ) {
110
+ return true
111
+ } else {
112
+ return false
113
+ }
114
+ }
115
+
116
+ wpm.getGoogleGtagId = function () {
117
+ if (wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) {
118
+ return wpmDataLayer.pixels.google.analytics.universal.property_id
119
+ } else if (wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) {
120
+ return wpmDataLayer.pixels.google.analytics.ga4.measurement_id
121
+ } else {
122
+ return Object.keys(wpmDataLayer.pixels.google.ads.conversionIds)[0]
123
+ }
124
+ }
125
+
126
+ wpm.loadGoogle = function () {
127
+
128
+ if (wpm.isGoogleActive()) {
129
+
130
+ wpmDataLayer.pixels.google.state = "loading"
131
+
132
+ wpm.loadScriptAndCacheIt("https://www.googletagmanager.com/gtag/js?id=" + wpm.getGoogleGtagId())
133
+ .done(function (script, textStatus) {
134
+ try {
135
+ // console.log('Google Optimize loaded')
136
+ // alert('Google Optimize loaded')
137
+
138
+ // Initiate Google dataLayer and gtag
139
+ window.dataLayer = window.dataLayer || []
140
+ window.gtag = function gtag() {
141
+ dataLayer.push(arguments)
142
+ }
143
+
144
+ // Google Consent Mode
145
+ if (wpmDataLayer?.pixels?.google?.consent_mode?.active) {
146
+
147
+ let google_consent_settings = {
148
+ "ad_storage" : wpmDataLayer.pixels.google.consent_mode.ad_storage,
149
+ "analytics_storage": wpmDataLayer.pixels.google.consent_mode.analytics_storage,
150
+ "wait_for_update" : wpmDataLayer.pixels.google.consent_mode.wait_for_update,
151
+ }
152
+
153
+ if (wpmDataLayer?.pixels?.google?.consent_mode?.region) {
154
+ google_consent_settings.region = wpmDataLayer.pixels.google.consent_mode.region
155
+ }
156
+ google_consent_settings = wpm.getVisitorConsentStatusAndUpdateGoogleConsentSettings(google_consent_settings)
157
+
158
+ gtag("consent", "default", google_consent_settings)
159
+ gtag("set", "ads_data_redaction", wpmDataLayer.pixels.google.consent_mode.ads_data_redaction)
160
+ gtag("set", "url_passthrough", wpmDataLayer.pixels.google.consent_mode.url_passthrough)
161
+ }
162
+
163
+ // Google Linker
164
+ // https://developers.google.com/gtagjs/devguide/linker
165
+ if (wpmDataLayer?.pixels?.google?.linker?.settings) {
166
+ gtag("set", "linker", wpmDataLayer.pixels.google.linker.settings)
167
+ }
168
+
169
+ gtag("js", new Date())
170
+
171
+ if (wpm.googleConfigConditionsMet("ads") && !jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) wpm.fireGtagGoogleAds()
172
+ if (wpm.googleConfigConditionsMet("analytics") && wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) wpm.fireGtagGoogleAnalyticsUA()
173
+ if (wpm.googleConfigConditionsMet("analytics") && wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) wpm.fireGtagGoogleAnalyticsGA4()
174
+
175
+ wpmDataLayer.pixels.google.state = "ready"
176
+ } catch (e) {
177
+ console.error(e)
178
+ }
179
+ })
180
+ }
181
+ }
182
+
183
+ wpm.canGoogleLoad = function () {
184
+
185
+ if (wpmDataLayer?.pixels?.google?.consent_mode?.active) {
186
+ return true
187
+ } else if ("category" === wpm.getConsentValues().mode) {
188
+ return !!(wpm.getConsentValues().categories["ads"] || wpm.getConsentValues().categories["analytics"])
189
+ } else if ("pixel" === wpm.getConsentValues().mode) {
190
+ return wpm.getConsentValues().pixels.includes("google-ads") || wpm.getConsentValues().pixels.includes("google-analytics")
191
+ } else {
192
+ console.error("Couldn't find a valid load condition for Google mode in wpmConsentValues")
193
+ return false
194
+ }
195
+ }
196
+
197
+ wpm.gtagLoaded = function () {
198
+ return new Promise(function (resolve, reject) {
199
+
200
+ if (typeof wpmDataLayer?.pixels?.google?.state === "undefined") reject()
201
+
202
+ let startTime = 0
203
+ let timeout = 5000
204
+ let frequency = 200;
205
+
206
+ (function wait() {
207
+ if (wpmDataLayer?.pixels?.google?.state === "ready") return resolve()
208
+ if (startTime >= timeout) return reject()
209
+ startTime += frequency
210
+ setTimeout(wait, frequency)
211
+ })()
212
+ })
213
+ }
214
+
215
+ // wpm.gtagLoadednew = function () {
216
+ // return Promise.race([
217
+ // new Promise(function (resolve, reject) {
218
+ //
219
+ // if (typeof wpmDataLayer?.pixels?.google?.state === "undefined") reject();
220
+ //
221
+ //
222
+ // (function wait() {
223
+ // if (wpmDataLayer?.pixels?.google?.state === "ready") return resolve()
224
+ // if (to >= 1000) return reject()
225
+ // setTimeout(wait, 100)
226
+ // })()
227
+ // }),
228
+ // new Promise(function (resolve, reject) {
229
+ // setTimeout(() => reject(), 1000)
230
+ // }),
231
+ // ],
232
+ // )
233
+ // // .then((value) => {console.log("race then value: " + value)})
234
+ // .catch(
235
+ // (value) => {
236
+ // console.log("race catch value: " + value)
237
+ // return Promise.reject()
238
+ // })
239
+ // }
240
+
241
+
242
+ // const promise1 = new Promise((resolve, reject) => {
243
+ // setTimeout(resolve, 500, "one")
244
+ // })
245
+ //
246
+ // const promise2 = new Promise((resolve, reject) => {
247
+ // setTimeout(reject, 100, "two")
248
+ // })
249
+ //
250
+ // let onlyRunIfResolves = function () {
251
+ // return Promise.race([promise1, promise2])
252
+ // .catch(() => {
253
+ // })
254
+ // }
255
+ //
256
+ // onlyRunIfResolves()
257
+ // .then(() => {
258
+ // console.log("running function")
259
+ // })
260
+
261
+
262
+ }(window.wpm = window.wpm || {}, jQuery));
263
+
264
+
265
+ (function () {
266
+
267
+ jQuery(document).on("wpmLoadPixels", function () {
268
+
269
+ if (
270
+ wpm.canGoogleLoad() &&
271
+ (typeof wpmDataLayer?.pixels?.google?.state === "undefined")
272
+ ) {
273
+ wpm.loadGoogle()
274
+ }
275
+ })
276
+
277
+ // return wpmDataLayer?.pixels?.google?.state === "undefined";
278
+
279
+ })()
js/public/hotjar.js ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (function (wpm, $, undefined) {
2
+
3
+ wpm.load_hotjar_pixel = function () {
4
+
5
+ if (wpmDataLayer?.pixels?.hotjar?.site_id) {
6
+
7
+ // console.log('hotjar loaded');
8
+
9
+ wpmDataLayer.pixels.hotjar.loaded = true;
10
+
11
+ // @formatter:off
12
+ (function(h,o,t,j,a,r){
13
+ h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};
14
+ h._hjSettings={hjid:wpmDataLayer.pixels.hotjar.site_id,hjsv:6};
15
+ a=o.getElementsByTagName('head')[0];
16
+ r=o.createElement('script');r.async=1;
17
+ r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;
18
+ a.appendChild(r);
19
+ })(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv=');
20
+ // @formatter:on
21
+
22
+ }
23
+ }
24
+
25
+ }(window.wpm = window.wpm || {}, jQuery));
26
+
27
+
28
+ (function () {
29
+
30
+ jQuery(document).on("wpmLoadPixels", function () {
31
+
32
+ if (wpm.canIFire("analytics", "hotjar") && !wpmDataLayer?.pixels?.hotjar?.loaded) wpm.load_hotjar_pixel()
33
+
34
+ })
35
+
36
+ })()
37
+
38
+
39
+
js/public/main-free.js ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Load all free scripts first
3
+ */
4
+
5
+ require("./wpm")
6
+
7
+ /**
8
+ * Load all free scripts
9
+ */
10
+
11
+ require("./google")
12
+ require("./google-ga-ua")
13
+ require("./google-ga-4")
14
+ require("./google-ads")
15
+ require("./facebook")
16
+ require("./hotjar")
17
+ require("./google-optimize")
18
+
19
+ /**
20
+ * Execute the wpm loader. It makes sure that the script flow gets exectuded correctly, no matter how JS "optimizers" shuffle the code.
21
+ */
22
+
23
+ require("./wpm-loader")
24
+
25
+ // console.log('WooCommerce Pixel Manager free version')
26
+
27
+
js/public/main-premium.js ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // TODO Try using the webpack ignore plugin to remove premium imports during compilation
2
+ // https://webpack.js.org/plugins/ignore-plugin/
3
+ // https://stackoverflow.com/questions/65004054/webpack-ignoreplugin-on-multiple-modules
4
+ // https://stackoverflow.com/questions/61822069/conditional-import-import-if-exists
5
+ // https://stackoverflow.com/questions/36367532/how-can-i-conditionally-import-an-es6-module
6
+
7
+
8
+ // console.log(ENV)
9
+ // if (ENV.tier === 'pro') {
10
+ // console.log('tier')
11
+ // }
12
+
13
+ /**
14
+ * Load all essential scripts first
15
+ */
16
+
17
+ require("./wpm")
18
+ require("./wpm__premium_only")
19
+ require("./google__premium_only")
20
+
21
+ /**
22
+ * Load all free scripts
23
+ */
24
+
25
+ require("./google")
26
+ require("./google-ga-ua")
27
+ require("./google-ga-4")
28
+ require("./google-ads")
29
+ require("./facebook")
30
+ require("./hotjar")
31
+ require("./google-optimize")
32
+
33
+ /**
34
+ * Load all premium scripts
35
+ */
36
+
37
+ require("./google-ga-ua-eec__premium_only")
38
+ require("./google-ga-4-eec__premium_only")
39
+ require("./tiktok__premium_only")
40
+ require("./snapchat__premium_only")
41
+ require("./pinterest__premium_only")
42
+ require("./facebook__premium_only")
43
+ require("./microsoft-ads__premium_only.js")
44
+ require("./twitter__premium_only.js")
45
+ require("./google-ads__premium_only.js")
46
+
47
+
48
+ /**
49
+ * Execute the wpm loader. It makes sure that the script flow gets exectuded correctly, no matter how JS "optimizers" shuffle the code.
50
+ */
51
+
52
+ require("./wpm-loader")
53
+
54
+
55
+ // console.log('WooCommerce Pixel Manager premium version')
56
+
57
+
js/public/main.js ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // TODO Try using the webpack ignore plugin to remove premium imports during compilation
2
+ // https://webpack.js.org/plugins/ignore-plugin/
3
+ // https://stackoverflow.com/questions/65004054/webpack-ignoreplugin-on-multiple-modules
4
+ // https://stackoverflow.com/questions/61822069/conditional-import-import-if-exists
5
+ // https://stackoverflow.com/questions/36367532/how-can-i-conditionally-import-an-es6-module
6
+
7
+ // import wpm from "./wpm.js"
8
+ // import wpm_premium from "./wpm__premium_only.js"
9
+ // import google_premium from "./google__premium_only.js"
10
+
11
+ // require("./wpm.js")
12
+ require("./wpm__premium_only.js")
13
+ require("./google__premium_only.js")
14
+
15
+ // if (ENV.tier === 'pro') {
16
+ // console.log('Yo!')
17
+ //
18
+ // }
19
+
20
+ import google_ads from "./google-ads.js"
21
+ import facebook from "./facebook.js"
22
+ import hotjar from "./hotjar.js"
23
+ import google_optimize from "./google-optimize.js"
24
+
25
+ import google_ga_ua_eec_premium from "./google-ga-ua-eec__premium_only.js"
26
+ import google_ga_4_eec_premium from "./google-ga-4-eec__premium_only.js"
27
+ import tiktok_premium from "./tiktok__premium_only.js"
28
+ import snapchat_premium from "./snapchat__premium_only.js"
29
+ import pinterest_premium from "./pinterest__premium_only.js"
30
+ import facebook_premium from "./facebook__premium_only.js"
31
+
32
+
33
+ // console.log('WooCommerce Pixel Manager premium version')
js/public/wpm-loader.js ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * After wpm is loaded
3
+ * we first check if wpmDataLayer is loaded,
4
+ * and as soon as it is, we load the pixels,
5
+ * and as soon as the page load is complete,
6
+ * we fire the wpmLoad event.
7
+ */
8
+ wpm.wpmDataLayerExists()
9
+ .then(function () {
10
+ jQuery(document).trigger("wpmPreLoadPixels", {})
11
+ })
12
+ .then(function () {
13
+ wpm.pageLoaded().then(function () {
14
+ jQuery(document).trigger("wpmLoad", {})
15
+ })
16
+ })
17
+
js/public/wpm-public.p1.min.js CHANGED
@@ -1,2 +1,2 @@
1
- (()=>{var e={164:()=>{jQuery(document).on("wpmLoadPixels",(function(){var e,t,o,a,r,n;null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.facebook)||void 0===o||!o.pixel_id||null!==(a=wpmDataLayer)&&void 0!==a&&null!==(r=a.pixels)&&void 0!==r&&null!==(n=r.facebook)&&void 0!==n&&n.loaded||wpm.canIFire("ads","facebook-ads")&&wpm.loadFacebookPixel()})),jQuery(document).on("wpmAddToCart",(function(e,t){try{var o,a,r;if(null===(o=wpmDataLayer)||void 0===o||null===(a=o.pixels)||void 0===a||null===(r=a.facebook)||void 0===r||!r.loaded)return;let e=wpm.getRandomEventId();fbq("track","AddToCart",{content_type:"product",content_name:t.name,content_ids:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],value:parseFloat(t.quantity*t.price),currency:t.currency},{eventID:e}),t.currency=wpmDataLayer.shop.currency,jQuery(document).trigger("wpmFbCapiEvent",{event_name:"AddToCart",event_id:e,user_data:wpm.getFbUserData(),product_data:t,product_id:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],event_source_url:window.location.href})}catch(e){console.error(e)}})),jQuery(document).on("wpmBeginCheckout",(function(e){try{var t,o,a;if(null===(t=wpmDataLayer)||void 0===t||null===(o=t.pixels)||void 0===o||null===(a=o.facebook)||void 0===a||!a.loaded)return;let e=wpm.getRandomEventId();fbq("track","InitiateCheckout",{},{eventID:e}),jQuery(document).trigger("wpmFbCapiEvent",{event_name:"InitiateCheckout",event_id:e,user_data:wpm.getFbUserData(),event_source_url:window.location.href})}catch(e){console.error(e)}})),jQuery(document).on("wpmAddToWishlist",(function(e,t){try{var o,a,r;if(null===(o=wpmDataLayer)||void 0===o||null===(a=o.pixels)||void 0===a||null===(r=a.facebook)||void 0===r||!r.loaded)return;let e=wpm.getRandomEventId();fbq("track","AddToWishlist",{content_type:"product",content_name:t.name,content_ids:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],value:parseFloat(t.quantity*t.price),currency:t.currency},{eventID:e}),t.currency=wpmDataLayer.shop.currency,jQuery(document).trigger("wpmFbCapiEvent",{event_name:"AddToWishlist",event_id:e,user_data:wpm.getFbUserData(),product_data:t,product_id:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],event_source_url:window.location.href})}catch(e){console.error(e)}})),jQuery(document).on("wpmViewItem",(function(e,t){try{var o,a,r;if(null===(o=wpmDataLayer)||void 0===o||null===(a=o.pixels)||void 0===a||null===(r=a.facebook)||void 0===r||!r.loaded)return;wpm.fbViewContent(t)}catch(e){console.error(e)}})),jQuery(document).on("wpmSearch",(function(){try{var e,t,o;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.facebook)||void 0===o||!o.loaded)return;let a=wpm.getRandomEventId();fbq("track","Search",{},{eventID:a}),jQuery(document).trigger("wpmFbCapiEvent",{event_name:"Search",event_id:a,user_data:wpm.getFbUserData(),event_source_url:window.location.href})}catch(e){console.error(e)}})),jQuery(document).on("wpmLoadAlways",(function(){try{var e,t,o;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.facebook)||void 0===o||!o.loaded)return;wpm.setFbUserData()}catch(e){console.error(e)}})),jQuery(document).on("wpmOrderReceivedPage",(function(){try{var e,t,o;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.facebook)||void 0===o||!o.loaded)return;fbq("track","Purchase",{content_type:"product",value:wpmDataLayer.order.value_filtered,currency:wpmDataLayer.order.currency,content_ids:wpm.facebookContentIds()},{eventID:wpmDataLayer.order.id})}catch(e){console.error(e)}}))},1:()=>{!function(e,t,o){let a;e.loadFacebookPixel=function(){try{wpmDataLayer.pixels.facebook.loaded=!0,e=window,t=document,o="script",e.fbq||(a=e.fbq=function(){a.callMethod?a.callMethod.apply(a,arguments):a.queue.push(arguments)},e._fbq||(e._fbq=a),a.push=a,a.loaded=!0,a.version="2.0",a.queue=[],(r=t.createElement(o)).async=!0,r.src="https://connect.facebook.net/en_US/fbevents.js",(n=t.getElementsByTagName(o)[0]).parentNode.insertBefore(r,n)),fbq("init",wpmDataLayer.pixels.facebook.pixel_id),fbq("track","PageView")}catch(o){console.error(o)}var e,t,o,a,r,n},e.getRandomEventId=function(){return(Math.random()+1).toString(36).substring(2)},e.getFbUserData=function(){return a||e.getFbUserDataFromBrowser()},e.setFbUserData=function(){a=e.getFbUserDataFromBrowser()},e.getFbUserDataFromBrowser=function(){return{fbp:e.getCookie("_fbp"),fbc:e.getCookie("_fbc"),client_user_agent:navigator.userAgent}},e.fbViewContent=function(t){try{var o,a,r;if(null===(o=wpmDataLayer)||void 0===o||null===(a=o.pixels)||void 0===a||null===(r=a.facebook)||void 0===r||!r.loaded)return;let n=e.getRandomEventId();fbq("track","ViewContent",{content_type:"product",content_name:t.name,content_ids:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],currency:wpmDataLayer.shop.currency,value:t.price},{eventID:n}),t.currency=wpmDataLayer.shop.currency,jQuery(document).trigger("wpmFbCapiEvent",{event_name:"ViewContent",event_id:n,user_data:e.getFbUserData(),product_data:t,product_id:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],event_source_url:window.location.href})}catch(e){console.error(e)}},e.facebookContentIds=function(){let e=[];for(const[a,r]of Object.entries(wpmDataLayer.order.items)){var t,o;null!==(t=wpmDataLayer)&&void 0!==t&&null!==(o=t.general)&&void 0!==o&&o.variationsOutput&&0!==r.variation_id?e.push(String(wpmDataLayer.products[r.variation_id].dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type])):e.push(String(wpmDataLayer.products[r.id].dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type]))}return e}}(window.wpm=window.wpm||{},jQuery)},12:(e,t,o)=>{o(1),o(164)},165:()=>{jQuery(document).on("wpmViewItemList",(function(e,t){try{var o,a,r,n,i,s,d,l,c,u,p;if(jQuery.isEmptyObject(null===(o=wpmDataLayer)||void 0===o||null===(a=o.pixels)||void 0===a||null===(r=a.google)||void 0===r||null===(n=r.ads)||void 0===n?void 0:n.conversionIds))return;if(null===(i=wpmDataLayer)||void 0===i||null===(s=i.pixels)||void 0===s||null===(d=s.google)||void 0===d||null===(l=d.ads)||void 0===l||null===(c=l.dynamic_remarketing)||void 0===c||!c.status)return;if(!wpm.googleConfigConditionsMet("ads"))return;if(null!==(u=wpmDataLayer)&&void 0!==u&&null!==(p=u.general)&&void 0!==p&&p.variationsOutput&&t.isVariable&&!1===wpmDataLayer.pixels.google.ads.dynamic_remarketing.send_events_with_parent_ids)return;if(!t)return;wpm.gtagLoaded().then((function(){gtag("event","view_item_list",{send_to:wpm.getGoogleAdsConversionIdentifiers(),items:[{id:t.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],google_business_vertical:wpmDataLayer.pixels.google.ads.google_business_vertical}]})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmAddToCart",(function(e,t){try{var o,a,r,n,i,s,d,l,c;if(jQuery.isEmptyObject(null===(o=wpmDataLayer)||void 0===o||null===(a=o.pixels)||void 0===a||null===(r=a.google)||void 0===r||null===(n=r.ads)||void 0===n?void 0:n.conversionIds))return;if(null===(i=wpmDataLayer)||void 0===i||null===(s=i.pixels)||void 0===s||null===(d=s.google)||void 0===d||null===(l=d.ads)||void 0===l||null===(c=l.dynamic_remarketing)||void 0===c||!c.status)return;if(!wpm.googleConfigConditionsMet("ads"))return;wpm.gtagLoaded().then((function(){gtag("event","add_to_cart",{send_to:wpm.getGoogleAdsConversionIdentifiers(),value:t.quantity*t.price,items:[{id:t.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],quantity:t.quantity,price:t.price,google_business_vertical:wpmDataLayer.pixels.google.ads.google_business_vertical}]})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmViewItem",(function(e,t){try{var o,a,r,n,i,s,d,l,c;if(jQuery.isEmptyObject(null===(o=wpmDataLayer)||void 0===o||null===(a=o.pixels)||void 0===a||null===(r=a.google)||void 0===r||null===(n=r.ads)||void 0===n?void 0:n.conversionIds))return;if(null===(i=wpmDataLayer)||void 0===i||null===(s=i.pixels)||void 0===s||null===(d=s.google)||void 0===d||null===(l=d.ads)||void 0===l||null===(c=l.dynamic_remarketing)||void 0===c||!c.status)return;if(!wpm.googleConfigConditionsMet("ads"))return;wpm.gtagLoaded().then((function(){gtag("event","view_item",{send_to:wpm.getGoogleAdsConversionIdentifiers(),value:(t.quantity?t.quantity:1)*t.price,items:[{id:t.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],quantity:t.quantity?t.quantity:1,price:t.price,google_business_vertical:wpmDataLayer.pixels.google.ads.google_business_vertical}]})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmSearch",(function(){try{var e,t,o,a,r,n,i,s,d;if(jQuery.isEmptyObject(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.google)||void 0===o||null===(a=o.ads)||void 0===a?void 0:a.conversionIds))return;if(null===(r=wpmDataLayer)||void 0===r||null===(n=r.pixels)||void 0===n||null===(i=n.google)||void 0===i||null===(s=i.ads)||void 0===s||null===(d=s.dynamic_remarketing)||void 0===d||!d.status)return;if(!wpm.googleConfigConditionsMet("ads"))return;let u=[];for(const[e,t]of Object.entries(wpmDataLayer.products)){var l,c;if(null!==(l=wpmDataLayer)&&void 0!==l&&null!==(c=l.general)&&void 0!==c&&c.variationsOutput&&t.isVariable&&!1===wpmDataLayer.pixels.google.ads.dynamic_remarketing.send_events_with_parent_ids)return;u.push({id:t.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],google_business_vertical:wpmDataLayer.pixels.google.ads.google_business_vertical})}wpm.gtagLoaded().then((function(){gtag("event","view_search_results",{send_to:wpm.getGoogleAdsConversionIdentifiers(),items:u})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmOrderReceivedPage",(function(){try{var e,t,o,a,r,n,i,s,d;if(jQuery.isEmptyObject(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.google)||void 0===o||null===(a=o.ads)||void 0===a?void 0:a.conversionIds))return;if(null===(r=wpmDataLayer)||void 0===r||null===(n=r.pixels)||void 0===n||null===(i=n.google)||void 0===i||null===(s=i.ads)||void 0===s||null===(d=s.dynamic_remarketing)||void 0===d||!d.status)return;if(!wpm.googleConfigConditionsMet("ads"))return;wpm.gtagLoaded().then((function(){gtag("event","purchase",{send_to:wpm.getGoogleAdsConversionIdentifiers(),value:wpmDataLayer.order.value_filtered,items:wpm.getGoogleAdsDynamicRemarketingOrderItems()})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmLogin",(function(){try{var e,t,o,a,r,n,i,s,d;if(jQuery.isEmptyObject(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.google)||void 0===o||null===(a=o.ads)||void 0===a?void 0:a.conversionIds))return;if(null===(r=wpmDataLayer)||void 0===r||null===(n=r.pixels)||void 0===n||null===(i=n.google)||void 0===i||null===(s=i.ads)||void 0===s||null===(d=s.dynamic_remarketing)||void 0===d||!d.status)return;if(!wpm.googleConfigConditionsMet("ads"))return;wpm.gtagLoaded().then((function(){gtag("event","login",{send_to:wpm.getGoogleAdsConversionIdentifiers()})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmOrderReceivedPage",(function(){try{var e,t,o,a,r,n;if(jQuery.isEmptyObject(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.google)||void 0===o||null===(a=o.ads)||void 0===a?void 0:a.conversionIds))return;if(!wpm.googleConfigConditionsMet("ads"))return;let i={},s={};i={send_to:wpm.getGoogleAdsConversionIdentifiersWithLabel(),transaction_id:wpmDataLayer.order.number,value:wpmDataLayer.order.value_filtered,currency:wpmDataLayer.order.currency,new_customer:wpmDataLayer.order.new_customer},null!==(r=wpmDataLayer)&&void 0!==r&&null!==(n=r.order)&&void 0!==n&&n.aw_merchant_id&&(s={discount:wpmDataLayer.order.discount,aw_merchant_id:wpmDataLayer.order.aw_merchant_id,aw_feed_country:wpmDataLayer.order.aw_feed_country,aw_feed_language:wpmDataLayer.order.aw_feed_language,items:wpm.getGoogleAdsRegularOrderItems()}),wpm.gtagLoaded().then((function(){gtag("event","conversion",{...i,...s})}))}catch(e){console.error(e)}}))},42:()=>{!function(e,t,o){let a=[];e.getGoogleAdsConversionIdentifiersWithLabel=function(){for(const[e,t]of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds))a.push(e+"/"+t);return a},e.getGoogleAdsConversionIdentifiers=function(){let e=[];for(const[t,o]of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds))e.push(t);return e},e.getGoogleAdsRegularOrderItems=function(){let e=[];for(const[a,r]of Object.entries(wpmDataLayer.order.items)){var t,o;let a;a={quantity:r.quantity,price:r.price},null!==(t=wpmDataLayer)&&void 0!==t&&null!==(o=t.general)&&void 0!==o&&o.variationsOutput&&0!==r.variation_id?(a.id=String(wpmDataLayer.products[r.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type]),e.push(a)):(a.id=String(wpmDataLayer.products[r.id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type]),e.push(a))}return e},e.getGoogleAdsDynamicRemarketingOrderItems=function(){let e=[];for(const[a,r]of Object.entries(wpmDataLayer.order.items)){var t,o;let a;a={quantity:r.quantity,price:r.price,google_business_vertical:wpmDataLayer.pixels.google.ads.google_business_vertical},null!==(t=wpmDataLayer)&&void 0!==t&&null!==(o=t.general)&&void 0!==o&&o.variationsOutput&&0!==r.variation_id?(a.id=String(wpmDataLayer.products[r.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type]),e.push(a)):(a.id=String(wpmDataLayer.products[r.id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type]),e.push(a))}return e}}(window.wpm=window.wpm||{},jQuery)},190:(e,t,o)=>{o(42),o(165)},625:()=>{jQuery(document).on("wpmOrderReceivedPage",(function(){try{var e,t,o,a,r,n,i,s,d,l;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.google)||void 0===o||null===(a=o.analytics)||void 0===a||null===(r=a.universal)||void 0===r||!r.property_id)return;if(null!==(n=wpmDataLayer)&&void 0!==n&&null!==(i=n.pixels)&&void 0!==i&&null!==(s=i.google)&&void 0!==s&&null!==(d=s.analytics)&&void 0!==d&&null!==(l=d.universal)&&void 0!==l&&l.mp_active)return;if(!wpm.googleConfigConditionsMet("analytics"))return;wpm.gtagLoaded().then((function(){gtag("event","purchase",{send_to:[wpmDataLayer.pixels.google.analytics.universal.property_id],transaction_id:wpmDataLayer.order.number,affiliation:wpmDataLayer.order.affiliation,currency:wpmDataLayer.order.currency,value:wpmDataLayer.order.value_regular,discount:wpmDataLayer.order.discount,tax:wpmDataLayer.order.tax,shipping:wpmDataLayer.order.shipping,coupon:wpmDataLayer.order.coupon,items:wpm.getGAUAOrderItems()})}))}catch(e){console.error(e)}}))},19:()=>{!function(e,t,o){e.getGAUAOrderItems=function(){let e=[],t=1;for(const[r,n]of Object.entries(wpmDataLayer.order.items)){var o,a;let r;r={quantity:n.quantity,price:n.price,name:n.name,currency:wpmDataLayer.order.currency,category:wpmDataLayer.products[n.id].category.join("/"),list_position:t},null!==(o=wpmDataLayer)&&void 0!==o&&null!==(a=o.general)&&void 0!==a&&a.variationsOutput&&0!==n.variation_id?(r.id=String(wpmDataLayer.products[n.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type]),r.variant=wpmDataLayer.products[n.variation_id].variant_name,r.brand=wpmDataLayer.products[n.variation_id].brand):(r.id=String(wpmDataLayer.products[n.id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type]),r.brand=wpmDataLayer.products[n.id].brand),e.push(r),t++}return e}}(window.wpm=window.wpm||{},jQuery)},562:(e,t,o)=>{o(19),o(625)},572:()=>{jQuery(document).on("wpmOrderReceivedPage",(function(){try{var e,t,o,a,r,n,i,s,d,l;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.google)||void 0===o||null===(a=o.analytics)||void 0===a||null===(r=a.ga4)||void 0===r||!r.measurement_id)return;if(null!==(n=wpmDataLayer)&&void 0!==n&&null!==(i=n.pixels)&&void 0!==i&&null!==(s=i.google)&&void 0!==s&&null!==(d=s.analytics)&&void 0!==d&&null!==(l=d.ga4)&&void 0!==l&&l.mp_active)return;if(!wpm.googleConfigConditionsMet("analytics"))return;wpm.gtagLoaded().then((function(){gtag("event","purchase",{send_to:[wpmDataLayer.pixels.google.analytics.ga4.measurement_id],transaction_id:wpmDataLayer.order.number,affiliation:wpmDataLayer.order.affiliation,currency:wpmDataLayer.order.currency,value:wpmDataLayer.order.value_regular,discount:wpmDataLayer.order.discount,tax:wpmDataLayer.order.tax,shipping:wpmDataLayer.order.shipping,coupon:wpmDataLayer.order.coupon,items:wpm.getGA4OrderItems()})}))}catch(e){console.error(e)}}))},228:()=>{!function(e,t,o){e.getGA4OrderItems=function(){let e=[];for(const[a,r]of Object.entries(wpmDataLayer.order.items)){var t,o;let a;a={quantity:r.quantity,price:r.price,item_name:r.name,currency:wpmDataLayer.order.currency,item_category:wpmDataLayer.products[r.id].category.join("/")},null!==(t=wpmDataLayer)&&void 0!==t&&null!==(o=t.general)&&void 0!==o&&o.variationsOutput&&0!==r.variation_id?(a.item_id=String(wpmDataLayer.products[r.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type]),a.item_variant=wpmDataLayer.products[r.variation_id].variant_name,a.item_brand=wpmDataLayer.products[r.variation_id].brand):(a.item_id=String(wpmDataLayer.products[r.id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type]),a.item_brand=wpmDataLayer.products[r.id].brand),e.push(a)}return e}}(window.wpm=window.wpm||{},jQuery)},522:(e,t,o)=>{o(228),o(572)},774:(e,t,o)=>{o(562),o(522)},294:()=>{jQuery(document).on("wpmLoadPixels",(function(){var e,t,o;void 0===(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.google)||void 0===o?void 0:o.state)&&(wpm.canGoogleLoad()?wpm.loadGoogle():wpm.logPreventedPixelLoading("google","analytics / ads"))}))},860:()=>{!function(e,t,o){e.googleConfigConditionsMet=function(t){var o,a,r,n;return!(null===(o=wpmDataLayer)||void 0===o||null===(a=o.pixels)||void 0===a||null===(r=a.google)||void 0===r||null===(n=r.consent_mode)||void 0===n||!n.active)||("category"===e.getConsentValues().mode?!0===e.getConsentValues().categories[t]:"pixel"===e.getConsentValues().mode&&e.getConsentValues().pixels.includes("google-"+t))},e.getVisitorConsentStatusAndUpdateGoogleConsentSettings=function(t){return"category"===e.getConsentValues().mode?(e.getConsentValues().categories.analytics&&(t.analytics_storage="granted"),e.getConsentValues().categories.ads&&(t.ad_storage="granted")):"pixel"===e.getConsentValues().mode&&(t.analytics_storage=e.getConsentValues().pixels.includes("google-analytics")?"granted":"denied",t.ad_storage=e.getConsentValues().pixels.includes("google-ads")?"granted":"denied"),t},e.updateGoogleConsentMode=function(){let e=!(arguments.length>0&&arguments[0]!==o)||arguments[0],t=!(arguments.length>1&&arguments[1]!==o)||arguments[1];try{if(!window.gtag||!wpmDataLayer.shop.cookie_consent_mgmt.explicit_consent)return;gtag("consent","update",{analytics_storage:e?"granted":"denied",ad_storage:t?"granted":"denied"})}catch(e){console.error(e)}},e.fireGtagGoogleAds=function(){try{var e,t,o,a,r,n,i,s,d,l,c,u,p,g,m,y,w,v,f,_,h;if(wpmDataLayer.pixels.google.ads.state="loading",null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(o=t.google)&&void 0!==o&&null!==(a=o.ads)&&void 0!==a&&null!==(r=a.enhanced_conversions)&&void 0!==r&&r.active)for(const[e,t]of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds))gtag("config",e,{allow_enhanced_conversions:!0});else for(const[e,t]of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds))gtag("config",e);null!==(n=wpmDataLayer)&&void 0!==n&&null!==(i=n.pixels)&&void 0!==i&&null!==(s=i.google)&&void 0!==s&&null!==(d=s.ads)&&void 0!==d&&d.conversionIds&&null!==(l=wpmDataLayer)&&void 0!==l&&null!==(c=l.pixels)&&void 0!==c&&null!==(u=c.google)&&void 0!==u&&null!==(p=u.ads)&&void 0!==p&&p.phone_conversion_label&&null!==(g=wpmDataLayer)&&void 0!==g&&null!==(m=g.pixels)&&void 0!==m&&null!==(y=m.google)&&void 0!==y&&null!==(w=y.ads)&&void 0!==w&&w.phone_conversion_number&&gtag("config",Object.keys(wpmDataLayer.pixels.google.ads.conversionIds)[0]+"/"+wpmDataLayer.pixels.google.ads.phone_conversion_label,{phone_conversion_number:wpmDataLayer.pixels.google.ads.phone_conversion_number}),"order_received_page"===wpmDataLayer.shop.page_type&&null!==(v=wpmDataLayer)&&void 0!==v&&null!==(f=v.order)&&void 0!==f&&null!==(_=f.google)&&void 0!==_&&null!==(h=_.ads)&&void 0!==h&&h.enhanced_conversion_data&&(window.enhanced_conversion_data=wpmDataLayer.order.google.ads.enhanced_conversion_data),wpmDataLayer.pixels.google.ads.state="ready"}catch(e){console.error(e)}},e.fireGtagGoogleAnalyticsUA=function(){try{wpmDataLayer.pixels.google.analytics.universal.state="loading",gtag("config",wpmDataLayer.pixels.google.analytics.universal.property_id,wpmDataLayer.pixels.google.analytics.universal.parameters),wpmDataLayer.pixels.google.analytics.universal.state="ready"}catch(e){console.error(e)}},e.fireGtagGoogleAnalyticsGA4=function(){try{wpmDataLayer.pixels.google.analytics.ga4.state="loading",gtag("config",wpmDataLayer.pixels.google.analytics.ga4.measurement_id,wpmDataLayer.pixels.google.analytics.ga4.parameters),wpmDataLayer.pixels.google.analytics.ga4.state="ready"}catch(e){console.error(e)}},e.isGoogleActive=function(){var e,t,o,a,r,n,i,s,d,l,c,u,p,g;return!(!(null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(o=t.google)&&void 0!==o&&null!==(a=o.analytics)&&void 0!==a&&null!==(r=a.universal)&&void 0!==r&&r.property_id||null!==(n=wpmDataLayer)&&void 0!==n&&null!==(i=n.pixels)&&void 0!==i&&null!==(s=i.google)&&void 0!==s&&null!==(d=s.analytics)&&void 0!==d&&null!==(l=d.ga4)&&void 0!==l&&l.measurement_id)&&jQuery.isEmptyObject(null===(c=wpmDataLayer)||void 0===c||null===(u=c.pixels)||void 0===u||null===(p=u.google)||void 0===p||null===(g=p.ads)||void 0===g?void 0:g.conversionIds))},e.getGoogleGtagId=function(){var e,t,o,a,r,n,i,s,d,l;return null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(o=t.google)&&void 0!==o&&null!==(a=o.analytics)&&void 0!==a&&null!==(r=a.universal)&&void 0!==r&&r.property_id?wpmDataLayer.pixels.google.analytics.universal.property_id:null!==(n=wpmDataLayer)&&void 0!==n&&null!==(i=n.pixels)&&void 0!==i&&null!==(s=i.google)&&void 0!==s&&null!==(d=s.analytics)&&void 0!==d&&null!==(l=d.ga4)&&void 0!==l&&l.measurement_id?wpmDataLayer.pixels.google.analytics.ga4.measurement_id:Object.keys(wpmDataLayer.pixels.google.ads.conversionIds)[0]},e.loadGoogle=function(){e.isGoogleActive()&&(wpmDataLayer.pixels.google.state="loading",e.loadScriptAndCacheIt("https://www.googletagmanager.com/gtag/js?id="+e.getGoogleGtagId()).done((function(t,o){try{var a,r,n,i,s,d,l,c,u,p,g,m,y,w,v,f,_,h,L,D,C,b;if(window.dataLayer=window.dataLayer||[],window.gtag=function(){dataLayer.push(arguments)},null!==(a=wpmDataLayer)&&void 0!==a&&null!==(r=a.pixels)&&void 0!==r&&null!==(n=r.google)&&void 0!==n&&null!==(i=n.consent_mode)&&void 0!==i&&i.active){var x,j,k,I;let t={ad_storage:wpmDataLayer.pixels.google.consent_mode.ad_storage,analytics_storage:wpmDataLayer.pixels.google.consent_mode.analytics_storage,wait_for_update:wpmDataLayer.pixels.google.consent_mode.wait_for_update};null!==(x=wpmDataLayer)&&void 0!==x&&null!==(j=x.pixels)&&void 0!==j&&null!==(k=j.google)&&void 0!==k&&null!==(I=k.consent_mode)&&void 0!==I&&I.region&&(t.region=wpmDataLayer.pixels.google.consent_mode.region),t=e.getVisitorConsentStatusAndUpdateGoogleConsentSettings(t),gtag("consent","default",t),gtag("set","ads_data_redaction",wpmDataLayer.pixels.google.consent_mode.ads_data_redaction),gtag("set","url_passthrough",wpmDataLayer.pixels.google.consent_mode.url_passthrough)}null!==(s=wpmDataLayer)&&void 0!==s&&null!==(d=s.pixels)&&void 0!==d&&null!==(l=d.google)&&void 0!==l&&null!==(c=l.linker)&&void 0!==c&&c.settings&&gtag("set","linker",wpmDataLayer.pixels.google.linker.settings),gtag("js",new Date),jQuery.isEmptyObject(null===(u=wpmDataLayer)||void 0===u||null===(p=u.pixels)||void 0===p||null===(g=p.google)||void 0===g||null===(m=g.ads)||void 0===m?void 0:m.conversionIds)||(e.googleConfigConditionsMet("ads")?e.fireGtagGoogleAds():e.logPreventedPixelLoading("google-ads","ads")),null!==(y=wpmDataLayer)&&void 0!==y&&null!==(w=y.pixels)&&void 0!==w&&null!==(v=w.google)&&void 0!==v&&null!==(f=v.analytics)&&void 0!==f&&null!==(_=f.universal)&&void 0!==_&&_.property_id&&(e.googleConfigConditionsMet("analytics")?e.fireGtagGoogleAnalyticsUA():e.logPreventedPixelLoading("google-universal-analytics","analytics")),null!==(h=wpmDataLayer)&&void 0!==h&&null!==(L=h.pixels)&&void 0!==L&&null!==(D=L.google)&&void 0!==D&&null!==(C=D.analytics)&&void 0!==C&&null!==(b=C.ga4)&&void 0!==b&&b.measurement_id&&(e.googleConfigConditionsMet("analytics")?e.fireGtagGoogleAnalyticsGA4():e.logPreventedPixelLoading("ga4","analytics")),wpmDataLayer.pixels.google.state="ready"}catch(e){console.error(e)}})))},e.canGoogleLoad=function(){var t,o,a,r;return!(null===(t=wpmDataLayer)||void 0===t||null===(o=t.pixels)||void 0===o||null===(a=o.google)||void 0===a||null===(r=a.consent_mode)||void 0===r||!r.active)||("category"===e.getConsentValues().mode?!(!e.getConsentValues().categories.ads&&!e.getConsentValues().categories.analytics):"pixel"===e.getConsentValues().mode?e.getConsentValues().pixels.includes("google-ads")||e.getConsentValues().pixels.includes("google-analytics"):(console.error("Couldn't find a valid load condition for Google mode in wpmConsentValues"),!1))},e.gtagLoaded=function(){return new Promise((function(e,t){var o,a,r;void 0===(null===(o=wpmDataLayer)||void 0===o||null===(a=o.pixels)||void 0===a||null===(r=a.google)||void 0===r?void 0:r.state)&&t();let n=0;!function o(){var a,r,i;return"ready"===(null===(a=wpmDataLayer)||void 0===a||null===(r=a.pixels)||void 0===r||null===(i=r.google)||void 0===i?void 0:i.state)?e():n>=5e3?t():(n+=200,void setTimeout(o,200))}()}))}}(window.wpm=window.wpm||{},jQuery)},580:(e,t,o)=>{o(860),o(294)},69:(e,t,o)=>{o(580),o(190),o(774),o(463)},945:()=>{jQuery(document).on("wpmLoadPixels",(function(){var e,t,o,a,r,n,i,s;null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.google)||void 0===o||null===(a=o.optimize)||void 0===a||!a.container_id||null!==(r=wpmDataLayer)&&void 0!==r&&null!==(n=r.pixels)&&void 0!==n&&null!==(i=n.google)&&void 0!==i&&null!==(s=i.optimize)&&void 0!==s&&s.loaded||wpm.canIFire("analytics","google-optimize")&&wpm.load_google_optimize_pixel()}))},962:()=>{!function(e,t,o){e.load_google_optimize_pixel=function(){try{wpmDataLayer.pixels.google.optimize.loaded=!0,e.loadScriptAndCacheIt("https://www.googleoptimize.com/optimize.js?id="+wpmDataLayer.pixels.google.optimize.container_id)}catch(e){console.error(e)}}}(window.wpm=window.wpm||{},jQuery)},463:(e,t,o)=>{o(962),o(945)},300:()=>{jQuery(document).on("wpmLoadPixels",(function(){var e,t,o,a,r,n,i,s,d;null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(o=t.hotjar)||void 0===o||!o.site_id||null!==(a=wpmDataLayer)&&void 0!==a&&null!==(r=a.pixels)&&void 0!==r&&null!==(n=r.hotjar)&&void 0!==n&&n.loaded||!wpm.canIFire("analytics","hotjar")||null!==(i=wpmDataLayer)&&void 0!==i&&null!==(s=i.pixels)&&void 0!==s&&null!==(d=s.hotjar)&&void 0!==d&&d.loaded||wpm.load_hotjar_pixel()}))},376:()=>{!function(e,t,o){e.load_hotjar_pixel=function(){try{wpmDataLayer.pixels.hotjar.loaded=!0,e=window,t=document,e.hj=e.hj||function(){(e.hj.q=e.hj.q||[]).push(arguments)},e._hjSettings={hjid:wpmDataLayer.pixels.hotjar.site_id,hjsv:6},o=t.getElementsByTagName("head")[0],(a=t.createElement("script")).async=1,a.src="https://static.hotjar.com/c/hotjar-"+e._hjSettings.hjid+".js?sv="+e._hjSettings.hjsv,o.appendChild(a)}catch(e){console.error(e)}var e,t,o,a}}(window.wpm=window.wpm||{},jQuery)},787:(e,t,o)=>{o(376),o(300)},299:()=>{jQuery(document).on("click",".remove_from_cart_button, .remove",(function(){try{let e=new URL(jQuery(this).attr("href")),t=wpm.getProductIdByCartItemKeyUrl(e);wpm.removeProductFromCart(t)}catch(e){console.error(e)}})),jQuery(document).on("click",".add_to_cart_button:not(.product_type_variable), .ajax_add_to_cart, .single_add_to_cart_button",(function(){try{if("product"===wpmDataLayer.shop.page_type){if(void 0!==jQuery(this).attr("href")&&jQuery(this).attr("href").includes("add-to-cart")){let e=1,t=jQuery(this).data("product_id");wpm.addProductToCart(t,e)}else if("simple"===wpmDataLayer.shop.product_type){let e=Number(jQuery(".input-text.qty").val());e||0===e||(e=1);let t=jQuery(this).val();wpm.addProductToCart(t,e)}else if("variable"===wpmDataLayer.shop.product_type){let e=Number(jQuery(".input-text.qty").val());e||0===e||(e=1);let t=jQuery("[name='variation_id']").val();wpm.addProductToCart(t,e)}else if("grouped"===wpmDataLayer.shop.product_type)jQuery(".woocommerce-grouped-product-list-item").each((function(){let e=Number(jQuery(this).find(".input-text.qty").val());e||0===e||(e=1);let t=jQuery(this).attr("class"),o=wpm.getPostIdFromString(t);wpm.addProductToCart(o,e)}));else if("bundle"===wpmDataLayer.shop.product_type){let e=Number(jQuery(".input-text.qty").val());e||0===e||(e=1);let t=jQuery("input[name=add-to-cart]").val();wpm.addProductToCart(t,e)}}else{let e=1,t=jQuery(this).data("product_id");wpm.addProductToCart(t,e)}}catch(e){console.error(e)}})),jQuery(document).one("click","a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)",(function(e){try{if(jQuery(e.target).closest("a").attr("href")){let t=jQuery(e.target).closest("a").attr("href");if(t.includes("add-to-cart=")){let e=t.match(/(add-to-cart=)(\d+)/);e&&wpm.addProductToCart(e[2],1)}}}catch(e){console.error(e)}})),jQuery(document).on("click",".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product",(function(){try{let e=jQuery(this).nextAll(".wpmProductId:first").data("id");if(e){if(e=getIdBasedOndVariationsOutputSetting(e),!e)throw Error("Wasn't able to retrieve a productId");if(wpmDataLayer.products&&wpmDataLayer.products[e]){let t=wpm.getProductDetailsFormattedForEvent(e);jQuery(document).trigger("wpmSelectContentGaUa",t),jQuery(document).trigger("wpmSelectItem",t)}}}catch(e){console.error(e)}})),jQuery(document).one("click",".checkout-button, .cart-checkout-button, .button.checkout",(function(){jQuery(document).trigger("wpmBeginCheckout")})),jQuery(document).on("input","#billing_email",(function(){wpm.isEmail(jQuery(this).val())&&(wpm.fireCheckoutProgress(2),wpm.emailSelected=!0)})),jQuery(document).on("click",".wc_payment_methods",(function(){!1===wpm.paymentMethodSelected&&wpm.fireCheckoutProgress(3),wpm.fireCheckoutOption(3,jQuery("input[name='payment_method']:checked").val()),wpm.paymentMethodSelected=!0})),jQuery(document).one("click","#place_order",(function(){!1===wpm.emailSelected&&wpm.fireCheckoutProgress(2),!1===wpm.paymentMethodSelected&&(wpm.fireCheckoutProgress(3),wpm.fireCheckoutOption(3,jQuery("input[name='payment_method']:checked").val())),wpm.fireCheckoutProgress(4)})),jQuery(document).on("click","[name='update_cart']",(function(){try{jQuery(".cart_item").each((function(){let e=new URL(jQuery(this).find(".product-remove").find("a").attr("href")),t=wpm.getProductIdByCartItemKeyUrl(e),o=jQuery(this).find(".qty").val();0===o?wpm.removeProductFromCart(t):o<wpmDataLayer.cart[t].quantity?wpm.removeProductFromCart(t,wpmDataLayer.cart[t].quantity-o):o>wpmDataLayer.cart[t].quantity&&wpm.addProductToCart(t,o-wpmDataLayer.cart[t].quantity)}))}catch(e){console.error(e),wpm.getCartItemsFromBackend()}})),jQuery(document).on("click",".add_to_wishlist, .wl-add-to",(function(){try{let e;if(jQuery(this).data("productid")?e=jQuery(this).data("productid"):jQuery(this).data("product-id")&&(e=jQuery(this).data("product-id")),!e)throw Error("Wasn't able to retrieve a productId");let t=wpm.getProductDetailsFormattedForEvent(e);jQuery(document).trigger("wpmAddToWishlist",t)}catch(e){console.error(e)}})),jQuery(document).on("updated_cart_totals",(function(){jQuery(document).trigger("wpmViewCart")})),jQuery(".single_variation_wrap").on("show_variation",(function(e,t){try{let e=getIdBasedOndVariationsOutputSetting(t.variation_id);if(!e)throw Error("Wasn't able to retrieve a productId");if(wpmDataLayer.products&&wpmDataLayer.products[e]){let t=wpm.getProductDetailsFormattedForEvent(e);jQuery(document).trigger("wpmViewItem",t)}}catch(e){console.error(e)}})),jQuery(".single_variation_wrap").on("hide_variation",(function(){try{var e,t;let o=jQuery("body").attr("class").match(/(postid-)(\d+)/)[2];if(!o)throw Error("Wasn't able to retrieve a productId");if("variable"===wpmDataLayer.shop.product_type&&null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.general)&&void 0!==t&&t.variationsOutput)for(const[e,t]of Object.entries(wpmDataLayer.products))if("parentId"in t){o=t.id;break}if(wpmDataLayer.products&&wpmDataLayer.products[o]){let e=wpm.getProductDetailsFormattedForEvent(o);jQuery(document).trigger("wpmViewItem",e)}}catch(e){console.error(e)}})),jQuery(window).on("wpmLoad",(function(){try{wpm.doesWooCommerceCartExist()&&wpm.getCartItems()}catch(e){console.error(e)}})),jQuery(window).on("wpmLoad",(function(){wpmDataLayer.products=wpmDataLayer.products||{};let e=wpm.getAddToCartLinkProductIds();wpm.getProductsFromBackend(e)})),jQuery(window).on("wpmLoad",(function(){if(!wpm.getCookie("wpmReferrer"))if(document.referrer){let e=new URL(document.referrer).hostname;e!==window.location.host?wpm.setCookie("wpmReferrer",e):wpm.setCookie("wpmReferrer","")}else wpm.setCookie("wpmReferrer","")})),jQuery(window).on("wpmLoad",(function(){try{var e;if("undefined"!=typeof wpmDataLayer&&(null===(e=wpmDataLayer)||void 0===e||!e.wpmLoadFired)){var t,o;if(jQuery(document).trigger("wpmLoadAlways"),"product"===wpmDataLayer.shop.page_type&&"variable"!==wpmDataLayer.shop.product_type&&wpm.getMainProductIdFromProductPage()){let e=wpm.getProductDataForViewItemEvent(wpm.getMainProductIdFromProductPage());jQuery(document).trigger("wpmViewItem",e)}else"product_category"===wpmDataLayer.shop.page_type?jQuery(document).trigger("wpmCategory"):"search"===wpmDataLayer.shop.page_type?jQuery(document).trigger("wpmSearch"):"cart"===wpmDataLayer.shop.page_type?jQuery(document).trigger("wpmViewCart"):"order_received_page"===wpmDataLayer.shop.page_type&&wpmDataLayer.order?wpm.isOrderIdStored(wpmDataLayer.order.id)||(jQuery(document).trigger("wpmOrderReceivedPage"),wpm.writeOrderIdToStorage(wpmDataLayer.order.id)):jQuery(document).trigger("wpmEverywhereElse");null!==(t=wpmDataLayer)&&void 0!==t&&null!==(o=t.user)&&void 0!==o&&o.id&&!wpm.hasLoginEventFired()&&(jQuery(document).trigger("wpmLogin"),wpm.setLoginEventFired()),wpmDataLayer.wpmLoadFired=!0}}catch(e){console.error(e)}})),jQuery(window).on("wpmPreLoadPixels",(function(){var e,t,o;null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.shop)&&void 0!==t&&null!==(o=t.cookie_consent_mgmt)&&void 0!==o&&o.explicit_consent&&wpm.updateConsentCookieValues(!0),jQuery(document).trigger("wpmLoadPixels",{})}))},584:()=>{!function(e,t,o){const a="_wpm_order_ids",r="_wpm_endpoint_available",n="/wp-json/";function i(){return""!==e.getCookie(a)}e.emailSelected=!1,e.paymentMethodSelected=!1,e.useRestEndpoint=function(){return e.isSessionStorageAvailable()&&e.isRestEndpointAvailable()&&e.isBelowRestErrorThreshold()},e.isBelowRestErrorThreshold=function(){return window.sessionStorage.getItem(0)<=10},e.isRestEndpointAvailable=function(){if(window.sessionStorage.getItem(r))return JSON.parse(window.sessionStorage.getItem(r));e.testEndpoint()},e.isSessionStorageAvailable=function(){return!!window.sessionStorage},e.testEndpoint=function(){let e=arguments.length>0&&arguments[0]!==o?arguments[0]:location.protocol+"//"+location.host+n,t=arguments.length>1&&arguments[1]!==o?arguments[1]:r;jQuery.ajax(e,{type:"HEAD",timeout:1e3,statusCode:{200:function(e){window.sessionStorage.setItem(t,JSON.stringify(!0))},404:function(e){window.sessionStorage.setItem(t,JSON.stringify(!1))},0:function(e){window.sessionStorage.setItem(t,JSON.stringify(!1))}}}).then((e=>{}))},e.isWpmRestEndpointAvailable=function(){let t=arguments.length>0&&arguments[0]!==o?arguments[0]:r;return!!e.getCookie(t)},e.writeOrderIdToStorage=function(t){if(window.Storage)if(null===localStorage.getItem(a)){let e=[];e.push(t),window.localStorage.setItem(a,JSON.stringify(e))}else{let e=JSON.parse(localStorage.getItem(a));e.includes(t)||(e.push(t),window.localStorage.setItem(a,JSON.stringify(e)))}else{let o=new Date;o.setDate(o.getDate()+365);let r=[];i()&&(r=JSON.parse(e.getCookie(a))),r.includes(t)||(r.push(t),document.cookie="_wpm_order_ids="+JSON.stringify(r)+";expires="+o.toUTCString())}"function"==typeof e.storeOrderIdOnServer&&wpmDataLayer.orderDeduplication&&e.storeOrderIdOnServer(t)},e.isOrderIdStored=function(t){return wpmDataLayer.orderDeduplication?window.Storage?null!==localStorage.getItem(a)&&JSON.parse(localStorage.getItem(a)).includes(t):!!i()&&JSON.parse(e.getCookie(a)).includes(t):(console.log("order duplication prevention: off"),!1)},e.isEmail=function(e){return/^(([^<>()\[\]\\.,;:\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,}))$/.test(e)},e.removeProductFromCart=function(t){let a=arguments.length>1&&arguments[1]!==o?arguments[1]:null;try{if(!t)throw Error("Wasn't able to retrieve a productId");if(!(t=getIdBasedOndVariationsOutputSetting(t)))throw Error("Wasn't able to retrieve a productId");let o;if(o=null==a?wpmDataLayer.cart[t].quantity:a,wpmDataLayer.cart[t]){let r=e.getProductDetailsFormattedForEvent(t,o);jQuery(document).trigger("wpmRemoveFromCart",r),null==a||wpmDataLayer.cart[t].quantity===a?(delete wpmDataLayer.cart[t],sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(wpmDataLayer.cart))):(wpmDataLayer.cart[t].quantity=wpmDataLayer.cart[t].quantity-o,sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(wpmDataLayer.cart)))}}catch(e){console.error(e)}},getIdBasedOndVariationsOutputSetting=function(e){try{var t,o;return null!==(t=wpmDataLayer)&&void 0!==t&&null!==(o=t.general)&&void 0!==o&&o.variationsOutput?e:wpmDataLayer.products[e].isVariation?wpmDataLayer.products[e].parentId:e}catch(e){console.error(e)}},e.addProductToCart=function(t,o){try{var a;if(!t)throw Error("Wasn't able to retrieve a productId");if(!(t=getIdBasedOndVariationsOutputSetting(t)))throw Error("Wasn't able to retrieve a productId");if(null!==(a=wpmDataLayer)&&void 0!==a&&a.products[t]){var r;let a=e.getProductDetailsFormattedForEvent(t,o);jQuery(document).trigger("wpmAddToCart",a),null!==(r=wpmDataLayer)&&void 0!==r&&r.cart[t]?wpmDataLayer.cart[t].quantity=wpmDataLayer.cart[t].quantity+o:("cart"in wpmDataLayer||(wpmDataLayer.cart={}),wpmDataLayer.cart[t]=e.getProductDetailsFormattedForEvent(t,o)),sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(wpmDataLayer.cart))}}catch(t){console.error(t),e.getCartItemsFromBackend()}},e.getCartItems=function(){sessionStorage?sessionStorage.getItem("wpmDataLayerCart")&&"order_received_page"!==wpmDataLayer.shop.page_type?e.saveCartObjectToDataLayer(JSON.parse(sessionStorage.getItem("wpmDataLayerCart"))):sessionStorage.setItem("wpmDataLayerCart",JSON.stringify({})):e.getCartItemsFromBackend()},e.getCartItemsFromBackend=function(){try{let t={action:"wpm_get_cart_items"};jQuery.ajax({type:"get",dataType:"json",url:e.ajax_url,data:t,success:function(t){t.cart||(t.cart={}),e.saveCartObjectToDataLayer(t.cart),sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(t.cart))}})}catch(e){console.error(e)}},e.getProductsFromBackend=function(t){if((t=t.filter((e=>!wpmDataLayer.products.hasOwnProperty(e))))&&0!==t.length)try{let o={action:"wpm_get_product_ids",productIds:t};jQuery.ajax({type:"get",dataType:"json",url:e.ajax_url,data:o,success:function(e){wpmDataLayer.products=Object.assign({},wpmDataLayer.products,e)},error:function(e){console.log(e)}})}catch(e){console.error(e)}},e.saveCartObjectToDataLayer=function(e){wpmDataLayer.cart=e,wpmDataLayer.products=Object.assign({},wpmDataLayer.products,e)},e.fireCheckoutOption=function(e){let t=arguments.length>1&&arguments[1]!==o?arguments[1]:null,a=arguments.length>2&&arguments[2]!==o?arguments[2]:null,r={step:e,checkout_option:t,value:a};jQuery(document).trigger("wpmFireCheckoutOption",r)},e.fireCheckoutProgress=function(e){let t={step:e};jQuery(document).trigger("wpmFireCheckoutProgress",t)},e.getPostIdFromString=function(e){try{return e.match(/(post-)(\d+)/)[2]}catch(e){console.error(e)}},e.triggerViewItemList=function(t){if(!t)throw Error("Wasn't able to retrieve a productId");if(!(t=getIdBasedOndVariationsOutputSetting(t)))throw Error("Wasn't able to retrieve a productId");jQuery(document).trigger("wpmViewItemList",e.getProductDataForViewItemEvent(t))},e.getProductDataForViewItemEvent=function(t){if(!t)throw Error("Wasn't able to retrieve a productId");try{if(wpmDataLayer.products[t])return e.getProductDetailsFormattedForEvent(t)}catch(e){console.error(e)}},e.getMainProductIdFromProductPage=function(){try{return["simple","variable","grouped","composite","bundle"].indexOf(wpmDataLayer.shop.product_type)>=0&&jQuery(".wpmProductId:first").data("id")}catch(e){console.error(e)}},e.viewItemListTriggerTestMode=function(e){jQuery(e).css({position:"relative"}),jQuery(e).append('<div id="viewItemListTriggerOverlay"></div>'),jQuery(e).find("#viewItemListTriggerOverlay").css({"z-index":"10",display:"block",position:"absolute",height:"100%",top:"0",left:"0",right:"0",opacity:wpmDataLayer.viewItemListTrigger.opacity,"background-color":wpmDataLayer.viewItemListTrigger.backgroundColor})},e.getSearchTermFromUrl=function(){try{return new URLSearchParams(window.location.search).get("s")}catch(e){console.error(e)}};let s,d={};e.observerCallback=function(t,o){t.forEach((t=>{try{let a,r=jQuery(t.target).data("ioid");if(a=jQuery(t.target).next(".wpmProductId").length?jQuery(t.target).next(".wpmProductId").data("id"):jQuery(t.target).find(".wpmProductId").data("id"),!a)throw Error("wpmProductId element not found");t.isIntersecting?d[r]=setTimeout((()=>{e.triggerViewItemList(a),wpmDataLayer.viewItemListTrigger.testMode&&e.viewItemListTriggerTestMode(t.target),!1===wpmDataLayer.viewItemListTrigger.repeat&&o.unobserve(t.target)}),wpmDataLayer.viewItemListTrigger.timeout):(clearTimeout(d[r]),wpmDataLayer.viewItemListTrigger.testMode&&jQuery(t.target).find("#viewItemListTriggerOverlay").remove())}catch(e){console.error(e)}}))};let l,c=0;e.startIntersectionObserverToWatch=function(){try{e.urlHasParameter("vildemomode")&&(wpmDataLayer.viewItemListTrigger.testMode=!0),s=new IntersectionObserver(e.observerCallback,{threshold:wpmDataLayer.viewItemListTrigger.threshold}),l=jQuery(".wpmProductId").map((function(e,t){return jQuery(t).parent().hasClass("type-product")||jQuery(t).parent().hasClass("product")||jQuery(t).parent().hasClass("product-item-inner")?jQuery(t).parent():jQuery(t).prev().hasClass("wc-block-grid__product")||jQuery(t).prev().hasClass("product")||jQuery(t).prev().hasClass("product-small")||jQuery(t).prev().hasClass("woocommerce-LoopProduct-link")?jQuery(this).prev():jQuery(t).closest(".product").length?jQuery(t).closest(".product"):void 0})),l.each((function(e,t){jQuery(t[0]).data("ioid",c++),s.observe(t[0])}))}catch(e){console.error(e)}},e.startProductsMutationObserverToWatch=function(){try{let e=jQuery(".wpmProductId:eq(0)").parents().has(jQuery(".wpmProductId:eq(1)").parents()).first();e.length&&u.observe(e[0],{attributes:!0,childList:!0,characterData:!0})}catch(e){console.error(e)}};let u=new MutationObserver((function(e){e.forEach((function(e){let t=e.addedNodes;null!==t&&jQuery(t).each((function(){(jQuery(this).hasClass("type-product")||jQuery(this).hasClass("product-small")||jQuery(this).hasClass("wc-block-grid__product"))&&p(this)&&(jQuery(this).data("ioid",c++),s.observe(this))}))}))})),p=function(e){return!(!jQuery(e).find(".wpmProductId").length&&!jQuery(e).siblings(".wpmProductId").length)};e.setCookie=function(e){let t=arguments.length>1&&arguments[1]!==o?arguments[1]:"",a=arguments.length>2&&arguments[2]!==o?arguments[2]:null;if(a){let o=new Date;o.setTime(o.getTime()+24*a*60*60*1e3);let r="expires="+o.toUTCString();document.cookie=e+"="+t+";"+r+";path=/"}else document.cookie=e+"="+t+";path=/"},e.getCookie=function(e){let t=e+"=",o=decodeURIComponent(document.cookie).split(";");for(let e=0;e<o.length;e++){let a=o[e];for(;" "==a.charAt(0);)a=a.substring(1);if(0==a.indexOf(t))return a.substring(t.length,a.length)}return""},e.getWpmSessionData=function(){if(window.sessionStorage){let e=window.sessionStorage.getItem("_wpm");return null!==e?JSON.parse(e):{}}return{}},e.setWpmSessionData=function(e){window.sessionStorage&&window.sessionStorage.setItem("_wpm",JSON.stringify(e))},e.storeOrderIdOnServer=function(t){try{let o={action:"wpm_purchase_pixels_fired",order_id:t,nonce:e.nonce};jQuery.ajax({type:"post",dataType:"json",url:e.ajax_url,data:o,success:function(e){!1===e.success&&console.log(e)},error:function(e){console.log(e)}})}catch(e){console.error(e)}},e.getProductIdByCartItemKeyUrl=function(e){let t,o=new URLSearchParams(e.search).get("remove_item");return t=0===wpmDataLayer.cartItemKeys[o].variation_id?wpmDataLayer.cartItemKeys[o].product_id:wpmDataLayer.cartItemKeys[o].variation_id,t},e.getAddToCartLinkProductIds=function(){return jQuery("a").map((function(){let e=jQuery(this).attr("href");if(e&&e.includes("?add-to-cart=")){let t=e.match(/(add-to-cart=)(\d+)/);if(t)return t[2]}})).get()},e.getProductDetailsFormattedForEvent=function(e){let t=arguments.length>1&&arguments[1]!==o?arguments[1]:1,a={id:e.toString(),dyn_r_ids:wpmDataLayer.products[e].dyn_r_ids,name:wpmDataLayer.products[e].name,list_name:wpmDataLayer.shop.list_name,brand:wpmDataLayer.products[e].brand,category:wpmDataLayer.products[e].category,variant:wpmDataLayer.products[e].variant,list_position:wpmDataLayer.products[e].position,quantity:t,price:wpmDataLayer.products[e].price,currency:wpmDataLayer.shop.currency,isVariable:wpmDataLayer.products[e].isVariable,isVariation:wpmDataLayer.products[e].isVariation,parentId:wpmDataLayer.products[e].parentId};return a.isVariation&&(a.parentId_dyn_r_ids=wpmDataLayer.products[e].parentId_dyn_r_ids),a},e.setReferrerToCookie=function(){e.getCookie("wpmReferrer")||e.setCookie("wpmReferrer",document.referrer)},e.getReferrerFromCookie=function(){return e.getCookie("wpmReferrer")?e.getCookie("wpmReferrer"):null},e.getClidFromBrowser=function(){let t,a=arguments.length>0&&arguments[0]!==o?arguments[0]:"gclid";return t={gclid:"_gcl_aw",dclid:"_gcl_dc"},e.getCookie(t[a])?e.getCookie(t[a]).match(/(GCL.[\d]*.)(.*)/)[2]:""},e.getUserAgent=function(){return navigator.userAgent},e.getViewPort=function(){return{width:Math.max(document.documentElement.clientWidth||0,window.innerWidth||0),height:Math.max(document.documentElement.clientHeight||0,window.innerHeight||0)}};let g=function(){let t=e.getCookie("cmplz_statistics"),o=e.getCookie("cmplz_marketing");return!(!e.getCookie("cmplz_consent_status")&&!e.getCookie("cmplz_banner-status"))&&{analytics:"allow"===t,ads:"allow"===o,visitorHasChosen:!0}},m=function(){let t=e.getCookie("cookielawinfo-checkbox-analytics")||e.getCookie("cookielawinfo-checkbox-analytiques"),o=e.getCookie("cookielawinfo-checkbox-advertisement")||e.getCookie("cookielawinfo-checkbox-publicite"),a=e.getCookie("CookieLawInfoConsent");return!(!t&&!o)&&{analytics:"yes"===t,ads:"yes"===o,visitorHasChosen:!!a}},y={categories:{},pixels:[],mode:"category",visitorHasChosen:!1};e.getConsentValues=function(){return y},e.setConsentValueCategories=function(){let e=arguments.length>0&&arguments[0]!==o&&arguments[0],t=arguments.length>1&&arguments[1]!==o&&arguments[1];y.categories.analytics=e,y.categories.ads=t},e.updateConsentCookieValues=function(){let t,a=arguments.length>0&&arguments[0]!==o&&arguments[0];if(t=e.getCookie("CookieConsent"))t=decodeURI(t),y.categories.analytics=t.indexOf("statistics:true")>=0,y.categories.ads=t.indexOf("marketing:true")>=0,y.visitorHasChosen=!0;else if(t=e.getCookie("CookieScriptConsent"))t=JSON.parse(t),"reject"===t.action?(y.categories.analytics=!1,y.categories.ads=!1):2===t.categories.length?(y.categories.analytics=!0,y.categories.ads=!0):(y.categories.analytics=t.categories.indexOf("performance")>=0,y.categories.ads=t.categories.indexOf("targeting")>=0),y.visitorHasChosen=!0;else if(t=e.getCookie("borlabs-cookie")){var r,n,i,s,d,l,c,u;t=decodeURI(t),t=JSON.parse(t),y.categories.analytics=!(null===(r=t)||void 0===r||null===(n=r.consents)||void 0===n||!n.statistics),y.categories.ads=!(null===(i=t)||void 0===i||null===(s=i.consents)||void 0===s||!s.marketing),y.visitorHasChosen=!0,y.pixels=[...(null===(d=t)||void 0===d||null===(l=d.consents)||void 0===l?void 0:l.statistics)||[],...(null===(c=t)||void 0===c||null===(u=c.consents)||void 0===u?void 0:u.marketing)||[]],y.mode="pixel"}else(t=g())?(y.categories.analytics=!0===t.analytics,y.categories.ads=!0===t.ads,y.visitorHasChosen=t.visitorHasChosen):(t=e.getCookie("cookie_notice_accepted"))?(y.categories.analytics=!0,y.categories.ads=!0,y.visitorHasChosen=!0):(t=e.getCookie("hu-consent"))?(t=JSON.parse(t),y.categories.analytics=!!t.categories[3],y.categories.ads=!!t.categories[4],y.visitorHasChosen=!0):(t=m())?(y.categories.analytics=!0===t.analytics,y.categories.ads=!0===t.ads,y.visitorHasChosen=!0===t.visitorHasChosen):(t=e.getCookie("moove_gdpr_popup"))?(t=JSON.parse(t),y.categories.analytics="1"===t.thirdparty,y.categories.ads="1"===t.advanced,y.visitorHasChosen=!0):(y.categories.analytics=!a,y.categories.ads=!a)},e.updateConsentCookieValues(),e.setConsentDefaultValuesToExplicit=function(){y.categories={analytics:!1,ads:!1}},e.canIFire=function(t,o){let a;return"category"===y.mode?a=!!y.categories[t]:"pixel"===y.mode?a=y.pixels.includes(o):(console.error("Couldn't find a valid consent mode in wpmConsentValues"),a=!1),!!a||(e.logPreventedPixelLoading(o,t),!1)},e.logPreventedPixelLoading=function(e,t){var o,a,r;null!==(o=wpmDataLayer)&&void 0!==o&&null!==(a=o.shop)&&void 0!==a&&null!==(r=a.cookie_consent_mgmt)&&void 0!==r&&r.explicit_consent?console.log('WooCommerce Pixel Manager: The "'+e+" (category: "+t+')" pixel has not fired because you have not given consent for it yet. (WPM is in explicit consent mode.)'):console.log('WooCommerce Pixel Manager: The "'+e+" (category: "+t+')" pixel has not fired because you have removed consent for this pixel. (WPM is in implicit consent mode.)')},e.scriptTagObserver=new MutationObserver((o=>{o.forEach((o=>{let{addedNodes:a}=o;[...a].forEach((o=>{t(o).data("wpm-cookie-category")&&(e.shouldScriptBeActive(o)?e.unblockScript(o):e.blockScript(o))}))}))})),e.scriptTagObserver.observe(document.head,{childList:!0,subtree:!0}),window.addEventListener("DOMContentLoaded",(()=>e.scriptTagObserver.disconnect())),e.shouldScriptBeActive=function(e){var o,a,r,n;return!((wpmDataLayer.shop.cookie_consent_mgmt.explicit_consent||y.visitorHasChosen)&&("category"!==y.mode||!t(e).data("wpm-cookie-category").split(",").some((e=>y.categories[e])))&&("pixel"!==y.mode||!y.pixels.includes(t(e).data("wpm-pixel-name")))&&("pixel"!==y.mode||"google"!==t(e).data("wpm-pixel-name")||!["google-analytics","google-ads"].some((e=>y.pixels.includes(e))))&&(null===(o=wpmDataLayer)||void 0===o||null===(a=o.pixels)||void 0===a||null===(r=a.google)||void 0===r||null===(n=r.consent_mode)||void 0===n||!n.active||"google"!==t(e).data("wpm-pixel-name")))},e.unblockScript=function(e){let a=arguments.length>1&&arguments[1]!==o&&arguments[1];a&&t(e).remove();let r=t(e).data("wpm-src");r&&t(e).attr("src",r),e.type="text/javascript",a&&t(e).appendTo("head"),jQuery(document).trigger("wpmPreLoadPixels",{})},e.blockScript=function(e){let a=arguments.length>1&&arguments[1]!==o&&arguments[1];a&&t(e).remove(),t(e).attr("src")&&t(e).removeAttr("src"),e.type="blocked/javascript",a&&t(e).appendTo("head")},e.unblockAllScripts=function(){let a=!(arguments.length>0&&arguments[0]!==o)||arguments[0],r=!(arguments.length>1&&arguments[1]!==o)||arguments[1];t.each(t('script[type="blocked/javascript"]'),(function(o,n){(t(n).data("wpm-cookie-category").includes("analytics")&&a||t(n).data("wpm-cookie-category").includes("ads")&&r)&&e.unblockScript(n,!0)})),jQuery(document).trigger("wpmPreLoadPixels",{})},e.unblockSelectedPixels=function(){t.each(t('script[type="blocked/javascript"]'),(function(o,a){(y.pixels.includes(t(a).data("wpm-pixel-name"))||"google"===t(a).data("wpm-pixel-name")&&["google-analytics","google-ads"].some((e=>y.pixels.includes(e))))&&e.unblockScript(a,!0)})),jQuery(document).trigger("wpmPreLoadPixels",{})},window.addEventListener("borlabs-cookie-consent-saved",(function(){e.updateConsentCookieValues(),"pixel"===y.mode?(e.unblockSelectedPixels(),e.updateGoogleConsentMode(y.pixels.includes("google-analytics"),y.pixels.includes("google-ads"))):(e.unblockAllScripts(y.categories.analytics,y.categories.ads),e.updateGoogleConsentMode(y.categories.analytics,y.categories.ads))})),window.addEventListener("CookiebotOnAccept",(function(){Cookiebot.consent.statistics&&(y.categories.analytics=!0),Cookiebot.consent.marketing&&(y.categories.ads=!0),e.unblockAllScripts(y.categories.analytics,y.categories.ads),e.updateGoogleConsentMode(y.categories.analytics,y.categories.ads)}),!1),window.addEventListener("CookieScriptAccept",(function(t){t.detail.categories.includes("performance")&&(y.categories.analytics=!0),t.detail.categories.includes("targeting")&&(y.categories.ads=!0),e.unblockAllScripts(y.categories.analytics,y.categories.ads),e.updateGoogleConsentMode(y.categories.analytics,y.categories.ads)})),window.addEventListener("CookieScriptAcceptAll",(function(){e.unblockAllScripts(!0,!0),e.updateGoogleConsentMode(!0,!0)})),document.addEventListener("cmplzStatusChange",(function(){e.updateConsentCookieValues(),e.unblockAllScripts(y.categories.analytics,y.categories.ads),e.updateGoogleConsentMode(y.categories.analytics,y.categories.ads)})),document.addEventListener("setCookieNotice",(function(){e.updateConsentCookieValues(),e.unblockAllScripts(y.categories.analytics,y.categories.ads),e.updateGoogleConsentMode(y.categories.analytics,y.categories.ads)})),e.huObserver=new MutationObserver((function(t){t.forEach((t=>{let{addedNodes:o}=t;[...o].forEach((t=>{"hu"===t.id&&jQuery(".hu-cookies-save").on("click",(function(){e.updateConsentCookieValues(),e.unblockAllScripts(y.categories.analytics,y.categories.ads),e.updateGoogleConsentMode(y.categories.analytics,y.categories.ads)}))}))}))})),window.hu&&e.huObserver.observe(document.documentElement||document.body,{childList:!0,subtree:!0}),e.version=function(){console.log(wpmDataLayer.version)},e.loadScriptAndCacheIt=function(e,t){return t=jQuery.extend(t||{},{dataType:"script",cache:!0,url:e}),jQuery.ajax(t)},e.getOrderItemPrice=function(e){return(e.total+e.total_tax)/e.quantity},e.hasLoginEventFired=function(){let t=e.getWpmSessionData();return null==t?void 0:t.loginEventFired},e.setLoginEventFired=function(){let t=e.getWpmSessionData();t.loginEventFired=!0,e.setWpmSessionData(t)},e.wpmDataLayerExists=function(){return new Promise((function(e){!function t(){if("undefined"!=typeof wpmDataLayer)return e();setTimeout(t,50)}()}))},e.jQueryExists=function(){return new Promise((function(e){!function t(){if("undefined"!=typeof jQuery)return e();setTimeout(t,100)}()}))},e.pageLoaded=function(){return new Promise((function(e){!function t(){if("complete"===document.readyState)return e();setTimeout(t,50)}()}))},e.pageReady=function(){return new Promise((function(e){!function t(){if("interactive"===document.readyState||"complete"===document.readyState)return e();setTimeout(t,50)}()}))},e.isMiniCartActive=function(){if(window.sessionStorage){for(const[e,t]of Object.entries(window.sessionStorage))if(e.includes("wc_fragments"))return!0;return!1}return!1},e.doesWooCommerceCartExist=function(){return document.cookie.includes("woocommerce_items_in_cart")},e.urlHasParameter=function(e){return new URLSearchParams(window.location.search).has(e)},window.wpmLoaded={}}(window.wpm=window.wpm||{},jQuery)},534:(e,t,o)=>{o(584)},207:()=>{wpm.wpmDataLayerExists().then((function(){console.log("WooCommerce Pixel Manager: "+(wpmDataLayer.version.pro?"Pro":"Free")+" Version "+wpmDataLayer.version.number+" loaded"),jQuery(document).trigger("wpmPreLoadPixels",{})})).then((function(){wpm.pageLoaded().then((function(){jQuery(document).trigger("wpmLoad",{})}))})),wpm.pageReady().then((function(){wpm.wpmDataLayerExists().then((function(){wpm.startIntersectionObserverToWatch(),wpm.startProductsMutationObserverToWatch()}))}))}},t={};function o(a){var r=t[a];if(void 0!==r)return r.exports;var n=t[a]={exports:{}};return e[a](n,n.exports,o),n.exports}o(534),wpm.jQueryExists().then((function(){o(299),o(69),o(12),o(787),o(207)}))})();
2
  //# sourceMappingURL=wpm-public.p1.min.js.map
1
+ (()=>{var e={785:()=>{!function(e,t,a){let o;e.loadFacebookPixel=function(){try{var e,t,a;null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.facebook)&&void 0!==a&&a.pixel_id&&(wpmDataLayer.pixels.facebook.loaded=!0,o=window,r=document,n="script",o.fbq||(i=o.fbq=function(){i.callMethod?i.callMethod.apply(i,arguments):i.queue.push(arguments)},o._fbq||(o._fbq=i),i.push=i,i.loaded=!0,i.version="2.0",i.queue=[],(s=r.createElement(n)).async=!0,s.src="https://connect.facebook.net/en_US/fbevents.js",(d=r.getElementsByTagName(n)[0]).parentNode.insertBefore(s,d)),fbq("init",wpmDataLayer.pixels.facebook.pixel_id),fbq("track","PageView"))}catch(n){console.error(n)}var o,r,n,i,s,d},e.getRandomEventId=function(){return(Math.random()+1).toString(36).substring(2)},e.getFbUserData=function(){return o||e.getFbUserDataFromBrowser()},e.setFbUserData=function(){o=e.getFbUserDataFromBrowser()},e.getFbUserDataFromBrowser=function(){return{fbp:e.getCookie("_fbp"),fbc:e.getCookie("_fbc"),client_user_agent:navigator.userAgent}},e.fbViewContent=function(t){try{var a,o,r;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.facebook)||void 0===r||!r.loaded)return;let n=e.getRandomEventId();fbq("track","ViewContent",{content_type:"product",content_name:t.name,content_ids:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],currency:wpmDataLayer.shop.currency,value:t.price},{eventID:n}),t.currency=wpmDataLayer.shop.currency,jQuery(document).trigger("wpmFbCapiEvent",{event_name:"ViewContent",event_id:n,user_data:e.getFbUserData(),product_data:t,product_id:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],event_source_url:window.location.href})}catch(e){console.error(e)}},e.facebookContentIds=function(){let e=[];for(const[o,r]of Object.entries(wpmDataLayer.order.items)){var t,a;null!==(t=wpmDataLayer)&&void 0!==t&&null!==(a=t.general)&&void 0!==a&&a.variationsOutput&&0!==r.variation_id?e.push(String(wpmDataLayer.products[r.variation_id].dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type])):e.push(String(wpmDataLayer.products[r.id].dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type]))}return e}}(window.wpm=window.wpm||{},jQuery),jQuery(document).on("wpmLoadPixels",(function(){var e,t,a;!wpm.canIFire("ads","facebook-ads")||null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.facebook)&&void 0!==a&&a.loaded||wpm.loadFacebookPixel()})),jQuery(document).on("wpmAddToCart",(function(e,t){try{var a,o,r;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.facebook)||void 0===r||!r.loaded)return;let e=wpm.getRandomEventId();fbq("track","AddToCart",{content_type:"product",content_name:t.name,content_ids:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],value:parseFloat(t.quantity*t.price),currency:t.currency},{eventID:e}),t.currency=wpmDataLayer.shop.currency,jQuery(document).trigger("wpmFbCapiEvent",{event_name:"AddToCart",event_id:e,user_data:wpm.getFbUserData(),product_data:t,product_id:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],event_source_url:window.location.href})}catch(e){console.error(e)}})),jQuery(document).on("wpmBeginCheckout",(function(e){try{var t,a,o;if(null===(t=wpmDataLayer)||void 0===t||null===(a=t.pixels)||void 0===a||null===(o=a.facebook)||void 0===o||!o.loaded)return;let e=wpm.getRandomEventId();fbq("track","InitiateCheckout",{},{eventID:e}),jQuery(document).trigger("wpmFbCapiEvent",{event_name:"InitiateCheckout",event_id:e,user_data:wpm.getFbUserData(),event_source_url:window.location.href})}catch(e){console.error(e)}})),jQuery(document).on("wpmAddToWishlist",(function(e,t){try{var a,o,r;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.facebook)||void 0===r||!r.loaded)return;let e=wpm.getRandomEventId();fbq("track","AddToWishlist",{content_type:"product",content_name:t.name,content_ids:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],value:parseFloat(t.quantity*t.price),currency:t.currency},{eventID:e}),t.currency=wpmDataLayer.shop.currency,jQuery(document).trigger("wpmFbCapiEvent",{event_name:"AddToWishlist",event_id:e,user_data:wpm.getFbUserData(),product_data:t,product_id:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],event_source_url:window.location.href})}catch(e){console.error(e)}})),jQuery(document).on("wpmViewItem",(function(e,t){try{var a,o,r;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.facebook)||void 0===r||!r.loaded)return;wpm.fbViewContent(t)}catch(e){console.error(e)}})),jQuery(document).on("wpmSearch",(function(){try{var e,t,a;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.facebook)||void 0===a||!a.loaded)return;let o=wpm.getRandomEventId();fbq("track","Search",{},{eventID:o}),jQuery(document).trigger("wpmFbCapiEvent",{event_name:"Search",event_id:o,user_data:wpm.getFbUserData(),event_source_url:window.location.href})}catch(e){console.error(e)}})),jQuery(document).on("wpmLoadAlways",(function(){try{var e,t,a;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.facebook)||void 0===a||!a.loaded)return;wpm.setFbUserData()}catch(e){console.error(e)}})),jQuery(document).on("wpmOrderReceivedPage",(function(){try{var e,t,a;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.facebook)||void 0===a||!a.loaded)return;fbq("track","Purchase",{content_type:"product",value:wpmDataLayer.order.value_filtered,currency:wpmDataLayer.order.currency,content_ids:wpm.facebookContentIds()},{eventID:wpmDataLayer.order.id})}catch(e){console.error(e)}}))},234:()=>{!function(e,t,a){let o=[];e.getGoogleAdsConversionIdentifiersWithLabel=function(){for(const[e,t]of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds))o.push(e+"/"+t);return o},e.getGoogleAdsConversionIdentifiers=function(){let e=[];for(const[t,a]of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds))e.push(t);return e},e.getGoogleAdsRegularOrderItems=function(){let e=[];for(const[o,r]of Object.entries(wpmDataLayer.order.items)){var t,a;let o;o={quantity:r.quantity,price:r.price},null!==(t=wpmDataLayer)&&void 0!==t&&null!==(a=t.general)&&void 0!==a&&a.variationsOutput&&0!==r.variation_id?(o.id=String(wpmDataLayer.products[r.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type]),e.push(o)):(o.id=String(wpmDataLayer.products[r.id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type]),e.push(o))}return e},e.getGoogleAdsDynamicRemarketingOrderItems=function(){let e=[];for(const[o,r]of Object.entries(wpmDataLayer.order.items)){var t,a;let o;o={quantity:r.quantity,price:r.price,google_business_vertical:wpmDataLayer.pixels.google.ads.google_business_vertical},null!==(t=wpmDataLayer)&&void 0!==t&&null!==(a=t.general)&&void 0!==a&&a.variationsOutput&&0!==r.variation_id?(o.id=String(wpmDataLayer.products[r.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type]),e.push(o)):(o.id=String(wpmDataLayer.products[r.id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type]),e.push(o))}return e}}(window.wpm=window.wpm||{},jQuery),jQuery(document).on("wpmViewItemList",(function(e,t){try{var a,o,r,n,i,s,d,l,c,u,p;if(jQuery.isEmptyObject(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r||null===(n=r.ads)||void 0===n?void 0:n.conversionIds))return;if(null===(i=wpmDataLayer)||void 0===i||null===(s=i.pixels)||void 0===s||null===(d=s.google)||void 0===d||null===(l=d.ads)||void 0===l||null===(c=l.dynamic_remarketing)||void 0===c||!c.status)return;if(!wpm.googleConfigConditionsMet("ads"))return;if(null!==(u=wpmDataLayer)&&void 0!==u&&null!==(p=u.general)&&void 0!==p&&p.variationsOutput&&t.isVariable&&!1===wpmDataLayer.pixels.google.ads.dynamic_remarketing.send_events_with_parent_ids)return;if(!t)return;wpm.gtagLoaded().then((function(){gtag("event","view_item_list",{send_to:wpm.getGoogleAdsConversionIdentifiers(),items:[{id:t.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],google_business_vertical:wpmDataLayer.pixels.google.ads.google_business_vertical}]})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmAddToCart",(function(e,t){try{var a,o,r,n,i,s,d,l,c;if(jQuery.isEmptyObject(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r||null===(n=r.ads)||void 0===n?void 0:n.conversionIds))return;if(null===(i=wpmDataLayer)||void 0===i||null===(s=i.pixels)||void 0===s||null===(d=s.google)||void 0===d||null===(l=d.ads)||void 0===l||null===(c=l.dynamic_remarketing)||void 0===c||!c.status)return;if(!wpm.googleConfigConditionsMet("ads"))return;wpm.gtagLoaded().then((function(){gtag("event","add_to_cart",{send_to:wpm.getGoogleAdsConversionIdentifiers(),value:t.quantity*t.price,items:[{id:t.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],quantity:t.quantity,price:t.price,google_business_vertical:wpmDataLayer.pixels.google.ads.google_business_vertical}]})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmViewItem",(function(e,t){try{var a,o,r,n,i,s,d,l,c;if(jQuery.isEmptyObject(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r||null===(n=r.ads)||void 0===n?void 0:n.conversionIds))return;if(null===(i=wpmDataLayer)||void 0===i||null===(s=i.pixels)||void 0===s||null===(d=s.google)||void 0===d||null===(l=d.ads)||void 0===l||null===(c=l.dynamic_remarketing)||void 0===c||!c.status)return;if(!wpm.googleConfigConditionsMet("ads"))return;wpm.gtagLoaded().then((function(){gtag("event","view_item",{send_to:wpm.getGoogleAdsConversionIdentifiers(),value:(t.quantity?t.quantity:1)*t.price,items:[{id:t.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],quantity:t.quantity?t.quantity:1,price:t.price,google_business_vertical:wpmDataLayer.pixels.google.ads.google_business_vertical}]})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmSearch",(function(){try{var e,t,a,o,r,n,i,s,d;if(jQuery.isEmptyObject(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.google)||void 0===a||null===(o=a.ads)||void 0===o?void 0:o.conversionIds))return;if(null===(r=wpmDataLayer)||void 0===r||null===(n=r.pixels)||void 0===n||null===(i=n.google)||void 0===i||null===(s=i.ads)||void 0===s||null===(d=s.dynamic_remarketing)||void 0===d||!d.status)return;if(!wpm.googleConfigConditionsMet("ads"))return;let u=[];for(const[e,t]of Object.entries(wpmDataLayer.products)){var l,c;if(null!==(l=wpmDataLayer)&&void 0!==l&&null!==(c=l.general)&&void 0!==c&&c.variationsOutput&&t.isVariable&&!1===wpmDataLayer.pixels.google.ads.dynamic_remarketing.send_events_with_parent_ids)return;u.push({id:t.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],google_business_vertical:wpmDataLayer.pixels.google.ads.google_business_vertical})}wpm.gtagLoaded().then((function(){gtag("event","view_search_results",{send_to:wpm.getGoogleAdsConversionIdentifiers(),items:u})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmOrderReceivedPage",(function(){try{var e,t,a,o,r,n,i,s,d;if(jQuery.isEmptyObject(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.google)||void 0===a||null===(o=a.ads)||void 0===o?void 0:o.conversionIds))return;if(null===(r=wpmDataLayer)||void 0===r||null===(n=r.pixels)||void 0===n||null===(i=n.google)||void 0===i||null===(s=i.ads)||void 0===s||null===(d=s.dynamic_remarketing)||void 0===d||!d.status)return;if(!wpm.googleConfigConditionsMet("ads"))return;wpm.gtagLoaded().then((function(){gtag("event","purchase",{send_to:wpm.getGoogleAdsConversionIdentifiers(),value:wpmDataLayer.order.value_filtered,items:wpm.getGoogleAdsDynamicRemarketingOrderItems()})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmLogin",(function(){try{var e,t,a,o,r,n,i,s,d;if(jQuery.isEmptyObject(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.google)||void 0===a||null===(o=a.ads)||void 0===o?void 0:o.conversionIds))return;if(null===(r=wpmDataLayer)||void 0===r||null===(n=r.pixels)||void 0===n||null===(i=n.google)||void 0===i||null===(s=i.ads)||void 0===s||null===(d=s.dynamic_remarketing)||void 0===d||!d.status)return;if(!wpm.googleConfigConditionsMet("ads"))return;wpm.gtagLoaded().then((function(){gtag("event","login",{send_to:wpm.getGoogleAdsConversionIdentifiers()})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmOrderReceivedPage",(function(){try{var e,t,a,o,r,n;if(jQuery.isEmptyObject(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.google)||void 0===a||null===(o=a.ads)||void 0===o?void 0:o.conversionIds))return;if(!wpm.googleConfigConditionsMet("ads"))return;let i={},s={};i={send_to:wpm.getGoogleAdsConversionIdentifiersWithLabel(),transaction_id:wpmDataLayer.order.number,value:wpmDataLayer.order.value_filtered,currency:wpmDataLayer.order.currency,new_customer:wpmDataLayer.order.new_customer},null!==(r=wpmDataLayer)&&void 0!==r&&null!==(n=r.order)&&void 0!==n&&n.aw_merchant_id&&(s={discount:wpmDataLayer.order.discount,aw_merchant_id:wpmDataLayer.order.aw_merchant_id,aw_feed_country:wpmDataLayer.order.aw_feed_country,aw_feed_language:wpmDataLayer.order.aw_feed_language,items:wpm.getGoogleAdsRegularOrderItems()}),wpm.gtagLoaded().then((function(){gtag("event","conversion",{...i,...s})}))}catch(e){console.error(e)}}))},464:()=>{!function(e,t,a){e.getGA4OrderItems=function(){let e=[];for(const[o,r]of Object.entries(wpmDataLayer.order.items)){var t,a;let o;o={quantity:r.quantity,price:r.price,item_name:r.name,currency:wpmDataLayer.order.currency,item_category:wpmDataLayer.products[r.id].category.join("/")},null!==(t=wpmDataLayer)&&void 0!==t&&null!==(a=t.general)&&void 0!==a&&a.variationsOutput&&0!==r.variation_id?(o.item_id=String(wpmDataLayer.products[r.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type]),o.item_variant=wpmDataLayer.products[r.variation_id].variant_name,o.item_brand=wpmDataLayer.products[r.variation_id].brand,e.push(o)):(o.item_id=String(wpmDataLayer.products[r.id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type]),o.item_brand=wpmDataLayer.products[r.id].brand,e.push(o))}return e}}(window.wpm=window.wpm||{},jQuery),jQuery(document).on("wpmOrderReceivedPage",(function(){try{var e,t,a,o,r,n,i,s,d,l;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.google)||void 0===a||null===(o=a.analytics)||void 0===o||null===(r=o.ga4)||void 0===r||!r.measurement_id)return;if(null!==(n=wpmDataLayer)&&void 0!==n&&null!==(i=n.pixels)&&void 0!==i&&null!==(s=i.google)&&void 0!==s&&null!==(d=s.analytics)&&void 0!==d&&null!==(l=d.ga4)&&void 0!==l&&l.mp_active)return;if(!wpm.googleConfigConditionsMet("analytics"))return;wpm.gtagLoaded().then((function(){gtag("event","purchase",{send_to:[wpmDataLayer.pixels.google.analytics.ga4.measurement_id],transaction_id:wpmDataLayer.order.number,affiliation:wpmDataLayer.order.affiliation,currency:wpmDataLayer.order.currency,value:wpmDataLayer.order.value_regular,discount:wpmDataLayer.order.discount,tax:wpmDataLayer.order.tax,shipping:wpmDataLayer.order.shipping,coupon:wpmDataLayer.order.coupon,items:wpm.getGA4OrderItems()})}))}catch(e){console.error(e)}}))},354:()=>{!function(e,t,a){e.getGAUAOrderItems=function(){let e=[],t=1;for(const[r,n]of Object.entries(wpmDataLayer.order.items)){var a,o;let r;r={quantity:n.quantity,price:n.price,item_name:n.name,currency:wpmDataLayer.order.currency,item_category:wpmDataLayer.products[n.id].category.join("/"),list_position:t},null!==(a=wpmDataLayer)&&void 0!==a&&null!==(o=a.general)&&void 0!==o&&o.variationsOutput&&0!==n.variation_id?(r.id=String(wpmDataLayer.products[n.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type]),r.variant=wpmDataLayer.products[n.variation_id].variant_name,r.item_brand=wpmDataLayer.products[n.variation_id].brand,e.push(r)):(r.id=String(wpmDataLayer.products[n.id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type]),r.item_brand=wpmDataLayer.products[n.id].brand,e.push(r)),t++}return e}}(window.wpm=window.wpm||{},jQuery),jQuery(document).on("wpmOrderReceivedPage",(function(){try{var e,t,a,o,r,n,i,s,d,l;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.google)||void 0===a||null===(o=a.analytics)||void 0===o||null===(r=o.universal)||void 0===r||!r.property_id)return;if(null!==(n=wpmDataLayer)&&void 0!==n&&null!==(i=n.pixels)&&void 0!==i&&null!==(s=i.google)&&void 0!==s&&null!==(d=s.analytics)&&void 0!==d&&null!==(l=d.universal)&&void 0!==l&&l.mp_active)return;if(!wpm.googleConfigConditionsMet("analytics"))return;wpm.gtagLoaded().then((function(){gtag("event","purchase",{send_to:[wpmDataLayer.pixels.google.analytics.universal.property_id],transaction_id:wpmDataLayer.order.number,affiliation:wpmDataLayer.order.affiliation,currency:wpmDataLayer.order.currency,value:wpmDataLayer.order.value_regular,discount:wpmDataLayer.order.discount,tax:wpmDataLayer.order.tax,shipping:wpmDataLayer.order.shipping,coupon:wpmDataLayer.order.coupon,items:wpm.getGAUAOrderItems()})}))}catch(e){console.error(e)}}))},497:()=>{!function(e,t,a){e.load_google_optimize_pixel=function(){try{var t,a,o,r;null!==(t=wpmDataLayer)&&void 0!==t&&null!==(a=t.pixels)&&void 0!==a&&null!==(o=a.google)&&void 0!==o&&null!==(r=o.optimize)&&void 0!==r&&r.container_id&&(wpmDataLayer.pixels.google.optimize.loaded=!0,e.loadScriptAndCacheIt("https://www.googleoptimize.com/optimize.js?id="+wpmDataLayer.pixels.google.optimize.container_id))}catch(e){console.error(e)}}}(window.wpm=window.wpm||{},jQuery),jQuery(document).on("wpmLoadPixels",(function(){var e,t,a,o;!wpm.canIFire("analytics","google-optimize")||null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.google)&&void 0!==a&&null!==(o=a.optimize)&&void 0!==o&&o.loaded||wpm.load_google_optimize_pixel()}))},577:()=>{!function(e,t,a){e.googleConfigConditionsMet=function(t){var a,o,r,n;return!(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r||null===(n=r.consent_mode)||void 0===n||!n.active)||("category"===e.getConsentValues().mode?!0===e.getConsentValues().categories[t]:"pixel"===e.getConsentValues().mode&&e.getConsentValues().pixels.includes("google-"+t))},e.getVisitorConsentStatusAndUpdateGoogleConsentSettings=function(t){return"category"===e.getConsentValues().mode?(e.getConsentValues().categories.analytics&&(t.analytics_storage="granted"),e.getConsentValues().categories.ads&&(t.ad_storage="granted")):"pixel"===e.getConsentValues().mode&&(t.analytics_storage=e.getConsentValues().pixels.includes("google-analytics")?"granted":"denied",t.ad_storage=e.getConsentValues().pixels.includes("google-ads")?"granted":"denied"),t},e.updateGoogleConsentMode=function(){let e=!(arguments.length>0&&arguments[0]!==a)||arguments[0],t=!(arguments.length>1&&arguments[1]!==a)||arguments[1];try{if(!window.gtag||!wpmDataLayer.shop.cookie_consent_mgmt.explicit_consent)return;gtag("consent","update",{analytics_storage:e?"granted":"denied",ad_storage:t?"granted":"denied"})}catch(e){console.error(e)}},e.fireGtagGoogleAds=function(){try{var e,t,a,o,r,n,i,s,d,l,c,u,p,g,m,y,w,v,f,_,h;if(wpmDataLayer.pixels.google.ads.state="loading",null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.google)&&void 0!==a&&null!==(o=a.ads)&&void 0!==o&&null!==(r=o.enhanced_conversions)&&void 0!==r&&r.active)for(const[e,t]of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds))gtag("config",e,{allow_enhanced_conversions:!0});else for(const[e,t]of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds))gtag("config",e);null!==(n=wpmDataLayer)&&void 0!==n&&null!==(i=n.pixels)&&void 0!==i&&null!==(s=i.google)&&void 0!==s&&null!==(d=s.ads)&&void 0!==d&&d.conversionIds&&null!==(l=wpmDataLayer)&&void 0!==l&&null!==(c=l.pixels)&&void 0!==c&&null!==(u=c.google)&&void 0!==u&&null!==(p=u.ads)&&void 0!==p&&p.phone_conversion_label&&null!==(g=wpmDataLayer)&&void 0!==g&&null!==(m=g.pixels)&&void 0!==m&&null!==(y=m.google)&&void 0!==y&&null!==(w=y.ads)&&void 0!==w&&w.phone_conversion_number&&gtag("config",Object.keys(wpmDataLayer.pixels.google.ads.conversionIds)[0]+"/"+wpmDataLayer.pixels.google.ads.phone_conversion_label,{phone_conversion_number:wpmDataLayer.pixels.google.ads.phone_conversion_number}),"order_received_page"===wpmDataLayer.shop.page_type&&null!==(v=wpmDataLayer)&&void 0!==v&&null!==(f=v.order)&&void 0!==f&&null!==(_=f.google)&&void 0!==_&&null!==(h=_.ads)&&void 0!==h&&h.enhanced_conversion_data&&(window.enhanced_conversion_data=wpmDataLayer.order.google.ads.enhanced_conversion_data),wpmDataLayer.pixels.google.ads.state="ready"}catch(e){console.error(e)}},e.fireGtagGoogleAnalyticsUA=function(){try{wpmDataLayer.pixels.google.analytics.universal.state="loading",gtag("config",wpmDataLayer.pixels.google.analytics.universal.property_id,wpmDataLayer.pixels.google.analytics.universal.parameters),wpmDataLayer.pixels.google.analytics.universal.state="ready"}catch(e){console.error(e)}},e.fireGtagGoogleAnalyticsGA4=function(){try{wpmDataLayer.pixels.google.analytics.ga4.state="loading",gtag("config",wpmDataLayer.pixels.google.analytics.ga4.measurement_id,wpmDataLayer.pixels.google.analytics.ga4.parameters),wpmDataLayer.pixels.google.analytics.ga4.state="ready"}catch(e){console.error(e)}},e.isGoogleActive=function(){var e,t,a,o,r,n,i,s,d,l,c,u,p,g;return!(!(null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.google)&&void 0!==a&&null!==(o=a.analytics)&&void 0!==o&&null!==(r=o.universal)&&void 0!==r&&r.property_id||null!==(n=wpmDataLayer)&&void 0!==n&&null!==(i=n.pixels)&&void 0!==i&&null!==(s=i.google)&&void 0!==s&&null!==(d=s.analytics)&&void 0!==d&&null!==(l=d.ga4)&&void 0!==l&&l.measurement_id)&&jQuery.isEmptyObject(null===(c=wpmDataLayer)||void 0===c||null===(u=c.pixels)||void 0===u||null===(p=u.google)||void 0===p||null===(g=p.ads)||void 0===g?void 0:g.conversionIds))},e.getGoogleGtagId=function(){var e,t,a,o,r,n,i,s,d,l;return null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.google)&&void 0!==a&&null!==(o=a.analytics)&&void 0!==o&&null!==(r=o.universal)&&void 0!==r&&r.property_id?wpmDataLayer.pixels.google.analytics.universal.property_id:null!==(n=wpmDataLayer)&&void 0!==n&&null!==(i=n.pixels)&&void 0!==i&&null!==(s=i.google)&&void 0!==s&&null!==(d=s.analytics)&&void 0!==d&&null!==(l=d.ga4)&&void 0!==l&&l.measurement_id?wpmDataLayer.pixels.google.analytics.ga4.measurement_id:Object.keys(wpmDataLayer.pixels.google.ads.conversionIds)[0]},e.loadGoogle=function(){e.isGoogleActive()&&(wpmDataLayer.pixels.google.state="loading",e.loadScriptAndCacheIt("https://www.googletagmanager.com/gtag/js?id="+e.getGoogleGtagId()).done((function(t,a){try{var o,r,n,i,s,d,l,c,u,p,g,m,y,w,v,f,_,h,L,D,C,j;if(window.dataLayer=window.dataLayer||[],window.gtag=function(){dataLayer.push(arguments)},null!==(o=wpmDataLayer)&&void 0!==o&&null!==(r=o.pixels)&&void 0!==r&&null!==(n=r.google)&&void 0!==n&&null!==(i=n.consent_mode)&&void 0!==i&&i.active){var b,x,k,I;let t={ad_storage:wpmDataLayer.pixels.google.consent_mode.ad_storage,analytics_storage:wpmDataLayer.pixels.google.consent_mode.analytics_storage,wait_for_update:wpmDataLayer.pixels.google.consent_mode.wait_for_update};null!==(b=wpmDataLayer)&&void 0!==b&&null!==(x=b.pixels)&&void 0!==x&&null!==(k=x.google)&&void 0!==k&&null!==(I=k.consent_mode)&&void 0!==I&&I.region&&(t.region=wpmDataLayer.pixels.google.consent_mode.region),t=e.getVisitorConsentStatusAndUpdateGoogleConsentSettings(t),gtag("consent","default",t),gtag("set","ads_data_redaction",wpmDataLayer.pixels.google.consent_mode.ads_data_redaction),gtag("set","url_passthrough",wpmDataLayer.pixels.google.consent_mode.url_passthrough)}null!==(s=wpmDataLayer)&&void 0!==s&&null!==(d=s.pixels)&&void 0!==d&&null!==(l=d.google)&&void 0!==l&&null!==(c=l.linker)&&void 0!==c&&c.settings&&gtag("set","linker",wpmDataLayer.pixels.google.linker.settings),gtag("js",new Date),e.googleConfigConditionsMet("ads")&&!jQuery.isEmptyObject(null===(u=wpmDataLayer)||void 0===u||null===(p=u.pixels)||void 0===p||null===(g=p.google)||void 0===g||null===(m=g.ads)||void 0===m?void 0:m.conversionIds)&&e.fireGtagGoogleAds(),e.googleConfigConditionsMet("analytics")&&null!==(y=wpmDataLayer)&&void 0!==y&&null!==(w=y.pixels)&&void 0!==w&&null!==(v=w.google)&&void 0!==v&&null!==(f=v.analytics)&&void 0!==f&&null!==(_=f.universal)&&void 0!==_&&_.property_id&&e.fireGtagGoogleAnalyticsUA(),e.googleConfigConditionsMet("analytics")&&null!==(h=wpmDataLayer)&&void 0!==h&&null!==(L=h.pixels)&&void 0!==L&&null!==(D=L.google)&&void 0!==D&&null!==(C=D.analytics)&&void 0!==C&&null!==(j=C.ga4)&&void 0!==j&&j.measurement_id&&e.fireGtagGoogleAnalyticsGA4(),wpmDataLayer.pixels.google.state="ready"}catch(e){console.error(e)}})))},e.canGoogleLoad=function(){var t,a,o,r;return!(null===(t=wpmDataLayer)||void 0===t||null===(a=t.pixels)||void 0===a||null===(o=a.google)||void 0===o||null===(r=o.consent_mode)||void 0===r||!r.active)||("category"===e.getConsentValues().mode?!(!e.getConsentValues().categories.ads&&!e.getConsentValues().categories.analytics):"pixel"===e.getConsentValues().mode?e.getConsentValues().pixels.includes("google-ads")||e.getConsentValues().pixels.includes("google-analytics"):(console.error("Couldn't find a valid load condition for Google mode in wpmConsentValues"),!1))},e.gtagLoaded=function(){return new Promise((function(e,t){var a,o,r;void 0===(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r?void 0:r.state)&&t();let n=0;!function a(){var o,r,i;return"ready"===(null===(o=wpmDataLayer)||void 0===o||null===(r=o.pixels)||void 0===r||null===(i=r.google)||void 0===i?void 0:i.state)?e():n>=5e3?t():(n+=200,void setTimeout(a,200))}()}))}}(window.wpm=window.wpm||{},jQuery),jQuery(document).on("wpmLoadPixels",(function(){var e,t,a;wpm.canGoogleLoad()&&void 0===(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.google)||void 0===a?void 0:a.state)&&wpm.loadGoogle()}))},570:()=>{!function(e,t,a){e.load_hotjar_pixel=function(){var e,t,a,o,r,n,i;null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.hotjar)&&void 0!==a&&a.site_id&&(wpmDataLayer.pixels.hotjar.loaded=!0,o=window,r=document,o.hj=o.hj||function(){(o.hj.q=o.hj.q||[]).push(arguments)},o._hjSettings={hjid:wpmDataLayer.pixels.hotjar.site_id,hjsv:6},n=r.getElementsByTagName("head")[0],(i=r.createElement("script")).async=1,i.src="https://static.hotjar.com/c/hotjar-"+o._hjSettings.hjid+".js?sv="+o._hjSettings.hjsv,n.appendChild(i))}}(window.wpm=window.wpm||{},jQuery),jQuery(document).on("wpmLoadPixels",(function(){var e,t,a;!wpm.canIFire("analytics","hotjar")||null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.hotjar)&&void 0!==a&&a.loaded||wpm.load_hotjar_pixel()}))},560:()=>{wpm.wpmDataLayerExists().then((function(){jQuery(document).trigger("wpmPreLoadPixels",{})})).then((function(){wpm.pageLoaded().then((function(){jQuery(document).trigger("wpmLoad",{})}))}))},230:()=>{!function(e,t,a){const o="_wpm_order_ids",r="_wpm_endpoint_available",n="/wp-json/";function i(){return""!==e.getCookie(o)}e.emailSelected=!1,e.paymentMethodSelected=!1,e.useRestEndpoint=function(){return e.isSessionStorageAvailable()&&e.isRestEndpointAvailable()&&e.isBelowRestErrorThreshold()},e.isBelowRestErrorThreshold=function(){return window.sessionStorage.getItem(0)<=10},e.isRestEndpointAvailable=function(){if(window.sessionStorage.getItem(r))return JSON.parse(window.sessionStorage.getItem(r));e.testEndpoint()},e.isSessionStorageAvailable=function(){return!!window.sessionStorage},e.testEndpoint=function(){let e=arguments.length>0&&arguments[0]!==a?arguments[0]:location.protocol+"//"+location.host+n,t=arguments.length>1&&arguments[1]!==a?arguments[1]:r;jQuery.ajax(e,{type:"HEAD",timeout:1e3,statusCode:{200:function(e){window.sessionStorage.setItem(t,JSON.stringify(!0))},404:function(e){window.sessionStorage.setItem(t,JSON.stringify(!1))},0:function(e){window.sessionStorage.setItem(t,JSON.stringify(!1))}}}).then((e=>{}))},e.isWpmRestEndpointAvailable=function(){let t=arguments.length>0&&arguments[0]!==a?arguments[0]:r;return!!e.getCookie(t)},e.writeOrderIdToStorage=function(t){if(window.Storage)if(null===localStorage.getItem(o)){let e=[];e.push(t),window.localStorage.setItem(o,JSON.stringify(e))}else{let e=JSON.parse(localStorage.getItem(o));e.includes(t)||(e.push(t),window.localStorage.setItem(o,JSON.stringify(e)))}else{let a=new Date;a.setDate(a.getDate()+365);let r=[];i()&&(r=JSON.parse(e.getCookie(o))),r.includes(t)||(r.push(t),document.cookie="_wpm_order_ids="+JSON.stringify(r)+";expires="+a.toUTCString())}"function"==typeof e.storeOrderIdOnServer&&wpmDataLayer.orderDeduplication&&e.storeOrderIdOnServer(t)},e.isOrderIdStored=function(t){return wpmDataLayer.orderDeduplication?window.Storage?null!==localStorage.getItem(o)&&JSON.parse(localStorage.getItem(o)).includes(t):!!i()&&JSON.parse(e.getCookie(o)).includes(t):(console.log("order duplication prevention: off"),!1)},e.isEmail=function(e){return/^(([^<>()\[\]\\.,;:\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,}))$/.test(e)},e.removeProductFromCart=function(t){let o=arguments.length>1&&arguments[1]!==a?arguments[1]:null;try{if(!t)throw Error("Wasn't able to retrieve a productId");if(!(t=getIdBasedOndVariationsOutputSetting(t)))throw Error("Wasn't able to retrieve a productId");let a;if(a=null==o?wpmDataLayer.cart[t].quantity:o,wpmDataLayer.cart[t]){let r=e.getProductDetailsFormattedForEvent(t,a);jQuery(document).trigger("wpmRemoveFromCart",r),null==o||wpmDataLayer.cart[t].quantity===o?(delete wpmDataLayer.cart[t],sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(wpmDataLayer.cart))):(wpmDataLayer.cart[t].quantity=wpmDataLayer.cart[t].quantity-a,sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(wpmDataLayer.cart)))}}catch(e){console.error(e)}},getIdBasedOndVariationsOutputSetting=function(e){try{var t,a;return null!==(t=wpmDataLayer)&&void 0!==t&&null!==(a=t.general)&&void 0!==a&&a.variationsOutput?e:wpmDataLayer.products[e].isVariation?wpmDataLayer.products[e].parentId:e}catch(e){console.error(e)}},e.addProductToCart=function(t,o){try{if(!t)throw Error("Wasn't able to retrieve a productId");if(!(t=getIdBasedOndVariationsOutputSetting(t)))throw Error("Wasn't able to retrieve a productId");if(wpmDataLayer.products[t]){let r=e.getProductDetailsFormattedForEvent(t,o);jQuery(document).trigger("wpmAddToCart",r),wpmDataLayer.cart!==a&&wpmDataLayer.cart[t]!==a?(wpmDataLayer.cart[t].quantity=wpmDataLayer.cart[t].quantity+o,sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(wpmDataLayer.cart))):wpmDataLayer.cart?(wpmDataLayer.cart[t]=e.getProductDetailsFormattedForEvent(t,o),sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(wpmDataLayer.cart))):(wpmDataLayer.cart={[t]:e.getProductDetailsFormattedForEvent(t,o)},sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(wpmDataLayer.cart)))}}catch(t){console.error(t),e.getCartItemsFromBackend()}},e.getCartItems=function(){sessionStorage?sessionStorage.getItem("wpmDataLayerCart")&&"order_received_page"!==wpmDataLayer.shop.page_type?e.saveCartObjectToDataLayer(JSON.parse(sessionStorage.getItem("wpmDataLayerCart"))):sessionStorage.setItem("wpmDataLayerCart",JSON.stringify({})):e.getCartItemsFromBackend()},e.getCartItemsFromBackend=function(){try{let t={action:"wpm_get_cart_items"};jQuery.ajax({type:"get",dataType:"json",url:e.ajax_url,data:t,success:function(t){t.cart||(t.cart={}),e.saveCartObjectToDataLayer(t.cart),sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(t.cart))}})}catch(e){console.error(e)}},e.getProductsFromBackend=function(t){if((t=t.filter((e=>!wpmDataLayer.products.hasOwnProperty(e))))&&0!==t.length)try{let a={action:"wpm_get_product_ids",productIds:t};jQuery.ajax({type:"get",dataType:"json",url:e.ajax_url,data:a,success:function(e){wpmDataLayer.products=Object.assign({},wpmDataLayer.products,e)},error:function(e){console.log(e)}})}catch(e){console.error(e)}},e.saveCartObjectToDataLayer=function(e){wpmDataLayer.cart=e,wpmDataLayer.products=Object.assign({},wpmDataLayer.products,e)},e.fireCheckoutOption=function(e){let t=arguments.length>1&&arguments[1]!==a?arguments[1]:null,o=arguments.length>2&&arguments[2]!==a?arguments[2]:null,r={step:e,checkout_option:t,value:o};jQuery(document).trigger("wpmFireCheckoutOption",r)},e.fireCheckoutProgress=function(e){let t={step:e};jQuery(document).trigger("wpmFireCheckoutProgress",t)},e.getPostIdFromString=function(e){try{return e.match(/(post-)(\d+)/)[2]}catch(e){console.error(e)}},e.triggerViewItemList=function(t){if(!t)throw Error("Wasn't able to retrieve a productId");if(!(t=getIdBasedOndVariationsOutputSetting(t)))throw Error("Wasn't able to retrieve a productId");jQuery(document).trigger("wpmViewItemList",e.getProductDataForViewItemEvent(t))},e.getProductDataForViewItemEvent=function(t){if(!t)throw Error("Wasn't able to retrieve a productId");try{if(wpmDataLayer.products[t])return e.getProductDetailsFormattedForEvent(t)}catch(e){console.error(e)}},e.getMainProductIdFromProductPage=function(){try{return["simple","variable","grouped","composite","bundle"].indexOf(wpmDataLayer.shop.product_type)>=0&&jQuery(".wpmProductId:first").data("id")}catch(e){console.error(e)}},e.viewItemListTriggerTestMode=function(e){jQuery(e).css({position:"relative"}),jQuery(e).append('<div id="viewItemListTriggerOverlay"></div>'),jQuery(e).find("#viewItemListTriggerOverlay").css({"z-index":"10",display:"block",position:"absolute",height:"100%",top:"0",left:"0",right:"0",opacity:wpmDataLayer.viewItemListTrigger.opacity,"background-color":wpmDataLayer.viewItemListTrigger.backgroundColor})},e.getSearchTermFromUrl=function(){try{return new URLSearchParams(window.location.search).get("s")}catch(e){console.error(e)}};let s,d={};e.observerCallback=function(t,a){t.forEach((t=>{try{let o,r=jQuery(t.target).data("ioid");if(o=jQuery(t.target).next(".wpmProductId").length?jQuery(t.target).next(".wpmProductId").data("id"):jQuery(t.target).find(".wpmProductId").data("id"),!o)throw Error("wpmProductId element not found");t.isIntersecting?d[r]=setTimeout((()=>{e.triggerViewItemList(o),wpmDataLayer.viewItemListTrigger.testMode&&e.viewItemListTriggerTestMode(t.target),!1===wpmDataLayer.viewItemListTrigger.repeat&&a.unobserve(t.target)}),wpmDataLayer.viewItemListTrigger.timeout):(clearTimeout(d[r]),wpmDataLayer.viewItemListTrigger.testMode&&jQuery(t.target).find("#viewItemListTriggerOverlay").remove())}catch(e){console.error(e)}}))};let l,c=0;e.startIntersectionObserverToWatch=function(){try{new URLSearchParams(window.location.search).has("vildemomode")&&(wpmDataLayer.viewItemListTrigger.testMode=!0),s=new IntersectionObserver(e.observerCallback,{threshold:wpmDataLayer.viewItemListTrigger.threshold}),l=jQuery(".wpmProductId").map((function(e,t){return jQuery(t).parent().hasClass("type-product")||jQuery(t).parent().hasClass("product")||jQuery(t).parent().hasClass("product-item-inner")?jQuery(t).parent():jQuery(t).prev().hasClass("wc-block-grid__product")||jQuery(t).prev().hasClass("product")||jQuery(t).prev().hasClass("product-small")||jQuery(t).prev().hasClass("woocommerce-LoopProduct-link")?jQuery(this).prev():jQuery(t).closest(".product").length?jQuery(t).closest(".product"):void 0})),l.each((function(e,t){jQuery(t[0]).data("ioid",c++),s.observe(t[0])}))}catch(e){console.error(e)}},e.startProductsMutationObserverToWatch=function(){try{let e=jQuery(".wpmProductId:eq(0)").parents().has(jQuery(".wpmProductId:eq(1)").parents()).first();e.length&&u.observe(e[0],{attributes:!0,childList:!0,characterData:!0})}catch(e){console.error(e)}};let u=new MutationObserver((function(e){e.forEach((function(e){let t=e.addedNodes;null!==t&&jQuery(t).each((function(){(jQuery(this).hasClass("type-product")||jQuery(this).hasClass("product-small")||jQuery(this).hasClass("wc-block-grid__product"))&&p(this)&&(jQuery(this).data("ioid",c++),s.observe(this))}))}))})),p=function(e){return!(!jQuery(e).find(".wpmProductId").length&&!jQuery(e).siblings(".wpmProductId").length)};e.setCookie=function(e){let t=arguments.length>1&&arguments[1]!==a?arguments[1]:"",o=arguments.length>2&&arguments[2]!==a?arguments[2]:null;if(o){let a=new Date;a.setTime(a.getTime()+24*o*60*60*1e3);let r="expires="+a.toUTCString();document.cookie=e+"="+t+";"+r+";path=/"}else document.cookie=e+"="+t+";path=/"},e.getCookie=function(e){let t=e+"=",a=decodeURIComponent(document.cookie).split(";");for(let e=0;e<a.length;e++){let o=a[e];for(;" "==o.charAt(0);)o=o.substring(1);if(0==o.indexOf(t))return o.substring(t.length,o.length)}return""},e.getWpmSessionData=function(){if(window.sessionStorage){let e=window.sessionStorage.getItem("_wpm");return null!==e?JSON.parse(e):{}}return{}},e.setWpmSessionData=function(e){window.sessionStorage&&window.sessionStorage.setItem("_wpm",JSON.stringify(e))},e.storeOrderIdOnServer=function(t){try{let a={action:"wpm_purchase_pixels_fired",order_id:t,nonce:e.nonce};jQuery.ajax({type:"post",dataType:"json",url:e.ajax_url,data:a,success:function(e){!1===e.success&&console.log(e)},error:function(e){console.log(e)}})}catch(e){console.error(e)}},e.getProductIdByCartItemKeyUrl=function(e){let t=new URLSearchParams(e.search).get("remove_item"),a=null;return a=0===wpmDataLayer.cartItemKeys[t].variation_id?wpmDataLayer.cartItemKeys[t].product_id:wpmDataLayer.cartItemKeys[t].variation_id,a},e.getAddToCartLinkProductIds=function(){return jQuery("a").map((function(){let e=jQuery(this).attr("href");if(e&&e.includes("?add-to-cart=")){let t=e.match(/(add-to-cart=)(\d+)/);if(t)return t[2]}})).get()},e.getProductDetailsFormattedForEvent=function(e){let t=arguments.length>1&&arguments[1]!==a?arguments[1]:1,o={id:e.toString(),dyn_r_ids:wpmDataLayer.products[e].dyn_r_ids,name:wpmDataLayer.products[e].name,list_name:wpmDataLayer.shop.list_name,brand:wpmDataLayer.products[e].brand,category:wpmDataLayer.products[e].category,variant:wpmDataLayer.products[e].variant,list_position:wpmDataLayer.products[e].position,quantity:t,price:wpmDataLayer.products[e].price,currency:wpmDataLayer.shop.currency,isVariable:wpmDataLayer.products[e].isVariable,isVariation:wpmDataLayer.products[e].isVariation,parentId:wpmDataLayer.products[e].parentId};return o.isVariation&&(o.parentId_dyn_r_ids=wpmDataLayer.products[e].parentId_dyn_r_ids),o},e.setReferrerToCookie=function(){e.getCookie("wpmReferrer")||e.setCookie("wpmReferrer",document.referrer)},e.getReferrerFromCookie=function(){return e.getCookie("wpmReferrer")?e.getCookie("wpmReferrer"):null},e.getClidFromBrowser=function(){let t,o=arguments.length>0&&arguments[0]!==a?arguments[0]:"gclid";return t={gclid:"_gcl_aw",dclid:"_gcl_dc"},e.getCookie(t[o])?e.getCookie(t[o]).match(/(GCL.[\d]*.)(.*)/)[2]:""},e.getUserAgent=function(){return navigator.userAgent},e.getViewPort=function(){return{width:Math.max(document.documentElement.clientWidth||0,window.innerWidth||0),height:Math.max(document.documentElement.clientHeight||0,window.innerHeight||0)}};let g=function(){let t=e.getCookie("cmplz_statistics"),a=e.getCookie("cmplz_marketing");return!(!e.getCookie("cmplz_consent_status")&&!e.getCookie("cmplz_banner-status"))&&{analytics:"allow"===t,ads:"allow"===a,visitorHasChosen:!0}},m=function(){let t=e.getCookie("cookielawinfo-checkbox-analytics"),a=e.getCookie("cookielawinfo-checkbox-advertisement"),o=e.getCookie("CookieLawInfoConsent");return!(!t&&!a)&&{analytics:"yes"===t,ads:"yes"===a,visitorHasChosen:!!o}},y={categories:{},pixels:[],mode:"category",visitorHasChosen:!1};e.getConsentValues=function(){return y},e.setConsentValueCategories=function(){let e=arguments.length>0&&arguments[0]!==a&&arguments[0],t=arguments.length>1&&arguments[1]!==a&&arguments[1];y.categories.analytics=e,y.categories.ads=t},e.updateConsentCookieValues=function(){let t,o=arguments.length>0&&arguments[0]!==a&&arguments[0];if(t=e.getCookie("CookieConsent"))t=decodeURI(t),y.categories.analytics=t.indexOf("statistics:true")>=0,y.categories.ads=t.indexOf("marketing:true")>=0,y.visitorHasChosen=!0;else if(t=e.getCookie("CookieScriptConsent"))t=JSON.parse(t),"reject"===t.action?(y.categories.analytics=!1,y.categories.ads=!1):2===t.categories.length?(y.categories.analytics=!0,y.categories.ads=!0):(y.categories.analytics=t.categories.indexOf("performance")>=0,y.categories.ads=t.categories.indexOf("targeting")>=0),y.visitorHasChosen=!0;else if(t=e.getCookie("borlabs-cookie")){var r,n,i,s,d,l,c,u;t=decodeURI(t),t=JSON.parse(t),y.categories.analytics=!(null===(r=t)||void 0===r||null===(n=r.consents)||void 0===n||!n.statistics),y.categories.ads=!(null===(i=t)||void 0===i||null===(s=i.consents)||void 0===s||!s.marketing),y.visitorHasChosen=!0,y.pixels=[...(null===(d=t)||void 0===d||null===(l=d.consents)||void 0===l?void 0:l.statistics)||[],...(null===(c=t)||void 0===c||null===(u=c.consents)||void 0===u?void 0:u.marketing)||[]],y.mode="pixel"}else(t=g())?(y.categories.analytics=!0===t.analytics,y.categories.ads=!0===t.ads,y.visitorHasChosen=t.visitorHasChosen):(t=e.getCookie("cookie_notice_accepted"))?(y.categories.analytics=!0,y.categories.ads=!0,y.visitorHasChosen=!0):(t=e.getCookie("hu-consent"))?(t=JSON.parse(t),y.categories.analytics=!!t.categories[3],y.categories.ads=!!t.categories[4],y.visitorHasChosen=!0):(t=m())?(y.categories.analytics=!0===t.analytics,y.categories.ads=!0===t.ads,y.visitorHasChosen=!0===t.visitorHasChosen):(t=e.getCookie("moove_gdpr_popup"))?(t=JSON.parse(t),y.categories.analytics="1"===t.thirdparty,y.categories.ads="1"===t.advanced,y.visitorHasChosen=!0):(y.categories.analytics=!o,y.categories.ads=!o)},e.updateConsentCookieValues(),e.setConsentDefaultValuesToExplicit=function(){y.categories={analytics:!1,ads:!1}},e.canIFire=function(e,t){return"category"===y.mode?!!y.categories[e]:"pixel"===y.mode?y.pixels.includes(t):(console.error("Couldn't find a valid consent mode in wpmConsentValues"),!1)},e.scriptTagObserver=new MutationObserver((a=>{a.forEach((a=>{let{addedNodes:o}=a;[...o].forEach((a=>{t(a).data("wpm-cookie-category")&&(e.shouldScriptBeActive(a)?e.unblockScript(a):e.blockScript(a))}))}))})),e.scriptTagObserver.observe(document.head,{childList:!0,subtree:!0}),window.addEventListener("DOMContentLoaded",(()=>e.scriptTagObserver.disconnect())),e.shouldScriptBeActive=function(e){var a,o,r,n;return!((wpmDataLayer.shop.cookie_consent_mgmt.explicit_consent||y.visitorHasChosen)&&("category"!==y.mode||!t(e).data("wpm-cookie-category").split(",").some((e=>y.categories[e])))&&("pixel"!==y.mode||!y.pixels.includes(t(e).data("wpm-pixel-name")))&&("pixel"!==y.mode||"google"!==t(e).data("wpm-pixel-name")||!["google-analytics","google-ads"].some((e=>y.pixels.includes(e))))&&(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r||null===(n=r.consent_mode)||void 0===n||!n.active||"google"!==t(e).data("wpm-pixel-name")))},e.unblockScript=function(e){let o=arguments.length>1&&arguments[1]!==a&&arguments[1];o&&t(e).remove();let r=t(e).data("wpm-src");r&&t(e).attr("src",r),e.type="text/javascript",o&&t(e).appendTo("head"),jQuery(document).trigger("wpmPreLoadPixels",{})},e.blockScript=function(e){let o=arguments.length>1&&arguments[1]!==a&&arguments[1];o&&t(e).remove(),t(e).attr("src")&&t(e).removeAttr("src"),e.type="blocked/javascript",o&&t(e).appendTo("head")},e.unblockAllScripts=function(){let o=!(arguments.length>0&&arguments[0]!==a)||arguments[0],r=!(arguments.length>1&&arguments[1]!==a)||arguments[1];t.each(t('script[type="blocked/javascript"]'),(function(a,n){(t(n).data("wpm-cookie-category").includes("analytics")&&o||t(n).data("wpm-cookie-category").includes("ads")&&r)&&e.unblockScript(n,!0)})),jQuery(document).trigger("wpmPreLoadPixels",{})},e.unblockSelectedPixels=function(){t.each(t('script[type="blocked/javascript"]'),(function(a,o){(y.pixels.includes(t(o).data("wpm-pixel-name"))||"google"===t(o).data("wpm-pixel-name")&&["google-analytics","google-ads"].some((e=>y.pixels.includes(e))))&&e.unblockScript(o,!0)})),jQuery(document).trigger("wpmPreLoadPixels",{})},window.addEventListener("borlabs-cookie-consent-saved",(function(t){e.updateConsentCookieValues(),"pixel"===y.mode?(e.unblockSelectedPixels(),e.updateGoogleConsentMode(y.pixels.includes("google-analytics"),y.pixels.includes("google-ads"))):(e.unblockAllScripts(y.categories.analytics,y.categories.ads),e.updateGoogleConsentMode(y.categories.analytics,y.categories.ads))})),window.addEventListener("CookiebotOnAccept",(function(t){Cookiebot.consent.statistics&&(y.categories.analytics=!0),Cookiebot.consent.marketing&&(y.categories.ads=!0),e.unblockAllScripts(y.categories.analytics,y.categories.ads),e.updateGoogleConsentMode(y.categories.analytics,y.categories.ads)}),!1),window.addEventListener("CookieScriptAccept",(function(t){t.detail.categories.includes("performance")&&(y.categories.analytics=!0),t.detail.categories.includes("targeting")&&(y.categories.ads=!0),e.unblockAllScripts(y.categories.analytics,y.categories.ads),e.updateGoogleConsentMode(y.categories.analytics,y.categories.ads)})),window.addEventListener("CookieScriptAcceptAll",(function(t){e.unblockAllScripts(!0,!0),e.updateGoogleConsentMode(!0,!0)})),document.addEventListener("cmplzStatusChange",(function(t){e.updateConsentCookieValues(),e.unblockAllScripts(y.categories.analytics,y.categories.ads),e.updateGoogleConsentMode(y.categories.analytics,y.categories.ads)})),document.addEventListener("setCookieNotice",(function(t){e.updateConsentCookieValues(),e.unblockAllScripts(y.categories.analytics,y.categories.ads),e.updateGoogleConsentMode(y.categories.analytics,y.categories.ads)})),e.huObserver=new MutationObserver((function(t){t.forEach((t=>{let{addedNodes:a}=t;[...a].forEach((t=>{"hu"===t.id&&jQuery(".hu-cookies-save").on("click",(function(t){e.updateConsentCookieValues(),e.unblockAllScripts(y.categories.analytics,y.categories.ads),e.updateGoogleConsentMode(y.categories.analytics,y.categories.ads)}))}))}))})),window.hu&&e.huObserver.observe(document.documentElement||document.body,{childList:!0,subtree:!0}),e.version=function(){console.log(wpmDataLayer.version)},e.loadScriptAndCacheIt=function(e,t){return t=jQuery.extend(t||{},{dataType:"script",cache:!0,url:e}),jQuery.ajax(t)},e.getOrderItemPrice=function(e){return(e.total+e.total_tax)/e.quantity},e.hasLoginEventFired=function(){let t=e.getWpmSessionData();return null==t?void 0:t.loginEventFired},e.setLoginEventFired=function(){let t=e.getWpmSessionData();t.loginEventFired=!0,e.setWpmSessionData(t)},e.wpmDataLayerExists=function(){return new Promise((function(e){!function t(){if("undefined"!=typeof wpmDataLayer)return e();setTimeout(t,50)}()}))},e.pageLoaded=function(){return new Promise((function(e){!function t(){if("complete"===document.readyState)return e();setTimeout(t,50)}()}))},window.wpmLoaded={}}(window.wpm=window.wpm||{},jQuery),jQuery((function(){wpm.wpmDataLayerExists().then((function(){wpm.startIntersectionObserverToWatch(),wpm.startProductsMutationObserverToWatch()}))})),jQuery(document).on("click",".remove_from_cart_button, .remove",(function(e){try{let e=new URL(jQuery(this).attr("href")),t=wpm.getProductIdByCartItemKeyUrl(e);wpm.removeProductFromCart(t)}catch(e){console.error(e)}})),jQuery(document).on("click",".add_to_cart_button:not(.product_type_variable), .ajax_add_to_cart, .single_add_to_cart_button",(function(e){try{if("product"===wpmDataLayer.shop.page_type){if(void 0!==jQuery(this).attr("href")&&jQuery(this).attr("href").includes("add-to-cart")){let e=1,t=jQuery(this).data("product_id");wpm.addProductToCart(t,e)}else if("simple"===wpmDataLayer.shop.product_type){let e=Number(jQuery(".input-text.qty").val());e||0===e||(e=1);let t=jQuery(this).val();wpm.addProductToCart(t,e)}else if("variable"===wpmDataLayer.shop.product_type){let e=Number(jQuery(".input-text.qty").val());e||0===e||(e=1);let t=jQuery("[name='variation_id']").val();wpm.addProductToCart(t,e)}else if("grouped"===wpmDataLayer.shop.product_type)jQuery(".woocommerce-grouped-product-list-item").each((function(){let e=Number(jQuery(this).find(".input-text.qty").val());e||0===e||(e=1);let t=jQuery(this).attr("class"),a=wpm.getPostIdFromString(t);wpm.addProductToCart(a,e)}));else if("bundle"===wpmDataLayer.shop.product_type){let e=Number(jQuery(".input-text.qty").val());e||0===e||(e=1);let t=jQuery("input[name=add-to-cart]").val();wpm.addProductToCart(t,e)}}else{let e=1,t=jQuery(this).data("product_id");wpm.addProductToCart(t,e)}}catch(e){console.error(e)}})),jQuery(document).one("click","a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)",(function(e){try{if(jQuery(e.target).closest("a").attr("href")){let t=jQuery(e.target).closest("a").attr("href");if(t.includes("add-to-cart=")){let e=t.match(/(add-to-cart=)(\d+)/);e&&wpm.addProductToCart(e[2],1)}}}catch(e){console.error(e)}})),jQuery(document).on("click",".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product",(function(e){try{let e=jQuery(this).nextAll(".wpmProductId:first").data("id");if(e){if(e=getIdBasedOndVariationsOutputSetting(e),!e)throw Error("Wasn't able to retrieve a productId");if(wpmDataLayer.products&&wpmDataLayer.products[e]){let t=wpm.getProductDetailsFormattedForEvent(e);jQuery(document).trigger("wpmSelectContentGaUa",t),jQuery(document).trigger("wpmSelectItem",t)}}}catch(e){console.error(e)}})),jQuery(document).one("click",".checkout-button, .cart-checkout-button, .button.checkout",(function(e){jQuery(document).trigger("wpmBeginCheckout")})),jQuery(document).on("input","#billing_email",(function(){wpm.isEmail(jQuery(this).val())&&(wpm.fireCheckoutProgress(2),wpm.emailSelected=!0)})),jQuery(document).on("click",".wc_payment_methods",(function(){!1===wpm.paymentMethodSelected&&wpm.fireCheckoutProgress(3),wpm.fireCheckoutOption(3,jQuery("input[name='payment_method']:checked").val()),wpm.paymentMethodSelected=!0})),jQuery(document).one("click","#place_order",(function(){!1===wpm.emailSelected&&wpm.fireCheckoutProgress(2),!1===wpm.paymentMethodSelected&&(wpm.fireCheckoutProgress(3),wpm.fireCheckoutOption(3,jQuery("input[name='payment_method']:checked").val())),wpm.fireCheckoutProgress(4)})),jQuery(document).on("click","[name='update_cart']",(function(e){try{jQuery(".cart_item").each((function(){let e=new URL(jQuery(this).find(".product-remove").find("a").attr("href")),t=wpm.getProductIdByCartItemKeyUrl(e),a=jQuery(this).find(".qty").val();0===a?wpm.removeProductFromCart(t):a<wpmDataLayer.cart[t].quantity?wpm.removeProductFromCart(t,wpmDataLayer.cart[t].quantity-a):a>wpmDataLayer.cart[t].quantity&&wpm.addProductToCart(t,a-wpmDataLayer.cart[t].quantity)}))}catch(e){console.error(e),wpm.getCartItemsFromBackend()}})),jQuery(document).on("click",".add_to_wishlist, .wl-add-to",(function(){try{let e;if(jQuery(this).data("productid")?e=jQuery(this).data("productid"):jQuery(this).data("product-id")&&(e=jQuery(this).data("product-id")),!e)throw Error("Wasn't able to retrieve a productId");let t=wpm.getProductDetailsFormattedForEvent(e);jQuery(document).trigger("wpmAddToWishlist",t)}catch(e){console.error(e)}})),jQuery(document).on("updated_cart_totals",(function(){jQuery(document).trigger("wpmViewCart")})),jQuery(window).on("wpmLoad",(function(){try{JSON.parse(sessionStorage.getItem("wpmMiniCartActive"))&&JSON.parse(sessionStorage.getItem("wpmFirstPageLoad"))&&!0===wpmDataLayer.shop.mini_cart.track?wpm.getCartItems():sessionStorage.setItem("wpmFirstPageLoad",JSON.stringify(!0))}catch(e){console.error(e)}})),jQuery(window).on("wpmLoad",(function(){wpmDataLayer.products=wpmDataLayer.products||{};let e=wpm.getAddToCartLinkProductIds();wpm.getProductsFromBackend(e)})),jQuery(window).on("wpmLoad",(function(){if(!wpm.getCookie("wpmReferrer"))if(document.referrer){let e=new URL(document.referrer).hostname;e!==window.location.host?wpm.setCookie("wpmReferrer",e):wpm.setCookie("wpmReferrer","")}else wpm.setCookie("wpmReferrer","")})),jQuery(window).on("wpmLoad",(function(){try{var e;if("undefined"!=typeof wpmDataLayer&&(null===(e=wpmDataLayer)||void 0===e||!e.wpmLoadFired)){var t,a;if(jQuery(document).trigger("wpmLoadAlways"),"product"===wpmDataLayer.shop.page_type&&"variable"!==wpmDataLayer.shop.product_type&&wpm.getMainProductIdFromProductPage()){let e=wpm.getProductDataForViewItemEvent(wpm.getMainProductIdFromProductPage());jQuery(document).trigger("wpmViewItem",e)}else"product_category"===wpmDataLayer.shop.page_type?jQuery(document).trigger("wpmCategory"):"search"===wpmDataLayer.shop.page_type?jQuery(document).trigger("wpmSearch"):"cart"===wpmDataLayer.shop.page_type?jQuery(document).trigger("wpmViewCart"):"order_received_page"===wpmDataLayer.shop.page_type&&wpmDataLayer.order?wpm.isOrderIdStored(wpmDataLayer.order.id)||(jQuery(document).trigger("wpmOrderReceivedPage"),wpm.writeOrderIdToStorage(wpmDataLayer.order.id)):jQuery(document).trigger("wpmEverywhereElse");null!==(t=wpmDataLayer)&&void 0!==t&&null!==(a=t.user)&&void 0!==a&&a.id&&!wpm.hasLoginEventFired()&&(jQuery(document).trigger("wpmLogin"),wpm.setLoginEventFired()),jQuery(document).ajaxSend((function(e,t,a){a.url.includes("get_refreshed_fragments")&&sessionStorage&&(sessionStorage.getItem("wpmMiniCartActive")||sessionStorage.setItem("wpmMiniCartActive",JSON.stringify(!0)))})),wpmDataLayer.wpmLoadFired=!0}}catch(e){console.error(e)}})),jQuery(window).on("wpmPreLoadPixels",(function(){var e,t,a;null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.shop)&&void 0!==t&&null!==(a=t.cookie_consent_mgmt)&&void 0!==a&&a.explicit_consent&&wpm.updateConsentCookieValues(!0),jQuery(document).trigger("wpmLoadPixels",{})})),jQuery((function(){jQuery(".single_variation_wrap").on("show_variation",(function(e,t){try{let e=getIdBasedOndVariationsOutputSetting(t.variation_id);if(!e)throw Error("Wasn't able to retrieve a productId");if(wpmDataLayer.products&&wpmDataLayer.products[e]){let t=wpm.getProductDetailsFormattedForEvent(e);jQuery(document).trigger("wpmViewItem",t)}}catch(e){console.error(e)}}))}))}},t={};function a(o){var r=t[o];if(void 0!==r)return r.exports;var n=t[o]={exports:{}};return e[o](n,n.exports,a),n.exports}a(230),a(577),a(354),a(464),a(234),a(785),a(570),a(497),a(560)})();
2
  //# sourceMappingURL=wpm-public.p1.min.js.map
js/public/wpm-public.p1.min.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"wpm-public.p1.min.js","mappings":"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","sources":["webpack://WooCommerce-Pixel-Manager/./src/js/public/facebook/event_listeners.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/facebook/functions.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/facebook/loader.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/ads/event_listeners.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/ads/functions.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/ads/loader.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/analytics/ga3/event_listeners.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/analytics/ga3/functions.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/analytics/ga3/loader.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/analytics/ga4/event_listeners.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/analytics/ga4/functions.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/analytics/ga4/loader.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/analytics/loader.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/base/event_listeners.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/base/functions.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/base/loader.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/loader.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/optimize/event_listeners.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/optimize/functions.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google/optimize/loader.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/hotjar/event_listeners.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/hotjar/functions.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/hotjar/loader.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/wpm/event_listeners.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/wpm/functions.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/wpm/functions_loader.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/wpm/init.js","webpack://WooCommerce-Pixel-Manager/webpack/bootstrap","webpack://WooCommerce-Pixel-Manager/./src/js/public/main.js"],"sourcesContent":["/**\n * All event listeners\n * */\n\n// Load pixel event\njQuery(document).on(\"wpmLoadPixels\", function () {\n\n\tif (wpmDataLayer?.pixels?.facebook?.pixel_id && !wpmDataLayer?.pixels?.facebook?.loaded) {\n\t\tif (wpm.canIFire(\"ads\", \"facebook-ads\")) wpm.loadFacebookPixel()\n\t}\n})\n\n// AddToCart event\njQuery(document).on(\"wpmAddToCart\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\tlet eventId = wpm.getRandomEventId()\n\n\t\t// console.log('eventId: ' + eventId);\n\n\t\tfbq(\"track\", \"AddToCart\", {\n\t\t\tcontent_type: \"product\",\n\t\t\tcontent_name: product.name,\n\t\t\tcontent_ids : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\tvalue : parseFloat(product.quantity * product.price),\n\t\t\tcurrency : product.currency,\n\t\t}, {\n\t\t\teventID: eventId,\n\t\t})\n\n\n\t\tproduct[\"currency\"] = wpmDataLayer.shop.currency\n\n\t\tjQuery(document).trigger(\"wpmFbCapiEvent\", {\n\t\t\tevent_name : \"AddToCart\",\n\t\t\tevent_id : eventId,\n\t\t\tuser_data : wpm.getFbUserData(),\n\t\t\tproduct_data : product,\n\t\t\tproduct_id : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\tevent_source_url: window.location.href,\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// InitiateCheckout event\njQuery(document).on(\"wpmBeginCheckout\", function (event) {\n\n\ttry {\n\t\t// console.log('firing facebook ads InitiateCheckout event');\n\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\tlet eventId = wpm.getRandomEventId()\n\n\t\tfbq(\"track\", \"InitiateCheckout\", {}, {\n\t\t\teventID: eventId,\n\t\t})\n\n\t\tjQuery(document).trigger(\"wpmFbCapiEvent\", {\n\t\t\tevent_name : \"InitiateCheckout\",\n\t\t\tevent_id : eventId,\n\t\t\tuser_data : wpm.getFbUserData(),\n\t\t\tevent_source_url: window.location.href,\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// AddToWishlist event\njQuery(document).on(\"wpmAddToWishlist\", function (event, product) {\n\n\ttry {\n\t\t// console.log('firing facebook ads AddToWishlist event');\n\t\t// console.log(product);\n\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\tlet eventId = wpm.getRandomEventId()\n\n\t\tfbq(\"track\", \"AddToWishlist\", {\n\t\t\tcontent_type: \"product\",\n\t\t\tcontent_name: product.name,\n\t\t\tcontent_ids : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\tvalue : parseFloat(product.quantity * product.price),\n\t\t\tcurrency : product.currency,\n\t\t}, {\n\t\t\teventID: eventId,\n\t\t})\n\n\n\t\tproduct[\"currency\"] = wpmDataLayer.shop.currency\n\n\t\tjQuery(document).trigger(\"wpmFbCapiEvent\", {\n\t\t\tevent_name : \"AddToWishlist\",\n\t\t\tevent_id : eventId,\n\t\t\tuser_data : wpm.getFbUserData(),\n\t\t\tproduct_data : product,\n\t\t\tproduct_id : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\tevent_source_url: window.location.href,\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// ViewContent event\njQuery(document).on(\"wpmViewItem\", function (event, product) {\n\n\ttry {\n\t\t// console.log('firing facebook ads ViewContent event');\n\t\t// console.log(product);\n\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\twpm.fbViewContent(product)\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view search event\njQuery(document).on(\"wpmSearch\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\tlet eventId = wpm.getRandomEventId()\n\n\t\tfbq(\"track\", \"Search\", {}, {\n\t\t\teventID: eventId,\n\t\t})\n\n\t\tjQuery(document).trigger(\"wpmFbCapiEvent\", {\n\t\t\tevent_name : \"Search\",\n\t\t\tevent_id : eventId,\n\t\t\tuser_data : wpm.getFbUserData(),\n\t\t\tevent_source_url: window.location.href,\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// load always event\njQuery(document).on(\"wpmLoadAlways\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\twpm.setFbUserData()\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view order received page event\n// https://developers.pinterest.com/docs/tag/conversion/\njQuery(document).on(\"wpmOrderReceivedPage\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\tfbq(\"track\", \"Purchase\",\n\t\t\t{\n\t\t\t\tcontent_type: \"product\",\n\t\t\t\tvalue : wpmDataLayer.order.value_filtered,\n\t\t\t\tcurrency : wpmDataLayer.order.currency,\n\t\t\t\tcontent_ids : wpm.facebookContentIds(),\n\t\t\t},\n\t\t\t{eventID: wpmDataLayer.order.id},\n\t\t)\n\n\n\t\t// console.log(wpm.facebookContentIds())\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n","/**\n * Add functions for Facebook\n * */\n\n(function (wpm, $, undefined) {\n\n\tlet fBUserData\n\n\twpm.loadFacebookPixel = function () {\n\n\t\ttry {\n\t\t\twpmDataLayer.pixels.facebook.loaded = true\n\n\t\t\t// @formatter:off\n\t\t\t!function(f,b,e,v,n,t,s)\n\t\t\t{if(f.fbq)return;n=f.fbq=function(){n.callMethod?\n\t\t\t\tn.callMethod.apply(n,arguments):n.queue.push(arguments)};\n\t\t\t\tif(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';\n\t\t\t\tn.queue=[];t=b.createElement(e);t.async=!0;\n\t\t\t\tt.src=v;s=b.getElementsByTagName(e)[0];\n\t\t\t\ts.parentNode.insertBefore(t,s)}(window, document,'script',\n\t\t\t\t'https://connect.facebook.net/en_US/fbevents.js');\n\t\t\t// @formatter:on\n\n\t\t\tfbq(\"init\", wpmDataLayer.pixels.facebook.pixel_id)\n\t\t\tfbq(\"track\", \"PageView\")\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.getRandomEventId = function () {\n\t\treturn (Math.random() + 1).toString(36).substring(2)\n\t}\n\n\twpm.getFbUserData = function () {\n\t\t// We need the first one for InitiateCheckout\n\t\t// where getting the user_data from the browser is too slow\n\t\t// using wpm.getCookie(), so we cache the user_data earlier.\n\t\t// And we need the second one because the ViewContent hit happens too fast\n\t\t// after adding a variation to the cart because the function to cache\n\t\t// the user_data is too slow. But we can get the user_data using wpm.getCookie()\n\t\t// because we don't move away from the page and can wait for the browser\n\t\t// to get it.\n\t\tif (fBUserData) {\n\t\t\treturn fBUserData\n\t\t} else {\n\t\t\treturn wpm.getFbUserDataFromBrowser()\n\t\t}\n\t}\n\n\twpm.setFbUserData = function () {\n\t\tfBUserData = wpm.getFbUserDataFromBrowser()\n\t}\n\n\twpm.getFbUserDataFromBrowser = function () {\n\t\treturn {\n\t\t\tfbp : wpm.getCookie(\"_fbp\"),\n\t\t\tfbc : wpm.getCookie(\"_fbc\"),\n\t\t\tclient_user_agent: navigator.userAgent,\n\t\t}\n\t}\n\n\twpm.fbViewContent = function (product) {\n\n\t\ttry {\n\t\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\t\tlet eventId = wpm.getRandomEventId()\n\n\t\t\tfbq(\"track\", \"ViewContent\", {\n\t\t\t\tcontent_type: \"product\",\n\t\t\t\tcontent_name: product.name,\n\t\t\t\t// content_category: product.category,\n\t\t\t\tcontent_ids: product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\t\tcurrency : wpmDataLayer.shop.currency,\n\t\t\t\tvalue : product.price,\n\t\t\t}, {\n\t\t\t\teventID: eventId,\n\t\t\t})\n\n\t\t\tproduct[\"currency\"] = wpmDataLayer.shop.currency\n\n\t\t\tjQuery(document).trigger(\"wpmFbCapiEvent\", {\n\t\t\t\tevent_name : \"ViewContent\",\n\t\t\t\tevent_id : eventId,\n\t\t\t\tuser_data : wpm.getFbUserData(),\n\t\t\t\tproduct_data : product,\n\t\t\t\tproduct_id : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\t\tevent_source_url: window.location.href,\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.facebookContentIds = function () {\n\t\tlet prodIds = []\n\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {\n\t\t\t\tprodIds.push(String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type]))\n\t\t\t} else {\n\t\t\t\tprodIds.push(String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type]))\n\t\t\t}\n\t\t}\n\n\t\treturn prodIds\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery));\n","/**\n * Facebook loader\n */\n\nrequire(\"./functions\")\nrequire(\"./event_listeners\")\n\n// #if process.env.TIER === 'premium'\n// require(\"./functions_premium\")\n// require(\"./event_listeners_premium\")\n// #endif\n\n","/**\n * Load Google Ads event listeners\n * */\n\n// view_item_list event\njQuery(document).on(\"wpmViewItemList\", function (event, product) {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\n\t\tif (\n\t\t\twpmDataLayer?.general?.variationsOutput &&\n\t\t\tproduct.isVariable &&\n\t\t\twpmDataLayer.pixels.google.ads.dynamic_remarketing.send_events_with_parent_ids === false\n\t\t) return\n\n\t\t// try to prevent that WC sends cached hits to Google\n\t\tif (!product) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"view_item_list\", {\n\t\t\t\tsend_to: wpm.getGoogleAdsConversionIdentifiers(),\n\t\t\t\titems : [{\n\t\t\t\t\tid : product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],\n\t\t\t\t\tgoogle_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,\n\t\t\t\t}],\n\t\t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// add_to_cart event\njQuery(document).on(\"wpmAddToCart\", function (event, product) {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"add_to_cart\", {\n\t\t\t\tsend_to: wpm.getGoogleAdsConversionIdentifiers(),\n\t\t\t\tvalue : product.quantity * product.price,\n\t\t\t\titems : [{\n\t\t\t\t\tid : product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],\n\t\t\t\t\tquantity : product.quantity,\n\t\t\t\t\tprice : product.price,\n\t\t\t\t\tgoogle_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,\n\t\t\t\t}],\n\t\t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view_item event\njQuery(document).on(\"wpmViewItem\", function (event, product) {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"view_item\", {\n\t\t\t\tsend_to: wpm.getGoogleAdsConversionIdentifiers(),\n\t\t\t\tvalue : (product.quantity ? product.quantity : 1) * product.price,\n\t\t\t\titems : [{\n\t\t\t\t\tid : product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],\n\t\t\t\t\tquantity : (product.quantity ? product.quantity : 1),\n\t\t\t\t\tprice : product.price,\n\t\t\t\t\tgoogle_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,\n\t\t\t\t}],\n\t\t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n\n// view search event\njQuery(document).on(\"wpmSearch\", function () {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\n\t\tlet products = []\n\n\t\tfor (const [key, product] of Object.entries(wpmDataLayer.products)) {\n\n\t\t\tif (\n\t\t\t\twpmDataLayer?.general?.variationsOutput &&\n\t\t\t\tproduct.isVariable &&\n\t\t\t\twpmDataLayer.pixels.google.ads.dynamic_remarketing.send_events_with_parent_ids === false\n\t\t\t) return\n\n\t\t\tproducts.push({\n\t\t\t\tid : product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],\n\t\t\t\tgoogle_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,\n\t\t\t})\n\t\t}\n\n\t\t// console.log(products);\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"view_search_results\", {\n\t\t\t\tsend_to: wpm.getGoogleAdsConversionIdentifiers(),\n\t\t\t\t// value : 1 * product.price,\n\t\t\t\titems: products,\n\t\t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n\n// view order received page event\n// TODO distinguish with or without cart data active\njQuery(document).on(\"wpmOrderReceivedPage\", function () {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"purchase\", {\n\t\t\t\tsend_to: wpm.getGoogleAdsConversionIdentifiers(),\n\t\t\t\tvalue : wpmDataLayer.order.value_filtered,\n\t\t\t\titems : wpm.getGoogleAdsDynamicRemarketingOrderItems(),\n\t\t\t})\n\t\t})\n\n\t\t// console.log(wpm.getGoogleAdsDynamicRemarketingOrderItems())\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// user log in event\njQuery(document).on(\"wpmLogin\", function () {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"login\", {\n\t\t\t\tsend_to: wpm.getGoogleAdsConversionIdentifiers(),\n\t\t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view order received page event\n// new_customer parameter: https://support.google.com/google-ads/answer/9917012\njQuery(document).on(\"wpmOrderReceivedPage\", function () {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\t\tlet data_basic = {}\n\t\tlet data_with_cart = {}\n\n\t\tdata_basic = {\n\t\t\tsend_to : wpm.getGoogleAdsConversionIdentifiersWithLabel(),\n\t\t\ttransaction_id: wpmDataLayer.order.number,\n\t\t\tvalue : wpmDataLayer.order.value_filtered,\n\t\t\tcurrency : wpmDataLayer.order.currency,\n\t\t\tnew_customer : wpmDataLayer.order.new_customer,\n\t\t}\n\n\t\tif (wpmDataLayer?.order?.aw_merchant_id) {\n\t\t\tdata_with_cart = {\n\t\t\t\tdiscount : wpmDataLayer.order.discount,\n\t\t\t\taw_merchant_id : wpmDataLayer.order.aw_merchant_id,\n\t\t\t\taw_feed_country : wpmDataLayer.order.aw_feed_country,\n\t\t\t\taw_feed_language: wpmDataLayer.order.aw_feed_language,\n\t\t\t\titems : wpm.getGoogleAdsRegularOrderItems(),\n\t\t\t}\n\t\t}\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"conversion\", {...data_basic, ...data_with_cart})\n\t\t})\n\n\t\t// console.log({...data_basic,...data_with_cart})\n\n\t\t// console.log(wpm.getGoogleAdsOrderItems())\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n\n\n\n\n","/**\n * Load Google Ads functions\n * */\n\n(function (wpm, $, undefined) {\n\n\tlet conversionIdentifiers = []\n\n\twpm.getGoogleAdsConversionIdentifiersWithLabel = function () {\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds)) {\n\t\t\tconversionIdentifiers.push(key + \"/\" + item)\n\t\t}\n\t\treturn conversionIdentifiers\n\t}\n\n\twpm.getGoogleAdsConversionIdentifiers = function () {\n\n\t\tlet conversionIdentifiers = []\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds)) {\n\t\t\tconversionIdentifiers.push(key)\n\t\t}\n\n\t\treturn conversionIdentifiers\n\t}\n\n\twpm.getGoogleAdsRegularOrderItems = function () {\n\t\t// \"id\" : \"gla_34\",\n\t\t// \"quantity\": 1,\n\t\t// \"price\" : 45\n\n\t\tlet orderItems = []\n\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tlet orderItem\n\n\t\t\torderItem = {\n\t\t\t\tquantity: item.quantity,\n\t\t\t\tprice : item.price,\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type])\n\t\t\t\torderItems.push(orderItem)\n\t\t\t} else {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type])\n\t\t\t\torderItems.push(orderItem)\n\t\t\t}\n\t\t}\n\n\t\treturn orderItems\n\t}\n\n\twpm.getGoogleAdsDynamicRemarketingOrderItems = function () {\n\t\t// \"id\" : \"gla_34\",\n\t\t// \"quantity\" : 1,\n\t\t// \"price\" : 45,\n\t\t// \"google_business_vertical\": \"retail\"\n\n\t\tlet orderItems = []\n\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tlet orderItem\n\n\t\t\torderItem = {\n\t\t\t\tquantity : item.quantity,\n\t\t\t\tprice : item.price,\n\t\t\t\tgoogle_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type])\n\t\t\t\torderItems.push(orderItem)\n\t\t\t} else {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type])\n\t\t\t\torderItems.push(orderItem)\n\t\t\t}\n\t\t}\n\n\t\treturn orderItems\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery))\n","/**\n * Load Google Ads\n */\n\n\nrequire(\"./functions\")\nrequire(\"./event_listeners\")\n","/**\n * Load Google Universal Analytics (GA3) event listeners\n * */\n\n\n// view order received page event\njQuery(document).on(\"wpmOrderReceivedPage\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) return\n\t\tif (wpmDataLayer?.pixels?.google?.analytics?.universal?.mp_active) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"purchase\", {\n\t\t\t\tsend_to : [wpmDataLayer.pixels.google.analytics.universal.property_id],\n\t\t\t\ttransaction_id: wpmDataLayer.order.number,\n\t\t\t\taffiliation : wpmDataLayer.order.affiliation,\n\t\t\t\tcurrency : wpmDataLayer.order.currency,\n\t\t\t\tvalue : wpmDataLayer.order.value_regular,\n\t\t\t\tdiscount : wpmDataLayer.order.discount,\n\t\t\t\ttax : wpmDataLayer.order.tax,\n\t\t\t\tshipping : wpmDataLayer.order.shipping,\n\t\t\t\tcoupon : wpmDataLayer.order.coupon,\n\t\t\t\titems : wpm.getGAUAOrderItems(),\n\t\t\t})\n\t\t})\n\n\t\t// console.log(wpm.getGAUAOrderItems())\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n","/**\n * Add functions for Google Analytics Universal\n * */\n\n(function (wpm, $, undefined) {\n\n\twpm.getGAUAOrderItems = function () {\n\n\t\t// \"id\" : \"34\",\n\t\t// \"name\" : \"Hoodie\",\n\t\t// \"brand\" : \"\",\n\t\t// \"category\" : \"Hoodies\",\n\t\t// \"list_position\": 1,\n\t\t// \"price\" : 45,\n\t\t// \"quantity\" : 1,\n\t\t// \"variant\" : \"Color: blue | Logo: yes\"\n\n\n\t\tlet orderItems = [],\n\t\t\tlist_position = 1\n\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tlet orderItem\n\n\t\t\torderItem = {\n\t\t\t\tquantity : item.quantity,\n\t\t\t\tprice : item.price,\n\t\t\t\tname : item.name,\n\t\t\t\tcurrency : wpmDataLayer.order.currency,\n\t\t\t\tcategory : wpmDataLayer.products[item.id].category.join(\"/\"),\n\t\t\t\tlist_position: list_position,\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type])\n\t\t\t\torderItem.variant = wpmDataLayer.products[item.variation_id].variant_name\n\t\t\t\torderItem.brand = wpmDataLayer.products[item.variation_id].brand\n\t\t\t} else {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type])\n\t\t\t\torderItem.brand = wpmDataLayer.products[item.id].brand\n\t\t\t}\n\n\t\t\torderItems.push(orderItem)\n\t\t\tlist_position++\n\t\t}\n\n\t\treturn orderItems\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery))\n","/**\n * Google Universal Analytics (GA3) loader\n */\n\nrequire(\"./functions\")\nrequire(\"./event_listeners\")\n\n// #if process.env.TIER === 'premium'\n// require(\"./functions_premium\")\n// require(\"./event_listeners_premium\")\n// #endif\n","/**\n * Load GA4 event listeners\n * */\n\n\n// view order received page event\njQuery(document).on(\"wpmOrderReceivedPage\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) return\n\t\tif (wpmDataLayer?.pixels?.google?.analytics?.ga4?.mp_active) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"purchase\", {\n\t\t\t\tsend_to : [wpmDataLayer.pixels.google.analytics.ga4.measurement_id],\n\t\t\t\ttransaction_id: wpmDataLayer.order.number,\n\t\t\t\taffiliation : wpmDataLayer.order.affiliation,\n\t\t\t\tcurrency : wpmDataLayer.order.currency,\n\t\t\t\tvalue : wpmDataLayer.order.value_regular,\n\t\t\t\tdiscount : wpmDataLayer.order.discount,\n\t\t\t\ttax : wpmDataLayer.order.tax,\n\t\t\t\tshipping : wpmDataLayer.order.shipping,\n\t\t\t\tcoupon : wpmDataLayer.order.coupon,\n\t\t\t\titems : wpm.getGA4OrderItems(),\n\t\t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n","/**\n * Load GA4 functions\n * */\n\n(function (wpm, $, undefined) {\n\n\twpm.getGA4OrderItems = function () {\n\n\t\t// \"item_id\" : \"34\",\n\t\t// \"item_name\" : \"Hoodie\",\n\t\t// \"quantity\" : 1,\n\t\t// \"item_brand\" : \"\",\n\t\t// \"item_variant\" : \"Color: blue | Logo: yes\",\n\t\t// \"price\" : 45,\n\t\t// \"currency\" : \"CHF\",\n\t\t// \"item_category\": \"Hoodies\"\n\n\n\t\tlet orderItems = []\n\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tlet orderItem\n\n\t\t\torderItem = {\n\t\t\t\tquantity : item.quantity,\n\t\t\t\tprice : item.price,\n\t\t\t\titem_name : item.name,\n\t\t\t\tcurrency : wpmDataLayer.order.currency,\n\t\t\t\titem_category: wpmDataLayer.products[item.id].category.join(\"/\"),\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {\n\n\t\t\t\torderItem.item_id = String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type])\n\t\t\t\torderItem.item_variant = wpmDataLayer.products[item.variation_id].variant_name\n\t\t\t\torderItem.item_brand = wpmDataLayer.products[item.variation_id].brand\n\t\t\t} else {\n\n\t\t\t\torderItem.item_id = String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type])\n\t\t\t\torderItem.item_brand = wpmDataLayer.products[item.id].brand\n\t\t\t}\n\n\t\t\torderItems.push(orderItem)\n\t\t}\n\n\t\treturn orderItems\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery))\n","/**\n * GA4 loader\n */\n\nrequire(\"./functions\")\nrequire(\"./event_listeners\")\n\n// #if process.env.TIER === 'premium'\n// require(\"./functions_premium\")\n// require(\"./event_listeners_premium\")\n// #endif\n","/**\n * Google Analytics loader\n */\n\nrequire(\"./ga3/loader\")\nrequire(\"./ga4/loader\")\n","/**\n * Load Google base event listeners\n */\n\n// Pixel load event listener\njQuery(document).on(\"wpmLoadPixels\", function () {\n\n\tif (typeof wpmDataLayer?.pixels?.google?.state === \"undefined\") {\n\t\tif (wpm.canGoogleLoad()) {\n\t\t\twpm.loadGoogle()\n\t\t} else {\n\t\t\twpm.logPreventedPixelLoading(\"google\", \"analytics / ads\")\n\t\t}\n\t}\n})\n","/**\n * Load Google base functions\n */\n\n(function (wpm, $, undefined) {\n\n\twpm.googleConfigConditionsMet = function (type) {\n\t\t// always returns true if Google Consent Mode is active\n\t\tif (wpmDataLayer?.pixels?.google?.consent_mode?.active) {\n\t\t\treturn true\n\t\t} else if (wpm.getConsentValues().mode === \"category\") {\n\t\t\treturn wpm.getConsentValues().categories[type] === true\n\t\t} else if (wpm.getConsentValues().mode === \"pixel\") {\n\t\t\treturn wpm.getConsentValues().pixels.includes(\"google-\" + type)\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t}\n\n\twpm.getVisitorConsentStatusAndUpdateGoogleConsentSettings = function (google_consent_settings) {\n\n\t\tif (wpm.getConsentValues().mode === \"category\") {\n\t\t\tif (wpm.getConsentValues().categories.analytics) google_consent_settings.analytics_storage = \"granted\"\n\t\t\tif (wpm.getConsentValues().categories.ads) google_consent_settings.ad_storage = \"granted\"\n\t\t} else if ((wpm.getConsentValues().mode === \"pixel\")) {\n\t\t\tgoogle_consent_settings.analytics_storage = wpm.getConsentValues().pixels.includes(\"google-analytics\") ? \"granted\" : \"denied\"\n\t\t\tgoogle_consent_settings.ad_storage = wpm.getConsentValues().pixels.includes(\"google-ads\") ? \"granted\" : \"denied\"\n\t\t}\n\n\t\treturn google_consent_settings\n\t}\n\n\twpm.updateGoogleConsentMode = function (analytics = true, ads = true) {\n\n\t\ttry {\n\t\t\tif (\n\t\t\t\t!window.gtag ||\n\t\t\t\t!wpmDataLayer.shop.cookie_consent_mgmt.explicit_consent\n\t\t\t) return\n\n\t\t\tgtag(\"consent\", \"update\", {\n\t\t\t\tanalytics_storage: analytics ? \"granted\" : \"denied\",\n\t\t\t\tad_storage : ads ? \"granted\" : \"denied\",\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.fireGtagGoogleAds = function () {\n\t\ttry {\n\t\t\twpmDataLayer.pixels.google.ads.state = \"loading\"\n\n\t\t\tif (wpmDataLayer?.pixels?.google?.ads?.enhanced_conversions?.active) {\n\t\t\t\tfor (const [key, item] of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds)) {\n\t\t\t\t\tgtag(\"config\", key, {\"allow_enhanced_conversions\": true})\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (const [key, item] of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds)) {\n\t\t\t\t\tgtag(\"config\", key)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.pixels?.google?.ads?.conversionIds && wpmDataLayer?.pixels?.google?.ads?.phone_conversion_label && wpmDataLayer?.pixels?.google?.ads?.phone_conversion_number) {\n\t\t\t\tgtag(\"config\", Object.keys(wpmDataLayer.pixels.google.ads.conversionIds)[0] + \"/\" + wpmDataLayer.pixels.google.ads.phone_conversion_label, {\n\t\t\t\t\tphone_conversion_number: wpmDataLayer.pixels.google.ads.phone_conversion_number,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// ! enhanced_conversion_data needs to be var\n\t\t\t// https://support.google.com/google-ads/answer/9888145#zippy=%2Cvalidate-your-implementation-using-chrome-developer-tools\n\t\t\tif (\"order_received_page\" === wpmDataLayer.shop.page_type && wpmDataLayer?.order?.google?.ads?.enhanced_conversion_data) {\n\t\t\t\twindow.enhanced_conversion_data = wpmDataLayer.order.google.ads.enhanced_conversion_data\n\t\t\t}\n\n\t\t\twpmDataLayer.pixels.google.ads.state = \"ready\"\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.fireGtagGoogleAnalyticsUA = function () {\n\t\ttry {\n\t\t\twpmDataLayer.pixels.google.analytics.universal.state = \"loading\"\n\n\t\t\tgtag(\"config\", wpmDataLayer.pixels.google.analytics.universal.property_id, wpmDataLayer.pixels.google.analytics.universal.parameters)\n\t\t\twpmDataLayer.pixels.google.analytics.universal.state = \"ready\"\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.fireGtagGoogleAnalyticsGA4 = function () {\n\t\ttry {\n\t\t\twpmDataLayer.pixels.google.analytics.ga4.state = \"loading\"\n\n\t\t\tgtag(\"config\", wpmDataLayer.pixels.google.analytics.ga4.measurement_id, wpmDataLayer.pixels.google.analytics.ga4.parameters)\n\t\t\twpmDataLayer.pixels.google.analytics.ga4.state = \"ready\"\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.isGoogleActive = function () {\n\t\tif (\n\t\t\twpmDataLayer?.pixels?.google?.analytics?.universal?.property_id ||\n\t\t\twpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id ||\n\t\t\t!jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)\n\t\t) {\n\t\t\treturn true\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t}\n\n\twpm.getGoogleGtagId = function () {\n\t\tif (wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) {\n\t\t\treturn wpmDataLayer.pixels.google.analytics.universal.property_id\n\t\t} else if (wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) {\n\t\t\treturn wpmDataLayer.pixels.google.analytics.ga4.measurement_id\n\t\t} else {\n\t\t\treturn Object.keys(wpmDataLayer.pixels.google.ads.conversionIds)[0]\n\t\t}\n\t}\n\n\twpm.loadGoogle = function () {\n\n\t\tif (wpm.isGoogleActive()) {\n\n\t\t\twpmDataLayer.pixels.google.state = \"loading\"\n\n\t\t\twpm.loadScriptAndCacheIt(\"https://www.googletagmanager.com/gtag/js?id=\" + wpm.getGoogleGtagId())\n\t\t\t\t.done(function (script, textStatus) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// console.log('Google Optimize loaded')\n\t\t\t\t\t\t// alert('Google Optimize loaded')\n\n\t\t\t\t\t\t// Initiate Google dataLayer and gtag\n\t\t\t\t\t\twindow.dataLayer = window.dataLayer || []\n\t\t\t\t\t\twindow.gtag = function gtag() {\n\t\t\t\t\t\t\tdataLayer.push(arguments)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Google Consent Mode\n\t\t\t\t\t\tif (wpmDataLayer?.pixels?.google?.consent_mode?.active) {\n\n\t\t\t\t\t\t\tlet google_consent_settings = {\n\t\t\t\t\t\t\t\t\"ad_storage\" : wpmDataLayer.pixels.google.consent_mode.ad_storage,\n\t\t\t\t\t\t\t\t\"analytics_storage\": wpmDataLayer.pixels.google.consent_mode.analytics_storage,\n\t\t\t\t\t\t\t\t\"wait_for_update\" : wpmDataLayer.pixels.google.consent_mode.wait_for_update,\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (wpmDataLayer?.pixels?.google?.consent_mode?.region) {\n\t\t\t\t\t\t\t\tgoogle_consent_settings.region = wpmDataLayer.pixels.google.consent_mode.region\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tgoogle_consent_settings = wpm.getVisitorConsentStatusAndUpdateGoogleConsentSettings(google_consent_settings)\n\n\t\t\t\t\t\t\tgtag(\"consent\", \"default\", google_consent_settings)\n\t\t\t\t\t\t\tgtag(\"set\", \"ads_data_redaction\", wpmDataLayer.pixels.google.consent_mode.ads_data_redaction)\n\t\t\t\t\t\t\tgtag(\"set\", \"url_passthrough\", wpmDataLayer.pixels.google.consent_mode.url_passthrough)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Google Linker\n\t\t\t\t\t\t// https://developers.google.com/gtagjs/devguide/linker\n\t\t\t\t\t\tif (wpmDataLayer?.pixels?.google?.linker?.settings) {\n\t\t\t\t\t\t\tgtag(\"set\", \"linker\", wpmDataLayer.pixels.google.linker.settings)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgtag(\"js\", new Date())\n\n\t\t\t\t\t\t// Google Ads loader\n\t\t\t\t\t\tif (!jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) { // Only run if the pixel has set up\n\t\t\t\t\t\t\tif (wpm.googleConfigConditionsMet(\"ads\")) { \t\t\t\t\t\t\t// Only run if cookie consent has been given\n\t\t\t\t\t\t\t\twpm.fireGtagGoogleAds()\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twpm.logPreventedPixelLoading(\"google-ads\", \"ads\")\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t// Google Universal Analytics loader\n\t\t\t\t\t\tif (wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) { \t\t// Only run if the pixel has set up\n\t\t\t\t\t\t\tif (wpm.googleConfigConditionsMet(\"analytics\")) {\t\t\t\t\t\t// Only run if cookie consent has been given\n\t\t\t\t\t\t\t\twpm.fireGtagGoogleAnalyticsUA()\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twpm.logPreventedPixelLoading(\"google-universal-analytics\", \"analytics\")\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// GA4 loader\n\t\t\t\t\t\tif (wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) { \t\t\t// Only run if the pixel has set up\n\t\t\t\t\t\t\tif (wpm.googleConfigConditionsMet(\"analytics\")) {\t\t\t\t\t\t// Only run if cookie consent has been given\n\t\t\t\t\t\t\t\twpm.fireGtagGoogleAnalyticsGA4()\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twpm.logPreventedPixelLoading(\"ga4\", \"analytics\")\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\twpmDataLayer.pixels.google.state = \"ready\"\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tconsole.error(e)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t}\n\t}\n\n\twpm.canGoogleLoad = function () {\n\n\t\tif (wpmDataLayer?.pixels?.google?.consent_mode?.active) {\n\t\t\treturn true\n\t\t} else if (\"category\" === wpm.getConsentValues().mode) {\n\t\t\treturn !!(wpm.getConsentValues().categories[\"ads\"] || wpm.getConsentValues().categories[\"analytics\"])\n\t\t} else if (\"pixel\" === wpm.getConsentValues().mode) {\n\t\t\treturn wpm.getConsentValues().pixels.includes(\"google-ads\") || wpm.getConsentValues().pixels.includes(\"google-analytics\")\n\t\t} else {\n\t\t\tconsole.error(\"Couldn't find a valid load condition for Google mode in wpmConsentValues\")\n\t\t\treturn false\n\t\t}\n\t}\n\n\twpm.gtagLoaded = function () {\n\t\treturn new Promise(function (resolve, reject) {\n\n\t\t\tif (typeof wpmDataLayer?.pixels?.google?.state === \"undefined\") reject()\n\n\t\t\tlet startTime = 0\n\t\t\tlet timeout = 5000\n\t\t\tlet frequency = 200;\n\n\t\t\t(function wait() {\n\t\t\t\tif (wpmDataLayer?.pixels?.google?.state === \"ready\") return resolve()\n\t\t\t\tif (startTime >= timeout) return reject()\n\t\t\t\tstartTime += frequency\n\t\t\t\tsetTimeout(wait, frequency)\n\t\t\t})()\n\t\t})\n\t}\n\n\t// wpm.gtagLoadednew = function () {\n\t// \treturn Promise.race([\n\t// \t\t\tnew Promise(function (resolve, reject) {\n\t//\n\t// \t\t\t\tif (typeof wpmDataLayer?.pixels?.google?.state === \"undefined\") reject();\n\t//\n\t//\n\t// \t\t\t\t(function wait() {\n\t// \t\t\t\t\tif (wpmDataLayer?.pixels?.google?.state === \"ready\") return resolve()\n\t// \t\t\t\t\tif (to >= 1000) return reject()\n\t// \t\t\t\t\tsetTimeout(wait, 100)\n\t// \t\t\t\t})()\n\t// \t\t\t}),\n\t// \t\t\tnew Promise(function (resolve, reject) {\n\t// \t\t\t\tsetTimeout(() => reject(), 1000)\n\t// \t\t\t}),\n\t// \t\t],\n\t// \t)\n\t// \t\t// .then((value) => {console.log(\"race then value: \" + value)})\n\t// \t\t.catch(\n\t// \t\t\t(value) => {\n\t// \t\t\t\tconsole.log(\"race catch value: \" + value)\n\t// \t\t\t\treturn Promise.reject()\n\t// \t\t\t})\n\t// }\n\n\n\t// const promise1 = new Promise((resolve, reject) => {\n\t// \tsetTimeout(resolve, 500, \"one\")\n\t// })\n\t//\n\t// const promise2 = new Promise((resolve, reject) => {\n\t// \tsetTimeout(reject, 100, \"two\")\n\t// })\n\t//\n\t// let onlyRunIfResolves = function () {\n\t// \treturn Promise.race([promise1, promise2])\n\t// \t\t.catch(() => {\n\t// \t\t})\n\t// }\n\t//\n\t// onlyRunIfResolves()\n\t// \t.then(() => {\n\t// \t\tconsole.log(\"running function\")\n\t// \t})\n\n\n}(window.wpm = window.wpm || {}, jQuery));\n","/**\n * Load Google base\n */\n\n// Load base\nrequire(\"./functions\")\nrequire(\"./event_listeners\")\n\n// #if process.env.TIER === 'premium'\n// require(\"./functions_premium\")\n// require(\"./event_listeners_premium\")\n// #endif\n","/**\n * Load Google\n */\n\n// Load base\nrequire(\"./base/loader\")\n\n//Load additional Google libraries\nrequire(\"./ads/loader\")\nrequire(\"./analytics/loader\")\nrequire(\"./optimize/loader\")\n\n\n","/**\n * Load Google Optimize event listeners\n */\n\njQuery(document).on(\"wpmLoadPixels\", function () {\n\n\tif (wpmDataLayer?.pixels?.google?.optimize?.container_id && !wpmDataLayer?.pixels?.google?.optimize?.loaded) {\n\t\tif (wpm.canIFire(\"analytics\", \"google-optimize\")) wpm.load_google_optimize_pixel()\n\t}\n})\n","/**\n * Load Google Optimize functions\n */\n\n\n(function (wpm, $, undefined) {\n\n\twpm.load_google_optimize_pixel = function () {\n\n\t\ttry {\n\t\t\twpmDataLayer.pixels.google.optimize.loaded = true\n\n\t\t\twpm.loadScriptAndCacheIt(\"https://www.googleoptimize.com/optimize.js?id=\" + wpmDataLayer.pixels.google.optimize.container_id)\n\t\t\t// .done(function (script, textStatus) {\n\t\t\t// \t\tconsole.log('Google Optimize loaded')\n\t\t\t// });\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery));\n","/**\n * Load Google Optimize\n */\n\nrequire(\"./functions\")\nrequire(\"./event_listeners\")\n","/**\n * Load Hotjar event listeners\n */\n\n// Pixel load event listener\njQuery(document).on(\"wpmLoadPixels\", function () {\n\n\tif (wpmDataLayer?.pixels?.hotjar?.site_id && !wpmDataLayer?.pixels?.hotjar?.loaded) {\n\t\tif (wpm.canIFire(\"analytics\", \"hotjar\") && !wpmDataLayer?.pixels?.hotjar?.loaded) wpm.load_hotjar_pixel()\n\t}\n})\n","/**\n * Load Hotjar functions\n */\n\n(function (wpm, $, undefined) {\n\n\twpm.load_hotjar_pixel = function () {\n\n\t\ttry {\n\t\t\twpmDataLayer.pixels.hotjar.loaded = true;\n\n\t\t\t// @formatter:off\n\t\t\t(function(h,o,t,j,a,r){\n\t\t\t\th.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};\n\t\t\t\th._hjSettings={hjid:wpmDataLayer.pixels.hotjar.site_id,hjsv:6};\n\t\t\t\ta=o.getElementsByTagName('head')[0];\n\t\t\t\tr=o.createElement('script');r.async=1;\n\t\t\t\tr.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;\n\t\t\t\ta.appendChild(r);\n\t\t\t})(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv=');\n\t\t\t// @formatter:on\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery));\n","/**\n * Hotjar loader\n */\n\nrequire(\"./functions\")\nrequire(\"./event_listeners\")\n","/**\n * Register event listeners\n */\n\n// remove_from_cart event\njQuery(document).on(\"click\", \".remove_from_cart_button, .remove\", function () {\n\t// jQuery('.remove_from_cart_button, .remove').on('click', function (e) {\n\n\ttry {\n\t\t// console.log('remove_from_cart: ' + jQuery(this).data('product_id'));\n\n\t\tlet url = new URL(jQuery(this).attr(\"href\"))\n\t\tlet productId = wpm.getProductIdByCartItemKeyUrl(url)\n\n\t\twpm.removeProductFromCart(productId)\n\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n\n// add_to_cart event\njQuery(document).on(\"click\", \".add_to_cart_button:not(.product_type_variable), .ajax_add_to_cart, .single_add_to_cart_button\", function () {\n\t// jQuery('.add_to_cart_button:not(.product_type_variable), .ajax_add_to_cart, .js-ajax-add-to-cart, .single_add_to_cart_button, .btn_color-2').on('click', function (e) {\n\n\ttry {\n\t\t// console.log('add_to_cart');\n\n\t\tif (wpmDataLayer.shop.page_type === \"product\") {\n\n\t\t\t// first process related and upsell products\n\t\t\tif (typeof jQuery(this).attr(\"href\") !== \"undefined\" && jQuery(this).attr(\"href\").includes(\"add-to-cart\")) {\n\t\t\t\t// console.log('add-to-cart on upsell and related products');\n\t\t\t\tlet quantity = 1\n\t\t\t\tlet productId = jQuery(this).data(\"product_id\")\n\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\twpm.addProductToCart(productId, quantity)\n\t\t\t} else {\n\n\t\t\t\tif (wpmDataLayer.shop.product_type === \"simple\") {\n\n\t\t\t\t\t// console.log('test');\n\t\t\t\t\tlet quantity = Number(jQuery(\".input-text.qty\").val())\n\n\t\t\t\t\tif (!quantity && quantity !== 0) quantity = 1\n\n\t\t\t\t\tlet productId = jQuery(this).val()\n\n\t\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\t\t// console.log('quantity: ' + quantity);\n\n\t\t\t\t\twpm.addProductToCart(productId, quantity)\n\n\t\t\t\t} else if (wpmDataLayer.shop.product_type === \"variable\") {\n\n\t\t\t\t\t// console.log('variable');\n\n\t\t\t\t\tlet quantity = Number(jQuery(\".input-text.qty\").val())\n\n\t\t\t\t\tif (!quantity && quantity !== 0) quantity = 1\n\n\t\t\t\t\tlet productId = jQuery(\"[name='variation_id']\").val()\n\n\t\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\t\t// console.log('quantity: ' + quantity);\n\n\t\t\t\t\twpm.addProductToCart(productId, quantity)\n\n\t\t\t\t} else if (wpmDataLayer.shop.product_type === \"grouped\") {\n\n\t\t\t\t\t// console.log('grouped');\n\n\t\t\t\t\tjQuery(\".woocommerce-grouped-product-list-item\").each(function () {\n\n\t\t\t\t\t\tlet quantity = Number(jQuery(this).find(\".input-text.qty\").val())\n\n\t\t\t\t\t\tif (!quantity && quantity !== 0) quantity = 1\n\n\t\t\t\t\t\tlet classes = jQuery(this).attr(\"class\")\n\t\t\t\t\t\tlet productId = wpm.getPostIdFromString(classes)\n\n\t\t\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\t\t\t// console.log('quantity: ' + quantity);\n\n\t\t\t\t\t\twpm.addProductToCart(productId, quantity)\n\t\t\t\t\t})\n\t\t\t\t} else if (wpmDataLayer.shop.product_type === \"bundle\") {\n\n\t\t\t\t\t// console.log('bundle');\n\n\t\t\t\t\tlet quantity = Number(jQuery(\".input-text.qty\").val())\n\n\t\t\t\t\tif (!quantity && quantity !== 0) quantity = 1\n\n\t\t\t\t\tlet productId = jQuery(\"input[name=add-to-cart]\").val()\n\n\t\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\t\t// console.log('quantity: ' + quantity);\n\n\t\t\t\t\twpm.addProductToCart(productId, quantity)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\n\t\t\t// console.log('non product page');\n\n\t\t\tlet quantity = 1\n\t\t\tlet productId = jQuery(this).data(\"product_id\")\n\t\t\t// console.log('productId: ' + productId);\n\t\t\twpm.addProductToCart(productId, quantity)\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// if someone clicks anywhere on a custom /?add-to-cart=123 link\n// trigger the add to cart event\n// body.one('click', function (e) {\n//\n// try {\n// if (jQuery(this)[0].URL) {\n//\n// let href = new URL(jQuery(this)[0].URL);\n// let searchParams = new URLSearchParams(href.search);\n//\n// if (searchParams.has('add-to-cart')) {\n// // console.log('non product page, /?add-to-cart=123 link');\n//\n// let productId = searchParams.get('add-to-cart');\n// wpm.addProductToCart(productId, 1);\n// }\n// }\n// } catch (e) {\n// console.error(e);\n// }\n// });\n\n\n/**\n * If someone clicks anywhere on a custom /?add-to-cart=123 link\n * trigger the add to cart event\n */\njQuery(document).one(\"click\", \"a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)\", function (event) {\n\t// jQuery('a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)').one('click', function (event) {\n\n\ttry {\n\t\tif (jQuery(event.target).closest(\"a\").attr(\"href\")) {\n\n\t\t\tlet href = jQuery(event.target).closest(\"a\").attr(\"href\")\n\n\t\t\tif (href.includes(\"add-to-cart=\")) {\n\t\t\t\tlet matches = href.match(/(add-to-cart=)(\\d+)/)\n\t\t\t\t// console.log('pid: ' + matches[2])\n\t\t\t\tif (matches) wpm.addProductToCart(matches[2], 1)\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// select_content GA UA event\n// select_item GA 4 event\n// jQuery(document).on('click', '.woocommerce-LoopProduct-link, .wc-block-grid__product, .product-small.box', function (e) {\njQuery(document).on(\"click\", \".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product\", function () {\n\t// jQuery('.woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product').on('click', function (e) {\n\n\ttry {\n\n\t\t/**\n\t\t *\n\t\t * On some pages the event fires multiple times, and on product pages\n\t\t * even on page load. Using e.stopPropagation helps to prevent this,\n\t\t * but I dont know why. We don't even have to use this, since only a real\n\t\t * product click yields a valid productId. So we filter the invalid click\n\t\t * events out later down the code. I'll keep it that way because this is\n\t\t * the most compatible way across shops.\n\t\t * e.stopPropagation();\n\t\t * */\n\n\t\t\t// console.log('select_content and select_item');\n\n\t\tlet productId = jQuery(this).nextAll(\".wpmProductId:first\").data(\"id\")\n\t\t// console.log('select_content and select_item: ' + productId);\n\n\n\t\t/**\n\t\t * On product pages, for some reason, the click event is triggered on the main product on page load.\n\t\t * In that case no ID is found. But we can discard it, since we only want to trigger the event on\n\t\t * related products, which are found below.\n\t\t */\n\n\t\tif (productId) {\n\n\t\t\t// console.log('select_content and select_item: ' + productId);\n\n\t\t\tproductId = getIdBasedOndVariationsOutputSetting(productId)\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\t\t// console.log('prodid: ' + productId);\n\n\t\t\tif (wpmDataLayer.products && wpmDataLayer.products[productId]) {\n\n\t\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId)\n\n\t\t\t\tjQuery(document).trigger(\"wpmSelectContentGaUa\", product)\n\t\t\t\tjQuery(document).trigger(\"wpmSelectItem\", product)\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// begin_checkout event\njQuery(document).one(\"click\", \".checkout-button, .cart-checkout-button, .button.checkout\", function () {\n\t// jQuery('.checkout-button, .cart-checkout-button, .button.checkout').one('click', function (e) {\n\t// console.log('begin_checkout');\n\n\tjQuery(document).trigger(\"wpmBeginCheckout\")\n})\n\n\n// checkout_progress event\n// track checkout option event: entered valid billing email\njQuery(document).on(\"input\", \"#billing_email\", function () {\n\t// jQuery('#billing_email').on('input', function () {\n\n\tif (wpm.isEmail(jQuery(this).val())) {\n\t\t// wpm.fireCheckoutOption(2);\n\t\twpm.fireCheckoutProgress(2)\n\t\twpm.emailSelected = true\n\t}\n})\n\n// track checkout option event: purchase click\njQuery(document).on(\"click\", \".wc_payment_methods\", function () {\n\t// jQuery('.wc_payment_methods').on('click', function () {\n\n\tif (false === wpm.paymentMethodSelected) {\n\t\twpm.fireCheckoutProgress(3)\n\t}\n\n\twpm.fireCheckoutOption(3, jQuery(\"input[name='payment_method']:checked\").val())\n\twpm.paymentMethodSelected = true\n})\n\n// track checkout option event: purchase click\njQuery(document).one(\"click\", \"#place_order\", function () {\n\t// jQuery('#place_order').one('click', function () {\n\n\tif (false === wpm.emailSelected) {\n\t\twpm.fireCheckoutProgress(2)\n\t}\n\n\tif (false === wpm.paymentMethodSelected) {\n\t\twpm.fireCheckoutProgress(3)\n\t\twpm.fireCheckoutOption(3, jQuery(\"input[name='payment_method']:checked\").val())\n\t}\n\n\twpm.fireCheckoutProgress(4)\n})\n\n// update cart event\njQuery(document).on(\"click\", \"[name='update_cart']\", function () {\n\t// jQuery(\"[name='update_cart']\").on('click', function (e) {\n\n\ttry {\n\t\tjQuery(\".cart_item\").each(function () {\n\n\t\t\t// let productId = jQuery(this).find('[data-product_id]').data('product_id');\n\n\t\t\tlet url = new URL(jQuery(this).find(\".product-remove\").find(\"a\").attr(\"href\"))\n\t\t\tlet productId = wpm.getProductIdByCartItemKeyUrl(url)\n\n\n\t\t\tlet quantity = jQuery(this).find(\".qty\").val()\n\n\t\t\tif (quantity === 0) {\n\t\t\t\twpm.removeProductFromCart(productId)\n\t\t\t} else if (quantity < wpmDataLayer.cart[productId].quantity) {\n\t\t\t\twpm.removeProductFromCart(productId, wpmDataLayer.cart[productId].quantity - quantity)\n\t\t\t} else if (quantity > wpmDataLayer.cart[productId].quantity) {\n\t\t\t\twpm.addProductToCart(productId, quantity - wpmDataLayer.cart[productId].quantity)\n\t\t\t}\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t\twpm.getCartItemsFromBackend()\n\t}\n})\n\n\n// add_to_wishlist\njQuery(document).on(\"click\", \".add_to_wishlist, .wl-add-to\", function () {\n\t// jQuery('.add_to_wishlist, .wl-add-to').on('click', function () {\n\n\ttry {\n\t\t// console.log('add_to_wishlist');\n\t\t// console.log('this:' + jQuery(this).data('product-id'));\n\n\t\tlet productId\n\n\t\tif (jQuery(this).data(\"productid\")) { // for the WooCommerce wishlist plugin\n\t\t\tproductId = jQuery(this).data(\"productid\")\n\t\t} else if (jQuery(this).data(\"product-id\")) { // for the YITH wishlist plugin\n\t\t\tproductId = jQuery(this).data(\"product-id\")\n\t\t}\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId)\n\n\t\t// console.log('add_to_wishlist');\n\t\t// console.log(product);\n\n\t\tjQuery(document).trigger(\"wpmAddToWishlist\", product)\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\njQuery(document).on(\"updated_cart_totals\", function () {\n\tjQuery(document).trigger(\"wpmViewCart\")\n})\n\n\n/**\n * Called when the user selects all the required dropdowns / attributes\n *\n * Has to be hooked after document ready\n *\n * https://stackoverflow.com/a/27849208/4688612\n * https://stackoverflow.com/a/65065335/4688612\n */\njQuery(\".single_variation_wrap\").on(\"show_variation\", function (event, variation) {\n\n\ttry {\n\t\tlet productId = getIdBasedOndVariationsOutputSetting(variation.variation_id)\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\tif (wpmDataLayer.products && wpmDataLayer.products[productId]) {\n\n\t\t\t// console.log('productId: ' + productId);\n\n\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId)\n\n\t\t\tjQuery(document).trigger(\"wpmViewItem\", product)\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n/**\n * Called on variable products when no selection has been done yet\n * or when the visitor deselects his choice.\n *\n * Has to be hooked after document ready\n */\n\njQuery(\".single_variation_wrap\").on(\"hide_variation\", function () {\n\n\ttry {\n\t\tlet classes = jQuery(\"body\").attr(\"class\")\n\t\tlet productId = classes.match(/(postid-)(\\d+)/)[2]\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\t/**\n\t\t * If we have a variable product with no preset,\n\t\t * and variations output is enabled,\n\t\t * then we send a viewItem event with the first\n\t\t * variation we find for the parent.\n\t\t * If variations output is disabled,\n\t\t * we just send the parent ID.\n\t\t */\n\t\tif (\n\t\t\t\"variable\" === wpmDataLayer.shop.product_type &&\n\t\t\twpmDataLayer?.general?.variationsOutput\n\t\t) {\n\t\t\tfor (const [key, product] of Object.entries(wpmDataLayer.products)) {\n\t\t\t\tif (\"parentId\" in product) {\n\t\t\t\t\t// console.log('pid: ' + value.parentId)\n\t\t\t\t\tproductId = product.id\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (wpmDataLayer.products && wpmDataLayer.products[productId]) {\n\n\t\t\t// console.log('productId: ' + productId);\n\n\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId)\n\n\t\t\tjQuery(document).trigger(\"wpmViewItem\", product)\n\t\t}\n\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n\n/**\n * Set up wpm events\n */\n\n\n// populate the wpmDataLayer with the cart items\njQuery(window).on(\"wpmLoad\", function () {\n\n\ttry {\n\t\t// When a new session is initiated there are no items in the cart,\n\t\t// so we can save the call to get the cart items\n\t\tif (wpm.doesWooCommerceCartExist()) wpm.getCartItems()\n\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// get all add-to-cart= products from backend\njQuery(window).on(\"wpmLoad\", function () {\n\n\twpmDataLayer.products = wpmDataLayer.products || {}\n\n\t// scan page for add-to-cart= links\n\tlet productIds = wpm.getAddToCartLinkProductIds()\n\n\twpm.getProductsFromBackend(productIds)\n})\n\n/**\n * Save the referrer into a cookie\n */\n\njQuery(window).on(\"wpmLoad\", function () {\n\n\t// can't use session storage as we can't read it from the server\n\tif (!wpm.getCookie(\"wpmReferrer\")) {\n\n\t\tif (document.referrer) {\n\t\t\tlet referrerUrl = new URL(document.referrer)\n\t\t\tlet referrerHostname = referrerUrl.hostname\n\n\t\t\tif (referrerHostname !== window.location.host) {\n\t\t\t\twpm.setCookie(\"wpmReferrer\", referrerHostname)\n\t\t\t} else {\n\t\t\t\twpm.setCookie(\"wpmReferrer\", \"\")\n\t\t\t}\n\n\t\t} else {\n\t\t\twpm.setCookie(\"wpmReferrer\", \"\")\n\t\t}\n\t}\n})\n\n\n/**\n * Create our own load event in order to better handle script flow execution when JS \"optimizers\" shuffle the code.\n */\n\njQuery(window).on(\"wpmLoad\", function () {\n\ttry {\n\t\tif (typeof wpmDataLayer != \"undefined\" && !wpmDataLayer?.wpmLoadFired) {\n\n\t\t\tjQuery(document).trigger(\"wpmLoadAlways\")\n\n\t\t\tif (\"product\" === wpmDataLayer.shop.page_type && wpmDataLayer.shop.product_type !== \"variable\" && wpm.getMainProductIdFromProductPage()) {\n\n\t\t\t\tlet product = wpm.getProductDataForViewItemEvent(wpm.getMainProductIdFromProductPage())\n\t\t\t\tjQuery(document).trigger(\"wpmViewItem\", product)\n\n\t\t\t} else if (\"product_category\" === wpmDataLayer.shop.page_type) {\n\n\t\t\t\tjQuery(document).trigger(\"wpmCategory\")\n\n\t\t\t} else if (\"search\" === wpmDataLayer.shop.page_type) {\n\n\t\t\t\tjQuery(document).trigger(\"wpmSearch\")\n\n\t\t\t} else if (\"cart\" === wpmDataLayer.shop.page_type) {\n\n\t\t\t\tjQuery(document).trigger(\"wpmViewCart\")\n\n\t\t\t} else if (\"order_received_page\" === wpmDataLayer.shop.page_type && wpmDataLayer.order) {\n\n\t\t\t\tif (!wpm.isOrderIdStored(wpmDataLayer.order.id)) {\n\n\t\t\t\t\tjQuery(document).trigger(\"wpmOrderReceivedPage\")\n\t\t\t\t\twpm.writeOrderIdToStorage(wpmDataLayer.order.id)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tjQuery(document).trigger(\"wpmEverywhereElse\")\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.user?.id && !wpm.hasLoginEventFired()) {\n\t\t\t\tjQuery(document).trigger(\"wpmLogin\")\n\t\t\t\twpm.setLoginEventFired()\n\t\t\t}\n\n\t\t\t// /**\n\t\t\t// * Load mini cart fragments into a wpm session storage key,\n\t\t\t// * after the document load event.\n\t\t\t// */\n\t\t\t// jQuery(document).ajaxSend(function (event, jqxhr, settings) {\n\t\t\t// \t// console.log('settings.url: ' + settings.url);\n\t\t\t//\n\t\t\t// \tif (settings.url.includes(\"get_refreshed_fragments\") && sessionStorage) {\n\t\t\t// \t\tif (!sessionStorage.getItem(\"wpmMiniCartActive\")) {\n\t\t\t// \t\t\tsessionStorage.setItem(\"wpmMiniCartActive\", JSON.stringify(true))\n\t\t\t// \t\t}\n\t\t\t// \t}\n\t\t\t// })\n\n\t\t\twpmDataLayer.wpmLoadFired = true\n\t\t}\n\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// jQuery(window).on(\"load\", function () {\n// \tjQuery(document).trigger(\"wpmLoad\", {})\n// })\n\njQuery(window).on(\"wpmPreLoadPixels\", function () {\n\n\tif (wpmDataLayer?.shop?.cookie_consent_mgmt?.explicit_consent) {\n\t\twpm.updateConsentCookieValues(true)\n\t}\n\tjQuery(document).trigger(\"wpmLoadPixels\", {})\n})\n","/**\n * Create a wpm namespace under which all functions are declared\n */\n\n// https://stackoverflow.com/a/5947280/4688612\n(function (wpm, $, undefined) {\n\n\tconst wpmDeduper = {\n\t\tkeyName : \"_wpm_order_ids\",\n\t\tcookieExpiresDays: 365,\n\t}\n\n\tconst wpmRestSettings = {\n\t\t// cookiesAvailable : '_wpm_cookies_are_available',\n\t\tcookieWpmRestEndpointAvailable: \"_wpm_endpoint_available\",\n\t\trestEndpoint : \"/wp-json/\",\n\t\trestFails : 0,\n\t\trestFailsThreshold : 10,\n\t}\n\n\twpm.emailSelected = false\n\twpm.paymentMethodSelected = false\n\n\t// wpm.checkIfCookiesAvailable = function () {\n\t//\n\t// // read the cookie if previously set, if it is return true, otherwise continue\n\t// if (wpm.getCookie(wpmRestSettings.cookiesAvailable)) {\n\t// return true;\n\t// }\n\t//\n\t// // set the cookie for the session\n\t// Cookies.set(wpmRestSettings.cookiesAvailable, true);\n\t//\n\t// // read cookie, true if ok, false if not ok\n\t// return !!wpm.getCookie(wpmRestSettings.cookiesAvailable);\n\t// }\n\n\twpm.useRestEndpoint = function () {\n\n\t\t// only if sessionStorage is available\n\n\t\t// only if REST API endpoint is generally accessible\n\t\t// check in sessionStorage if we checked before and return answer\n\t\t// otherwise check if the endpoint is available, save answer in sessionStorage and return answer\n\n\t\t// only if not too many REST API errors happened\n\n\t\treturn wpm.isSessionStorageAvailable() &&\n\t\t\twpm.isRestEndpointAvailable() &&\n\t\t\twpm.isBelowRestErrorThreshold()\n\t}\n\n\twpm.isBelowRestErrorThreshold = function () {\n\t\treturn window.sessionStorage.getItem(wpmRestSettings.restFails) <= wpmRestSettings.restFailsThreshold\n\t}\n\n\twpm.isRestEndpointAvailable = function () {\n\n\t\tif (window.sessionStorage.getItem(wpmRestSettings.cookieWpmRestEndpointAvailable)) {\n\t\t\treturn JSON.parse(window.sessionStorage.getItem(wpmRestSettings.cookieWpmRestEndpointAvailable))\n\t\t} else {\n\t\t\t// return wpm.testEndpoint();\n\t\t\t// just set the value whenever possible in order not to wait or block the main thread\n\t\t\twpm.testEndpoint()\n\t\t}\n\t}\n\n\twpm.isSessionStorageAvailable = function () {\n\n\t\treturn !!window.sessionStorage\n\t}\n\n\twpm.testEndpoint = function (\n\t\turl = location.protocol + \"//\" + location.host + wpmRestSettings.restEndpoint,\n\t\tcookieName = wpmRestSettings.cookieWpmRestEndpointAvailable,\n\t) {\n\t\t// console.log('testing endpoint');\n\n\t\tjQuery.ajax(url, {\n\t\t\ttype : \"HEAD\",\n\t\t\ttimeout: 1000,\n\t\t\t// async: false,\n\t\t\tstatusCode: {\n\t\t\t\t200: function (response) {\n\t\t\t\t\t// Cookies.set(cookieName, true);\n\t\t\t\t\t// console.log('endpoint works');\n\t\t\t\t\twindow.sessionStorage.setItem(cookieName, JSON.stringify(true))\n\t\t\t\t},\n\t\t\t\t404: function (response) {\n\t\t\t\t\t// Cookies.set(cookieName, false);\n\t\t\t\t\t// console.log('endpoint doesn\\'t work');\n\t\t\t\t\twindow.sessionStorage.setItem(cookieName, JSON.stringify(false))\n\t\t\t\t},\n\t\t\t\t0 : function (response) {\n\t\t\t\t\t// Cookies.set(cookieName, false);\n\t\t\t\t\t// console.log('endpoint doesn\\'t work');\n\t\t\t\t\twindow.sessionStorage.setItem(cookieName, JSON.stringify(false))\n\t\t\t\t},\n\t\t\t},\n\t\t}).then(response => {\n\t\t\t// console.log('test done')\n\t\t\t// console.log('result: ' + JSON.parse(window.sessionStorage.getItem(cookieName)));\n\t\t\t// return JSON.parse(window.sessionStorage.getItem(cookieName));\n\t\t})\n\t}\n\n\twpm.isWpmRestEndpointAvailable = function (cookieName = wpmRestSettings.cookieWpmRestEndpointAvailable) {\n\n\t\treturn !!wpm.getCookie(cookieName)\n\t}\n\n\twpm.writeOrderIdToStorage = function (orderId, expireDays = 365) {\n\n\t\t// save the order ID in the browser storage\n\n\t\tif (!window.Storage) {\n\t\t\tlet expiresDate = new Date()\n\t\t\texpiresDate.setDate(expiresDate.getDate() + wpmDeduper.cookieExpiresDays)\n\n\t\t\tlet ids = []\n\t\t\tif (checkCookie()) {\n\t\t\t\tids = JSON.parse(wpm.getCookie(wpmDeduper.keyName))\n\t\t\t}\n\n\t\t\tif (!ids.includes(orderId)) {\n\t\t\t\tids.push(orderId)\n\t\t\t\tdocument.cookie = wpmDeduper.keyName + \"=\" + JSON.stringify(ids) + \";expires=\" + expiresDate.toUTCString()\n\t\t\t}\n\n\t\t} else {\n\t\t\tif (localStorage.getItem(wpmDeduper.keyName) === null) {\n\t\t\t\tlet ids = []\n\t\t\t\tids.push(orderId)\n\t\t\t\twindow.localStorage.setItem(wpmDeduper.keyName, JSON.stringify(ids))\n\n\t\t\t} else {\n\t\t\t\tlet ids = JSON.parse(localStorage.getItem(wpmDeduper.keyName))\n\t\t\t\tif (!ids.includes(orderId)) {\n\t\t\t\t\tids.push(orderId)\n\t\t\t\t\twindow.localStorage.setItem(wpmDeduper.keyName, JSON.stringify(ids))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (typeof wpm.storeOrderIdOnServer === \"function\" && wpmDataLayer.orderDeduplication) {\n\t\t\twpm.storeOrderIdOnServer(orderId)\n\t\t}\n\t}\n\n\tfunction checkCookie() {\n\t\tlet key = wpm.getCookie(wpmDeduper.keyName)\n\t\treturn key !== \"\"\n\t}\n\n\twpm.isOrderIdStored = function (orderId) {\n\n\t\t// console.log('deduper: ' + wpmDataLayer.orderDeduplication);\n\t\tif (wpmDataLayer.orderDeduplication) {\n\t\t\t// console.log('order deduplication: on');\n\t\t\tif (!window.Storage) {\n\n\t\t\t\tif (checkCookie()) {\n\t\t\t\t\tlet ids = JSON.parse(wpm.getCookie(wpmDeduper.keyName))\n\t\t\t\t\treturn ids.includes(orderId)\n\t\t\t\t} else {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (localStorage.getItem(wpmDeduper.keyName) !== null) {\n\t\t\t\t\tlet ids = JSON.parse(localStorage.getItem(wpmDeduper.keyName))\n\t\t\t\t\treturn ids.includes(orderId)\n\t\t\t\t} else {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.log(\"order duplication prevention: off\")\n\t\t\treturn false\n\t\t}\n\t}\n\n\twpm.isEmail = function (email) {\n\t\t// https://emailregex.com/\n\t\tlet regex = /^(([^<>()\\[\\]\\\\.,;:\\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,}))$/\n\t\treturn regex.test(email)\n\t}\n\n\twpm.removeProductFromCart = function (productId, quantityToRemove = null) {\n\t\t// console.log('product_id: ' + productId + ' | quantityToRemove: ' + quantityToRemove);\n\n\t\ttry {\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\t\tproductId = getIdBasedOndVariationsOutputSetting(productId)\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\t\tlet quantity\n\n\t\t\tif (quantityToRemove == null) {\n\t\t\t\tquantity = wpmDataLayer.cart[productId].quantity\n\t\t\t} else {\n\t\t\t\tquantity = quantityToRemove\n\t\t\t}\n\n\t\t\t// console.log('product_id: ' + productId + ' | qty: ' + quantity);\n\t\t\t// console.log(productId);\n\t\t\t// console.log(wpmDataLayer.cart);\n\t\t\t// console.log(wpmDataLayer.cart[productId]);\n\n\t\t\tif (wpmDataLayer.cart[productId]) {\n\n\t\t\t\t// let product = {\n\t\t\t\t// id : productId.toString(),\n\t\t\t\t// dyn_r_ids: wpmDataLayer.cart[productId].dyn_r_ids,\n\t\t\t\t// name : wpmDataLayer.cart[productId].name,\n\t\t\t\t// // list_name: wpmDataLayer.shop.list_name, // doesn't make sense on mini_cart\n\t\t\t\t// brand : wpmDataLayer.cart[productId].brand,\n\t\t\t\t// category: wpmDataLayer.cart[productId].category,\n\t\t\t\t// variant : wpmDataLayer.cart[productId].variant,\n\t\t\t\t// // list_position: wpmDataLayer.cart[productId].position, // doesn't make sense on mini_cart\n\t\t\t\t// quantity : quantity,\n\t\t\t\t// price : wpmDataLayer.cart[productId].price,\n\t\t\t\t// isVariation: wpmDataLayer.products[productId].isVariation,\n\t\t\t\t// };\n\t\t\t\t//\n\t\t\t\t// if (product.isVariation) product['parentId_dyn_r_ids'] = wpmDataLayer.products[productId].parentId_dyn_r_ids;\n\n\t\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId, quantity)\n\n\t\t\t\t// console.log('removing');\n\t\t\t\t// console.log(data);\n\n\t\t\t\tjQuery(document).trigger(\"wpmRemoveFromCart\", product)\n\n\t\t\t\tif (quantityToRemove == null || wpmDataLayer.cart[productId].quantity === quantityToRemove) {\n\t\t\t\t\tdelete wpmDataLayer.cart[productId]\n\t\t\t\t\tif (sessionStorage) sessionStorage.setItem(\"wpmDataLayerCart\", JSON.stringify(wpmDataLayer.cart))\n\t\t\t\t} else {\n\t\t\t\t\twpmDataLayer.cart[productId].quantity = wpmDataLayer.cart[productId].quantity - quantity\n\t\t\t\t\tif (sessionStorage) sessionStorage.setItem(\"wpmDataLayerCart\", JSON.stringify(wpmDataLayer.cart))\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t\t// console.log('getting cart from back end');\n\t\t\t// wpm.getCartItemsFromBackend();\n\t\t\t// console.log('getting cart from back end done');\n\n\t\t}\n\t}\n\n\tgetIdBasedOndVariationsOutputSetting = function (productId) {\n\n\t\ttry {\n\t\t\tif (wpmDataLayer?.general?.variationsOutput) {\n\t\t\t\t// console.log('test');\n\t\t\t\treturn productId\n\t\t\t} else {\n\t\t\t\tif (wpmDataLayer.products[productId].isVariation) {\n\t\t\t\t\treturn wpmDataLayer.products[productId].parentId\n\t\t\t\t} else {\n\t\t\t\t\treturn productId\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\t// add_to_cart\n\twpm.addProductToCart = function (productId, quantity) {\n\n\t\ttry {\n\t\t\t// console.log('productId: ' + productId + ' | qty: ' + quantity);\n\t\t\t// console.log('productId: ' + productId + ' | variationId: ' + variationId + ' | qty: ' + quantity);\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\t\tproductId = getIdBasedOndVariationsOutputSetting(productId)\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\t\tif (wpmDataLayer?.products[productId]) {\n\n\t\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId, quantity)\n\n\t\t\t\t// console.log(productId)\n\t\t\t\t// console.log(wpmDataLayer.cart)\n\n\t\t\t\tjQuery(document).trigger(\"wpmAddToCart\", product)\n\n\t\t\t\t// add product to cart wpmDataLayer['cart']\n\n\t\t\t\t// if the product already exists in the object, only add the additional quantity\n\t\t\t\t// otherwise create that product object in the wpmDataLayer['cart']\n\t\t\t\tif (wpmDataLayer?.cart[productId]) {\n\t\t\t\t\twpmDataLayer.cart[productId].quantity = wpmDataLayer.cart[productId].quantity + quantity\n\t\t\t\t} else {\n\n\t\t\t\t\tif (!(\"cart\" in wpmDataLayer)) wpmDataLayer.cart = {}\n\t\t\t\t\twpmDataLayer.cart[productId] = wpm.getProductDetailsFormattedForEvent(productId, quantity)\n\t\t\t\t}\n\n\t\t\t\tif (sessionStorage) sessionStorage.setItem(\"wpmDataLayerCart\", JSON.stringify(wpmDataLayer.cart))\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\n\t\t\t// fallback if wpmDataLayer.cart and wpmDataLayer.products got out of sync in case cart caching has an issue\n\t\t\twpm.getCartItemsFromBackend()\n\t\t}\n\t}\n\n\twpm.getCartItems = function () {\n\n\t\t// console.log('get cart items');\n\n\t\tif (sessionStorage) {\n\t\t\tif (!sessionStorage.getItem(\"wpmDataLayerCart\") || wpmDataLayer.shop.page_type === \"order_received_page\") {\n\t\t\t\tsessionStorage.setItem(\"wpmDataLayerCart\", JSON.stringify({}))\n\t\t\t} else {\n\t\t\t\twpm.saveCartObjectToDataLayer(JSON.parse(sessionStorage.getItem(\"wpmDataLayerCart\")))\n\t\t\t}\n\t\t} else {\n\t\t\twpm.getCartItemsFromBackend()\n\t\t}\n\t}\n\n\t// get all cart items from the backend\n\twpm.getCartItemsFromBackend = function () {\n\t\ttry {\n\t\t\tlet data = {\n\t\t\t\taction: \"wpm_get_cart_items\",\n\t\t\t}\n\n\t\t\tjQuery.ajax(\n\t\t\t\t{\n\t\t\t\t\ttype : \"get\",\n\t\t\t\t\tdataType: \"json\",\n\t\t\t\t\t// url : ajax_object.ajax_url,\n\t\t\t\t\turl : wpm.ajax_url,\n\t\t\t\t\tdata : data,\n\t\t\t\t\tsuccess: function (cartItems) {\n\n\t\t\t\t\t\t// save all cart items into wpmDataLayer\n\n\t\t\t\t\t\tif (!cartItems[\"cart\"]) cartItems[\"cart\"] = {}\n\n\t\t\t\t\t\twpm.saveCartObjectToDataLayer(cartItems[\"cart\"])\n\t\t\t\t\t\tif (sessionStorage) sessionStorage.setItem(\"wpmDataLayerCart\", JSON.stringify(cartItems[\"cart\"]))\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.getProductsFromBackend = function (productIds) {\n\t\t// console.log('getting pids from back-end: ' + productIds)\n\t\t// get productIds from the backend\n\n\t\t// reduce productIds by products already in the dataLayer\n\t\tproductIds = productIds.filter(item => !wpmDataLayer.products.hasOwnProperty(item))\n\n\t\t// if no products IDs are in the object, don't try to get anything from the server\n\t\tif (!productIds || productIds.length === 0) return\n\n\t\ttry {\n\t\t\tlet data = {\n\t\t\t\taction : \"wpm_get_product_ids\",\n\t\t\t\tproductIds: productIds,\n\t\t\t}\n\n\t\t\tjQuery.ajax(\n\t\t\t\t{\n\t\t\t\t\ttype : \"get\",\n\t\t\t\t\tdataType: \"json\",\n\t\t\t\t\t// url : ajax_object.ajax_url,\n\t\t\t\t\turl : wpm.ajax_url,\n\t\t\t\t\tdata : data,\n\t\t\t\t\tsuccess: function (products) {\n\n\t\t\t\t\t\t// merge products into wpmDataLayer.products\n\t\t\t\t\t\twpmDataLayer.products = Object.assign({}, wpmDataLayer.products, products)\n\t\t\t\t\t},\n\t\t\t\t\terror : function (response) {\n\t\t\t\t\t\tconsole.log(response)\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.saveCartObjectToDataLayer = function (cartObject) {\n\t\twpmDataLayer.cart = cartObject\n\t\twpmDataLayer.products = Object.assign({}, wpmDataLayer.products, cartObject)\n\t}\n\n\twpm.fireCheckoutOption = function (step, checkout_option = null, value = null) {\n\n\t\tlet data = {\n\t\t\tstep : step,\n\t\t\tcheckout_option: checkout_option,\n\t\t\tvalue : value,\n\t\t}\n\n\t\tjQuery(document).trigger(\"wpmFireCheckoutOption\", data)\n\t}\n\n\twpm.fireCheckoutProgress = function (step) {\n\n\t\tlet data = {\n\t\t\tstep: step,\n\t\t}\n\n\t\tjQuery(document).trigger(\"wpmFireCheckoutProgress\", data)\n\t}\n\n\twpm.getPostIdFromString = function (string) {\n\t\t// console.log(string);\n\t\ttry {\n\t\t\treturn string.match(/(post-)(\\d+)/)[2]\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.triggerViewItemList = function (productId) {\n\n\t\t// productId = null;\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\tproductId = getIdBasedOndVariationsOutputSetting(productId)\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\tjQuery(document).trigger(\"wpmViewItemList\", wpm.getProductDataForViewItemEvent(productId))\n\t}\n\n\twpm.getProductDataForViewItemEvent = function (productId) {\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\ttry {\n\t\t\tif (wpmDataLayer.products[productId]) {\n\n\t\t\t\treturn wpm.getProductDetailsFormattedForEvent(productId)\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\twpm.getMainProductIdFromProductPage = function () {\n\t\ttry {\n\t\t\tif ([\"simple\", \"variable\", \"grouped\", \"composite\", \"bundle\"].indexOf(wpmDataLayer.shop.product_type) >= 0) {\n\t\t\t\treturn jQuery(\".wpmProductId:first\").data(\"id\")\n\t\t\t} else {\n\t\t\t\treturn false\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.viewItemListTriggerTestMode = function (target) {\n\n\t\tjQuery(target).css({\"position\": \"relative\"})\n\t\tjQuery(target).append(\"<div id=\\\"viewItemListTriggerOverlay\\\"></div>\")\n\t\tjQuery(target).find(\"#viewItemListTriggerOverlay\").css({\n\t\t\t\"z-index\" : \"10\",\n\t\t\t\"display\" : \"block\",\n\t\t\t\"position\" : \"absolute\",\n\t\t\t\"height\" : \"100%\",\n\t\t\t\"top\" : \"0\",\n\t\t\t\"left\" : \"0\",\n\t\t\t\"right\" : \"0\",\n\t\t\t\"opacity\" : wpmDataLayer.viewItemListTrigger.opacity,\n\t\t\t\"background-color\": wpmDataLayer.viewItemListTrigger.backgroundColor,\n\t\t})\n\t}\n\n\twpm.getSearchTermFromUrl = function () {\n\t\ttry {\n\t\t\tlet urlParameters = new URLSearchParams(window.location.search)\n\t\t\treturn urlParameters.get(\"s\")\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\t// we need this to track timeouts for intersection observers\n\tlet ioTimeouts = {}\n\n\twpm.observerCallback = function (entries, observer) {\n\n\t\tentries.forEach((entry) => {\n\n\t\t\ttry {\n\t\t\t\tlet productId\n\n\t\t\t\tlet elementId = jQuery(entry.target).data(\"ioid\")\n\n\t\t\t\t// Get the productId from next element, if wpmProductId is a sibling, like in Gutenberg blocks\n\t\t\t\t// otherwise go search in children, like in regular WC loop items\n\t\t\t\tif (jQuery(entry.target).next(\".wpmProductId\").length) {\n\t\t\t\t\t// console.log('test 1');\n\t\t\t\t\tproductId = jQuery(entry.target).next(\".wpmProductId\").data(\"id\")\n\t\t\t\t} else {\n\t\t\t\t\tproductId = jQuery(entry.target).find(\".wpmProductId\").data(\"id\")\n\t\t\t\t}\n\n\t\t\t\t// productId = null;\n\n\t\t\t\tif (!productId) throw Error(\"wpmProductId element not found\")\n\n\t\t\t\tif (entry.isIntersecting) {\n\n\t\t\t\t\t// console.log('prodid: ' + productId);\n\t\t\t\t\tioTimeouts[elementId] = setTimeout(() => {\n\t\t\t\t\t\t// console.log('prodid: ' + productId);\n\t\t\t\t\t\twpm.triggerViewItemList(productId)\n\t\t\t\t\t\tif (wpmDataLayer.viewItemListTrigger.testMode) wpm.viewItemListTriggerTestMode(entry.target)\n\t\t\t\t\t\tif (wpmDataLayer.viewItemListTrigger.repeat === false) observer.unobserve(entry.target)\n\t\t\t\t\t}, wpmDataLayer.viewItemListTrigger.timeout)\n\n\t\t\t\t} else {\n\n\t\t\t\t\tclearTimeout(ioTimeouts[elementId])\n\t\t\t\t\tif (wpmDataLayer.viewItemListTrigger.testMode) jQuery(entry.target).find(\"#viewItemListTriggerOverlay\").remove()\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e)\n\t\t\t}\n\t\t})\n\t}\n\n\t// fire view_item_list only on products that have become visible\n\tlet io\n\tlet ioid = 0\n\tlet allIoElementsToWatch\n\n\tlet getAllElementsToWatch = function () {\n\n\t\tallIoElementsToWatch = jQuery(\".wpmProductId\")\n\t\t\t.map(function (i, elem) {\n\t\t\t\t// console.log(elem);\n\t\t\t\tif (\n\t\t\t\t\tjQuery(elem).parent().hasClass(\"type-product\") ||\n\t\t\t\t\tjQuery(elem).parent().hasClass(\"product\") ||\n\t\t\t\t\tjQuery(elem).parent().hasClass(\"product-item-inner\")\n\t\t\t\t) {\n\t\t\t\t\t// console.log(elem);\n\t\t\t\t\treturn jQuery(elem).parent()\n\t\t\t\t} else if (\n\t\t\t\t\tjQuery(elem).prev().hasClass(\"wc-block-grid__product\") ||\n\t\t\t\t\tjQuery(elem).prev().hasClass(\"product\") ||\n\t\t\t\t\tjQuery(elem).prev().hasClass(\"product-small\") ||\n\t\t\t\t\tjQuery(elem).prev().hasClass(\"woocommerce-LoopProduct-link\")\n\t\t\t\t) {\n\t\t\t\t\treturn jQuery(this).prev()\n\t\t\t\t} else if (jQuery(elem).closest(\".product\").length) {\n\t\t\t\t\treturn jQuery(elem).closest(\".product\")\n\t\t\t\t}\n\t\t\t})\n\t}\n\n\twpm.startIntersectionObserverToWatch = function () {\n\n\t\ttry {\n\t\t\t// enable view_item_list test mode from browser\n\t\t\tif (wpm.urlHasParameter(\"vildemomode\")) wpmDataLayer.viewItemListTrigger.testMode = true\n\n\t\t\t// set up intersection observer\n\t\t\tio = new IntersectionObserver(wpm.observerCallback, {\n\t\t\t\tthreshold: wpmDataLayer.viewItemListTrigger.threshold,\n\t\t\t})\n\n\t\t\tgetAllElementsToWatch()\n\n\t\t\t// console.log(allElementsToWatch);\n\n\t\t\tallIoElementsToWatch.each(function (i, elem) {\n\t\t\t\t// console.log(elem[0]);\n\t\t\t\t// jQuery(elem[0]).attr('data-ioid', ioid++);\n\t\t\t\tjQuery(elem[0]).data(\"ioid\", ioid++)\n\n\t\t\t\tio.observe(elem[0])\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\t// watch DOM for new lazy loaded products and add them to the intersection observer\n\twpm.startProductsMutationObserverToWatch = function () {\n\n\t\ttry {\n\t\t\t// Pass in the target node, as well as the observer options\n\n\t\t\t// selects the most common parent node\n\t\t\t// https://stackoverflow.com/a/7648323/4688612\n\t\t\tlet productsNode = jQuery(\".wpmProductId:eq(0)\").parents().has(jQuery(\".wpmProductId:eq(1)\").parents()).first()\n\n\t\t\tif (productsNode.length) {\n\t\t\t\tproductsMutationObserver.observe(productsNode[0], {\n\t\t\t\t\tattributes : true,\n\t\t\t\t\tchildList : true,\n\t\t\t\t\tcharacterData: true,\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\t// Create an observer instance\n\tlet productsMutationObserver = new MutationObserver(function (mutations) {\n\n\t\tmutations.forEach(function (mutation) {\n\t\t\tlet newNodes = mutation.addedNodes // DOM NodeList\n\t\t\tif (newNodes !== null) { // If there are new nodes added\n\t\t\t\tlet nodes = jQuery(newNodes) // jQuery set\n\t\t\t\tnodes.each(function () {\n\t\t\t\t\tif (\n\t\t\t\t\t\tjQuery(this).hasClass(\"type-product\") ||\n\t\t\t\t\t\tjQuery(this).hasClass(\"product-small\") ||\n\t\t\t\t\t\tjQuery(this).hasClass(\"wc-block-grid__product\")\n\t\t\t\t\t) {\n\t\t\t\t\t\t// check if the node has a child or sibling wpmProductId\n\t\t\t\t\t\t// if yes add it to the intersectionObserver\n\t\t\t\t\t\tif (hasWpmProductIdElement(this)) {\n\t\t\t\t\t\t\tjQuery(this).data(\"ioid\", ioid++)\n\t\t\t\t\t\t\tio.observe(this)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t})\n\n\tlet hasWpmProductIdElement = function (elem) {\n\t\treturn !!(jQuery(elem).find(\".wpmProductId\").length ||\n\t\t\tjQuery(elem).siblings(\".wpmProductId\").length)\n\t}\n\n\twpm.setCookie = function (cookieName, cookieValue = \"\", expiryDays = null) {\n\t\tif (expiryDays) {\n\t\t\tlet d = new Date()\n\t\t\td.setTime(d.getTime() + (expiryDays * 24 * 60 * 60 * 1000))\n\t\t\tlet expires = \"expires=\" + d.toUTCString()\n\t\t\tdocument.cookie = cookieName + \"=\" + cookieValue + \";\" + expires + \";path=/\"\n\t\t} else {\n\t\t\tdocument.cookie = cookieName + \"=\" + cookieValue + \";path=/\"\n\t\t}\n\t}\n\n\twpm.getCookie = function (cookieName) {\n\t\tlet name = cookieName + \"=\"\n\t\tlet decodedCookie = decodeURIComponent(document.cookie)\n\t\tlet ca = decodedCookie.split(\";\")\n\t\tfor (let i = 0; i < ca.length; i++) {\n\t\t\tlet c = ca[i]\n\t\t\twhile (c.charAt(0) == \" \") {\n\t\t\t\tc = c.substring(1)\n\t\t\t}\n\t\t\tif (c.indexOf(name) == 0) {\n\t\t\t\treturn c.substring(name.length, c.length)\n\t\t\t}\n\t\t}\n\t\treturn \"\"\n\t}\n\n\twpm.getWpmSessionData = function () {\n\t\tif (window.sessionStorage) {\n\n\t\t\tlet data = window.sessionStorage.getItem(\"_wpm\")\n\t\t\tif (data !== null) {\n\t\t\t\treturn JSON.parse(data)\n\t\t\t} else {\n\t\t\t\treturn {}\n\t\t\t}\n\t\t} else {\n\t\t\treturn {}\n\t\t}\n\t}\n\n\twpm.setWpmSessionData = function (data) {\n\t\tif (window.sessionStorage) {\n\t\t\twindow.sessionStorage.setItem(\"_wpm\", JSON.stringify(data))\n\t\t}\n\t}\n\n\twpm.storeOrderIdOnServer = function (orderId) {\n\n\t\t// console.log('saving wpm_purchase_pixels_fired');\n\n\t\t// console.log('url: ' + wpm_premium_only_ajax_object.ajax_url);\n\t\t// console.log('nonce: ' + wpm_premium_only_ajax_object.nonce);\n\t\t// console.log('url: ' + wpm.ajax_url);\n\t\t// console.log('nonce: ' + wpm.nonce);\n\n\t\ttry {\n\t\t\t// save the state in the database\n\t\t\tlet data = {\n\t\t\t\taction : \"wpm_purchase_pixels_fired\",\n\t\t\t\torder_id: orderId,\n\t\t\t\t// nonce : ajax_object.nonce,\n\t\t\t\tnonce: wpm.nonce,\n\t\t\t}\n\n\t\t\tjQuery.ajax(\n\t\t\t\t{\n\t\t\t\t\ttype : \"post\",\n\t\t\t\t\tdataType: \"json\",\n\t\t\t\t\t// url : ajax_object.ajax_url,\n\t\t\t\t\turl : wpm.ajax_url,\n\t\t\t\t\tdata : data,\n\t\t\t\t\tsuccess: function (response) {\n\t\t\t\t\t\tif (response.success === false) {\n\t\t\t\t\t\t\tconsole.log(response)\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\terror : function (response) {\n\t\t\t\t\t\tconsole.log(response)\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.getProductIdByCartItemKeyUrl = function (url) {\n\t\tlet searchParams = new URLSearchParams(url.search)\n\t\tlet cartItemKey = searchParams.get(\"remove_item\")\n\n\t\tlet productId\n\n\t\tif (wpmDataLayer.cartItemKeys[cartItemKey][\"variation_id\"] === 0) {\n\t\t\tproductId = wpmDataLayer.cartItemKeys[cartItemKey][\"product_id\"]\n\t\t} else {\n\t\t\tproductId = wpmDataLayer.cartItemKeys[cartItemKey][\"variation_id\"]\n\t\t}\n\n\t\treturn productId\n\t}\n\n\twpm.getAddToCartLinkProductIds = function () {\n\t\treturn jQuery(\"a\").map(function () {\n\t\t\tlet href = jQuery(this).attr(\"href\")\n\n\t\t\tif (href && href.includes(\"?add-to-cart=\")) {\n\t\t\t\tlet matches = href.match(/(add-to-cart=)(\\d+)/)\n\t\t\t\tif (matches) return matches[2]\n\t\t\t}\n\t\t}).get()\n\t}\n\n\twpm.getProductDetailsFormattedForEvent = function (productId, quantity = 1) {\n\n\t\t// console.log(wpmDataLayer.products[productId].dyn_r_ids)\n\n\t\tlet product = {\n\t\t\tid : productId.toString(),\n\t\t\tdyn_r_ids : wpmDataLayer.products[productId].dyn_r_ids,\n\t\t\tname : wpmDataLayer.products[productId].name,\n\t\t\tlist_name : wpmDataLayer.shop.list_name,\n\t\t\tbrand : wpmDataLayer.products[productId].brand,\n\t\t\tcategory : wpmDataLayer.products[productId].category,\n\t\t\tvariant : wpmDataLayer.products[productId].variant,\n\t\t\tlist_position: wpmDataLayer.products[productId].position,\n\t\t\tquantity : quantity,\n\t\t\tprice : wpmDataLayer.products[productId].price,\n\t\t\tcurrency : wpmDataLayer.shop.currency,\n\t\t\tisVariable : wpmDataLayer.products[productId].isVariable,\n\t\t\tisVariation : wpmDataLayer.products[productId].isVariation,\n\t\t\tparentId : wpmDataLayer.products[productId].parentId,\n\t\t}\n\n\t\tif (product.isVariation) product[\"parentId_dyn_r_ids\"] = wpmDataLayer.products[productId].parentId_dyn_r_ids\n\n\t\treturn product\n\t}\n\n\twpm.setReferrerToCookie = function () {\n\t\t// can't use session storage as we can't read it from the server\n\t\tif (!wpm.getCookie(\"wpmReferrer\")) {\n\t\t\twpm.setCookie(\"wpmReferrer\", document.referrer)\n\t\t}\n\t}\n\n\twpm.getReferrerFromCookie = function () {\n\t\tif (wpm.getCookie(\"wpmReferrer\")) {\n\t\t\treturn wpm.getCookie(\"wpmReferrer\")\n\t\t} else {\n\t\t\treturn null\n\t\t}\n\t}\n\n\twpm.getClidFromBrowser = function (clidId = \"gclid\") {\n\n\t\tlet clidCookieId\n\n\t\tclidCookieId = {\n\t\t\tgclid: \"_gcl_aw\",\n\t\t\tdclid: \"_gcl_dc\",\n\t\t}\n\n\t\tif (wpm.getCookie(clidCookieId[clidId])) {\n\t\t\tlet clidCookie = wpm.getCookie(clidCookieId[clidId])\n\t\t\tlet matches = clidCookie.match(/(GCL.[\\d]*.)(.*)/)\n\t\t\treturn matches[2]\n\t\t} else {\n\t\t\treturn \"\"\n\t\t}\n\t}\n\n\twpm.getUserAgent = function () {\n\t\treturn navigator.userAgent\n\t}\n\n\twpm.getViewPort = function () {\n\t\treturn {\n\t\t\twidth : Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0),\n\t\t\theight: Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0),\n\t\t}\n\t}\n\n\t/*\n\t* Handle Cookie Management Platforms\n\t* */\n\n\tlet getComplianzCookies = function () {\n\n\t\tlet cmplz_statistics = wpm.getCookie(\"cmplz_statistics\")\n\t\tlet cmplz_marketing = wpm.getCookie(\"cmplz_marketing\")\n\t\tlet cmplz_consent_status = wpm.getCookie(\"cmplz_consent_status\") || wpm.getCookie(\"cmplz_banner-status\")\n\n\n\t\tif (cmplz_consent_status) {\n\t\t\treturn {\n\t\t\t\tanalytics : cmplz_statistics === \"allow\",\n\t\t\t\tads : cmplz_marketing === \"allow\",\n\t\t\t\tvisitorHasChosen: true,\n\t\t\t}\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tlet getCookieLawInfoCookies = function () {\n\n\t\tlet analyticsCookie = wpm.getCookie(\"cookielawinfo-checkbox-analytics\") || wpm.getCookie(\"cookielawinfo-checkbox-analytiques\")\n\t\tlet adsCookie = wpm.getCookie(\"cookielawinfo-checkbox-advertisement\") || wpm.getCookie(\"cookielawinfo-checkbox-publicite\")\n\t\tlet visitorHasChosen = wpm.getCookie(\"CookieLawInfoConsent\")\n\n\t\tif (analyticsCookie || adsCookie) {\n\n\t\t\treturn {\n\t\t\t\tanalytics : analyticsCookie === \"yes\",\n\t\t\t\tads : adsCookie === \"yes\",\n\t\t\t\tvisitorHasChosen: !!visitorHasChosen,\n\t\t\t}\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t}\n\n\n\tlet\n\t\twpmConsentValues = {}\n\twpmConsentValues.categories = {}\n\twpmConsentValues.pixels = []\n\twpmConsentValues.mode = \"category\"\n\twpmConsentValues.visitorHasChosen = false\n\n\twpm.getConsentValues = function () {\n\t\treturn wpmConsentValues\n\t}\n\n\twpm.setConsentValueCategories = function (analytics = false, ads = false) {\n\t\twpmConsentValues.categories.analytics = analytics\n\t\twpmConsentValues.categories.ads = ads\n\t}\n\n\twpm.updateConsentCookieValues = function (explicitConsent = false) {\n\n\t\t// ad_storage\n\t\t// analytics_storage\n\t\t// functionality_storage\n\t\t// personalization_storage\n\t\t// security_storage\n\n\t\t// console.log('exp cons: ' + explicitConsent)\n\n\t\tlet cookie\n\n\t\tif (cookie = wpm.getCookie(\"CookieConsent\")) {\n\t\t\t// Cookiebot\n\t\t\t// https://wordpress.org/plugins/cookiebot/\n\t\t\tcookie = decodeURI(cookie)\n\n\t\t\t// console.log(cookie.indexOf('statistics:true'))\n\t\t\t// console.log(cookie.indexOf('marketing:true'))\n\n\t\t\twpmConsentValues.categories.analytics = cookie.indexOf(\"statistics:true\") >= 0\n\t\t\twpmConsentValues.categories.ads = cookie.indexOf(\"marketing:true\") >= 0\n\t\t\twpmConsentValues.visitorHasChosen = true\n\n\t\t} else if (cookie = wpm.getCookie(\"CookieScriptConsent\")) {\n\t\t\t// Cookie Script\n\t\t\t// https://wordpress.org/plugins/cookie-script-com/\n\n\t\t\tcookie = JSON.parse(cookie)\n\n\t\t\t// console.log(cookie)\n\t\t\t// console.log(cookie.action)\n\t\t\t// console.log('cat length: ' + cookie.categories.length)\n\t\t\t// console.log(cookie.categories.indexOf('performance'))\n\n\t\t\tif (cookie.action === \"reject\") {\n\t\t\t\twpmConsentValues.categories.analytics = false\n\t\t\t\twpmConsentValues.categories.ads = false\n\t\t\t} else if (cookie.categories.length === 2) {\n\t\t\t\twpmConsentValues.categories.analytics = true\n\t\t\t\twpmConsentValues.categories.ads = true\n\t\t\t} else {\n\t\t\t\twpmConsentValues.categories.analytics = cookie.categories.indexOf(\"performance\") >= 0\n\t\t\t\twpmConsentValues.categories.ads = cookie.categories.indexOf(\"targeting\") >= 0\n\t\t\t}\n\n\t\t\twpmConsentValues.visitorHasChosen = true\n\n\t\t\t// console.log(wpmConsentValues)\n\n\t\t} else if (cookie = wpm.getCookie(\"borlabs-cookie\")) {\n\t\t\t// Borlabs Cookie\n\t\t\t// https://borlabs.io/borlabs-cookie/\n\n\t\t\tcookie = decodeURI(cookie)\n\t\t\tcookie = JSON.parse(cookie)\n\n\t\t\twpmConsentValues.categories.analytics = !!cookie?.consents?.statistics\n\t\t\twpmConsentValues.categories.ads = !!cookie?.consents?.marketing\n\t\t\twpmConsentValues.visitorHasChosen = true\n\t\t\twpmConsentValues.pixels = [...cookie?.consents?.statistics || [], ...cookie?.consents?.marketing || []]\n\t\t\twpmConsentValues.mode = \"pixel\"\n\n\t\t} else if (cookie = getComplianzCookies()) {\n\t\t\t// Complianz Cookie\n\t\t\t// https://wordpress.org/plugins/complianz-gdpr/\n\n\t\t\t// console.log(cookie)\n\n\t\t\twpmConsentValues.categories.analytics = cookie.analytics === true\n\t\t\twpmConsentValues.categories.ads = cookie.ads === true\n\t\t\twpmConsentValues.visitorHasChosen = cookie.visitorHasChosen\n\n\t\t\t// console.log(wpmConsentValues)\n\n\t\t} else if (cookie = wpm.getCookie(\"cookie_notice_accepted\")) {\n\t\t\t// Cookie Compliance (free version)\n\t\t\t// https://wordpress.org/plugins/cookie-notice/\n\n\t\t\twpmConsentValues.categories.analytics = true\n\t\t\twpmConsentValues.categories.ads = true\n\t\t\twpmConsentValues.visitorHasChosen = true\n\n\t\t} else if (cookie = wpm.getCookie(\"hu-consent\")) {\n\t\t\t// Cookie Compliance (pro version)\n\t\t\t// https://wordpress.org/plugins/cookie-notice/\n\n\t\t\tcookie = JSON.parse(cookie)\n\n\t\t\twpmConsentValues.categories.analytics = !!cookie.categories[\"3\"]\n\t\t\twpmConsentValues.categories.ads = !!cookie.categories[\"4\"]\n\t\t\twpmConsentValues.visitorHasChosen = true\n\n\t\t} else if (cookie = getCookieLawInfoCookies()) {\n\t\t\t// CookieYes, GDPR Cookie Consent (Cookie Law Info)\n\t\t\t// https://wordpress.org/plugins/cookie-law-info/\n\n\t\t\twpmConsentValues.categories.analytics = cookie.analytics === true\n\t\t\twpmConsentValues.categories.ads = cookie.ads === true\n\t\t\twpmConsentValues.visitorHasChosen = cookie.visitorHasChosen === true\n\n\t\t} else if (cookie = wpm.getCookie(\"moove_gdpr_popup\")) {\n\t\t\t// GDPR Cookie Compliance Plugin by Moove Agency\n\t\t\t// https://wordpress.org/plugins/gdpr-cookie-compliance/\n\t\t\t// TODO write documentation on how to set up the plugin in order for this to work properly\n\n\t\t\tcookie = JSON.parse(cookie)\n\t\t\t// console.log('moove cookie thirdparty: ' + cookie.thirdparty)\n\t\t\t// console.log('moove cookie advanced: ' + cookie.advanced)\n\n\t\t\twpmConsentValues.categories.analytics = cookie.thirdparty === \"1\"\n\t\t\twpmConsentValues.categories.ads = cookie.advanced === \"1\"\n\t\t\twpmConsentValues.visitorHasChosen = true\n\n\t\t\t// console.log(wpmConsentValues)\n\n\t\t} else {\n\t\t\t// consentValues.categories.analytics = true\n\t\t\t// consentValues.categories.ads = true\n\n\t\t\twpmConsentValues.categories.analytics = !explicitConsent\n\t\t\twpmConsentValues.categories.ads = !explicitConsent\n\t\t}\n\t}\n\n\twpm.updateConsentCookieValues()\n\n\twpm.setConsentDefaultValuesToExplicit = function () {\n\t\twpmConsentValues.categories = {\n\t\t\tanalytics: false,\n\t\t\tads : false,\n\t\t}\n\t}\n\n\twpm.canIFire = function (category, pixelName) {\n\n\t\tlet canIFireMode\n\n\t\tif (\"category\" === wpmConsentValues.mode) {\n\t\t\tcanIFireMode = !!wpmConsentValues.categories[category]\n\t\t} else if (\"pixel\" === wpmConsentValues.mode) {\n\t\t\tcanIFireMode = wpmConsentValues.pixels.includes(pixelName)\n\t\t} else {\n\t\t\tconsole.error(\"Couldn't find a valid consent mode in wpmConsentValues\")\n\t\t\tcanIFireMode = false\n\t\t}\n\n\t\tif (canIFireMode) {\n\t\t\treturn true\n\t\t} else {\n\t\t\tif (true || wpm.urlHasParameter(\"debugConsentMode\")) {\n\t\t\t\twpm.logPreventedPixelLoading(pixelName, category)\n\t\t\t}\n\n\t\t\treturn false\n\t\t}\n\t}\n\n\twpm.logPreventedPixelLoading = function (pixelName, category) {\n\t\tif (wpmDataLayer?.shop?.cookie_consent_mgmt?.explicit_consent) {\n\t\t\tconsole.log(\"WooCommerce Pixel Manager: The \\\"\" + pixelName + \" (category: \" + category + \")\\\" pixel has not fired because you have not given consent for it yet. (WPM is in explicit consent mode.)\")\n\t\t} else {\n\t\t\tconsole.log(\"WooCommerce Pixel Manager: The \\\"\" + pixelName + \" (category: \" + category + \")\\\" pixel has not fired because you have removed consent for this pixel. (WPM is in implicit consent mode.)\")\n\t\t}\n\t}\n\n\t/**\n\t * Runs through each script in <head> and blocks / unblocks it according to the plugin settings\n\t * and user consent.\n\t */\n\n\t// https://stackoverflow.com/q/65453565/4688612\n\twpm.scriptTagObserver = new MutationObserver((mutations) => {\n\t\tmutations.forEach(({addedNodes}) => {\n\t\t\t[...addedNodes]\n\t\t\t\t.forEach(node => {\n\n\t\t\t\t\tif ($(node).data(\"wpm-cookie-category\")) {\n\n\t\t\t\t\t\t// console.log(node)\n\n\t\t\t\t\t\t// If the pixel category has been approved > unblock\n\t\t\t\t\t\t// If the pixel belongs to more than one category, then unblock if one of the categories has been approved\n\t\t\t\t\t\t// If no category has been approved, but the Google Consent Mode is active, then only unblock the Google scripts\n\n\t\t\t\t\t\tif (wpm.shouldScriptBeActive(node)) {\n\t\t\t\t\t\t\twpm.unblockScript(node)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\twpm.blockScript(node)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t})\n\t})\n\n\twpm.scriptTagObserver.observe(document.head, {childList: true, subtree: true})\n\twindow.addEventListener(\"DOMContentLoaded\", () => wpm.scriptTagObserver.disconnect())\n\n\twpm.shouldScriptBeActive = function (node) {\n\n\t\tif (\n\t\t\twpmDataLayer.shop.cookie_consent_mgmt.explicit_consent ||\n\t\t\twpmConsentValues.visitorHasChosen\n\t\t) {\n\n\t\t\tif (wpmConsentValues.mode === \"category\" && $(node).data(\"wpm-cookie-category\").split(\",\").some(element => wpmConsentValues.categories[element])) {\n\t\t\t\treturn true\n\t\t\t} else if (wpmConsentValues.mode === \"pixel\" && wpmConsentValues.pixels.includes($(node).data(\"wpm-pixel-name\"))) {\n\t\t\t\treturn true\n\t\t\t} else if (wpmConsentValues.mode === \"pixel\" && $(node).data(\"wpm-pixel-name\") === \"google\" && [\"google-analytics\", \"google-ads\"].some(element => wpmConsentValues.pixels.includes(element))) {\n\t\t\t\treturn true\n\t\t\t} else if (wpmDataLayer?.pixels?.google?.consent_mode?.active && $(node).data(\"wpm-pixel-name\") === \"google\") {\n\t\t\t\treturn true\n\t\t\t} else {\n\t\t\t\treturn false\n\t\t\t}\n\t\t} else {\n\t\t\treturn true\n\t\t}\n\t}\n\n\n\twpm.unblockScript = function (scriptNode, removeAttach = false) {\n\n\t\tif (removeAttach) $(scriptNode).remove()\n\n\t\tlet wpmSrc = $(scriptNode).data(\"wpm-src\")\n\t\tif (wpmSrc) $(scriptNode).attr(\"src\", wpmSrc)\n\n\t\tscriptNode.type = \"text/javascript\"\n\n\t\tif (removeAttach) $(scriptNode).appendTo(\"head\")\n\n\t\tjQuery(document).trigger(\"wpmPreLoadPixels\", {})\n\t}\n\n\twpm.blockScript = function (scriptNode, removeAttach = false) {\n\n\t\tif (removeAttach) $(scriptNode).remove()\n\n\t\tif ($(scriptNode).attr(\"src\")) $(scriptNode).removeAttr(\"src\")\n\t\tscriptNode.type = \"blocked/javascript\"\n\n\t\tif (removeAttach) $(scriptNode).appendTo(\"head\")\n\t}\n\n\twpm.unblockAllScripts = function (analytics = true, ads = true) {\n\t\t// console.log('unblocking all scripts')\n\n\t\t$.each(\n\t\t\t$(\"script[type=\\\"blocked/javascript\\\"]\"), function (index, scriptNode) {\n\n\t\t\t\tif ($(scriptNode).data(\"wpm-cookie-category\").includes(\"analytics\") && analytics) {\n\t\t\t\t\twpm.unblockScript(scriptNode, true)\n\t\t\t\t} else if ($(scriptNode).data(\"wpm-cookie-category\").includes(\"ads\") && ads) {\n\t\t\t\t\twpm.unblockScript(scriptNode, true)\n\t\t\t\t}\n\t\t\t})\n\n\t\tjQuery(document).trigger(\"wpmPreLoadPixels\", {})\n\t}\n\n\twpm.unblockSelectedPixels = function () {\n\t\t$.each(\n\t\t\t$(\"script[type=\\\"blocked/javascript\\\"]\"), function (index, node) {\n\n\t\t\t\tif (wpmConsentValues.pixels.includes($(node).data(\"wpm-pixel-name\"))) {\n\t\t\t\t\twpm.unblockScript(node, true)\n\t\t\t\t} else if ($(node).data(\"wpm-pixel-name\") === \"google\" && [\"google-analytics\", \"google-ads\"].some(element => wpmConsentValues.pixels.includes(element))) {\n\t\t\t\t\twpm.unblockScript(node, true)\n\t\t\t\t}\n\t\t\t})\n\n\t\tjQuery(document).trigger(\"wpmPreLoadPixels\", {})\n\t}\n\n\n\t/**\n\t * Block or unblock scripts for each CMP immediately after cookie consent has been updated\n\t * by the visitor.\n\t */\n\n\t// Borlabs Cookie\n\t// If visitor accepts cookies in Borlabs Cookie unblock the scripts\n\twindow.addEventListener(\"borlabs-cookie-consent-saved\", function () {\n\n\t\twpm.updateConsentCookieValues()\n\n\t\tif (wpmConsentValues.mode === \"pixel\") {\n\n\t\t\twpm.unblockSelectedPixels()\n\t\t\twpm.updateGoogleConsentMode(wpmConsentValues.pixels.includes(\"google-analytics\"), wpmConsentValues.pixels.includes(\"google-ads\"))\n\t\t} else {\n\n\t\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\t}\n\t})\n\n\t// Cookiebot\n\t// If visitor accepts cookies in Cookiebot unblock the scripts\n\t// https://www.cookiebot.com/en/developer/\n\twindow.addEventListener(\"CookiebotOnAccept\", function () {\n\t\tif (Cookiebot.consent.statistics) wpmConsentValues.categories.analytics = true\n\t\tif (Cookiebot.consent.marketing) wpmConsentValues.categories.ads = true\n\n\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\n\t}, false)\n\n\t/**\n\t * Cookie Script\n\t * If visitor accepts cookies in Cookie Script unblock the scripts\n\t * https://support.cookie-script.com/article/20-custom-events\n\t */\n\twindow.addEventListener(\"CookieScriptAccept\", function (e) {\n\t\tif (e.detail.categories.includes(\"performance\")) wpmConsentValues.categories.analytics = true\n\t\tif (e.detail.categories.includes(\"targeting\")) wpmConsentValues.categories.ads = true\n\n\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t})\n\n\t/**\n\t * Cookie Script\n\t * If visitor accepts cookies in Cookie Script unblock the scripts\n\t * https://support.cookie-script.com/\n\t */\n\twindow.addEventListener(\"CookieScriptAcceptAll\", function () {\n\t\twpm.unblockAllScripts(true, true)\n\t\twpm.updateGoogleConsentMode(true, true)\n\t})\n\n\t// Complianz Cookie\n\t// If visitor accepts cookies in Complianz unblock the scripts\n\tdocument.addEventListener(\"cmplzStatusChange\", function () {\n\n\t\twpm.updateConsentCookieValues()\n\n\t\t// console.log(wpmConsentValues)\n\n\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t})\n\n\t// Cookie Compliance by hu-manity.co (free and pro)\n\t// If visitor accepts cookies in Cookie Notice by hu-manity.co unblock the scripts (free version)\n\t// https://wordpress.org/support/topic/events-on-consent-change/#post-15202792\n\tdocument.addEventListener(\"setCookieNotice\", function () {\n\n\t\twpm.updateConsentCookieValues()\n\n\t\t// console.log(wpmConsentValues)\n\n\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t})\n\n\t/**\n\t * Cookie Compliance by hu-manity.co (free and pro)\n\t * If visitor accepts cookies in Cookie Notice by hu-manity.co unblock the scripts (pro version)\n\t * https://wordpress.org/support/topic/events-on-consent-change/#post-15202792\n\t * Because Cookie Notice has no documented API or event that is being triggered on consent save or update\n\t * we have to solve this by using a mutation observer.\n\t *\n\t * @type {MutationObserver}\n\t */\n\n\twpm.huObserver = new MutationObserver(function (mutations) {\n\t\tmutations.forEach(({addedNodes}) => {\n\t\t\t[...addedNodes]\n\t\t\t\t.forEach(node => {\n\n\t\t\t\t\tif (node.id === \"hu\") {\n\n\t\t\t\t\t\tjQuery(\".hu-cookies-save\").on(\"click\", function () {\n\t\t\t\t\t\t\twpm.updateConsentCookieValues()\n\t\t\t\t\t\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\t\t\t\t\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t})\n\t})\n\n\tif (window.hu) {\n\t\twpm.huObserver.observe(document.documentElement || document.body, {childList: true, subtree: true})\n\t}\n\n\twpm.version = function () {\n\t\tconsole.log(wpmDataLayer.version)\n\t}\n\n\t// https://api.jquery.com/jquery.getscript/\n\twpm.loadScriptAndCacheIt = function (url, options) {\n\n\t\t// Allow user to set any option except for dataType, cache, and url\n\t\toptions = jQuery.extend(options || {}, {\n\t\t\tdataType: \"script\",\n\t\t\tcache : true,\n\t\t\turl : url,\n\t\t})\n\n\t\t// Use $.ajax() since it is more flexible than $.getScript\n\t\t// Return the jqXHR object so we can chain callbacks\n\t\treturn jQuery.ajax(options)\n\t}\n\n\twpm.getOrderItemPrice = function (orderItem) {\n\t\treturn (orderItem.total + orderItem.total_tax) / orderItem.quantity\n\t}\n\n\twpm.hasLoginEventFired = function () {\n\t\tlet data = wpm.getWpmSessionData()\n\t\treturn data?.loginEventFired\n\t}\n\n\twpm.setLoginEventFired = function () {\n\t\tlet data = wpm.getWpmSessionData()\n\t\tdata[\"loginEventFired\"] = true\n\t\twpm.setWpmSessionData(data)\n\t}\n\n\twpm.wpmDataLayerExists = function () {\n\t\treturn new Promise(function (resolve) {\n\t\t\t(function waitForVar() {\n\t\t\t\tif (typeof wpmDataLayer !== \"undefined\") return resolve()\n\t\t\t\tsetTimeout(waitForVar, 50)\n\t\t\t})()\n\t\t})\n\t}\n\n\twpm.jQueryExists = function () {\n\t\treturn new Promise(function (resolve) {\n\t\t\t(function waitForjQuery() {\n\t\t\t\tif (typeof jQuery !== \"undefined\") return resolve()\n\t\t\t\tsetTimeout(waitForjQuery, 100)\n\t\t\t})()\n\t\t})\n\t}\n\n\twpm.pageLoaded = function () {\n\t\treturn new Promise(function (resolve) {\n\t\t\t(function waitForVar() {\n\t\t\t\tif (\"complete\" === document.readyState) return resolve()\n\t\t\t\tsetTimeout(waitForVar, 50)\n\t\t\t})()\n\t\t})\n\t}\n\n\twpm.pageReady = function () {\n\t\treturn new Promise(function (resolve) {\n\t\t\t(function waitForVar() {\n\t\t\t\tif (\"interactive\" === document.readyState || \"complete\" === document.readyState) return resolve()\n\t\t\t\tsetTimeout(waitForVar, 50)\n\t\t\t})()\n\t\t})\n\t}\n\n\twpm.isMiniCartActive = function () {\n\t\tif (window.sessionStorage) {\n\t\t\tfor (const [key, value] of Object.entries(window.sessionStorage)) {\n\t\t\t\tif (key.includes(\"wc_fragments\")) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t}\n\n\twpm.doesWooCommerceCartExist = function () {\n\t\treturn document.cookie.includes(\"woocommerce_items_in_cart\")\n\t}\n\n\twpm.urlHasParameter = function (parameter) {\n\t\tlet urlParams = new URLSearchParams(window.location.search)\n\t\treturn urlParams.has(parameter)\n\t}\n\n\t// wpm['load'] = {\n\t// base: true\n\t// };\n\n\twindow[\"wpmLoaded\"] = {}\n\n\t// return {\n\t// writeOrderIdToStorage : writeOrderIdToStorage,\n\t// isOrderIdStored : isOrderIdStored,\n\t// isEmail : isEmail,\n\t// removeProductFromCart : removeProductFromCart,\n\t// getViewItemProducts : getViewItemProducts,\n\t// addProductToCart : addProductToCart,\n\t// getCartItemsFromBackEnd: getCartItemsFromBackEnd,\n\t// fireCheckoutOption : fireCheckoutOption,\n\t// getCartItems : getCartItems\n\t// }\n\n}(window.wpm = window.wpm || {}, jQuery))\n","/**\n * Load all WPM functions\n *\n * Ignore event listeners. They need to be loaded after\n * we made sure that jQuery has been loaded.\n */\n\nrequire(\"./functions\")\n\n// #if process.env.TIER === 'premium'\n// require(\"./functions_premium\")\n// #endif\n","/**\n * After wpm is loaded\n * we first check if wpmDataLayer is loaded,\n * and as soon as it is, we load the pixels,\n * and as soon as the page load is complete,\n * we fire the wpmLoad event.\n *\n * @param {{pro:bool}} wpmDataLayer.version\n *\n * https://stackoverflow.com/a/25868457/4688612\n * https://stackoverflow.com/a/44093516/4688612\n */\n\nwpm.wpmDataLayerExists()\n\t.then(function () {\n\t\tconsole.log(\"WooCommerce Pixel Manager: \" + (wpmDataLayer.version.pro ? \"Pro\" : \"Free\") +\" Version \" + wpmDataLayer.version.number + \" loaded\")\n\t\tjQuery(document).trigger(\"wpmPreLoadPixels\", {})\n\t})\n\t.then(function () {\n\t\twpm.pageLoaded().then(function () {\n\t\t\tjQuery(document).trigger(\"wpmLoad\", {})\n\t\t})\n\t})\n\n\n\n/**\n * Run when page is ready\n *\n */\n\nwpm.pageReady().then(function () {\n\n\t/**\n\t * Run as soon as wpm namespace is loaded\n\t */\n\n\twpm.wpmDataLayerExists()\n\t\t.then(function () {\n\t\t\t// watch for products visible in viewport\n\t\t\twpm.startIntersectionObserverToWatch()\n\n\t\t\t// watch for lazy loaded products\n\t\t\twpm.startProductsMutationObserverToWatch()\n\t\t})\n})\n\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/**\n * Load all essential scripts first\n */\n\nrequire(\"./wpm/functions_loader\")\n\n// Only load the event listeners after jQuery has been loaded for sure\nwpm.jQueryExists().then(function () {\n\n\trequire(\"./wpm/event_listeners\")\n\n\trequire(\"./google/loader\")\n\trequire(\"./facebook/loader\")\n\trequire(\"./hotjar/loader\")\n\n\n\t/**\n\t * Load all premium scripts\n\t */\n\n\t// #if process.env.TIER === 'premium'\n// \trequire(\"./microsoft-ads/loader\")\n// \trequire(\"./pinterest/loader\")\n// \trequire(\"./snapchat/loader\")\n// \trequire(\"./tiktok/loader\")\n// \trequire(\"./twitter/loader\")\n\t// #endif\n\n\n\t/**\n\t * Initiate WPM.\n\t *\n\t * It makes sure that the script flow gets executed correctly,\n\t * no matter how JS \"optimizers\" shuffle the code.\n\t */\n\n\trequire(\"./wpm/init\")\n})\n\n"],"names":["jQuery","document","on","wpmDataLayer","pixels","facebook","pixel_id","loaded","wpm","canIFire","loadFacebookPixel","event","product","eventId","getRandomEventId","fbq","content_type","content_name","name","content_ids","dyn_r_ids","dynamic_remarketing","id_type","value","parseFloat","quantity","price","currency","eventID","shop","trigger","event_name","event_id","user_data","getFbUserData","product_data","product_id","event_source_url","window","location","href","e","console","error","fbViewContent","setFbUserData","order","value_filtered","facebookContentIds","id","$","undefined","fBUserData","f","b","n","callMethod","apply","arguments","queue","push","_fbq","version","t","createElement","async","src","s","getElementsByTagName","parentNode","insertBefore","Math","random","toString","substring","getFbUserDataFromBrowser","fbp","getCookie","fbc","client_user_agent","navigator","userAgent","prodIds","key","item","Object","entries","items","general","variationsOutput","variation_id","String","products","require","isEmptyObject","google","ads","conversionIds","status","googleConfigConditionsMet","isVariable","send_events_with_parent_ids","gtagLoaded","then","gtag","send_to","getGoogleAdsConversionIdentifiers","google_business_vertical","getGoogleAdsDynamicRemarketingOrderItems","data_basic","data_with_cart","getGoogleAdsConversionIdentifiersWithLabel","transaction_id","number","new_customer","aw_merchant_id","discount","aw_feed_country","aw_feed_language","getGoogleAdsRegularOrderItems","conversionIdentifiers","orderItems","orderItem","analytics","universal","property_id","mp_active","affiliation","value_regular","tax","shipping","coupon","getGAUAOrderItems","list_position","category","join","variant","variant_name","brand","ga4","measurement_id","getGA4OrderItems","item_name","item_category","item_id","item_variant","item_brand","state","canGoogleLoad","loadGoogle","logPreventedPixelLoading","type","consent_mode","active","getConsentValues","mode","categories","includes","getVisitorConsentStatusAndUpdateGoogleConsentSettings","google_consent_settings","analytics_storage","ad_storage","updateGoogleConsentMode","cookie_consent_mgmt","explicit_consent","fireGtagGoogleAds","enhanced_conversions","phone_conversion_label","phone_conversion_number","keys","page_type","enhanced_conversion_data","fireGtagGoogleAnalyticsUA","parameters","fireGtagGoogleAnalyticsGA4","isGoogleActive","getGoogleGtagId","loadScriptAndCacheIt","done","script","textStatus","dataLayer","wait_for_update","region","ads_data_redaction","url_passthrough","linker","settings","Date","Promise","resolve","reject","startTime","wait","setTimeout","optimize","container_id","load_google_optimize_pixel","hotjar","site_id","load_hotjar_pixel","h","o","hj","q","_hjSettings","hjid","hjsv","a","r","appendChild","url","URL","this","attr","productId","getProductIdByCartItemKeyUrl","removeProductFromCart","data","addProductToCart","product_type","Number","val","each","find","classes","getPostIdFromString","one","target","closest","matches","match","nextAll","getIdBasedOndVariationsOutputSetting","Error","getProductDetailsFormattedForEvent","isEmail","fireCheckoutProgress","emailSelected","paymentMethodSelected","fireCheckoutOption","cart","getCartItemsFromBackend","variation","doesWooCommerceCartExist","getCartItems","productIds","getAddToCartLinkProductIds","getProductsFromBackend","referrer","referrerHostname","hostname","host","setCookie","wpmLoadFired","getMainProductIdFromProductPage","getProductDataForViewItemEvent","isOrderIdStored","writeOrderIdToStorage","user","hasLoginEventFired","setLoginEventFired","updateConsentCookieValues","wpmDeduper","wpmRestSettings","checkCookie","useRestEndpoint","isSessionStorageAvailable","isRestEndpointAvailable","isBelowRestErrorThreshold","sessionStorage","getItem","JSON","parse","testEndpoint","protocol","cookieName","ajax","timeout","statusCode","response","setItem","stringify","isWpmRestEndpointAvailable","orderId","Storage","localStorage","ids","expiresDate","setDate","getDate","cookie","toUTCString","storeOrderIdOnServer","orderDeduplication","log","email","test","quantityToRemove","isVariation","parentId","saveCartObjectToDataLayer","action","dataType","ajax_url","success","cartItems","filter","hasOwnProperty","length","assign","cartObject","step","checkout_option","string","triggerViewItemList","indexOf","viewItemListTriggerTestMode","css","append","viewItemListTrigger","opacity","backgroundColor","getSearchTermFromUrl","URLSearchParams","search","get","io","ioTimeouts","observerCallback","observer","forEach","entry","elementId","next","isIntersecting","testMode","repeat","unobserve","clearTimeout","remove","allIoElementsToWatch","ioid","startIntersectionObserverToWatch","urlHasParameter","IntersectionObserver","threshold","map","i","elem","parent","hasClass","prev","observe","startProductsMutationObserverToWatch","productsNode","parents","has","first","productsMutationObserver","attributes","childList","characterData","MutationObserver","mutations","mutation","newNodes","addedNodes","hasWpmProductIdElement","siblings","cookieValue","expiryDays","d","setTime","getTime","expires","ca","decodeURIComponent","split","c","charAt","getWpmSessionData","setWpmSessionData","order_id","nonce","cartItemKey","cartItemKeys","list_name","position","parentId_dyn_r_ids","setReferrerToCookie","getReferrerFromCookie","getClidFromBrowser","clidCookieId","clidId","gclid","dclid","getUserAgent","getViewPort","width","max","documentElement","clientWidth","innerWidth","height","clientHeight","innerHeight","getComplianzCookies","cmplz_statistics","cmplz_marketing","visitorHasChosen","getCookieLawInfoCookies","analyticsCookie","adsCookie","wpmConsentValues","setConsentValueCategories","explicitConsent","decodeURI","consents","statistics","marketing","thirdparty","advanced","setConsentDefaultValuesToExplicit","pixelName","canIFireMode","scriptTagObserver","node","shouldScriptBeActive","unblockScript","blockScript","head","subtree","addEventListener","disconnect","some","element","scriptNode","removeAttach","wpmSrc","appendTo","removeAttr","unblockAllScripts","index","unblockSelectedPixels","Cookiebot","consent","detail","huObserver","hu","body","options","extend","cache","getOrderItemPrice","total","total_tax","loginEventFired","wpmDataLayerExists","waitForVar","jQueryExists","waitForjQuery","pageLoaded","readyState","pageReady","isMiniCartActive","parameter","pro","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__"],"sourceRoot":""}
1
+ {"version":3,"file":"wpm-public.p1.min.js","mappings":"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","sources":["webpack://WooCommerce-Pixel-Manager/./src/js/public/facebook.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google-ads.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google-ga-4.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google-ga-ua.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google-optimize.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/hotjar.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/wpm-loader.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/wpm.js","webpack://WooCommerce-Pixel-Manager/webpack/bootstrap","webpack://WooCommerce-Pixel-Manager/./src/js/public/main-free.js"],"sourcesContent":["/**\n * Add functions for Facebook\n * */\n\n(function (wpm, $, undefined) {\n\n\tlet fBUserData\n\n\twpm.loadFacebookPixel = function () {\n\n\t\ttry {\n\t\t\tif (wpmDataLayer?.pixels?.facebook?.pixel_id) {\n\n\t\t\t\twpmDataLayer.pixels.facebook.loaded = true\n\n\t\t\t\t// @formatter:off\n \t\t\t!function(f,b,e,v,n,t,s)\n \t\t\t{if(f.fbq)return;n=f.fbq=function(){n.callMethod?\n \t\t\t\tn.callMethod.apply(n,arguments):n.queue.push(arguments)};\n \t\t\t\tif(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';\n \t\t\t\tn.queue=[];t=b.createElement(e);t.async=!0;\n \t\t\t\tt.src=v;s=b.getElementsByTagName(e)[0];\n \t\t\t\ts.parentNode.insertBefore(t,s)}(window, document,'script',\n \t\t\t\t'https://connect.facebook.net/en_US/fbevents.js');\n \t\t\t// @formatter:on\n\n\t\t\t\tfbq(\"init\", wpmDataLayer.pixels.facebook.pixel_id)\n\t\t\t\tfbq(\"track\", \"PageView\")\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.getRandomEventId = function () {\n\t\treturn (Math.random() + 1).toString(36).substring(2)\n\t}\n\n\twpm.getFbUserData = function () {\n\t\t// We need the first one for InitiateCheckout\n\t\t// where getting the user_data from the browser is too slow\n\t\t// using wpm.getCookie(), so we cache the user_data earlier.\n\t\t// And we need the second one because the ViewContent hit happens too fast\n\t\t// after adding a variation to the cart because the function to cache\n\t\t// the user_data is too slow. But we can get the user_data using wpm.getCookie()\n\t\t// because we don't move away from the page and can wait for the browser\n\t\t// to get it.\n\t\tif (fBUserData) {\n\t\t\treturn fBUserData\n\t\t} else {\n\t\t\treturn wpm.getFbUserDataFromBrowser()\n\t\t}\n\t}\n\n\twpm.setFbUserData = function () {\n\t\tfBUserData = wpm.getFbUserDataFromBrowser()\n\t}\n\n\twpm.getFbUserDataFromBrowser = function () {\n\t\treturn {\n\t\t\tfbp : wpm.getCookie(\"_fbp\"),\n\t\t\tfbc : wpm.getCookie(\"_fbc\"),\n\t\t\tclient_user_agent: navigator.userAgent,\n\t\t}\n\t}\n\n\twpm.fbViewContent = function (product) {\n\n\t\ttry {\n\t\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\t\tlet eventId = wpm.getRandomEventId()\n\n\t\t\tfbq(\"track\", \"ViewContent\", {\n\t\t\t\tcontent_type: \"product\",\n\t\t\t\tcontent_name: product.name,\n\t\t\t\t// content_category: product.category,\n\t\t\t\tcontent_ids: product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\t\tcurrency : wpmDataLayer.shop.currency,\n\t\t\t\tvalue : product.price,\n\t\t\t}, {\n\t\t\t\teventID: eventId,\n\t\t\t})\n\n\t\t\tproduct[\"currency\"] = wpmDataLayer.shop.currency\n\n\t\t\tjQuery(document).trigger(\"wpmFbCapiEvent\", {\n\t\t\t\tevent_name : \"ViewContent\",\n\t\t\t\tevent_id : eventId,\n\t\t\t\tuser_data : wpm.getFbUserData(),\n\t\t\t\tproduct_data : product,\n\t\t\t\tproduct_id : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\t\tevent_source_url: window.location.href,\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.facebookContentIds = function () {\n\t\tlet prodIds = []\n\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {\n\t\t\t\tprodIds.push(String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type]))\n\t\t\t} else {\n\t\t\t\tprodIds.push(String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type]))\n\t\t\t}\n\t\t}\n\n\t\treturn prodIds\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery));\n\n\n/**\n * Execute as soon as possible\n * */\n\n(function () {\n\n\tjQuery(document).on(\"wpmLoadPixels\", function () {\n\n\t\tif (wpm.canIFire(\"ads\", \"facebook-ads\") && !wpmDataLayer?.pixels?.facebook?.loaded) wpm.loadFacebookPixel()\n\n\t})\n\n})()\n\n\n/**\n * All event listeners\n * */\n\n// AddToCart event\njQuery(document).on(\"wpmAddToCart\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\tlet eventId = wpm.getRandomEventId()\n\n\t\t// console.log('eventId: ' + eventId);\n\n\t\tfbq(\"track\", \"AddToCart\", {\n\t\t\tcontent_type: \"product\",\n\t\t\tcontent_name: product.name,\n\t\t\tcontent_ids : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\tvalue : parseFloat(product.quantity * product.price),\n\t\t\tcurrency : product.currency,\n\t\t}, {\n\t\t\teventID: eventId,\n\t\t})\n\n\n\t\tproduct[\"currency\"] = wpmDataLayer.shop.currency\n\n\t\tjQuery(document).trigger(\"wpmFbCapiEvent\", {\n\t\t\tevent_name : \"AddToCart\",\n\t\t\tevent_id : eventId,\n\t\t\tuser_data : wpm.getFbUserData(),\n\t\t\tproduct_data : product,\n\t\t\tproduct_id : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\tevent_source_url: window.location.href,\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// InitiateCheckout event\njQuery(document).on(\"wpmBeginCheckout\", function (event) {\n\n\ttry {\n\t\t// console.log('firing facebook ads InitiateCheckout event');\n\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\tlet eventId = wpm.getRandomEventId()\n\n\t\tfbq(\"track\", \"InitiateCheckout\", {}, {\n\t\t\teventID: eventId,\n\t\t})\n\n\t\tjQuery(document).trigger(\"wpmFbCapiEvent\", {\n\t\t\tevent_name : \"InitiateCheckout\",\n\t\t\tevent_id : eventId,\n\t\t\tuser_data : wpm.getFbUserData(),\n\t\t\tevent_source_url: window.location.href,\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// AddToWishlist event\njQuery(document).on(\"wpmAddToWishlist\", function (event, product) {\n\n\ttry {\n\t\t// console.log('firing facebook ads AddToWishlist event');\n\t\t// console.log(product);\n\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\tlet eventId = wpm.getRandomEventId()\n\n\t\tfbq(\"track\", \"AddToWishlist\", {\n\t\t\tcontent_type: \"product\",\n\t\t\tcontent_name: product.name,\n\t\t\tcontent_ids : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\tvalue : parseFloat(product.quantity * product.price),\n\t\t\tcurrency : product.currency,\n\t\t}, {\n\t\t\teventID: eventId,\n\t\t})\n\n\n\t\tproduct[\"currency\"] = wpmDataLayer.shop.currency\n\n\t\tjQuery(document).trigger(\"wpmFbCapiEvent\", {\n\t\t\tevent_name : \"AddToWishlist\",\n\t\t\tevent_id : eventId,\n\t\t\tuser_data : wpm.getFbUserData(),\n\t\t\tproduct_data : product,\n\t\t\tproduct_id : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\tevent_source_url: window.location.href,\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// ViewContent event\njQuery(document).on(\"wpmViewItem\", function (event, product) {\n\n\ttry {\n\t\t// console.log('firing facebook ads ViewContent event');\n\t\t// console.log(product);\n\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\twpm.fbViewContent(product)\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view search event\njQuery(document).on(\"wpmSearch\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\tlet eventId = wpm.getRandomEventId()\n\n\t\tfbq(\"track\", \"Search\", {}, {\n\t\t\teventID: eventId,\n\t\t})\n\n\t\tjQuery(document).trigger(\"wpmFbCapiEvent\", {\n\t\t\tevent_name : \"Search\",\n\t\t\tevent_id : eventId,\n\t\t\tuser_data : wpm.getFbUserData(),\n\t\t\tevent_source_url: window.location.href,\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// load always event\njQuery(document).on(\"wpmLoadAlways\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\twpm.setFbUserData()\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view order received page event\n// https://developers.pinterest.com/docs/tag/conversion/\njQuery(document).on(\"wpmOrderReceivedPage\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\tfbq(\"track\", \"Purchase\",\n\t\t\t{\n\t\t\t\tcontent_type: \"product\",\n\t\t\t\tvalue : wpmDataLayer.order.value_filtered,\n\t\t\t\tcurrency : wpmDataLayer.order.currency,\n\t\t\t\tcontent_ids : wpm.facebookContentIds(),\n\t\t\t},\n\t\t\t{eventID: wpmDataLayer.order.id},\n\t\t)\n\n\n\t\t// console.log(wpm.facebookContentIds())\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n","/**\n * Add functions for Google Ads\n * */\n\n(function (wpm, $, undefined) {\n\n\tlet conversionIdentifiers = []\n\n\twpm.getGoogleAdsConversionIdentifiersWithLabel = function () {\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds)) {\n\t\t\tconversionIdentifiers.push(key + \"/\" + item)\n\t\t}\n\t\treturn conversionIdentifiers\n\t}\n\n\twpm.getGoogleAdsConversionIdentifiers = function () {\n\n\t\tlet conversionIdentifiers = []\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds)) {\n\t\t\tconversionIdentifiers.push(key)\n\t\t}\n\n\t\treturn conversionIdentifiers\n\t}\n\n\twpm.getGoogleAdsRegularOrderItems = function () {\n\t\t// \"id\" : \"gla_34\",\n\t\t// \"quantity\": 1,\n\t\t// \"price\" : 45\n\n\t\tlet orderItems = []\n\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tlet orderItem\n\n\t\t\torderItem = {\n\t\t\t\tquantity: item.quantity,\n\t\t\t\tprice : item.price,\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type])\n\t\t\t\torderItems.push(orderItem)\n\t\t\t} else {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type])\n\t\t\t\torderItems.push(orderItem)\n\t\t\t}\n\t\t}\n\n\t\treturn orderItems\n\t}\n\n\twpm.getGoogleAdsDynamicRemarketingOrderItems = function () {\n\t\t// \"id\" : \"gla_34\",\n\t\t// \"quantity\" : 1,\n\t\t// \"price\" : 45,\n\t\t// \"google_business_vertical\": \"retail\"\n\n\t\tlet orderItems = []\n\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tlet orderItem\n\n\t\t\torderItem = {\n\t\t\t\tquantity : item.quantity,\n\t\t\t\tprice : item.price,\n\t\t\t\tgoogle_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type])\n\t\t\t\torderItems.push(orderItem)\n\t\t\t} else {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type])\n\t\t\t\torderItems.push(orderItem)\n\t\t\t}\n\t\t}\n\n\t\treturn orderItems\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery))\n\n\n/**\n * All event listeners\n * */\n\n// view_item_list event\njQuery(document).on(\"wpmViewItemList\", function (event, product) {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\n\t\tif (\n\t\t\twpmDataLayer?.general?.variationsOutput &&\n\t\t\tproduct.isVariable &&\n\t\t\twpmDataLayer.pixels.google.ads.dynamic_remarketing.send_events_with_parent_ids === false\n\t\t) return\n\n\t\t// try to prevent that WC sends cached hits to Google\n\t\tif (!product) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"view_item_list\", {\n \t\t\tsend_to: wpm.getGoogleAdsConversionIdentifiers(),\n \t\t\titems : [{\n \t\t\t\tid : product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],\n \t\t\t\tgoogle_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,\n \t\t\t}],\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// add_to_cart event\njQuery(document).on(\"wpmAddToCart\", function (event, product) {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"add_to_cart\", {\n \t\t\tsend_to: wpm.getGoogleAdsConversionIdentifiers(),\n \t\t\tvalue : product.quantity * product.price,\n \t\t\titems : [{\n \t\t\t\tid : product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],\n \t\t\t\tquantity : product.quantity,\n \t\t\t\tprice : product.price,\n \t\t\t\tgoogle_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,\n \t\t\t}],\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view_item event\njQuery(document).on(\"wpmViewItem\", function (event, product) {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"view_item\", {\n \t\t\tsend_to: wpm.getGoogleAdsConversionIdentifiers(),\n \t\t\tvalue : (product.quantity ? product.quantity : 1) * product.price,\n \t\t\titems : [{\n \t\t\t\tid : product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],\n \t\t\t\tquantity : (product.quantity ? product.quantity : 1),\n \t\t\t\tprice : product.price,\n \t\t\t\tgoogle_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,\n \t\t\t}],\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n\n// view search event\njQuery(document).on(\"wpmSearch\", function () {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\n\t\tlet products = []\n\n\t\tfor (const [key, product] of Object.entries(wpmDataLayer.products)) {\n\n\t\t\tif (\n\t\t\t\twpmDataLayer?.general?.variationsOutput &&\n\t\t\t\tproduct.isVariable &&\n\t\t\t\twpmDataLayer.pixels.google.ads.dynamic_remarketing.send_events_with_parent_ids === false\n\t\t\t) return\n\n\t\t\tproducts.push({\n\t\t\t\tid : product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],\n\t\t\t\tgoogle_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,\n\t\t\t})\n\t\t}\n\n\t\t// console.log(products);\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"view_search_results\", {\n \t\t\tsend_to: wpm.getGoogleAdsConversionIdentifiers(),\n \t\t\t// value : 1 * product.price,\n \t\t\titems: products,\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n\n// view order received page event\n// TODO distinguish with or without cart data active\njQuery(document).on(\"wpmOrderReceivedPage\", function () {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"purchase\", {\n \t\t\tsend_to: wpm.getGoogleAdsConversionIdentifiers(),\n \t\t\tvalue : wpmDataLayer.order.value_filtered,\n \t\t\titems : wpm.getGoogleAdsDynamicRemarketingOrderItems(),\n \t\t})\n\t\t})\n\n\t\t// console.log(wpm.getGoogleAdsDynamicRemarketingOrderItems())\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// user log in event\njQuery(document).on(\"wpmLogin\", function () {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"login\", {\n \t\t\tsend_to: wpm.getGoogleAdsConversionIdentifiers(),\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view order received page event\n// new_customer parameter: https://support.google.com/google-ads/answer/9917012\njQuery(document).on(\"wpmOrderReceivedPage\", function () {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\t\tlet data_basic = {}\n\t\tlet data_with_cart = {}\n\n\t\tdata_basic = {\n\t\t\tsend_to : wpm.getGoogleAdsConversionIdentifiersWithLabel(),\n\t\t\ttransaction_id: wpmDataLayer.order.number,\n\t\t\tvalue : wpmDataLayer.order.value_filtered,\n\t\t\tcurrency : wpmDataLayer.order.currency,\n\t\t\tnew_customer : wpmDataLayer.order.new_customer,\n\t\t}\n\n\t\tif (wpmDataLayer?.order?.aw_merchant_id) {\n\t\t\tdata_with_cart = {\n\t\t\t\tdiscount : wpmDataLayer.order.discount,\n\t\t\t\taw_merchant_id : wpmDataLayer.order.aw_merchant_id,\n\t\t\t\taw_feed_country : wpmDataLayer.order.aw_feed_country,\n\t\t\t\taw_feed_language: wpmDataLayer.order.aw_feed_language,\n\t\t\t\titems : wpm.getGoogleAdsRegularOrderItems(),\n\t\t\t}\n\t\t}\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"conversion\", {...data_basic, ...data_with_cart})\n\t\t})\n\n\t\t// console.log({...data_basic,...data_with_cart})\n\n\t\t// console.log(wpm.getGoogleAdsOrderItems())\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n\n\n\n\n","/**\n * Add functions for Google Analytics 4\n * */\n\n(function (wpm, $, undefined) {\n\n\twpm.getGA4OrderItems = function () {\n\n\t\t// \"item_id\" : \"34\",\n\t\t// \"item_name\" : \"Hoodie\",\n\t\t// \"quantity\" : 1,\n\t\t// \"item_brand\" : \"\",\n\t\t// \"item_variant\" : \"Color: blue | Logo: yes\",\n\t\t// \"price\" : 45,\n\t\t// \"currency\" : \"CHF\",\n\t\t// \"item_category\": \"Hoodies\"\n\n\n\t\tlet orderItems = []\n\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tlet orderItem\n\n\t\t\torderItem = {\n\t\t\t\tquantity : item.quantity,\n\t\t\t\tprice : item.price,\n\t\t\t\titem_name : item.name,\n\t\t\t\tcurrency : wpmDataLayer.order.currency,\n\t\t\t\titem_category: wpmDataLayer.products[item.id].category.join(\"/\"),\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {\n\n\t\t\t\torderItem.item_id = String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type])\n\t\t\t\torderItem.item_variant = wpmDataLayer.products[item.variation_id].variant_name\n\t\t\t\torderItem.item_brand = wpmDataLayer.products[item.variation_id].brand\n\t\t\t\torderItems.push(orderItem)\n\t\t\t} else {\n\n\t\t\t\torderItem.item_id = String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type])\n\t\t\t\torderItem.item_brand = wpmDataLayer.products[item.id].brand\n\t\t\t\torderItems.push(orderItem)\n\t\t\t}\n\t\t}\n\n\t\treturn orderItems\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery))\n\n\n/**\n * All event listeners\n * */\n\n\n// view order received page event\njQuery(document).on(\"wpmOrderReceivedPage\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) return\n\t\tif (wpmDataLayer?.pixels?.google?.analytics?.ga4?.mp_active) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"purchase\", {\n \t\t\tsend_to : [wpmDataLayer.pixels.google.analytics.ga4.measurement_id],\n \t\t\ttransaction_id: wpmDataLayer.order.number,\n \t\t\taffiliation : wpmDataLayer.order.affiliation,\n \t\t\tcurrency : wpmDataLayer.order.currency,\n \t\t\tvalue : wpmDataLayer.order.value_regular,\n \t\t\tdiscount : wpmDataLayer.order.discount,\n \t\t\ttax : wpmDataLayer.order.tax,\n \t\t\tshipping : wpmDataLayer.order.shipping,\n \t\t\tcoupon : wpmDataLayer.order.coupon,\n \t\t\titems : wpm.getGA4OrderItems(),\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n","/**\n * Add functions for Google Analytics Universal\n * */\n\n(function (wpm, $, undefined) {\n\n\twpm.getGAUAOrderItems = function () {\n\n\t\t// \"id\" : \"34\",\n\t\t// \"name\" : \"Hoodie\",\n\t\t// \"brand\" : \"\",\n\t\t// \"category\" : \"Hoodies\",\n\t\t// \"list_position\": 1,\n\t\t// \"price\" : 45,\n\t\t// \"quantity\" : 1,\n\t\t// \"variant\" : \"Color: blue | Logo: yes\"\n\n\n\t\tlet orderItems = [],\n\t\t\tlist_position = 1\n\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tlet orderItem\n\n\t\t\torderItem = {\n\t\t\t\tquantity : item.quantity,\n\t\t\t\tprice : item.price,\n\t\t\t\titem_name : item.name,\n\t\t\t\tcurrency : wpmDataLayer.order.currency,\n\t\t\t\titem_category: wpmDataLayer.products[item.id].category.join(\"/\"),\n\t\t\t\tlist_position: list_position,\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type])\n\t\t\t\torderItem.variant = wpmDataLayer.products[item.variation_id].variant_name\n\t\t\t\torderItem.item_brand = wpmDataLayer.products[item.variation_id].brand\n\t\t\t\torderItems.push(orderItem)\n\t\t\t} else {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type])\n\t\t\t\torderItem.item_brand = wpmDataLayer.products[item.id].brand\n\t\t\t\torderItems.push(orderItem)\n\t\t\t}\n\n\t\t\tlist_position++\n\t\t}\n\n\t\treturn orderItems\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery))\n\n\n/**\n * All event listeners\n * */\n\n\n// view order received page event\njQuery(document).on(\"wpmOrderReceivedPage\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) return\n\t\tif (wpmDataLayer?.pixels?.google?.analytics?.universal?.mp_active) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"purchase\", {\n \t\t\tsend_to : [wpmDataLayer.pixels.google.analytics.universal.property_id],\n \t\t\ttransaction_id: wpmDataLayer.order.number,\n \t\t\taffiliation : wpmDataLayer.order.affiliation,\n \t\t\tcurrency : wpmDataLayer.order.currency,\n \t\t\tvalue : wpmDataLayer.order.value_regular,\n \t\t\tdiscount : wpmDataLayer.order.discount,\n \t\t\ttax : wpmDataLayer.order.tax,\n \t\t\tshipping : wpmDataLayer.order.shipping,\n \t\t\tcoupon : wpmDataLayer.order.coupon,\n \t\t\titems : wpm.getGAUAOrderItems(),\n \t\t})\n\t\t})\n\n\t\t// console.log(wpm.getGAUAOrderItems())\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n","(function (wpm, $, undefined) {\n\n\twpm.load_google_optimize_pixel = function () {\n\n\t\ttry {\n\t\t\tif (wpmDataLayer?.pixels?.google?.optimize?.container_id) {\n\n\t\t\t\twpmDataLayer.pixels.google.optimize.loaded = true\n\n\t\t\t\twpm.loadScriptAndCacheIt(\"https://www.googleoptimize.com/optimize.js?id=\" + wpmDataLayer.pixels.google.optimize.container_id)\n\t\t\t\t// .done(function (script, textStatus) {\n\t\t\t\t// \t\tconsole.log('Google Optimize loaded')\n\t\t\t\t// });\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery));\n\n\n(function () {\n\n\tjQuery(document).on(\"wpmLoadPixels\", function () {\n\n\t\tif (wpm.canIFire(\"analytics\", \"google-optimize\") && !wpmDataLayer?.pixels?.google?.optimize?.loaded) wpm.load_google_optimize_pixel()\n\n\t})\n\n})()\n\n\n\n","/**\n * Add functions for Google\n * */\n\n(function (wpm, $, undefined) {\n\n\twpm.googleConfigConditionsMet = function (type) {\n\t\t// always returns true if Google Consent Mode is active\n\t\tif (wpmDataLayer?.pixels?.google?.consent_mode?.active) {\n\t\t\treturn true\n\t\t} else if (wpm.getConsentValues().mode === \"category\") {\n\t\t\treturn wpm.getConsentValues().categories[type] === true\n\t\t} else if (wpm.getConsentValues().mode === \"pixel\") {\n\t\t\treturn wpm.getConsentValues().pixels.includes(\"google-\" + type)\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t}\n\n\twpm.getVisitorConsentStatusAndUpdateGoogleConsentSettings = function (google_consent_settings) {\n\n\t\tif (wpm.getConsentValues().mode === \"category\") {\n\t\t\tif (wpm.getConsentValues().categories.analytics) google_consent_settings.analytics_storage = \"granted\"\n\t\t\tif (wpm.getConsentValues().categories.ads) google_consent_settings.ad_storage = \"granted\"\n\t\t} else if ((wpm.getConsentValues().mode === \"pixel\")) {\n\t\t\tgoogle_consent_settings.analytics_storage = wpm.getConsentValues().pixels.includes(\"google-analytics\") ? \"granted\" : \"denied\"\n\t\t\tgoogle_consent_settings.ad_storage = wpm.getConsentValues().pixels.includes(\"google-ads\") ? \"granted\" : \"denied\"\n\t\t}\n\n\t\treturn google_consent_settings\n\t}\n\n\twpm.updateGoogleConsentMode = function (analytics = true, ads = true) {\n\n\t\ttry {\n\t\t\tif (\n\t\t\t\t!window.gtag ||\n\t\t\t\t!wpmDataLayer.shop.cookie_consent_mgmt.explicit_consent\n\t\t\t) return\n\n\t\t\tgtag(\"consent\", \"update\", {\n\t\t\t\tanalytics_storage: analytics ? \"granted\" : \"denied\",\n\t\t\t\tad_storage : ads ? \"granted\" : \"denied\",\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.fireGtagGoogleAds = function () {\n\t\ttry {\n\t\t\twpmDataLayer.pixels.google.ads.state = \"loading\"\n\n\t\t\tif (wpmDataLayer?.pixels?.google?.ads?.enhanced_conversions?.active) {\n\t\t\t\tfor (const [key, item] of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds)) {\n\t\t\t\t\tgtag(\"config\", key, {\"allow_enhanced_conversions\": true})\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (const [key, item] of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds)) {\n\t\t\t\t\tgtag(\"config\", key)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.pixels?.google?.ads?.conversionIds && wpmDataLayer?.pixels?.google?.ads?.phone_conversion_label && wpmDataLayer?.pixels?.google?.ads?.phone_conversion_number) {\n\t\t\t\tgtag(\"config\", Object.keys(wpmDataLayer.pixels.google.ads.conversionIds)[0] + \"/\" + wpmDataLayer.pixels.google.ads.phone_conversion_label, {\n\t\t\t\t\tphone_conversion_number: wpmDataLayer.pixels.google.ads.phone_conversion_number,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// ! enhanced_conversion_data needs to be var\n\t\t\t// https://support.google.com/google-ads/answer/9888145#zippy=%2Cvalidate-your-implementation-using-chrome-developer-tools\n\t\t\tif (\"order_received_page\" === wpmDataLayer.shop.page_type && wpmDataLayer?.order?.google?.ads?.enhanced_conversion_data) {\n\t\t\t\twindow.enhanced_conversion_data = wpmDataLayer.order.google.ads.enhanced_conversion_data\n\t\t\t}\n\n\t\t\twpmDataLayer.pixels.google.ads.state = \"ready\"\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.fireGtagGoogleAnalyticsUA = function () {\n\t\ttry {\n\t\t\twpmDataLayer.pixels.google.analytics.universal.state = \"loading\"\n\n\t\t\tgtag(\"config\", wpmDataLayer.pixels.google.analytics.universal.property_id, wpmDataLayer.pixels.google.analytics.universal.parameters)\n\t\t\twpmDataLayer.pixels.google.analytics.universal.state = \"ready\"\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.fireGtagGoogleAnalyticsGA4 = function () {\n\t\ttry {\n\t\t\twpmDataLayer.pixels.google.analytics.ga4.state = \"loading\"\n\n\t\t\tgtag(\"config\", wpmDataLayer.pixels.google.analytics.ga4.measurement_id, wpmDataLayer.pixels.google.analytics.ga4.parameters)\n\t\t\twpmDataLayer.pixels.google.analytics.ga4.state = \"ready\"\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.isGoogleActive = function () {\n\t\tif (\n\t\t\twpmDataLayer?.pixels?.google?.analytics?.universal?.property_id ||\n\t\t\twpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id ||\n\t\t\t!jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)\n\t\t) {\n\t\t\treturn true\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t}\n\n\twpm.getGoogleGtagId = function () {\n\t\tif (wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) {\n\t\t\treturn wpmDataLayer.pixels.google.analytics.universal.property_id\n\t\t} else if (wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) {\n\t\t\treturn wpmDataLayer.pixels.google.analytics.ga4.measurement_id\n\t\t} else {\n\t\t\treturn Object.keys(wpmDataLayer.pixels.google.ads.conversionIds)[0]\n\t\t}\n\t}\n\n\twpm.loadGoogle = function () {\n\n\t\tif (wpm.isGoogleActive()) {\n\n\t\t\twpmDataLayer.pixels.google.state = \"loading\"\n\n\t\t\twpm.loadScriptAndCacheIt(\"https://www.googletagmanager.com/gtag/js?id=\" + wpm.getGoogleGtagId())\n\t\t\t\t.done(function (script, textStatus) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// console.log('Google Optimize loaded')\n\t\t\t\t\t\t// alert('Google Optimize loaded')\n\n\t\t\t\t\t\t// Initiate Google dataLayer and gtag\n\t\t\t\t\t\twindow.dataLayer = window.dataLayer || []\n\t\t\t\t\t\twindow.gtag = function gtag() {\n\t\t\t\t\t\t\tdataLayer.push(arguments)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Google Consent Mode\n\t\t\t\t\t\tif (wpmDataLayer?.pixels?.google?.consent_mode?.active) {\n\n\t\t\t\t\t\t\tlet google_consent_settings = {\n\t\t\t\t\t\t\t\t\"ad_storage\" : wpmDataLayer.pixels.google.consent_mode.ad_storage,\n\t\t\t\t\t\t\t\t\"analytics_storage\": wpmDataLayer.pixels.google.consent_mode.analytics_storage,\n\t\t\t\t\t\t\t\t\"wait_for_update\" : wpmDataLayer.pixels.google.consent_mode.wait_for_update,\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (wpmDataLayer?.pixels?.google?.consent_mode?.region) {\n\t\t\t\t\t\t\t\tgoogle_consent_settings.region = wpmDataLayer.pixels.google.consent_mode.region\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tgoogle_consent_settings = wpm.getVisitorConsentStatusAndUpdateGoogleConsentSettings(google_consent_settings)\n\n\t\t\t\t\t\t\tgtag(\"consent\", \"default\", google_consent_settings)\n\t\t\t\t\t\t\tgtag(\"set\", \"ads_data_redaction\", wpmDataLayer.pixels.google.consent_mode.ads_data_redaction)\n\t\t\t\t\t\t\tgtag(\"set\", \"url_passthrough\", wpmDataLayer.pixels.google.consent_mode.url_passthrough)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Google Linker\n\t\t\t\t\t\t// https://developers.google.com/gtagjs/devguide/linker\n\t\t\t\t\t\tif (wpmDataLayer?.pixels?.google?.linker?.settings) {\n\t\t\t\t\t\t\tgtag(\"set\", \"linker\", wpmDataLayer.pixels.google.linker.settings)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgtag(\"js\", new Date())\n\n\t\t\t\t\t\tif (wpm.googleConfigConditionsMet(\"ads\") && !jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) wpm.fireGtagGoogleAds()\n\t\t\t\t\t\tif (wpm.googleConfigConditionsMet(\"analytics\") && wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) wpm.fireGtagGoogleAnalyticsUA()\n\t\t\t\t\t\tif (wpm.googleConfigConditionsMet(\"analytics\") && wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) wpm.fireGtagGoogleAnalyticsGA4()\n\n\t\t\t\t\t\twpmDataLayer.pixels.google.state = \"ready\"\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tconsole.error(e)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t}\n\t}\n\n\twpm.canGoogleLoad = function () {\n\n\t\tif (wpmDataLayer?.pixels?.google?.consent_mode?.active) {\n\t\t\treturn true\n\t\t} else if (\"category\" === wpm.getConsentValues().mode) {\n\t\t\treturn !!(wpm.getConsentValues().categories[\"ads\"] || wpm.getConsentValues().categories[\"analytics\"])\n\t\t} else if (\"pixel\" === wpm.getConsentValues().mode) {\n\t\t\treturn wpm.getConsentValues().pixels.includes(\"google-ads\") || wpm.getConsentValues().pixels.includes(\"google-analytics\")\n\t\t} else {\n\t\t\tconsole.error(\"Couldn't find a valid load condition for Google mode in wpmConsentValues\")\n\t\t\treturn false\n\t\t}\n\t}\n\n\twpm.gtagLoaded = function () {\n\t\treturn new Promise(function (resolve, reject) {\n\n\t\t\tif (typeof wpmDataLayer?.pixels?.google?.state === \"undefined\") reject()\n\n\t\t\tlet startTime = 0\n\t\t\tlet timeout = 5000\n\t\t\tlet frequency = 200;\n\n\t\t\t(function wait() {\n\t\t\t\tif (wpmDataLayer?.pixels?.google?.state === \"ready\") return resolve()\n\t\t\t\tif (startTime >= timeout) return reject()\n\t\t\t\tstartTime += frequency\n\t\t\t\tsetTimeout(wait, frequency)\n\t\t\t})()\n\t\t})\n\t}\n\n\t// wpm.gtagLoadednew = function () {\n\t// \treturn Promise.race([\n\t// \t\t\tnew Promise(function (resolve, reject) {\n\t//\n\t// \t\t\t\tif (typeof wpmDataLayer?.pixels?.google?.state === \"undefined\") reject();\n\t//\n\t//\n\t// \t\t\t\t(function wait() {\n\t// \t\t\t\t\tif (wpmDataLayer?.pixels?.google?.state === \"ready\") return resolve()\n\t// \t\t\t\t\tif (to >= 1000) return reject()\n\t// \t\t\t\t\tsetTimeout(wait, 100)\n\t// \t\t\t\t})()\n\t// \t\t\t}),\n\t// \t\t\tnew Promise(function (resolve, reject) {\n\t// \t\t\t\tsetTimeout(() => reject(), 1000)\n\t// \t\t\t}),\n\t// \t\t],\n\t// \t)\n\t// \t\t// .then((value) => {console.log(\"race then value: \" + value)})\n\t// \t\t.catch(\n\t// \t\t\t(value) => {\n\t// \t\t\t\tconsole.log(\"race catch value: \" + value)\n\t// \t\t\t\treturn Promise.reject()\n\t// \t\t\t})\n\t// }\n\n\n\t// const promise1 = new Promise((resolve, reject) => {\n\t// \tsetTimeout(resolve, 500, \"one\")\n\t// })\n\t//\n\t// const promise2 = new Promise((resolve, reject) => {\n\t// \tsetTimeout(reject, 100, \"two\")\n\t// })\n\t//\n\t// let onlyRunIfResolves = function () {\n\t// \treturn Promise.race([promise1, promise2])\n\t// \t\t.catch(() => {\n\t// \t\t})\n\t// }\n\t//\n\t// onlyRunIfResolves()\n\t// \t.then(() => {\n\t// \t\tconsole.log(\"running function\")\n\t// \t})\n\n\n}(window.wpm = window.wpm || {}, jQuery));\n\n\n(function () {\n\n\tjQuery(document).on(\"wpmLoadPixels\", function () {\n\n\t\tif (\n\t\t\twpm.canGoogleLoad() &&\n\t\t\t(typeof wpmDataLayer?.pixels?.google?.state === \"undefined\")\n\t\t) {\n\t\t\twpm.loadGoogle()\n\t\t}\n\t})\n\n\t// return wpmDataLayer?.pixels?.google?.state === \"undefined\";\n\n})()\n","(function (wpm, $, undefined) {\n\n\twpm.load_hotjar_pixel = function () {\n\n\t\tif (wpmDataLayer?.pixels?.hotjar?.site_id) {\n\n\t\t\t// console.log('hotjar loaded');\n\n\t\t\twpmDataLayer.pixels.hotjar.loaded = true;\n\n\t\t\t// @formatter:off\n\t\t\t(function(h,o,t,j,a,r){\n\t\t\t\th.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};\n\t\t\t\th._hjSettings={hjid:wpmDataLayer.pixels.hotjar.site_id,hjsv:6};\n\t\t\t\ta=o.getElementsByTagName('head')[0];\n\t\t\t\tr=o.createElement('script');r.async=1;\n\t\t\t\tr.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;\n\t\t\t\ta.appendChild(r);\n\t\t\t})(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv=');\n\t\t\t// @formatter:on\n\n\t\t}\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery));\n\n\n(function () {\n\n\tjQuery(document).on(\"wpmLoadPixels\", function () {\n\n\t\tif (wpm.canIFire(\"analytics\", \"hotjar\") && !wpmDataLayer?.pixels?.hotjar?.loaded) wpm.load_hotjar_pixel()\n\n\t})\n\n})()\n\n\n\n","/**\n * After wpm is loaded\n * we first check if wpmDataLayer is loaded,\n * and as soon as it is, we load the pixels,\n * and as soon as the page load is complete,\n * we fire the wpmLoad event.\n */\nwpm.wpmDataLayerExists()\n\t.then(function () {\n\t\tjQuery(document).trigger(\"wpmPreLoadPixels\", {})\n\t})\n\t.then(function () {\n\t\twpm.pageLoaded().then(function () {\n\t\t\tjQuery(document).trigger(\"wpmLoad\", {})\n\t\t})\n\t})\n\n","/**\n * Create a wpm namespace under which all functions are declared\n */\n\n// https://stackoverflow.com/a/5947280/4688612\n(function (wpm, $, undefined) {\n\n\tconst wpmDeduper = {\n\t\tkeyName : \"_wpm_order_ids\",\n\t\tcookieExpiresDays: 365,\n\t}\n\n\tconst wpmRestSettings = {\n\t\t// cookiesAvailable : '_wpm_cookies_are_available',\n\t\tcookieWpmRestEndpointAvailable: \"_wpm_endpoint_available\",\n\t\trestEndpoint : \"/wp-json/\",\n\t\trestFails : 0,\n\t\trestFailsThreshold : 10,\n\t}\n\n\twpm.emailSelected = false\n\twpm.paymentMethodSelected = false\n\n\t// wpm.checkIfCookiesAvailable = function () {\n\t//\n\t// // read the cookie if previously set, if it is return true, otherwise continue\n\t// if (wpm.getCookie(wpmRestSettings.cookiesAvailable)) {\n\t// return true;\n\t// }\n\t//\n\t// // set the cookie for the session\n\t// Cookies.set(wpmRestSettings.cookiesAvailable, true);\n\t//\n\t// // read cookie, true if ok, false if not ok\n\t// return !!wpm.getCookie(wpmRestSettings.cookiesAvailable);\n\t// }\n\n\twpm.useRestEndpoint = function () {\n\n\t\t// only if sessionStorage is available\n\n\t\t// only if REST API endpoint is generally accessible\n\t\t// check in sessionStorage if we checked before and return answer\n\t\t// otherwise check if the endpoint is available, save answer in sessionStorage and return answer\n\n\t\t// only if not too many REST API errors happened\n\n\t\treturn wpm.isSessionStorageAvailable() &&\n\t\t\twpm.isRestEndpointAvailable() &&\n\t\t\twpm.isBelowRestErrorThreshold()\n\t}\n\n\twpm.isBelowRestErrorThreshold = function () {\n\t\treturn window.sessionStorage.getItem(wpmRestSettings.restFails) <= wpmRestSettings.restFailsThreshold\n\t}\n\n\twpm.isRestEndpointAvailable = function () {\n\n\t\tif (window.sessionStorage.getItem(wpmRestSettings.cookieWpmRestEndpointAvailable)) {\n\t\t\treturn JSON.parse(window.sessionStorage.getItem(wpmRestSettings.cookieWpmRestEndpointAvailable))\n\t\t} else {\n\t\t\t// return wpm.testEndpoint();\n\t\t\t// just set the value whenever possible in order not to wait or block the main thread\n\t\t\twpm.testEndpoint()\n\t\t}\n\t}\n\n\twpm.isSessionStorageAvailable = function () {\n\n\t\treturn !!window.sessionStorage\n\t}\n\n\twpm.testEndpoint = function (\n\t\turl = location.protocol + \"//\" + location.host + wpmRestSettings.restEndpoint,\n\t\tcookieName = wpmRestSettings.cookieWpmRestEndpointAvailable,\n\t) {\n\t\t// console.log('testing endpoint');\n\n\t\tjQuery.ajax(url, {\n\t\t\ttype : \"HEAD\",\n\t\t\ttimeout: 1000,\n\t\t\t// async: false,\n\t\t\tstatusCode: {\n\t\t\t\t200: function (response) {\n\t\t\t\t\t// Cookies.set(cookieName, true);\n\t\t\t\t\t// console.log('endpoint works');\n\t\t\t\t\twindow.sessionStorage.setItem(cookieName, JSON.stringify(true))\n\t\t\t\t},\n\t\t\t\t404: function (response) {\n\t\t\t\t\t// Cookies.set(cookieName, false);\n\t\t\t\t\t// console.log('endpoint doesn\\'t work');\n\t\t\t\t\twindow.sessionStorage.setItem(cookieName, JSON.stringify(false))\n\t\t\t\t},\n\t\t\t\t0 : function (response) {\n\t\t\t\t\t// Cookies.set(cookieName, false);\n\t\t\t\t\t// console.log('endpoint doesn\\'t work');\n\t\t\t\t\twindow.sessionStorage.setItem(cookieName, JSON.stringify(false))\n\t\t\t\t},\n\t\t\t},\n\t\t}).then(r => {\n\t\t\t// console.log('test done')\n\t\t\t// console.log('result: ' + JSON.parse(window.sessionStorage.getItem(cookieName)));\n\t\t\t// return JSON.parse(window.sessionStorage.getItem(cookieName));\n\t\t})\n\t}\n\n\twpm.isWpmRestEndpointAvailable = function (cookieName = wpmRestSettings.cookieWpmRestEndpointAvailable) {\n\n\t\treturn !!wpm.getCookie(cookieName)\n\t}\n\n\twpm.writeOrderIdToStorage = function (orderId, expireDays = 365) {\n\n\t\t// save the order ID in the browser storage\n\n\t\tif (!window.Storage) {\n\t\t\tlet expiresDate = new Date()\n\t\t\texpiresDate.setDate(expiresDate.getDate() + wpmDeduper.cookieExpiresDays)\n\n\t\t\tlet ids = []\n\t\t\tif (checkCookie()) {\n\t\t\t\tids = JSON.parse(wpm.getCookie(wpmDeduper.keyName))\n\t\t\t}\n\n\t\t\tif (!ids.includes(orderId)) {\n\t\t\t\tids.push(orderId)\n\t\t\t\tdocument.cookie = wpmDeduper.keyName + \"=\" + JSON.stringify(ids) + \";expires=\" + expiresDate.toUTCString()\n\t\t\t}\n\n\t\t} else {\n\t\t\tif (localStorage.getItem(wpmDeduper.keyName) === null) {\n\t\t\t\tlet ids = []\n\t\t\t\tids.push(orderId)\n\t\t\t\twindow.localStorage.setItem(wpmDeduper.keyName, JSON.stringify(ids))\n\n\t\t\t} else {\n\t\t\t\tlet ids = JSON.parse(localStorage.getItem(wpmDeduper.keyName))\n\t\t\t\tif (!ids.includes(orderId)) {\n\t\t\t\t\tids.push(orderId)\n\t\t\t\t\twindow.localStorage.setItem(wpmDeduper.keyName, JSON.stringify(ids))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (typeof wpm.storeOrderIdOnServer === \"function\" && wpmDataLayer.orderDeduplication) {\n\t\t\twpm.storeOrderIdOnServer(orderId)\n\t\t}\n\t}\n\n\tfunction checkCookie() {\n\t\tlet key = wpm.getCookie(wpmDeduper.keyName)\n\t\treturn key !== \"\"\n\t}\n\n\twpm.isOrderIdStored = function (orderId) {\n\n\t\t// console.log('deduper: ' + wpmDataLayer.orderDeduplication);\n\t\tif (wpmDataLayer.orderDeduplication) {\n\t\t\t// console.log('order deduplication: on');\n\t\t\tif (!window.Storage) {\n\n\t\t\t\tif (checkCookie()) {\n\t\t\t\t\tlet ids = JSON.parse(wpm.getCookie(wpmDeduper.keyName))\n\t\t\t\t\treturn ids.includes(orderId)\n\t\t\t\t} else {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (localStorage.getItem(wpmDeduper.keyName) !== null) {\n\t\t\t\t\tlet ids = JSON.parse(localStorage.getItem(wpmDeduper.keyName))\n\t\t\t\t\treturn ids.includes(orderId)\n\t\t\t\t} else {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.log(\"order duplication prevention: off\")\n\t\t\treturn false\n\t\t}\n\t}\n\n\twpm.isEmail = function (email) {\n\t\t// https://emailregex.com/\n\t\tlet regex = /^(([^<>()\\[\\]\\\\.,;:\\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,}))$/\n\t\treturn regex.test(email)\n\t}\n\n\twpm.removeProductFromCart = function (productId, quantityToRemove = null) {\n\t\t// console.log('product_id: ' + productId + ' | quantityToRemove: ' + quantityToRemove);\n\n\t\ttry {\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\t\tproductId = getIdBasedOndVariationsOutputSetting(productId)\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\t\tlet quantity\n\n\t\t\tif (quantityToRemove == null) {\n\t\t\t\tquantity = wpmDataLayer.cart[productId].quantity\n\t\t\t} else {\n\t\t\t\tquantity = quantityToRemove\n\t\t\t}\n\n\t\t\t// console.log('product_id: ' + productId + ' | qty: ' + quantity);\n\t\t\t// console.log(productId);\n\t\t\t// console.log(wpmDataLayer.cart);\n\t\t\t// console.log(wpmDataLayer.cart[productId]);\n\n\t\t\tif (wpmDataLayer.cart[productId]) {\n\n\t\t\t\t// let product = {\n\t\t\t\t// id : productId.toString(),\n\t\t\t\t// dyn_r_ids: wpmDataLayer.cart[productId].dyn_r_ids,\n\t\t\t\t// name : wpmDataLayer.cart[productId].name,\n\t\t\t\t// // list_name: wpmDataLayer.shop.list_name, // doesn't make sense on mini_cart\n\t\t\t\t// brand : wpmDataLayer.cart[productId].brand,\n\t\t\t\t// category: wpmDataLayer.cart[productId].category,\n\t\t\t\t// variant : wpmDataLayer.cart[productId].variant,\n\t\t\t\t// // list_position: wpmDataLayer.cart[productId].position, // doesn't make sense on mini_cart\n\t\t\t\t// quantity : quantity,\n\t\t\t\t// price : wpmDataLayer.cart[productId].price,\n\t\t\t\t// isVariation: wpmDataLayer.products[productId].isVariation,\n\t\t\t\t// };\n\t\t\t\t//\n\t\t\t\t// if (product.isVariation) product['parentId_dyn_r_ids'] = wpmDataLayer.products[productId].parentId_dyn_r_ids;\n\n\t\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId, quantity)\n\n\t\t\t\t// console.log('removing');\n\t\t\t\t// console.log(data);\n\n\t\t\t\tjQuery(document).trigger(\"wpmRemoveFromCart\", product)\n\n\t\t\t\tif (quantityToRemove == null || wpmDataLayer.cart[productId].quantity === quantityToRemove) {\n\t\t\t\t\tdelete wpmDataLayer.cart[productId]\n\t\t\t\t\tif (sessionStorage) sessionStorage.setItem(\"wpmDataLayerCart\", JSON.stringify(wpmDataLayer.cart))\n\t\t\t\t} else {\n\t\t\t\t\twpmDataLayer.cart[productId].quantity = wpmDataLayer.cart[productId].quantity - quantity\n\t\t\t\t\tif (sessionStorage) sessionStorage.setItem(\"wpmDataLayerCart\", JSON.stringify(wpmDataLayer.cart))\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t\t// console.log('getting cart from back end');\n\t\t\t// wpm.getCartItemsFromBackend();\n\t\t\t// console.log('getting cart from back end done');\n\n\t\t}\n\t}\n\n\tgetIdBasedOndVariationsOutputSetting = function (productId) {\n\n\t\ttry {\n\t\t\tif (wpmDataLayer?.general?.variationsOutput) {\n\t\t\t\t// console.log('test');\n\t\t\t\treturn productId\n\t\t\t} else {\n\t\t\t\tif (wpmDataLayer.products[productId].isVariation) {\n\t\t\t\t\treturn wpmDataLayer.products[productId].parentId\n\t\t\t\t} else {\n\t\t\t\t\treturn productId\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\t// add_to_cart\n\twpm.addProductToCart = function (productId, quantity) {\n\n\t\ttry {\n\t\t\t// console.log('productId: ' + productId + ' | qty: ' + quantity);\n\t\t\t// console.log('productId: ' + productId + ' | variationId: ' + variationId + ' | qty: ' + quantity);\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\t\tproductId = getIdBasedOndVariationsOutputSetting(productId)\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\t\tif (wpmDataLayer.products[productId]) {\n\n\t\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId, quantity)\n\n\t\t\t\t// console.log(productId);\n\n\t\t\t\tjQuery(document).trigger(\"wpmAddToCart\", product)\n\n\t\t\t\t// add product to cart wpmDataLayer['cart']\n\n\t\t\t\t// if the product already exists in the object, only add the additional quantity\n\t\t\t\t// otherwise create that product object in the wpmDataLayer['cart']\n\t\t\t\tif (wpmDataLayer.cart !== undefined && wpmDataLayer.cart[productId] !== undefined) {\n\t\t\t\t\twpmDataLayer.cart[productId].quantity = wpmDataLayer.cart[productId].quantity + quantity\n\t\t\t\t\tif (sessionStorage) sessionStorage.setItem(\"wpmDataLayerCart\", JSON.stringify(wpmDataLayer.cart))\n\t\t\t\t} else {\n\n\t\t\t\t\tif (!wpmDataLayer.cart) {\n\n\t\t\t\t\t\t// wpmDataLayer['cart'] = {\n\t\t\t\t\t\t// [productId]: {\n\t\t\t\t\t\t// id : productId,\n\t\t\t\t\t\t// dyn_r_ids : wpmDataLayer.products[productId].dyn_r_ids,\n\t\t\t\t\t\t// name : wpmDataLayer.products[productId].name,\n\t\t\t\t\t\t// brand : wpmDataLayer.products[productId].brand,\n\t\t\t\t\t\t// category : wpmDataLayer.products[productId].category,\n\t\t\t\t\t\t// variant : wpmDataLayer.products[productId].variant,\n\t\t\t\t\t\t// quantity : quantity,\n\t\t\t\t\t\t// price : wpmDataLayer.products[productId].price,\n\t\t\t\t\t\t// isVariation: wpmDataLayer.products[productId].isVariation,\n\t\t\t\t\t\t// parentId : wpmDataLayer.products[productId].parentId,\n\t\t\t\t\t\t// }\n\t\t\t\t\t\t// };\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// if (wpmDataLayer['cart'][productId].isVariation) wpmDataLayer['cart'][productId]['parentId_dyn_r_ids'] = wpmDataLayer.products[productId].parentId_dyn_r_ids;\n\n\t\t\t\t\t\twpmDataLayer[\"cart\"] = {\n\t\t\t\t\t\t\t[productId]: wpm.getProductDetailsFormattedForEvent(productId, quantity),\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (sessionStorage) sessionStorage.setItem(\"wpmDataLayerCart\", JSON.stringify(wpmDataLayer.cart))\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// wpmDataLayer.cart[productId] = {\n\t\t\t\t\t\t// id : productId,\n\t\t\t\t\t\t// dyn_r_ids : wpmDataLayer.products[productId].dyn_r_ids,\n\t\t\t\t\t\t// name : wpmDataLayer.products[productId].name,\n\t\t\t\t\t\t// brand : wpmDataLayer.products[productId].brand,\n\t\t\t\t\t\t// category : wpmDataLayer.products[productId].category,\n\t\t\t\t\t\t// variant : wpmDataLayer.products[productId].variant,\n\t\t\t\t\t\t// quantity : quantity,\n\t\t\t\t\t\t// price : wpmDataLayer.products[productId].price,\n\t\t\t\t\t\t// isVariation: wpmDataLayer.products[productId].isVariation,\n\t\t\t\t\t\t// parentId : wpmDataLayer.products[productId].parentId,\n\t\t\t\t\t\t// };\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// if (wpmDataLayer.cart[productId].isVariation) wpmDataLayer.cart[productId]['parentId_dyn_r_ids'] = wpmDataLayer.products[productId].parentId_dyn_r_ids;\n\n\t\t\t\t\t\twpmDataLayer.cart[productId] = wpm.getProductDetailsFormattedForEvent(productId, quantity)\n\n\t\t\t\t\t\tif (sessionStorage) sessionStorage.setItem(\"wpmDataLayerCart\", JSON.stringify(wpmDataLayer.cart))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\n\t\t\t// fallback if wpmDataLayer.cart and wpmDataLayer.products got out of sync in case cart caching has an issue\n\t\t\twpm.getCartItemsFromBackend()\n\t\t}\n\t}\n\n\twpm.getCartItems = function () {\n\n\t\t// console.log('get cart items');\n\n\t\tif (sessionStorage) {\n\t\t\tif (!sessionStorage.getItem(\"wpmDataLayerCart\") || wpmDataLayer.shop.page_type === \"order_received_page\") {\n\t\t\t\tsessionStorage.setItem(\"wpmDataLayerCart\", JSON.stringify({}))\n\t\t\t} else {\n\t\t\t\twpm.saveCartObjectToDataLayer(JSON.parse(sessionStorage.getItem(\"wpmDataLayerCart\")))\n\t\t\t}\n\t\t} else {\n\t\t\twpm.getCartItemsFromBackend()\n\t\t}\n\t}\n\n\twpm.getCartItemsFromBackend = function () {\n\t\t// get all cart items from the backend\n\t\ttry {\n\t\t\tlet data = {\n\t\t\t\taction: \"wpm_get_cart_items\",\n\t\t\t}\n\n\t\t\tjQuery.ajax(\n\t\t\t\t{\n\t\t\t\t\ttype : \"get\",\n\t\t\t\t\tdataType: \"json\",\n\t\t\t\t\t// url : ajax_object.ajax_url,\n\t\t\t\t\turl : wpm.ajax_url,\n\t\t\t\t\tdata : data,\n\t\t\t\t\tsuccess: function (cartItems) {\n\n\t\t\t\t\t\t// save all cart items into wpmDataLayer\n\n\t\t\t\t\t\tif (!cartItems[\"cart\"]) cartItems[\"cart\"] = {}\n\n\t\t\t\t\t\twpm.saveCartObjectToDataLayer(cartItems[\"cart\"])\n\t\t\t\t\t\tif (sessionStorage) sessionStorage.setItem(\"wpmDataLayerCart\", JSON.stringify(cartItems[\"cart\"]))\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.getProductsFromBackend = function (productIds) {\n\t\t// console.log('getting pids from back-end: ' + productIds)\n\t\t// get productIds from the backend\n\n\t\t// reduce productIds by products already in the dataLayer\n\t\tproductIds = productIds.filter(item => !wpmDataLayer.products.hasOwnProperty(item))\n\n\t\t// if no products IDs are in the object, don't try to get anything from the server\n\t\tif (!productIds || productIds.length === 0) return\n\n\t\ttry {\n\t\t\tlet data = {\n\t\t\t\taction : \"wpm_get_product_ids\",\n\t\t\t\tproductIds: productIds,\n\t\t\t}\n\n\t\t\tjQuery.ajax(\n\t\t\t\t{\n\t\t\t\t\ttype : \"get\",\n\t\t\t\t\tdataType: \"json\",\n\t\t\t\t\t// url : ajax_object.ajax_url,\n\t\t\t\t\turl : wpm.ajax_url,\n\t\t\t\t\tdata : data,\n\t\t\t\t\tsuccess: function (products) {\n\n\t\t\t\t\t\t// merge products into wpmDataLayer.products\n\t\t\t\t\t\twpmDataLayer.products = Object.assign({}, wpmDataLayer.products, products)\n\t\t\t\t\t},\n\t\t\t\t\terror : function (response) {\n\t\t\t\t\t\tconsole.log(response)\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.saveCartObjectToDataLayer = function (cartObject) {\n\t\twpmDataLayer.cart = cartObject\n\t\twpmDataLayer.products = Object.assign({}, wpmDataLayer.products, cartObject)\n\t}\n\n\twpm.fireCheckoutOption = function (step, checkout_option = null, value = null) {\n\n\t\tlet data = {\n\t\t\tstep : step,\n\t\t\tcheckout_option: checkout_option,\n\t\t\tvalue : value,\n\t\t}\n\n\t\tjQuery(document).trigger(\"wpmFireCheckoutOption\", data)\n\t}\n\n\twpm.fireCheckoutProgress = function (step) {\n\n\t\tlet data = {\n\t\t\tstep: step,\n\t\t}\n\n\t\tjQuery(document).trigger(\"wpmFireCheckoutProgress\", data)\n\t}\n\n\twpm.getPostIdFromString = function (string) {\n\t\t// console.log(string);\n\t\ttry {\n\t\t\treturn string.match(/(post-)(\\d+)/)[2]\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.triggerViewItemList = function (productId) {\n\n\t\t// productId = null;\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\tproductId = getIdBasedOndVariationsOutputSetting(productId)\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\tjQuery(document).trigger(\"wpmViewItemList\", wpm.getProductDataForViewItemEvent(productId))\n\t}\n\n\twpm.getProductDataForViewItemEvent = function (productId) {\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\ttry {\n\t\t\tif (wpmDataLayer.products[productId]) {\n\n\t\t\t\treturn wpm.getProductDetailsFormattedForEvent(productId)\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\twpm.getMainProductIdFromProductPage = function () {\n\t\ttry {\n\t\t\tif ([\"simple\", \"variable\", \"grouped\", \"composite\", \"bundle\"].indexOf(wpmDataLayer.shop.product_type) >= 0) {\n\t\t\t\treturn jQuery(\".wpmProductId:first\").data(\"id\")\n\t\t\t} else {\n\t\t\t\treturn false\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.viewItemListTriggerTestMode = function (target) {\n\n\t\tjQuery(target).css({\"position\": \"relative\"})\n\t\tjQuery(target).append(\"<div id=\\\"viewItemListTriggerOverlay\\\"></div>\")\n\t\tjQuery(target).find(\"#viewItemListTriggerOverlay\").css({\n\t\t\t\"z-index\" : \"10\",\n\t\t\t\"display\" : \"block\",\n\t\t\t\"position\" : \"absolute\",\n\t\t\t\"height\" : \"100%\",\n\t\t\t\"top\" : \"0\",\n\t\t\t\"left\" : \"0\",\n\t\t\t\"right\" : \"0\",\n\t\t\t\"opacity\" : wpmDataLayer.viewItemListTrigger.opacity,\n\t\t\t\"background-color\": wpmDataLayer.viewItemListTrigger.backgroundColor,\n\t\t})\n\t}\n\n\twpm.getSearchTermFromUrl = function () {\n\t\ttry {\n\t\t\tlet urlParameters = new URLSearchParams(window.location.search)\n\t\t\treturn urlParameters.get(\"s\")\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\t// we need this to track timeouts for intersection observers\n\tlet ioTimeouts = {}\n\n\twpm.observerCallback = function (entries, observer) {\n\n\t\tentries.forEach((entry) => {\n\n\t\t\ttry {\n\t\t\t\tlet productId\n\n\t\t\t\tlet elementId = jQuery(entry.target).data(\"ioid\")\n\n\t\t\t\t// Get the productId from next element, if wpmProductId is a sibling, like in Gutenberg blocks\n\t\t\t\t// otherwise go search in children, like in regular WC loop items\n\t\t\t\tif (jQuery(entry.target).next(\".wpmProductId\").length) {\n\t\t\t\t\t// console.log('test 1');\n\t\t\t\t\tproductId = jQuery(entry.target).next(\".wpmProductId\").data(\"id\")\n\t\t\t\t} else {\n\t\t\t\t\tproductId = jQuery(entry.target).find(\".wpmProductId\").data(\"id\")\n\t\t\t\t}\n\n\t\t\t\t// productId = null;\n\n\t\t\t\tif (!productId) throw Error(\"wpmProductId element not found\")\n\n\t\t\t\tif (entry.isIntersecting) {\n\n\t\t\t\t\t// console.log('prodid: ' + productId);\n\t\t\t\t\tioTimeouts[elementId] = setTimeout(() => {\n\t\t\t\t\t\t// console.log('prodid: ' + productId);\n\t\t\t\t\t\twpm.triggerViewItemList(productId)\n\t\t\t\t\t\tif (wpmDataLayer.viewItemListTrigger.testMode) wpm.viewItemListTriggerTestMode(entry.target)\n\t\t\t\t\t\tif (wpmDataLayer.viewItemListTrigger.repeat === false) observer.unobserve(entry.target)\n\t\t\t\t\t}, wpmDataLayer.viewItemListTrigger.timeout)\n\n\t\t\t\t} else {\n\n\t\t\t\t\tclearTimeout(ioTimeouts[elementId])\n\t\t\t\t\tif (wpmDataLayer.viewItemListTrigger.testMode) jQuery(entry.target).find(\"#viewItemListTriggerOverlay\").remove()\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e)\n\t\t\t}\n\t\t})\n\t}\n\n\t// fire view_item_list only on products that have become visible\n\tlet io\n\tlet ioid = 0\n\tlet allIoElementsToWatch\n\n\tlet getAllElementsToWatch = function () {\n\n\t\tallIoElementsToWatch = jQuery(\".wpmProductId\")\n\t\t\t.map(function (i, elem) {\n\t\t\t\t// console.log(elem);\n\t\t\t\tif (\n\t\t\t\t\tjQuery(elem).parent().hasClass(\"type-product\") ||\n\t\t\t\t\tjQuery(elem).parent().hasClass(\"product\") ||\n\t\t\t\t\tjQuery(elem).parent().hasClass(\"product-item-inner\")\n\t\t\t\t) {\n\t\t\t\t\t// console.log(elem);\n\t\t\t\t\treturn jQuery(elem).parent()\n\t\t\t\t} else if (\n\t\t\t\t\tjQuery(elem).prev().hasClass(\"wc-block-grid__product\") ||\n\t\t\t\t\tjQuery(elem).prev().hasClass(\"product\") ||\n\t\t\t\t\tjQuery(elem).prev().hasClass(\"product-small\") ||\n\t\t\t\t\tjQuery(elem).prev().hasClass(\"woocommerce-LoopProduct-link\")\n\t\t\t\t) {\n\t\t\t\t\treturn jQuery(this).prev()\n\t\t\t\t} else if (jQuery(elem).closest(\".product\").length) {\n\t\t\t\t\treturn jQuery(elem).closest(\".product\")\n\t\t\t\t}\n\t\t\t})\n\t}\n\n\twpm.startIntersectionObserverToWatch = function () {\n\n\t\ttry {\n\t\t\t// enable view_item_list test mode from browser\n\t\t\tlet urlParams = new URLSearchParams(window.location.search)\n\t\t\tif (urlParams.has(\"vildemomode\")) wpmDataLayer.viewItemListTrigger.testMode = true\n\n\t\t\t// set up intersection observer\n\t\t\tio = new IntersectionObserver(wpm.observerCallback, {\n\t\t\t\tthreshold: wpmDataLayer.viewItemListTrigger.threshold,\n\t\t\t})\n\n\t\t\tgetAllElementsToWatch()\n\n\t\t\t// console.log(allElementsToWatch);\n\n\t\t\tallIoElementsToWatch.each(function (i, elem) {\n\t\t\t\t// console.log(elem[0]);\n\t\t\t\t// jQuery(elem[0]).attr('data-ioid', ioid++);\n\t\t\t\tjQuery(elem[0]).data(\"ioid\", ioid++)\n\n\t\t\t\tio.observe(elem[0])\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\t// watch DOM for new lazy loaded products and add them to the intersection observer\n\twpm.startProductsMutationObserverToWatch = function () {\n\n\t\ttry {\n\t\t\t// Pass in the target node, as well as the observer options\n\n\t\t\t// selects the most common parent node\n\t\t\t// https://stackoverflow.com/a/7648323/4688612\n\t\t\tlet productsNode = jQuery(\".wpmProductId:eq(0)\").parents().has(jQuery(\".wpmProductId:eq(1)\").parents()).first()\n\n\t\t\tif (productsNode.length) {\n\t\t\t\tproductsMutationObserver.observe(productsNode[0], {\n\t\t\t\t\tattributes : true,\n\t\t\t\t\tchildList : true,\n\t\t\t\t\tcharacterData: true,\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\t// Create an observer instance\n\tlet productsMutationObserver = new MutationObserver(function (mutations) {\n\n\t\tmutations.forEach(function (mutation) {\n\t\t\tlet newNodes = mutation.addedNodes // DOM NodeList\n\t\t\tif (newNodes !== null) { // If there are new nodes added\n\t\t\t\tlet nodes = jQuery(newNodes) // jQuery set\n\t\t\t\tnodes.each(function () {\n\t\t\t\t\tif (\n\t\t\t\t\t\tjQuery(this).hasClass(\"type-product\") ||\n\t\t\t\t\t\tjQuery(this).hasClass(\"product-small\") ||\n\t\t\t\t\t\tjQuery(this).hasClass(\"wc-block-grid__product\")\n\t\t\t\t\t) {\n\t\t\t\t\t\t// check if the node has a child or sibling wpmProductId\n\t\t\t\t\t\t// if yes add it to the intersectionObserver\n\t\t\t\t\t\tif (hasWpmProductIdElement(this)) {\n\t\t\t\t\t\t\tjQuery(this).data(\"ioid\", ioid++)\n\t\t\t\t\t\t\tio.observe(this)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t})\n\n\tlet hasWpmProductIdElement = function (elem) {\n\t\treturn !!(jQuery(elem).find(\".wpmProductId\").length ||\n\t\t\tjQuery(elem).siblings(\".wpmProductId\").length)\n\t}\n\n\twpm.setCookie = function (cookieName, cookieValue = \"\", expiryDays = null) {\n\t\tif (expiryDays) {\n\t\t\tlet d = new Date()\n\t\t\td.setTime(d.getTime() + (expiryDays * 24 * 60 * 60 * 1000))\n\t\t\tlet expires = \"expires=\" + d.toUTCString()\n\t\t\tdocument.cookie = cookieName + \"=\" + cookieValue + \";\" + expires + \";path=/\"\n\t\t} else {\n\t\t\tdocument.cookie = cookieName + \"=\" + cookieValue + \";path=/\"\n\t\t}\n\t}\n\n\twpm.getCookie = function (cookieName) {\n\t\tlet name = cookieName + \"=\"\n\t\tlet decodedCookie = decodeURIComponent(document.cookie)\n\t\tlet ca = decodedCookie.split(\";\")\n\t\tfor (let i = 0; i < ca.length; i++) {\n\t\t\tlet c = ca[i]\n\t\t\twhile (c.charAt(0) == \" \") {\n\t\t\t\tc = c.substring(1)\n\t\t\t}\n\t\t\tif (c.indexOf(name) == 0) {\n\t\t\t\treturn c.substring(name.length, c.length)\n\t\t\t}\n\t\t}\n\t\treturn \"\"\n\t}\n\n\twpm.getWpmSessionData = function () {\n\t\tif (window.sessionStorage) {\n\n\t\t\tlet data = window.sessionStorage.getItem(\"_wpm\")\n\t\t\tif (data !== null) {\n\t\t\t\treturn JSON.parse(data)\n\t\t\t} else {\n\t\t\t\treturn {}\n\t\t\t}\n\t\t} else {\n\t\t\treturn {}\n\t\t}\n\t}\n\n\twpm.setWpmSessionData = function (data) {\n\t\tif (window.sessionStorage) {\n\t\t\twindow.sessionStorage.setItem(\"_wpm\", JSON.stringify(data))\n\t\t}\n\t}\n\n\twpm.storeOrderIdOnServer = function (orderId) {\n\n\t\t// console.log('saving wpm_purchase_pixels_fired');\n\n\t\t// console.log('url: ' + wpm_premium_only_ajax_object.ajax_url);\n\t\t// console.log('nonce: ' + wpm_premium_only_ajax_object.nonce);\n\t\t// console.log('url: ' + wpm.ajax_url);\n\t\t// console.log('nonce: ' + wpm.nonce);\n\n\t\ttry {\n\t\t\t// save the state in the database\n\t\t\tlet data = {\n\t\t\t\taction : \"wpm_purchase_pixels_fired\",\n\t\t\t\torder_id: orderId,\n\t\t\t\t// nonce : ajax_object.nonce,\n\t\t\t\tnonce: wpm.nonce,\n\t\t\t}\n\n\t\t\tjQuery.ajax(\n\t\t\t\t{\n\t\t\t\t\ttype : \"post\",\n\t\t\t\t\tdataType: \"json\",\n\t\t\t\t\t// url : ajax_object.ajax_url,\n\t\t\t\t\turl : wpm.ajax_url,\n\t\t\t\t\tdata : data,\n\t\t\t\t\tsuccess: function (response) {\n\t\t\t\t\t\tif (response.success === false) {\n\t\t\t\t\t\t\tconsole.log(response)\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\terror : function (response) {\n\t\t\t\t\t\tconsole.log(response)\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.getProductIdByCartItemKeyUrl = function (url) {\n\t\tlet searchParams = new URLSearchParams(url.search)\n\t\tlet cartItemKey = searchParams.get(\"remove_item\")\n\n\t\tlet productId = null\n\n\t\tif (wpmDataLayer.cartItemKeys[cartItemKey][\"variation_id\"] === 0) {\n\t\t\tproductId = wpmDataLayer.cartItemKeys[cartItemKey][\"product_id\"]\n\t\t} else {\n\t\t\tproductId = wpmDataLayer.cartItemKeys[cartItemKey][\"variation_id\"]\n\t\t}\n\n\t\treturn productId\n\t}\n\n\twpm.getAddToCartLinkProductIds = function () {\n\t\treturn jQuery(\"a\").map(function () {\n\t\t\tlet href = jQuery(this).attr(\"href\")\n\n\t\t\tif (href && href.includes(\"?add-to-cart=\")) {\n\t\t\t\tlet matches = href.match(/(add-to-cart=)(\\d+)/)\n\t\t\t\tif (matches) return matches[2]\n\t\t\t}\n\t\t}).get()\n\t}\n\n\twpm.getProductDetailsFormattedForEvent = function (productId, quantity = 1) {\n\n\t\t// console.log(wpmDataLayer.products[productId].dyn_r_ids)\n\n\t\tlet product = {\n\t\t\tid : productId.toString(),\n\t\t\tdyn_r_ids : wpmDataLayer.products[productId].dyn_r_ids,\n\t\t\tname : wpmDataLayer.products[productId].name,\n\t\t\tlist_name : wpmDataLayer.shop.list_name,\n\t\t\tbrand : wpmDataLayer.products[productId].brand,\n\t\t\tcategory : wpmDataLayer.products[productId].category,\n\t\t\tvariant : wpmDataLayer.products[productId].variant,\n\t\t\tlist_position: wpmDataLayer.products[productId].position,\n\t\t\tquantity : quantity,\n\t\t\tprice : wpmDataLayer.products[productId].price,\n\t\t\tcurrency : wpmDataLayer.shop.currency,\n\t\t\tisVariable : wpmDataLayer.products[productId].isVariable,\n\t\t\tisVariation : wpmDataLayer.products[productId].isVariation,\n\t\t\tparentId : wpmDataLayer.products[productId].parentId,\n\t\t}\n\n\t\tif (product.isVariation) product[\"parentId_dyn_r_ids\"] = wpmDataLayer.products[productId].parentId_dyn_r_ids\n\n\t\treturn product\n\t}\n\n\twpm.setReferrerToCookie = function () {\n\t\t// can't use session storage as we can't read it from the server\n\t\tif (!wpm.getCookie(\"wpmReferrer\")) {\n\t\t\twpm.setCookie(\"wpmReferrer\", document.referrer)\n\t\t}\n\t}\n\n\twpm.getReferrerFromCookie = function () {\n\t\tif (wpm.getCookie(\"wpmReferrer\")) {\n\t\t\treturn wpm.getCookie(\"wpmReferrer\")\n\t\t} else {\n\t\t\treturn null\n\t\t}\n\t}\n\n\twpm.getClidFromBrowser = function (clidId = \"gclid\") {\n\n\t\tlet clidCookieId\n\n\t\tclidCookieId = {\n\t\t\tgclid: \"_gcl_aw\",\n\t\t\tdclid: \"_gcl_dc\",\n\t\t}\n\n\t\tif (wpm.getCookie(clidCookieId[clidId])) {\n\t\t\tlet clidCookie = wpm.getCookie(clidCookieId[clidId])\n\t\t\tlet matches = clidCookie.match(/(GCL.[\\d]*.)(.*)/)\n\t\t\treturn matches[2]\n\t\t} else {\n\t\t\treturn \"\"\n\t\t}\n\t}\n\n\twpm.getUserAgent = function () {\n\t\treturn navigator.userAgent\n\t}\n\n\twpm.getViewPort = function () {\n\t\treturn {\n\t\t\twidth : Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0),\n\t\t\theight: Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0),\n\t\t}\n\t}\n\n\t/*\n\t* Handle Cookie Management Platforms\n\t* */\n\n\tlet getComplianzCookies = function () {\n\n\t\tlet cmplz_statistics = wpm.getCookie(\"cmplz_statistics\")\n\t\tlet cmplz_marketing = wpm.getCookie(\"cmplz_marketing\")\n\t\tlet cmplz_consent_status = wpm.getCookie(\"cmplz_consent_status\") || wpm.getCookie(\"cmplz_banner-status\")\n\n\n\t\tif (cmplz_consent_status) {\n\t\t\treturn {\n\t\t\t\tanalytics : cmplz_statistics === \"allow\",\n\t\t\t\tads : cmplz_marketing === \"allow\",\n\t\t\t\tvisitorHasChosen: true,\n\t\t\t}\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tlet getCookieLawInfoCookies = function () {\n\n\t\tlet analyticsCookie = wpm.getCookie(\"cookielawinfo-checkbox-analytics\")\n\t\tlet adsCookie = wpm.getCookie(\"cookielawinfo-checkbox-advertisement\")\n\t\tlet visitorHasChosen = wpm.getCookie(\"CookieLawInfoConsent\")\n\n\t\tif (analyticsCookie || adsCookie) {\n\n\t\t\treturn {\n\t\t\t\tanalytics : analyticsCookie === \"yes\",\n\t\t\t\tads : adsCookie === \"yes\",\n\t\t\t\tvisitorHasChosen: !!visitorHasChosen,\n\t\t\t}\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t}\n\n\n\tlet\n\t\twpmConsentValues = {}\n\twpmConsentValues.categories = {}\n\twpmConsentValues.pixels = []\n\twpmConsentValues.mode = \"category\"\n\twpmConsentValues.visitorHasChosen = false\n\n\twpm.getConsentValues = function () {\n\t\treturn wpmConsentValues\n\t}\n\n\twpm.setConsentValueCategories = function (analytics = false, ads = false) {\n\t\twpmConsentValues.categories.analytics = analytics\n\t\twpmConsentValues.categories.ads = ads\n\t}\n\n\twpm.updateConsentCookieValues = function (explicitConsent = false) {\n\n\t\t// ad_storage\n\t\t// analytics_storage\n\t\t// functionality_storage\n\t\t// personalization_storage\n\t\t// security_storage\n\n\t\t// console.log('exp cons: ' + explicitConsent)\n\n\t\tlet cookie\n\n\t\tif (cookie = wpm.getCookie(\"CookieConsent\")) {\n\t\t\t// Cookiebot\n\t\t\t// https://wordpress.org/plugins/cookiebot/\n\t\t\tcookie = decodeURI(cookie)\n\n\t\t\t// console.log(cookie.indexOf('statistics:true'))\n\t\t\t// console.log(cookie.indexOf('marketing:true'))\n\n\t\t\twpmConsentValues.categories.analytics = cookie.indexOf(\"statistics:true\") >= 0\n\t\t\twpmConsentValues.categories.ads = cookie.indexOf(\"marketing:true\") >= 0\n\t\t\twpmConsentValues.visitorHasChosen = true\n\n\t\t} else if (cookie = wpm.getCookie(\"CookieScriptConsent\")) {\n\t\t\t// Cookie Script\n\t\t\t// https://wordpress.org/plugins/cookie-script-com/\n\n\t\t\tcookie = JSON.parse(cookie)\n\n\t\t\t// console.log(cookie)\n\t\t\t// console.log(cookie.action)\n\t\t\t// console.log('cat length: ' + cookie.categories.length)\n\t\t\t// console.log(cookie.categories.indexOf('performance'))\n\n\t\t\tif (cookie.action === \"reject\") {\n\t\t\t\twpmConsentValues.categories.analytics = false\n\t\t\t\twpmConsentValues.categories.ads = false\n\t\t\t} else if (cookie.categories.length === 2) {\n\t\t\t\twpmConsentValues.categories.analytics = true\n\t\t\t\twpmConsentValues.categories.ads = true\n\t\t\t} else {\n\t\t\t\twpmConsentValues.categories.analytics = cookie.categories.indexOf(\"performance\") >= 0\n\t\t\t\twpmConsentValues.categories.ads = cookie.categories.indexOf(\"targeting\") >= 0\n\t\t\t}\n\n\t\t\twpmConsentValues.visitorHasChosen = true\n\n\t\t\t// console.log(wpmConsentValues)\n\n\t\t} else if (cookie = wpm.getCookie(\"borlabs-cookie\")) {\n\t\t\t// Borlabs Cookie\n\t\t\t// https://borlabs.io/borlabs-cookie/\n\n\t\t\tcookie = decodeURI(cookie)\n\t\t\tcookie = JSON.parse(cookie)\n\n\t\t\twpmConsentValues.categories.analytics = !!cookie?.consents?.statistics\n\t\t\twpmConsentValues.categories.ads = !!cookie?.consents?.marketing\n\t\t\twpmConsentValues.visitorHasChosen = true\n\t\t\twpmConsentValues.pixels = [...cookie?.consents?.statistics || [], ...cookie?.consents?.marketing || []]\n\t\t\twpmConsentValues.mode = \"pixel\"\n\n\t\t} else if (cookie = getComplianzCookies()) {\n\t\t\t// Complianz Cookie\n\t\t\t// https://wordpress.org/plugins/complianz-gdpr/\n\n\t\t\t// console.log(cookie)\n\n\t\t\twpmConsentValues.categories.analytics = cookie.analytics === true\n\t\t\twpmConsentValues.categories.ads = cookie.ads === true\n\t\t\twpmConsentValues.visitorHasChosen = cookie.visitorHasChosen\n\n\t\t\t// console.log(wpmConsentValues)\n\n\t\t} else if (cookie = wpm.getCookie(\"cookie_notice_accepted\")) {\n\t\t\t// Cookie Compliance (free version)\n\t\t\t// https://wordpress.org/plugins/cookie-notice/\n\n\t\t\twpmConsentValues.categories.analytics = true\n\t\t\twpmConsentValues.categories.ads = true\n\t\t\twpmConsentValues.visitorHasChosen = true\n\n\t\t} else if (cookie = wpm.getCookie(\"hu-consent\")) {\n\t\t\t// Cookie Compliance (pro version)\n\t\t\t// https://wordpress.org/plugins/cookie-notice/\n\n\t\t\tcookie = JSON.parse(cookie)\n\n\t\t\twpmConsentValues.categories.analytics = !!cookie.categories[\"3\"]\n\t\t\twpmConsentValues.categories.ads = !!cookie.categories[\"4\"]\n\t\t\twpmConsentValues.visitorHasChosen = true\n\n\t\t} else if (cookie = getCookieLawInfoCookies()) {\n\t\t\t// CookieYes, GDPR Cookie Consent (Cookie Law Info)\n\t\t\t// https://wordpress.org/plugins/cookie-law-info/\n\n\t\t\twpmConsentValues.categories.analytics = cookie.analytics === true\n\t\t\twpmConsentValues.categories.ads = cookie.ads === true\n\t\t\twpmConsentValues.visitorHasChosen = cookie.visitorHasChosen === true\n\n\t\t} else if (cookie = wpm.getCookie(\"moove_gdpr_popup\")) {\n\t\t\t// GDPR Cookie Compliance Plugin by Moove Agency\n\t\t\t// https://wordpress.org/plugins/gdpr-cookie-compliance/\n\t\t\t// TODO write documentation on how to set up the plugin in order for this to work properly\n\n\t\t\tcookie = JSON.parse(cookie)\n\t\t\t// console.log('moove cookie thirdparty: ' + cookie.thirdparty)\n\t\t\t// console.log('moove cookie advanced: ' + cookie.advanced)\n\n\t\t\twpmConsentValues.categories.analytics = cookie.thirdparty === \"1\"\n\t\t\twpmConsentValues.categories.ads = cookie.advanced === \"1\"\n\t\t\twpmConsentValues.visitorHasChosen = true\n\n\t\t\t// console.log(wpmConsentValues)\n\n\t\t} else {\n\t\t\t// consentValues.categories.analytics = true\n\t\t\t// consentValues.categories.ads = true\n\n\t\t\twpmConsentValues.categories.analytics = !explicitConsent\n\t\t\twpmConsentValues.categories.ads = !explicitConsent\n\t\t}\n\t}\n\n\twpm.updateConsentCookieValues()\n\n\twpm.setConsentDefaultValuesToExplicit = function () {\n\t\twpmConsentValues.categories = {\n\t\t\tanalytics: false,\n\t\t\tads : false,\n\t\t}\n\t}\n\n\twpm.canIFire = function (category, pixelName) {\n\n\t\tif (\"category\" === wpmConsentValues.mode) {\n\t\t\treturn !!wpmConsentValues.categories[category]\n\t\t} else if (\"pixel\" === wpmConsentValues.mode) {\n\t\t\treturn wpmConsentValues.pixels.includes(pixelName)\n\t\t} else {\n\t\t\tconsole.error(\"Couldn't find a valid consent mode in wpmConsentValues\")\n\t\t\treturn false\n\t\t}\n\t}\n\n\t/**\n\t * Runs through each script in <head> and blocks / unblocks it according to the plugin settings\n\t * and user consent.\n\t */\n\n\t// https://stackoverflow.com/q/65453565/4688612\n\twpm.scriptTagObserver = new MutationObserver((mutations) => {\n\t\tmutations.forEach(({addedNodes}) => {\n\t\t\t[...addedNodes]\n\t\t\t\t.forEach(node => {\n\n\t\t\t\t\tif ($(node).data(\"wpm-cookie-category\")) {\n\n\t\t\t\t\t\t// console.log(node)\n\n\t\t\t\t\t\t// If the pixel category has been approved > unblock\n\t\t\t\t\t\t// If the pixel belongs to more than one category, then unblock if one of the categories has been approved\n\t\t\t\t\t\t// If no category has been approved, but the Google Consent Mode is active, then only unblock the Google scripts\n\n\t\t\t\t\t\tif (wpm.shouldScriptBeActive(node)) {\n\t\t\t\t\t\t\twpm.unblockScript(node)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\twpm.blockScript(node)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t})\n\t})\n\n\twpm.scriptTagObserver.observe(document.head, {childList: true, subtree: true})\n\twindow.addEventListener(\"DOMContentLoaded\", () => wpm.scriptTagObserver.disconnect())\n\n\twpm.shouldScriptBeActive = function (node) {\n\n\t\tif (\n\t\t\twpmDataLayer.shop.cookie_consent_mgmt.explicit_consent ||\n\t\t\twpmConsentValues.visitorHasChosen\n\t\t) {\n\n\t\t\tif (wpmConsentValues.mode === \"category\" && $(node).data(\"wpm-cookie-category\").split(\",\").some(element => wpmConsentValues.categories[element])) {\n\t\t\t\treturn true\n\t\t\t} else if (wpmConsentValues.mode === \"pixel\" && wpmConsentValues.pixels.includes($(node).data(\"wpm-pixel-name\"))) {\n\t\t\t\treturn true\n\t\t\t} else if (wpmConsentValues.mode === \"pixel\" && $(node).data(\"wpm-pixel-name\") === \"google\" && [\"google-analytics\", \"google-ads\"].some(element => wpmConsentValues.pixels.includes(element))) {\n\t\t\t\treturn true\n\t\t\t} else if (wpmDataLayer?.pixels?.google?.consent_mode?.active && $(node).data(\"wpm-pixel-name\") === \"google\") {\n\t\t\t\treturn true\n\t\t\t} else {\n\t\t\t\treturn false\n\t\t\t}\n\t\t} else {\n\t\t\treturn true\n\t\t}\n\t}\n\n\n\twpm.unblockScript = function (scriptNode, removeAttach = false) {\n\n\t\tif (removeAttach) $(scriptNode).remove()\n\n\t\tlet wpmSrc = $(scriptNode).data(\"wpm-src\")\n\t\tif (wpmSrc) $(scriptNode).attr(\"src\", wpmSrc)\n\n\t\tscriptNode.type = \"text/javascript\"\n\n\t\tif (removeAttach) $(scriptNode).appendTo(\"head\")\n\n\t\tjQuery(document).trigger(\"wpmPreLoadPixels\", {})\n\t}\n\n\twpm.blockScript = function (scriptNode, removeAttach = false) {\n\n\t\tif (removeAttach) $(scriptNode).remove()\n\n\t\tif ($(scriptNode).attr(\"src\")) $(scriptNode).removeAttr(\"src\")\n\t\tscriptNode.type = \"blocked/javascript\"\n\n\t\tif (removeAttach) $(scriptNode).appendTo(\"head\")\n\t}\n\n\twpm.unblockAllScripts = function (analytics = true, ads = true) {\n\t\t// console.log('unblocking all scripts')\n\n\t\t$.each(\n\t\t\t$(\"script[type=\\\"blocked/javascript\\\"]\"), function (index, scriptNode) {\n\n\t\t\t\tif ($(scriptNode).data(\"wpm-cookie-category\").includes(\"analytics\") && analytics) {\n\t\t\t\t\twpm.unblockScript(scriptNode, true)\n\t\t\t\t} else if ($(scriptNode).data(\"wpm-cookie-category\").includes(\"ads\") && ads) {\n\t\t\t\t\twpm.unblockScript(scriptNode, true)\n\t\t\t\t}\n\t\t\t})\n\n\t\tjQuery(document).trigger(\"wpmPreLoadPixels\", {})\n\t}\n\n\twpm.unblockSelectedPixels = function () {\n\t\t$.each(\n\t\t\t$(\"script[type=\\\"blocked/javascript\\\"]\"), function (index, node) {\n\n\t\t\t\tif (wpmConsentValues.pixels.includes($(node).data(\"wpm-pixel-name\"))) {\n\t\t\t\t\twpm.unblockScript(node, true)\n\t\t\t\t} else if ($(node).data(\"wpm-pixel-name\") === \"google\" && [\"google-analytics\", \"google-ads\"].some(element => wpmConsentValues.pixels.includes(element))) {\n\t\t\t\t\twpm.unblockScript(node, true)\n\t\t\t\t}\n\t\t\t})\n\n\t\tjQuery(document).trigger(\"wpmPreLoadPixels\", {})\n\t}\n\n\n\t/**\n\t * Block or unblock scripts for each CMP immediately after cookie consent has been updated\n\t * by the visitor.\n\t */\n\n\t// Borlabs Cookie\n\t// If visitor accepts cookies in Borlabs Cookie unblock the scripts\n\twindow.addEventListener(\"borlabs-cookie-consent-saved\", function (e) {\n\n\t\twpm.updateConsentCookieValues()\n\n\t\tif (wpmConsentValues.mode === \"pixel\") {\n\n\t\t\twpm.unblockSelectedPixels()\n\t\t\twpm.updateGoogleConsentMode(wpmConsentValues.pixels.includes(\"google-analytics\"), wpmConsentValues.pixels.includes(\"google-ads\"))\n\t\t} else {\n\n\t\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\t}\n\t})\n\n\t// Cookiebot\n\t// If visitor accepts cookies in Cookiebot unblock the scripts\n\t// https://www.cookiebot.com/en/developer/\n\twindow.addEventListener(\"CookiebotOnAccept\", function (e) {\n\t\tif (Cookiebot.consent.statistics) wpmConsentValues.categories.analytics = true\n\t\tif (Cookiebot.consent.marketing) wpmConsentValues.categories.ads = true\n\n\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\n\t}, false)\n\n\t/**\n\t * Cookie Script\n\t * If visitor accepts cookies in Cookie Script unblock the scripts\n\t * https://support.cookie-script.com/article/20-custom-events\n\t */\n\twindow.addEventListener(\"CookieScriptAccept\", function (e) {\n\t\tif (e.detail.categories.includes(\"performance\")) wpmConsentValues.categories.analytics = true\n\t\tif (e.detail.categories.includes(\"targeting\")) wpmConsentValues.categories.ads = true\n\n\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t})\n\n\t/**\n\t * Cookie Script\n\t * If visitor accepts cookies in Cookie Script unblock the scripts\n\t * https://support.cookie-script.com/\n\t */\n\twindow.addEventListener(\"CookieScriptAcceptAll\", function (e) {\n\t\twpm.unblockAllScripts(true, true)\n\t\twpm.updateGoogleConsentMode(true, true)\n\t})\n\n\t// Complianz Cookie\n\t// If visitor accepts cookies in Complianz unblock the scripts\n\tdocument.addEventListener(\"cmplzStatusChange\", function (e) {\n\n\t\twpm.updateConsentCookieValues()\n\n\t\t// console.log(wpmConsentValues)\n\n\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t})\n\n\t// Cookie Compliance by hu-manity.co (free and pro)\n\t// If visitor accepts cookies in Cookie Notice by hu-manity.co unblock the scripts (free version)\n\t// https://wordpress.org/support/topic/events-on-consent-change/#post-15202792\n\tdocument.addEventListener(\"setCookieNotice\", function (e) {\n\n\t\twpm.updateConsentCookieValues()\n\n\t\t// console.log(wpmConsentValues)\n\n\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t})\n\n\t/**\n\t * Cookie Compliance by hu-manity.co (free and pro)\n\t * If visitor accepts cookies in Cookie Notice by hu-manity.co unblock the scripts (pro version)\n\t * https://wordpress.org/support/topic/events-on-consent-change/#post-15202792\n\t * Because Cookie Notice has no documented API or event that is being triggered on consent save or update\n\t * we have to solve this by using a mutation observer.\n\t *\n\t * @type {MutationObserver}\n\t */\n\n\twpm.huObserver = new MutationObserver(function (mutations) {\n\t\tmutations.forEach(({addedNodes}) => {\n\t\t\t[...addedNodes]\n\t\t\t\t.forEach(node => {\n\n\t\t\t\t\tif (node.id === \"hu\") {\n\n\t\t\t\t\t\tjQuery(\".hu-cookies-save\").on(\"click\", function (e) {\n\t\t\t\t\t\t\twpm.updateConsentCookieValues()\n\t\t\t\t\t\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\t\t\t\t\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t})\n\t})\n\n\tif (window.hu) {\n\t\twpm.huObserver.observe(document.documentElement || document.body, {childList: true, subtree: true})\n\t}\n\n\twpm.version = function () {\n\t\tconsole.log(wpmDataLayer.version)\n\t}\n\n\t// https://api.jquery.com/jquery.getscript/\n\twpm.loadScriptAndCacheIt = function (url, options) {\n\n\t\t// Allow user to set any option except for dataType, cache, and url\n\t\toptions = jQuery.extend(options || {}, {\n\t\t\tdataType: \"script\",\n\t\t\tcache : true,\n\t\t\turl : url,\n\t\t})\n\n\t\t// Use $.ajax() since it is more flexible than $.getScript\n\t\t// Return the jqXHR object so we can chain callbacks\n\t\treturn jQuery.ajax(options)\n\t}\n\n\twpm.getOrderItemPrice = function (orderItem) {\n\t\treturn (orderItem.total + orderItem.total_tax) / orderItem.quantity\n\t}\n\n\twpm.hasLoginEventFired = function () {\n\t\tlet data = wpm.getWpmSessionData()\n\t\treturn data?.loginEventFired\n\t}\n\n\twpm.setLoginEventFired = function () {\n\t\tlet data = wpm.getWpmSessionData()\n\t\tdata[\"loginEventFired\"] = true\n\t\twpm.setWpmSessionData(data)\n\t}\n\n\twpm.wpmDataLayerExists = function () {\n\t\treturn new Promise(function (resolve) {\n\t\t\t(function waitForVar() {\n\t\t\t\tif (typeof wpmDataLayer !== \"undefined\") return resolve()\n\t\t\t\tsetTimeout(waitForVar, 50)\n\t\t\t})()\n\t\t})\n\t}\n\n\twpm.pageLoaded = function () {\n\t\treturn new Promise(function (resolve) {\n\t\t\t(function waitForVar() {\n\t\t\t\tif (\"complete\" === document.readyState) return resolve()\n\t\t\t\tsetTimeout(waitForVar, 50)\n\t\t\t})()\n\t\t})\n\t}\n\n\t// wpm['load'] = {\n\t// base: true\n\t// };\n\n\twindow[\"wpmLoaded\"] = {}\n\n\t// return {\n\t// writeOrderIdToStorage : writeOrderIdToStorage,\n\t// isOrderIdStored : isOrderIdStored,\n\t// isEmail : isEmail,\n\t// removeProductFromCart : removeProductFromCart,\n\t// getViewItemProducts : getViewItemProducts,\n\t// addProductToCart : addProductToCart,\n\t// getCartItemsFromBackEnd: getCartItemsFromBackEnd,\n\t// fireCheckoutOption : fireCheckoutOption,\n\t// getCartItems : getCartItems\n\t// }\n\n}(window.wpm = window.wpm || {}, jQuery))\n\n/**\n * Run as soon as wpm namespace is loaded\n */\n\n// run when window ready\njQuery(function () {\n// jQuery(window).on('load', function () {\n\n\twpm.wpmDataLayerExists()\n\t\t.then(function () {\n\t\t\t// watch for products visible in viewport\n\t\t\twpm.startIntersectionObserverToWatch()\n\n\t\t\t// watch for lazy loaded products\n\t\t\twpm.startProductsMutationObserverToWatch()\n\t\t})\n\n\t// let products = jQuery(\".products, .product\")\n})\n\n\n/**\n * All event listeners\n * */\n\n// remove_from_cart event\n// body.on('click', '.remove_from_cart_button, .remove', function (e) {\njQuery(document).on(\"click\", \".remove_from_cart_button, .remove\", function (e) {\n\t// jQuery('.remove_from_cart_button, .remove').on('click', function (e) {\n\n\ttry {\n\t\t// console.log('remove_from_cart: ' + jQuery(this).data('product_id'));\n\n\t\tlet url = new URL(jQuery(this).attr(\"href\"))\n\t\tlet productId = wpm.getProductIdByCartItemKeyUrl(url)\n\n\t\twpm.removeProductFromCart(productId)\n\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n\n// add_to_cart event\n// body.on('click', '.add_to_cart_button:not(.product_type_variable), .ajax_add_to_cart, .single_add_to_cart_button', function (e) {\njQuery(document).on(\"click\", \".add_to_cart_button:not(.product_type_variable), .ajax_add_to_cart, .single_add_to_cart_button\", function (e) {\n\t// jQuery('.add_to_cart_button:not(.product_type_variable), .ajax_add_to_cart, .js-ajax-add-to-cart, .single_add_to_cart_button, .btn_color-2').on('click', function (e) {\n\n\ttry {\n\t\t// console.log('add_to_cart');\n\n\t\tif (wpmDataLayer.shop.page_type === \"product\") {\n\n\t\t\t// first process related and upsell products\n\t\t\tif (typeof jQuery(this).attr(\"href\") !== \"undefined\" && jQuery(this).attr(\"href\").includes(\"add-to-cart\")) {\n\t\t\t\t// console.log('add-to-cart on upsell and related products');\n\t\t\t\tlet quantity = 1\n\t\t\t\tlet productId = jQuery(this).data(\"product_id\")\n\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\twpm.addProductToCart(productId, quantity)\n\t\t\t} else {\n\n\t\t\t\tif (wpmDataLayer.shop.product_type === \"simple\") {\n\n\t\t\t\t\t// console.log('test');\n\t\t\t\t\tlet quantity = Number(jQuery(\".input-text.qty\").val())\n\n\t\t\t\t\tif (!quantity && quantity !== 0) quantity = 1\n\n\t\t\t\t\tlet productId = jQuery(this).val()\n\n\t\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\t\t// console.log('quantity: ' + quantity);\n\n\t\t\t\t\twpm.addProductToCart(productId, quantity)\n\n\t\t\t\t} else if (wpmDataLayer.shop.product_type === \"variable\") {\n\n\t\t\t\t\t// console.log('variable');\n\n\t\t\t\t\tlet quantity = Number(jQuery(\".input-text.qty\").val())\n\n\t\t\t\t\tif (!quantity && quantity !== 0) quantity = 1\n\n\t\t\t\t\tlet productId = jQuery(\"[name='variation_id']\").val()\n\n\t\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\t\t// console.log('quantity: ' + quantity);\n\n\t\t\t\t\twpm.addProductToCart(productId, quantity)\n\n\t\t\t\t} else if (wpmDataLayer.shop.product_type === \"grouped\") {\n\n\t\t\t\t\t// console.log('grouped');\n\n\t\t\t\t\tjQuery(\".woocommerce-grouped-product-list-item\").each(function () {\n\n\t\t\t\t\t\tlet quantity = Number(jQuery(this).find(\".input-text.qty\").val())\n\n\t\t\t\t\t\tif (!quantity && quantity !== 0) quantity = 1\n\n\t\t\t\t\t\tlet classes = jQuery(this).attr(\"class\")\n\t\t\t\t\t\tlet productId = wpm.getPostIdFromString(classes)\n\n\t\t\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\t\t\t// console.log('quantity: ' + quantity);\n\n\t\t\t\t\t\twpm.addProductToCart(productId, quantity)\n\t\t\t\t\t})\n\t\t\t\t} else if (wpmDataLayer.shop.product_type === \"bundle\") {\n\n\t\t\t\t\t// console.log('bundle');\n\n\t\t\t\t\tlet quantity = Number(jQuery(\".input-text.qty\").val())\n\n\t\t\t\t\tif (!quantity && quantity !== 0) quantity = 1\n\n\t\t\t\t\tlet productId = jQuery(\"input[name=add-to-cart]\").val()\n\n\t\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\t\t// console.log('quantity: ' + quantity);\n\n\t\t\t\t\twpm.addProductToCart(productId, quantity)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\n\t\t\t// console.log('non product page');\n\n\t\t\tlet quantity = 1\n\t\t\tlet productId = jQuery(this).data(\"product_id\")\n\t\t\t// console.log('productId: ' + productId);\n\t\t\twpm.addProductToCart(productId, quantity)\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// if someone clicks anywhere on a custom /?add-to-cart=123 link\n// trigger the add to cart event\n// body.one('click', function (e) {\n//\n// try {\n// if (jQuery(this)[0].URL) {\n//\n// let href = new URL(jQuery(this)[0].URL);\n// let searchParams = new URLSearchParams(href.search);\n//\n// if (searchParams.has('add-to-cart')) {\n// // console.log('non product page, /?add-to-cart=123 link');\n//\n// let productId = searchParams.get('add-to-cart');\n// wpm.addProductToCart(productId, 1);\n// }\n// }\n// } catch (e) {\n// console.error(e);\n// }\n// });\n\n\n/**\n * If someone clicks anywhere on a custom /?add-to-cart=123 link\n * trigger the add to cart event\n */\n// body.one('click', 'a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)', function (event) {\njQuery(document).one(\"click\", \"a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)\", function (event) {\n\t// jQuery('a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)').one('click', function (event) {\n\n\ttry {\n\t\tif (jQuery(event.target).closest(\"a\").attr(\"href\")) {\n\n\t\t\tlet href = jQuery(event.target).closest(\"a\").attr(\"href\")\n\n\t\t\tif (href.includes(\"add-to-cart=\")) {\n\t\t\t\tlet matches = href.match(/(add-to-cart=)(\\d+)/)\n\t\t\t\t// console.log('pid: ' + matches[2])\n\t\t\t\tif (matches) wpm.addProductToCart(matches[2], 1)\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// select_content GA UA event\n// select_item GA 4 event\n// jQuery(document).on('click', '.woocommerce-LoopProduct-link, .wc-block-grid__product, .product-small.box', function (e) {\n// body.on('click', '.woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product', function (e) {\njQuery(document).on(\"click\", \".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product\", function (e) {\n\t// jQuery('.woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product').on('click', function (e) {\n\n\ttry {\n\n\t\t// On some pages the event fires multiple times, and on product pages\n\t\t// even on page load. Using e.stopPropagation helps to prevent this,\n\t\t// but I dont know why. We don't even have to use this, since only a real\n\t\t// product click yields a valid productId. So we filter the invalid click\n\t\t// events out later down the code. I'll keep it that way because this is\n\t\t// the most compatible way across shops.\n\t\t// e.stopPropagation();\n\n\t\t// console.log('select_content and select_item');\n\n\t\tlet productId = jQuery(this).nextAll(\".wpmProductId:first\").data(\"id\")\n\t\t// console.log('select_content and select_item: ' + productId);\n\n\n\t\t// On product pages, for some reason, the click event is triggered on the main product on page load.\n\t\t// In that case no ID is found. But we can discard it, since we only want to trigger the event on\n\t\t// related products, which are found below.\n\t\tif (productId) {\n\n\t\t\t// console.log('select_content and select_item: ' + productId);\n\n\t\t\tproductId = getIdBasedOndVariationsOutputSetting(productId)\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\t\t// console.log('prodid: ' + productId);\n\n\t\t\tif (wpmDataLayer.products && wpmDataLayer.products[productId]) {\n\n\t\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId)\n\n\t\t\t\tjQuery(document).trigger(\"wpmSelectContentGaUa\", product)\n\t\t\t\tjQuery(document).trigger(\"wpmSelectItem\", product)\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// begin_checkout event\n// body.one('click', '.checkout-button, .cart-checkout-button, .button.checkout', function (e) {\njQuery(document).one(\"click\", \".checkout-button, .cart-checkout-button, .button.checkout\", function (e) {\n\t// jQuery('.checkout-button, .cart-checkout-button, .button.checkout').one('click', function (e) {\n\t// console.log('begin_checkout');\n\n\tjQuery(document).trigger(\"wpmBeginCheckout\")\n})\n\n\n// checkout_progress event\n// track checkout option event: entered valid billing email\n// body.on('input', '#billing_email', function () {\njQuery(document).on(\"input\", \"#billing_email\", function () {\n\t// jQuery('#billing_email').on('input', function () {\n\n\tif (wpm.isEmail(jQuery(this).val())) {\n\t\t// wpm.fireCheckoutOption(2);\n\t\twpm.fireCheckoutProgress(2)\n\t\twpm.emailSelected = true\n\t}\n})\n\n// track checkout option event: purchase click\n\n// body.on('click', '.wc_payment_methods', function () {\njQuery(document).on(\"click\", \".wc_payment_methods\", function () {\n\t// jQuery('.wc_payment_methods').on('click', function () {\n\n\tif (false === wpm.paymentMethodSelected) {\n\t\twpm.fireCheckoutProgress(3)\n\t}\n\n\twpm.fireCheckoutOption(3, jQuery(\"input[name='payment_method']:checked\").val())\n\twpm.paymentMethodSelected = true\n})\n\n// track checkout option event: purchase click\n// body.one('click', '#place_order', function () {\njQuery(document).one(\"click\", \"#place_order\", function () {\n\t// jQuery('#place_order').one('click', function () {\n\n\tif (false === wpm.emailSelected) {\n\t\twpm.fireCheckoutProgress(2)\n\t}\n\n\tif (false === wpm.paymentMethodSelected) {\n\t\twpm.fireCheckoutProgress(3)\n\t\twpm.fireCheckoutOption(3, jQuery(\"input[name='payment_method']:checked\").val())\n\t}\n\n\twpm.fireCheckoutProgress(4)\n})\n\n// update cart event\n// body.on('click', \"[name='update_cart']\", function (e) {\njQuery(document).on(\"click\", \"[name='update_cart']\", function (e) {\n\t// jQuery(\"[name='update_cart']\").on('click', function (e) {\n\n\ttry {\n\t\tjQuery(\".cart_item\").each(function () {\n\n\t\t\t// let productId = jQuery(this).find('[data-product_id]').data('product_id');\n\n\t\t\tlet url = new URL(jQuery(this).find(\".product-remove\").find(\"a\").attr(\"href\"))\n\t\t\tlet productId = wpm.getProductIdByCartItemKeyUrl(url)\n\n\t\t\t// console.log(productId)\n\n\t\t\tlet quantity = jQuery(this).find(\".qty\").val()\n\n\t\t\tif (quantity === 0) {\n\t\t\t\twpm.removeProductFromCart(productId)\n\t\t\t} else if (quantity < wpmDataLayer.cart[productId].quantity) {\n\t\t\t\twpm.removeProductFromCart(productId, wpmDataLayer.cart[productId].quantity - quantity)\n\t\t\t} else if (quantity > wpmDataLayer.cart[productId].quantity) {\n\t\t\t\twpm.addProductToCart(productId, quantity - wpmDataLayer.cart[productId].quantity)\n\t\t\t}\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t\twpm.getCartItemsFromBackend()\n\t}\n})\n\n\n// add_to_wishlist\n// body.on('click', '.add_to_wishlist, .wl-add-to', function () {\njQuery(document).on(\"click\", \".add_to_wishlist, .wl-add-to\", function () {\n\t// jQuery('.add_to_wishlist, .wl-add-to').on('click', function () {\n\n\ttry {\n\t\t// console.log('add_to_wishlist');\n\t\t// console.log('this:' + jQuery(this).data('product-id'));\n\n\t\tlet productId\n\n\t\tif (jQuery(this).data(\"productid\")) { // for the WooCommerce wishlist plugin\n\t\t\tproductId = jQuery(this).data(\"productid\")\n\t\t} else if (jQuery(this).data(\"product-id\")) { // for the YITH wishlist plugin\n\t\t\tproductId = jQuery(this).data(\"product-id\")\n\t\t}\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId)\n\n\t\t// console.log('add_to_wishlist');\n\t\t// console.log(product);\n\n\t\tjQuery(document).trigger(\"wpmAddToWishlist\", product)\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// body.on('updated_cart_totals', function () {\njQuery(document).on(\"updated_cart_totals\", function () {\n\tjQuery(document).trigger(\"wpmViewCart\")\n})\n\n\n// populate the wpmDataLayer with the cart items\njQuery(window).on(\"wpmLoad\", function () {\n\t// console.log('getting cart');\n\n\ttry {\n\t\t// console.log('wpmMiniCartActive: ' + JSON.parse(sessionStorage.getItem('wpmMiniCartActive')));\n\t\t// if ( wpmDataLayer.shop.page_type === 'cart' || wpmDataLayer.shop.mini_cart.track === true) {\n\n\t\tif (\n\t\t\tJSON.parse(sessionStorage.getItem(\"wpmMiniCartActive\")) && // if we detected calls to get_refreshed_fragments\n\t\t\tJSON.parse(sessionStorage.getItem(\"wpmFirstPageLoad\")) && // when a new session is initiated there are no items in the cart, so we can save that call\n\t\t\twpmDataLayer.shop.mini_cart.track === true // if shop owner generally allows the plugin to track the mini cart\n\t\t) {\n\t\t\t// console.log('getting cart');\n\t\t\twpm.getCartItems()\n\n\t\t} else {\n\t\t\tsessionStorage.setItem(\"wpmFirstPageLoad\", JSON.stringify(true))\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// get all add-to-cart= products from backend\njQuery(window).on(\"wpmLoad\", function () {\n\n\twpmDataLayer.products = wpmDataLayer.products || {}\n\t// wpmDataLayer.products = {14: 'x', 31: 'x', 16: 'x', 22: 'x', 40: 'x'};\n\n\t// scan page for add-to-cart= links\n\tlet productIds = wpm.getAddToCartLinkProductIds()\n\n\twpm.getProductsFromBackend(productIds)\n})\n\n/**\n * Save the referrer into a cookie\n */\n\njQuery(window).on(\"wpmLoad\", function () {\n\n\t// can't use session storage as we can't read it from the server\n\tif (!wpm.getCookie(\"wpmReferrer\")) {\n\n\t\tif (document.referrer) {\n\t\t\tlet referrerUrl = new URL(document.referrer)\n\t\t\tlet referrerHostname = referrerUrl.hostname\n\n\t\t\tif (referrerHostname !== window.location.host) {\n\t\t\t\twpm.setCookie(\"wpmReferrer\", referrerHostname)\n\t\t\t} else {\n\t\t\t\twpm.setCookie(\"wpmReferrer\", \"\")\n\t\t\t}\n\n\t\t} else {\n\t\t\twpm.setCookie(\"wpmReferrer\", \"\")\n\t\t}\n\t}\n})\n\n\n/**\n * Create our own load event in order to better handle script flow execution when JS \"optimizers\" shuffle the code.\n */\n\njQuery(window).on(\"wpmLoad\", function () {\n\ttry {\n\t\tif (typeof wpmDataLayer != \"undefined\" && !wpmDataLayer?.wpmLoadFired) {\n\n\t\t\tjQuery(document).trigger(\"wpmLoadAlways\")\n\n\t\t\tif (\"product\" === wpmDataLayer.shop.page_type && wpmDataLayer.shop.product_type !== \"variable\" && wpm.getMainProductIdFromProductPage()) {\n\n\t\t\t\tlet product = wpm.getProductDataForViewItemEvent(wpm.getMainProductIdFromProductPage())\n\t\t\t\tjQuery(document).trigger(\"wpmViewItem\", product)\n\n\t\t\t} else if (\"product_category\" === wpmDataLayer.shop.page_type) {\n\n\t\t\t\tjQuery(document).trigger(\"wpmCategory\")\n\n\t\t\t} else if (\"search\" === wpmDataLayer.shop.page_type) {\n\n\t\t\t\tjQuery(document).trigger(\"wpmSearch\")\n\n\t\t\t} else if (\"cart\" === wpmDataLayer.shop.page_type) {\n\n\t\t\t\tjQuery(document).trigger(\"wpmViewCart\")\n\n\t\t\t} else if (\"order_received_page\" === wpmDataLayer.shop.page_type && wpmDataLayer.order) {\n\n\t\t\t\tif (!wpm.isOrderIdStored(wpmDataLayer.order.id)) {\n\n\t\t\t\t\tjQuery(document).trigger(\"wpmOrderReceivedPage\")\n\t\t\t\t\twpm.writeOrderIdToStorage(wpmDataLayer.order.id)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tjQuery(document).trigger(\"wpmEverywhereElse\")\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.user?.id && !wpm.hasLoginEventFired()) {\n\t\t\t\tjQuery(document).trigger(\"wpmLogin\")\n\t\t\t\twpm.setLoginEventFired()\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Load mini cart fragments into a wpm session storage key,\n\t\t\t * after the document load event.\n\t\t\t */\n\t\t\tjQuery(document).ajaxSend(function (event, jqxhr, settings) {\n\t\t\t\t// console.log('settings.url: ' + settings.url);\n\n\t\t\t\tif (settings.url.includes(\"get_refreshed_fragments\") && sessionStorage) {\n\t\t\t\t\tif (!sessionStorage.getItem(\"wpmMiniCartActive\")) {\n\t\t\t\t\t\tsessionStorage.setItem(\"wpmMiniCartActive\", JSON.stringify(true))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\n\t\t\twpmDataLayer.wpmLoadFired = true\n\t\t}\n\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// jQuery(window).on(\"load\", function () {\n// \tjQuery(document).trigger(\"wpmLoad\", {})\n// })\n\njQuery(window).on(\"wpmPreLoadPixels\", function () {\n\n\tif (wpmDataLayer?.shop?.cookie_consent_mgmt?.explicit_consent) {\n\t\twpm.updateConsentCookieValues(true)\n\t}\n\tjQuery(document).trigger(\"wpmLoadPixels\", {})\n})\n\n\n/**\n * Events that only work after document ready state,\n * such as jQuery(\".single_variation_wrap\").on(\"show_variation\", function(){})\n */\n\njQuery(function () {\n\n\t/**\n\t * Fired when the user selects all the required dropdowns / attributes\n\t * Can only be hooked into after document ready\n\t * https://stackoverflow.com/a/27849208/4688612\n\t * https://stackoverflow.com/a/65065335/4688612\n\t */\n\tjQuery(\".single_variation_wrap\").on(\"show_variation\", function (event, variation) {\n\n\t\ttry {\n\t\t\tlet productId = getIdBasedOndVariationsOutputSetting(variation.variation_id)\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\t\tif (wpmDataLayer.products && wpmDataLayer.products[productId]) {\n\n\t\t\t\t// console.log('productId: ' + productId);\n\n\t\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId)\n\n\t\t\t\tjQuery(document).trigger(\"wpmViewItem\", product)\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t})\n\n\n})\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/**\n * Load all free scripts first\n */\n\nrequire(\"./wpm\")\n\n/**\n * Load all free scripts\n */\n\nrequire(\"./google\")\nrequire(\"./google-ga-ua\")\nrequire(\"./google-ga-4\")\nrequire(\"./google-ads\")\nrequire(\"./facebook\")\nrequire(\"./hotjar\")\nrequire(\"./google-optimize\")\n\n/**\n * Execute the wpm loader. It makes sure that the script flow gets exectuded correctly, no matter how JS \"optimizers\" shuffle the code.\n */\n\nrequire(\"./wpm-loader\")\n\n// console.log('WooCommerce Pixel Manager free version')\n\n\n"],"names":["wpm","$","undefined","fBUserData","loadFacebookPixel","wpmDataLayer","pixels","facebook","pixel_id","loaded","f","window","b","document","e","fbq","n","callMethod","apply","arguments","queue","push","_fbq","version","t","createElement","async","src","s","getElementsByTagName","parentNode","insertBefore","console","error","getRandomEventId","Math","random","toString","substring","getFbUserData","getFbUserDataFromBrowser","setFbUserData","fbp","getCookie","fbc","client_user_agent","navigator","userAgent","fbViewContent","product","eventId","content_type","content_name","name","content_ids","dyn_r_ids","dynamic_remarketing","id_type","currency","shop","value","price","eventID","jQuery","trigger","event_name","event_id","user_data","product_data","product_id","event_source_url","location","href","facebookContentIds","prodIds","key","item","Object","entries","order","items","general","variationsOutput","variation_id","String","products","id","on","canIFire","event","parseFloat","quantity","value_filtered","conversionIdentifiers","getGoogleAdsConversionIdentifiersWithLabel","google","ads","conversionIds","getGoogleAdsConversionIdentifiers","getGoogleAdsRegularOrderItems","orderItems","orderItem","getGoogleAdsDynamicRemarketingOrderItems","google_business_vertical","isEmptyObject","status","googleConfigConditionsMet","isVariable","send_events_with_parent_ids","gtagLoaded","then","gtag","send_to","data_basic","data_with_cart","transaction_id","number","new_customer","aw_merchant_id","discount","aw_feed_country","aw_feed_language","getGA4OrderItems","item_name","item_category","category","join","item_id","analytics","item_variant","variant_name","item_brand","brand","ga4","measurement_id","mp_active","affiliation","value_regular","tax","shipping","coupon","getGAUAOrderItems","list_position","variant","universal","property_id","load_google_optimize_pixel","optimize","container_id","loadScriptAndCacheIt","type","consent_mode","active","getConsentValues","mode","categories","includes","getVisitorConsentStatusAndUpdateGoogleConsentSettings","google_consent_settings","analytics_storage","ad_storage","updateGoogleConsentMode","cookie_consent_mgmt","explicit_consent","fireGtagGoogleAds","state","enhanced_conversions","phone_conversion_label","phone_conversion_number","keys","page_type","enhanced_conversion_data","fireGtagGoogleAnalyticsUA","parameters","fireGtagGoogleAnalyticsGA4","isGoogleActive","getGoogleGtagId","loadGoogle","done","script","textStatus","dataLayer","wait_for_update","region","ads_data_redaction","url_passthrough","linker","settings","Date","canGoogleLoad","Promise","resolve","reject","startTime","wait","setTimeout","load_hotjar_pixel","h","o","a","r","hotjar","site_id","hj","q","_hjSettings","hjid","hjsv","appendChild","wpmDataLayerExists","pageLoaded","wpmDeduper","wpmRestSettings","checkCookie","emailSelected","paymentMethodSelected","useRestEndpoint","isSessionStorageAvailable","isRestEndpointAvailable","isBelowRestErrorThreshold","sessionStorage","getItem","JSON","parse","testEndpoint","url","protocol","host","cookieName","ajax","timeout","statusCode","response","setItem","stringify","isWpmRestEndpointAvailable","writeOrderIdToStorage","orderId","Storage","localStorage","ids","expiresDate","setDate","getDate","cookie","toUTCString","storeOrderIdOnServer","orderDeduplication","isOrderIdStored","log","isEmail","email","test","removeProductFromCart","productId","quantityToRemove","Error","getIdBasedOndVariationsOutputSetting","cart","getProductDetailsFormattedForEvent","isVariation","parentId","addProductToCart","getCartItemsFromBackend","getCartItems","saveCartObjectToDataLayer","data","action","dataType","ajax_url","success","cartItems","getProductsFromBackend","productIds","filter","hasOwnProperty","length","assign","cartObject","fireCheckoutOption","step","checkout_option","fireCheckoutProgress","getPostIdFromString","string","match","triggerViewItemList","getProductDataForViewItemEvent","getMainProductIdFromProductPage","indexOf","product_type","viewItemListTriggerTestMode","target","css","append","find","viewItemListTrigger","opacity","backgroundColor","getSearchTermFromUrl","URLSearchParams","search","get","io","ioTimeouts","observerCallback","observer","forEach","entry","elementId","next","isIntersecting","testMode","repeat","unobserve","clearTimeout","remove","allIoElementsToWatch","ioid","startIntersectionObserverToWatch","has","IntersectionObserver","threshold","map","i","elem","parent","hasClass","prev","this","closest","each","observe","startProductsMutationObserverToWatch","productsNode","parents","first","productsMutationObserver","attributes","childList","characterData","MutationObserver","mutations","mutation","newNodes","addedNodes","hasWpmProductIdElement","siblings","setCookie","cookieValue","expiryDays","d","setTime","getTime","expires","ca","decodeURIComponent","split","c","charAt","getWpmSessionData","setWpmSessionData","order_id","nonce","getProductIdByCartItemKeyUrl","cartItemKey","cartItemKeys","getAddToCartLinkProductIds","attr","matches","list_name","position","parentId_dyn_r_ids","setReferrerToCookie","referrer","getReferrerFromCookie","getClidFromBrowser","clidCookieId","clidId","gclid","dclid","getUserAgent","getViewPort","width","max","documentElement","clientWidth","innerWidth","height","clientHeight","innerHeight","getComplianzCookies","cmplz_statistics","cmplz_marketing","visitorHasChosen","getCookieLawInfoCookies","analyticsCookie","adsCookie","wpmConsentValues","setConsentValueCategories","updateConsentCookieValues","explicitConsent","decodeURI","consents","statistics","marketing","thirdparty","advanced","setConsentDefaultValuesToExplicit","pixelName","scriptTagObserver","node","shouldScriptBeActive","unblockScript","blockScript","head","subtree","addEventListener","disconnect","some","element","scriptNode","removeAttach","wpmSrc","appendTo","removeAttr","unblockAllScripts","index","unblockSelectedPixels","Cookiebot","consent","detail","huObserver","hu","body","options","extend","cache","getOrderItemPrice","total","total_tax","hasLoginEventFired","loginEventFired","setLoginEventFired","waitForVar","readyState","URL","Number","val","classes","one","nextAll","mini_cart","track","referrerHostname","hostname","wpmLoadFired","user","ajaxSend","jqxhr","variation","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","require"],"sourceRoot":""}
js/public/wpm-public__premium_only.p1.min.js ADDED
@@ -0,0 +1,2 @@
 
 
1
+ (()=>{var e={785:()=>{!function(e,t,a){let o;e.loadFacebookPixel=function(){try{var e,t,a;null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.facebook)&&void 0!==a&&a.pixel_id&&(wpmDataLayer.pixels.facebook.loaded=!0,o=window,r=document,i="script",o.fbq||(n=o.fbq=function(){n.callMethod?n.callMethod.apply(n,arguments):n.queue.push(arguments)},o._fbq||(o._fbq=n),n.push=n,n.loaded=!0,n.version="2.0",n.queue=[],(l=r.createElement(i)).async=!0,l.src="https://connect.facebook.net/en_US/fbevents.js",(d=r.getElementsByTagName(i)[0]).parentNode.insertBefore(l,d)),fbq("init",wpmDataLayer.pixels.facebook.pixel_id),fbq("track","PageView"))}catch(i){console.error(i)}var o,r,i,n,l,d},e.getRandomEventId=function(){return(Math.random()+1).toString(36).substring(2)},e.getFbUserData=function(){return o||e.getFbUserDataFromBrowser()},e.setFbUserData=function(){o=e.getFbUserDataFromBrowser()},e.getFbUserDataFromBrowser=function(){return{fbp:e.getCookie("_fbp"),fbc:e.getCookie("_fbc"),client_user_agent:navigator.userAgent}},e.fbViewContent=function(t){try{var a,o,r;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.facebook)||void 0===r||!r.loaded)return;let i=e.getRandomEventId();fbq("track","ViewContent",{content_type:"product",content_name:t.name,content_ids:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],currency:wpmDataLayer.shop.currency,value:t.price},{eventID:i}),t.currency=wpmDataLayer.shop.currency,jQuery(document).trigger("wpmFbCapiEvent",{event_name:"ViewContent",event_id:i,user_data:e.getFbUserData(),product_data:t,product_id:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],event_source_url:window.location.href})}catch(e){console.error(e)}},e.facebookContentIds=function(){let e=[];for(const[o,r]of Object.entries(wpmDataLayer.order.items)){var t,a;null!==(t=wpmDataLayer)&&void 0!==t&&null!==(a=t.general)&&void 0!==a&&a.variationsOutput&&0!==r.variation_id?e.push(String(wpmDataLayer.products[r.variation_id].dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type])):e.push(String(wpmDataLayer.products[r.id].dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type]))}return e}}(window.wpm=window.wpm||{},jQuery),jQuery(document).on("wpmLoadPixels",(function(){var e,t,a;!wpm.canIFire("ads","facebook-ads")||null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.facebook)&&void 0!==a&&a.loaded||wpm.loadFacebookPixel()})),jQuery(document).on("wpmAddToCart",(function(e,t){try{var a,o,r;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.facebook)||void 0===r||!r.loaded)return;let e=wpm.getRandomEventId();fbq("track","AddToCart",{content_type:"product",content_name:t.name,content_ids:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],value:parseFloat(t.quantity*t.price),currency:t.currency},{eventID:e}),t.currency=wpmDataLayer.shop.currency,jQuery(document).trigger("wpmFbCapiEvent",{event_name:"AddToCart",event_id:e,user_data:wpm.getFbUserData(),product_data:t,product_id:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],event_source_url:window.location.href})}catch(e){console.error(e)}})),jQuery(document).on("wpmBeginCheckout",(function(e){try{var t,a,o;if(null===(t=wpmDataLayer)||void 0===t||null===(a=t.pixels)||void 0===a||null===(o=a.facebook)||void 0===o||!o.loaded)return;let e=wpm.getRandomEventId();fbq("track","InitiateCheckout",{},{eventID:e}),jQuery(document).trigger("wpmFbCapiEvent",{event_name:"InitiateCheckout",event_id:e,user_data:wpm.getFbUserData(),event_source_url:window.location.href})}catch(e){console.error(e)}})),jQuery(document).on("wpmAddToWishlist",(function(e,t){try{var a,o,r;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.facebook)||void 0===r||!r.loaded)return;let e=wpm.getRandomEventId();fbq("track","AddToWishlist",{content_type:"product",content_name:t.name,content_ids:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],value:parseFloat(t.quantity*t.price),currency:t.currency},{eventID:e}),t.currency=wpmDataLayer.shop.currency,jQuery(document).trigger("wpmFbCapiEvent",{event_name:"AddToWishlist",event_id:e,user_data:wpm.getFbUserData(),product_data:t,product_id:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],event_source_url:window.location.href})}catch(e){console.error(e)}})),jQuery(document).on("wpmViewItem",(function(e,t){try{var a,o,r;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.facebook)||void 0===r||!r.loaded)return;wpm.fbViewContent(t)}catch(e){console.error(e)}})),jQuery(document).on("wpmSearch",(function(){try{var e,t,a;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.facebook)||void 0===a||!a.loaded)return;let o=wpm.getRandomEventId();fbq("track","Search",{},{eventID:o}),jQuery(document).trigger("wpmFbCapiEvent",{event_name:"Search",event_id:o,user_data:wpm.getFbUserData(),event_source_url:window.location.href})}catch(e){console.error(e)}})),jQuery(document).on("wpmLoadAlways",(function(){try{var e,t,a;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.facebook)||void 0===a||!a.loaded)return;wpm.setFbUserData()}catch(e){console.error(e)}})),jQuery(document).on("wpmOrderReceivedPage",(function(){try{var e,t,a;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.facebook)||void 0===a||!a.loaded)return;fbq("track","Purchase",{content_type:"product",value:wpmDataLayer.order.value_filtered,currency:wpmDataLayer.order.currency,content_ids:wpm.facebookContentIds()},{eventID:wpmDataLayer.order.id})}catch(e){console.error(e)}}))},317:()=>{!function(e,t,a){e.setFacebookIdentifiersOnServer=function(){try{let t={action:"wpm_facebook_set_session_identifiers",nonce:e.nonce,fbp:e.getCookie("_fbp"),fbc:e.getCookie("_fbc")};if(t.fbp&&window.sessionStorage&&window.sessionStorage.getItem("wpm_fb_session_id_"+t.fbp+"_set"))return;jQuery.ajax({type:"post",dataType:"json",url:e.ajax_url,data:t,success:function(e){window.sessionStorage&&!0===e.success&&window.sessionStorage.setItem("wpm_fb_session_id_"+t.fbp+"_set",JSON.stringify(!0))},error:function(e){}})}catch(e){console.error(e)}}}(window.wpm=window.wpm||{},jQuery),jQuery(document).on("wpmAddToWishlist",(function(e,t){try{var a,o,r;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.facebook)||void 0===r||!r.loaded)return;fbq("track","AddToWishlist",{content_name:t.name,content_category:t.category,content_ids:t.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],currency:t.currency,value:t.price})}catch(e){console.error(e)}})),jQuery(document).on("wpmFbCapiEvent",(function(e,t){try{if(!wpmDataLayer.pixels.facebook.capi)return;let e={action:"wpm_facebook_capi_event",data:t,nonce:wpm.nonce};jQuery.ajax({type:"post",dataType:"json",url:wpm.ajax_url,data:e,success:function(e){},error:function(e){}})}catch(e){console.error(e)}})),jQuery(window).on("wpmLoadAlways",(function(){try{var e,t,a;null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.facebook)&&void 0!==a&&a.pixel_id&&wpmDataLayer.pixels.facebook.capi&&["cart","checkout"].indexOf(wpmDataLayer.shop.page_type)>=0&&wpm.setFacebookIdentifiersOnServer()}catch(e){console.error(e)}}))},234:()=>{!function(e,t,a){let o=[];e.getGoogleAdsConversionIdentifiersWithLabel=function(){for(const[e,t]of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds))o.push(e+"/"+t);return o},e.getGoogleAdsConversionIdentifiers=function(){let e=[];for(const[t,a]of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds))e.push(t);return e},e.getGoogleAdsRegularOrderItems=function(){let e=[];for(const[o,r]of Object.entries(wpmDataLayer.order.items)){var t,a;let o;o={quantity:r.quantity,price:r.price},null!==(t=wpmDataLayer)&&void 0!==t&&null!==(a=t.general)&&void 0!==a&&a.variationsOutput&&0!==r.variation_id?(o.id=String(wpmDataLayer.products[r.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type]),e.push(o)):(o.id=String(wpmDataLayer.products[r.id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type]),e.push(o))}return e},e.getGoogleAdsDynamicRemarketingOrderItems=function(){let e=[];for(const[o,r]of Object.entries(wpmDataLayer.order.items)){var t,a;let o;o={quantity:r.quantity,price:r.price,google_business_vertical:wpmDataLayer.pixels.google.ads.google_business_vertical},null!==(t=wpmDataLayer)&&void 0!==t&&null!==(a=t.general)&&void 0!==a&&a.variationsOutput&&0!==r.variation_id?(o.id=String(wpmDataLayer.products[r.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type]),e.push(o)):(o.id=String(wpmDataLayer.products[r.id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type]),e.push(o))}return e}}(window.wpm=window.wpm||{},jQuery),jQuery(document).on("wpmViewItemList",(function(e,t){try{var a,o,r,i,n,l,d,s,c,u,p;if(jQuery.isEmptyObject(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r||null===(i=r.ads)||void 0===i?void 0:i.conversionIds))return;if(null===(n=wpmDataLayer)||void 0===n||null===(l=n.pixels)||void 0===l||null===(d=l.google)||void 0===d||null===(s=d.ads)||void 0===s||null===(c=s.dynamic_remarketing)||void 0===c||!c.status)return;if(!wpm.googleConfigConditionsMet("ads"))return;if(null!==(u=wpmDataLayer)&&void 0!==u&&null!==(p=u.general)&&void 0!==p&&p.variationsOutput&&t.isVariable&&!1===wpmDataLayer.pixels.google.ads.dynamic_remarketing.send_events_with_parent_ids)return;if(!t)return;wpm.gtagLoaded().then((function(){gtag("event","view_item_list",{send_to:wpm.getGoogleAdsConversionIdentifiers(),items:[{id:t.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],google_business_vertical:wpmDataLayer.pixels.google.ads.google_business_vertical}]})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmAddToCart",(function(e,t){try{var a,o,r,i,n,l,d,s,c;if(jQuery.isEmptyObject(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r||null===(i=r.ads)||void 0===i?void 0:i.conversionIds))return;if(null===(n=wpmDataLayer)||void 0===n||null===(l=n.pixels)||void 0===l||null===(d=l.google)||void 0===d||null===(s=d.ads)||void 0===s||null===(c=s.dynamic_remarketing)||void 0===c||!c.status)return;if(!wpm.googleConfigConditionsMet("ads"))return;wpm.gtagLoaded().then((function(){gtag("event","add_to_cart",{send_to:wpm.getGoogleAdsConversionIdentifiers(),value:t.quantity*t.price,items:[{id:t.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],quantity:t.quantity,price:t.price,google_business_vertical:wpmDataLayer.pixels.google.ads.google_business_vertical}]})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmViewItem",(function(e,t){try{var a,o,r,i,n,l,d,s,c;if(jQuery.isEmptyObject(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r||null===(i=r.ads)||void 0===i?void 0:i.conversionIds))return;if(null===(n=wpmDataLayer)||void 0===n||null===(l=n.pixels)||void 0===l||null===(d=l.google)||void 0===d||null===(s=d.ads)||void 0===s||null===(c=s.dynamic_remarketing)||void 0===c||!c.status)return;if(!wpm.googleConfigConditionsMet("ads"))return;wpm.gtagLoaded().then((function(){gtag("event","view_item",{send_to:wpm.getGoogleAdsConversionIdentifiers(),value:(t.quantity?t.quantity:1)*t.price,items:[{id:t.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],quantity:t.quantity?t.quantity:1,price:t.price,google_business_vertical:wpmDataLayer.pixels.google.ads.google_business_vertical}]})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmSearch",(function(){try{var e,t,a,o,r,i,n,l,d;if(jQuery.isEmptyObject(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.google)||void 0===a||null===(o=a.ads)||void 0===o?void 0:o.conversionIds))return;if(null===(r=wpmDataLayer)||void 0===r||null===(i=r.pixels)||void 0===i||null===(n=i.google)||void 0===n||null===(l=n.ads)||void 0===l||null===(d=l.dynamic_remarketing)||void 0===d||!d.status)return;if(!wpm.googleConfigConditionsMet("ads"))return;let u=[];for(const[e,t]of Object.entries(wpmDataLayer.products)){var s,c;if(null!==(s=wpmDataLayer)&&void 0!==s&&null!==(c=s.general)&&void 0!==c&&c.variationsOutput&&t.isVariable&&!1===wpmDataLayer.pixels.google.ads.dynamic_remarketing.send_events_with_parent_ids)return;u.push({id:t.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],google_business_vertical:wpmDataLayer.pixels.google.ads.google_business_vertical})}wpm.gtagLoaded().then((function(){gtag("event","view_search_results",{send_to:wpm.getGoogleAdsConversionIdentifiers(),items:u})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmOrderReceivedPage",(function(){try{var e,t,a,o,r,i,n,l,d;if(jQuery.isEmptyObject(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.google)||void 0===a||null===(o=a.ads)||void 0===o?void 0:o.conversionIds))return;if(null===(r=wpmDataLayer)||void 0===r||null===(i=r.pixels)||void 0===i||null===(n=i.google)||void 0===n||null===(l=n.ads)||void 0===l||null===(d=l.dynamic_remarketing)||void 0===d||!d.status)return;if(!wpm.googleConfigConditionsMet("ads"))return;wpm.gtagLoaded().then((function(){gtag("event","purchase",{send_to:wpm.getGoogleAdsConversionIdentifiers(),value:wpmDataLayer.order.value_filtered,items:wpm.getGoogleAdsDynamicRemarketingOrderItems()})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmLogin",(function(){try{var e,t,a,o,r,i,n,l,d;if(jQuery.isEmptyObject(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.google)||void 0===a||null===(o=a.ads)||void 0===o?void 0:o.conversionIds))return;if(null===(r=wpmDataLayer)||void 0===r||null===(i=r.pixels)||void 0===i||null===(n=i.google)||void 0===n||null===(l=n.ads)||void 0===l||null===(d=l.dynamic_remarketing)||void 0===d||!d.status)return;if(!wpm.googleConfigConditionsMet("ads"))return;wpm.gtagLoaded().then((function(){gtag("event","login",{send_to:wpm.getGoogleAdsConversionIdentifiers()})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmOrderReceivedPage",(function(){try{var e,t,a,o,r,i;if(jQuery.isEmptyObject(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.google)||void 0===a||null===(o=a.ads)||void 0===o?void 0:o.conversionIds))return;if(!wpm.googleConfigConditionsMet("ads"))return;let n={},l={};n={send_to:wpm.getGoogleAdsConversionIdentifiersWithLabel(),transaction_id:wpmDataLayer.order.number,value:wpmDataLayer.order.value_filtered,currency:wpmDataLayer.order.currency,new_customer:wpmDataLayer.order.new_customer},null!==(r=wpmDataLayer)&&void 0!==r&&null!==(i=r.order)&&void 0!==i&&i.aw_merchant_id&&(l={discount:wpmDataLayer.order.discount,aw_merchant_id:wpmDataLayer.order.aw_merchant_id,aw_feed_country:wpmDataLayer.order.aw_feed_country,aw_feed_language:wpmDataLayer.order.aw_feed_language,items:wpm.getGoogleAdsRegularOrderItems()}),wpm.gtagLoaded().then((function(){gtag("event","conversion",{...n,...l})}))}catch(e){console.error(e)}}))},403:()=>{window.wpm=window.wpm||{},jQuery},172:()=>{!function(e,t,a){e.getCartItemsGa4=function(){let t=[];for(const[a,o]of Object.entries(wpmDataLayer.cart)){let a={item_id:o.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],item_name:o.name,quantity:o.quantity,item_brand:o.brand,item_variant:o.variant,price:o.price,currency:wpmDataLayer.shop.currency};a=e.getFormattedGA4Categories(a,o.category),t.push(a)}return t}}(window.wpm=window.wpm||{},jQuery),jQuery(document).on("wpmViewItemList",(function(e,t){try{var a,o,r,i,n,l,d,s,c;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r||null===(i=r.analytics)||void 0===i||!i.eec)return;if(null===(n=wpmDataLayer)||void 0===n||null===(l=n.pixels)||void 0===l||null===(d=l.google)||void 0===d||null===(s=d.analytics)||void 0===s||null===(c=s.ga4)||void 0===c||!c.measurement_id)return;if(!wpm.googleConfigConditionsMet("analytics"))return;let e={item_id:t.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],item_name:t.name,index:t.list_position,item_list_name:wpmDataLayer.shop.list_name,item_list_id:wpmDataLayer.shop.list_id,item_brand:t.brand,item_variant:t.variant,price:t.price,currency:wpmDataLayer.shop.currency,quantity:t.quantity};e=wpm.getFormattedGA4Categories(e,t.category),wpm.gtagLoaded().then((function(){gtag("event","view_item_list",{send_to:wpmDataLayer.pixels.google.analytics.ga4.measurement_id,items:[e],item_list_name:wpmDataLayer.shop.list_name,item_list_id:wpmDataLayer.shop.list_id})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmSelectItem",(function(e,t){try{var a,o,r,i,n,l,d,s,c;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r||null===(i=r.analytics)||void 0===i||!i.eec)return;if(null===(n=wpmDataLayer)||void 0===n||null===(l=n.pixels)||void 0===l||null===(d=l.google)||void 0===d||null===(s=d.analytics)||void 0===s||null===(c=s.ga4)||void 0===c||!c.measurement_id)return;if(!wpm.googleConfigConditionsMet("analytics"))return;let e={item_id:t.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],item_name:t.name,index:t.list_position,item_list_name:wpmDataLayer.shop.list_name,item_list_id:wpmDataLayer.shop.list_id,item_brand:t.brand,item_variant:t.variant,price:t.price,currency:wpmDataLayer.shop.currency,quantity:t.quantity};e=wpm.getFormattedGA4Categories(e,t.category),wpm.gtagLoaded().then((function(){gtag("event","select_item",{send_to:wpmDataLayer.pixels.google.analytics.ga4.measurement_id,items:[e]})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmAddToCart",(function(e,t){try{var a,o,r,i,n,l,d,s,c;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r||null===(i=r.analytics)||void 0===i||!i.eec)return;if(null===(n=wpmDataLayer)||void 0===n||null===(l=n.pixels)||void 0===l||null===(d=l.google)||void 0===d||null===(s=d.analytics)||void 0===s||null===(c=s.ga4)||void 0===c||!c.measurement_id)return;if(!wpm.googleConfigConditionsMet("analytics"))return;let e={item_name:t.name,item_id:t.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],item_list_name:wpmDataLayer.shop.list_name,item_list_id:wpmDataLayer.shop.list_id,item_brand:t.brand,item_variant:t.variant,price:t.price,currency:wpmDataLayer.shop.currency,quantity:t.quantity};e=wpm.getFormattedGA4Categories(e,t.category),wpm.gtagLoaded().then((function(){gtag("event","add_to_cart",{send_to:wpmDataLayer.pixels.google.analytics.ga4.measurement_id,currency:wpmDataLayer.shop.currency,items:[e]})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmViewItem",(function(e,t){try{var a,o,r,i,n,l,d,s,c;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r||null===(i=r.analytics)||void 0===i||!i.eec)return;if(null===(n=wpmDataLayer)||void 0===n||null===(l=n.pixels)||void 0===l||null===(d=l.google)||void 0===d||null===(s=d.analytics)||void 0===s||null===(c=s.ga4)||void 0===c||!c.measurement_id)return;if(!wpm.googleConfigConditionsMet("analytics"))return;let e={item_id:t.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],item_name:t.name,item_brand:t.brand,item_variant:t.variant,price:t.price,currency:wpmDataLayer.shop.currency,quantity:1,item_list_name:wpmDataLayer.shop.list_name,item_list_id:wpmDataLayer.shop.list_id};e=wpm.getFormattedGA4Categories(e,t.category),wpm.gtagLoaded().then((function(){gtag("event","view_item",{send_to:wpmDataLayer.pixels.google.analytics.ga4.measurement_id,currency:wpmDataLayer.shop.currency,items:[e]})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmAddToWishlist",(function(e,t){try{var a,o,r,i,n,l,d,s,c;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r||null===(i=r.analytics)||void 0===i||!i.eec)return;if(null===(n=wpmDataLayer)||void 0===n||null===(l=n.pixels)||void 0===l||null===(d=l.google)||void 0===d||null===(s=d.analytics)||void 0===s||null===(c=s.ga4)||void 0===c||!c.measurement_id)return;if(!wpm.googleConfigConditionsMet("analytics"))return;let e={item_id:t.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],item_name:t.name,quantity:1,item_brand:t.brand,item_variant:t.variant,price:t.price,currency:wpmDataLayer.shop.currency};e=wpm.getFormattedGA4Categories(e,t.category),wpm.gtagLoaded().then((function(){gtag("event","add_to_wishlist",{send_to:wpmDataLayer.pixels.google.analytics.ga4.measurement_id,currency:wpmDataLayer.shop.currency,items:[e]})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmRemoveFromCart",(function(e,t){try{var a,o,r,i,n,l,d,s,c;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r||null===(i=r.analytics)||void 0===i||!i.eec)return;if(null===(n=wpmDataLayer)||void 0===n||null===(l=n.pixels)||void 0===l||null===(d=l.google)||void 0===d||null===(s=d.analytics)||void 0===s||null===(c=s.ga4)||void 0===c||!c.measurement_id)return;if(!wpm.googleConfigConditionsMet("analytics"))return;let e={item_id:t.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],item_name:t.name,item_brand:t.brand,item_variant:t.variant,price:t.price,currency:wpmDataLayer.shop.currency,quantity:t.quantity};e=wpm.getFormattedGA4Categories(e,t.category),wpm.gtagLoaded().then((function(){gtag("event","remove_from_cart",{send_to:wpmDataLayer.pixels.google.analytics.ga4.measurement_id,currency:wpmDataLayer.shop.currency,items:[e]})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmBeginCheckout",(function(e){try{var t,a,o,r,i,n,l,d,s;if(null===(t=wpmDataLayer)||void 0===t||null===(a=t.pixels)||void 0===a||null===(o=a.google)||void 0===o||null===(r=o.analytics)||void 0===r||!r.eec)return;if(null===(i=wpmDataLayer)||void 0===i||null===(n=i.pixels)||void 0===n||null===(l=n.google)||void 0===l||null===(d=l.analytics)||void 0===d||null===(s=d.ga4)||void 0===s||!s.measurement_id)return;if(!wpm.googleConfigConditionsMet("analytics"))return;wpm.gtagLoaded().then((function(){gtag("event","begin_checkout",{send_to:wpmDataLayer.pixels.google.analytics.ga4.measurement_id,currency:wpmDataLayer.shop.currency,items:wpm.getCartItemsGa4()})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmViewCart",(function(e){try{var t,a,o,r,i,n,l,d,s;if(null===(t=wpmDataLayer)||void 0===t||null===(a=t.pixels)||void 0===a||null===(o=a.google)||void 0===o||null===(r=o.analytics)||void 0===r||!r.eec)return;if(null===(i=wpmDataLayer)||void 0===i||null===(n=i.pixels)||void 0===n||null===(l=n.google)||void 0===l||null===(d=l.analytics)||void 0===d||null===(s=d.ga4)||void 0===s||!s.measurement_id)return;if(!wpm.googleConfigConditionsMet("analytics"))return;if(jQuery.isEmptyObject(wpmDataLayer.cart))return;let e=[],c=null;for(const[t,a]of Object.entries(wpmDataLayer.cart)){let t={item_id:a.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],item_name:a.name,quantity:a.quantity,item_brand:a.brand,item_list_name:wpmDataLayer.shop.list_name,item_list_id:wpmDataLayer.shop.list_id,item_variant:a.variant,price:a.price,currency:wpmDataLayer.shop.currency};t=wpm.getFormattedGA4Categories(t,a.category),e.push(t),c+=a.quantity*a.price}wpm.gtagLoaded().then((function(){gtag("event","view_cart",{send_to:wpmDataLayer.pixels.google.analytics.ga4.measurement_id,currency:wpmDataLayer.shop.currency,value:c.toFixed(2),items:e})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmSearch",(function(){try{var e,t,a,o,r,i,n,l,d;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.google)||void 0===a||null===(o=a.analytics)||void 0===o||!o.eec)return;if(null===(r=wpmDataLayer)||void 0===r||null===(i=r.pixels)||void 0===i||null===(n=i.google)||void 0===n||null===(l=n.analytics)||void 0===l||null===(d=l.ga4)||void 0===d||!d.measurement_id)return;if(!wpm.googleConfigConditionsMet("analytics"))return;let s=[];for(const[e,t]of Object.entries(wpmDataLayer.products)){let e={item_id:t.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],item_name:t.name,quantity:1,index:t.position,item_brand:t.brand,item_list_name:wpmDataLayer.shop.list_name,item_list_id:wpmDataLayer.shop.list_id,item_variant:t.variant,price:t.price,currency:wpmDataLayer.shop.currency};e=wpm.getFormattedGA4Categories(e,t.category),s.push(e)}wpm.gtagLoaded().then((function(){gtag("event","view_search_results",{send_to:wpmDataLayer.pixels.google.analytics.ga4.measurement_id,search_term:wpm.getSearchTermFromUrl(),items:s})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmLogin",(function(){try{var e,t,a,o,r,i,n,l,d;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.google)||void 0===a||null===(o=a.analytics)||void 0===o||!o.eec)return;if(null===(r=wpmDataLayer)||void 0===r||null===(i=r.pixels)||void 0===i||null===(n=i.google)||void 0===n||null===(l=n.analytics)||void 0===l||null===(d=l.ga4)||void 0===d||!d.measurement_id)return;if(!wpm.googleConfigConditionsMet("analytics"))return;wpm.gtagLoaded().then((function(){gtag("event","login",{send_to:wpmDataLayer.pixels.google.analytics.ga4.measurement_id})}))}catch(e){console.error(e)}}))},464:()=>{!function(e,t,a){e.getGA4OrderItems=function(){let e=[];for(const[o,r]of Object.entries(wpmDataLayer.order.items)){var t,a;let o;o={quantity:r.quantity,price:r.price,item_name:r.name,currency:wpmDataLayer.order.currency,item_category:wpmDataLayer.products[r.id].category.join("/")},null!==(t=wpmDataLayer)&&void 0!==t&&null!==(a=t.general)&&void 0!==a&&a.variationsOutput&&0!==r.variation_id?(o.item_id=String(wpmDataLayer.products[r.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type]),o.item_variant=wpmDataLayer.products[r.variation_id].variant_name,o.item_brand=wpmDataLayer.products[r.variation_id].brand,e.push(o)):(o.item_id=String(wpmDataLayer.products[r.id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type]),o.item_brand=wpmDataLayer.products[r.id].brand,e.push(o))}return e}}(window.wpm=window.wpm||{},jQuery),jQuery(document).on("wpmOrderReceivedPage",(function(){try{var e,t,a,o,r,i,n,l,d,s;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.google)||void 0===a||null===(o=a.analytics)||void 0===o||null===(r=o.ga4)||void 0===r||!r.measurement_id)return;if(null!==(i=wpmDataLayer)&&void 0!==i&&null!==(n=i.pixels)&&void 0!==n&&null!==(l=n.google)&&void 0!==l&&null!==(d=l.analytics)&&void 0!==d&&null!==(s=d.ga4)&&void 0!==s&&s.mp_active)return;if(!wpm.googleConfigConditionsMet("analytics"))return;wpm.gtagLoaded().then((function(){gtag("event","purchase",{send_to:[wpmDataLayer.pixels.google.analytics.ga4.measurement_id],transaction_id:wpmDataLayer.order.number,affiliation:wpmDataLayer.order.affiliation,currency:wpmDataLayer.order.currency,value:wpmDataLayer.order.value_regular,discount:wpmDataLayer.order.discount,tax:wpmDataLayer.order.tax,shipping:wpmDataLayer.order.shipping,coupon:wpmDataLayer.order.coupon,items:wpm.getGA4OrderItems()})}))}catch(e){console.error(e)}}))},271:()=>{!function(e,t,a){e.getCartItemsGaUa=function(){let e=[];for(const[t,a]of Object.entries(wpmDataLayer.cart))e.push({id:a.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],name:a.name,brand:a.brand,category:a.category.join(","),price:a.price,quantity:a.quantity,variant:a.variant});return e}}(window.wpm=window.wpm||{},jQuery),jQuery(document).on("wpmViewItemList",(function(e,t){try{var a,o,r,i,n,l,d,s,c;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r||null===(i=r.analytics)||void 0===i||!i.eec)return;if(null===(n=wpmDataLayer)||void 0===n||null===(l=n.pixels)||void 0===l||null===(d=l.google)||void 0===d||null===(s=d.analytics)||void 0===s||null===(c=s.universal)||void 0===c||!c.property_id)return;if(!wpm.googleConfigConditionsMet("analytics"))return;wpm.gtagLoaded().then((function(){gtag("event","view_item_list",{send_to:wpmDataLayer.pixels.google.analytics.universal.property_id,items:[{id:t.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],name:t.name,brand:t.brand,category:t.category.join(","),list_name:wpmDataLayer.shop.list_name,list_position:t.list_position,price:t.price,quantity:t.quantity,variant:t.variant}]})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmSelectContentGaUa",(function(e,t){try{var a,o,r,i,n,l,d,s,c;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r||null===(i=r.analytics)||void 0===i||!i.eec)return;if(null===(n=wpmDataLayer)||void 0===n||null===(l=n.pixels)||void 0===l||null===(d=l.google)||void 0===d||null===(s=d.analytics)||void 0===s||null===(c=s.universal)||void 0===c||!c.property_id)return;if(!wpm.googleConfigConditionsMet("analytics"))return;wpm.gtagLoaded().then((function(){gtag("event","select_content",{send_to:wpmDataLayer.pixels.google.analytics.universal.property_id,content_type:"product",items:[{id:t.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],name:t.name,list_name:wpmDataLayer.shop.list_name,brand:t.brand,category:t.category.join(","),variant:t.variant,list_position:t.list_position,quantity:t.quantity,price:t.price}]})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmAddToCart",(function(e,t){try{var a,o,r,i,n,l,d,s,c;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r||null===(i=r.analytics)||void 0===i||!i.eec)return;if(null===(n=wpmDataLayer)||void 0===n||null===(l=n.pixels)||void 0===l||null===(d=l.google)||void 0===d||null===(s=d.analytics)||void 0===s||null===(c=s.universal)||void 0===c||!c.property_id)return;if(!wpm.googleConfigConditionsMet("analytics"))return;wpm.gtagLoaded().then((function(){gtag("event","add_to_cart",{send_to:wpmDataLayer.pixels.google.analytics.universal.property_id,currency:wpmDataLayer.shop.currency,items:[{id:t.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],name:t.name,list_name:wpmDataLayer.shop.list_name,brand:t.brand,category:t.category.join(","),variant:t.variant,list_position:t.list_position,quantity:t.quantity,price:t.price}]})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmViewItem",(function(e,t){try{var a,o,r,i,n,l,d,s,c;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r||null===(i=r.analytics)||void 0===i||!i.eec)return;if(null===(n=wpmDataLayer)||void 0===n||null===(l=n.pixels)||void 0===l||null===(d=l.google)||void 0===d||null===(s=d.analytics)||void 0===s||null===(c=s.universal)||void 0===c||!c.property_id)return;if(!wpm.googleConfigConditionsMet("analytics"))return;wpm.gtagLoaded().then((function(){gtag("event","view_item",{send_to:wpmDataLayer.pixels.google.analytics.universal.property_id,items:[{id:t.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],name:t.name,list_name:wpmDataLayer.shop.list_name,brand:t.brand,category:t.category.join(","),variant:t.variant,list_position:1,quantity:1,price:t.price}]})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmAddToWishlist",(function(e,t){try{var a,o,r,i,n,l,d,s,c;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r||null===(i=r.analytics)||void 0===i||!i.eec)return;if(null===(n=wpmDataLayer)||void 0===n||null===(l=n.pixels)||void 0===l||null===(d=l.google)||void 0===d||null===(s=d.analytics)||void 0===s||null===(c=s.universal)||void 0===c||!c.property_id)return;if(!wpm.googleConfigConditionsMet("analytics"))return;wpm.gtagLoaded().then((function(){gtag("event","add_to_wishlist",{send_to:wpmDataLayer.pixels.google.analytics.universal.property_id,items:[{id:t.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],name:t.name,brand:t.brand,category:t.category.join(","),list_name:wpmDataLayer.shop.list_name,list_position:t.position,price:t.price,quantity:1,variant:t.variant}]})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmRemoveFromCart",(function(e,t){try{var a,o,r,i,n,l,d,s,c;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r||null===(i=r.analytics)||void 0===i||!i.eec)return;if(null===(n=wpmDataLayer)||void 0===n||null===(l=n.pixels)||void 0===l||null===(d=l.google)||void 0===d||null===(s=d.analytics)||void 0===s||null===(c=s.universal)||void 0===c||!c.property_id)return;if(!wpm.googleConfigConditionsMet("analytics"))return;wpm.gtagLoaded().then((function(){gtag("event","remove_from_cart",{send_to:wpmDataLayer.pixels.google.analytics.universal.property_id,currency:wpmDataLayer.shop.currency,items:[{id:t.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],name:t.name,list_name:wpmDataLayer.shop.list_name,brand:t.brand,category:t.category.join(","),variant:t.variant,quantity:t.quantity,price:t.price}]})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmBeginCheckout",(function(e){try{var t,a,o,r,i,n,l,d,s;if(null===(t=wpmDataLayer)||void 0===t||null===(a=t.pixels)||void 0===a||null===(o=a.google)||void 0===o||null===(r=o.analytics)||void 0===r||!r.eec)return;if(null===(i=wpmDataLayer)||void 0===i||null===(n=i.pixels)||void 0===n||null===(l=n.google)||void 0===l||null===(d=l.analytics)||void 0===d||null===(s=d.universal)||void 0===s||!s.property_id)return;if(!wpm.googleConfigConditionsMet("analytics"))return;wpm.gtagLoaded().then((function(){gtag("event","begin_checkout",{send_to:wpmDataLayer.pixels.google.analytics.universal.property_id,currency:wpmDataLayer.shop.currency,items:wpm.getCartItemsGaUa()})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmFireCheckoutOption",(function(e,t){try{var a,o,r,i,n,l,d,s,c;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r||null===(i=r.analytics)||void 0===i||!i.eec)return;if(null===(n=wpmDataLayer)||void 0===n||null===(l=n.pixels)||void 0===l||null===(d=l.google)||void 0===d||null===(s=d.analytics)||void 0===s||null===(c=s.universal)||void 0===c||!c.property_id)return;if(!wpm.googleConfigConditionsMet("analytics"))return;wpm.gtagLoaded().then((function(){gtag("event","set_checkout_option",{send_to:wpmDataLayer.pixels.google.analytics.universal.property_id,checkout_step:t.step,checkout_option:t.checkout_option,value:t.value})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmFireCheckoutProgress",(function(e,t){try{var a,o,r,i,n,l,d,s,c;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r||null===(i=r.analytics)||void 0===i||!i.eec)return;if(null===(n=wpmDataLayer)||void 0===n||null===(l=n.pixels)||void 0===l||null===(d=l.google)||void 0===d||null===(s=d.analytics)||void 0===s||null===(c=s.universal)||void 0===c||!c.property_id)return;if(!wpm.googleConfigConditionsMet("analytics"))return;wpm.gtagLoaded().then((function(){gtag("event","checkout_progress",{send_to:wpmDataLayer.pixels.google.analytics.universal.property_id,checkout_step:t.step})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmSearch",(function(){try{var e,t,a,o,r,i,n,l,d;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.google)||void 0===a||null===(o=a.analytics)||void 0===o||!o.eec)return;if(null===(r=wpmDataLayer)||void 0===r||null===(i=r.pixels)||void 0===i||null===(n=i.google)||void 0===n||null===(l=n.analytics)||void 0===l||null===(d=l.universal)||void 0===d||!d.property_id)return;if(!wpm.googleConfigConditionsMet("analytics"))return;let s=[];for(const[e,t]of Object.entries(wpmDataLayer.products))s.push({id:t.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],name:t.name,quantity:1,list_position:t.position,brand:t.brand,category:t.category.join(","),list_name:wpmDataLayer.shop.list_name,variant:t.variant,price:t.price});wpm.gtagLoaded().then((function(){gtag("event","view_search_results",{send_to:wpmDataLayer.pixels.google.analytics.universal.property_id,search_term:wpm.getSearchTermFromUrl(),items:s})}))}catch(e){console.error(e)}})),jQuery(document).on("wpmLogin",(function(){try{var e,t,a,o,r,i,n,l,d;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.google)||void 0===a||null===(o=a.analytics)||void 0===o||!o.eec)return;if(null===(r=wpmDataLayer)||void 0===r||null===(i=r.pixels)||void 0===i||null===(n=i.google)||void 0===n||null===(l=n.analytics)||void 0===l||null===(d=l.universal)||void 0===d||!d.property_id)return;if(!wpm.googleConfigConditionsMet("analytics"))return;wpm.gtagLoaded().then((function(){gtag("event","login",{send_to:wpmDataLayer.pixels.google.analytics.universal.property_id})}))}catch(e){console.error(e)}}))},354:()=>{!function(e,t,a){e.getGAUAOrderItems=function(){let e=[],t=1;for(const[r,i]of Object.entries(wpmDataLayer.order.items)){var a,o;let r;r={quantity:i.quantity,price:i.price,item_name:i.name,currency:wpmDataLayer.order.currency,item_category:wpmDataLayer.products[i.id].category.join("/"),list_position:t},null!==(a=wpmDataLayer)&&void 0!==a&&null!==(o=a.general)&&void 0!==o&&o.variationsOutput&&0!==i.variation_id?(r.id=String(wpmDataLayer.products[i.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type]),r.variant=wpmDataLayer.products[i.variation_id].variant_name,r.item_brand=wpmDataLayer.products[i.variation_id].brand,e.push(r)):(r.id=String(wpmDataLayer.products[i.id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type]),r.item_brand=wpmDataLayer.products[i.id].brand,e.push(r)),t++}return e}}(window.wpm=window.wpm||{},jQuery),jQuery(document).on("wpmOrderReceivedPage",(function(){try{var e,t,a,o,r,i,n,l,d,s;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.google)||void 0===a||null===(o=a.analytics)||void 0===o||null===(r=o.universal)||void 0===r||!r.property_id)return;if(null!==(i=wpmDataLayer)&&void 0!==i&&null!==(n=i.pixels)&&void 0!==n&&null!==(l=n.google)&&void 0!==l&&null!==(d=l.analytics)&&void 0!==d&&null!==(s=d.universal)&&void 0!==s&&s.mp_active)return;if(!wpm.googleConfigConditionsMet("analytics"))return;wpm.gtagLoaded().then((function(){gtag("event","purchase",{send_to:[wpmDataLayer.pixels.google.analytics.universal.property_id],transaction_id:wpmDataLayer.order.number,affiliation:wpmDataLayer.order.affiliation,currency:wpmDataLayer.order.currency,value:wpmDataLayer.order.value_regular,discount:wpmDataLayer.order.discount,tax:wpmDataLayer.order.tax,shipping:wpmDataLayer.order.shipping,coupon:wpmDataLayer.order.coupon,items:wpm.getGAUAOrderItems()})}))}catch(e){console.error(e)}}))},497:()=>{!function(e,t,a){e.load_google_optimize_pixel=function(){try{var t,a,o,r;null!==(t=wpmDataLayer)&&void 0!==t&&null!==(a=t.pixels)&&void 0!==a&&null!==(o=a.google)&&void 0!==o&&null!==(r=o.optimize)&&void 0!==r&&r.container_id&&(wpmDataLayer.pixels.google.optimize.loaded=!0,e.loadScriptAndCacheIt("https://www.googleoptimize.com/optimize.js?id="+wpmDataLayer.pixels.google.optimize.container_id))}catch(e){console.error(e)}}}(window.wpm=window.wpm||{},jQuery),jQuery(document).on("wpmLoadPixels",(function(){var e,t,a,o;!wpm.canIFire("analytics","google-optimize")||null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.google)&&void 0!==a&&null!==(o=a.optimize)&&void 0!==o&&o.loaded||wpm.load_google_optimize_pixel()}))},577:()=>{!function(e,t,a){e.googleConfigConditionsMet=function(t){var a,o,r,i;return!(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r||null===(i=r.consent_mode)||void 0===i||!i.active)||("category"===e.getConsentValues().mode?!0===e.getConsentValues().categories[t]:"pixel"===e.getConsentValues().mode&&e.getConsentValues().pixels.includes("google-"+t))},e.getVisitorConsentStatusAndUpdateGoogleConsentSettings=function(t){return"category"===e.getConsentValues().mode?(e.getConsentValues().categories.analytics&&(t.analytics_storage="granted"),e.getConsentValues().categories.ads&&(t.ad_storage="granted")):"pixel"===e.getConsentValues().mode&&(t.analytics_storage=e.getConsentValues().pixels.includes("google-analytics")?"granted":"denied",t.ad_storage=e.getConsentValues().pixels.includes("google-ads")?"granted":"denied"),t},e.updateGoogleConsentMode=function(){let e=!(arguments.length>0&&arguments[0]!==a)||arguments[0],t=!(arguments.length>1&&arguments[1]!==a)||arguments[1];try{if(!window.gtag||!wpmDataLayer.shop.cookie_consent_mgmt.explicit_consent)return;gtag("consent","update",{analytics_storage:e?"granted":"denied",ad_storage:t?"granted":"denied"})}catch(e){console.error(e)}},e.fireGtagGoogleAds=function(){try{var e,t,a,o,r,i,n,l,d,s,c,u,p,m,y,g,w,v,_,f,L;if(wpmDataLayer.pixels.google.ads.state="loading",null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.google)&&void 0!==a&&null!==(o=a.ads)&&void 0!==o&&null!==(r=o.enhanced_conversions)&&void 0!==r&&r.active)for(const[e,t]of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds))gtag("config",e,{allow_enhanced_conversions:!0});else for(const[e,t]of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds))gtag("config",e);null!==(i=wpmDataLayer)&&void 0!==i&&null!==(n=i.pixels)&&void 0!==n&&null!==(l=n.google)&&void 0!==l&&null!==(d=l.ads)&&void 0!==d&&d.conversionIds&&null!==(s=wpmDataLayer)&&void 0!==s&&null!==(c=s.pixels)&&void 0!==c&&null!==(u=c.google)&&void 0!==u&&null!==(p=u.ads)&&void 0!==p&&p.phone_conversion_label&&null!==(m=wpmDataLayer)&&void 0!==m&&null!==(y=m.pixels)&&void 0!==y&&null!==(g=y.google)&&void 0!==g&&null!==(w=g.ads)&&void 0!==w&&w.phone_conversion_number&&gtag("config",Object.keys(wpmDataLayer.pixels.google.ads.conversionIds)[0]+"/"+wpmDataLayer.pixels.google.ads.phone_conversion_label,{phone_conversion_number:wpmDataLayer.pixels.google.ads.phone_conversion_number}),"order_received_page"===wpmDataLayer.shop.page_type&&null!==(v=wpmDataLayer)&&void 0!==v&&null!==(_=v.order)&&void 0!==_&&null!==(f=_.google)&&void 0!==f&&null!==(L=f.ads)&&void 0!==L&&L.enhanced_conversion_data&&(window.enhanced_conversion_data=wpmDataLayer.order.google.ads.enhanced_conversion_data),wpmDataLayer.pixels.google.ads.state="ready"}catch(e){console.error(e)}},e.fireGtagGoogleAnalyticsUA=function(){try{wpmDataLayer.pixels.google.analytics.universal.state="loading",gtag("config",wpmDataLayer.pixels.google.analytics.universal.property_id,wpmDataLayer.pixels.google.analytics.universal.parameters),wpmDataLayer.pixels.google.analytics.universal.state="ready"}catch(e){console.error(e)}},e.fireGtagGoogleAnalyticsGA4=function(){try{wpmDataLayer.pixels.google.analytics.ga4.state="loading",gtag("config",wpmDataLayer.pixels.google.analytics.ga4.measurement_id,wpmDataLayer.pixels.google.analytics.ga4.parameters),wpmDataLayer.pixels.google.analytics.ga4.state="ready"}catch(e){console.error(e)}},e.isGoogleActive=function(){var e,t,a,o,r,i,n,l,d,s,c,u,p,m;return!(!(null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.google)&&void 0!==a&&null!==(o=a.analytics)&&void 0!==o&&null!==(r=o.universal)&&void 0!==r&&r.property_id||null!==(i=wpmDataLayer)&&void 0!==i&&null!==(n=i.pixels)&&void 0!==n&&null!==(l=n.google)&&void 0!==l&&null!==(d=l.analytics)&&void 0!==d&&null!==(s=d.ga4)&&void 0!==s&&s.measurement_id)&&jQuery.isEmptyObject(null===(c=wpmDataLayer)||void 0===c||null===(u=c.pixels)||void 0===u||null===(p=u.google)||void 0===p||null===(m=p.ads)||void 0===m?void 0:m.conversionIds))},e.getGoogleGtagId=function(){var e,t,a,o,r,i,n,l,d,s;return null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.google)&&void 0!==a&&null!==(o=a.analytics)&&void 0!==o&&null!==(r=o.universal)&&void 0!==r&&r.property_id?wpmDataLayer.pixels.google.analytics.universal.property_id:null!==(i=wpmDataLayer)&&void 0!==i&&null!==(n=i.pixels)&&void 0!==n&&null!==(l=n.google)&&void 0!==l&&null!==(d=l.analytics)&&void 0!==d&&null!==(s=d.ga4)&&void 0!==s&&s.measurement_id?wpmDataLayer.pixels.google.analytics.ga4.measurement_id:Object.keys(wpmDataLayer.pixels.google.ads.conversionIds)[0]},e.loadGoogle=function(){e.isGoogleActive()&&(wpmDataLayer.pixels.google.state="loading",e.loadScriptAndCacheIt("https://www.googletagmanager.com/gtag/js?id="+e.getGoogleGtagId()).done((function(t,a){try{var o,r,i,n,l,d,s,c,u,p,m,y,g,w,v,_,f,L,h,D,x,k;if(window.dataLayer=window.dataLayer||[],window.gtag=function(){dataLayer.push(arguments)},null!==(o=wpmDataLayer)&&void 0!==o&&null!==(r=o.pixels)&&void 0!==r&&null!==(i=r.google)&&void 0!==i&&null!==(n=i.consent_mode)&&void 0!==n&&n.active){var C,j,b,I;let t={ad_storage:wpmDataLayer.pixels.google.consent_mode.ad_storage,analytics_storage:wpmDataLayer.pixels.google.consent_mode.analytics_storage,wait_for_update:wpmDataLayer.pixels.google.consent_mode.wait_for_update};null!==(C=wpmDataLayer)&&void 0!==C&&null!==(j=C.pixels)&&void 0!==j&&null!==(b=j.google)&&void 0!==b&&null!==(I=b.consent_mode)&&void 0!==I&&I.region&&(t.region=wpmDataLayer.pixels.google.consent_mode.region),t=e.getVisitorConsentStatusAndUpdateGoogleConsentSettings(t),gtag("consent","default",t),gtag("set","ads_data_redaction",wpmDataLayer.pixels.google.consent_mode.ads_data_redaction),gtag("set","url_passthrough",wpmDataLayer.pixels.google.consent_mode.url_passthrough)}null!==(l=wpmDataLayer)&&void 0!==l&&null!==(d=l.pixels)&&void 0!==d&&null!==(s=d.google)&&void 0!==s&&null!==(c=s.linker)&&void 0!==c&&c.settings&&gtag("set","linker",wpmDataLayer.pixels.google.linker.settings),gtag("js",new Date),e.googleConfigConditionsMet("ads")&&!jQuery.isEmptyObject(null===(u=wpmDataLayer)||void 0===u||null===(p=u.pixels)||void 0===p||null===(m=p.google)||void 0===m||null===(y=m.ads)||void 0===y?void 0:y.conversionIds)&&e.fireGtagGoogleAds(),e.googleConfigConditionsMet("analytics")&&null!==(g=wpmDataLayer)&&void 0!==g&&null!==(w=g.pixels)&&void 0!==w&&null!==(v=w.google)&&void 0!==v&&null!==(_=v.analytics)&&void 0!==_&&null!==(f=_.universal)&&void 0!==f&&f.property_id&&e.fireGtagGoogleAnalyticsUA(),e.googleConfigConditionsMet("analytics")&&null!==(L=wpmDataLayer)&&void 0!==L&&null!==(h=L.pixels)&&void 0!==h&&null!==(D=h.google)&&void 0!==D&&null!==(x=D.analytics)&&void 0!==x&&null!==(k=x.ga4)&&void 0!==k&&k.measurement_id&&e.fireGtagGoogleAnalyticsGA4(),wpmDataLayer.pixels.google.state="ready"}catch(e){console.error(e)}})))},e.canGoogleLoad=function(){var t,a,o,r;return!(null===(t=wpmDataLayer)||void 0===t||null===(a=t.pixels)||void 0===a||null===(o=a.google)||void 0===o||null===(r=o.consent_mode)||void 0===r||!r.active)||("category"===e.getConsentValues().mode?!(!e.getConsentValues().categories.ads&&!e.getConsentValues().categories.analytics):"pixel"===e.getConsentValues().mode?e.getConsentValues().pixels.includes("google-ads")||e.getConsentValues().pixels.includes("google-analytics"):(console.error("Couldn't find a valid load condition for Google mode in wpmConsentValues"),!1))},e.gtagLoaded=function(){return new Promise((function(e,t){var a,o,r;void 0===(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r?void 0:r.state)&&t();let i=0;!function a(){var o,r,n;return"ready"===(null===(o=wpmDataLayer)||void 0===o||null===(r=o.pixels)||void 0===r||null===(n=r.google)||void 0===n?void 0:n.state)?e():i>=5e3?t():(i+=200,void setTimeout(a,200))}()}))}}(window.wpm=window.wpm||{},jQuery),jQuery(document).on("wpmLoadPixels",(function(){var e,t,a;wpm.canGoogleLoad()&&void 0===(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.google)||void 0===a?void 0:a.state)&&wpm.loadGoogle()}))},385:()=>{!function(e,t,a){e.getFormattedGA4Categories=function(e,t){if(t=Array.from(new Set(t)),Array.isArray(t)&&t.length){e.item_category=t[0];let a=t.length>5?5:t.length;for(let o=1;o<a;o++)e["item_category"+(o+1)]=t[o]}return e},e.setGoogleCidOnServer=function(){try{var t,a,o,r,i,n,l,d,s,c;let u=[];null!==(t=wpmDataLayer)&&void 0!==t&&null!==(a=t.pixels)&&void 0!==a&&null!==(o=a.google)&&void 0!==o&&null!==(r=o.analytics)&&void 0!==r&&null!==(i=r.ga4)&&void 0!==i&&i.measurement_id&&u.push(wpmDataLayer.pixels.google.analytics.ga4.measurement_id),null!==(n=wpmDataLayer)&&void 0!==n&&null!==(l=n.pixels)&&void 0!==l&&null!==(d=l.google)&&void 0!==d&&null!==(s=d.analytics)&&void 0!==s&&null!==(c=s.universal)&&void 0!==c&&c.property_id&&u.push(wpmDataLayer.pixels.google.analytics.universal.property_id),e.gtagLoaded().then((function(){gtag("get",u[0],"client_id",(t=>{let a={action:"wpm_google_analytics_set_session_data",target_ids:u,client_id:t,referrer:e.getReferrerFromCookie(),gclid:e.getClidFromBrowser("gclid"),userAgent:e.getUserAgent(),viewPortWidth:e.getViewPort().width,viewPortHeight:e.getViewPort().height};jQuery.ajax({type:"post",dataType:"json",url:e.ajax_url,data:a,success:function(a){!0===a.success&&(window.sessionStorage?u.forEach((e=>{window.sessionStorage.setItem("_wpm_ga_cid_set",JSON.stringify(!0)),window.sessionStorage.setItem("wpm_cid_"+e+"_"+t+"_set",JSON.stringify(!0))})):u.forEach((a=>{e.setCookie("wpm_cid_"+a+"_"+t+"_set",!0)})))},error:function(e){console.error(e)}})}))}))}catch(e){console.error(e)}}}(window.wpm=window.wpm||{},jQuery),jQuery(window).on("wpmLoadAlways",(function(){try{var e,t,a,o,r,i,n,l,d,s,c,u,p,m,y,g;null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.google)||void 0===a||null===(o=a.analytics)||void 0===o||!o.eec||null!==(r=window)&&void 0!==r&&null!==(i=r.sessionStorage)&&void 0!==i&&i.getItem("_wpm_ga_cid_set",JSON.parse(!0))||!(null!==(n=wpmDataLayer)&&void 0!==n&&null!==(l=n.pixels)&&void 0!==l&&null!==(d=l.google)&&void 0!==d&&null!==(s=d.analytics)&&void 0!==s&&null!==(c=s.universal)&&void 0!==c&&c.property_id||null!==(u=wpmDataLayer)&&void 0!==u&&null!==(p=u.pixels)&&void 0!==p&&null!==(m=p.google)&&void 0!==m&&null!==(y=m.analytics)&&void 0!==y&&null!==(g=y.ga4)&&void 0!==g&&g.measurement_id)||["product","cart","checkout"].indexOf(wpmDataLayer.shop.page_type)>=0&&wpm.setGoogleCidOnServer()}catch(e){console.error(e)}}))},570:()=>{!function(e,t,a){e.load_hotjar_pixel=function(){var e,t,a;null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.hotjar)&&void 0!==a&&a.site_id&&(wpmDataLayer.pixels.hotjar.loaded=!0,function(e,t,a,o,r,i){e.hj=e.hj||function(){(e.hj.q=e.hj.q||[]).push(arguments)},e._hjSettings={hjid:wpmDataLayer.pixels.hotjar.site_id,hjsv:6},r=t.getElementsByTagName("head")[0],(i=t.createElement("script")).async=1,i.src="https://static.hotjar.com/c/hotjar-"+e._hjSettings.hjid+".js?sv="+e._hjSettings.hjsv,r.appendChild(i)}(window,document))}}(window.wpm=window.wpm||{},jQuery),jQuery(document).on("wpmLoadPixels",(function(){var e,t,a;!wpm.canIFire("analytics","hotjar")||null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.hotjar)&&void 0!==a&&a.loaded||wpm.load_hotjar_pixel()}))},623:()=>{!function(e,t,a){e.load_bing_pixel=function(){try{var e,t,a;null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.bing)&&void 0!==a&&a.uet_tag_id&&(wpmDataLayer.pixels.bing.loaded=!0,window.uetq=window.uetq||[],o=window,r=document,i="script",o[n="uetq"]=o[n]||[],l=function(){var e={ti:wpmDataLayer.pixels.bing.uet_tag_id};e.q=o[n],o[n]=new UET(e),o[n].push("pageLoad")},(d=r.createElement(i)).src="//bat.bing.com/bat.js",d.async=1,d.onload=d.onreadystatechange=function(){var e=this.readyState;e&&"loaded"!==e&&"complete"!==e||(l(),d.onload=d.onreadystatechange=null)},(s=r.getElementsByTagName(i)[0]).parentNode.insertBefore(d,s))}catch(e){console.error(e)}var o,r,i,n,l,d,s},e.bing_purchase_ecomm_prodids=function(){let e=[];for(const[o,r]of Object.entries(wpmDataLayer.order.items)){var t,a;null!==(t=wpmDataLayer)&&void 0!==t&&null!==(a=t.general)&&void 0!==a&&a.variationsOutput&&0!==r.variation_id?e.push(String(wpmDataLayer.products[r.variation_id].dyn_r_ids[wpmDataLayer.pixels.bing.dynamic_remarketing.id_type])):e.push(String(wpmDataLayer.products[r.id].dyn_r_ids[wpmDataLayer.pixels.bing.dynamic_remarketing.id_type]))}return e},e.bing_purchase_items=function(){let e=[];for(const[o,r]of Object.entries(wpmDataLayer.order.items)){var t,a;let o;o={quantity:r.quantity,price:r.price},null!==(t=wpmDataLayer)&&void 0!==t&&null!==(a=t.general)&&void 0!==a&&a.variationsOutput&&0!==r.variation_id?(o.id=String(wpmDataLayer.products[r.variation_id].dyn_r_ids[wpmDataLayer.pixels.bing.dynamic_remarketing.id_type]),e.push(o)):(o.id=String(wpmDataLayer.products[r.id].dyn_r_ids[wpmDataLayer.pixels.bing.dynamic_remarketing.id_type]),e.push(o))}return e}}(window.wpm=window.wpm||{},jQuery),jQuery(document).on("wpmLoadPixels",(function(){var e,t,a;!wpm.canIFire("ads","bing-ads")||null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.bing)&&void 0!==a&&a.loaded||wpm.load_bing_pixel()})),jQuery(document).on("wpmAddToCart",(function(e,t){try{var a,o,r;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.bing)||void 0===r||!r.loaded)return;window.uetq.push("event","",{ecomm_pagetype:"cart",ecomm_prodid:t.dyn_r_ids[wpmDataLayer.pixels.bing.dynamic_remarketing.id_type]})}catch(e){console.error(e)}})),jQuery(document).on("wpmViewItem",(function(e,t){try{var a,o,r;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.bing)||void 0===r||!r.loaded)return;window.uetq.push("event","",{ecomm_pagetype:"product",ecomm_prodid:t.dyn_r_ids[wpmDataLayer.pixels.bing.dynamic_remarketing.id_type]})}catch(e){console.error(e)}})),jQuery(document).on("wpmCategory",(function(){try{var e,t,a;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.bing)||void 0===a||!a.loaded)return;window.uetq.push("event","",{ecomm_pagetype:"category"})}catch(e){console.error(e)}})),jQuery(document).on("wpmSearch",(function(){try{var e,t,a;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.bing)||void 0===a||!a.loaded)return;window.uetq.push("event","",{ecomm_pagetype:"searchresults"})}catch(e){console.error(e)}})),jQuery(document).on("wpmOrderReceivedPage",(function(){try{var e,t,a;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.bing)||void 0===a||!a.loaded)return;window.uetq.push("event","purchase",{ecomm_pagetype:"purchase",ecomm_prodid:wpm.bing_purchase_ecomm_prodids(),revenue_value:wpmDataLayer.order.value_filtered,currency:wpmDataLayer.order.currency,items:wpm.bing_purchase_items()})}catch(e){console.error(e)}}))},699:()=>{!function(e,t,a){e.getPinterestProductData=function(e){return e.isVariation?{product_name:e.name,product_variant_id:e.dyn_r_ids[wpmDataLayer.pixels.pinterest.dynamic_remarketing.id_type],product_id:e.parentId_dyn_r_ids[wpmDataLayer.pixels.pinterest.dynamic_remarketing.id_type],product_category:e.category,product_variant:e.variant,product_price:e.price,product_quantity:e.quantity,product_brand:e.brand}:{product_name:e.name,product_id:e.dyn_r_ids[wpmDataLayer.pixels.pinterest.dynamic_remarketing.id_type],product_category:e.category,product_price:e.price,product_quantity:e.quantity,product_brand:e.brand}},e.pinterestFormattedOrderItems=function(){let e=[];for(const[o,r]of Object.entries(wpmDataLayer.order.items)){var t,a;let i;i={product_category:wpmDataLayer.products[o].category.join(","),product_quantity:r.quantity,product_price:r.price},null!==(t=wpmDataLayer)&&void 0!==t&&null!==(a=t.general)&&void 0!==a&&a.variationsOutput&&0!==r.variation_id?(i.product_id=String(wpmDataLayer.products[r.variation_id].dyn_r_ids[wpmDataLayer.pixels.pinterest.dynamic_remarketing.id_type]),i.product_name=wpmDataLayer.products[r.variation_id].name,e.push(i)):(i.product_id=String(wpmDataLayer.products[r.id].dyn_r_ids[wpmDataLayer.pixels.pinterest.dynamic_remarketing.id_type]),i.product_name=wpmDataLayer.products[r.id].name,e.push(i))}return e},e.loadPinterestPixel=function(){try{var t,a,o;null!==(t=wpmDataLayer)&&void 0!==t&&null!==(a=t.pixels)&&void 0!==a&&null!==(o=a.pinterest)&&void 0!==o&&o.pixel_id&&(wpmDataLayer.pixels.pinterest.loaded=!0,function(e){if(!window.pintrk){window.pintrk=function(){window.pintrk.queue.push(Array.prototype.slice.call(arguments))};var t=window.pintrk;t.queue=[],t.version="3.0";var a=document.createElement("script");a.async=!0,a.src="https://s.pinimg.com/ct/core.js";var o=document.getElementsByTagName("script")[0];o.parentNode.insertBefore(a,o)}}(),e.pinterestLoadEvent(),pintrk("page"))}catch(e){console.error(e)}},e.pinterestLoadEvent=function(){try{var e,t,a;(wpmDataLayer.general.userLoggedIn||"order_received_page"===wpmDataLayer.shop.page_type)&&null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.pinterest)&&void 0!==a&&a.enhanced_match?pintrk("load",wpmDataLayer.pixels.pinterest.pixel_id,{em:wpmDataLayer.pixels.pinterest.enhanced_match_email}):pintrk("load",wpmDataLayer.pixels.pinterest.pixel_id)}catch(e){console.error(e)}}}(window.wpm=window.wpm||{},jQuery),jQuery(document).on("wpmLoadPixels",(function(){var e,t,a;!wpm.canIFire("ads","pinterest-ads")||null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.pinterest)&&void 0!==a&&a.loaded||wpm.loadPinterestPixel()})),jQuery(document).on("wpmAddToCart",(function(e,t){try{var a,o,r;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.pinterest)||void 0===r||!r.loaded)return;pintrk("track","addtocart",{value:parseFloat(t.quantity*t.price),currency:t.currency,line_items:[wpm.getPinterestProductData(t)]})}catch(e){console.error(e)}})),jQuery(document).on("wpmViewItem",(function(e,t){try{var a,o,r;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.pinterest)||void 0===r||!r.loaded)return;pintrk("track","pagevisit",{currency:t.currency,line_items:[wpm.getPinterestProductData(t)]})}catch(e){console.error(e)}})),jQuery(document).on("wpmViewItem",(function(e,t){try{var a,o,r;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.pinterest)||void 0===r||!r.loaded)return;let e=wpm.getPinterestProductData(t);pintrk("track","pagevisit",{currency:t.currency,line_items:[e]})}catch(e){console.error(e)}})),jQuery(document).on("wpmSearch",(function(){try{var e,t,a;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.pinterest)||void 0===a||!a.loaded)return;let o=new URLSearchParams(window.location.search);pintrk("track","search",{search_query:o.get("s")})}catch(e){console.error(e)}})),jQuery(document).on("wpmCategory",(function(){try{var e,t,a;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.pinterest)||void 0===a||!a.loaded)return;pintrk("track","viewcategory")}catch(e){console.error(e)}})),jQuery(document).on("wpmOrderReceivedPage",(function(){try{var e,t,a;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.pinterest)||void 0===a||!a.loaded)return;pintrk("track","checkout",{value:wpmDataLayer.order.value_filtered,order_quantity:wpmDataLayer.order.quantity,currency:wpmDataLayer.order.currency,order_id:wpmDataLayer.order.id,line_items:wpm.pinterestFormattedOrderItems()})}catch(e){console.error(e)}}))},986:()=>{!function(e,t,a){e.snapchatGetEmail=function(){var e,t;let a={};var o;return null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.user)&&void 0!==t&&t.email_sha256&&(a.user_hashed_email=null===(o=wpmDataLayer.user)||void 0===o?void 0:o.email_sha256),a},e.loadSnapchatPixel=function(){try{var t,a,o;null!==(t=wpmDataLayer)&&void 0!==t&&null!==(a=t.pixels)&&void 0!==a&&null!==(o=a.snapchat)&&void 0!==o&&o.pixel_id&&(wpmDataLayer.pixels.snapchat.loaded=!0,function(e,t,a){if(!e.snaptr){var o=e.snaptr=function(){o.handleRequest?o.handleRequest.apply(o,arguments):o.queue.push(arguments)};o.queue=[];var i="script";r=t.createElement(i),r.async=!0,r.src="https://sc-static.net/scevent.min.js";var n=t.getElementsByTagName(i)[0];n.parentNode.insertBefore(r,n)}}(window,document),snaptr("init",wpmDataLayer.pixels.snapchat.pixel_id,e.snapchatGetEmail()),snaptr("track","PAGE_VIEW"))}catch(e){console.error(e)}},e.getSnapchatOrderItemIds=function(){let e=[];for(const[o,r]of Object.entries(wpmDataLayer.order.items)){var t,a;null!==(t=wpmDataLayer)&&void 0!==t&&null!==(a=t.general)&&void 0!==a&&a.variationsOutput&&0!==r.variation_id?e.push(String(wpmDataLayer.products[r.variation_id].dyn_r_ids[wpmDataLayer.pixels.snapchat.dynamic_remarketing.id_type])):e.push(String(wpmDataLayer.products[r.id].dyn_r_ids[wpmDataLayer.pixels.snapchat.dynamic_remarketing.id_type]))}return e}}(window.wpm=window.wpm||{},jQuery),jQuery(document).on("wpmLoadPixels",(function(){var e,t,a;!wpm.canIFire("ads","snapchat-ads")||null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.snapchat)&&void 0!==a&&a.loaded||wpm.loadSnapchatPixel()})),jQuery(document).on("wpmAddToCart",(function(e,t){try{var a,o,r;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.snapchat)||void 0===r||!r.loaded)return;snaptr("track","ADD_CART",{item_ids:[t.dyn_r_ids[wpmDataLayer.pixels.snapchat.dynamic_remarketing.id_type]]})}catch(e){console.error(e)}})),jQuery(document).on("wpmViewItem",(function(e,t){try{var a,o,r;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.snapchat)||void 0===r||!r.loaded)return;snaptr("track","VIEW_CONTENT",{item_ids:[t.dyn_r_ids[wpmDataLayer.pixels.snapchat.dynamic_remarketing.id_type]]})}catch(e){console.error(e)}})),jQuery(document).on("wpmOrderReceivedPage",(function(){try{var e,t,a;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.snapchat)||void 0===a||!a.loaded)return;snaptr("track","PURCHASE",{currency:wpmDataLayer.order.currency,price:wpmDataLayer.order.value_filtered,transaction_id:wpmDataLayer.order.id,item_ids:wpm.getSnapchatOrderItemIds()})}catch(e){console.error(e)}}))},657:()=>{!function(e,t,a){e.loadTikTokPixel=function(){try{var e,t,a;null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.tiktok)&&void 0!==a&&a.pixel_id&&(wpmDataLayer.pixels.tiktok.loaded=!0,function(e,t,a){e.TiktokAnalyticsObject=a;var o=e[a]=e[a]||[];o.methods=["page","track","identify","instances","debug","on","off","once","ready","alias","group","enableCookie","disableCookie"],o.setAndDefer=function(e,t){e[t]=function(){e.push([t].concat(Array.prototype.slice.call(arguments,0)))}};for(var r=0;r<o.methods.length;r++)o.setAndDefer(o,o.methods[r]);o.instance=function(e){for(var t=o._i[e]||[],a=0;a<o.methods.length;a++)o.setAndDefer(t,o.methods[a]);return t},o.load=function(e,t){var r="https://analytics.tiktok.com/i18n/pixel/events.js";o._i=o._i||{},o._i[e]=[],o._i[e]._u=r,o._t=o._t||{},o._t[e]=+new Date,o._o=o._o||{},o._o[e]=t||{};var i=document.createElement("script");i.type="text/javascript",i.async=!0,i.src=r+"?sdkid="+e+"&lib="+a;var n=document.getElementsByTagName("script")[0];n.parentNode.insertBefore(i,n)},o.load(wpmDataLayer.pixels.tiktok.pixel_id),o.page()}(window,document,"ttq"),ttq.track("Browse"))}catch(e){console.error(e)}},e.getTikTokOrderItemIds=function(){let e=[];for(const[o,r]of Object.entries(wpmDataLayer.order.items)){var t,a;let o;o={content_type:"product",quantity:r.quantity,price:r.price},null!==(t=wpmDataLayer)&&void 0!==t&&null!==(a=t.general)&&void 0!==a&&a.variationsOutput&&0!==r.variation_id?(o.content_id=String(wpmDataLayer.products[r.variation_id].dyn_r_ids[wpmDataLayer.pixels.bing.dynamic_remarketing.id_type]),o.content_name=wpmDataLayer.products[r.variation_id].name,e.push(o)):(o.content_id=String(wpmDataLayer.products[r.id].dyn_r_ids[wpmDataLayer.pixels.bing.dynamic_remarketing.id_type]),o.content_name=wpmDataLayer.products[r.id].name,e.push(o))}return e}}(window.wpm=window.wpm||{},jQuery),jQuery(document).on("wpmLoadPixels",(function(){var e,t,a;!wpm.canIFire("ads","tiktok-ads")||null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.tiktok)&&void 0!==a&&a.loaded||wpm.loadTikTokPixel()})),jQuery(document).on("wpmAddToCart",(function(e,t){try{var a,o,r;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.tiktok)||void 0===r||!r.loaded)return;ttq.track("AddToCart",{content_id:t.dyn_r_ids[wpmDataLayer.pixels.tiktok.dynamic_remarketing.id_type],content_type:"product",content_name:t.name,quantity:t.quantity,value:t.price,currency:t.currency})}catch(e){console.error(e)}})),jQuery(document).on("wpmBeginCheckout",(function(e){try{var t,a,o;if(null===(t=wpmDataLayer)||void 0===t||null===(a=t.pixels)||void 0===a||null===(o=a.tiktok)||void 0===o||!o.loaded)return;ttq.track("InitiateCheckout")}catch(e){console.error(e)}})),jQuery(document).on("wpmViewItem",(function(e,t){try{var a,o,r;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.tiktok)||void 0===r||!r.loaded)return;ttq.track("ViewContent",{content_id:t.dyn_r_ids[wpmDataLayer.pixels.tiktok.dynamic_remarketing.id_type],content_type:"product",content_name:t.name,quantity:t.quantity,value:t.price,currency:t.currency})}catch(e){console.error(e)}})),jQuery(document).on("wpmAddToWishlist",(function(e,t){try{var a,o,r;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.tiktok)||void 0===r||!r.loaded)return;ttq.track("AddToWishlist",{content_id:t.dyn_r_ids[wpmDataLayer.pixels.tiktok.dynamic_remarketing.id_type],content_type:"product",content_name:t.name,quantity:t.quantity,value:t.price,currency:t.currency})}catch(e){console.error(e)}})),jQuery(document).on("wpmSearch",(function(){try{var e,t,a;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.tiktok)||void 0===a||!a.loaded)return;ttq.track("Search")}catch(e){console.error(e)}})),jQuery(document).on("wpmOrderReceivedPage",(function(){try{var e,t,a;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.tiktok)||void 0===a||!a.loaded)return;ttq.track(wpmDataLayer.pixels.tiktok.purchase_event_name,{value:wpmDataLayer.order.value_filtered,currency:wpmDataLayer.order.currency,contents:wpm.getTikTokOrderItemIds()})}catch(e){console.error(e)}}))},574:()=>{!function(e,t,a){e.loadTwitterPixel=function(){try{var e,t,a;null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.twitter)&&void 0!==a&&a.pixel_id&&(wpmDataLayer.pixels.twitter.loaded=!0,o=window,r=document,i="script",o.twq||(n=o.twq=function(){n.exe?n.exe.apply(n,arguments):n.queue.push(arguments)},n.version="1.1",n.queue=[],(l=r.createElement(i)).async=!0,l.src="//static.ads-twitter.com/uwt.js",(d=r.getElementsByTagName(i)[0]).parentNode.insertBefore(l,d)),twq("init",wpmDataLayer.pixels.twitter.pixel_id),twq("track","PageView"))}catch(o){console.error(o)}var o,r,i,n,l,d},e.twitterGetOrderContentIds=function(){let e=[];for(const[o,r]of Object.entries(wpmDataLayer.order.items)){var t,a;null!==(t=wpmDataLayer)&&void 0!==t&&null!==(a=t.general)&&void 0!==a&&a.variationsOutput&&0!==r.variation_id?e.push(String(wpmDataLayer.products[r.variation_id].dyn_r_ids[wpmDataLayer.pixels.twitter.dynamic_remarketing.id_type])):e.push(String(wpmDataLayer.products[r.id].dyn_r_ids[wpmDataLayer.pixels.twitter.dynamic_remarketing.id_type]))}return e}}(window.wpm=window.wpm||{},jQuery),jQuery(document).on("wpmLoadPixels",(function(){var e,t,a;!wpm.canIFire("ads","twitter-ads")||null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.pixels)&&void 0!==t&&null!==(a=t.twitter)&&void 0!==a&&a.loaded||wpm.loadTwitterPixel()})),jQuery(document).on("wpmAddToCart",(function(e,t){try{var a,o,r;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.twitter)||void 0===r||!r.loaded)return;twq("track","AddToCart")}catch(e){console.error(e)}})),jQuery(document).on("wpmViewItem",(function(e,t){try{var a,o,r;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.twitter)||void 0===r||!r.loaded)return;twq("track","ViewContent")}catch(e){console.error(e)}})),jQuery(document).on("wpmAddToWishlist",(function(e,t){try{var a,o,r;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.twitter)||void 0===r||!r.loaded)return;twq("track","AddToWishlist")}catch(e){console.error(e)}})),jQuery(document).on("wpmBeginCheckout",(function(e,t){try{var a,o,r;if(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.twitter)||void 0===r||!r.loaded)return;twq("track","InitiateCheckout")}catch(e){console.error(e)}})),jQuery(document).on("wpmSearch",(function(){try{var e,t,a;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.twitter)||void 0===a||!a.loaded)return;twq("track","Search")}catch(e){console.error(e)}})),jQuery(document).on("wpmOrderReceivedPage",(function(){try{var e,t,a;if(null===(e=wpmDataLayer)||void 0===e||null===(t=e.pixels)||void 0===t||null===(a=t.twitter)||void 0===a||!a.loaded)return;twq("track","Purchase",{order_id:wpmDataLayer.order.id,value:wpmDataLayer.order.value_filtered,currency:wpmDataLayer.order.currency,num_items:wpmDataLayer.order.quantity,content_ids:wpm.twitterGetOrderContentIds()})}catch(e){console.error(e)}}))},560:()=>{wpm.wpmDataLayerExists().then((function(){jQuery(document).trigger("wpmPreLoadPixels",{})})).then((function(){wpm.pageLoaded().then((function(){jQuery(document).trigger("wpmLoad",{})}))}))},230:()=>{!function(e,t,a){const o="_wpm_order_ids",r="_wpm_endpoint_available",i="/wp-json/";function n(){return""!==e.getCookie(o)}e.emailSelected=!1,e.paymentMethodSelected=!1,e.useRestEndpoint=function(){return e.isSessionStorageAvailable()&&e.isRestEndpointAvailable()&&e.isBelowRestErrorThreshold()},e.isBelowRestErrorThreshold=function(){return window.sessionStorage.getItem(0)<=10},e.isRestEndpointAvailable=function(){if(window.sessionStorage.getItem(r))return JSON.parse(window.sessionStorage.getItem(r));e.testEndpoint()},e.isSessionStorageAvailable=function(){return!!window.sessionStorage},e.testEndpoint=function(){let e=arguments.length>0&&arguments[0]!==a?arguments[0]:location.protocol+"//"+location.host+i,t=arguments.length>1&&arguments[1]!==a?arguments[1]:r;jQuery.ajax(e,{type:"HEAD",timeout:1e3,statusCode:{200:function(e){window.sessionStorage.setItem(t,JSON.stringify(!0))},404:function(e){window.sessionStorage.setItem(t,JSON.stringify(!1))},0:function(e){window.sessionStorage.setItem(t,JSON.stringify(!1))}}}).then((e=>{}))},e.isWpmRestEndpointAvailable=function(){let t=arguments.length>0&&arguments[0]!==a?arguments[0]:r;return!!e.getCookie(t)},e.writeOrderIdToStorage=function(t){if(window.Storage)if(null===localStorage.getItem(o)){let e=[];e.push(t),window.localStorage.setItem(o,JSON.stringify(e))}else{let e=JSON.parse(localStorage.getItem(o));e.includes(t)||(e.push(t),window.localStorage.setItem(o,JSON.stringify(e)))}else{let a=new Date;a.setDate(a.getDate()+365);let r=[];n()&&(r=JSON.parse(e.getCookie(o))),r.includes(t)||(r.push(t),document.cookie="_wpm_order_ids="+JSON.stringify(r)+";expires="+a.toUTCString())}"function"==typeof e.storeOrderIdOnServer&&wpmDataLayer.orderDeduplication&&e.storeOrderIdOnServer(t)},e.isOrderIdStored=function(t){return wpmDataLayer.orderDeduplication?window.Storage?null!==localStorage.getItem(o)&&JSON.parse(localStorage.getItem(o)).includes(t):!!n()&&JSON.parse(e.getCookie(o)).includes(t):(console.log("order duplication prevention: off"),!1)},e.isEmail=function(e){return/^(([^<>()\[\]\\.,;:\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,}))$/.test(e)},e.removeProductFromCart=function(t){let o=arguments.length>1&&arguments[1]!==a?arguments[1]:null;try{if(!t)throw Error("Wasn't able to retrieve a productId");if(!(t=getIdBasedOndVariationsOutputSetting(t)))throw Error("Wasn't able to retrieve a productId");let a;if(a=null==o?wpmDataLayer.cart[t].quantity:o,wpmDataLayer.cart[t]){let r=e.getProductDetailsFormattedForEvent(t,a);jQuery(document).trigger("wpmRemoveFromCart",r),null==o||wpmDataLayer.cart[t].quantity===o?(delete wpmDataLayer.cart[t],sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(wpmDataLayer.cart))):(wpmDataLayer.cart[t].quantity=wpmDataLayer.cart[t].quantity-a,sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(wpmDataLayer.cart)))}}catch(e){console.error(e)}},getIdBasedOndVariationsOutputSetting=function(e){try{var t,a;return null!==(t=wpmDataLayer)&&void 0!==t&&null!==(a=t.general)&&void 0!==a&&a.variationsOutput?e:wpmDataLayer.products[e].isVariation?wpmDataLayer.products[e].parentId:e}catch(e){console.error(e)}},e.addProductToCart=function(t,o){try{if(!t)throw Error("Wasn't able to retrieve a productId");if(!(t=getIdBasedOndVariationsOutputSetting(t)))throw Error("Wasn't able to retrieve a productId");if(wpmDataLayer.products[t]){let r=e.getProductDetailsFormattedForEvent(t,o);jQuery(document).trigger("wpmAddToCart",r),wpmDataLayer.cart!==a&&wpmDataLayer.cart[t]!==a?(wpmDataLayer.cart[t].quantity=wpmDataLayer.cart[t].quantity+o,sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(wpmDataLayer.cart))):wpmDataLayer.cart?(wpmDataLayer.cart[t]=e.getProductDetailsFormattedForEvent(t,o),sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(wpmDataLayer.cart))):(wpmDataLayer.cart={[t]:e.getProductDetailsFormattedForEvent(t,o)},sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(wpmDataLayer.cart)))}}catch(t){console.error(t),e.getCartItemsFromBackend()}},e.getCartItems=function(){sessionStorage?sessionStorage.getItem("wpmDataLayerCart")&&"order_received_page"!==wpmDataLayer.shop.page_type?e.saveCartObjectToDataLayer(JSON.parse(sessionStorage.getItem("wpmDataLayerCart"))):sessionStorage.setItem("wpmDataLayerCart",JSON.stringify({})):e.getCartItemsFromBackend()},e.getCartItemsFromBackend=function(){try{let t={action:"wpm_get_cart_items"};jQuery.ajax({type:"get",dataType:"json",url:e.ajax_url,data:t,success:function(t){t.cart||(t.cart={}),e.saveCartObjectToDataLayer(t.cart),sessionStorage&&sessionStorage.setItem("wpmDataLayerCart",JSON.stringify(t.cart))}})}catch(e){console.error(e)}},e.getProductsFromBackend=function(t){if((t=t.filter((e=>!wpmDataLayer.products.hasOwnProperty(e))))&&0!==t.length)try{let a={action:"wpm_get_product_ids",productIds:t};jQuery.ajax({type:"get",dataType:"json",url:e.ajax_url,data:a,success:function(e){wpmDataLayer.products=Object.assign({},wpmDataLayer.products,e)},error:function(e){console.log(e)}})}catch(e){console.error(e)}},e.saveCartObjectToDataLayer=function(e){wpmDataLayer.cart=e,wpmDataLayer.products=Object.assign({},wpmDataLayer.products,e)},e.fireCheckoutOption=function(e){let t=arguments.length>1&&arguments[1]!==a?arguments[1]:null,o=arguments.length>2&&arguments[2]!==a?arguments[2]:null,r={step:e,checkout_option:t,value:o};jQuery(document).trigger("wpmFireCheckoutOption",r)},e.fireCheckoutProgress=function(e){let t={step:e};jQuery(document).trigger("wpmFireCheckoutProgress",t)},e.getPostIdFromString=function(e){try{return e.match(/(post-)(\d+)/)[2]}catch(e){console.error(e)}},e.triggerViewItemList=function(t){if(!t)throw Error("Wasn't able to retrieve a productId");if(!(t=getIdBasedOndVariationsOutputSetting(t)))throw Error("Wasn't able to retrieve a productId");jQuery(document).trigger("wpmViewItemList",e.getProductDataForViewItemEvent(t))},e.getProductDataForViewItemEvent=function(t){if(!t)throw Error("Wasn't able to retrieve a productId");try{if(wpmDataLayer.products[t])return e.getProductDetailsFormattedForEvent(t)}catch(e){console.error(e)}},e.getMainProductIdFromProductPage=function(){try{return["simple","variable","grouped","composite","bundle"].indexOf(wpmDataLayer.shop.product_type)>=0&&jQuery(".wpmProductId:first").data("id")}catch(e){console.error(e)}},e.viewItemListTriggerTestMode=function(e){jQuery(e).css({position:"relative"}),jQuery(e).append('<div id="viewItemListTriggerOverlay"></div>'),jQuery(e).find("#viewItemListTriggerOverlay").css({"z-index":"10",display:"block",position:"absolute",height:"100%",top:"0",left:"0",right:"0",opacity:wpmDataLayer.viewItemListTrigger.opacity,"background-color":wpmDataLayer.viewItemListTrigger.backgroundColor})},e.getSearchTermFromUrl=function(){try{return new URLSearchParams(window.location.search).get("s")}catch(e){console.error(e)}};let l,d={};e.observerCallback=function(t,a){t.forEach((t=>{try{let o,r=jQuery(t.target).data("ioid");if(o=jQuery(t.target).next(".wpmProductId").length?jQuery(t.target).next(".wpmProductId").data("id"):jQuery(t.target).find(".wpmProductId").data("id"),!o)throw Error("wpmProductId element not found");t.isIntersecting?d[r]=setTimeout((()=>{e.triggerViewItemList(o),wpmDataLayer.viewItemListTrigger.testMode&&e.viewItemListTriggerTestMode(t.target),!1===wpmDataLayer.viewItemListTrigger.repeat&&a.unobserve(t.target)}),wpmDataLayer.viewItemListTrigger.timeout):(clearTimeout(d[r]),wpmDataLayer.viewItemListTrigger.testMode&&jQuery(t.target).find("#viewItemListTriggerOverlay").remove())}catch(e){console.error(e)}}))};let s,c=0;e.startIntersectionObserverToWatch=function(){try{new URLSearchParams(window.location.search).has("vildemomode")&&(wpmDataLayer.viewItemListTrigger.testMode=!0),l=new IntersectionObserver(e.observerCallback,{threshold:wpmDataLayer.viewItemListTrigger.threshold}),s=jQuery(".wpmProductId").map((function(e,t){return jQuery(t).parent().hasClass("type-product")||jQuery(t).parent().hasClass("product")||jQuery(t).parent().hasClass("product-item-inner")?jQuery(t).parent():jQuery(t).prev().hasClass("wc-block-grid__product")||jQuery(t).prev().hasClass("product")||jQuery(t).prev().hasClass("product-small")||jQuery(t).prev().hasClass("woocommerce-LoopProduct-link")?jQuery(this).prev():jQuery(t).closest(".product").length?jQuery(t).closest(".product"):void 0})),s.each((function(e,t){jQuery(t[0]).data("ioid",c++),l.observe(t[0])}))}catch(e){console.error(e)}},e.startProductsMutationObserverToWatch=function(){try{let e=jQuery(".wpmProductId:eq(0)").parents().has(jQuery(".wpmProductId:eq(1)").parents()).first();e.length&&u.observe(e[0],{attributes:!0,childList:!0,characterData:!0})}catch(e){console.error(e)}};let u=new MutationObserver((function(e){e.forEach((function(e){let t=e.addedNodes;null!==t&&jQuery(t).each((function(){(jQuery(this).hasClass("type-product")||jQuery(this).hasClass("product-small")||jQuery(this).hasClass("wc-block-grid__product"))&&p(this)&&(jQuery(this).data("ioid",c++),l.observe(this))}))}))})),p=function(e){return!(!jQuery(e).find(".wpmProductId").length&&!jQuery(e).siblings(".wpmProductId").length)};e.setCookie=function(e){let t=arguments.length>1&&arguments[1]!==a?arguments[1]:"",o=arguments.length>2&&arguments[2]!==a?arguments[2]:null;if(o){let a=new Date;a.setTime(a.getTime()+24*o*60*60*1e3);let r="expires="+a.toUTCString();document.cookie=e+"="+t+";"+r+";path=/"}else document.cookie=e+"="+t+";path=/"},e.getCookie=function(e){let t=e+"=",a=decodeURIComponent(document.cookie).split(";");for(let e=0;e<a.length;e++){let o=a[e];for(;" "==o.charAt(0);)o=o.substring(1);if(0==o.indexOf(t))return o.substring(t.length,o.length)}return""},e.getWpmSessionData=function(){if(window.sessionStorage){let e=window.sessionStorage.getItem("_wpm");return null!==e?JSON.parse(e):{}}return{}},e.setWpmSessionData=function(e){window.sessionStorage&&window.sessionStorage.setItem("_wpm",JSON.stringify(e))},e.storeOrderIdOnServer=function(t){try{let a={action:"wpm_purchase_pixels_fired",order_id:t,nonce:e.nonce};jQuery.ajax({type:"post",dataType:"json",url:e.ajax_url,data:a,success:function(e){!1===e.success&&console.log(e)},error:function(e){console.log(e)}})}catch(e){console.error(e)}},e.getProductIdByCartItemKeyUrl=function(e){let t=new URLSearchParams(e.search).get("remove_item"),a=null;return a=0===wpmDataLayer.cartItemKeys[t].variation_id?wpmDataLayer.cartItemKeys[t].product_id:wpmDataLayer.cartItemKeys[t].variation_id,a},e.getAddToCartLinkProductIds=function(){return jQuery("a").map((function(){let e=jQuery(this).attr("href");if(e&&e.includes("?add-to-cart=")){let t=e.match(/(add-to-cart=)(\d+)/);if(t)return t[2]}})).get()},e.getProductDetailsFormattedForEvent=function(e){let t=arguments.length>1&&arguments[1]!==a?arguments[1]:1,o={id:e.toString(),dyn_r_ids:wpmDataLayer.products[e].dyn_r_ids,name:wpmDataLayer.products[e].name,list_name:wpmDataLayer.shop.list_name,brand:wpmDataLayer.products[e].brand,category:wpmDataLayer.products[e].category,variant:wpmDataLayer.products[e].variant,list_position:wpmDataLayer.products[e].position,quantity:t,price:wpmDataLayer.products[e].price,currency:wpmDataLayer.shop.currency,isVariable:wpmDataLayer.products[e].isVariable,isVariation:wpmDataLayer.products[e].isVariation,parentId:wpmDataLayer.products[e].parentId};return o.isVariation&&(o.parentId_dyn_r_ids=wpmDataLayer.products[e].parentId_dyn_r_ids),o},e.setReferrerToCookie=function(){e.getCookie("wpmReferrer")||e.setCookie("wpmReferrer",document.referrer)},e.getReferrerFromCookie=function(){return e.getCookie("wpmReferrer")?e.getCookie("wpmReferrer"):null},e.getClidFromBrowser=function(){let t,o=arguments.length>0&&arguments[0]!==a?arguments[0]:"gclid";return t={gclid:"_gcl_aw",dclid:"_gcl_dc"},e.getCookie(t[o])?e.getCookie(t[o]).match(/(GCL.[\d]*.)(.*)/)[2]:""},e.getUserAgent=function(){return navigator.userAgent},e.getViewPort=function(){return{width:Math.max(document.documentElement.clientWidth||0,window.innerWidth||0),height:Math.max(document.documentElement.clientHeight||0,window.innerHeight||0)}};let m=function(){let t=e.getCookie("cmplz_statistics"),a=e.getCookie("cmplz_marketing");return!(!e.getCookie("cmplz_consent_status")&&!e.getCookie("cmplz_banner-status"))&&{analytics:"allow"===t,ads:"allow"===a,visitorHasChosen:!0}},y=function(){let t=e.getCookie("cookielawinfo-checkbox-analytics"),a=e.getCookie("cookielawinfo-checkbox-advertisement"),o=e.getCookie("CookieLawInfoConsent");return!(!t&&!a)&&{analytics:"yes"===t,ads:"yes"===a,visitorHasChosen:!!o}},g={categories:{},pixels:[],mode:"category",visitorHasChosen:!1};e.getConsentValues=function(){return g},e.setConsentValueCategories=function(){let e=arguments.length>0&&arguments[0]!==a&&arguments[0],t=arguments.length>1&&arguments[1]!==a&&arguments[1];g.categories.analytics=e,g.categories.ads=t},e.updateConsentCookieValues=function(){let t,o=arguments.length>0&&arguments[0]!==a&&arguments[0];if(t=e.getCookie("CookieConsent"))t=decodeURI(t),g.categories.analytics=t.indexOf("statistics:true")>=0,g.categories.ads=t.indexOf("marketing:true")>=0,g.visitorHasChosen=!0;else if(t=e.getCookie("CookieScriptConsent"))t=JSON.parse(t),"reject"===t.action?(g.categories.analytics=!1,g.categories.ads=!1):2===t.categories.length?(g.categories.analytics=!0,g.categories.ads=!0):(g.categories.analytics=t.categories.indexOf("performance")>=0,g.categories.ads=t.categories.indexOf("targeting")>=0),g.visitorHasChosen=!0;else if(t=e.getCookie("borlabs-cookie")){var r,i,n,l,d,s,c,u;t=decodeURI(t),t=JSON.parse(t),g.categories.analytics=!(null===(r=t)||void 0===r||null===(i=r.consents)||void 0===i||!i.statistics),g.categories.ads=!(null===(n=t)||void 0===n||null===(l=n.consents)||void 0===l||!l.marketing),g.visitorHasChosen=!0,g.pixels=[...(null===(d=t)||void 0===d||null===(s=d.consents)||void 0===s?void 0:s.statistics)||[],...(null===(c=t)||void 0===c||null===(u=c.consents)||void 0===u?void 0:u.marketing)||[]],g.mode="pixel"}else(t=m())?(g.categories.analytics=!0===t.analytics,g.categories.ads=!0===t.ads,g.visitorHasChosen=t.visitorHasChosen):(t=e.getCookie("cookie_notice_accepted"))?(g.categories.analytics=!0,g.categories.ads=!0,g.visitorHasChosen=!0):(t=e.getCookie("hu-consent"))?(t=JSON.parse(t),g.categories.analytics=!!t.categories[3],g.categories.ads=!!t.categories[4],g.visitorHasChosen=!0):(t=y())?(g.categories.analytics=!0===t.analytics,g.categories.ads=!0===t.ads,g.visitorHasChosen=!0===t.visitorHasChosen):(t=e.getCookie("moove_gdpr_popup"))?(t=JSON.parse(t),g.categories.analytics="1"===t.thirdparty,g.categories.ads="1"===t.advanced,g.visitorHasChosen=!0):(g.categories.analytics=!o,g.categories.ads=!o)},e.updateConsentCookieValues(),e.setConsentDefaultValuesToExplicit=function(){g.categories={analytics:!1,ads:!1}},e.canIFire=function(e,t){return"category"===g.mode?!!g.categories[e]:"pixel"===g.mode?g.pixels.includes(t):(console.error("Couldn't find a valid consent mode in wpmConsentValues"),!1)},e.scriptTagObserver=new MutationObserver((a=>{a.forEach((a=>{let{addedNodes:o}=a;[...o].forEach((a=>{t(a).data("wpm-cookie-category")&&(e.shouldScriptBeActive(a)?e.unblockScript(a):e.blockScript(a))}))}))})),e.scriptTagObserver.observe(document.head,{childList:!0,subtree:!0}),window.addEventListener("DOMContentLoaded",(()=>e.scriptTagObserver.disconnect())),e.shouldScriptBeActive=function(e){var a,o,r,i;return!((wpmDataLayer.shop.cookie_consent_mgmt.explicit_consent||g.visitorHasChosen)&&("category"!==g.mode||!t(e).data("wpm-cookie-category").split(",").some((e=>g.categories[e])))&&("pixel"!==g.mode||!g.pixels.includes(t(e).data("wpm-pixel-name")))&&("pixel"!==g.mode||"google"!==t(e).data("wpm-pixel-name")||!["google-analytics","google-ads"].some((e=>g.pixels.includes(e))))&&(null===(a=wpmDataLayer)||void 0===a||null===(o=a.pixels)||void 0===o||null===(r=o.google)||void 0===r||null===(i=r.consent_mode)||void 0===i||!i.active||"google"!==t(e).data("wpm-pixel-name")))},e.unblockScript=function(e){let o=arguments.length>1&&arguments[1]!==a&&arguments[1];o&&t(e).remove();let r=t(e).data("wpm-src");r&&t(e).attr("src",r),e.type="text/javascript",o&&t(e).appendTo("head"),jQuery(document).trigger("wpmPreLoadPixels",{})},e.blockScript=function(e){let o=arguments.length>1&&arguments[1]!==a&&arguments[1];o&&t(e).remove(),t(e).attr("src")&&t(e).removeAttr("src"),e.type="blocked/javascript",o&&t(e).appendTo("head")},e.unblockAllScripts=function(){let o=!(arguments.length>0&&arguments[0]!==a)||arguments[0],r=!(arguments.length>1&&arguments[1]!==a)||arguments[1];t.each(t('script[type="blocked/javascript"]'),(function(a,i){(t(i).data("wpm-cookie-category").includes("analytics")&&o||t(i).data("wpm-cookie-category").includes("ads")&&r)&&e.unblockScript(i,!0)})),jQuery(document).trigger("wpmPreLoadPixels",{})},e.unblockSelectedPixels=function(){t.each(t('script[type="blocked/javascript"]'),(function(a,o){(g.pixels.includes(t(o).data("wpm-pixel-name"))||"google"===t(o).data("wpm-pixel-name")&&["google-analytics","google-ads"].some((e=>g.pixels.includes(e))))&&e.unblockScript(o,!0)})),jQuery(document).trigger("wpmPreLoadPixels",{})},window.addEventListener("borlabs-cookie-consent-saved",(function(t){e.updateConsentCookieValues(),"pixel"===g.mode?(e.unblockSelectedPixels(),e.updateGoogleConsentMode(g.pixels.includes("google-analytics"),g.pixels.includes("google-ads"))):(e.unblockAllScripts(g.categories.analytics,g.categories.ads),e.updateGoogleConsentMode(g.categories.analytics,g.categories.ads))})),window.addEventListener("CookiebotOnAccept",(function(t){Cookiebot.consent.statistics&&(g.categories.analytics=!0),Cookiebot.consent.marketing&&(g.categories.ads=!0),e.unblockAllScripts(g.categories.analytics,g.categories.ads),e.updateGoogleConsentMode(g.categories.analytics,g.categories.ads)}),!1),window.addEventListener("CookieScriptAccept",(function(t){t.detail.categories.includes("performance")&&(g.categories.analytics=!0),t.detail.categories.includes("targeting")&&(g.categories.ads=!0),e.unblockAllScripts(g.categories.analytics,g.categories.ads),e.updateGoogleConsentMode(g.categories.analytics,g.categories.ads)})),window.addEventListener("CookieScriptAcceptAll",(function(t){e.unblockAllScripts(!0,!0),e.updateGoogleConsentMode(!0,!0)})),document.addEventListener("cmplzStatusChange",(function(t){e.updateConsentCookieValues(),e.unblockAllScripts(g.categories.analytics,g.categories.ads),e.updateGoogleConsentMode(g.categories.analytics,g.categories.ads)})),document.addEventListener("setCookieNotice",(function(t){e.updateConsentCookieValues(),e.unblockAllScripts(g.categories.analytics,g.categories.ads),e.updateGoogleConsentMode(g.categories.analytics,g.categories.ads)})),e.huObserver=new MutationObserver((function(t){t.forEach((t=>{let{addedNodes:a}=t;[...a].forEach((t=>{"hu"===t.id&&jQuery(".hu-cookies-save").on("click",(function(t){e.updateConsentCookieValues(),e.unblockAllScripts(g.categories.analytics,g.categories.ads),e.updateGoogleConsentMode(g.categories.analytics,g.categories.ads)}))}))}))})),window.hu&&e.huObserver.observe(document.documentElement||document.body,{childList:!0,subtree:!0}),e.version=function(){console.log(wpmDataLayer.version)},e.loadScriptAndCacheIt=function(e,t){return t=jQuery.extend(t||{},{dataType:"script",cache:!0,url:e}),jQuery.ajax(t)},e.getOrderItemPrice=function(e){return(e.total+e.total_tax)/e.quantity},e.hasLoginEventFired=function(){let t=e.getWpmSessionData();return null==t?void 0:t.loginEventFired},e.setLoginEventFired=function(){let t=e.getWpmSessionData();t.loginEventFired=!0,e.setWpmSessionData(t)},e.wpmDataLayerExists=function(){return new Promise((function(e){!function t(){if("undefined"!=typeof wpmDataLayer)return e();setTimeout(t,50)}()}))},e.pageLoaded=function(){return new Promise((function(e){!function t(){if("complete"===document.readyState)return e();setTimeout(t,50)}()}))},window.wpmLoaded={}}(window.wpm=window.wpm||{},jQuery),jQuery((function(){wpm.wpmDataLayerExists().then((function(){wpm.startIntersectionObserverToWatch(),wpm.startProductsMutationObserverToWatch()}))})),jQuery(document).on("click",".remove_from_cart_button, .remove",(function(e){try{let e=new URL(jQuery(this).attr("href")),t=wpm.getProductIdByCartItemKeyUrl(e);wpm.removeProductFromCart(t)}catch(e){console.error(e)}})),jQuery(document).on("click",".add_to_cart_button:not(.product_type_variable), .ajax_add_to_cart, .single_add_to_cart_button",(function(e){try{if("product"===wpmDataLayer.shop.page_type){if(void 0!==jQuery(this).attr("href")&&jQuery(this).attr("href").includes("add-to-cart")){let e=1,t=jQuery(this).data("product_id");wpm.addProductToCart(t,e)}else if("simple"===wpmDataLayer.shop.product_type){let e=Number(jQuery(".input-text.qty").val());e||0===e||(e=1);let t=jQuery(this).val();wpm.addProductToCart(t,e)}else if("variable"===wpmDataLayer.shop.product_type){let e=Number(jQuery(".input-text.qty").val());e||0===e||(e=1);let t=jQuery("[name='variation_id']").val();wpm.addProductToCart(t,e)}else if("grouped"===wpmDataLayer.shop.product_type)jQuery(".woocommerce-grouped-product-list-item").each((function(){let e=Number(jQuery(this).find(".input-text.qty").val());e||0===e||(e=1);let t=jQuery(this).attr("class"),a=wpm.getPostIdFromString(t);wpm.addProductToCart(a,e)}));else if("bundle"===wpmDataLayer.shop.product_type){let e=Number(jQuery(".input-text.qty").val());e||0===e||(e=1);let t=jQuery("input[name=add-to-cart]").val();wpm.addProductToCart(t,e)}}else{let e=1,t=jQuery(this).data("product_id");wpm.addProductToCart(t,e)}}catch(e){console.error(e)}})),jQuery(document).one("click","a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)",(function(e){try{if(jQuery(e.target).closest("a").attr("href")){let t=jQuery(e.target).closest("a").attr("href");if(t.includes("add-to-cart=")){let e=t.match(/(add-to-cart=)(\d+)/);e&&wpm.addProductToCart(e[2],1)}}}catch(e){console.error(e)}})),jQuery(document).on("click",".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product",(function(e){try{let e=jQuery(this).nextAll(".wpmProductId:first").data("id");if(e){if(e=getIdBasedOndVariationsOutputSetting(e),!e)throw Error("Wasn't able to retrieve a productId");if(wpmDataLayer.products&&wpmDataLayer.products[e]){let t=wpm.getProductDetailsFormattedForEvent(e);jQuery(document).trigger("wpmSelectContentGaUa",t),jQuery(document).trigger("wpmSelectItem",t)}}}catch(e){console.error(e)}})),jQuery(document).one("click",".checkout-button, .cart-checkout-button, .button.checkout",(function(e){jQuery(document).trigger("wpmBeginCheckout")})),jQuery(document).on("input","#billing_email",(function(){wpm.isEmail(jQuery(this).val())&&(wpm.fireCheckoutProgress(2),wpm.emailSelected=!0)})),jQuery(document).on("click",".wc_payment_methods",(function(){!1===wpm.paymentMethodSelected&&wpm.fireCheckoutProgress(3),wpm.fireCheckoutOption(3,jQuery("input[name='payment_method']:checked").val()),wpm.paymentMethodSelected=!0})),jQuery(document).one("click","#place_order",(function(){!1===wpm.emailSelected&&wpm.fireCheckoutProgress(2),!1===wpm.paymentMethodSelected&&(wpm.fireCheckoutProgress(3),wpm.fireCheckoutOption(3,jQuery("input[name='payment_method']:checked").val())),wpm.fireCheckoutProgress(4)})),jQuery(document).on("click","[name='update_cart']",(function(e){try{jQuery(".cart_item").each((function(){let e=new URL(jQuery(this).find(".product-remove").find("a").attr("href")),t=wpm.getProductIdByCartItemKeyUrl(e),a=jQuery(this).find(".qty").val();0===a?wpm.removeProductFromCart(t):a<wpmDataLayer.cart[t].quantity?wpm.removeProductFromCart(t,wpmDataLayer.cart[t].quantity-a):a>wpmDataLayer.cart[t].quantity&&wpm.addProductToCart(t,a-wpmDataLayer.cart[t].quantity)}))}catch(e){console.error(e),wpm.getCartItemsFromBackend()}})),jQuery(document).on("click",".add_to_wishlist, .wl-add-to",(function(){try{let e;if(jQuery(this).data("productid")?e=jQuery(this).data("productid"):jQuery(this).data("product-id")&&(e=jQuery(this).data("product-id")),!e)throw Error("Wasn't able to retrieve a productId");let t=wpm.getProductDetailsFormattedForEvent(e);jQuery(document).trigger("wpmAddToWishlist",t)}catch(e){console.error(e)}})),jQuery(document).on("updated_cart_totals",(function(){jQuery(document).trigger("wpmViewCart")})),jQuery(window).on("wpmLoad",(function(){try{JSON.parse(sessionStorage.getItem("wpmMiniCartActive"))&&JSON.parse(sessionStorage.getItem("wpmFirstPageLoad"))&&!0===wpmDataLayer.shop.mini_cart.track?wpm.getCartItems():sessionStorage.setItem("wpmFirstPageLoad",JSON.stringify(!0))}catch(e){console.error(e)}})),jQuery(window).on("wpmLoad",(function(){wpmDataLayer.products=wpmDataLayer.products||{};let e=wpm.getAddToCartLinkProductIds();wpm.getProductsFromBackend(e)})),jQuery(window).on("wpmLoad",(function(){if(!wpm.getCookie("wpmReferrer"))if(document.referrer){let e=new URL(document.referrer).hostname;e!==window.location.host?wpm.setCookie("wpmReferrer",e):wpm.setCookie("wpmReferrer","")}else wpm.setCookie("wpmReferrer","")})),jQuery(window).on("wpmLoad",(function(){try{var e;if("undefined"!=typeof wpmDataLayer&&(null===(e=wpmDataLayer)||void 0===e||!e.wpmLoadFired)){var t,a;if(jQuery(document).trigger("wpmLoadAlways"),"product"===wpmDataLayer.shop.page_type&&"variable"!==wpmDataLayer.shop.product_type&&wpm.getMainProductIdFromProductPage()){let e=wpm.getProductDataForViewItemEvent(wpm.getMainProductIdFromProductPage());jQuery(document).trigger("wpmViewItem",e)}else"product_category"===wpmDataLayer.shop.page_type?jQuery(document).trigger("wpmCategory"):"search"===wpmDataLayer.shop.page_type?jQuery(document).trigger("wpmSearch"):"cart"===wpmDataLayer.shop.page_type?jQuery(document).trigger("wpmViewCart"):"order_received_page"===wpmDataLayer.shop.page_type&&wpmDataLayer.order?wpm.isOrderIdStored(wpmDataLayer.order.id)||(jQuery(document).trigger("wpmOrderReceivedPage"),wpm.writeOrderIdToStorage(wpmDataLayer.order.id)):jQuery(document).trigger("wpmEverywhereElse");null!==(t=wpmDataLayer)&&void 0!==t&&null!==(a=t.user)&&void 0!==a&&a.id&&!wpm.hasLoginEventFired()&&(jQuery(document).trigger("wpmLogin"),wpm.setLoginEventFired()),jQuery(document).ajaxSend((function(e,t,a){a.url.includes("get_refreshed_fragments")&&sessionStorage&&(sessionStorage.getItem("wpmMiniCartActive")||sessionStorage.setItem("wpmMiniCartActive",JSON.stringify(!0)))})),wpmDataLayer.wpmLoadFired=!0}}catch(e){console.error(e)}})),jQuery(window).on("wpmPreLoadPixels",(function(){var e,t,a;null!==(e=wpmDataLayer)&&void 0!==e&&null!==(t=e.shop)&&void 0!==t&&null!==(a=t.cookie_consent_mgmt)&&void 0!==a&&a.explicit_consent&&wpm.updateConsentCookieValues(!0),jQuery(document).trigger("wpmLoadPixels",{})})),jQuery((function(){jQuery(".single_variation_wrap").on("show_variation",(function(e,t){try{let e=getIdBasedOndVariationsOutputSetting(t.variation_id);if(!e)throw Error("Wasn't able to retrieve a productId");if(wpmDataLayer.products&&wpmDataLayer.products[e]){let t=wpm.getProductDetailsFormattedForEvent(e);jQuery(document).trigger("wpmViewItem",t)}}catch(e){console.error(e)}}))}))},514:()=>{window.wpm=window.wpm||{},jQuery}},t={};function a(o){var r=t[o];if(void 0!==r)return r.exports;var i=t[o]={exports:{}};return e[o](i,i.exports,a),i.exports}a(230),a(514),a(385),a(577),a(354),a(464),a(234),a(785),a(570),a(497),a(271),a(172),a(657),a(986),a(699),a(317),a(623),a(574),a(403),a(560)})();
2
+ //# sourceMappingURL=wpm-public__premium_only.p1.min.js.map
js/public/wpm-public__premium_only.p1.min.js.map ADDED
@@ -0,0 +1 @@
 
1
+ {"version":3,"file":"wpm-public__premium_only.p1.min.js","mappings":"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","sources":["webpack://WooCommerce-Pixel-Manager/./src/js/public/facebook.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/facebook__premium_only.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google-ads.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google-ads__premium_only.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google-ga-4-eec__premium_only.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google-ga-4.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google-ga-ua-eec__premium_only.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google-ga-ua.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google-optimize.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/google__premium_only.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/hotjar.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/microsoft-ads__premium_only.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/pinterest__premium_only.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/snapchat__premium_only.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/tiktok__premium_only.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/twitter__premium_only.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/wpm-loader.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/wpm.js","webpack://WooCommerce-Pixel-Manager/./src/js/public/wpm__premium_only.js","webpack://WooCommerce-Pixel-Manager/webpack/bootstrap","webpack://WooCommerce-Pixel-Manager/./src/js/public/main-premium.js"],"sourcesContent":["/**\n * Add functions for Facebook\n * */\n\n(function (wpm, $, undefined) {\n\n\tlet fBUserData\n\n\twpm.loadFacebookPixel = function () {\n\n\t\ttry {\n\t\t\tif (wpmDataLayer?.pixels?.facebook?.pixel_id) {\n\n\t\t\t\twpmDataLayer.pixels.facebook.loaded = true\n\n\t\t\t\t// @formatter:off\n \t\t\t!function(f,b,e,v,n,t,s)\n \t\t\t{if(f.fbq)return;n=f.fbq=function(){n.callMethod?\n \t\t\t\tn.callMethod.apply(n,arguments):n.queue.push(arguments)};\n \t\t\t\tif(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';\n \t\t\t\tn.queue=[];t=b.createElement(e);t.async=!0;\n \t\t\t\tt.src=v;s=b.getElementsByTagName(e)[0];\n \t\t\t\ts.parentNode.insertBefore(t,s)}(window, document,'script',\n \t\t\t\t'https://connect.facebook.net/en_US/fbevents.js');\n \t\t\t// @formatter:on\n\n\t\t\t\tfbq(\"init\", wpmDataLayer.pixels.facebook.pixel_id)\n\t\t\t\tfbq(\"track\", \"PageView\")\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.getRandomEventId = function () {\n\t\treturn (Math.random() + 1).toString(36).substring(2)\n\t}\n\n\twpm.getFbUserData = function () {\n\t\t// We need the first one for InitiateCheckout\n\t\t// where getting the user_data from the browser is too slow\n\t\t// using wpm.getCookie(), so we cache the user_data earlier.\n\t\t// And we need the second one because the ViewContent hit happens too fast\n\t\t// after adding a variation to the cart because the function to cache\n\t\t// the user_data is too slow. But we can get the user_data using wpm.getCookie()\n\t\t// because we don't move away from the page and can wait for the browser\n\t\t// to get it.\n\t\tif (fBUserData) {\n\t\t\treturn fBUserData\n\t\t} else {\n\t\t\treturn wpm.getFbUserDataFromBrowser()\n\t\t}\n\t}\n\n\twpm.setFbUserData = function () {\n\t\tfBUserData = wpm.getFbUserDataFromBrowser()\n\t}\n\n\twpm.getFbUserDataFromBrowser = function () {\n\t\treturn {\n\t\t\tfbp : wpm.getCookie(\"_fbp\"),\n\t\t\tfbc : wpm.getCookie(\"_fbc\"),\n\t\t\tclient_user_agent: navigator.userAgent,\n\t\t}\n\t}\n\n\twpm.fbViewContent = function (product) {\n\n\t\ttry {\n\t\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\t\tlet eventId = wpm.getRandomEventId()\n\n\t\t\tfbq(\"track\", \"ViewContent\", {\n\t\t\t\tcontent_type: \"product\",\n\t\t\t\tcontent_name: product.name,\n\t\t\t\t// content_category: product.category,\n\t\t\t\tcontent_ids: product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\t\tcurrency : wpmDataLayer.shop.currency,\n\t\t\t\tvalue : product.price,\n\t\t\t}, {\n\t\t\t\teventID: eventId,\n\t\t\t})\n\n\t\t\tproduct[\"currency\"] = wpmDataLayer.shop.currency\n\n\t\t\tjQuery(document).trigger(\"wpmFbCapiEvent\", {\n\t\t\t\tevent_name : \"ViewContent\",\n\t\t\t\tevent_id : eventId,\n\t\t\t\tuser_data : wpm.getFbUserData(),\n\t\t\t\tproduct_data : product,\n\t\t\t\tproduct_id : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\t\tevent_source_url: window.location.href,\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.facebookContentIds = function () {\n\t\tlet prodIds = []\n\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {\n\t\t\t\tprodIds.push(String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type]))\n\t\t\t} else {\n\t\t\t\tprodIds.push(String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type]))\n\t\t\t}\n\t\t}\n\n\t\treturn prodIds\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery));\n\n\n/**\n * Execute as soon as possible\n * */\n\n(function () {\n\n\tjQuery(document).on(\"wpmLoadPixels\", function () {\n\n\t\tif (wpm.canIFire(\"ads\", \"facebook-ads\") && !wpmDataLayer?.pixels?.facebook?.loaded) wpm.loadFacebookPixel()\n\n\t})\n\n})()\n\n\n/**\n * All event listeners\n * */\n\n// AddToCart event\njQuery(document).on(\"wpmAddToCart\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\tlet eventId = wpm.getRandomEventId()\n\n\t\t// console.log('eventId: ' + eventId);\n\n\t\tfbq(\"track\", \"AddToCart\", {\n\t\t\tcontent_type: \"product\",\n\t\t\tcontent_name: product.name,\n\t\t\tcontent_ids : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\tvalue : parseFloat(product.quantity * product.price),\n\t\t\tcurrency : product.currency,\n\t\t}, {\n\t\t\teventID: eventId,\n\t\t})\n\n\n\t\tproduct[\"currency\"] = wpmDataLayer.shop.currency\n\n\t\tjQuery(document).trigger(\"wpmFbCapiEvent\", {\n\t\t\tevent_name : \"AddToCart\",\n\t\t\tevent_id : eventId,\n\t\t\tuser_data : wpm.getFbUserData(),\n\t\t\tproduct_data : product,\n\t\t\tproduct_id : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\tevent_source_url: window.location.href,\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// InitiateCheckout event\njQuery(document).on(\"wpmBeginCheckout\", function (event) {\n\n\ttry {\n\t\t// console.log('firing facebook ads InitiateCheckout event');\n\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\tlet eventId = wpm.getRandomEventId()\n\n\t\tfbq(\"track\", \"InitiateCheckout\", {}, {\n\t\t\teventID: eventId,\n\t\t})\n\n\t\tjQuery(document).trigger(\"wpmFbCapiEvent\", {\n\t\t\tevent_name : \"InitiateCheckout\",\n\t\t\tevent_id : eventId,\n\t\t\tuser_data : wpm.getFbUserData(),\n\t\t\tevent_source_url: window.location.href,\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// AddToWishlist event\njQuery(document).on(\"wpmAddToWishlist\", function (event, product) {\n\n\ttry {\n\t\t// console.log('firing facebook ads AddToWishlist event');\n\t\t// console.log(product);\n\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\tlet eventId = wpm.getRandomEventId()\n\n\t\tfbq(\"track\", \"AddToWishlist\", {\n\t\t\tcontent_type: \"product\",\n\t\t\tcontent_name: product.name,\n\t\t\tcontent_ids : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\tvalue : parseFloat(product.quantity * product.price),\n\t\t\tcurrency : product.currency,\n\t\t}, {\n\t\t\teventID: eventId,\n\t\t})\n\n\n\t\tproduct[\"currency\"] = wpmDataLayer.shop.currency\n\n\t\tjQuery(document).trigger(\"wpmFbCapiEvent\", {\n\t\t\tevent_name : \"AddToWishlist\",\n\t\t\tevent_id : eventId,\n\t\t\tuser_data : wpm.getFbUserData(),\n\t\t\tproduct_data : product,\n\t\t\tproduct_id : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\tevent_source_url: window.location.href,\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// ViewContent event\njQuery(document).on(\"wpmViewItem\", function (event, product) {\n\n\ttry {\n\t\t// console.log('firing facebook ads ViewContent event');\n\t\t// console.log(product);\n\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\twpm.fbViewContent(product)\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view search event\njQuery(document).on(\"wpmSearch\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\tlet eventId = wpm.getRandomEventId()\n\n\t\tfbq(\"track\", \"Search\", {}, {\n\t\t\teventID: eventId,\n\t\t})\n\n\t\tjQuery(document).trigger(\"wpmFbCapiEvent\", {\n\t\t\tevent_name : \"Search\",\n\t\t\tevent_id : eventId,\n\t\t\tuser_data : wpm.getFbUserData(),\n\t\t\tevent_source_url: window.location.href,\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// load always event\njQuery(document).on(\"wpmLoadAlways\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\twpm.setFbUserData()\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view order received page event\n// https://developers.pinterest.com/docs/tag/conversion/\njQuery(document).on(\"wpmOrderReceivedPage\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\tfbq(\"track\", \"Purchase\",\n\t\t\t{\n\t\t\t\tcontent_type: \"product\",\n\t\t\t\tvalue : wpmDataLayer.order.value_filtered,\n\t\t\t\tcurrency : wpmDataLayer.order.currency,\n\t\t\t\tcontent_ids : wpm.facebookContentIds(),\n\t\t\t},\n\t\t\t{eventID: wpmDataLayer.order.id},\n\t\t)\n\n\n\t\t// console.log(wpm.facebookContentIds())\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n","/**\n * Add functions for Facebook (pro)\n * */\n\n(function (wpm, $, undefined) {\n\n\twpm.setFacebookIdentifiersOnServer = function () {\n\n\t\ttry {\n\n\t\t\t// get first party cookies fbp and fbc\n\n\t\t\t// send the cookies to the server in order to save them on the session\n\n\t\t\tlet data = {\n\t\t\t\taction: \"wpm_facebook_set_session_identifiers\",\n\t\t\t\t// nonce : wpm_facebook_premium_only_ajax_object.nonce,\n\t\t\t\tnonce: wpm.nonce,\n\t\t\t\tfbp : wpm.getCookie(\"_fbp\"),\n\t\t\t\tfbc : wpm.getCookie(\"_fbc\"),\n\t\t\t}\n\n\t\t\tif (data.fbp && window.sessionStorage && window.sessionStorage.getItem(\"wpm_fb_session_id_\" + data.fbp + \"_set\")) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tjQuery.ajax(\n\t\t\t\t{\n\t\t\t\t\ttype : \"post\",\n\t\t\t\t\tdataType: \"json\",\n\t\t\t\t\t// url : wpm_facebook_premium_only_ajax_object.ajax_url,\n\t\t\t\t\turl : wpm.ajax_url,\n\t\t\t\t\tdata : data,\n\t\t\t\t\tsuccess: function (response) {\n\t\t\t\t\t\t// console.log(response);\n\n\t\t\t\t\t\tif (window.sessionStorage && response[\"success\"] === true) {\n\t\t\t\t\t\t\t// console.log('setting session storage');\n\t\t\t\t\t\t\twindow.sessionStorage.setItem(\"wpm_fb_session_id_\" + data.fbp + \"_set\", JSON.stringify(true))\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\terror : function (response) {\n\t\t\t\t\t\t// console.log(response);\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery))\n\n\n/**\n * All event listeners\n * */\n\n\n// add_to_cart event\njQuery(document).on(\"wpmAddToWishlist\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.facebook?.loaded) return\n\n\t\tfbq(\"track\", \"AddToWishlist\", {\n\t\t\tcontent_name : product.name,\n\t\t\tcontent_category: product.category,\n\t\t\tcontent_ids : product.dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type],\n\t\t\t// contents : \"\",\n\t\t\tcurrency: product.currency,\n\t\t\tvalue : product.price,\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\njQuery(document).on(\"wpmFbCapiEvent\", function (event, eventData) {\n\n\ttry {\n\t\tif (!wpmDataLayer.pixels.facebook.capi) return\n\n\t\t// save the state in the database\n\t\tlet data = {\n\t\t\taction: \"wpm_facebook_capi_event\",\n\t\t\tdata : eventData,\n\t\t\t// nonce : wpm_facebook_premium_only_ajax_object.nonce,\n\t\t\tnonce: wpm.nonce,\n\t\t}\n\n\t\tjQuery.ajax(\n\t\t\t{\n\t\t\t\ttype : \"post\",\n\t\t\t\tdataType: \"json\",\n\t\t\t\t// url : wpm_facebook_premium_only_ajax_object.ajax_url,\n\t\t\t\turl : wpm.ajax_url,\n\t\t\t\tdata : data,\n\t\t\t\tsuccess: function (msg) {\n\t\t\t\t\t// console.log(msg);\n\t\t\t\t},\n\t\t\t\terror : function (msg) {\n\t\t\t\t\t// console.log(msg);\n\t\t\t\t},\n\t\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n\njQuery(window).on(\"wpmLoadAlways\", function () {\n\n\ttry {\n\t\tif (wpmDataLayer?.pixels?.facebook?.pixel_id && wpmDataLayer.pixels.facebook.capi) {\n\n\t\t\t// We need to be sure that we capture the cid early enough, because the\n\t\t\t// shop might be using a one click checkout button as early as on the product page.\n\t\t\tif ([\"cart\", \"checkout\"].indexOf(wpmDataLayer.shop.page_type) >= 0) {\n\n\t\t\t\twpm.setFacebookIdentifiersOnServer()\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n","/**\n * Add functions for Google Ads\n * */\n\n(function (wpm, $, undefined) {\n\n\tlet conversionIdentifiers = []\n\n\twpm.getGoogleAdsConversionIdentifiersWithLabel = function () {\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds)) {\n\t\t\tconversionIdentifiers.push(key + \"/\" + item)\n\t\t}\n\t\treturn conversionIdentifiers\n\t}\n\n\twpm.getGoogleAdsConversionIdentifiers = function () {\n\n\t\tlet conversionIdentifiers = []\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds)) {\n\t\t\tconversionIdentifiers.push(key)\n\t\t}\n\n\t\treturn conversionIdentifiers\n\t}\n\n\twpm.getGoogleAdsRegularOrderItems = function () {\n\t\t// \"id\" : \"gla_34\",\n\t\t// \"quantity\": 1,\n\t\t// \"price\" : 45\n\n\t\tlet orderItems = []\n\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tlet orderItem\n\n\t\t\torderItem = {\n\t\t\t\tquantity: item.quantity,\n\t\t\t\tprice : item.price,\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type])\n\t\t\t\torderItems.push(orderItem)\n\t\t\t} else {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type])\n\t\t\t\torderItems.push(orderItem)\n\t\t\t}\n\t\t}\n\n\t\treturn orderItems\n\t}\n\n\twpm.getGoogleAdsDynamicRemarketingOrderItems = function () {\n\t\t// \"id\" : \"gla_34\",\n\t\t// \"quantity\" : 1,\n\t\t// \"price\" : 45,\n\t\t// \"google_business_vertical\": \"retail\"\n\n\t\tlet orderItems = []\n\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tlet orderItem\n\n\t\t\torderItem = {\n\t\t\t\tquantity : item.quantity,\n\t\t\t\tprice : item.price,\n\t\t\t\tgoogle_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type])\n\t\t\t\torderItems.push(orderItem)\n\t\t\t} else {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type])\n\t\t\t\torderItems.push(orderItem)\n\t\t\t}\n\t\t}\n\n\t\treturn orderItems\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery))\n\n\n/**\n * All event listeners\n * */\n\n// view_item_list event\njQuery(document).on(\"wpmViewItemList\", function (event, product) {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\n\t\tif (\n\t\t\twpmDataLayer?.general?.variationsOutput &&\n\t\t\tproduct.isVariable &&\n\t\t\twpmDataLayer.pixels.google.ads.dynamic_remarketing.send_events_with_parent_ids === false\n\t\t) return\n\n\t\t// try to prevent that WC sends cached hits to Google\n\t\tif (!product) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"view_item_list\", {\n \t\t\tsend_to: wpm.getGoogleAdsConversionIdentifiers(),\n \t\t\titems : [{\n \t\t\t\tid : product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],\n \t\t\t\tgoogle_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,\n \t\t\t}],\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// add_to_cart event\njQuery(document).on(\"wpmAddToCart\", function (event, product) {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"add_to_cart\", {\n \t\t\tsend_to: wpm.getGoogleAdsConversionIdentifiers(),\n \t\t\tvalue : product.quantity * product.price,\n \t\t\titems : [{\n \t\t\t\tid : product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],\n \t\t\t\tquantity : product.quantity,\n \t\t\t\tprice : product.price,\n \t\t\t\tgoogle_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,\n \t\t\t}],\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view_item event\njQuery(document).on(\"wpmViewItem\", function (event, product) {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"view_item\", {\n \t\t\tsend_to: wpm.getGoogleAdsConversionIdentifiers(),\n \t\t\tvalue : (product.quantity ? product.quantity : 1) * product.price,\n \t\t\titems : [{\n \t\t\t\tid : product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],\n \t\t\t\tquantity : (product.quantity ? product.quantity : 1),\n \t\t\t\tprice : product.price,\n \t\t\t\tgoogle_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,\n \t\t\t}],\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n\n// view search event\njQuery(document).on(\"wpmSearch\", function () {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\n\t\tlet products = []\n\n\t\tfor (const [key, product] of Object.entries(wpmDataLayer.products)) {\n\n\t\t\tif (\n\t\t\t\twpmDataLayer?.general?.variationsOutput &&\n\t\t\t\tproduct.isVariable &&\n\t\t\t\twpmDataLayer.pixels.google.ads.dynamic_remarketing.send_events_with_parent_ids === false\n\t\t\t) return\n\n\t\t\tproducts.push({\n\t\t\t\tid : product.dyn_r_ids[wpmDataLayer.pixels.google.ads.dynamic_remarketing.id_type],\n\t\t\t\tgoogle_business_vertical: wpmDataLayer.pixels.google.ads.google_business_vertical,\n\t\t\t})\n\t\t}\n\n\t\t// console.log(products);\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"view_search_results\", {\n \t\t\tsend_to: wpm.getGoogleAdsConversionIdentifiers(),\n \t\t\t// value : 1 * product.price,\n \t\t\titems: products,\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n\n// view order received page event\n// TODO distinguish with or without cart data active\njQuery(document).on(\"wpmOrderReceivedPage\", function () {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"purchase\", {\n \t\t\tsend_to: wpm.getGoogleAdsConversionIdentifiers(),\n \t\t\tvalue : wpmDataLayer.order.value_filtered,\n \t\t\titems : wpm.getGoogleAdsDynamicRemarketingOrderItems(),\n \t\t})\n\t\t})\n\n\t\t// console.log(wpm.getGoogleAdsDynamicRemarketingOrderItems())\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// user log in event\njQuery(document).on(\"wpmLogin\", function () {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpmDataLayer?.pixels?.google?.ads?.dynamic_remarketing?.status) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"login\", {\n \t\t\tsend_to: wpm.getGoogleAdsConversionIdentifiers(),\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view order received page event\n// new_customer parameter: https://support.google.com/google-ads/answer/9917012\njQuery(document).on(\"wpmOrderReceivedPage\", function () {\n\n\ttry {\n\t\tif(jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) return\n\t\tif (!wpm.googleConfigConditionsMet(\"ads\")) return\n\n\t\tlet data_basic = {}\n\t\tlet data_with_cart = {}\n\n\t\tdata_basic = {\n\t\t\tsend_to : wpm.getGoogleAdsConversionIdentifiersWithLabel(),\n\t\t\ttransaction_id: wpmDataLayer.order.number,\n\t\t\tvalue : wpmDataLayer.order.value_filtered,\n\t\t\tcurrency : wpmDataLayer.order.currency,\n\t\t\tnew_customer : wpmDataLayer.order.new_customer,\n\t\t}\n\n\t\tif (wpmDataLayer?.order?.aw_merchant_id) {\n\t\t\tdata_with_cart = {\n\t\t\t\tdiscount : wpmDataLayer.order.discount,\n\t\t\t\taw_merchant_id : wpmDataLayer.order.aw_merchant_id,\n\t\t\t\taw_feed_country : wpmDataLayer.order.aw_feed_country,\n\t\t\t\taw_feed_language: wpmDataLayer.order.aw_feed_language,\n\t\t\t\titems : wpm.getGoogleAdsRegularOrderItems(),\n\t\t\t}\n\t\t}\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"conversion\", {...data_basic, ...data_with_cart})\n\t\t})\n\n\t\t// console.log({...data_basic,...data_with_cart})\n\n\t\t// console.log(wpm.getGoogleAdsOrderItems())\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n\n\n\n\n","// TODO check all events and add more if there are any\n\n/**\n * Add functions for Snapchat Ads\n * */\n\n(function (wpm, $, undefined) {\n\n\n}(window.wpm = window.wpm || {}, jQuery));\n\n/**\n * Execute as soon as possible\n * */\n\n(function () {\n\t//\n\t//\n\t// if ('order_received_page' === wpmDataLayer.shop.page_type && wpmDataLayer?.order?.google?.ads?.enhanced_conversion_data) {\n\t// \tvar enhanced_conversion_data_2 = wpmDataLayer.order.google.ads.enhanced_conversion_data;\n\t// }\n\n})()\n\n","/**\n * Add functions for Google\n * */\n\n\n(function (wpm, $, undefined) {\n\n\twpm.getCartItemsGa4 = function () {\n\n\t\tlet data = []\n\n\t\tfor (const [productId, product] of Object.entries(wpmDataLayer.cart)) {\n\n\t\t\tlet productItems = {\n\t\t\t\titem_id : product.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],\n\t\t\t\titem_name: product.name,\n\t\t\t\tquantity : product.quantity,\n\t\t\t\t// affiliation : '',\n\t\t\t\t// coupon : '',\n\t\t\t\t// discount : 0,\n\t\t\t\titem_brand : product.brand,\n\t\t\t\titem_variant: product.variant,\n\t\t\t\tprice : product.price,\n\t\t\t\tcurrency : wpmDataLayer.shop.currency,\n\t\t\t}\n\n\t\t\tproductItems = wpm.getFormattedGA4Categories(productItems, product.category)\n\n\t\t\tdata.push(productItems)\n\t\t}\n\n\t\treturn data\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery))\n\n\n/**\n * All event listeners\n * */\n\n// view_item_list event\n// https://developers.google.com/analytics/devguides/collection/ga4/ecommerce?client_type=gtag#view_item_list\njQuery(document).on(\"wpmViewItemList\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.eec) return\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\tlet productItems = {\n\t\t\titem_id : product.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],\n\t\t\titem_name: product.name,\n\t\t\t// coupon : \"\",\n\t\t\t// discount: 0,\n\t\t\tindex : product.list_position, // doesn't make sense on mini_cart\n\t\t\titem_list_name: wpmDataLayer.shop.list_name,\n\t\t\titem_list_id : wpmDataLayer.shop.list_id,\n\t\t\t// affiliation: \"\",\n\t\t\titem_brand : product.brand,\n\t\t\titem_variant: product.variant,\n\t\t\tprice : product.price,\n\t\t\tcurrency : wpmDataLayer.shop.currency,\n\t\t\tquantity : product.quantity,\n\t\t}\n\n\t\tproductItems = wpm.getFormattedGA4Categories(productItems, product.category)\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"view_item_list\", {\n \t\t\tsend_to : wpmDataLayer.pixels.google.analytics.ga4.measurement_id,\n \t\t\titems : [productItems],\n \t\t\titem_list_name: wpmDataLayer.shop.list_name, // doesn't make sense on mini_cart\n \t\t\titem_list_id : wpmDataLayer.shop.list_id, // doesn't make sense on mini_cart\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// select_item event\n// https://developers.google.com/analytics/devguides/collection/ga4/ecommerce?client_type=gtag#select_item\njQuery(document).on(\"wpmSelectItem\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.eec) return\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\tlet productItems = {\n\t\t\titem_id : product.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],\n\t\t\titem_name: product.name,\n\t\t\t// coupon : \"\",\n\t\t\t// discount: 0,\n\t\t\tindex : product.list_position, // doesn't make sense on mini_cart\n\t\t\titem_list_name: wpmDataLayer.shop.list_name,\n\t\t\titem_list_id : wpmDataLayer.shop.list_id,\n\t\t\t// affiliation: \"\",\n\t\t\titem_brand : product.brand,\n\t\t\titem_variant: product.variant,\n\t\t\tprice : product.price,\n\t\t\tcurrency : wpmDataLayer.shop.currency,\n\t\t\tquantity : product.quantity,\n\t\t}\n\n\t\tproductItems = wpm.getFormattedGA4Categories(productItems, product.category)\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"select_item\", {\n \t\t\tsend_to: wpmDataLayer.pixels.google.analytics.ga4.measurement_id,\n \t\t\titems : [productItems],\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// add_to_cart event\n// https://developers.google.com/analytics/devguides/collection/ga4/ecommerce?client_type=gtag#add_to_cart\njQuery(document).on(\"wpmAddToCart\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.eec) return\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\tlet productItems = {\n\t\t\titem_name : product.name,\n\t\t\titem_id : product.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],\n\t\t\titem_list_name: wpmDataLayer.shop.list_name,\n\t\t\titem_list_id : wpmDataLayer.shop.list_id,\n\t\t\t// coupon: \"\",\n\t\t\t// discount: 0,\n\t\t\t// affiliation: \"\",\n\t\t\titem_brand : product.brand,\n\t\t\titem_variant: product.variant,\n\t\t\tprice : product.price,\n\t\t\tcurrency : wpmDataLayer.shop.currency,\n\t\t\tquantity : product.quantity,\n\t\t}\n\n\t\tproductItems = wpm.getFormattedGA4Categories(productItems, product.category)\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"add_to_cart\", {\n \t\t\tsend_to : wpmDataLayer.pixels.google.analytics.ga4.measurement_id,\n \t\t\tcurrency: wpmDataLayer.shop.currency,\n \t\t\t// value: 0,\n \t\t\titems: [productItems],\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view_item event\n// https://developers.google.com/analytics/devguides/collection/ga4/ecommerce?client_type=gtag#view_item\njQuery(document).on(\"wpmViewItem\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.eec) return\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\tlet productItems = {\n\t\t\titem_id : product.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],\n\t\t\titem_name: product.name,\n\t\t\t// coupon: \"\",\n\t\t\t// discount: 0,\n\t\t\t// affiliation: \"\",\n\t\t\titem_brand : product.brand,\n\t\t\titem_variant : product.variant,\n\t\t\tprice : product.price,\n\t\t\tcurrency : wpmDataLayer.shop.currency,\n\t\t\tquantity : 1,\n\t\t\titem_list_name: wpmDataLayer.shop.list_name,\n\t\t\titem_list_id : wpmDataLayer.shop.list_id,\n\t\t}\n\n\t\tproductItems = wpm.getFormattedGA4Categories(productItems, product.category)\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"view_item\", {\n \t\t\tsend_to : wpmDataLayer.pixels.google.analytics.ga4.measurement_id,\n \t\t\tcurrency: wpmDataLayer.shop.currency,\n \t\t\t// value: 0,\n \t\t\titems: [productItems],\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// add_to_wishlist event\n// https://developers.google.com/analytics/devguides/collection/ga4/ecommerce?client_type=gtag#add_to_wishlist\njQuery(document).on(\"wpmAddToWishlist\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.eec) return\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\tlet productItems = {\n\t\t\titem_id : product.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],\n\t\t\titem_name: product.name,\n\t\t\tquantity : 1,\n\t\t\t// affiliation: \"\",\n\t\t\t// coupon: \"\",\n\t\t\t// discount: 0,\n\t\t\titem_brand : product.brand,\n\t\t\titem_variant: product.variant,\n\t\t\tprice : product.price,\n\t\t\tcurrency : wpmDataLayer.shop.currency,\n\t\t}\n\n\t\tproductItems = wpm.getFormattedGA4Categories(productItems, product.category)\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"add_to_wishlist\", {\n \t\t\tsend_to : wpmDataLayer.pixels.google.analytics.ga4.measurement_id,\n \t\t\tcurrency: wpmDataLayer.shop.currency,\n \t\t\t// value: 0,\n \t\t\titems: [productItems],\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// remove_from_cart event\n// https://developers.google.com/analytics/devguides/collection/ga4/ecommerce?client_type=gtag#remove_from_cart\njQuery(document).on(\"wpmRemoveFromCart\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.eec) return\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\tlet productItems = {\n\t\t\titem_id : product.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],\n\t\t\titem_name: product.name,\n\t\t\t// coupon: \"\",\n\t\t\t// discount: 0,\n\t\t\t// affiliation: \"\",\n\t\t\titem_brand : product.brand,\n\t\t\titem_variant: product.variant,\n\t\t\tprice : product.price,\n\t\t\tcurrency : wpmDataLayer.shop.currency,\n\t\t\tquantity : product.quantity,\n\t\t}\n\n\t\tproductItems = wpm.getFormattedGA4Categories(productItems, product.category)\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"remove_from_cart\", {\n \t\t\tsend_to : wpmDataLayer.pixels.google.analytics.ga4.measurement_id,\n \t\t\tcurrency: wpmDataLayer.shop.currency,\n \t\t\t// value: 0,\n \t\t\titems: [productItems],\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// begin_checkout event\n// https://developers.google.com/analytics/devguides/collection/ga4/ecommerce?client_type=gtag#begin_checkout\njQuery(document).on(\"wpmBeginCheckout\", function (event) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.eec) return\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"begin_checkout\", {\n \t\t\tsend_to: wpmDataLayer.pixels.google.analytics.ga4.measurement_id,\n \t\t\t// coupon: \"\",\n \t\t\tcurrency: wpmDataLayer.shop.currency,\n \t\t\t// value: 0,\n \t\t\titems: wpm.getCartItemsGa4(),\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view_cart event\n// https://developers.google.com/analytics/devguides/collection/ga4/ecommerce?client_type=gtag#view_cart\njQuery(document).on(\"wpmViewCart\", function (event) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.eec) return\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\tif (jQuery.isEmptyObject(wpmDataLayer.cart)) return\n\n\t\tlet products = []\n\t\tlet cartValue = null\n\n\t\tfor (const [key, product] of Object.entries(wpmDataLayer.cart)) {\n\t\t\t// console.log(`${key}: ${value}`);\n\n\t\t\tlet productItems = {\n\t\t\t\titem_id : product.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],\n\t\t\t\titem_name: product.name,\n\t\t\t\tquantity : product.quantity,\n\t\t\t\t// affiliation: \"\",\n\t\t\t\t// coupon: \"\",\n\t\t\t\t// discount: 0,\n\t\t\t\t// index : product.position,\n\t\t\t\titem_brand : product.brand,\n\t\t\t\titem_list_name: wpmDataLayer.shop.list_name,\n\t\t\t\titem_list_id : wpmDataLayer.shop.list_id,\n\t\t\t\titem_variant : product.variant,\n\t\t\t\tprice : product.price,\n\t\t\t\tcurrency : wpmDataLayer.shop.currency,\n\t\t\t}\n\n\t\t\tproductItems = wpm.getFormattedGA4Categories(productItems, product.category)\n\n\t\t\tproducts.push(productItems)\n\n\t\t\tcartValue = cartValue + product.quantity * product.price\n\t\t}\n\n\t\t// console.log(products)\n\t\t// console.log('cart value: ' + cartValue.toFixed(2))\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"view_cart\", {\n\t\t\t\tsend_to : wpmDataLayer.pixels.google.analytics.ga4.measurement_id,\n\t\t\t\tcurrency: wpmDataLayer.shop.currency,\n\t\t\t\tvalue : cartValue.toFixed(2),\n\t\t\t\titems : products,\n\t\t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n\n// view search event\njQuery(document).on(\"wpmSearch\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.eec) return\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\tlet products = []\n\n\t\tfor (const [key, product] of Object.entries(wpmDataLayer.products)) {\n\t\t\t// console.log(`${key}: ${value}`);\n\n\t\t\tlet productItems = {\n\t\t\t\titem_id : product.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],\n\t\t\t\titem_name: product.name,\n\t\t\t\tquantity : 1,\n\t\t\t\t// \"affiliation\": \"\",\n\t\t\t\t// \"coupon\": \"\",\n\t\t\t\t// \"discount\": 0,\n\t\t\t\tindex : product.position,\n\t\t\t\titem_brand : product.brand,\n\t\t\t\titem_list_name: wpmDataLayer.shop.list_name,\n\t\t\t\titem_list_id : wpmDataLayer.shop.list_id,\n\t\t\t\titem_variant : product.variant,\n\t\t\t\tprice : product.price,\n\t\t\t\tcurrency : wpmDataLayer.shop.currency,\n\t\t\t}\n\n\t\t\tproductItems = wpm.getFormattedGA4Categories(productItems, product.category)\n\n\t\t\tproducts.push(productItems)\n\t\t}\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"view_search_results\", {\n\t\t\t\tsend_to : wpmDataLayer.pixels.google.analytics.ga4.measurement_id,\n\t\t\t\tsearch_term: wpm.getSearchTermFromUrl(),\n\t\t\t\titems : products,\n\t\t\t})\n\n\t\t})\n\n\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// user log in event\njQuery(document).on(\"wpmLogin\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.eec) return\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"login\", {\n\t\t\t\tsend_to: wpmDataLayer.pixels.google.analytics.ga4.measurement_id,\n\t\t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n\n","/**\n * Add functions for Google Analytics 4\n * */\n\n(function (wpm, $, undefined) {\n\n\twpm.getGA4OrderItems = function () {\n\n\t\t// \"item_id\" : \"34\",\n\t\t// \"item_name\" : \"Hoodie\",\n\t\t// \"quantity\" : 1,\n\t\t// \"item_brand\" : \"\",\n\t\t// \"item_variant\" : \"Color: blue | Logo: yes\",\n\t\t// \"price\" : 45,\n\t\t// \"currency\" : \"CHF\",\n\t\t// \"item_category\": \"Hoodies\"\n\n\n\t\tlet orderItems = []\n\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tlet orderItem\n\n\t\t\torderItem = {\n\t\t\t\tquantity : item.quantity,\n\t\t\t\tprice : item.price,\n\t\t\t\titem_name : item.name,\n\t\t\t\tcurrency : wpmDataLayer.order.currency,\n\t\t\t\titem_category: wpmDataLayer.products[item.id].category.join(\"/\"),\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {\n\n\t\t\t\torderItem.item_id = String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type])\n\t\t\t\torderItem.item_variant = wpmDataLayer.products[item.variation_id].variant_name\n\t\t\t\torderItem.item_brand = wpmDataLayer.products[item.variation_id].brand\n\t\t\t\torderItems.push(orderItem)\n\t\t\t} else {\n\n\t\t\t\torderItem.item_id = String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type])\n\t\t\t\torderItem.item_brand = wpmDataLayer.products[item.id].brand\n\t\t\t\torderItems.push(orderItem)\n\t\t\t}\n\t\t}\n\n\t\treturn orderItems\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery))\n\n\n/**\n * All event listeners\n * */\n\n\n// view order received page event\njQuery(document).on(\"wpmOrderReceivedPage\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) return\n\t\tif (wpmDataLayer?.pixels?.google?.analytics?.ga4?.mp_active) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"purchase\", {\n \t\t\tsend_to : [wpmDataLayer.pixels.google.analytics.ga4.measurement_id],\n \t\t\ttransaction_id: wpmDataLayer.order.number,\n \t\t\taffiliation : wpmDataLayer.order.affiliation,\n \t\t\tcurrency : wpmDataLayer.order.currency,\n \t\t\tvalue : wpmDataLayer.order.value_regular,\n \t\t\tdiscount : wpmDataLayer.order.discount,\n \t\t\ttax : wpmDataLayer.order.tax,\n \t\t\tshipping : wpmDataLayer.order.shipping,\n \t\t\tcoupon : wpmDataLayer.order.coupon,\n \t\t\titems : wpm.getGA4OrderItems(),\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n","/**\n * Add functions for Google\n * */\n\n(function (wpm, $, undefined) {\n\n\twpm.getCartItemsGaUa = function () {\n\n\t\t// console.log('test')\n\n\t\tlet data = []\n\n\t\tfor (const [productId, product] of Object.entries(wpmDataLayer.cart)) {\n\n\t\t\tdata.push({\n\t\t\t\tid : product.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],\n\t\t\t\tname : product.name,\n\t\t\t\tbrand : product.brand,\n\t\t\t\tcategory: product.category.join(\",\"),\n\t\t\t\t// coupon: '',\n\t\t\t\t// list_name: '',\n\t\t\t\t// list_position: 1,\n\t\t\t\tprice : product.price,\n\t\t\t\tquantity: product.quantity,\n\t\t\t\tvariant : product.variant,\n\t\t\t})\n\t\t}\n\n\t\treturn data\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery))\n\n\n/**\n * All event listeners\n * */\n\n// view_item_list event\njQuery(document).on(\"wpmViewItemList\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.eec) return\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"view_item_list\", {\n \t\t\tsend_to: wpmDataLayer.pixels.google.analytics.universal.property_id,\n \t\t\titems : [{\n \t\t\t\tid : product.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],\n \t\t\t\tname : product.name,\n \t\t\t\tbrand : product.brand,\n \t\t\t\tcategory: product.category.join(\",\"),\n \t\t\t\t// coupon : \"\",\n \t\t\t\tlist_name : wpmDataLayer.shop.list_name,\n \t\t\t\tlist_position: product.list_position, // doesn't make sense on mini_cart\n \t\t\t\tprice : product.price,\n \t\t\t\tquantity : product.quantity,\n \t\t\t\tvariant : product.variant,\n \t\t\t}],\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// select_content event\njQuery(document).on(\"wpmSelectContentGaUa\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.eec) return\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"select_content\", {\n \t\t\tsend_to : wpmDataLayer.pixels.google.analytics.universal.property_id,\n \t\t\tcontent_type: \"product\",\n \t\t\titems : [\n \t\t\t\t{\n \t\t\t\t\tid : product.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],\n \t\t\t\t\tname : product.name,\n \t\t\t\t\tlist_name : wpmDataLayer.shop.list_name,\n \t\t\t\t\tbrand : product.brand,\n \t\t\t\t\tcategory : product.category.join(\",\"),\n \t\t\t\t\tvariant : product.variant,\n \t\t\t\t\tlist_position: product.list_position, // doesn't make sense on mini_cart\n \t\t\t\t\tquantity : product.quantity,\n \t\t\t\t\tprice : product.price,\n \t\t\t\t},\n \t\t\t],\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// add_to_cart event\njQuery(document).on(\"wpmAddToCart\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.eec) return\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"add_to_cart\", {\n \t\t\tsend_to : wpmDataLayer.pixels.google.analytics.universal.property_id,\n \t\t\tcurrency: wpmDataLayer.shop.currency,\n \t\t\titems : [\n \t\t\t\t{\n \t\t\t\t\tid : product.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],\n \t\t\t\t\tname : product.name,\n \t\t\t\t\tlist_name : wpmDataLayer.shop.list_name,\n \t\t\t\t\tbrand : product.brand,\n \t\t\t\t\tcategory : product.category.join(\",\"),\n \t\t\t\t\tvariant : product.variant,\n \t\t\t\t\tlist_position: product.list_position, // doesn't make sense on mini_cart\n \t\t\t\t\tquantity : product.quantity,\n \t\t\t\t\tprice : product.price,\n \t\t\t\t},\n \t\t\t],\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view_item event\njQuery(document).on(\"wpmViewItem\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.eec) return\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"view_item\", {\n \t\t\tsend_to: wpmDataLayer.pixels.google.analytics.universal.property_id,\n \t\t\titems : [{\n \t\t\t\tid : product.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],\n \t\t\t\tname : product.name,\n \t\t\t\tlist_name : wpmDataLayer.shop.list_name, // doesn't make sense on mini_cart\n \t\t\t\tbrand : product.brand,\n \t\t\t\tcategory : product.category.join(\",\"),\n \t\t\t\tvariant : product.variant,\n \t\t\t\tlist_position: 1,\n \t\t\t\tquantity : 1,\n \t\t\t\tprice : product.price,\n \t\t\t}],\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// add_to_wishlist event\njQuery(document).on(\"wpmAddToWishlist\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.eec) return\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"add_to_wishlist\", {\n \t\t\tsend_to: wpmDataLayer.pixels.google.analytics.universal.property_id,\n \t\t\titems : [\n \t\t\t\t{\n \t\t\t\t\tid : product.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],\n \t\t\t\t\tname : product.name,\n \t\t\t\t\tbrand : product.brand,\n \t\t\t\t\tcategory: product.category.join(\",\"),\n \t\t\t\t\t// coupon : \"\",\n \t\t\t\t\tlist_name : wpmDataLayer.shop.list_name, // doesn't make sense on mini_cart\n \t\t\t\t\tlist_position: product.position,\n \t\t\t\t\tprice : product.price,\n \t\t\t\t\tquantity : 1,\n \t\t\t\t\tvariant : product.variant,\n \t\t\t\t},\n \t\t\t],\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// remove_from_cart event\njQuery(document).on(\"wpmRemoveFromCart\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.eec) return\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"remove_from_cart\", {\n \t\t\tsend_to : wpmDataLayer.pixels.google.analytics.universal.property_id,\n \t\t\tcurrency: wpmDataLayer.shop.currency,\n \t\t\titems : [\n \t\t\t\t{\n \t\t\t\t\tid : product.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],\n \t\t\t\t\tname : product.name,\n \t\t\t\t\tlist_name: wpmDataLayer.shop.list_name,\n \t\t\t\t\tbrand : product.brand,\n \t\t\t\t\tcategory : product.category.join(\",\"),\n \t\t\t\t\tvariant : product.variant,\n \t\t\t\t\t// list_position: product.list_position, // doesn't make sense on mini_cart\n \t\t\t\t\tquantity: product.quantity,\n \t\t\t\t\tprice : product.price,\n \t\t\t\t},\n \t\t\t],\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// begin_checkout event\njQuery(document).on(\"wpmBeginCheckout\", function (event) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.eec) return\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"begin_checkout\", {\n \t\t\tsend_to : wpmDataLayer.pixels.google.analytics.universal.property_id,\n \t\t\tcurrency: wpmDataLayer.shop.currency,\n \t\t\titems : wpm.getCartItemsGaUa(),\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// set_checkout_option event\njQuery(document).on(\"wpmFireCheckoutOption\", function (event, data) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.eec) return\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"set_checkout_option\", {\n \t\t\tsend_to : wpmDataLayer.pixels.google.analytics.universal.property_id,\n \t\t\tcheckout_step : data.step,\n \t\t\tcheckout_option: data.checkout_option,\n \t\t\tvalue : data.value,\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// checkout_progress event\njQuery(document).on(\"wpmFireCheckoutProgress\", function (event, data) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.eec) return\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"checkout_progress\", {\n \t\t\tsend_to : wpmDataLayer.pixels.google.analytics.universal.property_id,\n \t\t\tcheckout_step: data.step,\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view search event\njQuery(document).on(\"wpmSearch\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.eec) return\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\tlet products = []\n\n\t\tfor (const [key, product] of Object.entries(wpmDataLayer.products)) {\n\t\t\t// console.log(`${key}: ${value}`);\n\n\t\t\tproducts.push({\n\t\t\t\tid : product.dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type],\n\t\t\t\tname : product.name,\n\t\t\t\tquantity: 1,\n\t\t\t\t// affiliation: \"\",\n\t\t\t\t// coupon: \"\",\n\t\t\t\t// discount: 0,\n\t\t\t\tlist_position: product.position,\n\t\t\t\tbrand : product.brand,\n\t\t\t\tcategory : product.category.join(\",\"),\n\t\t\t\tlist_name : wpmDataLayer.shop.list_name,\n\t\t\t\tvariant : product.variant,\n\t\t\t\tprice : product.price,\n\t\t\t})\n\t\t}\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t\tgtag(\"event\", \"view_search_results\", {\n\t\t\t\tsend_to : wpmDataLayer.pixels.google.analytics.universal.property_id,\n\t\t\t\tsearch_term: wpm.getSearchTermFromUrl(),\n\t\t\t\titems : products,\n\t\t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// user log in event\njQuery(document).on(\"wpmLogin\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.eec) return\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"login\", {\n \t\t\tsend_to: wpmDataLayer.pixels.google.analytics.universal.property_id,\n \t\t})\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n","/**\n * Add functions for Google Analytics Universal\n * */\n\n(function (wpm, $, undefined) {\n\n\twpm.getGAUAOrderItems = function () {\n\n\t\t// \"id\" : \"34\",\n\t\t// \"name\" : \"Hoodie\",\n\t\t// \"brand\" : \"\",\n\t\t// \"category\" : \"Hoodies\",\n\t\t// \"list_position\": 1,\n\t\t// \"price\" : 45,\n\t\t// \"quantity\" : 1,\n\t\t// \"variant\" : \"Color: blue | Logo: yes\"\n\n\n\t\tlet orderItems = [],\n\t\t\tlist_position = 1\n\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tlet orderItem\n\n\t\t\torderItem = {\n\t\t\t\tquantity : item.quantity,\n\t\t\t\tprice : item.price,\n\t\t\t\titem_name : item.name,\n\t\t\t\tcurrency : wpmDataLayer.order.currency,\n\t\t\t\titem_category: wpmDataLayer.products[item.id].category.join(\"/\"),\n\t\t\t\tlist_position: list_position,\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type])\n\t\t\t\torderItem.variant = wpmDataLayer.products[item.variation_id].variant_name\n\t\t\t\torderItem.item_brand = wpmDataLayer.products[item.variation_id].brand\n\t\t\t\torderItems.push(orderItem)\n\t\t\t} else {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.google.analytics.id_type])\n\t\t\t\torderItem.item_brand = wpmDataLayer.products[item.id].brand\n\t\t\t\torderItems.push(orderItem)\n\t\t\t}\n\n\t\t\tlist_position++\n\t\t}\n\n\t\treturn orderItems\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery))\n\n\n/**\n * All event listeners\n * */\n\n\n// view order received page event\njQuery(document).on(\"wpmOrderReceivedPage\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) return\n\t\tif (wpmDataLayer?.pixels?.google?.analytics?.universal?.mp_active) return\n\t\tif (!wpm.googleConfigConditionsMet(\"analytics\")) return\n\n\t\twpm.gtagLoaded().then(function () {\n\t\t gtag(\"event\", \"purchase\", {\n \t\t\tsend_to : [wpmDataLayer.pixels.google.analytics.universal.property_id],\n \t\t\ttransaction_id: wpmDataLayer.order.number,\n \t\t\taffiliation : wpmDataLayer.order.affiliation,\n \t\t\tcurrency : wpmDataLayer.order.currency,\n \t\t\tvalue : wpmDataLayer.order.value_regular,\n \t\t\tdiscount : wpmDataLayer.order.discount,\n \t\t\ttax : wpmDataLayer.order.tax,\n \t\t\tshipping : wpmDataLayer.order.shipping,\n \t\t\tcoupon : wpmDataLayer.order.coupon,\n \t\t\titems : wpm.getGAUAOrderItems(),\n \t\t})\n\t\t})\n\n\t\t// console.log(wpm.getGAUAOrderItems())\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n","(function (wpm, $, undefined) {\n\n\twpm.load_google_optimize_pixel = function () {\n\n\t\ttry {\n\t\t\tif (wpmDataLayer?.pixels?.google?.optimize?.container_id) {\n\n\t\t\t\twpmDataLayer.pixels.google.optimize.loaded = true\n\n\t\t\t\twpm.loadScriptAndCacheIt(\"https://www.googleoptimize.com/optimize.js?id=\" + wpmDataLayer.pixels.google.optimize.container_id)\n\t\t\t\t// .done(function (script, textStatus) {\n\t\t\t\t// \t\tconsole.log('Google Optimize loaded')\n\t\t\t\t// });\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery));\n\n\n(function () {\n\n\tjQuery(document).on(\"wpmLoadPixels\", function () {\n\n\t\tif (wpm.canIFire(\"analytics\", \"google-optimize\") && !wpmDataLayer?.pixels?.google?.optimize?.loaded) wpm.load_google_optimize_pixel()\n\n\t})\n\n})()\n\n\n\n","/**\n * Add functions for Google\n * */\n\n(function (wpm, $, undefined) {\n\n\twpm.googleConfigConditionsMet = function (type) {\n\t\t// always returns true if Google Consent Mode is active\n\t\tif (wpmDataLayer?.pixels?.google?.consent_mode?.active) {\n\t\t\treturn true\n\t\t} else if (wpm.getConsentValues().mode === \"category\") {\n\t\t\treturn wpm.getConsentValues().categories[type] === true\n\t\t} else if (wpm.getConsentValues().mode === \"pixel\") {\n\t\t\treturn wpm.getConsentValues().pixels.includes(\"google-\" + type)\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t}\n\n\twpm.getVisitorConsentStatusAndUpdateGoogleConsentSettings = function (google_consent_settings) {\n\n\t\tif (wpm.getConsentValues().mode === \"category\") {\n\t\t\tif (wpm.getConsentValues().categories.analytics) google_consent_settings.analytics_storage = \"granted\"\n\t\t\tif (wpm.getConsentValues().categories.ads) google_consent_settings.ad_storage = \"granted\"\n\t\t} else if ((wpm.getConsentValues().mode === \"pixel\")) {\n\t\t\tgoogle_consent_settings.analytics_storage = wpm.getConsentValues().pixels.includes(\"google-analytics\") ? \"granted\" : \"denied\"\n\t\t\tgoogle_consent_settings.ad_storage = wpm.getConsentValues().pixels.includes(\"google-ads\") ? \"granted\" : \"denied\"\n\t\t}\n\n\t\treturn google_consent_settings\n\t}\n\n\twpm.updateGoogleConsentMode = function (analytics = true, ads = true) {\n\n\t\ttry {\n\t\t\tif (\n\t\t\t\t!window.gtag ||\n\t\t\t\t!wpmDataLayer.shop.cookie_consent_mgmt.explicit_consent\n\t\t\t) return\n\n\t\t\tgtag(\"consent\", \"update\", {\n\t\t\t\tanalytics_storage: analytics ? \"granted\" : \"denied\",\n\t\t\t\tad_storage : ads ? \"granted\" : \"denied\",\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.fireGtagGoogleAds = function () {\n\t\ttry {\n\t\t\twpmDataLayer.pixels.google.ads.state = \"loading\"\n\n\t\t\tif (wpmDataLayer?.pixels?.google?.ads?.enhanced_conversions?.active) {\n\t\t\t\tfor (const [key, item] of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds)) {\n\t\t\t\t\tgtag(\"config\", key, {\"allow_enhanced_conversions\": true})\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (const [key, item] of Object.entries(wpmDataLayer.pixels.google.ads.conversionIds)) {\n\t\t\t\t\tgtag(\"config\", key)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.pixels?.google?.ads?.conversionIds && wpmDataLayer?.pixels?.google?.ads?.phone_conversion_label && wpmDataLayer?.pixels?.google?.ads?.phone_conversion_number) {\n\t\t\t\tgtag(\"config\", Object.keys(wpmDataLayer.pixels.google.ads.conversionIds)[0] + \"/\" + wpmDataLayer.pixels.google.ads.phone_conversion_label, {\n\t\t\t\t\tphone_conversion_number: wpmDataLayer.pixels.google.ads.phone_conversion_number,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// ! enhanced_conversion_data needs to be var\n\t\t\t// https://support.google.com/google-ads/answer/9888145#zippy=%2Cvalidate-your-implementation-using-chrome-developer-tools\n\t\t\tif (\"order_received_page\" === wpmDataLayer.shop.page_type && wpmDataLayer?.order?.google?.ads?.enhanced_conversion_data) {\n\t\t\t\twindow.enhanced_conversion_data = wpmDataLayer.order.google.ads.enhanced_conversion_data\n\t\t\t}\n\n\t\t\twpmDataLayer.pixels.google.ads.state = \"ready\"\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.fireGtagGoogleAnalyticsUA = function () {\n\t\ttry {\n\t\t\twpmDataLayer.pixels.google.analytics.universal.state = \"loading\"\n\n\t\t\tgtag(\"config\", wpmDataLayer.pixels.google.analytics.universal.property_id, wpmDataLayer.pixels.google.analytics.universal.parameters)\n\t\t\twpmDataLayer.pixels.google.analytics.universal.state = \"ready\"\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.fireGtagGoogleAnalyticsGA4 = function () {\n\t\ttry {\n\t\t\twpmDataLayer.pixels.google.analytics.ga4.state = \"loading\"\n\n\t\t\tgtag(\"config\", wpmDataLayer.pixels.google.analytics.ga4.measurement_id, wpmDataLayer.pixels.google.analytics.ga4.parameters)\n\t\t\twpmDataLayer.pixels.google.analytics.ga4.state = \"ready\"\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.isGoogleActive = function () {\n\t\tif (\n\t\t\twpmDataLayer?.pixels?.google?.analytics?.universal?.property_id ||\n\t\t\twpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id ||\n\t\t\t!jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)\n\t\t) {\n\t\t\treturn true\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t}\n\n\twpm.getGoogleGtagId = function () {\n\t\tif (wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) {\n\t\t\treturn wpmDataLayer.pixels.google.analytics.universal.property_id\n\t\t} else if (wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) {\n\t\t\treturn wpmDataLayer.pixels.google.analytics.ga4.measurement_id\n\t\t} else {\n\t\t\treturn Object.keys(wpmDataLayer.pixels.google.ads.conversionIds)[0]\n\t\t}\n\t}\n\n\twpm.loadGoogle = function () {\n\n\t\tif (wpm.isGoogleActive()) {\n\n\t\t\twpmDataLayer.pixels.google.state = \"loading\"\n\n\t\t\twpm.loadScriptAndCacheIt(\"https://www.googletagmanager.com/gtag/js?id=\" + wpm.getGoogleGtagId())\n\t\t\t\t.done(function (script, textStatus) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// console.log('Google Optimize loaded')\n\t\t\t\t\t\t// alert('Google Optimize loaded')\n\n\t\t\t\t\t\t// Initiate Google dataLayer and gtag\n\t\t\t\t\t\twindow.dataLayer = window.dataLayer || []\n\t\t\t\t\t\twindow.gtag = function gtag() {\n\t\t\t\t\t\t\tdataLayer.push(arguments)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Google Consent Mode\n\t\t\t\t\t\tif (wpmDataLayer?.pixels?.google?.consent_mode?.active) {\n\n\t\t\t\t\t\t\tlet google_consent_settings = {\n\t\t\t\t\t\t\t\t\"ad_storage\" : wpmDataLayer.pixels.google.consent_mode.ad_storage,\n\t\t\t\t\t\t\t\t\"analytics_storage\": wpmDataLayer.pixels.google.consent_mode.analytics_storage,\n\t\t\t\t\t\t\t\t\"wait_for_update\" : wpmDataLayer.pixels.google.consent_mode.wait_for_update,\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (wpmDataLayer?.pixels?.google?.consent_mode?.region) {\n\t\t\t\t\t\t\t\tgoogle_consent_settings.region = wpmDataLayer.pixels.google.consent_mode.region\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tgoogle_consent_settings = wpm.getVisitorConsentStatusAndUpdateGoogleConsentSettings(google_consent_settings)\n\n\t\t\t\t\t\t\tgtag(\"consent\", \"default\", google_consent_settings)\n\t\t\t\t\t\t\tgtag(\"set\", \"ads_data_redaction\", wpmDataLayer.pixels.google.consent_mode.ads_data_redaction)\n\t\t\t\t\t\t\tgtag(\"set\", \"url_passthrough\", wpmDataLayer.pixels.google.consent_mode.url_passthrough)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Google Linker\n\t\t\t\t\t\t// https://developers.google.com/gtagjs/devguide/linker\n\t\t\t\t\t\tif (wpmDataLayer?.pixels?.google?.linker?.settings) {\n\t\t\t\t\t\t\tgtag(\"set\", \"linker\", wpmDataLayer.pixels.google.linker.settings)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgtag(\"js\", new Date())\n\n\t\t\t\t\t\tif (wpm.googleConfigConditionsMet(\"ads\") && !jQuery.isEmptyObject(wpmDataLayer?.pixels?.google?.ads?.conversionIds)) wpm.fireGtagGoogleAds()\n\t\t\t\t\t\tif (wpm.googleConfigConditionsMet(\"analytics\") && wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) wpm.fireGtagGoogleAnalyticsUA()\n\t\t\t\t\t\tif (wpm.googleConfigConditionsMet(\"analytics\") && wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) wpm.fireGtagGoogleAnalyticsGA4()\n\n\t\t\t\t\t\twpmDataLayer.pixels.google.state = \"ready\"\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tconsole.error(e)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t}\n\t}\n\n\twpm.canGoogleLoad = function () {\n\n\t\tif (wpmDataLayer?.pixels?.google?.consent_mode?.active) {\n\t\t\treturn true\n\t\t} else if (\"category\" === wpm.getConsentValues().mode) {\n\t\t\treturn !!(wpm.getConsentValues().categories[\"ads\"] || wpm.getConsentValues().categories[\"analytics\"])\n\t\t} else if (\"pixel\" === wpm.getConsentValues().mode) {\n\t\t\treturn wpm.getConsentValues().pixels.includes(\"google-ads\") || wpm.getConsentValues().pixels.includes(\"google-analytics\")\n\t\t} else {\n\t\t\tconsole.error(\"Couldn't find a valid load condition for Google mode in wpmConsentValues\")\n\t\t\treturn false\n\t\t}\n\t}\n\n\twpm.gtagLoaded = function () {\n\t\treturn new Promise(function (resolve, reject) {\n\n\t\t\tif (typeof wpmDataLayer?.pixels?.google?.state === \"undefined\") reject()\n\n\t\t\tlet startTime = 0\n\t\t\tlet timeout = 5000\n\t\t\tlet frequency = 200;\n\n\t\t\t(function wait() {\n\t\t\t\tif (wpmDataLayer?.pixels?.google?.state === \"ready\") return resolve()\n\t\t\t\tif (startTime >= timeout) return reject()\n\t\t\t\tstartTime += frequency\n\t\t\t\tsetTimeout(wait, frequency)\n\t\t\t})()\n\t\t})\n\t}\n\n\t// wpm.gtagLoadednew = function () {\n\t// \treturn Promise.race([\n\t// \t\t\tnew Promise(function (resolve, reject) {\n\t//\n\t// \t\t\t\tif (typeof wpmDataLayer?.pixels?.google?.state === \"undefined\") reject();\n\t//\n\t//\n\t// \t\t\t\t(function wait() {\n\t// \t\t\t\t\tif (wpmDataLayer?.pixels?.google?.state === \"ready\") return resolve()\n\t// \t\t\t\t\tif (to >= 1000) return reject()\n\t// \t\t\t\t\tsetTimeout(wait, 100)\n\t// \t\t\t\t})()\n\t// \t\t\t}),\n\t// \t\t\tnew Promise(function (resolve, reject) {\n\t// \t\t\t\tsetTimeout(() => reject(), 1000)\n\t// \t\t\t}),\n\t// \t\t],\n\t// \t)\n\t// \t\t// .then((value) => {console.log(\"race then value: \" + value)})\n\t// \t\t.catch(\n\t// \t\t\t(value) => {\n\t// \t\t\t\tconsole.log(\"race catch value: \" + value)\n\t// \t\t\t\treturn Promise.reject()\n\t// \t\t\t})\n\t// }\n\n\n\t// const promise1 = new Promise((resolve, reject) => {\n\t// \tsetTimeout(resolve, 500, \"one\")\n\t// })\n\t//\n\t// const promise2 = new Promise((resolve, reject) => {\n\t// \tsetTimeout(reject, 100, \"two\")\n\t// })\n\t//\n\t// let onlyRunIfResolves = function () {\n\t// \treturn Promise.race([promise1, promise2])\n\t// \t\t.catch(() => {\n\t// \t\t})\n\t// }\n\t//\n\t// onlyRunIfResolves()\n\t// \t.then(() => {\n\t// \t\tconsole.log(\"running function\")\n\t// \t})\n\n\n}(window.wpm = window.wpm || {}, jQuery));\n\n\n(function () {\n\n\tjQuery(document).on(\"wpmLoadPixels\", function () {\n\n\t\tif (\n\t\t\twpm.canGoogleLoad() &&\n\t\t\t(typeof wpmDataLayer?.pixels?.google?.state === \"undefined\")\n\t\t) {\n\t\t\twpm.loadGoogle()\n\t\t}\n\t})\n\n\t// return wpmDataLayer?.pixels?.google?.state === \"undefined\";\n\n})()\n","(function (wpm, $, undefined) {\n\n\twpm.getFormattedGA4Categories = function (productItems, categories) {\n\n\t\tlet maxCategories = 5\n\n\t\t// remove categories with equal names from array\n\t\tcategories = Array.from(new Set(categories))\n\n\t\tif (Array.isArray(categories) && categories.length) {\n\n\t\t\tproductItems[\"item_category\"] = categories[0]\n\n\t\t\tlet max = categories.length > maxCategories ? maxCategories : categories.length\n\n\t\t\tfor (let i = 1; i < max; i++) {\n\t\t\t\tproductItems[\"item_category\" + (i + 1)] = categories[i]\n\t\t\t}\n\t\t}\n\n\t\treturn productItems\n\t}\n\n\twpm.setGoogleCidOnServer = function () {\n\n\t\ttry {\n\n\t\t\tlet targetIDs = []\n\n\t\t\tif (wpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id) targetIDs.push(wpmDataLayer.pixels.google.analytics.ga4.measurement_id)\n\t\t\tif (wpmDataLayer?.pixels?.google?.analytics?.universal?.property_id) targetIDs.push(wpmDataLayer.pixels.google.analytics.universal.property_id)\n\n\n\t\t\twpm.gtagLoaded().then(function () {\n\t\t\t gtag(\"get\", targetIDs[0], \"client_id\", (clientID) => {\n\n \t\t\t\t// save the state in the database\n \t\t\t\tlet data = {\n \t\t\t\t\taction: \"wpm_google_analytics_set_session_data\",\n \t\t\t\t\t// 'nonce' : wpm_google_premium_only_ajax_object.nonce,\n \t\t\t\t\t// 'nonce' : wpm.nonce,\n \t\t\t\t\ttarget_ids: targetIDs,\n \t\t\t\t\tclient_id : clientID,\n \t\t\t\t\treferrer : wpm.getReferrerFromCookie(),\n \t\t\t\t\tgclid : wpm.getClidFromBrowser(\"gclid\"),\n \t\t\t\t\t// dclid : wpm.getClidFromBrowser('dclid'),\n \t\t\t\t\tuserAgent : wpm.getUserAgent(),\n \t\t\t\t\tviewPortWidth : wpm.getViewPort().width,\n \t\t\t\t\tviewPortHeight: wpm.getViewPort().height,\n \t\t\t\t}\n\n \t\t\t\tjQuery.ajax(\n \t\t\t\t\t{\n \t\t\t\t\t\ttype : \"post\",\n \t\t\t\t\t\tdataType: \"json\",\n \t\t\t\t\t\t// url : wpm_google_premium_only_ajax_object.ajax_url,\n \t\t\t\t\t\turl : wpm.ajax_url,\n \t\t\t\t\t\tdata : data,\n \t\t\t\t\t\tsuccess: function (response) {\n\n \t\t\t\t\t\t\tif (response[\"success\"] === true) {\n \t\t\t\t\t\t\t\tif (window.sessionStorage) {\n \t\t\t\t\t\t\t\t\ttargetIDs.forEach((targetId) => {\n \t\t\t\t\t\t\t\t\t\twindow.sessionStorage.setItem('_wpm_ga_cid_set', JSON.stringify(true))\n \t\t\t\t\t\t\t\t\t\twindow.sessionStorage.setItem(\"wpm_cid_\" + targetId + \"_\" + clientID + \"_set\", JSON.stringify(true))\n \t\t\t\t\t\t\t\t\t})\n \t\t\t\t\t\t\t\t} else {\n \t\t\t\t\t\t\t\t\ttargetIDs.forEach((targetId) => {\n \t\t\t\t\t\t\t\t\t\twpm.setCookie(\"wpm_cid_\" + targetId + \"_\" + clientID + \"_set\", true)\n \t\t\t\t\t\t\t\t\t})\n \t\t\t\t\t\t\t\t}\n \t\t\t\t\t\t\t}\n \t\t\t\t\t\t},\n \t\t\t\t\t\terror : function (response) {\n \t\t\t\t\t\t\tconsole.error(response)\n \t\t\t\t\t\t},\n \t\t\t\t\t})\n\n \t\t\t\t// wp.ajax.post('wpm_google_analytics_set_session_data', data)\n \t\t\t\t// .done(function (response) {\n \t\t\t\t//\n \t\t\t\t// // console.log(response);\n \t\t\t\t//\n \t\t\t\t// if (response === 'success') {\n \t\t\t\t// if (window.sessionStorage) {\n \t\t\t\t// // console.log('setting session storage');\n \t\t\t\t// window.sessionStorage.setItem(cidSetOnServerCookie, JSON.stringify(true));\n \t\t\t\t// } else {\n \t\t\t\t// // console.log('not setting session storage');\n \t\t\t\t//\n \t\t\t\t// wpm.setCookie(cidSetOnServerCookie, true);\n \t\t\t\t// }\n \t\t\t\t// }\n \t\t\t\t// })\n \t\t\t\t// .fail(function (response) {\n \t\t\t\t// console.log(response);\n \t\t\t\t// });\n \t\t\t})\n\t\t\t})\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery))\n\n\njQuery(window).on(\"wpmLoadAlways\", function () {\n\n\ttry {\n\t\tif (\n\t\t\twpmDataLayer?.pixels?.google?.analytics?.eec &&\n\t\t\t!window?.sessionStorage?.getItem('_wpm_ga_cid_set', JSON.parse(true)) &&\n\t\t\t(\n\t\t\t\twpmDataLayer?.pixels?.google?.analytics?.universal?.property_id ||\n\t\t\t\twpmDataLayer?.pixels?.google?.analytics?.ga4?.measurement_id\n\t\t\t)\n\t\t) {\n\t\t\t// We need to be sure that we capture the cid early enough, because the\n\t\t\t// shop might be using a one click checkout button as early as on the product page.\n\t\t\tif ([\"product\", \"cart\", \"checkout\"].indexOf(wpmDataLayer.shop.page_type) >= 0) {\n\t\t\t\twpm.setGoogleCidOnServer()\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n","(function (wpm, $, undefined) {\n\n\twpm.load_hotjar_pixel = function () {\n\n\t\tif (wpmDataLayer?.pixels?.hotjar?.site_id) {\n\n\t\t\t// console.log('hotjar loaded');\n\n\t\t\twpmDataLayer.pixels.hotjar.loaded = true;\n\n\t\t\t// @formatter:off\n\t\t\t(function(h,o,t,j,a,r){\n\t\t\t\th.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};\n\t\t\t\th._hjSettings={hjid:wpmDataLayer.pixels.hotjar.site_id,hjsv:6};\n\t\t\t\ta=o.getElementsByTagName('head')[0];\n\t\t\t\tr=o.createElement('script');r.async=1;\n\t\t\t\tr.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;\n\t\t\t\ta.appendChild(r);\n\t\t\t})(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv=');\n\t\t\t// @formatter:on\n\n\t\t}\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery));\n\n\n(function () {\n\n\tjQuery(document).on(\"wpmLoadPixels\", function () {\n\n\t\tif (wpm.canIFire(\"analytics\", \"hotjar\") && !wpmDataLayer?.pixels?.hotjar?.loaded) wpm.load_hotjar_pixel()\n\n\t})\n\n})()\n\n\n\n","/**\n * Add functions for Microsoft Ads\n * */\n\n(function (wpm, $, undefined) {\n\n\twpm.load_bing_pixel = function () {\n\n\t\ttry {\n\t\t\tif (wpmDataLayer?.pixels?.bing?.uet_tag_id) {\n\n\t\t\t\twpmDataLayer.pixels.bing.loaded = true\n\n\t\t\t\t// @formatter:off\n \t\t\twindow.uetq = window.uetq || [];\n\n \t\t\t(function(w,d,t,r,u){var f,n,i;w[u]=w[u]||[],f=function(){var o={ti:wpmDataLayer.pixels.bing.uet_tag_id};o.q=w[u],w[u]=new UET(o),w[u].push(\"pageLoad\")},n=d.createElement(t),n.src=r,n.async=1,n.onload=n.onreadystatechange=function(){var s=this.readyState;s&&s!==\"loaded\"&&s!==\"complete\"||(f(),n.onload=n.onreadystatechange=null)},i=d.getElementsByTagName(t)[0],i.parentNode.insertBefore(n,i)})(window,document,\"script\",\"//bat.bing.com/bat.js\",\"uetq\");\n \t\t\t// @formatter:on\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.bing_purchase_ecomm_prodids = function () {\n\n\t\tlet prodIds = []\n\n\t\tfor (const [key, orderItem] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== orderItem.variation_id) {\n\t\t\t\tprodIds.push(String(wpmDataLayer.products[orderItem.variation_id].dyn_r_ids[wpmDataLayer.pixels.bing.dynamic_remarketing.id_type]))\n\t\t\t} else {\n\t\t\t\tprodIds.push(String(wpmDataLayer.products[orderItem.id].dyn_r_ids[wpmDataLayer.pixels.bing.dynamic_remarketing.id_type]))\n\t\t\t}\n\t\t}\n\n\t\treturn prodIds\n\t}\n\n\twpm.bing_purchase_items = function () {\n\n\t\tlet orderItems = []\n\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tlet orderItem\n\n\t\t\torderItem = {\n\t\t\t\tquantity: item.quantity,\n\t\t\t\tprice : item.price,\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.bing.dynamic_remarketing.id_type])\n\t\t\t\torderItems.push(orderItem)\n\t\t\t} else {\n\n\t\t\t\torderItem.id = String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.bing.dynamic_remarketing.id_type])\n\t\t\t\torderItems.push(orderItem)\n\t\t\t}\n\t\t}\n\n\t\treturn orderItems\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery));\n\n\n/**\n * Execute as soon as possible\n * */\n\n(function () {\n\n\tjQuery(document).on(\"wpmLoadPixels\", function () {\n\n\t\tif (wpm.canIFire(\"ads\", \"bing-ads\") && !wpmDataLayer?.pixels?.bing?.loaded) wpm.load_bing_pixel()\n\n\t})\n\n})()\n\n\n/**\n * All event listeners\n * */\n\n// add-to-cart event\njQuery(document).on(\"wpmAddToCart\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.bing?.loaded) return\n\n\t\twindow.uetq.push(\"event\", \"\", {\n\t\t\tecomm_pagetype: \"cart\",\n\t\t\tecomm_prodid : product.dyn_r_ids[wpmDataLayer.pixels.bing.dynamic_remarketing.id_type],\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view product event\njQuery(document).on(\"wpmViewItem\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.bing?.loaded) return\n\n\t\twindow.uetq.push(\"event\", \"\", {\n\t\t\tecomm_pagetype: \"product\",\n\t\t\tecomm_prodid : product.dyn_r_ids[wpmDataLayer.pixels.bing.dynamic_remarketing.id_type],\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view category event\njQuery(document).on(\"wpmCategory\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.bing?.loaded) return\n\n\t\twindow.uetq.push(\"event\", \"\", {\n\t\t\tecomm_pagetype: \"category\",\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view search event\njQuery(document).on(\"wpmSearch\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.bing?.loaded) return\n\n\t\twindow.uetq.push(\"event\", \"\", {\n\t\t\tecomm_pagetype: \"searchresults\",\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view order received page event\n// https://help.ads.microsoft.com/#apex/ads/en/60118/-1\njQuery(document).on(\"wpmOrderReceivedPage\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.bing?.loaded) return\n\n\t\twindow.uetq.push(\"event\", \"purchase\", {\n\t\t\tecomm_pagetype: \"purchase\",\n\t\t\tecomm_prodid : wpm.bing_purchase_ecomm_prodids(),\n\t\t\trevenue_value : wpmDataLayer.order.value_filtered,\n\t\t\tcurrency : wpmDataLayer.order.currency,\n\t\t\titems : wpm.bing_purchase_items(),\n\t\t})\n\n\t\t// console.log('test')\n\t\t// console.log(wpm.bing_purchase_ecomm_prodids())\n\t\t// console.log(wpm.bing_purchase_items())\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n","// TODO add enhanced match email hash to uncached pages like cart and purchase confirmation page\n// TODO check if more values can be passed to product and category pages\n// TODO look into how Pinterest handles variants separately https://developers.pinterest.com/docs/tag/conversion/\n\n/**\n * Add functions for Pinterest\n * */\n\n(function (wpm, $, undefined) {\n\n\twpm.getPinterestProductData = function (product) {\n\n\t\t// console.log(product)\n\n\t\tif (product.isVariation) {\n\t\t\treturn {\n\t\t\t\tproduct_name : product.name,\n\t\t\t\tproduct_variant_id: product.dyn_r_ids[wpmDataLayer.pixels.pinterest.dynamic_remarketing.id_type],\n\t\t\t\t// product_id : wpmDataLayer.products[product.parentId].dyn_r_ids[wpmDataLayer.pixels.pinterest.dynamic_remarketing.id_type],\n\t\t\t\tproduct_id : product.parentId_dyn_r_ids[wpmDataLayer.pixels.pinterest.dynamic_remarketing.id_type],\n\t\t\t\tproduct_category: product.category,\n\t\t\t\tproduct_variant : product.variant,\n\t\t\t\tproduct_price : product.price,\n\t\t\t\tproduct_quantity: product.quantity,\n\t\t\t\tproduct_brand : product.brand,\n\t\t\t}\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tproduct_name : product.name,\n\t\t\t\tproduct_id : product.dyn_r_ids[wpmDataLayer.pixels.pinterest.dynamic_remarketing.id_type],\n\t\t\t\tproduct_category: product.category,\n\t\t\t\tproduct_price : product.price,\n\t\t\t\tproduct_quantity: product.quantity,\n\t\t\t\tproduct_brand : product.brand,\n\t\t\t}\n\t\t}\n\t}\n\n\twpm.pinterestFormattedOrderItems = function () {\n\n\t\tlet orderItems = []\n\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tlet orderItem\n\n\t\t\torderItem = {\n\t\t\t\tproduct_category: wpmDataLayer.products[key].category.join(\",\"),\n\t\t\t\t// product_brand : wpmDataLayer.products[key].brand,\n\t\t\t\tproduct_quantity: item.quantity,\n\t\t\t\tproduct_price : item.price,\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {\n\n\t\t\t\torderItem.product_id = String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.pinterest.dynamic_remarketing.id_type])\n\t\t\t\torderItem.product_name = wpmDataLayer.products[item.variation_id].name\n\t\t\t\torderItems.push(orderItem)\n\t\t\t} else {\n\n\t\t\t\torderItem.product_id = String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.pinterest.dynamic_remarketing.id_type])\n\t\t\t\torderItem.product_name = wpmDataLayer.products[item.id].name\n\t\t\t\torderItems.push(orderItem)\n\t\t\t}\n\t\t}\n\n\t\treturn orderItems\n\t}\n\n\t// https://developers.pinterest.com/docs/tag/conversion/\n\twpm.loadPinterestPixel = function () {\n\n\t\ttry {\n\t\t\tif (wpmDataLayer?.pixels?.pinterest?.pixel_id) {\n\n\t\t\t\twpmDataLayer.pixels.pinterest.loaded = true;\n\n\t\t\t\t// @formatter:off\n \t\t\t!function(e){if(!window.pintrk){window.pintrk=function(){window.pintrk.queue.push(\n \t\t\t\tArray.prototype.slice.call(arguments))};var\n \t\t\t\tn=window.pintrk;n.queue=[],n.version=\"3.0\";var\n \t\t\t\tt=document.createElement(\"script\");t.async=!0,t.src=e;var\n \t\t\t\tr=document.getElementsByTagName(\"script\")[0];r.parentNode.insertBefore(t,r)}}(\"https://s.pinimg.com/ct/core.js\");\n\n \t\t\twpm.pinterestLoadEvent();\n \t\t\tpintrk('page');\n \t\t\t// @formatter:on\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.pinterestLoadEvent = function () {\n\t\ttry {\n\t\t\tif (\n\t\t\t\t(\n\t\t\t\t\twpmDataLayer.general.userLoggedIn ||\n\t\t\t\t\t\"order_received_page\" === wpmDataLayer.shop.page_type\n\t\t\t\t)\n\t\t\t\t&& wpmDataLayer?.pixels?.pinterest?.enhanced_match\n\t\t\t) {\n\t\t\t\tpintrk(\"load\", wpmDataLayer.pixels.pinterest.pixel_id, {em: wpmDataLayer.pixels.pinterest.enhanced_match_email})\n\t\t\t} else {\n\t\t\t\tpintrk(\"load\", wpmDataLayer.pixels.pinterest.pixel_id)\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery));\n\n/**\n * Execute as soon as possible\n * */\n\n(function () {\n\n\tjQuery(document).on(\"wpmLoadPixels\", function () {\n\n\t\tif (wpm.canIFire(\"ads\", \"pinterest-ads\") && !wpmDataLayer?.pixels?.pinterest?.loaded) wpm.loadPinterestPixel()\n\n\t})\n\n})()\n\n\n/**\n * All event listeners\n * */\n\n// https://help.pinterest.com/en/business/article/add-event-codes\n\n// AddToCart event\njQuery(document).on(\"wpmAddToCart\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.pinterest?.loaded) return\n\n\t\t// console.log('firing Pinterest ads AddToCart event');\n\t\t// console.log(product);\n\n\t\tpintrk(\"track\", \"addtocart\", {\n\t\t\tvalue : parseFloat(product.quantity * product.price),\n\t\t\tcurrency : product.currency,\n\t\t\tline_items: [wpm.getPinterestProductData(product)],\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// pageview event\njQuery(document).on(\"wpmViewItem\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.pinterest?.loaded) return\n\n\t\t// console.log('firing Pinterest pageview event');\n\t\t// console.log(product);\n\n\t\tpintrk(\"track\", \"pagevisit\", {\n\t\t\tcurrency : product.currency,\n\t\t\tline_items: [wpm.getPinterestProductData(product)],\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view product event\njQuery(document).on(\"wpmViewItem\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.pinterest?.loaded) return\n\n\t\tlet productData = wpm.getPinterestProductData(product)\n\n\t\tpintrk(\"track\", \"pagevisit\", {\n\t\t\tcurrency : product.currency,\n\t\t\tline_items: [productData],\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view search event\njQuery(document).on(\"wpmSearch\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.pinterest?.loaded) return\n\n\t\tlet urlParams = new URLSearchParams(window.location.search)\n\n\t\tpintrk(\"track\", \"search\", {\n\t\t\tsearch_query: urlParams.get(\"s\"),\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view category event\njQuery(document).on(\"wpmCategory\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.pinterest?.loaded) return\n\n\t\tpintrk(\"track\", \"viewcategory\")\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n\n// view order received page event\n// https://developers.pinterest.com/docs/tag/conversion/\njQuery(document).on(\"wpmOrderReceivedPage\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.pinterest?.loaded) return\n\n\t\tpintrk(\"track\", \"checkout\", {\n\t\t\tvalue : wpmDataLayer.order.value_filtered,\n\t\t\torder_quantity: wpmDataLayer.order.quantity,\n\t\t\tcurrency : wpmDataLayer.order.currency,\n\t\t\torder_id : wpmDataLayer.order.id,\n\t\t\tline_items : wpm.pinterestFormattedOrderItems(),\n\t\t})\n\n\t\t// console.log(wpm.pinterestFormattedOrderItems())\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n","// TODO check all events and add more if there are any\n\n/**\n * Add functions for Snapchat Ads\n * */\n\n(function (wpm, $, undefined) {\n\n\twpm.snapchatGetEmail = function () {\n\t\tlet userInfo = {}\n\n\t\tif (wpmDataLayer?.user?.email_sha256) {\n\t\t\tuserInfo.user_hashed_email = wpmDataLayer.user?.email_sha256\n\t\t}\n\t\t// console.log(userInfo)\n\t\treturn userInfo\n\t}\n\n\twpm.loadSnapchatPixel = function () {\n\n\t\ttry {\n\t\t\tif (wpmDataLayer?.pixels?.snapchat?.pixel_id) {\n\n\t\t\t\twpmDataLayer.pixels.snapchat.loaded = true;\n\n\t\t\t\t// @formatter:off\n \t\t\t(function(e,t,n){if(e.snaptr)return;var a=e.snaptr=function()\n \t\t\t{a.handleRequest?a.handleRequest.apply(a,arguments):a.queue.push(arguments)};\n \t\t\t\ta.queue=[];var s='script';r=t.createElement(s);r.async=!0;\n \t\t\t\tr.src=n;var u=t.getElementsByTagName(s)[0];\n \t\t\t\tu.parentNode.insertBefore(r,u);})(window,document,\n \t\t\t\t'https://sc-static.net/scevent.min.js');\n \t\t\t// @formatter:on\n\n\t\t\t\tsnaptr(\"init\", wpmDataLayer.pixels.snapchat.pixel_id, wpm.snapchatGetEmail())\n\t\t\t\tsnaptr(\"track\", \"PAGE_VIEW\")\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.getSnapchatOrderItemIds = function () {\n\t\tlet contentIds = []\n\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {\n\t\t\t\tcontentIds.push(String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.snapchat.dynamic_remarketing.id_type]))\n\t\t\t} else {\n\t\t\t\tcontentIds.push(String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.snapchat.dynamic_remarketing.id_type]))\n\t\t\t}\n\t\t}\n\n\t\treturn contentIds\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery));\n\n/**\n * Execute as soon as possible\n * */\n\n(function () {\n\n\tjQuery(document).on(\"wpmLoadPixels\", function () {\n\n\t\tif (wpm.canIFire(\"ads\", \"snapchat-ads\") && !wpmDataLayer?.pixels?.snapchat?.loaded) wpm.loadSnapchatPixel()\n\n\t})\n\n})()\n\n\n/**\n * All event listeners\n * */\n\n// AddToCart event\njQuery(document).on(\"wpmAddToCart\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.snapchat?.loaded) return\n\n\t\tsnaptr(\"track\", \"ADD_CART\", {\n\t\t\titem_ids: [product.dyn_r_ids[wpmDataLayer.pixels.snapchat.dynamic_remarketing.id_type]],\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// VIEW_CONTENT event\njQuery(document).on(\"wpmViewItem\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.snapchat?.loaded) return\n\n\t\tsnaptr(\"track\", \"VIEW_CONTENT\", {\n\t\t\titem_ids: [product.dyn_r_ids[wpmDataLayer.pixels.snapchat.dynamic_remarketing.id_type]],\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n\n// view order received page event\njQuery(document).on(\"wpmOrderReceivedPage\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.snapchat?.loaded) return\n\n\t\tsnaptr(\"track\", \"PURCHASE\", {\n\t\t\tcurrency : wpmDataLayer.order.currency,\n\t\t\tprice : wpmDataLayer.order.value_filtered,\n\t\t\ttransaction_id: wpmDataLayer.order.id,\n\t\t\titem_ids : wpm.getSnapchatOrderItemIds(),\n\t\t})\n\n\t\t// console.log(wpm.getSnapchatOrderItemIds())\n\t\t// console.log({price: wpmDataLayer.order.value_filtered})\n\t\t// console.log({transaction_id: wpmDataLayer.order.id})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n","// https://ads.tiktok.com/help/article?aid=10028\n\n// TODO check all events and add more if there are any\n\n\n/**\n * Add functions for TikTok Ads\n * */\n\n(function (wpm, $, undefined) {\n\n\twpm.loadTikTokPixel = function () {\n\n\t\ttry {\n\t\t\tif (wpmDataLayer?.pixels?.tiktok?.pixel_id) {\n\n\t\t\t\twpmDataLayer.pixels.tiktok.loaded = true;\n\n\t\t\t\t// @formatter:off\n \t\t\t!function (w, d, t) {\n \t\t\t\tw.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<ttq.methods.length;i++)ttq.setAndDefer(ttq,ttq.methods[i]);ttq.instance=function(t){for(var e=ttq._i[t]||[],n=0;n<ttq.methods.length;n++)ttq.setAndDefer(e,ttq.methods[n]);return e},ttq.load=function(e,n){var i=\"https://analytics.tiktok.com/i18n/pixel/events.js\";ttq._i=ttq._i||{},ttq._i[e]=[],ttq._i[e]._u=i,ttq._t=ttq._t||{},ttq._t[e]=+new Date,ttq._o=ttq._o||{},ttq._o[e]=n||{};var o=document.createElement(\"script\");o.type=\"text/javascript\",o.async=!0,o.src=i+\"?sdkid=\"+e+\"&lib=\"+t;var a=document.getElementsByTagName(\"script\")[0];a.parentNode.insertBefore(o,a)};\n \t\t\t\tttq.load(wpmDataLayer.pixels.tiktok.pixel_id);\n \t\t\t\tttq.page();\n \t\t\t}(window, document, 'ttq');\n \t\t\t// @formatter:on\n\n\t\t\t\tttq.track(\"Browse\")\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.getTikTokOrderItemIds = function () {\n\n\t\tlet orderItems = []\n\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tlet orderItem\n\n\t\t\torderItem = {\n\t\t\t\tcontent_type: \"product\",\n\t\t\t\tquantity : item.quantity,\n\t\t\t\tprice : item.price,\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {\n\n\t\t\t\torderItem.content_id = String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.bing.dynamic_remarketing.id_type])\n\t\t\t\torderItem.content_name = wpmDataLayer.products[item.variation_id].name\n\t\t\t\torderItems.push(orderItem)\n\t\t\t} else {\n\n\t\t\t\torderItem.content_id = String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.bing.dynamic_remarketing.id_type])\n\t\t\t\torderItem.content_name = wpmDataLayer.products[item.id].name\n\t\t\t\torderItems.push(orderItem)\n\t\t\t}\n\t\t}\n\n\t\treturn orderItems\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery));\n\n/**\n * Execute as soon as possible\n * */\n\n(function () {\n\n\tjQuery(document).on(\"wpmLoadPixels\", function () {\n\n\t\tif (wpm.canIFire(\"ads\", \"tiktok-ads\") && !wpmDataLayer?.pixels?.tiktok?.loaded) wpm.loadTikTokPixel()\n\n\t})\n\n})()\n\n/**\n * All event listeners\n * */\n\n// AddToCart event\njQuery(document).on(\"wpmAddToCart\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.tiktok?.loaded) return\n\n\t\tttq.track(\"AddToCart\", {\n\t\t\tcontent_id : product.dyn_r_ids[wpmDataLayer.pixels.tiktok.dynamic_remarketing.id_type],\n\t\t\tcontent_type: \"product\",\n\t\t\tcontent_name: product.name,\n\t\t\tquantity : product.quantity,\n\t\t\tvalue : product.price,\n\t\t\tcurrency : product.currency,\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// InitiateCheckout event\njQuery(document).on(\"wpmBeginCheckout\", function (event) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.tiktok?.loaded) return\n\n\t\tttq.track(\"InitiateCheckout\")\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// ViewContent event\njQuery(document).on(\"wpmViewItem\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.tiktok?.loaded) return\n\n\t\tttq.track(\"ViewContent\", {\n\t\t\tcontent_id : product.dyn_r_ids[wpmDataLayer.pixels.tiktok.dynamic_remarketing.id_type],\n\t\t\tcontent_type: \"product\",\n\t\t\tcontent_name: product.name,\n\t\t\tquantity : product.quantity,\n\t\t\tvalue : product.price,\n\t\t\tcurrency : product.currency,\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// AddToWishlist event\njQuery(document).on(\"wpmAddToWishlist\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.tiktok?.loaded) return\n\n\t\tttq.track(\"AddToWishlist\", {\n\t\t\tcontent_id : product.dyn_r_ids[wpmDataLayer.pixels.tiktok.dynamic_remarketing.id_type],\n\t\t\tcontent_type: \"product\",\n\t\t\tcontent_name: product.name,\n\t\t\tquantity : product.quantity,\n\t\t\tvalue : product.price,\n\t\t\tcurrency : product.currency,\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// search event\njQuery(document).on(\"wpmSearch\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.tiktok?.loaded) return\n\n\t\tttq.track(\"Search\")\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n\n})\n\n\n// view order received page event\njQuery(document).on(\"wpmOrderReceivedPage\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.tiktok?.loaded) return\n\n\t\tttq.track(wpmDataLayer.pixels.tiktok.purchase_event_name, {\n\t\t\tvalue : wpmDataLayer.order.value_filtered,\n\t\t\tcurrency: wpmDataLayer.order.currency,\n\t\t\tcontents: wpm.getTikTokOrderItemIds(),\n\t\t})\n\n\t\t// console.log(wpm.getTikTokOrderItemIds())\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n","// TODO implement AddPaymentInfo event\n// TODO check if more values can be passed to product and cart pages\n\n// https://business.twitter.com/en/help/campaign-measurement-and-analytics/conversion-tracking-for-websites.html\n\n/**\n * Add functions for Twitter Ads\n * */\n\n(function (wpm, $, undefined) {\n\n\twpm.loadTwitterPixel = function () {\n\n\t\ttry {\n\t\t\tif (wpmDataLayer?.pixels?.twitter?.pixel_id) {\n\n\t\t\t\twpmDataLayer.pixels.twitter.loaded = true;\n\n\t\t\t\t// @formatter:off\n \t\t\t!function(e,t,n,s,u,a){e.twq||(s=e.twq=function(){s.exe?s.exe.apply(s,arguments):s.queue.push(arguments);\n \t\t\t},s.version='1.1',s.queue=[],u=t.createElement(n),u.async=!0,u.src='//static.ads-twitter.com/uwt.js',\n \t\t\t\ta=t.getElementsByTagName(n)[0],a.parentNode.insertBefore(u,a))}(window,document,'script');\n\n \t\t\ttwq('init', wpmDataLayer.pixels.twitter.pixel_id);\n \t\t\t// @formatter:on\n\n\t\t\t\ttwq(\"track\", \"PageView\")\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.twitterGetOrderContentIds = function () {\n\t\tlet contentIds = []\n\n\t\tfor (const [key, item] of Object.entries(wpmDataLayer.order.items)) {\n\n\t\t\tif (wpmDataLayer?.general?.variationsOutput && 0 !== item.variation_id) {\n\t\t\t\tcontentIds.push(String(wpmDataLayer.products[item.variation_id].dyn_r_ids[wpmDataLayer.pixels.twitter.dynamic_remarketing.id_type]))\n\t\t\t} else {\n\t\t\t\tcontentIds.push(String(wpmDataLayer.products[item.id].dyn_r_ids[wpmDataLayer.pixels.twitter.dynamic_remarketing.id_type]))\n\t\t\t}\n\t\t}\n\n\t\treturn contentIds\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery));\n\n\n/**\n * Execute as soon as possible\n * */\n\n(function () {\n\n\tjQuery(document).on(\"wpmLoadPixels\", function () {\n\n\t\tif (wpm.canIFire(\"ads\", \"twitter-ads\") && !wpmDataLayer?.pixels?.twitter?.loaded) wpm.loadTwitterPixel()\n\n\t})\n\n})()\n\n\n/**\n * All event listeners\n * */\n\n// add-to-cart event\njQuery(document).on(\"wpmAddToCart\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.twitter?.loaded) return\n\n\t\ttwq(\"track\", \"AddToCart\")\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view product event\njQuery(document).on(\"wpmViewItem\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.twitter?.loaded) return\n\n\t\ttwq(\"track\", \"ViewContent\")\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// // view category event\n// jQuery(document).on('wpmCategory', function () {\n//\n// \tif (!wpmDataLayer?.pixels?.twitter?.loaded) return;\n//\n// \t// twq('track', 'AddToWishlist');\n// });\n\n// add-to-wishlist event\njQuery(document).on(\"wpmAddToWishlist\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.twitter?.loaded) return\n\n\t\ttwq(\"track\", \"AddToWishlist\")\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// start checkout event\njQuery(document).on(\"wpmBeginCheckout\", function (event, product) {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.twitter?.loaded) return\n\n\t\ttwq(\"track\", \"InitiateCheckout\")\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// view search event\njQuery(document).on(\"wpmSearch\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.twitter?.loaded) return\n\n\t\ttwq(\"track\", \"Search\")\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n\n// view order received page event\n// TODO find out under which circumstances to use different values in content_type\njQuery(document).on(\"wpmOrderReceivedPage\", function () {\n\n\ttry {\n\t\tif (!wpmDataLayer?.pixels?.twitter?.loaded) return\n\n\t\ttwq(\"track\", \"Purchase\", {\n\t\t\torder_id: wpmDataLayer.order.id,\n\t\t\t// content_type: 'product',\n\t\t\tvalue : wpmDataLayer.order.value_filtered,\n\t\t\tcurrency : wpmDataLayer.order.currency,\n\t\t\tnum_items : wpmDataLayer.order.quantity,\n\t\t\tcontent_ids: wpm.twitterGetOrderContentIds(),\n\t\t})\n\n\t\t// console.log(wpm.twitterGetOrderContentIds())\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n","/**\n * After wpm is loaded\n * we first check if wpmDataLayer is loaded,\n * and as soon as it is, we load the pixels,\n * and as soon as the page load is complete,\n * we fire the wpmLoad event.\n */\nwpm.wpmDataLayerExists()\n\t.then(function () {\n\t\tjQuery(document).trigger(\"wpmPreLoadPixels\", {})\n\t})\n\t.then(function () {\n\t\twpm.pageLoaded().then(function () {\n\t\t\tjQuery(document).trigger(\"wpmLoad\", {})\n\t\t})\n\t})\n\n","/**\n * Create a wpm namespace under which all functions are declared\n */\n\n// https://stackoverflow.com/a/5947280/4688612\n(function (wpm, $, undefined) {\n\n\tconst wpmDeduper = {\n\t\tkeyName : \"_wpm_order_ids\",\n\t\tcookieExpiresDays: 365,\n\t}\n\n\tconst wpmRestSettings = {\n\t\t// cookiesAvailable : '_wpm_cookies_are_available',\n\t\tcookieWpmRestEndpointAvailable: \"_wpm_endpoint_available\",\n\t\trestEndpoint : \"/wp-json/\",\n\t\trestFails : 0,\n\t\trestFailsThreshold : 10,\n\t}\n\n\twpm.emailSelected = false\n\twpm.paymentMethodSelected = false\n\n\t// wpm.checkIfCookiesAvailable = function () {\n\t//\n\t// // read the cookie if previously set, if it is return true, otherwise continue\n\t// if (wpm.getCookie(wpmRestSettings.cookiesAvailable)) {\n\t// return true;\n\t// }\n\t//\n\t// // set the cookie for the session\n\t// Cookies.set(wpmRestSettings.cookiesAvailable, true);\n\t//\n\t// // read cookie, true if ok, false if not ok\n\t// return !!wpm.getCookie(wpmRestSettings.cookiesAvailable);\n\t// }\n\n\twpm.useRestEndpoint = function () {\n\n\t\t// only if sessionStorage is available\n\n\t\t// only if REST API endpoint is generally accessible\n\t\t// check in sessionStorage if we checked before and return answer\n\t\t// otherwise check if the endpoint is available, save answer in sessionStorage and return answer\n\n\t\t// only if not too many REST API errors happened\n\n\t\treturn wpm.isSessionStorageAvailable() &&\n\t\t\twpm.isRestEndpointAvailable() &&\n\t\t\twpm.isBelowRestErrorThreshold()\n\t}\n\n\twpm.isBelowRestErrorThreshold = function () {\n\t\treturn window.sessionStorage.getItem(wpmRestSettings.restFails) <= wpmRestSettings.restFailsThreshold\n\t}\n\n\twpm.isRestEndpointAvailable = function () {\n\n\t\tif (window.sessionStorage.getItem(wpmRestSettings.cookieWpmRestEndpointAvailable)) {\n\t\t\treturn JSON.parse(window.sessionStorage.getItem(wpmRestSettings.cookieWpmRestEndpointAvailable))\n\t\t} else {\n\t\t\t// return wpm.testEndpoint();\n\t\t\t// just set the value whenever possible in order not to wait or block the main thread\n\t\t\twpm.testEndpoint()\n\t\t}\n\t}\n\n\twpm.isSessionStorageAvailable = function () {\n\n\t\treturn !!window.sessionStorage\n\t}\n\n\twpm.testEndpoint = function (\n\t\turl = location.protocol + \"//\" + location.host + wpmRestSettings.restEndpoint,\n\t\tcookieName = wpmRestSettings.cookieWpmRestEndpointAvailable,\n\t) {\n\t\t// console.log('testing endpoint');\n\n\t\tjQuery.ajax(url, {\n\t\t\ttype : \"HEAD\",\n\t\t\ttimeout: 1000,\n\t\t\t// async: false,\n\t\t\tstatusCode: {\n\t\t\t\t200: function (response) {\n\t\t\t\t\t// Cookies.set(cookieName, true);\n\t\t\t\t\t// console.log('endpoint works');\n\t\t\t\t\twindow.sessionStorage.setItem(cookieName, JSON.stringify(true))\n\t\t\t\t},\n\t\t\t\t404: function (response) {\n\t\t\t\t\t// Cookies.set(cookieName, false);\n\t\t\t\t\t// console.log('endpoint doesn\\'t work');\n\t\t\t\t\twindow.sessionStorage.setItem(cookieName, JSON.stringify(false))\n\t\t\t\t},\n\t\t\t\t0 : function (response) {\n\t\t\t\t\t// Cookies.set(cookieName, false);\n\t\t\t\t\t// console.log('endpoint doesn\\'t work');\n\t\t\t\t\twindow.sessionStorage.setItem(cookieName, JSON.stringify(false))\n\t\t\t\t},\n\t\t\t},\n\t\t}).then(r => {\n\t\t\t// console.log('test done')\n\t\t\t// console.log('result: ' + JSON.parse(window.sessionStorage.getItem(cookieName)));\n\t\t\t// return JSON.parse(window.sessionStorage.getItem(cookieName));\n\t\t})\n\t}\n\n\twpm.isWpmRestEndpointAvailable = function (cookieName = wpmRestSettings.cookieWpmRestEndpointAvailable) {\n\n\t\treturn !!wpm.getCookie(cookieName)\n\t}\n\n\twpm.writeOrderIdToStorage = function (orderId, expireDays = 365) {\n\n\t\t// save the order ID in the browser storage\n\n\t\tif (!window.Storage) {\n\t\t\tlet expiresDate = new Date()\n\t\t\texpiresDate.setDate(expiresDate.getDate() + wpmDeduper.cookieExpiresDays)\n\n\t\t\tlet ids = []\n\t\t\tif (checkCookie()) {\n\t\t\t\tids = JSON.parse(wpm.getCookie(wpmDeduper.keyName))\n\t\t\t}\n\n\t\t\tif (!ids.includes(orderId)) {\n\t\t\t\tids.push(orderId)\n\t\t\t\tdocument.cookie = wpmDeduper.keyName + \"=\" + JSON.stringify(ids) + \";expires=\" + expiresDate.toUTCString()\n\t\t\t}\n\n\t\t} else {\n\t\t\tif (localStorage.getItem(wpmDeduper.keyName) === null) {\n\t\t\t\tlet ids = []\n\t\t\t\tids.push(orderId)\n\t\t\t\twindow.localStorage.setItem(wpmDeduper.keyName, JSON.stringify(ids))\n\n\t\t\t} else {\n\t\t\t\tlet ids = JSON.parse(localStorage.getItem(wpmDeduper.keyName))\n\t\t\t\tif (!ids.includes(orderId)) {\n\t\t\t\t\tids.push(orderId)\n\t\t\t\t\twindow.localStorage.setItem(wpmDeduper.keyName, JSON.stringify(ids))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (typeof wpm.storeOrderIdOnServer === \"function\" && wpmDataLayer.orderDeduplication) {\n\t\t\twpm.storeOrderIdOnServer(orderId)\n\t\t}\n\t}\n\n\tfunction checkCookie() {\n\t\tlet key = wpm.getCookie(wpmDeduper.keyName)\n\t\treturn key !== \"\"\n\t}\n\n\twpm.isOrderIdStored = function (orderId) {\n\n\t\t// console.log('deduper: ' + wpmDataLayer.orderDeduplication);\n\t\tif (wpmDataLayer.orderDeduplication) {\n\t\t\t// console.log('order deduplication: on');\n\t\t\tif (!window.Storage) {\n\n\t\t\t\tif (checkCookie()) {\n\t\t\t\t\tlet ids = JSON.parse(wpm.getCookie(wpmDeduper.keyName))\n\t\t\t\t\treturn ids.includes(orderId)\n\t\t\t\t} else {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (localStorage.getItem(wpmDeduper.keyName) !== null) {\n\t\t\t\t\tlet ids = JSON.parse(localStorage.getItem(wpmDeduper.keyName))\n\t\t\t\t\treturn ids.includes(orderId)\n\t\t\t\t} else {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.log(\"order duplication prevention: off\")\n\t\t\treturn false\n\t\t}\n\t}\n\n\twpm.isEmail = function (email) {\n\t\t// https://emailregex.com/\n\t\tlet regex = /^(([^<>()\\[\\]\\\\.,;:\\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,}))$/\n\t\treturn regex.test(email)\n\t}\n\n\twpm.removeProductFromCart = function (productId, quantityToRemove = null) {\n\t\t// console.log('product_id: ' + productId + ' | quantityToRemove: ' + quantityToRemove);\n\n\t\ttry {\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\t\tproductId = getIdBasedOndVariationsOutputSetting(productId)\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\t\tlet quantity\n\n\t\t\tif (quantityToRemove == null) {\n\t\t\t\tquantity = wpmDataLayer.cart[productId].quantity\n\t\t\t} else {\n\t\t\t\tquantity = quantityToRemove\n\t\t\t}\n\n\t\t\t// console.log('product_id: ' + productId + ' | qty: ' + quantity);\n\t\t\t// console.log(productId);\n\t\t\t// console.log(wpmDataLayer.cart);\n\t\t\t// console.log(wpmDataLayer.cart[productId]);\n\n\t\t\tif (wpmDataLayer.cart[productId]) {\n\n\t\t\t\t// let product = {\n\t\t\t\t// id : productId.toString(),\n\t\t\t\t// dyn_r_ids: wpmDataLayer.cart[productId].dyn_r_ids,\n\t\t\t\t// name : wpmDataLayer.cart[productId].name,\n\t\t\t\t// // list_name: wpmDataLayer.shop.list_name, // doesn't make sense on mini_cart\n\t\t\t\t// brand : wpmDataLayer.cart[productId].brand,\n\t\t\t\t// category: wpmDataLayer.cart[productId].category,\n\t\t\t\t// variant : wpmDataLayer.cart[productId].variant,\n\t\t\t\t// // list_position: wpmDataLayer.cart[productId].position, // doesn't make sense on mini_cart\n\t\t\t\t// quantity : quantity,\n\t\t\t\t// price : wpmDataLayer.cart[productId].price,\n\t\t\t\t// isVariation: wpmDataLayer.products[productId].isVariation,\n\t\t\t\t// };\n\t\t\t\t//\n\t\t\t\t// if (product.isVariation) product['parentId_dyn_r_ids'] = wpmDataLayer.products[productId].parentId_dyn_r_ids;\n\n\t\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId, quantity)\n\n\t\t\t\t// console.log('removing');\n\t\t\t\t// console.log(data);\n\n\t\t\t\tjQuery(document).trigger(\"wpmRemoveFromCart\", product)\n\n\t\t\t\tif (quantityToRemove == null || wpmDataLayer.cart[productId].quantity === quantityToRemove) {\n\t\t\t\t\tdelete wpmDataLayer.cart[productId]\n\t\t\t\t\tif (sessionStorage) sessionStorage.setItem(\"wpmDataLayerCart\", JSON.stringify(wpmDataLayer.cart))\n\t\t\t\t} else {\n\t\t\t\t\twpmDataLayer.cart[productId].quantity = wpmDataLayer.cart[productId].quantity - quantity\n\t\t\t\t\tif (sessionStorage) sessionStorage.setItem(\"wpmDataLayerCart\", JSON.stringify(wpmDataLayer.cart))\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t\t// console.log('getting cart from back end');\n\t\t\t// wpm.getCartItemsFromBackend();\n\t\t\t// console.log('getting cart from back end done');\n\n\t\t}\n\t}\n\n\tgetIdBasedOndVariationsOutputSetting = function (productId) {\n\n\t\ttry {\n\t\t\tif (wpmDataLayer?.general?.variationsOutput) {\n\t\t\t\t// console.log('test');\n\t\t\t\treturn productId\n\t\t\t} else {\n\t\t\t\tif (wpmDataLayer.products[productId].isVariation) {\n\t\t\t\t\treturn wpmDataLayer.products[productId].parentId\n\t\t\t\t} else {\n\t\t\t\t\treturn productId\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\t// add_to_cart\n\twpm.addProductToCart = function (productId, quantity) {\n\n\t\ttry {\n\t\t\t// console.log('productId: ' + productId + ' | qty: ' + quantity);\n\t\t\t// console.log('productId: ' + productId + ' | variationId: ' + variationId + ' | qty: ' + quantity);\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\t\tproductId = getIdBasedOndVariationsOutputSetting(productId)\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\t\tif (wpmDataLayer.products[productId]) {\n\n\t\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId, quantity)\n\n\t\t\t\t// console.log(productId);\n\n\t\t\t\tjQuery(document).trigger(\"wpmAddToCart\", product)\n\n\t\t\t\t// add product to cart wpmDataLayer['cart']\n\n\t\t\t\t// if the product already exists in the object, only add the additional quantity\n\t\t\t\t// otherwise create that product object in the wpmDataLayer['cart']\n\t\t\t\tif (wpmDataLayer.cart !== undefined && wpmDataLayer.cart[productId] !== undefined) {\n\t\t\t\t\twpmDataLayer.cart[productId].quantity = wpmDataLayer.cart[productId].quantity + quantity\n\t\t\t\t\tif (sessionStorage) sessionStorage.setItem(\"wpmDataLayerCart\", JSON.stringify(wpmDataLayer.cart))\n\t\t\t\t} else {\n\n\t\t\t\t\tif (!wpmDataLayer.cart) {\n\n\t\t\t\t\t\t// wpmDataLayer['cart'] = {\n\t\t\t\t\t\t// [productId]: {\n\t\t\t\t\t\t// id : productId,\n\t\t\t\t\t\t// dyn_r_ids : wpmDataLayer.products[productId].dyn_r_ids,\n\t\t\t\t\t\t// name : wpmDataLayer.products[productId].name,\n\t\t\t\t\t\t// brand : wpmDataLayer.products[productId].brand,\n\t\t\t\t\t\t// category : wpmDataLayer.products[productId].category,\n\t\t\t\t\t\t// variant : wpmDataLayer.products[productId].variant,\n\t\t\t\t\t\t// quantity : quantity,\n\t\t\t\t\t\t// price : wpmDataLayer.products[productId].price,\n\t\t\t\t\t\t// isVariation: wpmDataLayer.products[productId].isVariation,\n\t\t\t\t\t\t// parentId : wpmDataLayer.products[productId].parentId,\n\t\t\t\t\t\t// }\n\t\t\t\t\t\t// };\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// if (wpmDataLayer['cart'][productId].isVariation) wpmDataLayer['cart'][productId]['parentId_dyn_r_ids'] = wpmDataLayer.products[productId].parentId_dyn_r_ids;\n\n\t\t\t\t\t\twpmDataLayer[\"cart\"] = {\n\t\t\t\t\t\t\t[productId]: wpm.getProductDetailsFormattedForEvent(productId, quantity),\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (sessionStorage) sessionStorage.setItem(\"wpmDataLayerCart\", JSON.stringify(wpmDataLayer.cart))\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// wpmDataLayer.cart[productId] = {\n\t\t\t\t\t\t// id : productId,\n\t\t\t\t\t\t// dyn_r_ids : wpmDataLayer.products[productId].dyn_r_ids,\n\t\t\t\t\t\t// name : wpmDataLayer.products[productId].name,\n\t\t\t\t\t\t// brand : wpmDataLayer.products[productId].brand,\n\t\t\t\t\t\t// category : wpmDataLayer.products[productId].category,\n\t\t\t\t\t\t// variant : wpmDataLayer.products[productId].variant,\n\t\t\t\t\t\t// quantity : quantity,\n\t\t\t\t\t\t// price : wpmDataLayer.products[productId].price,\n\t\t\t\t\t\t// isVariation: wpmDataLayer.products[productId].isVariation,\n\t\t\t\t\t\t// parentId : wpmDataLayer.products[productId].parentId,\n\t\t\t\t\t\t// };\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// if (wpmDataLayer.cart[productId].isVariation) wpmDataLayer.cart[productId]['parentId_dyn_r_ids'] = wpmDataLayer.products[productId].parentId_dyn_r_ids;\n\n\t\t\t\t\t\twpmDataLayer.cart[productId] = wpm.getProductDetailsFormattedForEvent(productId, quantity)\n\n\t\t\t\t\t\tif (sessionStorage) sessionStorage.setItem(\"wpmDataLayerCart\", JSON.stringify(wpmDataLayer.cart))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\n\t\t\t// fallback if wpmDataLayer.cart and wpmDataLayer.products got out of sync in case cart caching has an issue\n\t\t\twpm.getCartItemsFromBackend()\n\t\t}\n\t}\n\n\twpm.getCartItems = function () {\n\n\t\t// console.log('get cart items');\n\n\t\tif (sessionStorage) {\n\t\t\tif (!sessionStorage.getItem(\"wpmDataLayerCart\") || wpmDataLayer.shop.page_type === \"order_received_page\") {\n\t\t\t\tsessionStorage.setItem(\"wpmDataLayerCart\", JSON.stringify({}))\n\t\t\t} else {\n\t\t\t\twpm.saveCartObjectToDataLayer(JSON.parse(sessionStorage.getItem(\"wpmDataLayerCart\")))\n\t\t\t}\n\t\t} else {\n\t\t\twpm.getCartItemsFromBackend()\n\t\t}\n\t}\n\n\twpm.getCartItemsFromBackend = function () {\n\t\t// get all cart items from the backend\n\t\ttry {\n\t\t\tlet data = {\n\t\t\t\taction: \"wpm_get_cart_items\",\n\t\t\t}\n\n\t\t\tjQuery.ajax(\n\t\t\t\t{\n\t\t\t\t\ttype : \"get\",\n\t\t\t\t\tdataType: \"json\",\n\t\t\t\t\t// url : ajax_object.ajax_url,\n\t\t\t\t\turl : wpm.ajax_url,\n\t\t\t\t\tdata : data,\n\t\t\t\t\tsuccess: function (cartItems) {\n\n\t\t\t\t\t\t// save all cart items into wpmDataLayer\n\n\t\t\t\t\t\tif (!cartItems[\"cart\"]) cartItems[\"cart\"] = {}\n\n\t\t\t\t\t\twpm.saveCartObjectToDataLayer(cartItems[\"cart\"])\n\t\t\t\t\t\tif (sessionStorage) sessionStorage.setItem(\"wpmDataLayerCart\", JSON.stringify(cartItems[\"cart\"]))\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.getProductsFromBackend = function (productIds) {\n\t\t// console.log('getting pids from back-end: ' + productIds)\n\t\t// get productIds from the backend\n\n\t\t// reduce productIds by products already in the dataLayer\n\t\tproductIds = productIds.filter(item => !wpmDataLayer.products.hasOwnProperty(item))\n\n\t\t// if no products IDs are in the object, don't try to get anything from the server\n\t\tif (!productIds || productIds.length === 0) return\n\n\t\ttry {\n\t\t\tlet data = {\n\t\t\t\taction : \"wpm_get_product_ids\",\n\t\t\t\tproductIds: productIds,\n\t\t\t}\n\n\t\t\tjQuery.ajax(\n\t\t\t\t{\n\t\t\t\t\ttype : \"get\",\n\t\t\t\t\tdataType: \"json\",\n\t\t\t\t\t// url : ajax_object.ajax_url,\n\t\t\t\t\turl : wpm.ajax_url,\n\t\t\t\t\tdata : data,\n\t\t\t\t\tsuccess: function (products) {\n\n\t\t\t\t\t\t// merge products into wpmDataLayer.products\n\t\t\t\t\t\twpmDataLayer.products = Object.assign({}, wpmDataLayer.products, products)\n\t\t\t\t\t},\n\t\t\t\t\terror : function (response) {\n\t\t\t\t\t\tconsole.log(response)\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.saveCartObjectToDataLayer = function (cartObject) {\n\t\twpmDataLayer.cart = cartObject\n\t\twpmDataLayer.products = Object.assign({}, wpmDataLayer.products, cartObject)\n\t}\n\n\twpm.fireCheckoutOption = function (step, checkout_option = null, value = null) {\n\n\t\tlet data = {\n\t\t\tstep : step,\n\t\t\tcheckout_option: checkout_option,\n\t\t\tvalue : value,\n\t\t}\n\n\t\tjQuery(document).trigger(\"wpmFireCheckoutOption\", data)\n\t}\n\n\twpm.fireCheckoutProgress = function (step) {\n\n\t\tlet data = {\n\t\t\tstep: step,\n\t\t}\n\n\t\tjQuery(document).trigger(\"wpmFireCheckoutProgress\", data)\n\t}\n\n\twpm.getPostIdFromString = function (string) {\n\t\t// console.log(string);\n\t\ttry {\n\t\t\treturn string.match(/(post-)(\\d+)/)[2]\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.triggerViewItemList = function (productId) {\n\n\t\t// productId = null;\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\tproductId = getIdBasedOndVariationsOutputSetting(productId)\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\tjQuery(document).trigger(\"wpmViewItemList\", wpm.getProductDataForViewItemEvent(productId))\n\t}\n\n\twpm.getProductDataForViewItemEvent = function (productId) {\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\ttry {\n\t\t\tif (wpmDataLayer.products[productId]) {\n\n\t\t\t\treturn wpm.getProductDetailsFormattedForEvent(productId)\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\twpm.getMainProductIdFromProductPage = function () {\n\t\ttry {\n\t\t\tif ([\"simple\", \"variable\", \"grouped\", \"composite\", \"bundle\"].indexOf(wpmDataLayer.shop.product_type) >= 0) {\n\t\t\t\treturn jQuery(\".wpmProductId:first\").data(\"id\")\n\t\t\t} else {\n\t\t\t\treturn false\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.viewItemListTriggerTestMode = function (target) {\n\n\t\tjQuery(target).css({\"position\": \"relative\"})\n\t\tjQuery(target).append(\"<div id=\\\"viewItemListTriggerOverlay\\\"></div>\")\n\t\tjQuery(target).find(\"#viewItemListTriggerOverlay\").css({\n\t\t\t\"z-index\" : \"10\",\n\t\t\t\"display\" : \"block\",\n\t\t\t\"position\" : \"absolute\",\n\t\t\t\"height\" : \"100%\",\n\t\t\t\"top\" : \"0\",\n\t\t\t\"left\" : \"0\",\n\t\t\t\"right\" : \"0\",\n\t\t\t\"opacity\" : wpmDataLayer.viewItemListTrigger.opacity,\n\t\t\t\"background-color\": wpmDataLayer.viewItemListTrigger.backgroundColor,\n\t\t})\n\t}\n\n\twpm.getSearchTermFromUrl = function () {\n\t\ttry {\n\t\t\tlet urlParameters = new URLSearchParams(window.location.search)\n\t\t\treturn urlParameters.get(\"s\")\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\t// we need this to track timeouts for intersection observers\n\tlet ioTimeouts = {}\n\n\twpm.observerCallback = function (entries, observer) {\n\n\t\tentries.forEach((entry) => {\n\n\t\t\ttry {\n\t\t\t\tlet productId\n\n\t\t\t\tlet elementId = jQuery(entry.target).data(\"ioid\")\n\n\t\t\t\t// Get the productId from next element, if wpmProductId is a sibling, like in Gutenberg blocks\n\t\t\t\t// otherwise go search in children, like in regular WC loop items\n\t\t\t\tif (jQuery(entry.target).next(\".wpmProductId\").length) {\n\t\t\t\t\t// console.log('test 1');\n\t\t\t\t\tproductId = jQuery(entry.target).next(\".wpmProductId\").data(\"id\")\n\t\t\t\t} else {\n\t\t\t\t\tproductId = jQuery(entry.target).find(\".wpmProductId\").data(\"id\")\n\t\t\t\t}\n\n\t\t\t\t// productId = null;\n\n\t\t\t\tif (!productId) throw Error(\"wpmProductId element not found\")\n\n\t\t\t\tif (entry.isIntersecting) {\n\n\t\t\t\t\t// console.log('prodid: ' + productId);\n\t\t\t\t\tioTimeouts[elementId] = setTimeout(() => {\n\t\t\t\t\t\t// console.log('prodid: ' + productId);\n\t\t\t\t\t\twpm.triggerViewItemList(productId)\n\t\t\t\t\t\tif (wpmDataLayer.viewItemListTrigger.testMode) wpm.viewItemListTriggerTestMode(entry.target)\n\t\t\t\t\t\tif (wpmDataLayer.viewItemListTrigger.repeat === false) observer.unobserve(entry.target)\n\t\t\t\t\t}, wpmDataLayer.viewItemListTrigger.timeout)\n\n\t\t\t\t} else {\n\n\t\t\t\t\tclearTimeout(ioTimeouts[elementId])\n\t\t\t\t\tif (wpmDataLayer.viewItemListTrigger.testMode) jQuery(entry.target).find(\"#viewItemListTriggerOverlay\").remove()\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e)\n\t\t\t}\n\t\t})\n\t}\n\n\t// fire view_item_list only on products that have become visible\n\tlet io\n\tlet ioid = 0\n\tlet allIoElementsToWatch\n\n\tlet getAllElementsToWatch = function () {\n\n\t\tallIoElementsToWatch = jQuery(\".wpmProductId\")\n\t\t\t.map(function (i, elem) {\n\t\t\t\t// console.log(elem);\n\t\t\t\tif (\n\t\t\t\t\tjQuery(elem).parent().hasClass(\"type-product\") ||\n\t\t\t\t\tjQuery(elem).parent().hasClass(\"product\") ||\n\t\t\t\t\tjQuery(elem).parent().hasClass(\"product-item-inner\")\n\t\t\t\t) {\n\t\t\t\t\t// console.log(elem);\n\t\t\t\t\treturn jQuery(elem).parent()\n\t\t\t\t} else if (\n\t\t\t\t\tjQuery(elem).prev().hasClass(\"wc-block-grid__product\") ||\n\t\t\t\t\tjQuery(elem).prev().hasClass(\"product\") ||\n\t\t\t\t\tjQuery(elem).prev().hasClass(\"product-small\") ||\n\t\t\t\t\tjQuery(elem).prev().hasClass(\"woocommerce-LoopProduct-link\")\n\t\t\t\t) {\n\t\t\t\t\treturn jQuery(this).prev()\n\t\t\t\t} else if (jQuery(elem).closest(\".product\").length) {\n\t\t\t\t\treturn jQuery(elem).closest(\".product\")\n\t\t\t\t}\n\t\t\t})\n\t}\n\n\twpm.startIntersectionObserverToWatch = function () {\n\n\t\ttry {\n\t\t\t// enable view_item_list test mode from browser\n\t\t\tlet urlParams = new URLSearchParams(window.location.search)\n\t\t\tif (urlParams.has(\"vildemomode\")) wpmDataLayer.viewItemListTrigger.testMode = true\n\n\t\t\t// set up intersection observer\n\t\t\tio = new IntersectionObserver(wpm.observerCallback, {\n\t\t\t\tthreshold: wpmDataLayer.viewItemListTrigger.threshold,\n\t\t\t})\n\n\t\t\tgetAllElementsToWatch()\n\n\t\t\t// console.log(allElementsToWatch);\n\n\t\t\tallIoElementsToWatch.each(function (i, elem) {\n\t\t\t\t// console.log(elem[0]);\n\t\t\t\t// jQuery(elem[0]).attr('data-ioid', ioid++);\n\t\t\t\tjQuery(elem[0]).data(\"ioid\", ioid++)\n\n\t\t\t\tio.observe(elem[0])\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\t// watch DOM for new lazy loaded products and add them to the intersection observer\n\twpm.startProductsMutationObserverToWatch = function () {\n\n\t\ttry {\n\t\t\t// Pass in the target node, as well as the observer options\n\n\t\t\t// selects the most common parent node\n\t\t\t// https://stackoverflow.com/a/7648323/4688612\n\t\t\tlet productsNode = jQuery(\".wpmProductId:eq(0)\").parents().has(jQuery(\".wpmProductId:eq(1)\").parents()).first()\n\n\t\t\tif (productsNode.length) {\n\t\t\t\tproductsMutationObserver.observe(productsNode[0], {\n\t\t\t\t\tattributes : true,\n\t\t\t\t\tchildList : true,\n\t\t\t\t\tcharacterData: true,\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\t// Create an observer instance\n\tlet productsMutationObserver = new MutationObserver(function (mutations) {\n\n\t\tmutations.forEach(function (mutation) {\n\t\t\tlet newNodes = mutation.addedNodes // DOM NodeList\n\t\t\tif (newNodes !== null) { // If there are new nodes added\n\t\t\t\tlet nodes = jQuery(newNodes) // jQuery set\n\t\t\t\tnodes.each(function () {\n\t\t\t\t\tif (\n\t\t\t\t\t\tjQuery(this).hasClass(\"type-product\") ||\n\t\t\t\t\t\tjQuery(this).hasClass(\"product-small\") ||\n\t\t\t\t\t\tjQuery(this).hasClass(\"wc-block-grid__product\")\n\t\t\t\t\t) {\n\t\t\t\t\t\t// check if the node has a child or sibling wpmProductId\n\t\t\t\t\t\t// if yes add it to the intersectionObserver\n\t\t\t\t\t\tif (hasWpmProductIdElement(this)) {\n\t\t\t\t\t\t\tjQuery(this).data(\"ioid\", ioid++)\n\t\t\t\t\t\t\tio.observe(this)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t})\n\n\tlet hasWpmProductIdElement = function (elem) {\n\t\treturn !!(jQuery(elem).find(\".wpmProductId\").length ||\n\t\t\tjQuery(elem).siblings(\".wpmProductId\").length)\n\t}\n\n\twpm.setCookie = function (cookieName, cookieValue = \"\", expiryDays = null) {\n\t\tif (expiryDays) {\n\t\t\tlet d = new Date()\n\t\t\td.setTime(d.getTime() + (expiryDays * 24 * 60 * 60 * 1000))\n\t\t\tlet expires = \"expires=\" + d.toUTCString()\n\t\t\tdocument.cookie = cookieName + \"=\" + cookieValue + \";\" + expires + \";path=/\"\n\t\t} else {\n\t\t\tdocument.cookie = cookieName + \"=\" + cookieValue + \";path=/\"\n\t\t}\n\t}\n\n\twpm.getCookie = function (cookieName) {\n\t\tlet name = cookieName + \"=\"\n\t\tlet decodedCookie = decodeURIComponent(document.cookie)\n\t\tlet ca = decodedCookie.split(\";\")\n\t\tfor (let i = 0; i < ca.length; i++) {\n\t\t\tlet c = ca[i]\n\t\t\twhile (c.charAt(0) == \" \") {\n\t\t\t\tc = c.substring(1)\n\t\t\t}\n\t\t\tif (c.indexOf(name) == 0) {\n\t\t\t\treturn c.substring(name.length, c.length)\n\t\t\t}\n\t\t}\n\t\treturn \"\"\n\t}\n\n\twpm.getWpmSessionData = function () {\n\t\tif (window.sessionStorage) {\n\n\t\t\tlet data = window.sessionStorage.getItem(\"_wpm\")\n\t\t\tif (data !== null) {\n\t\t\t\treturn JSON.parse(data)\n\t\t\t} else {\n\t\t\t\treturn {}\n\t\t\t}\n\t\t} else {\n\t\t\treturn {}\n\t\t}\n\t}\n\n\twpm.setWpmSessionData = function (data) {\n\t\tif (window.sessionStorage) {\n\t\t\twindow.sessionStorage.setItem(\"_wpm\", JSON.stringify(data))\n\t\t}\n\t}\n\n\twpm.storeOrderIdOnServer = function (orderId) {\n\n\t\t// console.log('saving wpm_purchase_pixels_fired');\n\n\t\t// console.log('url: ' + wpm_premium_only_ajax_object.ajax_url);\n\t\t// console.log('nonce: ' + wpm_premium_only_ajax_object.nonce);\n\t\t// console.log('url: ' + wpm.ajax_url);\n\t\t// console.log('nonce: ' + wpm.nonce);\n\n\t\ttry {\n\t\t\t// save the state in the database\n\t\t\tlet data = {\n\t\t\t\taction : \"wpm_purchase_pixels_fired\",\n\t\t\t\torder_id: orderId,\n\t\t\t\t// nonce : ajax_object.nonce,\n\t\t\t\tnonce: wpm.nonce,\n\t\t\t}\n\n\t\t\tjQuery.ajax(\n\t\t\t\t{\n\t\t\t\t\ttype : \"post\",\n\t\t\t\t\tdataType: \"json\",\n\t\t\t\t\t// url : ajax_object.ajax_url,\n\t\t\t\t\turl : wpm.ajax_url,\n\t\t\t\t\tdata : data,\n\t\t\t\t\tsuccess: function (response) {\n\t\t\t\t\t\tif (response.success === false) {\n\t\t\t\t\t\t\tconsole.log(response)\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\terror : function (response) {\n\t\t\t\t\t\tconsole.log(response)\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\twpm.getProductIdByCartItemKeyUrl = function (url) {\n\t\tlet searchParams = new URLSearchParams(url.search)\n\t\tlet cartItemKey = searchParams.get(\"remove_item\")\n\n\t\tlet productId = null\n\n\t\tif (wpmDataLayer.cartItemKeys[cartItemKey][\"variation_id\"] === 0) {\n\t\t\tproductId = wpmDataLayer.cartItemKeys[cartItemKey][\"product_id\"]\n\t\t} else {\n\t\t\tproductId = wpmDataLayer.cartItemKeys[cartItemKey][\"variation_id\"]\n\t\t}\n\n\t\treturn productId\n\t}\n\n\twpm.getAddToCartLinkProductIds = function () {\n\t\treturn jQuery(\"a\").map(function () {\n\t\t\tlet href = jQuery(this).attr(\"href\")\n\n\t\t\tif (href && href.includes(\"?add-to-cart=\")) {\n\t\t\t\tlet matches = href.match(/(add-to-cart=)(\\d+)/)\n\t\t\t\tif (matches) return matches[2]\n\t\t\t}\n\t\t}).get()\n\t}\n\n\twpm.getProductDetailsFormattedForEvent = function (productId, quantity = 1) {\n\n\t\t// console.log(wpmDataLayer.products[productId].dyn_r_ids)\n\n\t\tlet product = {\n\t\t\tid : productId.toString(),\n\t\t\tdyn_r_ids : wpmDataLayer.products[productId].dyn_r_ids,\n\t\t\tname : wpmDataLayer.products[productId].name,\n\t\t\tlist_name : wpmDataLayer.shop.list_name,\n\t\t\tbrand : wpmDataLayer.products[productId].brand,\n\t\t\tcategory : wpmDataLayer.products[productId].category,\n\t\t\tvariant : wpmDataLayer.products[productId].variant,\n\t\t\tlist_position: wpmDataLayer.products[productId].position,\n\t\t\tquantity : quantity,\n\t\t\tprice : wpmDataLayer.products[productId].price,\n\t\t\tcurrency : wpmDataLayer.shop.currency,\n\t\t\tisVariable : wpmDataLayer.products[productId].isVariable,\n\t\t\tisVariation : wpmDataLayer.products[productId].isVariation,\n\t\t\tparentId : wpmDataLayer.products[productId].parentId,\n\t\t}\n\n\t\tif (product.isVariation) product[\"parentId_dyn_r_ids\"] = wpmDataLayer.products[productId].parentId_dyn_r_ids\n\n\t\treturn product\n\t}\n\n\twpm.setReferrerToCookie = function () {\n\t\t// can't use session storage as we can't read it from the server\n\t\tif (!wpm.getCookie(\"wpmReferrer\")) {\n\t\t\twpm.setCookie(\"wpmReferrer\", document.referrer)\n\t\t}\n\t}\n\n\twpm.getReferrerFromCookie = function () {\n\t\tif (wpm.getCookie(\"wpmReferrer\")) {\n\t\t\treturn wpm.getCookie(\"wpmReferrer\")\n\t\t} else {\n\t\t\treturn null\n\t\t}\n\t}\n\n\twpm.getClidFromBrowser = function (clidId = \"gclid\") {\n\n\t\tlet clidCookieId\n\n\t\tclidCookieId = {\n\t\t\tgclid: \"_gcl_aw\",\n\t\t\tdclid: \"_gcl_dc\",\n\t\t}\n\n\t\tif (wpm.getCookie(clidCookieId[clidId])) {\n\t\t\tlet clidCookie = wpm.getCookie(clidCookieId[clidId])\n\t\t\tlet matches = clidCookie.match(/(GCL.[\\d]*.)(.*)/)\n\t\t\treturn matches[2]\n\t\t} else {\n\t\t\treturn \"\"\n\t\t}\n\t}\n\n\twpm.getUserAgent = function () {\n\t\treturn navigator.userAgent\n\t}\n\n\twpm.getViewPort = function () {\n\t\treturn {\n\t\t\twidth : Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0),\n\t\t\theight: Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0),\n\t\t}\n\t}\n\n\t/*\n\t* Handle Cookie Management Platforms\n\t* */\n\n\tlet getComplianzCookies = function () {\n\n\t\tlet cmplz_statistics = wpm.getCookie(\"cmplz_statistics\")\n\t\tlet cmplz_marketing = wpm.getCookie(\"cmplz_marketing\")\n\t\tlet cmplz_consent_status = wpm.getCookie(\"cmplz_consent_status\") || wpm.getCookie(\"cmplz_banner-status\")\n\n\n\t\tif (cmplz_consent_status) {\n\t\t\treturn {\n\t\t\t\tanalytics : cmplz_statistics === \"allow\",\n\t\t\t\tads : cmplz_marketing === \"allow\",\n\t\t\t\tvisitorHasChosen: true,\n\t\t\t}\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tlet getCookieLawInfoCookies = function () {\n\n\t\tlet analyticsCookie = wpm.getCookie(\"cookielawinfo-checkbox-analytics\")\n\t\tlet adsCookie = wpm.getCookie(\"cookielawinfo-checkbox-advertisement\")\n\t\tlet visitorHasChosen = wpm.getCookie(\"CookieLawInfoConsent\")\n\n\t\tif (analyticsCookie || adsCookie) {\n\n\t\t\treturn {\n\t\t\t\tanalytics : analyticsCookie === \"yes\",\n\t\t\t\tads : adsCookie === \"yes\",\n\t\t\t\tvisitorHasChosen: !!visitorHasChosen,\n\t\t\t}\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t}\n\n\n\tlet\n\t\twpmConsentValues = {}\n\twpmConsentValues.categories = {}\n\twpmConsentValues.pixels = []\n\twpmConsentValues.mode = \"category\"\n\twpmConsentValues.visitorHasChosen = false\n\n\twpm.getConsentValues = function () {\n\t\treturn wpmConsentValues\n\t}\n\n\twpm.setConsentValueCategories = function (analytics = false, ads = false) {\n\t\twpmConsentValues.categories.analytics = analytics\n\t\twpmConsentValues.categories.ads = ads\n\t}\n\n\twpm.updateConsentCookieValues = function (explicitConsent = false) {\n\n\t\t// ad_storage\n\t\t// analytics_storage\n\t\t// functionality_storage\n\t\t// personalization_storage\n\t\t// security_storage\n\n\t\t// console.log('exp cons: ' + explicitConsent)\n\n\t\tlet cookie\n\n\t\tif (cookie = wpm.getCookie(\"CookieConsent\")) {\n\t\t\t// Cookiebot\n\t\t\t// https://wordpress.org/plugins/cookiebot/\n\t\t\tcookie = decodeURI(cookie)\n\n\t\t\t// console.log(cookie.indexOf('statistics:true'))\n\t\t\t// console.log(cookie.indexOf('marketing:true'))\n\n\t\t\twpmConsentValues.categories.analytics = cookie.indexOf(\"statistics:true\") >= 0\n\t\t\twpmConsentValues.categories.ads = cookie.indexOf(\"marketing:true\") >= 0\n\t\t\twpmConsentValues.visitorHasChosen = true\n\n\t\t} else if (cookie = wpm.getCookie(\"CookieScriptConsent\")) {\n\t\t\t// Cookie Script\n\t\t\t// https://wordpress.org/plugins/cookie-script-com/\n\n\t\t\tcookie = JSON.parse(cookie)\n\n\t\t\t// console.log(cookie)\n\t\t\t// console.log(cookie.action)\n\t\t\t// console.log('cat length: ' + cookie.categories.length)\n\t\t\t// console.log(cookie.categories.indexOf('performance'))\n\n\t\t\tif (cookie.action === \"reject\") {\n\t\t\t\twpmConsentValues.categories.analytics = false\n\t\t\t\twpmConsentValues.categories.ads = false\n\t\t\t} else if (cookie.categories.length === 2) {\n\t\t\t\twpmConsentValues.categories.analytics = true\n\t\t\t\twpmConsentValues.categories.ads = true\n\t\t\t} else {\n\t\t\t\twpmConsentValues.categories.analytics = cookie.categories.indexOf(\"performance\") >= 0\n\t\t\t\twpmConsentValues.categories.ads = cookie.categories.indexOf(\"targeting\") >= 0\n\t\t\t}\n\n\t\t\twpmConsentValues.visitorHasChosen = true\n\n\t\t\t// console.log(wpmConsentValues)\n\n\t\t} else if (cookie = wpm.getCookie(\"borlabs-cookie\")) {\n\t\t\t// Borlabs Cookie\n\t\t\t// https://borlabs.io/borlabs-cookie/\n\n\t\t\tcookie = decodeURI(cookie)\n\t\t\tcookie = JSON.parse(cookie)\n\n\t\t\twpmConsentValues.categories.analytics = !!cookie?.consents?.statistics\n\t\t\twpmConsentValues.categories.ads = !!cookie?.consents?.marketing\n\t\t\twpmConsentValues.visitorHasChosen = true\n\t\t\twpmConsentValues.pixels = [...cookie?.consents?.statistics || [], ...cookie?.consents?.marketing || []]\n\t\t\twpmConsentValues.mode = \"pixel\"\n\n\t\t} else if (cookie = getComplianzCookies()) {\n\t\t\t// Complianz Cookie\n\t\t\t// https://wordpress.org/plugins/complianz-gdpr/\n\n\t\t\t// console.log(cookie)\n\n\t\t\twpmConsentValues.categories.analytics = cookie.analytics === true\n\t\t\twpmConsentValues.categories.ads = cookie.ads === true\n\t\t\twpmConsentValues.visitorHasChosen = cookie.visitorHasChosen\n\n\t\t\t// console.log(wpmConsentValues)\n\n\t\t} else if (cookie = wpm.getCookie(\"cookie_notice_accepted\")) {\n\t\t\t// Cookie Compliance (free version)\n\t\t\t// https://wordpress.org/plugins/cookie-notice/\n\n\t\t\twpmConsentValues.categories.analytics = true\n\t\t\twpmConsentValues.categories.ads = true\n\t\t\twpmConsentValues.visitorHasChosen = true\n\n\t\t} else if (cookie = wpm.getCookie(\"hu-consent\")) {\n\t\t\t// Cookie Compliance (pro version)\n\t\t\t// https://wordpress.org/plugins/cookie-notice/\n\n\t\t\tcookie = JSON.parse(cookie)\n\n\t\t\twpmConsentValues.categories.analytics = !!cookie.categories[\"3\"]\n\t\t\twpmConsentValues.categories.ads = !!cookie.categories[\"4\"]\n\t\t\twpmConsentValues.visitorHasChosen = true\n\n\t\t} else if (cookie = getCookieLawInfoCookies()) {\n\t\t\t// CookieYes, GDPR Cookie Consent (Cookie Law Info)\n\t\t\t// https://wordpress.org/plugins/cookie-law-info/\n\n\t\t\twpmConsentValues.categories.analytics = cookie.analytics === true\n\t\t\twpmConsentValues.categories.ads = cookie.ads === true\n\t\t\twpmConsentValues.visitorHasChosen = cookie.visitorHasChosen === true\n\n\t\t} else if (cookie = wpm.getCookie(\"moove_gdpr_popup\")) {\n\t\t\t// GDPR Cookie Compliance Plugin by Moove Agency\n\t\t\t// https://wordpress.org/plugins/gdpr-cookie-compliance/\n\t\t\t// TODO write documentation on how to set up the plugin in order for this to work properly\n\n\t\t\tcookie = JSON.parse(cookie)\n\t\t\t// console.log('moove cookie thirdparty: ' + cookie.thirdparty)\n\t\t\t// console.log('moove cookie advanced: ' + cookie.advanced)\n\n\t\t\twpmConsentValues.categories.analytics = cookie.thirdparty === \"1\"\n\t\t\twpmConsentValues.categories.ads = cookie.advanced === \"1\"\n\t\t\twpmConsentValues.visitorHasChosen = true\n\n\t\t\t// console.log(wpmConsentValues)\n\n\t\t} else {\n\t\t\t// consentValues.categories.analytics = true\n\t\t\t// consentValues.categories.ads = true\n\n\t\t\twpmConsentValues.categories.analytics = !explicitConsent\n\t\t\twpmConsentValues.categories.ads = !explicitConsent\n\t\t}\n\t}\n\n\twpm.updateConsentCookieValues()\n\n\twpm.setConsentDefaultValuesToExplicit = function () {\n\t\twpmConsentValues.categories = {\n\t\t\tanalytics: false,\n\t\t\tads : false,\n\t\t}\n\t}\n\n\twpm.canIFire = function (category, pixelName) {\n\n\t\tif (\"category\" === wpmConsentValues.mode) {\n\t\t\treturn !!wpmConsentValues.categories[category]\n\t\t} else if (\"pixel\" === wpmConsentValues.mode) {\n\t\t\treturn wpmConsentValues.pixels.includes(pixelName)\n\t\t} else {\n\t\t\tconsole.error(\"Couldn't find a valid consent mode in wpmConsentValues\")\n\t\t\treturn false\n\t\t}\n\t}\n\n\t/**\n\t * Runs through each script in <head> and blocks / unblocks it according to the plugin settings\n\t * and user consent.\n\t */\n\n\t// https://stackoverflow.com/q/65453565/4688612\n\twpm.scriptTagObserver = new MutationObserver((mutations) => {\n\t\tmutations.forEach(({addedNodes}) => {\n\t\t\t[...addedNodes]\n\t\t\t\t.forEach(node => {\n\n\t\t\t\t\tif ($(node).data(\"wpm-cookie-category\")) {\n\n\t\t\t\t\t\t// console.log(node)\n\n\t\t\t\t\t\t// If the pixel category has been approved > unblock\n\t\t\t\t\t\t// If the pixel belongs to more than one category, then unblock if one of the categories has been approved\n\t\t\t\t\t\t// If no category has been approved, but the Google Consent Mode is active, then only unblock the Google scripts\n\n\t\t\t\t\t\tif (wpm.shouldScriptBeActive(node)) {\n\t\t\t\t\t\t\twpm.unblockScript(node)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\twpm.blockScript(node)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t})\n\t})\n\n\twpm.scriptTagObserver.observe(document.head, {childList: true, subtree: true})\n\twindow.addEventListener(\"DOMContentLoaded\", () => wpm.scriptTagObserver.disconnect())\n\n\twpm.shouldScriptBeActive = function (node) {\n\n\t\tif (\n\t\t\twpmDataLayer.shop.cookie_consent_mgmt.explicit_consent ||\n\t\t\twpmConsentValues.visitorHasChosen\n\t\t) {\n\n\t\t\tif (wpmConsentValues.mode === \"category\" && $(node).data(\"wpm-cookie-category\").split(\",\").some(element => wpmConsentValues.categories[element])) {\n\t\t\t\treturn true\n\t\t\t} else if (wpmConsentValues.mode === \"pixel\" && wpmConsentValues.pixels.includes($(node).data(\"wpm-pixel-name\"))) {\n\t\t\t\treturn true\n\t\t\t} else if (wpmConsentValues.mode === \"pixel\" && $(node).data(\"wpm-pixel-name\") === \"google\" && [\"google-analytics\", \"google-ads\"].some(element => wpmConsentValues.pixels.includes(element))) {\n\t\t\t\treturn true\n\t\t\t} else if (wpmDataLayer?.pixels?.google?.consent_mode?.active && $(node).data(\"wpm-pixel-name\") === \"google\") {\n\t\t\t\treturn true\n\t\t\t} else {\n\t\t\t\treturn false\n\t\t\t}\n\t\t} else {\n\t\t\treturn true\n\t\t}\n\t}\n\n\n\twpm.unblockScript = function (scriptNode, removeAttach = false) {\n\n\t\tif (removeAttach) $(scriptNode).remove()\n\n\t\tlet wpmSrc = $(scriptNode).data(\"wpm-src\")\n\t\tif (wpmSrc) $(scriptNode).attr(\"src\", wpmSrc)\n\n\t\tscriptNode.type = \"text/javascript\"\n\n\t\tif (removeAttach) $(scriptNode).appendTo(\"head\")\n\n\t\tjQuery(document).trigger(\"wpmPreLoadPixels\", {})\n\t}\n\n\twpm.blockScript = function (scriptNode, removeAttach = false) {\n\n\t\tif (removeAttach) $(scriptNode).remove()\n\n\t\tif ($(scriptNode).attr(\"src\")) $(scriptNode).removeAttr(\"src\")\n\t\tscriptNode.type = \"blocked/javascript\"\n\n\t\tif (removeAttach) $(scriptNode).appendTo(\"head\")\n\t}\n\n\twpm.unblockAllScripts = function (analytics = true, ads = true) {\n\t\t// console.log('unblocking all scripts')\n\n\t\t$.each(\n\t\t\t$(\"script[type=\\\"blocked/javascript\\\"]\"), function (index, scriptNode) {\n\n\t\t\t\tif ($(scriptNode).data(\"wpm-cookie-category\").includes(\"analytics\") && analytics) {\n\t\t\t\t\twpm.unblockScript(scriptNode, true)\n\t\t\t\t} else if ($(scriptNode).data(\"wpm-cookie-category\").includes(\"ads\") && ads) {\n\t\t\t\t\twpm.unblockScript(scriptNode, true)\n\t\t\t\t}\n\t\t\t})\n\n\t\tjQuery(document).trigger(\"wpmPreLoadPixels\", {})\n\t}\n\n\twpm.unblockSelectedPixels = function () {\n\t\t$.each(\n\t\t\t$(\"script[type=\\\"blocked/javascript\\\"]\"), function (index, node) {\n\n\t\t\t\tif (wpmConsentValues.pixels.includes($(node).data(\"wpm-pixel-name\"))) {\n\t\t\t\t\twpm.unblockScript(node, true)\n\t\t\t\t} else if ($(node).data(\"wpm-pixel-name\") === \"google\" && [\"google-analytics\", \"google-ads\"].some(element => wpmConsentValues.pixels.includes(element))) {\n\t\t\t\t\twpm.unblockScript(node, true)\n\t\t\t\t}\n\t\t\t})\n\n\t\tjQuery(document).trigger(\"wpmPreLoadPixels\", {})\n\t}\n\n\n\t/**\n\t * Block or unblock scripts for each CMP immediately after cookie consent has been updated\n\t * by the visitor.\n\t */\n\n\t// Borlabs Cookie\n\t// If visitor accepts cookies in Borlabs Cookie unblock the scripts\n\twindow.addEventListener(\"borlabs-cookie-consent-saved\", function (e) {\n\n\t\twpm.updateConsentCookieValues()\n\n\t\tif (wpmConsentValues.mode === \"pixel\") {\n\n\t\t\twpm.unblockSelectedPixels()\n\t\t\twpm.updateGoogleConsentMode(wpmConsentValues.pixels.includes(\"google-analytics\"), wpmConsentValues.pixels.includes(\"google-ads\"))\n\t\t} else {\n\n\t\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\t}\n\t})\n\n\t// Cookiebot\n\t// If visitor accepts cookies in Cookiebot unblock the scripts\n\t// https://www.cookiebot.com/en/developer/\n\twindow.addEventListener(\"CookiebotOnAccept\", function (e) {\n\t\tif (Cookiebot.consent.statistics) wpmConsentValues.categories.analytics = true\n\t\tif (Cookiebot.consent.marketing) wpmConsentValues.categories.ads = true\n\n\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\n\t}, false)\n\n\t/**\n\t * Cookie Script\n\t * If visitor accepts cookies in Cookie Script unblock the scripts\n\t * https://support.cookie-script.com/article/20-custom-events\n\t */\n\twindow.addEventListener(\"CookieScriptAccept\", function (e) {\n\t\tif (e.detail.categories.includes(\"performance\")) wpmConsentValues.categories.analytics = true\n\t\tif (e.detail.categories.includes(\"targeting\")) wpmConsentValues.categories.ads = true\n\n\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t})\n\n\t/**\n\t * Cookie Script\n\t * If visitor accepts cookies in Cookie Script unblock the scripts\n\t * https://support.cookie-script.com/\n\t */\n\twindow.addEventListener(\"CookieScriptAcceptAll\", function (e) {\n\t\twpm.unblockAllScripts(true, true)\n\t\twpm.updateGoogleConsentMode(true, true)\n\t})\n\n\t// Complianz Cookie\n\t// If visitor accepts cookies in Complianz unblock the scripts\n\tdocument.addEventListener(\"cmplzStatusChange\", function (e) {\n\n\t\twpm.updateConsentCookieValues()\n\n\t\t// console.log(wpmConsentValues)\n\n\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t})\n\n\t// Cookie Compliance by hu-manity.co (free and pro)\n\t// If visitor accepts cookies in Cookie Notice by hu-manity.co unblock the scripts (free version)\n\t// https://wordpress.org/support/topic/events-on-consent-change/#post-15202792\n\tdocument.addEventListener(\"setCookieNotice\", function (e) {\n\n\t\twpm.updateConsentCookieValues()\n\n\t\t// console.log(wpmConsentValues)\n\n\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t})\n\n\t/**\n\t * Cookie Compliance by hu-manity.co (free and pro)\n\t * If visitor accepts cookies in Cookie Notice by hu-manity.co unblock the scripts (pro version)\n\t * https://wordpress.org/support/topic/events-on-consent-change/#post-15202792\n\t * Because Cookie Notice has no documented API or event that is being triggered on consent save or update\n\t * we have to solve this by using a mutation observer.\n\t *\n\t * @type {MutationObserver}\n\t */\n\n\twpm.huObserver = new MutationObserver(function (mutations) {\n\t\tmutations.forEach(({addedNodes}) => {\n\t\t\t[...addedNodes]\n\t\t\t\t.forEach(node => {\n\n\t\t\t\t\tif (node.id === \"hu\") {\n\n\t\t\t\t\t\tjQuery(\".hu-cookies-save\").on(\"click\", function (e) {\n\t\t\t\t\t\t\twpm.updateConsentCookieValues()\n\t\t\t\t\t\t\twpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\t\t\t\t\t\twpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t})\n\t})\n\n\tif (window.hu) {\n\t\twpm.huObserver.observe(document.documentElement || document.body, {childList: true, subtree: true})\n\t}\n\n\twpm.version = function () {\n\t\tconsole.log(wpmDataLayer.version)\n\t}\n\n\t// https://api.jquery.com/jquery.getscript/\n\twpm.loadScriptAndCacheIt = function (url, options) {\n\n\t\t// Allow user to set any option except for dataType, cache, and url\n\t\toptions = jQuery.extend(options || {}, {\n\t\t\tdataType: \"script\",\n\t\t\tcache : true,\n\t\t\turl : url,\n\t\t})\n\n\t\t// Use $.ajax() since it is more flexible than $.getScript\n\t\t// Return the jqXHR object so we can chain callbacks\n\t\treturn jQuery.ajax(options)\n\t}\n\n\twpm.getOrderItemPrice = function (orderItem) {\n\t\treturn (orderItem.total + orderItem.total_tax) / orderItem.quantity\n\t}\n\n\twpm.hasLoginEventFired = function () {\n\t\tlet data = wpm.getWpmSessionData()\n\t\treturn data?.loginEventFired\n\t}\n\n\twpm.setLoginEventFired = function () {\n\t\tlet data = wpm.getWpmSessionData()\n\t\tdata[\"loginEventFired\"] = true\n\t\twpm.setWpmSessionData(data)\n\t}\n\n\twpm.wpmDataLayerExists = function () {\n\t\treturn new Promise(function (resolve) {\n\t\t\t(function waitForVar() {\n\t\t\t\tif (typeof wpmDataLayer !== \"undefined\") return resolve()\n\t\t\t\tsetTimeout(waitForVar, 50)\n\t\t\t})()\n\t\t})\n\t}\n\n\twpm.pageLoaded = function () {\n\t\treturn new Promise(function (resolve) {\n\t\t\t(function waitForVar() {\n\t\t\t\tif (\"complete\" === document.readyState) return resolve()\n\t\t\t\tsetTimeout(waitForVar, 50)\n\t\t\t})()\n\t\t})\n\t}\n\n\t// wpm['load'] = {\n\t// base: true\n\t// };\n\n\twindow[\"wpmLoaded\"] = {}\n\n\t// return {\n\t// writeOrderIdToStorage : writeOrderIdToStorage,\n\t// isOrderIdStored : isOrderIdStored,\n\t// isEmail : isEmail,\n\t// removeProductFromCart : removeProductFromCart,\n\t// getViewItemProducts : getViewItemProducts,\n\t// addProductToCart : addProductToCart,\n\t// getCartItemsFromBackEnd: getCartItemsFromBackEnd,\n\t// fireCheckoutOption : fireCheckoutOption,\n\t// getCartItems : getCartItems\n\t// }\n\n}(window.wpm = window.wpm || {}, jQuery))\n\n/**\n * Run as soon as wpm namespace is loaded\n */\n\n// run when window ready\njQuery(function () {\n// jQuery(window).on('load', function () {\n\n\twpm.wpmDataLayerExists()\n\t\t.then(function () {\n\t\t\t// watch for products visible in viewport\n\t\t\twpm.startIntersectionObserverToWatch()\n\n\t\t\t// watch for lazy loaded products\n\t\t\twpm.startProductsMutationObserverToWatch()\n\t\t})\n\n\t// let products = jQuery(\".products, .product\")\n})\n\n\n/**\n * All event listeners\n * */\n\n// remove_from_cart event\n// body.on('click', '.remove_from_cart_button, .remove', function (e) {\njQuery(document).on(\"click\", \".remove_from_cart_button, .remove\", function (e) {\n\t// jQuery('.remove_from_cart_button, .remove').on('click', function (e) {\n\n\ttry {\n\t\t// console.log('remove_from_cart: ' + jQuery(this).data('product_id'));\n\n\t\tlet url = new URL(jQuery(this).attr(\"href\"))\n\t\tlet productId = wpm.getProductIdByCartItemKeyUrl(url)\n\n\t\twpm.removeProductFromCart(productId)\n\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n\n// add_to_cart event\n// body.on('click', '.add_to_cart_button:not(.product_type_variable), .ajax_add_to_cart, .single_add_to_cart_button', function (e) {\njQuery(document).on(\"click\", \".add_to_cart_button:not(.product_type_variable), .ajax_add_to_cart, .single_add_to_cart_button\", function (e) {\n\t// jQuery('.add_to_cart_button:not(.product_type_variable), .ajax_add_to_cart, .js-ajax-add-to-cart, .single_add_to_cart_button, .btn_color-2').on('click', function (e) {\n\n\ttry {\n\t\t// console.log('add_to_cart');\n\n\t\tif (wpmDataLayer.shop.page_type === \"product\") {\n\n\t\t\t// first process related and upsell products\n\t\t\tif (typeof jQuery(this).attr(\"href\") !== \"undefined\" && jQuery(this).attr(\"href\").includes(\"add-to-cart\")) {\n\t\t\t\t// console.log('add-to-cart on upsell and related products');\n\t\t\t\tlet quantity = 1\n\t\t\t\tlet productId = jQuery(this).data(\"product_id\")\n\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\twpm.addProductToCart(productId, quantity)\n\t\t\t} else {\n\n\t\t\t\tif (wpmDataLayer.shop.product_type === \"simple\") {\n\n\t\t\t\t\t// console.log('test');\n\t\t\t\t\tlet quantity = Number(jQuery(\".input-text.qty\").val())\n\n\t\t\t\t\tif (!quantity && quantity !== 0) quantity = 1\n\n\t\t\t\t\tlet productId = jQuery(this).val()\n\n\t\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\t\t// console.log('quantity: ' + quantity);\n\n\t\t\t\t\twpm.addProductToCart(productId, quantity)\n\n\t\t\t\t} else if (wpmDataLayer.shop.product_type === \"variable\") {\n\n\t\t\t\t\t// console.log('variable');\n\n\t\t\t\t\tlet quantity = Number(jQuery(\".input-text.qty\").val())\n\n\t\t\t\t\tif (!quantity && quantity !== 0) quantity = 1\n\n\t\t\t\t\tlet productId = jQuery(\"[name='variation_id']\").val()\n\n\t\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\t\t// console.log('quantity: ' + quantity);\n\n\t\t\t\t\twpm.addProductToCart(productId, quantity)\n\n\t\t\t\t} else if (wpmDataLayer.shop.product_type === \"grouped\") {\n\n\t\t\t\t\t// console.log('grouped');\n\n\t\t\t\t\tjQuery(\".woocommerce-grouped-product-list-item\").each(function () {\n\n\t\t\t\t\t\tlet quantity = Number(jQuery(this).find(\".input-text.qty\").val())\n\n\t\t\t\t\t\tif (!quantity && quantity !== 0) quantity = 1\n\n\t\t\t\t\t\tlet classes = jQuery(this).attr(\"class\")\n\t\t\t\t\t\tlet productId = wpm.getPostIdFromString(classes)\n\n\t\t\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\t\t\t// console.log('quantity: ' + quantity);\n\n\t\t\t\t\t\twpm.addProductToCart(productId, quantity)\n\t\t\t\t\t})\n\t\t\t\t} else if (wpmDataLayer.shop.product_type === \"bundle\") {\n\n\t\t\t\t\t// console.log('bundle');\n\n\t\t\t\t\tlet quantity = Number(jQuery(\".input-text.qty\").val())\n\n\t\t\t\t\tif (!quantity && quantity !== 0) quantity = 1\n\n\t\t\t\t\tlet productId = jQuery(\"input[name=add-to-cart]\").val()\n\n\t\t\t\t\t// console.log('productId: ' + productId);\n\t\t\t\t\t// console.log('quantity: ' + quantity);\n\n\t\t\t\t\twpm.addProductToCart(productId, quantity)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\n\t\t\t// console.log('non product page');\n\n\t\t\tlet quantity = 1\n\t\t\tlet productId = jQuery(this).data(\"product_id\")\n\t\t\t// console.log('productId: ' + productId);\n\t\t\twpm.addProductToCart(productId, quantity)\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// if someone clicks anywhere on a custom /?add-to-cart=123 link\n// trigger the add to cart event\n// body.one('click', function (e) {\n//\n// try {\n// if (jQuery(this)[0].URL) {\n//\n// let href = new URL(jQuery(this)[0].URL);\n// let searchParams = new URLSearchParams(href.search);\n//\n// if (searchParams.has('add-to-cart')) {\n// // console.log('non product page, /?add-to-cart=123 link');\n//\n// let productId = searchParams.get('add-to-cart');\n// wpm.addProductToCart(productId, 1);\n// }\n// }\n// } catch (e) {\n// console.error(e);\n// }\n// });\n\n\n/**\n * If someone clicks anywhere on a custom /?add-to-cart=123 link\n * trigger the add to cart event\n */\n// body.one('click', 'a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)', function (event) {\njQuery(document).one(\"click\", \"a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)\", function (event) {\n\t// jQuery('a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)').one('click', function (event) {\n\n\ttry {\n\t\tif (jQuery(event.target).closest(\"a\").attr(\"href\")) {\n\n\t\t\tlet href = jQuery(event.target).closest(\"a\").attr(\"href\")\n\n\t\t\tif (href.includes(\"add-to-cart=\")) {\n\t\t\t\tlet matches = href.match(/(add-to-cart=)(\\d+)/)\n\t\t\t\t// console.log('pid: ' + matches[2])\n\t\t\t\tif (matches) wpm.addProductToCart(matches[2], 1)\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// select_content GA UA event\n// select_item GA 4 event\n// jQuery(document).on('click', '.woocommerce-LoopProduct-link, .wc-block-grid__product, .product-small.box', function (e) {\n// body.on('click', '.woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product', function (e) {\njQuery(document).on(\"click\", \".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product\", function (e) {\n\t// jQuery('.woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product').on('click', function (e) {\n\n\ttry {\n\n\t\t// On some pages the event fires multiple times, and on product pages\n\t\t// even on page load. Using e.stopPropagation helps to prevent this,\n\t\t// but I dont know why. We don't even have to use this, since only a real\n\t\t// product click yields a valid productId. So we filter the invalid click\n\t\t// events out later down the code. I'll keep it that way because this is\n\t\t// the most compatible way across shops.\n\t\t// e.stopPropagation();\n\n\t\t// console.log('select_content and select_item');\n\n\t\tlet productId = jQuery(this).nextAll(\".wpmProductId:first\").data(\"id\")\n\t\t// console.log('select_content and select_item: ' + productId);\n\n\n\t\t// On product pages, for some reason, the click event is triggered on the main product on page load.\n\t\t// In that case no ID is found. But we can discard it, since we only want to trigger the event on\n\t\t// related products, which are found below.\n\t\tif (productId) {\n\n\t\t\t// console.log('select_content and select_item: ' + productId);\n\n\t\t\tproductId = getIdBasedOndVariationsOutputSetting(productId)\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\t\t// console.log('prodid: ' + productId);\n\n\t\t\tif (wpmDataLayer.products && wpmDataLayer.products[productId]) {\n\n\t\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId)\n\n\t\t\t\tjQuery(document).trigger(\"wpmSelectContentGaUa\", product)\n\t\t\t\tjQuery(document).trigger(\"wpmSelectItem\", product)\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// begin_checkout event\n// body.one('click', '.checkout-button, .cart-checkout-button, .button.checkout', function (e) {\njQuery(document).one(\"click\", \".checkout-button, .cart-checkout-button, .button.checkout\", function (e) {\n\t// jQuery('.checkout-button, .cart-checkout-button, .button.checkout').one('click', function (e) {\n\t// console.log('begin_checkout');\n\n\tjQuery(document).trigger(\"wpmBeginCheckout\")\n})\n\n\n// checkout_progress event\n// track checkout option event: entered valid billing email\n// body.on('input', '#billing_email', function () {\njQuery(document).on(\"input\", \"#billing_email\", function () {\n\t// jQuery('#billing_email').on('input', function () {\n\n\tif (wpm.isEmail(jQuery(this).val())) {\n\t\t// wpm.fireCheckoutOption(2);\n\t\twpm.fireCheckoutProgress(2)\n\t\twpm.emailSelected = true\n\t}\n})\n\n// track checkout option event: purchase click\n\n// body.on('click', '.wc_payment_methods', function () {\njQuery(document).on(\"click\", \".wc_payment_methods\", function () {\n\t// jQuery('.wc_payment_methods').on('click', function () {\n\n\tif (false === wpm.paymentMethodSelected) {\n\t\twpm.fireCheckoutProgress(3)\n\t}\n\n\twpm.fireCheckoutOption(3, jQuery(\"input[name='payment_method']:checked\").val())\n\twpm.paymentMethodSelected = true\n})\n\n// track checkout option event: purchase click\n// body.one('click', '#place_order', function () {\njQuery(document).one(\"click\", \"#place_order\", function () {\n\t// jQuery('#place_order').one('click', function () {\n\n\tif (false === wpm.emailSelected) {\n\t\twpm.fireCheckoutProgress(2)\n\t}\n\n\tif (false === wpm.paymentMethodSelected) {\n\t\twpm.fireCheckoutProgress(3)\n\t\twpm.fireCheckoutOption(3, jQuery(\"input[name='payment_method']:checked\").val())\n\t}\n\n\twpm.fireCheckoutProgress(4)\n})\n\n// update cart event\n// body.on('click', \"[name='update_cart']\", function (e) {\njQuery(document).on(\"click\", \"[name='update_cart']\", function (e) {\n\t// jQuery(\"[name='update_cart']\").on('click', function (e) {\n\n\ttry {\n\t\tjQuery(\".cart_item\").each(function () {\n\n\t\t\t// let productId = jQuery(this).find('[data-product_id]').data('product_id');\n\n\t\t\tlet url = new URL(jQuery(this).find(\".product-remove\").find(\"a\").attr(\"href\"))\n\t\t\tlet productId = wpm.getProductIdByCartItemKeyUrl(url)\n\n\t\t\t// console.log(productId)\n\n\t\t\tlet quantity = jQuery(this).find(\".qty\").val()\n\n\t\t\tif (quantity === 0) {\n\t\t\t\twpm.removeProductFromCart(productId)\n\t\t\t} else if (quantity < wpmDataLayer.cart[productId].quantity) {\n\t\t\t\twpm.removeProductFromCart(productId, wpmDataLayer.cart[productId].quantity - quantity)\n\t\t\t} else if (quantity > wpmDataLayer.cart[productId].quantity) {\n\t\t\t\twpm.addProductToCart(productId, quantity - wpmDataLayer.cart[productId].quantity)\n\t\t\t}\n\t\t})\n\t} catch (e) {\n\t\tconsole.error(e)\n\t\twpm.getCartItemsFromBackend()\n\t}\n})\n\n\n// add_to_wishlist\n// body.on('click', '.add_to_wishlist, .wl-add-to', function () {\njQuery(document).on(\"click\", \".add_to_wishlist, .wl-add-to\", function () {\n\t// jQuery('.add_to_wishlist, .wl-add-to').on('click', function () {\n\n\ttry {\n\t\t// console.log('add_to_wishlist');\n\t\t// console.log('this:' + jQuery(this).data('product-id'));\n\n\t\tlet productId\n\n\t\tif (jQuery(this).data(\"productid\")) { // for the WooCommerce wishlist plugin\n\t\t\tproductId = jQuery(this).data(\"productid\")\n\t\t} else if (jQuery(this).data(\"product-id\")) { // for the YITH wishlist plugin\n\t\t\tproductId = jQuery(this).data(\"product-id\")\n\t\t}\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId)\n\n\t\t// console.log('add_to_wishlist');\n\t\t// console.log(product);\n\n\t\tjQuery(document).trigger(\"wpmAddToWishlist\", product)\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// body.on('updated_cart_totals', function () {\njQuery(document).on(\"updated_cart_totals\", function () {\n\tjQuery(document).trigger(\"wpmViewCart\")\n})\n\n\n// populate the wpmDataLayer with the cart items\njQuery(window).on(\"wpmLoad\", function () {\n\t// console.log('getting cart');\n\n\ttry {\n\t\t// console.log('wpmMiniCartActive: ' + JSON.parse(sessionStorage.getItem('wpmMiniCartActive')));\n\t\t// if ( wpmDataLayer.shop.page_type === 'cart' || wpmDataLayer.shop.mini_cart.track === true) {\n\n\t\tif (\n\t\t\tJSON.parse(sessionStorage.getItem(\"wpmMiniCartActive\")) && // if we detected calls to get_refreshed_fragments\n\t\t\tJSON.parse(sessionStorage.getItem(\"wpmFirstPageLoad\")) && // when a new session is initiated there are no items in the cart, so we can save that call\n\t\t\twpmDataLayer.shop.mini_cart.track === true // if shop owner generally allows the plugin to track the mini cart\n\t\t) {\n\t\t\t// console.log('getting cart');\n\t\t\twpm.getCartItems()\n\n\t\t} else {\n\t\t\tsessionStorage.setItem(\"wpmFirstPageLoad\", JSON.stringify(true))\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// get all add-to-cart= products from backend\njQuery(window).on(\"wpmLoad\", function () {\n\n\twpmDataLayer.products = wpmDataLayer.products || {}\n\t// wpmDataLayer.products = {14: 'x', 31: 'x', 16: 'x', 22: 'x', 40: 'x'};\n\n\t// scan page for add-to-cart= links\n\tlet productIds = wpm.getAddToCartLinkProductIds()\n\n\twpm.getProductsFromBackend(productIds)\n})\n\n/**\n * Save the referrer into a cookie\n */\n\njQuery(window).on(\"wpmLoad\", function () {\n\n\t// can't use session storage as we can't read it from the server\n\tif (!wpm.getCookie(\"wpmReferrer\")) {\n\n\t\tif (document.referrer) {\n\t\t\tlet referrerUrl = new URL(document.referrer)\n\t\t\tlet referrerHostname = referrerUrl.hostname\n\n\t\t\tif (referrerHostname !== window.location.host) {\n\t\t\t\twpm.setCookie(\"wpmReferrer\", referrerHostname)\n\t\t\t} else {\n\t\t\t\twpm.setCookie(\"wpmReferrer\", \"\")\n\t\t\t}\n\n\t\t} else {\n\t\t\twpm.setCookie(\"wpmReferrer\", \"\")\n\t\t}\n\t}\n})\n\n\n/**\n * Create our own load event in order to better handle script flow execution when JS \"optimizers\" shuffle the code.\n */\n\njQuery(window).on(\"wpmLoad\", function () {\n\ttry {\n\t\tif (typeof wpmDataLayer != \"undefined\" && !wpmDataLayer?.wpmLoadFired) {\n\n\t\t\tjQuery(document).trigger(\"wpmLoadAlways\")\n\n\t\t\tif (\"product\" === wpmDataLayer.shop.page_type && wpmDataLayer.shop.product_type !== \"variable\" && wpm.getMainProductIdFromProductPage()) {\n\n\t\t\t\tlet product = wpm.getProductDataForViewItemEvent(wpm.getMainProductIdFromProductPage())\n\t\t\t\tjQuery(document).trigger(\"wpmViewItem\", product)\n\n\t\t\t} else if (\"product_category\" === wpmDataLayer.shop.page_type) {\n\n\t\t\t\tjQuery(document).trigger(\"wpmCategory\")\n\n\t\t\t} else if (\"search\" === wpmDataLayer.shop.page_type) {\n\n\t\t\t\tjQuery(document).trigger(\"wpmSearch\")\n\n\t\t\t} else if (\"cart\" === wpmDataLayer.shop.page_type) {\n\n\t\t\t\tjQuery(document).trigger(\"wpmViewCart\")\n\n\t\t\t} else if (\"order_received_page\" === wpmDataLayer.shop.page_type && wpmDataLayer.order) {\n\n\t\t\t\tif (!wpm.isOrderIdStored(wpmDataLayer.order.id)) {\n\n\t\t\t\t\tjQuery(document).trigger(\"wpmOrderReceivedPage\")\n\t\t\t\t\twpm.writeOrderIdToStorage(wpmDataLayer.order.id)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tjQuery(document).trigger(\"wpmEverywhereElse\")\n\t\t\t}\n\n\t\t\tif (wpmDataLayer?.user?.id && !wpm.hasLoginEventFired()) {\n\t\t\t\tjQuery(document).trigger(\"wpmLogin\")\n\t\t\t\twpm.setLoginEventFired()\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Load mini cart fragments into a wpm session storage key,\n\t\t\t * after the document load event.\n\t\t\t */\n\t\t\tjQuery(document).ajaxSend(function (event, jqxhr, settings) {\n\t\t\t\t// console.log('settings.url: ' + settings.url);\n\n\t\t\t\tif (settings.url.includes(\"get_refreshed_fragments\") && sessionStorage) {\n\t\t\t\t\tif (!sessionStorage.getItem(\"wpmMiniCartActive\")) {\n\t\t\t\t\t\tsessionStorage.setItem(\"wpmMiniCartActive\", JSON.stringify(true))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\n\t\t\twpmDataLayer.wpmLoadFired = true\n\t\t}\n\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n})\n\n// jQuery(window).on(\"load\", function () {\n// \tjQuery(document).trigger(\"wpmLoad\", {})\n// })\n\njQuery(window).on(\"wpmPreLoadPixels\", function () {\n\n\tif (wpmDataLayer?.shop?.cookie_consent_mgmt?.explicit_consent) {\n\t\twpm.updateConsentCookieValues(true)\n\t}\n\tjQuery(document).trigger(\"wpmLoadPixels\", {})\n})\n\n\n/**\n * Events that only work after document ready state,\n * such as jQuery(\".single_variation_wrap\").on(\"show_variation\", function(){})\n */\n\njQuery(function () {\n\n\t/**\n\t * Fired when the user selects all the required dropdowns / attributes\n\t * Can only be hooked into after document ready\n\t * https://stackoverflow.com/a/27849208/4688612\n\t * https://stackoverflow.com/a/65065335/4688612\n\t */\n\tjQuery(\".single_variation_wrap\").on(\"show_variation\", function (event, variation) {\n\n\t\ttry {\n\t\t\tlet productId = getIdBasedOndVariationsOutputSetting(variation.variation_id)\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n\n\t\t\tif (wpmDataLayer.products && wpmDataLayer.products[productId]) {\n\n\t\t\t\t// console.log('productId: ' + productId);\n\n\t\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId)\n\n\t\t\t\tjQuery(document).trigger(\"wpmViewItem\", product)\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t}\n\t})\n\n\n})\n","(function (wpm, $, undefined) {\n\n\t// do something\n\n}(window.wpm = window.wpm || {}, jQuery))\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// TODO Try using the webpack ignore plugin to remove premium imports during compilation\n// https://webpack.js.org/plugins/ignore-plugin/\n// https://stackoverflow.com/questions/65004054/webpack-ignoreplugin-on-multiple-modules\n// https://stackoverflow.com/questions/61822069/conditional-import-import-if-exists\n// https://stackoverflow.com/questions/36367532/how-can-i-conditionally-import-an-es6-module\n\n\n// console.log(ENV)\n// if (ENV.tier === 'pro') {\n// console.log('tier')\n// }\n\n/**\n * Load all essential scripts first\n */\n\nrequire(\"./wpm\")\nrequire(\"./wpm__premium_only\")\nrequire(\"./google__premium_only\")\n\n/**\n * Load all free scripts\n */\n\nrequire(\"./google\")\nrequire(\"./google-ga-ua\")\nrequire(\"./google-ga-4\")\nrequire(\"./google-ads\")\nrequire(\"./facebook\")\nrequire(\"./hotjar\")\nrequire(\"./google-optimize\")\n\n/**\n * Load all premium scripts\n */\n\nrequire(\"./google-ga-ua-eec__premium_only\")\nrequire(\"./google-ga-4-eec__premium_only\")\nrequire(\"./tiktok__premium_only\")\nrequire(\"./snapchat__premium_only\")\nrequire(\"./pinterest__premium_only\")\nrequire(\"./facebook__premium_only\")\nrequire(\"./microsoft-ads__premium_only.js\")\nrequire(\"./twitter__premium_only.js\")\nrequire(\"./google-ads__premium_only.js\")\n\n\n/**\n * Execute the wpm loader. It makes sure that the script flow gets exectuded correctly, no matter how JS \"optimizers\" shuffle the code.\n */\n\nrequire(\"./wpm-loader\")\n\n\n// console.log('WooCommerce Pixel Manager premium version')\n\n\n"],"names":["wpm","$","undefined","fBUserData","loadFacebookPixel","wpmDataLayer","pixels","facebook","pixel_id","loaded","f","window","b","document","e","fbq","n","callMethod","apply","arguments","queue","push","_fbq","version","t","createElement","async","src","s","getElementsByTagName","parentNode","insertBefore","console","error","getRandomEventId","Math","random","toString","substring","getFbUserData","getFbUserDataFromBrowser","setFbUserData","fbp","getCookie","fbc","client_user_agent","navigator","userAgent","fbViewContent","product","eventId","content_type","content_name","name","content_ids","dyn_r_ids","dynamic_remarketing","id_type","currency","shop","value","price","eventID","jQuery","trigger","event_name","event_id","user_data","product_data","product_id","event_source_url","location","href","facebookContentIds","prodIds","key","item","Object","entries","order","items","general","variationsOutput","variation_id","String","products","id","on","canIFire","event","parseFloat","quantity","value_filtered","setFacebookIdentifiersOnServer","data","action","nonce","sessionStorage","getItem","ajax","type","dataType","url","ajax_url","success","response","setItem","JSON","stringify","content_category","category","eventData","capi","msg","indexOf","page_type","conversionIdentifiers","getGoogleAdsConversionIdentifiersWithLabel","google","ads","conversionIds","getGoogleAdsConversionIdentifiers","getGoogleAdsRegularOrderItems","orderItems","orderItem","getGoogleAdsDynamicRemarketingOrderItems","google_business_vertical","isEmptyObject","status","googleConfigConditionsMet","isVariable","send_events_with_parent_ids","gtagLoaded","then","gtag","send_to","data_basic","data_with_cart","transaction_id","number","new_customer","aw_merchant_id","discount","aw_feed_country","aw_feed_language","getCartItemsGa4","productId","cart","productItems","item_id","analytics","item_name","item_brand","brand","item_variant","variant","getFormattedGA4Categories","eec","ga4","measurement_id","index","list_position","item_list_name","list_name","item_list_id","list_id","cartValue","toFixed","position","search_term","getSearchTermFromUrl","getGA4OrderItems","item_category","join","variant_name","mp_active","affiliation","value_regular","tax","shipping","coupon","getCartItemsGaUa","universal","property_id","checkout_step","step","checkout_option","getGAUAOrderItems","load_google_optimize_pixel","optimize","container_id","loadScriptAndCacheIt","consent_mode","active","getConsentValues","mode","categories","includes","getVisitorConsentStatusAndUpdateGoogleConsentSettings","google_consent_settings","analytics_storage","ad_storage","updateGoogleConsentMode","cookie_consent_mgmt","explicit_consent","fireGtagGoogleAds","state","enhanced_conversions","phone_conversion_label","phone_conversion_number","keys","enhanced_conversion_data","fireGtagGoogleAnalyticsUA","parameters","fireGtagGoogleAnalyticsGA4","isGoogleActive","getGoogleGtagId","loadGoogle","done","script","textStatus","dataLayer","wait_for_update","region","ads_data_redaction","url_passthrough","linker","settings","Date","canGoogleLoad","Promise","resolve","reject","startTime","wait","setTimeout","Array","from","Set","isArray","length","max","i","setGoogleCidOnServer","targetIDs","clientID","target_ids","client_id","referrer","getReferrerFromCookie","gclid","getClidFromBrowser","getUserAgent","viewPortWidth","getViewPort","width","viewPortHeight","height","forEach","targetId","setCookie","parse","load_hotjar_pixel","hotjar","site_id","h","o","j","a","r","hj","q","_hjSettings","hjid","hjsv","appendChild","load_bing_pixel","bing","uet_tag_id","uetq","w","d","u","ti","UET","onload","onreadystatechange","this","readyState","bing_purchase_ecomm_prodids","bing_purchase_items","ecomm_pagetype","ecomm_prodid","revenue_value","getPinterestProductData","isVariation","product_name","product_variant_id","pinterest","parentId_dyn_r_ids","product_category","product_variant","product_price","product_quantity","product_brand","pinterestFormattedOrderItems","loadPinterestPixel","pintrk","prototype","slice","call","pinterestLoadEvent","userLoggedIn","enhanced_match","em","enhanced_match_email","line_items","productData","urlParams","URLSearchParams","search","search_query","get","order_quantity","order_id","snapchatGetEmail","userInfo","user","email_sha256","user_hashed_email","loadSnapchatPixel","snapchat","snaptr","handleRequest","getSnapchatOrderItemIds","contentIds","item_ids","loadTikTokPixel","tiktok","TiktokAnalyticsObject","ttq","methods","setAndDefer","concat","instance","_i","load","_u","_t","_o","page","track","getTikTokOrderItemIds","content_id","purchase_event_name","contents","loadTwitterPixel","twitter","twq","exe","twitterGetOrderContentIds","num_items","wpmDataLayerExists","pageLoaded","wpmDeduper","wpmRestSettings","checkCookie","emailSelected","paymentMethodSelected","useRestEndpoint","isSessionStorageAvailable","isRestEndpointAvailable","isBelowRestErrorThreshold","testEndpoint","protocol","host","cookieName","timeout","statusCode","isWpmRestEndpointAvailable","writeOrderIdToStorage","orderId","Storage","localStorage","ids","expiresDate","setDate","getDate","cookie","toUTCString","storeOrderIdOnServer","orderDeduplication","isOrderIdStored","log","isEmail","email","test","removeProductFromCart","quantityToRemove","Error","getIdBasedOndVariationsOutputSetting","getProductDetailsFormattedForEvent","parentId","addProductToCart","getCartItemsFromBackend","getCartItems","saveCartObjectToDataLayer","cartItems","getProductsFromBackend","productIds","filter","hasOwnProperty","assign","cartObject","fireCheckoutOption","fireCheckoutProgress","getPostIdFromString","string","match","triggerViewItemList","getProductDataForViewItemEvent","getMainProductIdFromProductPage","product_type","viewItemListTriggerTestMode","target","css","append","find","viewItemListTrigger","opacity","backgroundColor","io","ioTimeouts","observerCallback","observer","entry","elementId","next","isIntersecting","testMode","repeat","unobserve","clearTimeout","remove","allIoElementsToWatch","ioid","startIntersectionObserverToWatch","has","IntersectionObserver","threshold","map","elem","parent","hasClass","prev","closest","each","observe","startProductsMutationObserverToWatch","productsNode","parents","first","productsMutationObserver","attributes","childList","characterData","MutationObserver","mutations","mutation","newNodes","addedNodes","hasWpmProductIdElement","siblings","cookieValue","expiryDays","setTime","getTime","expires","ca","decodeURIComponent","split","c","charAt","getWpmSessionData","setWpmSessionData","getProductIdByCartItemKeyUrl","cartItemKey","cartItemKeys","getAddToCartLinkProductIds","attr","matches","setReferrerToCookie","clidCookieId","clidId","dclid","documentElement","clientWidth","innerWidth","clientHeight","innerHeight","getComplianzCookies","cmplz_statistics","cmplz_marketing","visitorHasChosen","getCookieLawInfoCookies","analyticsCookie","adsCookie","wpmConsentValues","setConsentValueCategories","updateConsentCookieValues","explicitConsent","decodeURI","consents","statistics","marketing","thirdparty","advanced","setConsentDefaultValuesToExplicit","pixelName","scriptTagObserver","node","shouldScriptBeActive","unblockScript","blockScript","head","subtree","addEventListener","disconnect","some","element","scriptNode","removeAttach","wpmSrc","appendTo","removeAttr","unblockAllScripts","unblockSelectedPixels","Cookiebot","consent","detail","huObserver","hu","body","options","extend","cache","getOrderItemPrice","total","total_tax","hasLoginEventFired","loginEventFired","setLoginEventFired","waitForVar","URL","Number","val","classes","one","nextAll","mini_cart","referrerHostname","hostname","wpmLoadFired","ajaxSend","jqxhr","variation","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","require"],"sourceRoot":""}
js/public/wpm.js ADDED
@@ -0,0 +1,1905 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Create a wpm namespace under which all functions are declared
3
+ */
4
+
5
+ // https://stackoverflow.com/a/5947280/4688612
6
+ (function (wpm, $, undefined) {
7
+
8
+ const wpmDeduper = {
9
+ keyName : "_wpm_order_ids",
10
+ cookieExpiresDays: 365,
11
+ }
12
+
13
+ const wpmRestSettings = {
14
+ // cookiesAvailable : '_wpm_cookies_are_available',
15
+ cookieWpmRestEndpointAvailable: "_wpm_endpoint_available",
16
+ restEndpoint : "/wp-json/",
17
+ restFails : 0,
18
+ restFailsThreshold : 10,
19
+ }
20
+
21
+ wpm.emailSelected = false
22
+ wpm.paymentMethodSelected = false
23
+
24
+ // wpm.checkIfCookiesAvailable = function () {
25
+ //
26
+ // // read the cookie if previously set, if it is return true, otherwise continue
27
+ // if (wpm.getCookie(wpmRestSettings.cookiesAvailable)) {
28
+ // return true;
29
+ // }
30
+ //
31
+ // // set the cookie for the session
32
+ // Cookies.set(wpmRestSettings.cookiesAvailable, true);
33
+ //
34
+ // // read cookie, true if ok, false if not ok
35
+ // return !!wpm.getCookie(wpmRestSettings.cookiesAvailable);
36
+ // }
37
+
38
+ wpm.useRestEndpoint = function () {
39
+
40
+ // only if sessionStorage is available
41
+
42
+ // only if REST API endpoint is generally accessible
43
+ // check in sessionStorage if we checked before and return answer
44
+ // otherwise check if the endpoint is available, save answer in sessionStorage and return answer
45
+
46
+ // only if not too many REST API errors happened
47
+
48
+ return wpm.isSessionStorageAvailable() &&
49
+ wpm.isRestEndpointAvailable() &&
50
+ wpm.isBelowRestErrorThreshold()
51
+ }
52
+
53
+ wpm.isBelowRestErrorThreshold = function () {
54
+ return window.sessionStorage.getItem(wpmRestSettings.restFails) <= wpmRestSettings.restFailsThreshold
55
+ }
56
+
57
+ wpm.isRestEndpointAvailable = function () {
58
+
59
+ if (window.sessionStorage.getItem(wpmRestSettings.cookieWpmRestEndpointAvailable)) {
60
+ return JSON.parse(window.sessionStorage.getItem(wpmRestSettings.cookieWpmRestEndpointAvailable))
61
+ } else {
62
+ // return wpm.testEndpoint();
63
+ // just set the value whenever possible in order not to wait or block the main thread
64
+ wpm.testEndpoint()
65
+ }
66
+ }
67
+
68
+ wpm.isSessionStorageAvailable = function () {
69
+
70
+ return !!window.sessionStorage
71
+ }
72
+
73
+ wpm.testEndpoint = function (
74
+ url = location.protocol + "//" + location.host + wpmRestSettings.restEndpoint,
75
+ cookieName = wpmRestSettings.cookieWpmRestEndpointAvailable,
76
+ ) {
77
+ // console.log('testing endpoint');
78
+
79
+ jQuery.ajax(url, {
80
+ type : "HEAD",
81
+ timeout: 1000,
82
+ // async: false,
83
+ statusCode: {
84
+ 200: function (response) {
85
+ // Cookies.set(cookieName, true);
86
+ // console.log('endpoint works');
87
+ window.sessionStorage.setItem(cookieName, JSON.stringify(true))
88
+ },
89
+ 404: function (response) {
90
+ // Cookies.set(cookieName, false);
91
+ // console.log('endpoint doesn\'t work');
92
+ window.sessionStorage.setItem(cookieName, JSON.stringify(false))
93
+ },
94
+ 0 : function (response) {
95
+ // Cookies.set(cookieName, false);
96
+ // console.log('endpoint doesn\'t work');
97
+ window.sessionStorage.setItem(cookieName, JSON.stringify(false))
98
+ },
99
+ },
100
+ }).then(r => {
101
+ // console.log('test done')
102
+ // console.log('result: ' + JSON.parse(window.sessionStorage.getItem(cookieName)));
103
+ // return JSON.parse(window.sessionStorage.getItem(cookieName));
104
+ })
105
+ }
106
+
107
+ wpm.isWpmRestEndpointAvailable = function (cookieName = wpmRestSettings.cookieWpmRestEndpointAvailable) {
108
+
109
+ return !!wpm.getCookie(cookieName)
110
+ }
111
+
112
+ wpm.writeOrderIdToStorage = function (orderId, expireDays = 365) {
113
+
114
+ // save the order ID in the browser storage
115
+
116
+ if (!window.Storage) {
117
+ let expiresDate = new Date()
118
+ expiresDate.setDate(expiresDate.getDate() + wpmDeduper.cookieExpiresDays)
119
+
120
+ let ids = []
121
+ if (checkCookie()) {
122
+ ids = JSON.parse(wpm.getCookie(wpmDeduper.keyName))
123
+ }
124
+
125
+ if (!ids.includes(orderId)) {
126
+ ids.push(orderId)
127
+ document.cookie = wpmDeduper.keyName + "=" + JSON.stringify(ids) + ";expires=" + expiresDate.toUTCString()
128
+ }
129
+
130
+ } else {
131
+ if (localStorage.getItem(wpmDeduper.keyName) === null) {
132
+ let ids = []
133
+ ids.push(orderId)
134
+ window.localStorage.setItem(wpmDeduper.keyName, JSON.stringify(ids))
135
+
136
+ } else {
137
+ let ids = JSON.parse(localStorage.getItem(wpmDeduper.keyName))
138
+ if (!ids.includes(orderId)) {
139
+ ids.push(orderId)
140
+ window.localStorage.setItem(wpmDeduper.keyName, JSON.stringify(ids))
141
+ }
142
+ }
143
+ }
144
+
145
+ if (typeof wpm.storeOrderIdOnServer === "function" && wpmDataLayer.orderDeduplication) {
146
+ wpm.storeOrderIdOnServer(orderId)
147
+ }
148
+ }
149
+
150
+ function checkCookie() {
151
+ let key = wpm.getCookie(wpmDeduper.keyName)
152
+ return key !== ""
153
+ }
154
+
155
+ wpm.isOrderIdStored = function (orderId) {
156
+
157
+ // console.log('deduper: ' + wpmDataLayer.orderDeduplication);
158
+ if (wpmDataLayer.orderDeduplication) {
159
+ // console.log('order deduplication: on');
160
+ if (!window.Storage) {
161
+
162
+ if (checkCookie()) {
163
+ let ids = JSON.parse(wpm.getCookie(wpmDeduper.keyName))
164
+ return ids.includes(orderId)
165
+ } else {
166
+ return false
167
+ }
168
+ } else {
169
+ if (localStorage.getItem(wpmDeduper.keyName) !== null) {
170
+ let ids = JSON.parse(localStorage.getItem(wpmDeduper.keyName))
171
+ return ids.includes(orderId)
172
+ } else {
173
+ return false
174
+ }
175
+ }
176
+ } else {
177
+ console.log("order duplication prevention: off")
178
+ return false
179
+ }
180
+ }
181
+
182
+ wpm.isEmail = function (email) {
183
+ // https://emailregex.com/
184
+ let regex = /^(([^<>()\[\]\\.,;:\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,}))$/
185
+ return regex.test(email)
186
+ }
187
+
188
+ wpm.removeProductFromCart = function (productId, quantityToRemove = null) {
189
+ // console.log('product_id: ' + productId + ' | quantityToRemove: ' + quantityToRemove);
190
+
191
+ try {
192
+
193
+ if (!productId) throw Error("Wasn't able to retrieve a productId")
194
+
195
+ productId = getIdBasedOndVariationsOutputSetting(productId)
196
+
197
+ if (!productId) throw Error("Wasn't able to retrieve a productId")
198
+
199
+ let quantity
200
+
201
+ if (quantityToRemove == null) {
202
+ quantity = wpmDataLayer.cart[productId].quantity
203
+ } else {
204
+ quantity = quantityToRemove
205
+ }
206
+
207
+ // console.log('product_id: ' + productId + ' | qty: ' + quantity);
208
+ // console.log(productId);
209
+ // console.log(wpmDataLayer.cart);
210
+ // console.log(wpmDataLayer.cart[productId]);
211
+
212
+ if (wpmDataLayer.cart[productId]) {
213
+
214
+ // let product = {
215
+ // id : productId.toString(),
216
+ // dyn_r_ids: wpmDataLayer.cart[productId].dyn_r_ids,
217
+ // name : wpmDataLayer.cart[productId].name,
218
+ // // list_name: wpmDataLayer.shop.list_name, // doesn't make sense on mini_cart
219
+ // brand : wpmDataLayer.cart[productId].brand,
220
+ // category: wpmDataLayer.cart[productId].category,
221
+ // variant : wpmDataLayer.cart[productId].variant,
222
+ // // list_position: wpmDataLayer.cart[productId].position, // doesn't make sense on mini_cart
223
+ // quantity : quantity,
224
+ // price : wpmDataLayer.cart[productId].price,
225
+ // isVariation: wpmDataLayer.products[productId].isVariation,
226
+ // };
227
+ //
228
+ // if (product.isVariation) product['parentId_dyn_r_ids'] = wpmDataLayer.products[productId].parentId_dyn_r_ids;
229
+
230
+ let product = wpm.getProductDetailsFormattedForEvent(productId, quantity)
231
+
232
+ // console.log('removing');
233
+ // console.log(data);
234
+
235
+ jQuery(document).trigger("wpmRemoveFromCart", product)
236
+
237
+ if (quantityToRemove == null || wpmDataLayer.cart[productId].quantity === quantityToRemove) {
238
+ delete wpmDataLayer.cart[productId]
239
+ if (sessionStorage) sessionStorage.setItem("wpmDataLayerCart", JSON.stringify(wpmDataLayer.cart))
240
+ } else {
241
+ wpmDataLayer.cart[productId].quantity = wpmDataLayer.cart[productId].quantity - quantity
242
+ if (sessionStorage) sessionStorage.setItem("wpmDataLayerCart", JSON.stringify(wpmDataLayer.cart))
243
+ }
244
+ }
245
+ } catch (e) {
246
+ console.error(e)
247
+ // console.log('getting cart from back end');
248
+ // wpm.getCartItemsFromBackend();
249
+ // console.log('getting cart from back end done');
250
+
251
+ }
252
+ }
253
+
254
+ getIdBasedOndVariationsOutputSetting = function (productId) {
255
+
256
+ try {
257
+ if (wpmDataLayer?.general?.variationsOutput) {
258
+ // console.log('test');
259
+ return productId
260
+ } else {
261
+ if (wpmDataLayer.products[productId].isVariation) {
262
+ return wpmDataLayer.products[productId].parentId
263
+ } else {
264
+ return productId
265
+ }
266
+ }
267
+ } catch (e) {
268
+ console.error(e)
269
+ }
270
+ }
271
+
272
+ // add_to_cart
273
+ wpm.addProductToCart = function (productId, quantity) {
274
+
275
+ try {
276
+ // console.log('productId: ' + productId + ' | qty: ' + quantity);
277
+ // console.log('productId: ' + productId + ' | variationId: ' + variationId + ' | qty: ' + quantity);
278
+
279
+ if (!productId) throw Error("Wasn't able to retrieve a productId")
280
+
281
+ productId = getIdBasedOndVariationsOutputSetting(productId)
282
+
283
+ if (!productId) throw Error("Wasn't able to retrieve a productId")
284
+
285
+ if (wpmDataLayer.products[productId]) {
286
+
287
+ let product = wpm.getProductDetailsFormattedForEvent(productId, quantity)
288
+
289
+ // console.log(productId);
290
+
291
+ jQuery(document).trigger("wpmAddToCart", product)
292
+
293
+ // add product to cart wpmDataLayer['cart']
294
+
295
+ // if the product already exists in the object, only add the additional quantity
296
+ // otherwise create that product object in the wpmDataLayer['cart']
297
+ if (wpmDataLayer.cart !== undefined && wpmDataLayer.cart[productId] !== undefined) {
298
+ wpmDataLayer.cart[productId].quantity = wpmDataLayer.cart[productId].quantity + quantity
299
+ if (sessionStorage) sessionStorage.setItem("wpmDataLayerCart", JSON.stringify(wpmDataLayer.cart))
300
+ } else {
301
+
302
+ if (!wpmDataLayer.cart) {
303
+
304
+ // wpmDataLayer['cart'] = {
305
+ // [productId]: {
306
+ // id : productId,
307
+ // dyn_r_ids : wpmDataLayer.products[productId].dyn_r_ids,
308
+ // name : wpmDataLayer.products[productId].name,
309
+ // brand : wpmDataLayer.products[productId].brand,
310
+ // category : wpmDataLayer.products[productId].category,
311
+ // variant : wpmDataLayer.products[productId].variant,
312
+ // quantity : quantity,
313
+ // price : wpmDataLayer.products[productId].price,
314
+ // isVariation: wpmDataLayer.products[productId].isVariation,
315
+ // parentId : wpmDataLayer.products[productId].parentId,
316
+ // }
317
+ // };
318
+ //
319
+ // if (wpmDataLayer['cart'][productId].isVariation) wpmDataLayer['cart'][productId]['parentId_dyn_r_ids'] = wpmDataLayer.products[productId].parentId_dyn_r_ids;
320
+
321
+ wpmDataLayer["cart"] = {
322
+ [productId]: wpm.getProductDetailsFormattedForEvent(productId, quantity),
323
+ }
324
+
325
+ if (sessionStorage) sessionStorage.setItem("wpmDataLayerCart", JSON.stringify(wpmDataLayer.cart))
326
+ } else {
327
+
328
+ // wpmDataLayer.cart[productId] = {
329
+ // id : productId,
330
+ // dyn_r_ids : wpmDataLayer.products[productId].dyn_r_ids,
331
+ // name : wpmDataLayer.products[productId].name,
332
+ // brand : wpmDataLayer.products[productId].brand,
333
+ // category : wpmDataLayer.products[productId].category,
334
+ // variant : wpmDataLayer.products[productId].variant,
335
+ // quantity : quantity,
336
+ // price : wpmDataLayer.products[productId].price,
337
+ // isVariation: wpmDataLayer.products[productId].isVariation,
338
+ // parentId : wpmDataLayer.products[productId].parentId,
339
+ // };
340
+ //
341
+ // if (wpmDataLayer.cart[productId].isVariation) wpmDataLayer.cart[productId]['parentId_dyn_r_ids'] = wpmDataLayer.products[productId].parentId_dyn_r_ids;
342
+
343
+ wpmDataLayer.cart[productId] = wpm.getProductDetailsFormattedForEvent(productId, quantity)
344
+
345
+ if (sessionStorage) sessionStorage.setItem("wpmDataLayerCart", JSON.stringify(wpmDataLayer.cart))
346
+ }
347
+ }
348
+ }
349
+ } catch (e) {
350
+ console.error(e)
351
+
352
+ // fallback if wpmDataLayer.cart and wpmDataLayer.products got out of sync in case cart caching has an issue
353
+ wpm.getCartItemsFromBackend()
354
+ }
355
+ }
356
+
357
+ wpm.getCartItems = function () {
358
+
359
+ // console.log('get cart items');
360
+
361
+ if (sessionStorage) {
362
+ if (!sessionStorage.getItem("wpmDataLayerCart") || wpmDataLayer.shop.page_type === "order_received_page") {
363
+ sessionStorage.setItem("wpmDataLayerCart", JSON.stringify({}))
364
+ } else {
365
+ wpm.saveCartObjectToDataLayer(JSON.parse(sessionStorage.getItem("wpmDataLayerCart")))
366
+ }
367
+ } else {
368
+ wpm.getCartItemsFromBackend()
369
+ }
370
+ }
371
+
372
+ wpm.getCartItemsFromBackend = function () {
373
+ // get all cart items from the backend
374
+ try {
375
+ let data = {
376
+ action: "wpm_get_cart_items",
377
+ }
378
+
379
+ jQuery.ajax(
380
+ {
381
+ type : "get",
382
+ dataType: "json",
383
+ // url : ajax_object.ajax_url,
384
+ url : wpm.ajax_url,
385
+ data : data,
386
+ success: function (cartItems) {
387
+
388
+ // save all cart items into wpmDataLayer
389
+
390
+ if (!cartItems["cart"]) cartItems["cart"] = {}
391
+
392
+ wpm.saveCartObjectToDataLayer(cartItems["cart"])
393
+ if (sessionStorage) sessionStorage.setItem("wpmDataLayerCart", JSON.stringify(cartItems["cart"]))
394
+ },
395
+ })
396
+ } catch (e) {
397
+ console.error(e)
398
+ }
399
+ }
400
+
401
+ wpm.getProductsFromBackend = function (productIds) {
402
+ // console.log('getting pids from back-end: ' + productIds)
403
+ // get productIds from the backend
404
+
405
+ // reduce productIds by products already in the dataLayer
406
+ productIds = productIds.filter(item => !wpmDataLayer.products.hasOwnProperty(item))
407
+
408
+ // if no products IDs are in the object, don't try to get anything from the server
409
+ if (!productIds || productIds.length === 0) return
410
+
411
+ try {
412
+ let data = {
413
+ action : "wpm_get_product_ids",
414
+ productIds: productIds,
415
+ }
416
+
417
+ jQuery.ajax(
418
+ {
419
+ type : "get",
420
+ dataType: "json",
421
+ // url : ajax_object.ajax_url,
422
+ url : wpm.ajax_url,
423
+ data : data,
424
+ success: function (products) {
425
+
426
+ // merge products into wpmDataLayer.products
427
+ wpmDataLayer.products = Object.assign({}, wpmDataLayer.products, products)
428
+ },
429
+ error : function (response) {
430
+ console.log(response)
431
+ },
432
+ })
433
+ } catch (e) {
434
+ console.error(e)
435
+ }
436
+ }
437
+
438
+ wpm.saveCartObjectToDataLayer = function (cartObject) {
439
+ wpmDataLayer.cart = cartObject
440
+ wpmDataLayer.products = Object.assign({}, wpmDataLayer.products, cartObject)
441
+ }
442
+
443
+ wpm.fireCheckoutOption = function (step, checkout_option = null, value = null) {
444
+
445
+ let data = {
446
+ step : step,
447
+ checkout_option: checkout_option,
448
+ value : value,
449
+ }
450
+
451
+ jQuery(document).trigger("wpmFireCheckoutOption", data)
452
+ }
453
+
454
+ wpm.fireCheckoutProgress = function (step) {
455
+
456
+ let data = {
457
+ step: step,
458
+ }
459
+
460
+ jQuery(document).trigger("wpmFireCheckoutProgress", data)
461
+ }
462
+
463
+ wpm.getPostIdFromString = function (string) {
464
+ // console.log(string);
465
+ try {
466
+ return string.match(/(post-)(\d+)/)[2]
467
+ } catch (e) {
468
+ console.error(e)
469
+ }
470
+ }
471
+
472
+ wpm.triggerViewItemList = function (productId) {
473
+
474
+ // productId = null;
475
+
476
+ if (!productId) throw Error("Wasn't able to retrieve a productId")
477
+
478
+ productId = getIdBasedOndVariationsOutputSetting(productId)
479
+
480
+ if (!productId) throw Error("Wasn't able to retrieve a productId")
481
+
482
+ jQuery(document).trigger("wpmViewItemList", wpm.getProductDataForViewItemEvent(productId))
483
+ }
484
+
485
+ wpm.getProductDataForViewItemEvent = function (productId) {
486
+
487
+ if (!productId) throw Error("Wasn't able to retrieve a productId")
488
+
489
+ try {
490
+ if (wpmDataLayer.products[productId]) {
491
+
492
+ return wpm.getProductDetailsFormattedForEvent(productId)
493
+ }
494
+ } catch (e) {
495
+ console.error(e)
496
+ }
497
+ }
498
+ wpm.getMainProductIdFromProductPage = function () {
499
+ try {
500
+ if (["simple", "variable", "grouped", "composite", "bundle"].indexOf(wpmDataLayer.shop.product_type) >= 0) {
501
+ return jQuery(".wpmProductId:first").data("id")
502
+ } else {
503
+ return false
504
+ }
505
+ } catch (e) {
506
+ console.error(e)
507
+ }
508
+ }
509
+
510
+ wpm.viewItemListTriggerTestMode = function (target) {
511
+
512
+ jQuery(target).css({"position": "relative"})
513
+ jQuery(target).append("<div id=\"viewItemListTriggerOverlay\"></div>")
514
+ jQuery(target).find("#viewItemListTriggerOverlay").css({
515
+ "z-index" : "10",
516
+ "display" : "block",
517
+ "position" : "absolute",
518
+ "height" : "100%",
519
+ "top" : "0",
520
+ "left" : "0",
521
+ "right" : "0",
522
+ "opacity" : wpmDataLayer.viewItemListTrigger.opacity,
523
+ "background-color": wpmDataLayer.viewItemListTrigger.backgroundColor,
524
+ })
525
+ }
526
+
527
+ wpm.getSearchTermFromUrl = function () {
528
+ try {
529
+ let urlParameters = new URLSearchParams(window.location.search)
530
+ return urlParameters.get("s")
531
+ } catch (e) {
532
+ console.error(e)
533
+ }
534
+ }
535
+
536
+ // we need this to track timeouts for intersection observers
537
+ let ioTimeouts = {}
538
+
539
+ wpm.observerCallback = function (entries, observer) {
540
+
541
+ entries.forEach((entry) => {
542
+
543
+ try {
544
+ let productId
545
+
546
+ let elementId = jQuery(entry.target).data("ioid")
547
+
548
+ // Get the productId from next element, if wpmProductId is a sibling, like in Gutenberg blocks
549
+ // otherwise go search in children, like in regular WC loop items
550
+ if (jQuery(entry.target).next(".wpmProductId").length) {
551
+ // console.log('test 1');
552
+ productId = jQuery(entry.target).next(".wpmProductId").data("id")
553
+ } else {
554
+ productId = jQuery(entry.target).find(".wpmProductId").data("id")
555
+ }
556
+
557
+ // productId = null;
558
+
559
+ if (!productId) throw Error("wpmProductId element not found")
560
+
561
+ if (entry.isIntersecting) {
562
+
563
+ // console.log('prodid: ' + productId);
564
+ ioTimeouts[elementId] = setTimeout(() => {
565
+ // console.log('prodid: ' + productId);
566
+ wpm.triggerViewItemList(productId)
567
+ if (wpmDataLayer.viewItemListTrigger.testMode) wpm.viewItemListTriggerTestMode(entry.target)
568
+ if (wpmDataLayer.viewItemListTrigger.repeat === false) observer.unobserve(entry.target)
569
+ }, wpmDataLayer.viewItemListTrigger.timeout)
570
+
571
+ } else {
572
+
573
+ clearTimeout(ioTimeouts[elementId])
574
+ if (wpmDataLayer.viewItemListTrigger.testMode) jQuery(entry.target).find("#viewItemListTriggerOverlay").remove()
575
+ }
576
+ } catch (e) {
577
+ console.error(e)
578
+ }
579
+ })
580
+ }
581
+
582
+ // fire view_item_list only on products that have become visible
583
+ let io
584
+ let ioid = 0
585
+ let allIoElementsToWatch
586
+
587
+ let getAllElementsToWatch = function () {
588
+
589
+ allIoElementsToWatch = jQuery(".wpmProductId")
590
+ .map(function (i, elem) {
591
+ // console.log(elem);
592
+ if (
593
+ jQuery(elem).parent().hasClass("type-product") ||
594
+ jQuery(elem).parent().hasClass("product") ||
595
+ jQuery(elem).parent().hasClass("product-item-inner")
596
+ ) {
597
+ // console.log(elem);
598
+ return jQuery(elem).parent()
599
+ } else if (
600
+ jQuery(elem).prev().hasClass("wc-block-grid__product") ||
601
+ jQuery(elem).prev().hasClass("product") ||
602
+ jQuery(elem).prev().hasClass("product-small") ||
603
+ jQuery(elem).prev().hasClass("woocommerce-LoopProduct-link")
604
+ ) {
605
+ return jQuery(this).prev()
606
+ } else if (jQuery(elem).closest(".product").length) {
607
+ return jQuery(elem).closest(".product")
608
+ }
609
+ })
610
+ }
611
+
612
+ wpm.startIntersectionObserverToWatch = function () {
613
+
614
+ try {
615
+ // enable view_item_list test mode from browser
616
+ let urlParams = new URLSearchParams(window.location.search)
617
+ if (urlParams.has("vildemomode")) wpmDataLayer.viewItemListTrigger.testMode = true
618
+
619
+ // set up intersection observer
620
+ io = new IntersectionObserver(wpm.observerCallback, {
621
+ threshold: wpmDataLayer.viewItemListTrigger.threshold,
622
+ })
623
+
624
+ getAllElementsToWatch()
625
+
626
+ // console.log(allElementsToWatch);
627
+
628
+ allIoElementsToWatch.each(function (i, elem) {
629
+ // console.log(elem[0]);
630
+ // jQuery(elem[0]).attr('data-ioid', ioid++);
631
+ jQuery(elem[0]).data("ioid", ioid++)
632
+
633
+ io.observe(elem[0])
634
+ })
635
+ } catch (e) {
636
+ console.error(e)
637
+ }
638
+ }
639
+
640
+ // watch DOM for new lazy loaded products and add them to the intersection observer
641
+ wpm.startProductsMutationObserverToWatch = function () {
642
+
643
+ try {
644
+ // Pass in the target node, as well as the observer options
645
+
646
+ // selects the most common parent node
647
+ // https://stackoverflow.com/a/7648323/4688612
648
+ let productsNode = jQuery(".wpmProductId:eq(0)").parents().has(jQuery(".wpmProductId:eq(1)").parents()).first()
649
+
650
+ if (productsNode.length) {
651
+ productsMutationObserver.observe(productsNode[0], {
652
+ attributes : true,
653
+ childList : true,
654
+ characterData: true,
655
+ })
656
+ }
657
+ } catch (e) {
658
+ console.error(e)
659
+ }
660
+ }
661
+
662
+ // Create an observer instance
663
+ let productsMutationObserver = new MutationObserver(function (mutations) {
664
+
665
+ mutations.forEach(function (mutation) {
666
+ let newNodes = mutation.addedNodes // DOM NodeList
667
+ if (newNodes !== null) { // If there are new nodes added
668
+ let nodes = jQuery(newNodes) // jQuery set
669
+ nodes.each(function () {
670
+ if (
671
+ jQuery(this).hasClass("type-product") ||
672
+ jQuery(this).hasClass("product-small") ||
673
+ jQuery(this).hasClass("wc-block-grid__product")
674
+ ) {
675
+ // check if the node has a child or sibling wpmProductId
676
+ // if yes add it to the intersectionObserver
677
+ if (hasWpmProductIdElement(this)) {
678
+ jQuery(this).data("ioid", ioid++)
679
+ io.observe(this)
680
+ }
681
+ }
682
+ })
683
+ }
684
+ })
685
+ })
686
+
687
+ let hasWpmProductIdElement = function (elem) {
688
+ return !!(jQuery(elem).find(".wpmProductId").length ||
689
+ jQuery(elem).siblings(".wpmProductId").length)
690
+ }
691
+
692
+ wpm.setCookie = function (cookieName, cookieValue = "", expiryDays = null) {
693
+ if (expiryDays) {
694
+ let d = new Date()
695
+ d.setTime(d.getTime() + (expiryDays * 24 * 60 * 60 * 1000))
696
+ let expires = "expires=" + d.toUTCString()
697
+ document.cookie = cookieName + "=" + cookieValue + ";" + expires + ";path=/"
698
+ } else {
699
+ document.cookie = cookieName + "=" + cookieValue + ";path=/"
700
+ }
701
+ }
702
+
703
+ wpm.getCookie = function (cookieName) {
704
+ let name = cookieName + "="
705
+ let decodedCookie = decodeURIComponent(document.cookie)
706
+ let ca = decodedCookie.split(";")
707
+ for (let i = 0; i < ca.length; i++) {
708
+ let c = ca[i]
709
+ while (c.charAt(0) == " ") {
710
+ c = c.substring(1)
711
+ }
712
+ if (c.indexOf(name) == 0) {
713
+ return c.substring(name.length, c.length)
714
+ }
715
+ }
716
+ return ""
717
+ }
718
+
719
+ wpm.getWpmSessionData = function () {
720
+ if (window.sessionStorage) {
721
+
722
+ let data = window.sessionStorage.getItem("_wpm")
723
+ if (data !== null) {
724
+ return JSON.parse(data)
725
+ } else {
726
+ return {}
727
+ }
728
+ } else {
729
+ return {}
730
+ }
731
+ }
732
+
733
+ wpm.setWpmSessionData = function (data) {
734
+ if (window.sessionStorage) {
735
+ window.sessionStorage.setItem("_wpm", JSON.stringify(data))
736
+ }
737
+ }
738
+
739
+ wpm.storeOrderIdOnServer = function (orderId) {
740
+
741
+ // console.log('saving wpm_purchase_pixels_fired');
742
+
743
+ // console.log('url: ' + wpm_premium_only_ajax_object.ajax_url);
744
+ // console.log('nonce: ' + wpm_premium_only_ajax_object.nonce);
745
+ // console.log('url: ' + wpm.ajax_url);
746
+ // console.log('nonce: ' + wpm.nonce);
747
+
748
+ try {
749
+ // save the state in the database
750
+ let data = {
751
+ action : "wpm_purchase_pixels_fired",
752
+ order_id: orderId,
753
+ // nonce : ajax_object.nonce,
754
+ nonce: wpm.nonce,
755
+ }
756
+
757
+ jQuery.ajax(
758
+ {
759
+ type : "post",
760
+ dataType: "json",
761
+ // url : ajax_object.ajax_url,
762
+ url : wpm.ajax_url,
763
+ data : data,
764
+ success: function (response) {
765
+ if (response.success === false) {
766
+ console.log(response)
767
+ }
768
+ },
769
+ error : function (response) {
770
+ console.log(response)
771
+ },
772
+ })
773
+ } catch (e) {
774
+ console.error(e)
775
+ }
776
+ }
777
+
778
+ wpm.getProductIdByCartItemKeyUrl = function (url) {
779
+ let searchParams = new URLSearchParams(url.search)
780
+ let cartItemKey = searchParams.get("remove_item")
781
+
782
+ let productId = null
783
+
784
+ if (wpmDataLayer.cartItemKeys[cartItemKey]["variation_id"] === 0) {
785
+ productId = wpmDataLayer.cartItemKeys[cartItemKey]["product_id"]
786
+ } else {
787
+ productId = wpmDataLayer.cartItemKeys[cartItemKey]["variation_id"]
788
+ }
789
+
790
+ return productId
791
+ }
792
+
793
+ wpm.getAddToCartLinkProductIds = function () {
794
+ return jQuery("a").map(function () {
795
+ let href = jQuery(this).attr("href")
796
+
797
+ if (href && href.includes("?add-to-cart=")) {
798
+ let matches = href.match(/(add-to-cart=)(\d+)/)
799
+ if (matches) return matches[2]
800
+ }
801
+ }).get()
802
+ }
803
+
804
+ wpm.getProductDetailsFormattedForEvent = function (productId, quantity = 1) {
805
+
806
+ // console.log(wpmDataLayer.products[productId].dyn_r_ids)
807
+
808
+ let product = {
809
+ id : productId.toString(),
810
+ dyn_r_ids : wpmDataLayer.products[productId].dyn_r_ids,
811
+ name : wpmDataLayer.products[productId].name,
812
+ list_name : wpmDataLayer.shop.list_name,
813
+ brand : wpmDataLayer.products[productId].brand,
814
+ category : wpmDataLayer.products[productId].category,
815
+ variant : wpmDataLayer.products[productId].variant,
816
+ list_position: wpmDataLayer.products[productId].position,
817
+ quantity : quantity,
818
+ price : wpmDataLayer.products[productId].price,
819
+ currency : wpmDataLayer.shop.currency,
820
+ isVariable : wpmDataLayer.products[productId].isVariable,
821
+ isVariation : wpmDataLayer.products[productId].isVariation,
822
+ parentId : wpmDataLayer.products[productId].parentId,
823
+ }
824
+
825
+ if (product.isVariation) product["parentId_dyn_r_ids"] = wpmDataLayer.products[productId].parentId_dyn_r_ids
826
+
827
+ return product
828
+ }
829
+
830
+ wpm.setReferrerToCookie = function () {
831
+ // can't use session storage as we can't read it from the server
832
+ if (!wpm.getCookie("wpmReferrer")) {
833
+ wpm.setCookie("wpmReferrer", document.referrer)
834
+ }
835
+ }
836
+
837
+ wpm.getReferrerFromCookie = function () {
838
+ if (wpm.getCookie("wpmReferrer")) {
839
+ return wpm.getCookie("wpmReferrer")
840
+ } else {
841
+ return null
842
+ }
843
+ }
844
+
845
+ wpm.getClidFromBrowser = function (clidId = "gclid") {
846
+
847
+ let clidCookieId
848
+
849
+ clidCookieId = {
850
+ gclid: "_gcl_aw",
851
+ dclid: "_gcl_dc",
852
+ }
853
+
854
+ if (wpm.getCookie(clidCookieId[clidId])) {
855
+ let clidCookie = wpm.getCookie(clidCookieId[clidId])
856
+ let matches = clidCookie.match(/(GCL.[\d]*.)(.*)/)
857
+ return matches[2]
858
+ } else {
859
+ return ""
860
+ }
861
+ }
862
+
863
+ wpm.getUserAgent = function () {
864
+ return navigator.userAgent
865
+ }
866
+
867
+ wpm.getViewPort = function () {
868
+ return {
869
+ width : Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0),
870
+ height: Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0),
871
+ }
872
+ }
873
+
874
+ /*
875
+ * Handle Cookie Management Platforms
876
+ * */
877
+
878
+ let getComplianzCookies = function () {
879
+
880
+ let cmplz_statistics = wpm.getCookie("cmplz_statistics")
881
+ let cmplz_marketing = wpm.getCookie("cmplz_marketing")
882
+ let cmplz_consent_status = wpm.getCookie("cmplz_consent_status") || wpm.getCookie("cmplz_banner-status")
883
+
884
+
885
+ if (cmplz_consent_status) {
886
+ return {
887
+ analytics : cmplz_statistics === "allow",
888
+ ads : cmplz_marketing === "allow",
889
+ visitorHasChosen: true,
890
+ }
891
+ } else {
892
+ return false
893
+ }
894
+ }
895
+
896
+ let getCookieLawInfoCookies = function () {
897
+
898
+ let analyticsCookie = wpm.getCookie("cookielawinfo-checkbox-analytics")
899
+ let adsCookie = wpm.getCookie("cookielawinfo-checkbox-advertisement")
900
+ let visitorHasChosen = wpm.getCookie("CookieLawInfoConsent")
901
+
902
+ if (analyticsCookie || adsCookie) {
903
+
904
+ return {
905
+ analytics : analyticsCookie === "yes",
906
+ ads : adsCookie === "yes",
907
+ visitorHasChosen: !!visitorHasChosen,
908
+ }
909
+ } else {
910
+ return false
911
+ }
912
+ }
913
+
914
+
915
+ let
916
+ wpmConsentValues = {}
917
+ wpmConsentValues.categories = {}
918
+ wpmConsentValues.pixels = []
919
+ wpmConsentValues.mode = "category"
920
+ wpmConsentValues.visitorHasChosen = false
921
+
922
+ wpm.getConsentValues = function () {
923
+ return wpmConsentValues
924
+ }
925
+
926
+ wpm.setConsentValueCategories = function (analytics = false, ads = false) {
927
+ wpmConsentValues.categories.analytics = analytics
928
+ wpmConsentValues.categories.ads = ads
929
+ }
930
+
931
+ wpm.updateConsentCookieValues = function (explicitConsent = false) {
932
+
933
+ // ad_storage
934
+ // analytics_storage
935
+ // functionality_storage
936
+ // personalization_storage
937
+ // security_storage
938
+
939
+ // console.log('exp cons: ' + explicitConsent)
940
+
941
+ let cookie
942
+
943
+ if (cookie = wpm.getCookie("CookieConsent")) {
944
+ // Cookiebot
945
+ // https://wordpress.org/plugins/cookiebot/
946
+ cookie = decodeURI(cookie)
947
+
948
+ // console.log(cookie.indexOf('statistics:true'))
949
+ // console.log(cookie.indexOf('marketing:true'))
950
+
951
+ wpmConsentValues.categories.analytics = cookie.indexOf("statistics:true") >= 0
952
+ wpmConsentValues.categories.ads = cookie.indexOf("marketing:true") >= 0
953
+ wpmConsentValues.visitorHasChosen = true
954
+
955
+ } else if (cookie = wpm.getCookie("CookieScriptConsent")) {
956
+ // Cookie Script
957
+ // https://wordpress.org/plugins/cookie-script-com/
958
+
959
+ cookie = JSON.parse(cookie)
960
+
961
+ // console.log(cookie)
962
+ // console.log(cookie.action)
963
+ // console.log('cat length: ' + cookie.categories.length)
964
+ // console.log(cookie.categories.indexOf('performance'))
965
+
966
+ if (cookie.action === "reject") {
967
+ wpmConsentValues.categories.analytics = false
968
+ wpmConsentValues.categories.ads = false
969
+ } else if (cookie.categories.length === 2) {
970
+ wpmConsentValues.categories.analytics = true
971
+ wpmConsentValues.categories.ads = true
972
+ } else {
973
+ wpmConsentValues.categories.analytics = cookie.categories.indexOf("performance") >= 0
974
+ wpmConsentValues.categories.ads = cookie.categories.indexOf("targeting") >= 0
975
+ }
976
+
977
+ wpmConsentValues.visitorHasChosen = true
978
+
979
+ // console.log(wpmConsentValues)
980
+
981
+ } else if (cookie = wpm.getCookie("borlabs-cookie")) {
982
+ // Borlabs Cookie
983
+ // https://borlabs.io/borlabs-cookie/
984
+
985
+ cookie = decodeURI(cookie)
986
+ cookie = JSON.parse(cookie)
987
+
988
+ wpmConsentValues.categories.analytics = !!cookie?.consents?.statistics
989
+ wpmConsentValues.categories.ads = !!cookie?.consents?.marketing
990
+ wpmConsentValues.visitorHasChosen = true
991
+ wpmConsentValues.pixels = [...cookie?.consents?.statistics || [], ...cookie?.consents?.marketing || []]
992
+ wpmConsentValues.mode = "pixel"
993
+
994
+ } else if (cookie = getComplianzCookies()) {
995
+ // Complianz Cookie
996
+ // https://wordpress.org/plugins/complianz-gdpr/
997
+
998
+ // console.log(cookie)
999
+
1000
+ wpmConsentValues.categories.analytics = cookie.analytics === true
1001
+ wpmConsentValues.categories.ads = cookie.ads === true
1002
+ wpmConsentValues.visitorHasChosen = cookie.visitorHasChosen
1003
+
1004
+ // console.log(wpmConsentValues)
1005
+
1006
+ } else if (cookie = wpm.getCookie("cookie_notice_accepted")) {
1007
+ // Cookie Compliance (free version)
1008
+ // https://wordpress.org/plugins/cookie-notice/
1009
+
1010
+ wpmConsentValues.categories.analytics = true
1011
+ wpmConsentValues.categories.ads = true
1012
+ wpmConsentValues.visitorHasChosen = true
1013
+
1014
+ } else if (cookie = wpm.getCookie("hu-consent")) {
1015
+ // Cookie Compliance (pro version)
1016
+ // https://wordpress.org/plugins/cookie-notice/
1017
+
1018
+ cookie = JSON.parse(cookie)
1019
+
1020
+ wpmConsentValues.categories.analytics = !!cookie.categories["3"]
1021
+ wpmConsentValues.categories.ads = !!cookie.categories["4"]
1022
+ wpmConsentValues.visitorHasChosen = true
1023
+
1024
+ } else if (cookie = getCookieLawInfoCookies()) {
1025
+ // CookieYes, GDPR Cookie Consent (Cookie Law Info)
1026
+ // https://wordpress.org/plugins/cookie-law-info/
1027
+
1028
+ wpmConsentValues.categories.analytics = cookie.analytics === true
1029
+ wpmConsentValues.categories.ads = cookie.ads === true
1030
+ wpmConsentValues.visitorHasChosen = cookie.visitorHasChosen === true
1031
+
1032
+ } else if (cookie = wpm.getCookie("moove_gdpr_popup")) {
1033
+ // GDPR Cookie Compliance Plugin by Moove Agency
1034
+ // https://wordpress.org/plugins/gdpr-cookie-compliance/
1035
+ // TODO write documentation on how to set up the plugin in order for this to work properly
1036
+
1037
+ cookie = JSON.parse(cookie)
1038
+ // console.log('moove cookie thirdparty: ' + cookie.thirdparty)
1039
+ // console.log('moove cookie advanced: ' + cookie.advanced)
1040
+
1041
+ wpmConsentValues.categories.analytics = cookie.thirdparty === "1"
1042
+ wpmConsentValues.categories.ads = cookie.advanced === "1"
1043
+ wpmConsentValues.visitorHasChosen = true
1044
+
1045
+ // console.log(wpmConsentValues)
1046
+
1047
+ } else {
1048
+ // consentValues.categories.analytics = true
1049
+ // consentValues.categories.ads = true
1050
+
1051
+ wpmConsentValues.categories.analytics = !explicitConsent
1052
+ wpmConsentValues.categories.ads = !explicitConsent
1053
+ }
1054
+ }
1055
+
1056
+ wpm.updateConsentCookieValues()
1057
+
1058
+ wpm.setConsentDefaultValuesToExplicit = function () {
1059
+ wpmConsentValues.categories = {
1060
+ analytics: false,
1061
+ ads : false,
1062
+ }
1063
+ }
1064
+
1065
+ wpm.canIFire = function (category, pixelName) {
1066
+
1067
+ if ("category" === wpmConsentValues.mode) {
1068
+ return !!wpmConsentValues.categories[category]
1069
+ } else if ("pixel" === wpmConsentValues.mode) {
1070
+ return wpmConsentValues.pixels.includes(pixelName)
1071
+ } else {
1072
+ console.error("Couldn't find a valid consent mode in wpmConsentValues")
1073
+ return false
1074
+ }
1075
+ }
1076
+
1077
+ /**
1078
+ * Runs through each script in <head> and blocks / unblocks it according to the plugin settings
1079
+ * and user consent.
1080
+ */
1081
+
1082
+ // https://stackoverflow.com/q/65453565/4688612
1083
+ wpm.scriptTagObserver = new MutationObserver((mutations) => {
1084
+ mutations.forEach(({addedNodes}) => {
1085
+ [...addedNodes]
1086
+ .forEach(node => {
1087
+
1088
+ if ($(node).data("wpm-cookie-category")) {
1089
+
1090
+ // console.log(node)
1091
+
1092
+ // If the pixel category has been approved > unblock
1093
+ // If the pixel belongs to more than one category, then unblock if one of the categories has been approved
1094
+ // If no category has been approved, but the Google Consent Mode is active, then only unblock the Google scripts
1095
+
1096
+ if (wpm.shouldScriptBeActive(node)) {
1097
+ wpm.unblockScript(node)
1098
+ } else {
1099
+ wpm.blockScript(node)
1100
+ }
1101
+ }
1102
+ })
1103
+ })
1104
+ })
1105
+
1106
+ wpm.scriptTagObserver.observe(document.head, {childList: true, subtree: true})
1107
+ window.addEventListener("DOMContentLoaded", () => wpm.scriptTagObserver.disconnect())
1108
+
1109
+ wpm.shouldScriptBeActive = function (node) {
1110
+
1111
+ if (
1112
+ wpmDataLayer.shop.cookie_consent_mgmt.explicit_consent ||
1113
+ wpmConsentValues.visitorHasChosen
1114
+ ) {
1115
+
1116
+ if (wpmConsentValues.mode === "category" && $(node).data("wpm-cookie-category").split(",").some(element => wpmConsentValues.categories[element])) {
1117
+ return true
1118
+ } else if (wpmConsentValues.mode === "pixel" && wpmConsentValues.pixels.includes($(node).data("wpm-pixel-name"))) {
1119
+ return true
1120
+ } else if (wpmConsentValues.mode === "pixel" && $(node).data("wpm-pixel-name") === "google" && ["google-analytics", "google-ads"].some(element => wpmConsentValues.pixels.includes(element))) {
1121
+ return true
1122
+ } else if (wpmDataLayer?.pixels?.google?.consent_mode?.active && $(node).data("wpm-pixel-name") === "google") {
1123
+ return true
1124
+ } else {
1125
+ return false
1126
+ }
1127
+ } else {
1128
+ return true
1129
+ }
1130
+ }
1131
+
1132
+
1133
+ wpm.unblockScript = function (scriptNode, removeAttach = false) {
1134
+
1135
+ if (removeAttach) $(scriptNode).remove()
1136
+
1137
+ let wpmSrc = $(scriptNode).data("wpm-src")
1138
+ if (wpmSrc) $(scriptNode).attr("src", wpmSrc)
1139
+
1140
+ scriptNode.type = "text/javascript"
1141
+
1142
+ if (removeAttach) $(scriptNode).appendTo("head")
1143
+
1144
+ jQuery(document).trigger("wpmPreLoadPixels", {})
1145
+ }
1146
+
1147
+ wpm.blockScript = function (scriptNode, removeAttach = false) {
1148
+
1149
+ if (removeAttach) $(scriptNode).remove()
1150
+
1151
+ if ($(scriptNode).attr("src")) $(scriptNode).removeAttr("src")
1152
+ scriptNode.type = "blocked/javascript"
1153
+
1154
+ if (removeAttach) $(scriptNode).appendTo("head")
1155
+ }
1156
+
1157
+ wpm.unblockAllScripts = function (analytics = true, ads = true) {
1158
+ // console.log('unblocking all scripts')
1159
+
1160
+ $.each(
1161
+ $("script[type=\"blocked/javascript\"]"), function (index, scriptNode) {
1162
+
1163
+ if ($(scriptNode).data("wpm-cookie-category").includes("analytics") && analytics) {
1164
+ wpm.unblockScript(scriptNode, true)
1165
+ } else if ($(scriptNode).data("wpm-cookie-category").includes("ads") && ads) {
1166
+ wpm.unblockScript(scriptNode, true)
1167
+ }
1168
+ })
1169
+
1170
+ jQuery(document).trigger("wpmPreLoadPixels", {})
1171
+ }
1172
+
1173
+ wpm.unblockSelectedPixels = function () {
1174
+ $.each(
1175
+ $("script[type=\"blocked/javascript\"]"), function (index, node) {
1176
+
1177
+ if (wpmConsentValues.pixels.includes($(node).data("wpm-pixel-name"))) {
1178
+ wpm.unblockScript(node, true)
1179
+ } else if ($(node).data("wpm-pixel-name") === "google" && ["google-analytics", "google-ads"].some(element => wpmConsentValues.pixels.includes(element))) {
1180
+ wpm.unblockScript(node, true)
1181
+ }
1182
+ })
1183
+
1184
+ jQuery(document).trigger("wpmPreLoadPixels", {})
1185
+ }
1186
+
1187
+
1188
+ /**
1189
+ * Block or unblock scripts for each CMP immediately after cookie consent has been updated
1190
+ * by the visitor.
1191
+ */
1192
+
1193
+ // Borlabs Cookie
1194
+ // If visitor accepts cookies in Borlabs Cookie unblock the scripts
1195
+ window.addEventListener("borlabs-cookie-consent-saved", function (e) {
1196
+
1197
+ wpm.updateConsentCookieValues()
1198
+
1199
+ if (wpmConsentValues.mode === "pixel") {
1200
+
1201
+ wpm.unblockSelectedPixels()
1202
+ wpm.updateGoogleConsentMode(wpmConsentValues.pixels.includes("google-analytics"), wpmConsentValues.pixels.includes("google-ads"))
1203
+ } else {
1204
+
1205
+ wpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)
1206
+ wpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)
1207
+ }
1208
+ })
1209
+
1210
+ // Cookiebot
1211
+ // If visitor accepts cookies in Cookiebot unblock the scripts
1212
+ // https://www.cookiebot.com/en/developer/
1213
+ window.addEventListener("CookiebotOnAccept", function (e) {
1214
+ if (Cookiebot.consent.statistics) wpmConsentValues.categories.analytics = true
1215
+ if (Cookiebot.consent.marketing) wpmConsentValues.categories.ads = true
1216
+
1217
+ wpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)
1218
+ wpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)
1219
+
1220
+ }, false)
1221
+
1222
+ /**
1223
+ * Cookie Script
1224
+ * If visitor accepts cookies in Cookie Script unblock the scripts
1225
+ * https://support.cookie-script.com/article/20-custom-events
1226
+ */
1227
+ window.addEventListener("CookieScriptAccept", function (e) {
1228
+ if (e.detail.categories.includes("performance")) wpmConsentValues.categories.analytics = true
1229
+ if (e.detail.categories.includes("targeting")) wpmConsentValues.categories.ads = true
1230
+
1231
+ wpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)
1232
+ wpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)
1233
+ })
1234
+
1235
+ /**
1236
+ * Cookie Script
1237
+ * If visitor accepts cookies in Cookie Script unblock the scripts
1238
+ * https://support.cookie-script.com/
1239
+ */
1240
+ window.addEventListener("CookieScriptAcceptAll", function (e) {
1241
+ wpm.unblockAllScripts(true, true)
1242
+ wpm.updateGoogleConsentMode(true, true)
1243
+ })
1244
+
1245
+ // Complianz Cookie
1246
+ // If visitor accepts cookies in Complianz unblock the scripts
1247
+ document.addEventListener("cmplzStatusChange", function (e) {
1248
+
1249
+ wpm.updateConsentCookieValues()
1250
+
1251
+ // console.log(wpmConsentValues)
1252
+
1253
+ wpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)
1254
+ wpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)
1255
+ })
1256
+
1257
+ // Cookie Compliance by hu-manity.co (free and pro)
1258
+ // If visitor accepts cookies in Cookie Notice by hu-manity.co unblock the scripts (free version)
1259
+ // https://wordpress.org/support/topic/events-on-consent-change/#post-15202792
1260
+ document.addEventListener("setCookieNotice", function (e) {
1261
+
1262
+ wpm.updateConsentCookieValues()
1263
+
1264
+ // console.log(wpmConsentValues)
1265
+
1266
+ wpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)
1267
+ wpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)
1268
+ })
1269
+
1270
+ /**
1271
+ * Cookie Compliance by hu-manity.co (free and pro)
1272
+ * If visitor accepts cookies in Cookie Notice by hu-manity.co unblock the scripts (pro version)
1273
+ * https://wordpress.org/support/topic/events-on-consent-change/#post-15202792
1274
+ * Because Cookie Notice has no documented API or event that is being triggered on consent save or update
1275
+ * we have to solve this by using a mutation observer.
1276
+ *
1277
+ * @type {MutationObserver}
1278
+ */
1279
+
1280
+ wpm.huObserver = new MutationObserver(function (mutations) {
1281
+ mutations.forEach(({addedNodes}) => {
1282
+ [...addedNodes]
1283
+ .forEach(node => {
1284
+
1285
+ if (node.id === "hu") {
1286
+
1287
+ jQuery(".hu-cookies-save").on("click", function (e) {
1288
+ wpm.updateConsentCookieValues()
1289
+ wpm.unblockAllScripts(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)
1290
+ wpm.updateGoogleConsentMode(wpmConsentValues.categories.analytics, wpmConsentValues.categories.ads)
1291
+ })
1292
+ }
1293
+ })
1294
+ })
1295
+ })
1296
+
1297
+ if (window.hu) {
1298
+ wpm.huObserver.observe(document.documentElement || document.body, {childList: true, subtree: true})
1299
+ }
1300
+
1301
+ wpm.version = function () {
1302
+ console.log(wpmDataLayer.version)
1303
+ }
1304
+
1305
+ // https://api.jquery.com/jquery.getscript/
1306
+ wpm.loadScriptAndCacheIt = function (url, options) {
1307
+
1308
+ // Allow user to set any option except for dataType, cache, and url
1309
+ options = jQuery.extend(options || {}, {
1310
+ dataType: "script",
1311
+ cache : true,
1312
+ url : url,
1313
+ })
1314
+
1315
+ // Use $.ajax() since it is more flexible than $.getScript
1316
+ // Return the jqXHR object so we can chain callbacks
1317
+ return jQuery.ajax(options)
1318
+ }
1319
+
1320
+ wpm.getOrderItemPrice = function (orderItem) {
1321
+ return (orderItem.total + orderItem.total_tax) / orderItem.quantity
1322
+ }
1323
+
1324
+ wpm.hasLoginEventFired = function () {
1325
+ let data = wpm.getWpmSessionData()
1326
+ return data?.loginEventFired
1327
+ }
1328
+
1329
+ wpm.setLoginEventFired = function () {
1330
+ let data = wpm.getWpmSessionData()
1331
+ data["loginEventFired"] = true
1332
+ wpm.setWpmSessionData(data)
1333
+ }
1334
+
1335
+ wpm.wpmDataLayerExists = function () {
1336
+ return new Promise(function (resolve) {
1337
+ (function waitForVar() {
1338
+ if (typeof wpmDataLayer !== "undefined") return resolve()
1339
+ setTimeout(waitForVar, 50)
1340
+ })()
1341
+ })
1342
+ }
1343
+
1344
+ wpm.pageLoaded = function () {
1345
+ return new Promise(function (resolve) {
1346
+ (function waitForVar() {
1347
+ if ("complete" === document.readyState) return resolve()
1348
+ setTimeout(waitForVar, 50)
1349
+ })()
1350
+ })
1351
+ }
1352
+
1353
+ // wpm['load'] = {
1354
+ // base: true
1355
+ // };
1356
+
1357
+ window["wpmLoaded"] = {}
1358
+
1359
+ // return {
1360
+ // writeOrderIdToStorage : writeOrderIdToStorage,
1361
+ // isOrderIdStored : isOrderIdStored,
1362
+ // isEmail : isEmail,
1363
+ // removeProductFromCart : removeProductFromCart,
1364
+ // getViewItemProducts : getViewItemProducts,
1365
+ // addProductToCart : addProductToCart,
1366
+ // getCartItemsFromBackEnd: getCartItemsFromBackEnd,
1367
+ // fireCheckoutOption : fireCheckoutOption,
1368
+ // getCartItems : getCartItems
1369
+ // }
1370
+
1371
+ }(window.wpm = window.wpm || {}, jQuery))
1372
+
1373
+ /**
1374
+ * Run as soon as wpm namespace is loaded
1375
+ */
1376
+
1377
+ // run when window ready
1378
+ jQuery(function () {
1379
+ // jQuery(window).on('load', function () {
1380
+
1381
+ wpm.wpmDataLayerExists()
1382
+ .then(function () {
1383
+ // watch for products visible in viewport
1384
+ wpm.startIntersectionObserverToWatch()
1385
+
1386
+ // watch for lazy loaded products
1387
+ wpm.startProductsMutationObserverToWatch()
1388
+ })
1389
+
1390
+ // let products = jQuery(".products, .product")
1391
+ })
1392
+
1393
+
1394
+ /**
1395
+ * All event listeners
1396
+ * */
1397
+
1398
+ // remove_from_cart event
1399
+ // body.on('click', '.remove_from_cart_button, .remove', function (e) {
1400
+ jQuery(document).on("click", ".remove_from_cart_button, .remove", function (e) {
1401
+ // jQuery('.remove_from_cart_button, .remove').on('click', function (e) {
1402
+
1403
+ try {
1404
+ // console.log('remove_from_cart: ' + jQuery(this).data('product_id'));
1405
+
1406
+ let url = new URL(jQuery(this).attr("href"))
1407
+ let productId = wpm.getProductIdByCartItemKeyUrl(url)
1408
+
1409
+ wpm.removeProductFromCart(productId)
1410
+
1411
+ } catch (e) {
1412
+ console.error(e)
1413
+ }
1414
+ })
1415
+
1416
+
1417
+ // add_to_cart event
1418
+ // body.on('click', '.add_to_cart_button:not(.product_type_variable), .ajax_add_to_cart, .single_add_to_cart_button', function (e) {
1419
+ jQuery(document).on("click", ".add_to_cart_button:not(.product_type_variable), .ajax_add_to_cart, .single_add_to_cart_button", function (e) {
1420
+ // jQuery('.add_to_cart_button:not(.product_type_variable), .ajax_add_to_cart, .js-ajax-add-to-cart, .single_add_to_cart_button, .btn_color-2').on('click', function (e) {
1421
+
1422
+ try {
1423
+ // console.log('add_to_cart');
1424
+
1425
+ if (wpmDataLayer.shop.page_type === "product") {
1426
+
1427
+ // first process related and upsell products
1428
+ if (typeof jQuery(this).attr("href") !== "undefined" && jQuery(this).attr("href").includes("add-to-cart")) {
1429
+ // console.log('add-to-cart on upsell and related products');
1430
+ let quantity = 1
1431
+ let productId = jQuery(this).data("product_id")
1432
+ // console.log('productId: ' + productId);
1433
+ wpm.addProductToCart(productId, quantity)
1434
+ } else {
1435
+
1436
+ if (wpmDataLayer.shop.product_type === "simple") {
1437
+
1438
+ // console.log('test');
1439
+ let quantity = Number(jQuery(".input-text.qty").val())
1440
+
1441
+ if (!quantity && quantity !== 0) quantity = 1
1442
+
1443
+ let productId = jQuery(this).val()
1444
+
1445
+ // console.log('productId: ' + productId);
1446
+ // console.log('quantity: ' + quantity);
1447
+
1448
+ wpm.addProductToCart(productId, quantity)
1449
+
1450
+ } else if (wpmDataLayer.shop.product_type === "variable") {
1451
+
1452
+ // console.log('variable');
1453
+
1454
+ let quantity = Number(jQuery(".input-text.qty").val())
1455
+
1456
+ if (!quantity && quantity !== 0) quantity = 1
1457
+
1458
+ let productId = jQuery("[name='variation_id']").val()
1459
+
1460
+ // console.log('productId: ' + productId);
1461
+ // console.log('quantity: ' + quantity);
1462
+
1463
+ wpm.addProductToCart(productId, quantity)
1464
+
1465
+ } else if (wpmDataLayer.shop.product_type === "grouped") {
1466
+
1467
+ // console.log('grouped');
1468
+
1469
+ jQuery(".woocommerce-grouped-product-list-item").each(function () {
1470
+
1471
+ let quantity = Number(jQuery(this).find(".input-text.qty").val())
1472
+
1473
+ if (!quantity && quantity !== 0) quantity = 1
1474
+
1475
+ let classes = jQuery(this).attr("class")
1476
+ let productId = wpm.getPostIdFromString(classes)
1477
+
1478
+ // console.log('productId: ' + productId);
1479
+ // console.log('quantity: ' + quantity);
1480
+
1481
+ wpm.addProductToCart(productId, quantity)
1482
+ })
1483
+ } else if (wpmDataLayer.shop.product_type === "bundle") {
1484
+
1485
+ // console.log('bundle');
1486
+
1487
+ let quantity = Number(jQuery(".input-text.qty").val())
1488
+
1489
+ if (!quantity && quantity !== 0) quantity = 1
1490
+
1491
+ let productId = jQuery("input[name=add-to-cart]").val()
1492
+
1493
+ // console.log('productId: ' + productId);
1494
+ // console.log('quantity: ' + quantity);
1495
+
1496
+ wpm.addProductToCart(productId, quantity)
1497
+ }
1498
+ }
1499
+ } else {
1500
+
1501
+ // console.log('non product page');
1502
+
1503
+ let quantity = 1
1504
+ let productId = jQuery(this).data("product_id")
1505
+ // console.log('productId: ' + productId);
1506
+ wpm.addProductToCart(productId, quantity)
1507
+ }
1508
+ } catch (e) {
1509
+ console.error(e)
1510
+ }
1511
+ })
1512
+
1513
+ // if someone clicks anywhere on a custom /?add-to-cart=123 link
1514
+ // trigger the add to cart event
1515
+ // body.one('click', function (e) {
1516
+ //
1517
+ // try {
1518
+ // if (jQuery(this)[0].URL) {
1519
+ //
1520
+ // let href = new URL(jQuery(this)[0].URL);
1521
+ // let searchParams = new URLSearchParams(href.search);
1522
+ //
1523
+ // if (searchParams.has('add-to-cart')) {
1524
+ // // console.log('non product page, /?add-to-cart=123 link');
1525
+ //
1526
+ // let productId = searchParams.get('add-to-cart');
1527
+ // wpm.addProductToCart(productId, 1);
1528
+ // }
1529
+ // }
1530
+ // } catch (e) {
1531
+ // console.error(e);
1532
+ // }
1533
+ // });
1534
+
1535
+
1536
+ /**
1537
+ * If someone clicks anywhere on a custom /?add-to-cart=123 link
1538
+ * trigger the add to cart event
1539
+ */
1540
+ // body.one('click', 'a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)', function (event) {
1541
+ jQuery(document).one("click", "a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)", function (event) {
1542
+ // jQuery('a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)').one('click', function (event) {
1543
+
1544
+ try {
1545
+ if (jQuery(event.target).closest("a").attr("href")) {
1546
+
1547
+ let href = jQuery(event.target).closest("a").attr("href")
1548
+
1549
+ if (href.includes("add-to-cart=")) {
1550
+ let matches = href.match(/(add-to-cart=)(\d+)/)
1551
+ // console.log('pid: ' + matches[2])
1552
+ if (matches) wpm.addProductToCart(matches[2], 1)
1553
+ }
1554
+ }
1555
+ } catch (e) {
1556
+ console.error(e)
1557
+ }
1558
+ })
1559
+
1560
+ // select_content GA UA event
1561
+ // select_item GA 4 event
1562
+ // jQuery(document).on('click', '.woocommerce-LoopProduct-link, .wc-block-grid__product, .product-small.box', function (e) {
1563
+ // body.on('click', '.woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product', function (e) {
1564
+ jQuery(document).on("click", ".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product", function (e) {
1565
+ // jQuery('.woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product').on('click', function (e) {
1566
+
1567
+ try {
1568
+
1569
+ // On some pages the event fires multiple times, and on product pages
1570
+ // even on page load. Using e.stopPropagation helps to prevent this,
1571
+ // but I dont know why. We don't even have to use this, since only a real
1572
+ // product click yields a valid productId. So we filter the invalid click
1573
+ // events out later down the code. I'll keep it that way because this is
1574
+ // the most compatible way across shops.
1575
+ // e.stopPropagation();
1576
+
1577
+ // console.log('select_content and select_item');
1578
+
1579
+ let productId = jQuery(this).nextAll(".wpmProductId:first").data("id")
1580
+ // console.log('select_content and select_item: ' + productId);
1581
+
1582
+
1583
+ // On product pages, for some reason, the click event is triggered on the main product on page load.
1584
+ // In that case no ID is found. But we can discard it, since we only want to trigger the event on
1585
+ // related products, which are found below.
1586
+ if (productId) {
1587
+
1588
+ // console.log('select_content and select_item: ' + productId);
1589
+
1590
+ productId = getIdBasedOndVariationsOutputSetting(productId)
1591
+
1592
+ if (!productId) throw Error("Wasn't able to retrieve a productId")
1593
+
1594
+ // console.log('prodid: ' + productId);
1595
+
1596
+ if (wpmDataLayer.products && wpmDataLayer.products[productId]) {
1597
+
1598
+ let product = wpm.getProductDetailsFormattedForEvent(productId)
1599
+
1600
+ jQuery(document).trigger("wpmSelectContentGaUa", product)
1601
+ jQuery(document).trigger("wpmSelectItem", product)
1602
+ }
1603
+ }
1604
+ } catch (e) {
1605
+ console.error(e)
1606
+ }
1607
+ })
1608
+
1609
+ // begin_checkout event
1610
+ // body.one('click', '.checkout-button, .cart-checkout-button, .button.checkout', function (e) {
1611
+ jQuery(document).one("click", ".checkout-button, .cart-checkout-button, .button.checkout", function (e) {
1612
+ // jQuery('.checkout-button, .cart-checkout-button, .button.checkout').one('click', function (e) {
1613
+ // console.log('begin_checkout');
1614
+
1615
+ jQuery(document).trigger("wpmBeginCheckout")
1616
+ })
1617
+
1618
+
1619
+ // checkout_progress event
1620
+ // track checkout option event: entered valid billing email
1621
+ // body.on('input', '#billing_email', function () {
1622
+ jQuery(document).on("input", "#billing_email", function () {
1623
+ // jQuery('#billing_email').on('input', function () {
1624
+
1625
+ if (wpm.isEmail(jQuery(this).val())) {
1626
+ // wpm.fireCheckoutOption(2);
1627
+ wpm.fireCheckoutProgress(2)
1628
+ wpm.emailSelected = true
1629
+ }
1630
+ })
1631
+
1632
+ // track checkout option event: purchase click
1633
+
1634
+ // body.on('click', '.wc_payment_methods', function () {
1635
+ jQuery(document).on("click", ".wc_payment_methods", function () {
1636
+ // jQuery('.wc_payment_methods').on('click', function () {
1637
+
1638
+ if (false === wpm.paymentMethodSelected) {
1639
+ wpm.fireCheckoutProgress(3)
1640
+ }
1641
+
1642
+ wpm.fireCheckoutOption(3, jQuery("input[name='payment_method']:checked").val())
1643
+ wpm.paymentMethodSelected = true
1644
+ })
1645
+
1646
+ // track checkout option event: purchase click
1647
+ // body.one('click', '#place_order', function () {
1648
+ jQuery(document).one("click", "#place_order", function () {
1649
+ // jQuery('#place_order').one('click', function () {
1650
+
1651
+ if (false === wpm.emailSelected) {
1652
+ wpm.fireCheckoutProgress(2)
1653
+ }
1654
+
1655
+ if (false === wpm.paymentMethodSelected) {
1656
+ wpm.fireCheckoutProgress(3)
1657
+ wpm.fireCheckoutOption(3, jQuery("input[name='payment_method']:checked").val())
1658
+ }
1659
+
1660
+ wpm.fireCheckoutProgress(4)
1661
+ })
1662
+
1663
+ // update cart event
1664
+ // body.on('click', "[name='update_cart']", function (e) {
1665
+ jQuery(document).on("click", "[name='update_cart']", function (e) {
1666
+ // jQuery("[name='update_cart']").on('click', function (e) {
1667
+
1668
+ try {
1669
+ jQuery(".cart_item").each(function () {
1670
+
1671
+ // let productId = jQuery(this).find('[data-product_id]').data('product_id');
1672
+
1673
+ let url = new URL(jQuery(this).find(".product-remove").find("a").attr("href"))
1674
+ let productId = wpm.getProductIdByCartItemKeyUrl(url)
1675
+
1676
+ // console.log(productId)
1677
+
1678
+ let quantity = jQuery(this).find(".qty").val()
1679
+
1680
+ if (quantity === 0) {
1681
+ wpm.removeProductFromCart(productId)
1682
+ } else if (quantity < wpmDataLayer.cart[productId].quantity) {
1683
+ wpm.removeProductFromCart(productId, wpmDataLayer.cart[productId].quantity - quantity)
1684
+ } else if (quantity > wpmDataLayer.cart[productId].quantity) {
1685
+ wpm.addProductToCart(productId, quantity - wpmDataLayer.cart[productId].quantity)
1686
+ }
1687
+ })
1688
+ } catch (e) {
1689
+ console.error(e)
1690
+ wpm.getCartItemsFromBackend()
1691
+ }
1692
+ })
1693
+
1694
+
1695
+ // add_to_wishlist
1696
+ // body.on('click', '.add_to_wishlist, .wl-add-to', function () {
1697
+ jQuery(document).on("click", ".add_to_wishlist, .wl-add-to", function () {
1698
+ // jQuery('.add_to_wishlist, .wl-add-to').on('click', function () {
1699
+
1700
+ try {
1701
+ // console.log('add_to_wishlist');
1702
+ // console.log('this:' + jQuery(this).data('product-id'));
1703
+
1704
+ let productId
1705
+
1706
+ if (jQuery(this).data("productid")) { // for the WooCommerce wishlist plugin
1707
+ productId = jQuery(this).data("productid")
1708
+ } else if (jQuery(this).data("product-id")) { // for the YITH wishlist plugin
1709
+ productId = jQuery(this).data("product-id")
1710
+ }
1711
+
1712
+ if (!productId) throw Error("Wasn't able to retrieve a productId")
1713
+
1714
+ let product = wpm.getProductDetailsFormattedForEvent(productId)
1715
+
1716
+ // console.log('add_to_wishlist');
1717
+ // console.log(product);
1718
+
1719
+ jQuery(document).trigger("wpmAddToWishlist", product)
1720
+ } catch (e) {
1721
+ console.error(e)
1722
+ }
1723
+ })
1724
+
1725
+ // body.on('updated_cart_totals', function () {
1726
+ jQuery(document).on("updated_cart_totals", function () {
1727
+ jQuery(document).trigger("wpmViewCart")
1728
+ })
1729
+
1730
+
1731
+ // populate the wpmDataLayer with the cart items
1732
+ jQuery(window).on("wpmLoad", function () {
1733
+ // console.log('getting cart');
1734
+
1735
+ try {
1736
+ // console.log('wpmMiniCartActive: ' + JSON.parse(sessionStorage.getItem('wpmMiniCartActive')));
1737
+ // if ( wpmDataLayer.shop.page_type === 'cart' || wpmDataLayer.shop.mini_cart.track === true) {
1738
+
1739
+ if (
1740
+ JSON.parse(sessionStorage.getItem("wpmMiniCartActive")) && // if we detected calls to get_refreshed_fragments
1741
+ JSON.parse(sessionStorage.getItem("wpmFirstPageLoad")) && // when a new session is initiated there are no items in the cart, so we can save that call
1742
+ wpmDataLayer.shop.mini_cart.track === true // if shop owner generally allows the plugin to track the mini cart
1743
+ ) {
1744
+ // console.log('getting cart');
1745
+ wpm.getCartItems()
1746
+
1747
+ } else {
1748
+ sessionStorage.setItem("wpmFirstPageLoad", JSON.stringify(true))
1749
+ }
1750
+ } catch (e) {
1751
+ console.error(e)
1752
+ }
1753
+ })
1754
+
1755
+ // get all add-to-cart= products from backend
1756
+ jQuery(window).on("wpmLoad", function () {
1757
+
1758
+ wpmDataLayer.products = wpmDataLayer.products || {}
1759
+ // wpmDataLayer.products = {14: 'x', 31: 'x', 16: 'x', 22: 'x', 40: 'x'};
1760
+
1761
+ // scan page for add-to-cart= links
1762
+ let productIds = wpm.getAddToCartLinkProductIds()
1763
+
1764
+ wpm.getProductsFromBackend(productIds)
1765
+ })
1766
+
1767
+ /**
1768
+ * Save the referrer into a cookie
1769
+ */
1770
+
1771
+ jQuery(window).on("wpmLoad", function () {
1772
+
1773
+ // can't use session storage as we can't read it from the server
1774
+ if (!wpm.getCookie("wpmReferrer")) {
1775
+
1776
+ if (document.referrer) {
1777
+ let referrerUrl = new URL(document.referrer)
1778
+ let referrerHostname = referrerUrl.hostname
1779
+
1780
+ if (referrerHostname !== window.location.host) {
1781
+ wpm.setCookie("wpmReferrer", referrerHostname)
1782
+ } else {
1783
+ wpm.setCookie("wpmReferrer", "")
1784
+ }
1785
+
1786
+ } else {
1787
+ wpm.setCookie("wpmReferrer", "")
1788
+ }
1789
+ }
1790
+ })
1791
+
1792
+
1793
+ /**
1794
+ * Create our own load event in order to better handle script flow execution when JS "optimizers" shuffle the code.
1795
+ */
1796
+
1797
+ jQuery(window).on("wpmLoad", function () {
1798
+ try {
1799
+ if (typeof wpmDataLayer != "undefined" && !wpmDataLayer?.wpmLoadFired) {
1800
+
1801
+ jQuery(document).trigger("wpmLoadAlways")
1802
+
1803
+ if ("product" === wpmDataLayer.shop.page_type && wpmDataLayer.shop.product_type !== "variable" && wpm.getMainProductIdFromProductPage()) {
1804
+
1805
+ let product = wpm.getProductDataForViewItemEvent(wpm.getMainProductIdFromProductPage())
1806
+ jQuery(document).trigger("wpmViewItem", product)
1807
+
1808
+ } else if ("product_category" === wpmDataLayer.shop.page_type) {
1809
+
1810
+ jQuery(document).trigger("wpmCategory")
1811
+
1812
+ } else if ("search" === wpmDataLayer.shop.page_type) {
1813
+
1814
+ jQuery(document).trigger("wpmSearch")
1815
+
1816
+ } else if ("cart" === wpmDataLayer.shop.page_type) {
1817
+
1818
+ jQuery(document).trigger("wpmViewCart")
1819
+
1820
+ } else if ("order_received_page" === wpmDataLayer.shop.page_type && wpmDataLayer.order) {
1821
+
1822
+ if (!wpm.isOrderIdStored(wpmDataLayer.order.id)) {
1823
+
1824
+ jQuery(document).trigger("wpmOrderReceivedPage")
1825
+ wpm.writeOrderIdToStorage(wpmDataLayer.order.id)
1826
+ }
1827
+ } else {
1828
+ jQuery(document).trigger("wpmEverywhereElse")
1829
+ }
1830
+
1831
+ if (wpmDataLayer?.user?.id && !wpm.hasLoginEventFired()) {
1832
+ jQuery(document).trigger("wpmLogin")
1833
+ wpm.setLoginEventFired()
1834
+ }
1835
+
1836
+ /**
1837
+ * Load mini cart fragments into a wpm session storage key,
1838
+ * after the document load event.
1839
+ */
1840
+ jQuery(document).ajaxSend(function (event, jqxhr, settings) {
1841
+ // console.log('settings.url: ' + settings.url);
1842
+
1843
+ if (settings.url.includes("get_refreshed_fragments") && sessionStorage) {
1844
+ if (!sessionStorage.getItem("wpmMiniCartActive")) {
1845
+ sessionStorage.setItem("wpmMiniCartActive", JSON.stringify(true))
1846
+ }
1847
+ }
1848
+ })
1849
+
1850
+ wpmDataLayer.wpmLoadFired = true
1851
+ }
1852
+
1853
+ } catch (e) {
1854
+ console.error(e)
1855
+ }
1856
+ })
1857
+
1858
+ // jQuery(window).on("load", function () {
1859
+ // jQuery(document).trigger("wpmLoad", {})
1860
+ // })
1861
+
1862
+ jQuery(window).on("wpmPreLoadPixels", function () {
1863
+
1864
+ if (wpmDataLayer?.shop?.cookie_consent_mgmt?.explicit_consent) {
1865
+ wpm.updateConsentCookieValues(true)
1866
+ }
1867
+ jQuery(document).trigger("wpmLoadPixels", {})
1868
+ })
1869
+
1870
+
1871
+ /**
1872
+ * Events that only work after document ready state,
1873
+ * such as jQuery(".single_variation_wrap").on("show_variation", function(){})
1874
+ */
1875
+
1876
+ jQuery(function () {
1877
+
1878
+ /**
1879
+ * Fired when the user selects all the required dropdowns / attributes
1880
+ * Can only be hooked into after document ready
1881
+ * https://stackoverflow.com/a/27849208/4688612
1882
+ * https://stackoverflow.com/a/65065335/4688612
1883
+ */
1884
+ jQuery(".single_variation_wrap").on("show_variation", function (event, variation) {
1885
+
1886
+ try {
1887
+ let productId = getIdBasedOndVariationsOutputSetting(variation.variation_id)
1888
+
1889
+ if (!productId) throw Error("Wasn't able to retrieve a productId")
1890
+
1891
+ if (wpmDataLayer.products && wpmDataLayer.products[productId]) {
1892
+
1893
+ // console.log('productId: ' + productId);
1894
+
1895
+ let product = wpm.getProductDetailsFormattedForEvent(productId)
1896
+
1897
+ jQuery(document).trigger("wpmViewItem", product)
1898
+ }
1899
+ } catch (e) {
1900
+ console.error(e)
1901
+ }
1902
+ })
1903
+
1904
+
1905
+ })
languages/woocommerce-google-adwords-conversion-tracking-tag.pot CHANGED
@@ -2,21 +2,21 @@
2
  # This file is distributed under the GNU General Public License v3.0.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: WooCommerce Pixel Manager 1.16.3\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/src\n"
7
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
8
  "Language-Team: LANGUAGE <LL@li.org>\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
- "POT-Creation-Date: 2022-04-07T03:49:34+00:00\n"
13
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
  "X-Generator: WP-CLI 2.6.0\n"
15
  "X-Domain: woocommerce-google-adwords-conversion-tracking-tag\n"
16
 
17
  #. Plugin Name of the plugin
18
- #: wgact.php:207
19
- #: wgact.php:208
20
  msgid "WooCommerce Pixel Manager"
21
  msgstr ""
22
 
@@ -36,222 +36,222 @@ msgstr ""
36
  msgid "https://sweetcode.com"
37
  msgstr ""
38
 
39
- #: classes/admin/class-admin.php:226
40
- #: classes/admin/class-admin.php:227
41
  msgid "Pixel Manager"
42
  msgstr ""
43
 
44
- #: classes/admin/class-admin.php:257
45
  msgid "Main"
46
  msgstr ""
47
 
48
- #: classes/admin/class-admin.php:278
49
  msgid "Google"
50
  msgstr ""
51
 
52
- #: classes/admin/class-admin.php:301
53
  msgid "Google Ads Conversion ID"
54
  msgstr ""
55
 
56
- #: classes/admin/class-admin.php:313
57
  msgid "Google Ads Purchase Conversion Label"
58
  msgstr ""
59
 
60
- #: classes/admin/class-admin.php:324
61
  msgid "Google Analytics UA"
62
  msgstr ""
63
 
64
- #: classes/admin/class-admin.php:335
65
  msgid "Google Analytics 4"
66
  msgstr ""
67
 
68
- #: classes/admin/class-admin.php:346
69
  msgid "Google Optimize"
70
  msgstr ""
71
 
72
- #: classes/admin/class-admin.php:358
73
- msgid "Meta (Facebook)"
74
  msgstr ""
75
 
76
- #: classes/admin/class-admin.php:381
77
- msgid "Meta (Facebook) pixel ID"
78
  msgstr ""
79
 
80
- #: classes/admin/class-admin.php:393
81
  msgid "more pixels"
82
  msgstr ""
83
 
84
- #: classes/admin/class-admin.php:418
85
  msgid "Microsoft Advertising UET tag ID"
86
  msgstr ""
87
 
88
- #: classes/admin/class-admin.php:430
89
  msgid "Twitter pixel ID"
90
  msgstr ""
91
 
92
- #: classes/admin/class-admin.php:442
93
  msgid "Pinterest pixel ID"
94
  msgstr ""
95
 
96
- #: classes/admin/class-admin.php:454
97
  msgid "Snapchat pixel ID"
98
  msgstr ""
99
 
100
- #: classes/admin/class-admin.php:466
101
  msgid "TikTok pixel ID"
102
  msgstr ""
103
 
104
- #: classes/admin/class-admin.php:479
105
  msgid "Hotjar site ID"
106
  msgstr ""
107
 
108
- #: classes/admin/class-admin.php:491
109
  msgid "Advanced"
110
  msgstr ""
111
 
112
- #: classes/admin/class-admin.php:542
113
  msgid "Order Total Logic"
114
  msgstr ""
115
 
116
- #: classes/admin/class-admin.php:554
117
  msgid "Order Duplication Prevention"
118
  msgstr ""
119
 
120
- #: classes/admin/class-admin.php:566
121
  msgid "Maximum Compatibility Mode"
122
  msgstr ""
123
 
124
- #: classes/admin/class-admin.php:580
125
- msgid "Disable Tracking for User Roles"
126
  msgstr ""
127
 
128
- #: classes/admin/class-admin.php:614
129
  msgid "Conversion Cart Data"
130
  msgstr ""
131
 
132
- #: classes/admin/class-admin.php:627
133
  msgid "Enhanced E-Commerce"
134
  msgstr ""
135
 
136
- #: classes/admin/class-admin.php:639
137
  msgid "GA 4 API secret"
138
  msgstr ""
139
 
140
- #: classes/admin/class-admin.php:652
141
  msgid "Enhanced Link Attribution"
142
  msgstr ""
143
 
144
- #: classes/admin/class-admin.php:665
145
  msgid "Google User ID"
146
  msgstr ""
147
 
148
- #: classes/admin/class-admin.php:677
149
  msgid "Google Ads Enhanced Conversions"
150
  msgstr ""
151
 
152
- #: classes/admin/class-admin.php:691
153
  msgid "Google Ads Phone Conversion Number"
154
  msgstr ""
155
 
156
- #: classes/admin/class-admin.php:703
157
  msgid "Google Ads Phone Conversion Label"
158
  msgstr ""
159
 
160
- #: classes/admin/class-admin.php:716
161
  msgid "Cookie Consent Management"
162
  msgstr ""
163
 
164
- #: classes/admin/class-admin.php:739
165
  msgid "Google Consent Mode"
166
  msgstr ""
167
 
168
- #: classes/admin/class-admin.php:751
169
  msgid "Google Consent Regions"
170
  msgstr ""
171
 
172
- #: classes/admin/class-admin.php:763
173
  msgid "Explicit Consent Mode"
174
  msgstr ""
175
 
176
- #: classes/admin/class-admin.php:776
177
  msgid "Borlabs Cookie support"
178
  msgstr ""
179
 
180
- #: classes/admin/class-admin.php:790
181
  msgid "Cookiebot support"
182
  msgstr ""
183
 
184
- #: classes/admin/class-admin.php:804
185
  msgid "Complianz GDPR support"
186
  msgstr ""
187
 
188
- #: classes/admin/class-admin.php:818
189
  msgid "Cookie Notice support"
190
  msgstr ""
191
 
192
- #: classes/admin/class-admin.php:832
193
  msgid "Cookie Script support"
194
  msgstr ""
195
 
196
- #: classes/admin/class-admin.php:846
197
  msgid "GDPR Cookie Compliance support"
198
  msgstr ""
199
 
200
- #: classes/admin/class-admin.php:860
201
  msgid "GDPR Cookie Consent support"
202
  msgstr ""
203
 
204
- #: classes/admin/class-admin.php:893
205
- msgid "Meta (Facebook) CAPI: token"
206
  msgstr ""
207
 
208
- #: classes/admin/class-admin.php:905
209
- msgid "Meta (Facebook) CAPI: process anonymous hits"
210
  msgstr ""
211
 
212
- #: classes/admin/class-admin.php:917
213
- msgid "Meta (Facebook) CAPI: send additional visitor identifiers"
214
  msgstr ""
215
 
216
- #: classes/admin/class-admin.php:929
217
- msgid "Meta (Facebook) Microdata Tags for Catalogues"
218
  msgstr ""
219
 
220
- #: classes/admin/class-admin.php:941
221
- #: classes/admin/class-admin.php:954
222
- #: classes/admin/class-admin.php:965
223
  msgid "Dynamic Remarketing"
224
  msgstr ""
225
 
226
- #: classes/admin/class-admin.php:977
227
  msgid "Product Identifier"
228
  msgstr ""
229
 
230
- #: classes/admin/class-admin.php:989
231
  msgid "Variations output"
232
  msgstr ""
233
 
234
- #: classes/admin/class-admin.php:1002
235
  msgid "Google Business Vertical"
236
  msgstr ""
237
 
238
- #: classes/admin/class-admin.php:1015
239
  #: classes/admin/class-admin.php:1024
 
240
  msgid "Support"
241
  msgstr ""
242
 
243
- #: classes/admin/class-admin.php:1032
244
- #: classes/admin/class-admin.php:1042
245
  msgid "Author"
246
  msgstr ""
247
 
248
- #: classes/admin/class-admin.php:1078
249
  msgid ""
250
  "It looks like you are using some sort of ad or script blocker which is blocking the script and CSS files of this plugin.\n"
251
  " In order for the plugin to work properly you need to disable the script blocker."
252
  msgstr ""
253
 
254
- #: classes/admin/class-admin.php:1085
255
  #: classes/admin/class-notifications.php:31
256
  #: classes/admin/class-notifications.php:73
257
  #: classes/admin/class-notifications.php:114
@@ -259,413 +259,441 @@ msgstr ""
259
  msgid "Learn more"
260
  msgstr ""
261
 
262
- #: classes/admin/class-admin.php:1130
263
  msgid "Profit Driven Marketing by SweetCode"
264
  msgstr ""
265
 
266
- #: classes/admin/class-admin.php:1155
267
  msgid "Visit us here:"
268
  msgstr ""
269
 
270
- #: classes/admin/class-admin.php:1200
271
  msgid "Contacting Support"
272
  msgstr ""
273
 
274
- #: classes/admin/class-admin.php:1214
275
  msgid "Debug Information"
276
  msgstr ""
277
 
278
- #: classes/admin/class-admin.php:1223
279
  msgid "copy to clipboard"
280
  msgstr ""
281
 
282
- #: classes/admin/class-admin.php:1237
283
  msgid "Translations"
284
  msgstr ""
285
 
286
- #: classes/admin/class-admin.php:1238
287
  msgid "If you want to participate improving the translations of this plugin into your language, please follow this link:"
288
  msgstr ""
289
 
290
- #: classes/admin/class-admin.php:1256
291
  msgid "Post a support request in the WordPress support forum here: "
292
  msgstr ""
293
 
294
- #: classes/admin/class-admin.php:1259
295
  msgid "Support forum"
296
  msgstr ""
297
 
298
- #: classes/admin/class-admin.php:1263
299
  msgid "(Never post the debug or other sensitive information to the support forum. Instead send us the information by email.)"
300
  msgstr ""
301
 
302
- #: classes/admin/class-admin.php:1266
303
  msgid "Or send us an email to the following address: "
304
  msgstr ""
305
 
306
- #: classes/admin/class-admin.php:1282
307
  msgid "Send us your support request through the WooCommerce.com dashboard: "
308
  msgstr ""
309
 
310
- #: classes/admin/class-admin.php:1296
311
  msgid "More details about the developer of this plugin: "
312
  msgstr ""
313
 
314
- #: classes/admin/class-admin.php:1299
315
  msgid "Developer: SweetCode"
316
  msgstr ""
317
 
318
- #: classes/admin/class-admin.php:1301
319
  msgid "Website: "
320
  msgstr ""
321
 
322
- #: classes/admin/class-admin.php:1324
323
  msgid "The Google Analytics Universal property ID looks like this:"
324
  msgstr ""
325
 
326
- #: classes/admin/class-admin.php:1340
327
  msgid "The Google Analytics 4 measurement ID looks like this:"
328
  msgstr ""
329
 
330
- #: classes/admin/class-admin.php:1356
331
  msgid "The conversion ID looks similar to this:"
332
  msgstr ""
333
 
334
- #: classes/admin/class-admin.php:1372
335
  msgid "The purchase conversion label looks similar to this:"
336
  msgstr ""
337
 
338
- #: classes/admin/class-admin.php:1376
339
- #: classes/admin/class-admin.php:2103
340
  msgid "Requires an active Google Ads Conversion ID"
341
  msgstr ""
342
 
343
- #: classes/admin/class-admin.php:1394
344
  msgid "The Google Optimize container ID looks like this:"
345
  msgstr ""
346
 
347
- #: classes/admin/class-admin.php:1410
348
- msgid "The Meta (Facebook) pixel ID looks similar to this:"
349
  msgstr ""
350
 
351
- #: classes/admin/class-admin.php:1428
352
  msgid "The Microsoft Advertising UET tag ID looks similar to this:"
353
  msgstr ""
354
 
355
- #: classes/admin/class-admin.php:1447
356
  msgid "The Twitter pixel ID looks similar to this:"
357
  msgstr ""
358
 
359
- #: classes/admin/class-admin.php:1466
360
  msgid "The Pinterest pixel ID looks similar to this:"
361
  msgstr ""
362
 
363
- #: classes/admin/class-admin.php:1485
364
  msgid "The Snapchat pixel ID looks similar to this:"
365
  msgstr ""
366
 
367
- #: classes/admin/class-admin.php:1504
368
  msgid "The TikTok pixel ID looks similar to this:"
369
  msgstr ""
370
 
371
- #: classes/admin/class-admin.php:1516
372
  msgid "The Hotjar site ID looks similar to this:"
373
  msgstr ""
374
 
375
- #: classes/admin/class-admin.php:1526
376
  msgid "Use order_subtotal: Doesn't include tax and shipping (default)"
377
  msgstr ""
378
 
379
- #: classes/admin/class-admin.php:1533
380
  msgid "Use order_total: Includes tax and shipping"
381
  msgstr ""
382
 
383
- #: classes/admin/class-admin.php:1536
384
  msgid "This is the order total amount reported back to Google Ads"
385
  msgstr ""
386
 
387
- #: classes/admin/class-admin.php:1556
388
  msgid "open the documentation"
389
  msgstr ""
390
 
391
- #: classes/admin/class-admin.php:1576
 
 
 
 
 
 
 
 
 
 
 
 
392
  msgid "Enable Google consent mode with standard settings"
393
  msgstr ""
394
 
395
- #: classes/admin/class-admin.php:1614
396
  msgid "If no region is set, then the restrictions are enabled for all regions. If you specify one or more regions, then the restrictions only apply for the specified regions."
397
  msgstr ""
398
 
399
- #: classes/admin/class-admin.php:1635
400
  msgid "Enable Google Analytics enhanced e-commerce"
401
  msgstr ""
402
 
403
- #: classes/admin/class-admin.php:1646
404
- #: classes/admin/class-admin.php:1707
405
- #: classes/admin/class-admin.php:1737
406
  msgid "You need to activate at least Google Analytics UA or Google Analytics 4"
407
  msgstr ""
408
 
409
- #: classes/admin/class-admin.php:1668
410
  msgid "Google Analytics 4 activation required"
411
  msgstr ""
412
 
413
- #: classes/admin/class-admin.php:1673
414
  msgid "Enhanced E-Commerce activation required"
415
  msgstr ""
416
 
417
- #: classes/admin/class-admin.php:1676
418
  msgid "If enabled, purchase and refund events will be sent to Google through the measurement protocol for increased accuracy."
419
  msgstr ""
420
 
421
- #: classes/admin/class-admin.php:1691
422
  msgid "Enable Google Analytics enhanced link attribution"
423
  msgstr ""
424
 
425
- #: classes/admin/class-admin.php:1726
426
  msgid "Enable Google user ID"
427
  msgstr ""
428
 
429
- #: classes/admin/class-admin.php:1756
430
  msgid "Enable Google Ads Enhanced Conversions"
431
  msgstr ""
432
 
433
- #: classes/admin/class-admin.php:1767
434
  msgid "You need to activate Google Ads"
435
  msgstr ""
436
 
437
- #: classes/admin/class-admin.php:1787
438
  msgid "The Google Ads phone conversion number must be in the same format as on the website."
439
  msgstr ""
440
 
441
- #: classes/admin/class-admin.php:1809
442
  msgid "Borlabs Cookie detected. Automatic support is:"
443
  msgstr ""
444
 
445
- #: classes/admin/class-admin.php:1815
446
  msgid "Cookiebot detected. Automatic support is:"
447
  msgstr ""
448
 
449
- #: classes/admin/class-admin.php:1821
450
  msgid "Complianz GDPR detected. Automatic support is:"
451
  msgstr ""
452
 
453
- #: classes/admin/class-admin.php:1827
454
  msgid "Cookie Notice (by hu-manity.co) detected. Automatic support is:"
455
  msgstr ""
456
 
457
- #: classes/admin/class-admin.php:1833
458
  msgid "Cookie Script (by cookie-script.com) detected. Automatic support is:"
459
  msgstr ""
460
 
461
- #: classes/admin/class-admin.php:1839
462
  msgid "GDPR Cookie Compliance (by Moove Agency) detected. Automatic support is:"
463
  msgstr ""
464
 
465
- #: classes/admin/class-admin.php:1845
466
  msgid "GDPR Cookie Consent (by WebToffee) detected. Automatic support is:"
467
  msgstr ""
468
 
469
- #: classes/admin/class-admin.php:1864
470
  msgid "Enable Explicit Consent Mode"
471
  msgstr ""
472
 
473
- #: classes/admin/class-admin.php:1873
474
  msgid "Only activate the Explicit Consent Mode if you are also using a Cookie Management Platform (a cookie banner) that is compatible with this plugin. Find a list of compatible plugins in the documentation."
475
  msgstr ""
476
 
477
- #: classes/admin/class-admin.php:1892
478
  #: classes/admin/class-admin.php:1925
479
- #: classes/admin/class-admin.php:1954
480
- #: classes/admin/class-admin.php:1982
481
- msgid "You need to activate the Meta (Facebook) pixel"
 
482
  msgstr ""
483
 
484
- #: classes/admin/class-admin.php:1916
485
- msgid "Send CAPI hits for anonymous visitors who likely have blocked the Meta (Facebook) pixel."
486
  msgstr ""
487
 
488
- #: classes/admin/class-admin.php:1945
489
  msgid "Include additional visitor's identifiers, such as IP address, email and shop ID in the CAPI hit."
490
  msgstr ""
491
 
492
- #: classes/admin/class-admin.php:1973
493
- msgid "Enable Meta (Facebook) product microdata output"
 
 
 
 
 
 
 
 
494
  msgstr ""
495
 
496
- #: classes/admin/class-admin.php:2009
497
  msgid "Only disable order duplication prevention for testing. Remember to re-enable the setting once done."
498
  msgstr ""
499
 
500
- #: classes/admin/class-admin.php:2026
501
  msgid "Enable the maximum compatibility mode"
502
  msgstr ""
503
 
504
- #: classes/admin/class-admin.php:2062
505
  msgid "Advanced order duplication prevention is "
506
  msgstr ""
507
 
508
- #: classes/admin/class-admin.php:2064
509
  msgid "Basic order duplication prevention is "
510
  msgstr ""
511
 
512
- #: classes/admin/class-admin.php:2088
513
  msgid "Enable dynamic remarketing audience collection"
514
  msgstr ""
515
 
516
- #: classes/admin/class-admin.php:2109
517
  msgid "You need to choose the correct product identifier setting in order to match the product identifiers in the product feeds."
518
  msgstr ""
519
 
520
- #: classes/admin/class-admin.php:2127
521
  msgid "Enable variations output"
522
  msgstr ""
523
 
524
- #: classes/admin/class-admin.php:2138
525
  msgid "In order for this to work you need to upload your product feed including product variations and the item_group_id. Disable it, if you choose only to upload the parent product for variable products."
526
  msgstr ""
527
 
528
- #: classes/admin/class-admin.php:2153
529
  msgid "Retail"
530
  msgstr ""
531
 
532
- #: classes/admin/class-admin.php:2163
533
  msgid "Education"
534
  msgstr ""
535
 
536
- #: classes/admin/class-admin.php:2173
537
  msgid "Hotels and rentals"
538
  msgstr ""
539
 
540
- #: classes/admin/class-admin.php:2183
541
  msgid "Jobs"
542
  msgstr ""
543
 
544
- #: classes/admin/class-admin.php:2193
545
  msgid "Local deals"
546
  msgstr ""
547
 
548
- #: classes/admin/class-admin.php:2203
549
  msgid "Real estate"
550
  msgstr ""
551
 
552
- #: classes/admin/class-admin.php:2213
553
  msgid "Custom"
554
  msgstr ""
555
 
556
- #: classes/admin/class-admin.php:2232
557
  msgid "ID of your Google Merchant Center account. It looks like this: 12345678"
558
  msgstr ""
559
 
560
- #: classes/admin/class-admin.php:2241
 
 
 
 
 
 
 
 
561
  msgid "post ID (default)"
562
  msgstr ""
563
 
564
- #: classes/admin/class-admin.php:2247
565
  msgid "SKU"
566
  msgstr ""
567
 
568
- #: classes/admin/class-admin.php:2254
569
  msgid "ID for the WooCommerce Google Product Feed. Outputs the post ID with woocommerce_gpf_ prefix *"
570
  msgstr ""
571
 
572
- #: classes/admin/class-admin.php:2261
573
  msgid "ID for the WooCommerce Google Listings & Ads Plugin. Outputs the post ID with gla_ prefix **"
574
  msgstr ""
575
 
576
- #: classes/admin/class-admin.php:2265
577
  msgid "Choose a product identifier."
578
  msgstr ""
579
 
580
- #: classes/admin/class-admin.php:2268
581
  msgid "* This is for users of the WooCommerce Google Product Feed Plugin"
582
  msgstr ""
583
 
584
- #: classes/admin/class-admin.php:2272
585
  msgid "** This is for users of the WooCommerce Google Listings & Ads Plugin"
586
  msgstr ""
587
 
588
- #: classes/admin/class-admin.php:2281
589
  msgid "beta"
590
  msgstr ""
591
 
592
- #: classes/admin/class-admin.php:2285
593
- #: classes/admin/class-admin.php:2290
594
  msgid "active"
595
  msgstr ""
596
 
597
- #: classes/admin/class-admin.php:2295
598
- #: classes/admin/class-admin.php:2300
599
  msgid "inactive"
600
  msgstr ""
601
 
602
- #: classes/admin/class-admin.php:2305
603
- #: classes/admin/class-admin.php:2310
604
  msgid "partially active"
605
  msgstr ""
606
 
607
- #: classes/admin/class-admin.php:2321
608
  msgid "Pro Feature"
609
  msgstr ""
610
 
611
- #: classes/admin/class-admin.php:2365
612
  msgid "You have entered an invalid Google Analytics Universal property ID."
613
  msgstr ""
614
 
615
- #: classes/admin/class-admin.php:2373
616
  msgid "You have entered an invalid Google Analytics 4 measurement ID."
617
  msgstr ""
618
 
619
- #: classes/admin/class-admin.php:2381
620
  msgid "You have entered an invalid Google Analytics 4 API key."
621
  msgstr ""
622
 
623
- #: classes/admin/class-admin.php:2389
624
  msgid "You have entered an invalid conversion ID. It only contains 8 to 10 digits."
625
  msgstr ""
626
 
627
- #: classes/admin/class-admin.php:2397
628
- #: classes/admin/class-admin.php:2405
629
  msgid "You have entered an invalid conversion label."
630
  msgstr ""
631
 
632
- #: classes/admin/class-admin.php:2413
633
  msgid "You have entered an invalid merchant ID. It only contains 7 to 10 digits."
634
  msgstr ""
635
 
636
- #: classes/admin/class-admin.php:2421
637
  msgid "You have entered an invalid Google Optimize container ID."
638
  msgstr ""
639
 
640
- #: classes/admin/class-admin.php:2429
641
- msgid "You have entered an invalid Meta (Facebook) pixel ID. It only contains 14 to 16 digits."
642
  msgstr ""
643
 
644
- #: classes/admin/class-admin.php:2437
645
- msgid "You have entered an invalid Meta (Facebook) CAPI token."
646
  msgstr ""
647
 
648
- #: classes/admin/class-admin.php:2445
649
  msgid "You have entered an invalid Bing Ads UET tag ID. It only contains 7 to 9 digits."
650
  msgstr ""
651
 
652
- #: classes/admin/class-admin.php:2453
653
  msgid "You have entered an invalid Twitter pixel ID. It only contains 5 to 7 lowercase letters and numbers."
654
  msgstr ""
655
 
656
- #: classes/admin/class-admin.php:2461
657
  msgid "You have entered an invalid Pinterest pixel ID. It only contains 13 digits."
658
  msgstr ""
659
 
660
- #: classes/admin/class-admin.php:2469
661
  msgid "You have entered an invalid Snapchat pixel ID."
662
  msgstr ""
663
 
664
- #: classes/admin/class-admin.php:2477
665
  msgid "You have entered an invalid TikTok pixel ID."
666
  msgstr ""
667
 
668
- #: classes/admin/class-admin.php:2485
669
  msgid "You have entered an invalid Hotjar site ID. It only contains 6 to 9 digits."
670
  msgstr ""
671
 
@@ -762,14 +790,14 @@ msgstr ""
762
  msgid "Find more information about the the reason in our documentation: "
763
  msgstr ""
764
 
765
- #: wgact.php:223
766
  msgid "WooCommerce Pixel Manager error"
767
  msgstr ""
768
 
769
- #: wgact.php:225
770
  msgid "Your environment doesn't meet all the system requirements listed below."
771
  msgstr ""
772
 
773
- #: wgact.php:229
774
  msgid "The WooCommerce plugin needs to be activated"
775
  msgstr ""
2
  # This file is distributed under the GNU General Public License v3.0.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: WooCommerce Pixel Manager 1.15.2\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/src\n"
7
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
8
  "Language-Team: LANGUAGE <LL@li.org>\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
+ "POT-Creation-Date: 2022-03-21T04:36:00+00:00\n"
13
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
  "X-Generator: WP-CLI 2.6.0\n"
15
  "X-Domain: woocommerce-google-adwords-conversion-tracking-tag\n"
16
 
17
  #. Plugin Name of the plugin
18
+ #: wgact.php:204
19
+ #: wgact.php:205
20
  msgid "WooCommerce Pixel Manager"
21
  msgstr ""
22
 
36
  msgid "https://sweetcode.com"
37
  msgstr ""
38
 
39
+ #: classes/admin/class-admin.php:201
40
+ #: classes/admin/class-admin.php:202
41
  msgid "Pixel Manager"
42
  msgstr ""
43
 
44
+ #: classes/admin/class-admin.php:232
45
  msgid "Main"
46
  msgstr ""
47
 
48
+ #: classes/admin/class-admin.php:253
49
  msgid "Google"
50
  msgstr ""
51
 
52
+ #: classes/admin/class-admin.php:276
53
  msgid "Google Ads Conversion ID"
54
  msgstr ""
55
 
56
+ #: classes/admin/class-admin.php:288
57
  msgid "Google Ads Purchase Conversion Label"
58
  msgstr ""
59
 
60
+ #: classes/admin/class-admin.php:299
61
  msgid "Google Analytics UA"
62
  msgstr ""
63
 
64
+ #: classes/admin/class-admin.php:310
65
  msgid "Google Analytics 4"
66
  msgstr ""
67
 
68
+ #: classes/admin/class-admin.php:321
69
  msgid "Google Optimize"
70
  msgstr ""
71
 
72
+ #: classes/admin/class-admin.php:333
73
+ msgid "Facebook"
74
  msgstr ""
75
 
76
+ #: classes/admin/class-admin.php:356
77
+ msgid "Facebook pixel ID"
78
  msgstr ""
79
 
80
+ #: classes/admin/class-admin.php:368
81
  msgid "more pixels"
82
  msgstr ""
83
 
84
+ #: classes/admin/class-admin.php:393
85
  msgid "Microsoft Advertising UET tag ID"
86
  msgstr ""
87
 
88
+ #: classes/admin/class-admin.php:405
89
  msgid "Twitter pixel ID"
90
  msgstr ""
91
 
92
+ #: classes/admin/class-admin.php:417
93
  msgid "Pinterest pixel ID"
94
  msgstr ""
95
 
96
+ #: classes/admin/class-admin.php:429
97
  msgid "Snapchat pixel ID"
98
  msgstr ""
99
 
100
+ #: classes/admin/class-admin.php:441
101
  msgid "TikTok pixel ID"
102
  msgstr ""
103
 
104
+ #: classes/admin/class-admin.php:454
105
  msgid "Hotjar site ID"
106
  msgstr ""
107
 
108
+ #: classes/admin/class-admin.php:466
109
  msgid "Advanced"
110
  msgstr ""
111
 
112
+ #: classes/admin/class-admin.php:517
113
  msgid "Order Total Logic"
114
  msgstr ""
115
 
116
+ #: classes/admin/class-admin.php:529
117
  msgid "Order Duplication Prevention"
118
  msgstr ""
119
 
120
+ #: classes/admin/class-admin.php:541
121
  msgid "Maximum Compatibility Mode"
122
  msgstr ""
123
 
124
+ #: classes/admin/class-admin.php:574
125
+ msgid "gtag Deactivation"
126
  msgstr ""
127
 
128
+ #: classes/admin/class-admin.php:587
129
  msgid "Conversion Cart Data"
130
  msgstr ""
131
 
132
+ #: classes/admin/class-admin.php:600
133
  msgid "Enhanced E-Commerce"
134
  msgstr ""
135
 
136
+ #: classes/admin/class-admin.php:612
137
  msgid "GA 4 API secret"
138
  msgstr ""
139
 
140
+ #: classes/admin/class-admin.php:625
141
  msgid "Enhanced Link Attribution"
142
  msgstr ""
143
 
144
+ #: classes/admin/class-admin.php:638
145
  msgid "Google User ID"
146
  msgstr ""
147
 
148
+ #: classes/admin/class-admin.php:650
149
  msgid "Google Ads Enhanced Conversions"
150
  msgstr ""
151
 
152
+ #: classes/admin/class-admin.php:664
153
  msgid "Google Ads Phone Conversion Number"
154
  msgstr ""
155
 
156
+ #: classes/admin/class-admin.php:676
157
  msgid "Google Ads Phone Conversion Label"
158
  msgstr ""
159
 
160
+ #: classes/admin/class-admin.php:689
161
  msgid "Cookie Consent Management"
162
  msgstr ""
163
 
164
+ #: classes/admin/class-admin.php:712
165
  msgid "Google Consent Mode"
166
  msgstr ""
167
 
168
+ #: classes/admin/class-admin.php:724
169
  msgid "Google Consent Regions"
170
  msgstr ""
171
 
172
+ #: classes/admin/class-admin.php:736
173
  msgid "Explicit Consent Mode"
174
  msgstr ""
175
 
176
+ #: classes/admin/class-admin.php:749
177
  msgid "Borlabs Cookie support"
178
  msgstr ""
179
 
180
+ #: classes/admin/class-admin.php:763
181
  msgid "Cookiebot support"
182
  msgstr ""
183
 
184
+ #: classes/admin/class-admin.php:777
185
  msgid "Complianz GDPR support"
186
  msgstr ""
187
 
188
+ #: classes/admin/class-admin.php:791
189
  msgid "Cookie Notice support"
190
  msgstr ""
191
 
192
+ #: classes/admin/class-admin.php:805
193
  msgid "Cookie Script support"
194
  msgstr ""
195
 
196
+ #: classes/admin/class-admin.php:819
197
  msgid "GDPR Cookie Compliance support"
198
  msgstr ""
199
 
200
+ #: classes/admin/class-admin.php:833
201
  msgid "GDPR Cookie Consent support"
202
  msgstr ""
203
 
204
+ #: classes/admin/class-admin.php:866
205
+ msgid "Facebook CAPI: token"
206
  msgstr ""
207
 
208
+ #: classes/admin/class-admin.php:878
209
+ msgid "Facebook CAPI: process anonymous hits"
210
  msgstr ""
211
 
212
+ #: classes/admin/class-admin.php:890
213
+ msgid "Facebook CAPI: send additional visitor identifiers"
214
  msgstr ""
215
 
216
+ #: classes/admin/class-admin.php:902
217
+ msgid "Facebook Microdata Tags for Catalogues"
218
  msgstr ""
219
 
220
+ #: classes/admin/class-admin.php:914
221
+ #: classes/admin/class-admin.php:927
222
+ #: classes/admin/class-admin.php:974
223
  msgid "Dynamic Remarketing"
224
  msgstr ""
225
 
226
+ #: classes/admin/class-admin.php:986
227
  msgid "Product Identifier"
228
  msgstr ""
229
 
230
+ #: classes/admin/class-admin.php:998
231
  msgid "Variations output"
232
  msgstr ""
233
 
234
+ #: classes/admin/class-admin.php:1011
235
  msgid "Google Business Vertical"
236
  msgstr ""
237
 
 
238
  #: classes/admin/class-admin.php:1024
239
+ #: classes/admin/class-admin.php:1033
240
  msgid "Support"
241
  msgstr ""
242
 
243
+ #: classes/admin/class-admin.php:1041
244
+ #: classes/admin/class-admin.php:1051
245
  msgid "Author"
246
  msgstr ""
247
 
248
+ #: classes/admin/class-admin.php:1087
249
  msgid ""
250
  "It looks like you are using some sort of ad or script blocker which is blocking the script and CSS files of this plugin.\n"
251
  " In order for the plugin to work properly you need to disable the script blocker."
252
  msgstr ""
253
 
254
+ #: classes/admin/class-admin.php:1094
255
  #: classes/admin/class-notifications.php:31
256
  #: classes/admin/class-notifications.php:73
257
  #: classes/admin/class-notifications.php:114
259
  msgid "Learn more"
260
  msgstr ""
261
 
262
+ #: classes/admin/class-admin.php:1139
263
  msgid "Profit Driven Marketing by SweetCode"
264
  msgstr ""
265
 
266
+ #: classes/admin/class-admin.php:1164
267
  msgid "Visit us here:"
268
  msgstr ""
269
 
270
+ #: classes/admin/class-admin.php:1209
271
  msgid "Contacting Support"
272
  msgstr ""
273
 
274
+ #: classes/admin/class-admin.php:1223
275
  msgid "Debug Information"
276
  msgstr ""
277
 
278
+ #: classes/admin/class-admin.php:1232
279
  msgid "copy to clipboard"
280
  msgstr ""
281
 
282
+ #: classes/admin/class-admin.php:1246
283
  msgid "Translations"
284
  msgstr ""
285
 
286
+ #: classes/admin/class-admin.php:1247
287
  msgid "If you want to participate improving the translations of this plugin into your language, please follow this link:"
288
  msgstr ""
289
 
290
+ #: classes/admin/class-admin.php:1265
291
  msgid "Post a support request in the WordPress support forum here: "
292
  msgstr ""
293
 
294
+ #: classes/admin/class-admin.php:1268
295
  msgid "Support forum"
296
  msgstr ""
297
 
298
+ #: classes/admin/class-admin.php:1272
299
  msgid "(Never post the debug or other sensitive information to the support forum. Instead send us the information by email.)"
300
  msgstr ""
301
 
302
+ #: classes/admin/class-admin.php:1275
303
  msgid "Or send us an email to the following address: "
304
  msgstr ""
305
 
306
+ #: classes/admin/class-admin.php:1291
307
  msgid "Send us your support request through the WooCommerce.com dashboard: "
308
  msgstr ""
309
 
310
+ #: classes/admin/class-admin.php:1305
311
  msgid "More details about the developer of this plugin: "
312
  msgstr ""
313
 
314
+ #: classes/admin/class-admin.php:1308
315
  msgid "Developer: SweetCode"
316
  msgstr ""
317
 
318
+ #: classes/admin/class-admin.php:1310
319
  msgid "Website: "
320
  msgstr ""
321
 
322
+ #: classes/admin/class-admin.php:1333
323
  msgid "The Google Analytics Universal property ID looks like this:"
324
  msgstr ""
325
 
326
+ #: classes/admin/class-admin.php:1349
327
  msgid "The Google Analytics 4 measurement ID looks like this:"
328
  msgstr ""
329
 
330
+ #: classes/admin/class-admin.php:1365
331
  msgid "The conversion ID looks similar to this:"
332
  msgstr ""
333
 
334
+ #: classes/admin/class-admin.php:1381
335
  msgid "The purchase conversion label looks similar to this:"
336
  msgstr ""
337
 
338
+ #: classes/admin/class-admin.php:1385
339
+ #: classes/admin/class-admin.php:2137
340
  msgid "Requires an active Google Ads Conversion ID"
341
  msgstr ""
342
 
343
+ #: classes/admin/class-admin.php:1403
344
  msgid "The Google Optimize container ID looks like this:"
345
  msgstr ""
346
 
347
+ #: classes/admin/class-admin.php:1419
348
+ msgid "The Facebook pixel ID looks similar to this:"
349
  msgstr ""
350
 
351
+ #: classes/admin/class-admin.php:1437
352
  msgid "The Microsoft Advertising UET tag ID looks similar to this:"
353
  msgstr ""
354
 
355
+ #: classes/admin/class-admin.php:1456
356
  msgid "The Twitter pixel ID looks similar to this:"
357
  msgstr ""
358
 
359
+ #: classes/admin/class-admin.php:1475
360
  msgid "The Pinterest pixel ID looks similar to this:"
361
  msgstr ""
362
 
363
+ #: classes/admin/class-admin.php:1494
364
  msgid "The Snapchat pixel ID looks similar to this:"
365
  msgstr ""
366
 
367
+ #: classes/admin/class-admin.php:1513
368
  msgid "The TikTok pixel ID looks similar to this:"
369
  msgstr ""
370
 
371
+ #: classes/admin/class-admin.php:1525
372
  msgid "The Hotjar site ID looks similar to this:"
373
  msgstr ""
374
 
375
+ #: classes/admin/class-admin.php:1535
376
  msgid "Use order_subtotal: Doesn't include tax and shipping (default)"
377
  msgstr ""
378
 
379
+ #: classes/admin/class-admin.php:1542
380
  msgid "Use order_total: Includes tax and shipping"
381
  msgstr ""
382
 
383
+ #: classes/admin/class-admin.php:1545
384
  msgid "This is the order total amount reported back to Google Ads"
385
  msgstr ""
386
 
387
+ #: classes/admin/class-admin.php:1565
388
  msgid "open the documentation"
389
  msgstr ""
390
 
391
+ #: classes/admin/class-admin.php:1581
392
+ msgid "Disable gtag.js insertion, if another plugin is inserting it already"
393
+ msgstr ""
394
+
395
+ #: classes/admin/class-admin.php:1587
396
+ msgid "Only do this, if the other plugin does insert the gtag above this pixel. If not, keep the gtag active."
397
+ msgstr ""
398
+
399
+ #: classes/admin/class-admin.php:1591
400
+ msgid "This setting is deprecated. It will be removed in future versions of the plugin. Read more about it in the documentation."
401
+ msgstr ""
402
+
403
+ #: classes/admin/class-admin.php:1609
404
  msgid "Enable Google consent mode with standard settings"
405
  msgstr ""
406
 
407
+ #: classes/admin/class-admin.php:1647
408
  msgid "If no region is set, then the restrictions are enabled for all regions. If you specify one or more regions, then the restrictions only apply for the specified regions."
409
  msgstr ""
410
 
411
+ #: classes/admin/class-admin.php:1668
412
  msgid "Enable Google Analytics enhanced e-commerce"
413
  msgstr ""
414
 
415
+ #: classes/admin/class-admin.php:1679
416
+ #: classes/admin/class-admin.php:1740
417
+ #: classes/admin/class-admin.php:1770
418
  msgid "You need to activate at least Google Analytics UA or Google Analytics 4"
419
  msgstr ""
420
 
421
+ #: classes/admin/class-admin.php:1701
422
  msgid "Google Analytics 4 activation required"
423
  msgstr ""
424
 
425
+ #: classes/admin/class-admin.php:1706
426
  msgid "Enhanced E-Commerce activation required"
427
  msgstr ""
428
 
429
+ #: classes/admin/class-admin.php:1709
430
  msgid "If enabled, purchase and refund events will be sent to Google through the measurement protocol for increased accuracy."
431
  msgstr ""
432
 
433
+ #: classes/admin/class-admin.php:1724
434
  msgid "Enable Google Analytics enhanced link attribution"
435
  msgstr ""
436
 
437
+ #: classes/admin/class-admin.php:1759
438
  msgid "Enable Google user ID"
439
  msgstr ""
440
 
441
+ #: classes/admin/class-admin.php:1789
442
  msgid "Enable Google Ads Enhanced Conversions"
443
  msgstr ""
444
 
445
+ #: classes/admin/class-admin.php:1800
446
  msgid "You need to activate Google Ads"
447
  msgstr ""
448
 
449
+ #: classes/admin/class-admin.php:1820
450
  msgid "The Google Ads phone conversion number must be in the same format as on the website."
451
  msgstr ""
452
 
453
+ #: classes/admin/class-admin.php:1842
454
  msgid "Borlabs Cookie detected. Automatic support is:"
455
  msgstr ""
456
 
457
+ #: classes/admin/class-admin.php:1848
458
  msgid "Cookiebot detected. Automatic support is:"
459
  msgstr ""
460
 
461
+ #: classes/admin/class-admin.php:1854
462
  msgid "Complianz GDPR detected. Automatic support is:"
463
  msgstr ""
464
 
465
+ #: classes/admin/class-admin.php:1860
466
  msgid "Cookie Notice (by hu-manity.co) detected. Automatic support is:"
467
  msgstr ""
468
 
469
+ #: classes/admin/class-admin.php:1866
470
  msgid "Cookie Script (by cookie-script.com) detected. Automatic support is:"
471
  msgstr ""
472
 
473
+ #: classes/admin/class-admin.php:1872
474
  msgid "GDPR Cookie Compliance (by Moove Agency) detected. Automatic support is:"
475
  msgstr ""
476
 
477
+ #: classes/admin/class-admin.php:1878
478
  msgid "GDPR Cookie Consent (by WebToffee) detected. Automatic support is:"
479
  msgstr ""
480
 
481
+ #: classes/admin/class-admin.php:1897
482
  msgid "Enable Explicit Consent Mode"
483
  msgstr ""
484
 
485
+ #: classes/admin/class-admin.php:1906
486
  msgid "Only activate the Explicit Consent Mode if you are also using a Cookie Management Platform (a cookie banner) that is compatible with this plugin. Find a list of compatible plugins in the documentation."
487
  msgstr ""
488
 
 
489
  #: classes/admin/class-admin.php:1925
490
+ #: classes/admin/class-admin.php:1958
491
+ #: classes/admin/class-admin.php:1987
492
+ #: classes/admin/class-admin.php:2015
493
+ msgid "You need to activate the Facebook pixel"
494
  msgstr ""
495
 
496
+ #: classes/admin/class-admin.php:1949
497
+ msgid "Send CAPI hits for anonymous visitors who likely have blocked the Facebook pixel."
498
  msgstr ""
499
 
500
+ #: classes/admin/class-admin.php:1978
501
  msgid "Include additional visitor's identifiers, such as IP address, email and shop ID in the CAPI hit."
502
  msgstr ""
503
 
504
+ #: classes/admin/class-admin.php:2006
505
+ msgid "Enable Facebook product microdata output"
506
+ msgstr ""
507
+
508
+ #: classes/admin/class-admin.php:2031
509
+ msgid "Add the cart data to the conversion event"
510
+ msgstr ""
511
+
512
+ #: classes/admin/class-admin.php:2040
513
+ msgid "Requires an active Google Ads Conversion ID, an active Conversion Label and an active Google Merchant Center ID (aw_merchant_id)"
514
  msgstr ""
515
 
516
+ #: classes/admin/class-admin.php:2069
517
  msgid "Only disable order duplication prevention for testing. Remember to re-enable the setting once done."
518
  msgstr ""
519
 
520
+ #: classes/admin/class-admin.php:2086
521
  msgid "Enable the maximum compatibility mode"
522
  msgstr ""
523
 
524
+ #: classes/admin/class-admin.php:2096
525
  msgid "Advanced order duplication prevention is "
526
  msgstr ""
527
 
528
+ #: classes/admin/class-admin.php:2098
529
  msgid "Basic order duplication prevention is "
530
  msgstr ""
531
 
532
+ #: classes/admin/class-admin.php:2122
533
  msgid "Enable dynamic remarketing audience collection"
534
  msgstr ""
535
 
536
+ #: classes/admin/class-admin.php:2143
537
  msgid "You need to choose the correct product identifier setting in order to match the product identifiers in the product feeds."
538
  msgstr ""
539
 
540
+ #: classes/admin/class-admin.php:2161
541
  msgid "Enable variations output"
542
  msgstr ""
543
 
544
+ #: classes/admin/class-admin.php:2172
545
  msgid "In order for this to work you need to upload your product feed including product variations and the item_group_id. Disable it, if you choose only to upload the parent product for variable products."
546
  msgstr ""
547
 
548
+ #: classes/admin/class-admin.php:2187
549
  msgid "Retail"
550
  msgstr ""
551
 
552
+ #: classes/admin/class-admin.php:2197
553
  msgid "Education"
554
  msgstr ""
555
 
556
+ #: classes/admin/class-admin.php:2207
557
  msgid "Hotels and rentals"
558
  msgstr ""
559
 
560
+ #: classes/admin/class-admin.php:2217
561
  msgid "Jobs"
562
  msgstr ""
563
 
564
+ #: classes/admin/class-admin.php:2227
565
  msgid "Local deals"
566
  msgstr ""
567
 
568
+ #: classes/admin/class-admin.php:2237
569
  msgid "Real estate"
570
  msgstr ""
571
 
572
+ #: classes/admin/class-admin.php:2247
573
  msgid "Custom"
574
  msgstr ""
575
 
576
+ #: classes/admin/class-admin.php:2266
577
  msgid "ID of your Google Merchant Center account. It looks like this: 12345678"
578
  msgstr ""
579
 
580
+ #: classes/admin/class-admin.php:2274
581
+ msgid "Currently the plugin automatically detects the location of the visitor for this setting. In most, if not all, cases this will work fine. Please let us know if you have a use case where you need another output:"
582
+ msgstr ""
583
+
584
+ #: classes/admin/class-admin.php:2312
585
+ msgid "The plugin will use the WordPress default language for this setting. If the shop uses translations, in theory we could also use the visitors locale. But, if that language is not set up in the Google Merchant Center we might run into issues. If you need more options here let us know:"
586
+ msgstr ""
587
+
588
+ #: classes/admin/class-admin.php:2330
589
  msgid "post ID (default)"
590
  msgstr ""
591
 
592
+ #: classes/admin/class-admin.php:2336
593
  msgid "SKU"
594
  msgstr ""
595
 
596
+ #: classes/admin/class-admin.php:2343
597
  msgid "ID for the WooCommerce Google Product Feed. Outputs the post ID with woocommerce_gpf_ prefix *"
598
  msgstr ""
599
 
600
+ #: classes/admin/class-admin.php:2350
601
  msgid "ID for the WooCommerce Google Listings & Ads Plugin. Outputs the post ID with gla_ prefix **"
602
  msgstr ""
603
 
604
+ #: classes/admin/class-admin.php:2354
605
  msgid "Choose a product identifier."
606
  msgstr ""
607
 
608
+ #: classes/admin/class-admin.php:2357
609
  msgid "* This is for users of the WooCommerce Google Product Feed Plugin"
610
  msgstr ""
611
 
612
+ #: classes/admin/class-admin.php:2361
613
  msgid "** This is for users of the WooCommerce Google Listings & Ads Plugin"
614
  msgstr ""
615
 
616
+ #: classes/admin/class-admin.php:2370
617
  msgid "beta"
618
  msgstr ""
619
 
620
+ #: classes/admin/class-admin.php:2374
621
+ #: classes/admin/class-admin.php:2379
622
  msgid "active"
623
  msgstr ""
624
 
625
+ #: classes/admin/class-admin.php:2384
626
+ #: classes/admin/class-admin.php:2389
627
  msgid "inactive"
628
  msgstr ""
629
 
630
+ #: classes/admin/class-admin.php:2394
631
+ #: classes/admin/class-admin.php:2399
632
  msgid "partially active"
633
  msgstr ""
634
 
635
+ #: classes/admin/class-admin.php:2410
636
  msgid "Pro Feature"
637
  msgstr ""
638
 
639
+ #: classes/admin/class-admin.php:2454
640
  msgid "You have entered an invalid Google Analytics Universal property ID."
641
  msgstr ""
642
 
643
+ #: classes/admin/class-admin.php:2462
644
  msgid "You have entered an invalid Google Analytics 4 measurement ID."
645
  msgstr ""
646
 
647
+ #: classes/admin/class-admin.php:2470
648
  msgid "You have entered an invalid Google Analytics 4 API key."
649
  msgstr ""
650
 
651
+ #: classes/admin/class-admin.php:2478
652
  msgid "You have entered an invalid conversion ID. It only contains 8 to 10 digits."
653
  msgstr ""
654
 
655
+ #: classes/admin/class-admin.php:2486
656
+ #: classes/admin/class-admin.php:2494
657
  msgid "You have entered an invalid conversion label."
658
  msgstr ""
659
 
660
+ #: classes/admin/class-admin.php:2502
661
  msgid "You have entered an invalid merchant ID. It only contains 7 to 10 digits."
662
  msgstr ""
663
 
664
+ #: classes/admin/class-admin.php:2510
665
  msgid "You have entered an invalid Google Optimize container ID."
666
  msgstr ""
667
 
668
+ #: classes/admin/class-admin.php:2518
669
+ msgid "You have entered an invalid Facebook pixel ID. It only contains 14 to 16 digits."
670
  msgstr ""
671
 
672
+ #: classes/admin/class-admin.php:2526
673
+ msgid "You have entered an invalid Facebook CAPI token."
674
  msgstr ""
675
 
676
+ #: classes/admin/class-admin.php:2534
677
  msgid "You have entered an invalid Bing Ads UET tag ID. It only contains 7 to 9 digits."
678
  msgstr ""
679
 
680
+ #: classes/admin/class-admin.php:2542
681
  msgid "You have entered an invalid Twitter pixel ID. It only contains 5 to 7 lowercase letters and numbers."
682
  msgstr ""
683
 
684
+ #: classes/admin/class-admin.php:2550
685
  msgid "You have entered an invalid Pinterest pixel ID. It only contains 13 digits."
686
  msgstr ""
687
 
688
+ #: classes/admin/class-admin.php:2558
689
  msgid "You have entered an invalid Snapchat pixel ID."
690
  msgstr ""
691
 
692
+ #: classes/admin/class-admin.php:2566
693
  msgid "You have entered an invalid TikTok pixel ID."
694
  msgstr ""
695
 
696
+ #: classes/admin/class-admin.php:2574
697
  msgid "You have entered an invalid Hotjar site ID. It only contains 6 to 9 digits."
698
  msgstr ""
699
 
790
  msgid "Find more information about the the reason in our documentation: "
791
  msgstr ""
792
 
793
+ #: wgact.php:220
794
  msgid "WooCommerce Pixel Manager error"
795
  msgstr ""
796
 
797
+ #: wgact.php:222
798
  msgid "Your environment doesn't meet all the system requirements listed below."
799
  msgstr ""
800
 
801
+ #: wgact.php:226
802
  msgid "The WooCommerce plugin needs to be activated"
803
  msgstr ""
readme.txt CHANGED
@@ -1,20 +1,20 @@
1
  === WooCommerce Pixel Manager ===
2
  Contributors: alekv, wolfbaer
3
- Tags: woocommerce, google ads, google analytics, facebook pixel, conversion tracking, dynamic retargeting, remarketing, meta pixel, facebook conversion api, woocommerce google, woocommerce facebook
4
  Requires at least: 3.7
5
  Tested up to: 5.9
6
  Requires PHP: 7.3
7
- Stable tag: 1.16.6
8
  License: GPLv3 or later
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
10
 
11
- Track visitors and conversions in Google Ads, Google Analytics, Meta Pixel (Facebook Pixel), and more !
12
 
13
  == Description ==
14
 
15
  This plugin <strong>tracks WooCommerce shop visitors and collects valuable data for conversion optimization, dynamic remarketing and reporting</strong>.
16
 
17
- While the setup is as simple as it can get, the pixel engine under the hood is very powerful. It tracks all e-commerce events and implements all advanced pixel features like Meta CAPI (Facebook CAPI) (Pro version), Google Enhanced E-Commerce, Google Shopping Cart Item Tracking and much more. For advanced users the plugin offers filters which allow to tweak the output flexibly and fine tune the behavior to each shop.
18
  <strong>What sets us apart from other, similar plugins?</strong>
19
 
20
  Out of many things, probably high tracking accuracy and a simple user interface are the most important properties that set our plugin apart from others.
@@ -25,24 +25,24 @@ Read more about the importance of tracking accuracy over [here](https://sweetcod
25
 
26
  <strong>The plugin comes with integrations for:</strong>
27
 
28
- * Google Ads Pixel
29
- * Google Analytics Pixel (Universal and Google Analytics 4)
30
- * Meta Ads Pixel (Facebook Ads Pixel)
31
- * Google Optimize Pixel
32
- * HotJar Pixel
33
- * Microsoft Ads Pixel (Pro version)
34
- * Twitter Ads Pixel (Pro version)
35
- * Pinterest Ads Pixel (Pro version)
36
- * Snapchat Ads Pixel (Pro version)
37
- * TikTok Ads Pixel (Pro version)
38
 
39
  <strong>Highlights</strong>
40
 
41
  * Google Ads Enhanced Conversions (Pro version)
42
- * Meta Conversion API (Facebook Conversion API) (Pro version)
43
  * Google Analytics Enhanced E-Commerce (Pro version)
44
  * Precise measurement by preventing duplicate reporting effectively, excluding admins and shop managers from tracking, and not counting failed payments.
45
- * Collects dynamic remarketing audiences for dynamic retargeting (Google Ads, Meta (Facebook), etc.)
46
  * Google Add Cart Data feature. [Google support page](https://support.google.com/google-ads/answer/9028254)
47
  * Support for various cookie consent management systems
48
 
@@ -52,11 +52,11 @@ Read more about the importance of tracking accuracy over [here](https://sweetcod
52
  * Google Ads Dynamic Remarketing
53
  * Google Ads Cart Item Tracking
54
  * Google Shopping New Customer Parameter
55
- * Google Analytics Universal Pixel (includes purchase tracking)
56
- * Google Analytics 4 Pixel (includes purchase tracking)
57
- * Google Optimize Pixel
58
- * Meta Pixel (Facebook Pixel)
59
- * Meta Remarketing Events (Facebook Remarketing Events)
60
  * Hotjar Pixel
61
  * Basic Order Duplication Prevention
62
  * Many useful filters that help tweak the plugin output
@@ -66,8 +66,8 @@ Have a look at the full feature list over [here](https://sweetcode.com/docs/wpm/
66
 
67
  <strong>Premium Features</strong>
68
 
69
- * Meta CAPI (Facebook CAPI)
70
- * Meta Microdata Output (Facebook Microdata Output)
71
  * Google Analytics Universal and Google Analytics 4 Enhanced E-Commerce
72
  * Google Consent Mode
73
  * Google Dynamic Remarketing Choice for all Business Verticals
@@ -110,18 +110,12 @@ The plugin uses data from several Cookie Consent Management plugins to manage ap
110
 
111
  It works with the following Cookie Consent Management plugins out of the box:
112
 
113
- * [Cookiebot](https://wordpress.org/plugins/cookiebot/)
114
- * [Cookie Script](https://wordpress.org/plugins/cookie-script-com/)
115
- * [Complianz GDPR/CCPA Cookie Consent](https://wordpress.org/plugins/complianz-gdpr/)
116
  * [Cookie Notice](https://wordpress.org/plugins/cookie-notice/)
117
- * [Cookie Notice & Compliance for GDPR / CCPA](https://wordpress.org/plugins/cookie-notice/)
118
  * [Cookie Law Info](https://wordpress.org/plugins/cookie-law-info/)
119
  * [GDPR Cookie Compliance](https://wordpress.org/plugins/gdpr-cookie-compliance/)
120
  * [Borlabs Cookie](https://borlabs.io/borlabs-cookie/) (from version 2.1.0)
121
  [Borlabs Cookie Setup](https://sweetcode.com/docs/wpm/consent-management/borlabs-cookie?utm_source=wordpress.org&utm_medium=wpm-plugin-page&utm_campaign=woocommerce-pixel-manager-docs&utm_content=borlabs-cookie)
122
 
123
- Please read the following for additional [setup information](https://sweetcode.com/docs/wpm/consent-management/platforms?utm_source=wordpress.org&utm_medium=wpm-plugin-page&utm_campaign=woocommerce-pixel-manager-docs&utm_content=cookie-consent-plugins)
124
-
125
  <strong>Requirements</strong>
126
 
127
  [List of requirements](https://sweetcode.com/docs/wpm/setup/requirements?utm_source=wordpress.org&utm_medium=wpm-plugin-page&utm_campaign=woocommerce-pixel-manager-docs&utm_content=requirements)
@@ -186,72 +180,6 @@ You can send the link to the front page of your shop too if you think it would b
186
 
187
  == Changelog ==
188
 
189
- = 1.16.6 = 11.04.2022
190
-
191
- * Tweak: Safeguard for JavaScript optimizers that ignore the jQuery dependency of WPM and load jQuery after WPM
192
- * Tweak: Refactored the WPM JavaScript library (split code logically and into folders)
193
-
194
- = 1.16.5 = 08.04.2022
195
-
196
- * Tweak: More verbose logging of WPM load and pixel consent status into the dev console
197
- * Tweak: Added new logic to retrieve categories for variations
198
-
199
- = 1.16.4 = 07.04.2022
200
-
201
- * Fix: Fixed a bug that prevented disabling user role tracking
202
-
203
- = 1.16.3 = 07.04.2022
204
-
205
- * Tweak: Remove the IPv6 to IPv4 mapping in case the the external user IP contains one
206
- * Tweak: Improved local IP detection
207
- * Tweak: Replaced deprecated FILTER_SANITIZE_STRING filter with FILTER_SANITIZE_FULL_SPECIAL_CHARS
208
-
209
- = 1.16.2 = 05.04.2022
210
-
211
-
212
- * Fix: Improved detection of users that are deactivated for tracking
213
-
214
- = 1.16.1 = 05.04.2022
215
-
216
- * Tweak: Removed data-cfasync=”false” to allow Cloudflare Rocket Loader to optimize scripts
217
- * Tweak: Removed unused functions
218
- * Tweak: Refactored some code and removed cruft
219
- * Tweak: Improved logic of when to load cart items into the wpm dataLayer
220
- * Tweak: For users, who have been disabled for tracking, prevent tracking entirely, not just for purchase events
221
- * Tweak: Renamed Facebook to Meta
222
- * Tweak: Add log entry when a purchase hit has been prevented because of a user role that has been opted out from tracking
223
-
224
- = 1.16.0 = 01.04.2022
225
-
226
-
227
- * Tweak: Removed a few deprecated and inactive settings
228
- * Tweak: Updated Enhanced Conversions output as per updated specs by Google
229
- * Tweak: Improved formatting for Facebook CAPI event parameters
230
-
231
- = 1.15.5 = 30.03.2022
232
-
233
- * Tweak: Removed an obsolete db cleanup function
234
- * Tweak: On variable products, with no preselection send the valid variation ID if variations output is enabled
235
- * Tweak: Added safeguard for debug info when URL redirect test fails to open the URL
236
- * Tweak: Syntax improvements in wpm.addProductToCart()
237
- * Tweak: Simplified logic when the wpm.getCartItems() function is called
238
- * Tweak: Deprecated the wpm_track_mini_cart filter
239
- * Tweak: Added cookie detection for Cookie Law CMP with French named cookies
240
- * Tweak: Added one more safeguard in case the main wpmDataLayer init is being blocked by some third party plugin and products need being loaded into the wpmDataLayer further down below
241
- * Tweak: Added console log output when pixels don't fire because of user consent choice
242
- * Tweak: Added a payload logger for Facebook CAPI events
243
- * Tweak: Initiate WC session later in the checkout funnel (if necessary at all) to improve caching conditions
244
- * Tweak: Added URL parameter debugConsentMode for verbose debug output in the browser console in relation to user cookie consent
245
-
246
- = 1.15.4 = 23.03.2022
247
-
248
- * Fix: Product name transmission for Google Analytics Universal purchases
249
-
250
- = 1.15.3 = 22.03.2022
251
-
252
- * Tweak: Attach click handlers later during loading in order to better deal with some side cases
253
- * Tweak: Fire viewItem event on variable product pages when no variation is selected yet, sending the ID of the parent product
254
-
255
  = 1.15.2 = 21.03.2022
256
 
257
  * Tweak: Silenced status icon on compatibility mode setting when disabled
1
  === WooCommerce Pixel Manager ===
2
  Contributors: alekv, wolfbaer
3
+ Tags: woocommerce, google ads, google analytics, facebook pixel, conversion tracking, dynamic retargeting, remarketing, pixel, facebook conversion api, woocommerce google, woocommerce facebook
4
  Requires at least: 3.7
5
  Tested up to: 5.9
6
  Requires PHP: 7.3
7
+ Stable tag: 1.15.2
8
  License: GPLv3 or later
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
10
 
11
+ Track visitors and conversions in Google Ads, Google Analytics, Facebook Pixel (Conversion API) and more !
12
 
13
  == Description ==
14
 
15
  This plugin <strong>tracks WooCommerce shop visitors and collects valuable data for conversion optimization, dynamic remarketing and reporting</strong>.
16
 
17
+ While the setup is as simple as it can get, the pixel engine under the hood is very powerful. It tracks all e-commerce events and implements all advanced pixel features like Facebook CAPI (Pro version), Google Enhanced E-Commerce, Google Shopping Cart Item Tracking and much more. For advanced users the plugin offers filters which allow to tweak the output flexibly and fine tune the behavior to each shop.
18
  <strong>What sets us apart from other, similar plugins?</strong>
19
 
20
  Out of many things, probably high tracking accuracy and a simple user interface are the most important properties that set our plugin apart from others.
25
 
26
  <strong>The plugin comes with integrations for:</strong>
27
 
28
+ * Google Ads
29
+ * Google Analytics (Universal and Google Analytics 4)
30
+ * Facebook Ads Pixel (Meta Ads Pixel)
31
+ * Google Optimize
32
+ * HotJar
33
+ * Microsoft Ads (Pro version)
34
+ * Twitter Ads (Pro version)
35
+ * Pinterest Ads (Pro version)
36
+ * Snapchat Ads (Pro version)
37
+ * TikTok Ads (Pro version)
38
 
39
  <strong>Highlights</strong>
40
 
41
  * Google Ads Enhanced Conversions (Pro version)
42
+ * Facebook Conversion API (CAPI) (Pro version)
43
  * Google Analytics Enhanced E-Commerce (Pro version)
44
  * Precise measurement by preventing duplicate reporting effectively, excluding admins and shop managers from tracking, and not counting failed payments.
45
+ * Collects dynamic remarketing audiences for dynamic retargeting (Google Ads, Facebook, etc.)
46
  * Google Add Cart Data feature. [Google support page](https://support.google.com/google-ads/answer/9028254)
47
  * Support for various cookie consent management systems
48
 
52
  * Google Ads Dynamic Remarketing
53
  * Google Ads Cart Item Tracking
54
  * Google Shopping New Customer Parameter
55
+ * Google Analytics Universal (includes purchase tracking)
56
+ * Google Analytics 4 (includes purchase tracking)
57
+ * Google Optimize
58
+ * Facebook Pixel (Meta Pixel)
59
+ * Facebook Remarketing Events (Meta Remarketing Events)
60
  * Hotjar Pixel
61
  * Basic Order Duplication Prevention
62
  * Many useful filters that help tweak the plugin output
66
 
67
  <strong>Premium Features</strong>
68
 
69
+ * Facebook CAPI (Meta CAPI)
70
+ * Facebook Microdata Output (Meta Microdata Output)
71
  * Google Analytics Universal and Google Analytics 4 Enhanced E-Commerce
72
  * Google Consent Mode
73
  * Google Dynamic Remarketing Choice for all Business Verticals
110
 
111
  It works with the following Cookie Consent Management plugins out of the box:
112
 
 
 
 
113
  * [Cookie Notice](https://wordpress.org/plugins/cookie-notice/)
 
114
  * [Cookie Law Info](https://wordpress.org/plugins/cookie-law-info/)
115
  * [GDPR Cookie Compliance](https://wordpress.org/plugins/gdpr-cookie-compliance/)
116
  * [Borlabs Cookie](https://borlabs.io/borlabs-cookie/) (from version 2.1.0)
117
  [Borlabs Cookie Setup](https://sweetcode.com/docs/wpm/consent-management/borlabs-cookie?utm_source=wordpress.org&utm_medium=wpm-plugin-page&utm_campaign=woocommerce-pixel-manager-docs&utm_content=borlabs-cookie)
118
 
 
 
119
  <strong>Requirements</strong>
120
 
121
  [List of requirements](https://sweetcode.com/docs/wpm/setup/requirements?utm_source=wordpress.org&utm_medium=wpm-plugin-page&utm_campaign=woocommerce-pixel-manager-docs&utm_content=requirements)
180
 
181
  == Changelog ==
182
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
183
  = 1.15.2 = 21.03.2022
184
 
185
  * Tweak: Silenced status icon on compatibility mode setting when disabled
vendor/freemius/wordpress-sdk/assets/img/plugin-icon.png CHANGED
Binary file
vendor/freemius/wordpress-sdk/assets/img/theme-icon.png CHANGED
Binary file
vendor/freemius/wordpress-sdk/assets/img/woocommerce-google-adwords-conversion-tracking-tag.png CHANGED
Binary file
wgact.php CHANGED
@@ -10,7 +10,7 @@
10
  * Developer URI: https://sweetcode.com
11
  * Text Domain: woocommerce-google-adwords-conversion-tracking-tag
12
  * Domain path: /languages
13
- * * Version: 1.16.6
14
  *
15
  * WC requires at least: 3.7
16
  * WC tested up to: 6.3
@@ -20,9 +20,11 @@
20
  *
21
  *
22
  **/
23
- const WPM_CURRENT_VERSION = '1.16.6' ;
24
  // TODO export settings function
25
  // TODO add option checkbox on uninstall and ask if user wants to delete options from db
 
 
26
 
27
  if ( !defined( 'ABSPATH' ) ) {
28
  exit;
@@ -149,8 +151,7 @@ if ( function_exists( 'wpm_fs' ) ) {
149
  $this->environment_check->flush_cache_on_plugin_changes();
150
  register_activation_hook( __FILE__, [ $this, 'plugin_activated' ] );
151
  register_deactivation_hook( __FILE__, [ $this, 'plugin_deactivated' ] );
152
- // $this->init();
153
- add_action( 'woocommerce_init', [ $this, 'init' ] );
154
  } else {
155
  add_action( 'admin_menu', [ $this, 'add_empty_admin_page' ], 99 );
156
  add_action( 'admin_notices', [ $this, 'requirements_error' ] );
@@ -251,8 +252,7 @@ if ( function_exists( 'wpm_fs' ) ) {
251
  }
252
 
253
  // inject pixels into front end
254
- // add_action('after_setup_theme', [$this, 'inject_pixels']);
255
- $this->inject_pixels();
256
  }
257
 
258
  public function inject_pixels()
@@ -298,6 +298,11 @@ if ( function_exists( 'wpm_fs' ) ) {
298
  $this->options = ( new Default_Options() )->get_default_options();
299
  } else {
300
  // Check if each single option has been set. If not, set them. That is necessary when new options are introduced.
 
 
 
 
 
301
  // add new default options to the options db array
302
  $this->options = ( new Default_Options() )->update_with_defaults( $this->options, ( new Default_Options() )->get_default_options() );
303
  }
10
  * Developer URI: https://sweetcode.com
11
  * Text Domain: woocommerce-google-adwords-conversion-tracking-tag
12
  * Domain path: /languages
13
+ * Version: 1.15.2
14
  *
15
  * WC requires at least: 3.7
16
  * WC tested up to: 6.3
20
  *
21
  *
22
  **/
23
+ const WPM_CURRENT_VERSION = '1.15.2' ;
24
  // TODO export settings function
25
  // TODO add option checkbox on uninstall and ask if user wants to delete options from db
26
+ // TODO ask inverse cookie approval. Only of cookies have been allowed, fire the pixels.
27
+ // TODO remove google_business_vertical cleanup
28
 
29
  if ( !defined( 'ABSPATH' ) ) {
30
  exit;
151
  $this->environment_check->flush_cache_on_plugin_changes();
152
  register_activation_hook( __FILE__, [ $this, 'plugin_activated' ] );
153
  register_deactivation_hook( __FILE__, [ $this, 'plugin_deactivated' ] );
154
+ $this->init();
 
155
  } else {
156
  add_action( 'admin_menu', [ $this, 'add_empty_admin_page' ], 99 );
157
  add_action( 'admin_notices', [ $this, 'requirements_error' ] );
252
  }
253
 
254
  // inject pixels into front end
255
+ add_action( 'after_setup_theme', [ $this, 'inject_pixels' ] );
 
256
  }
257
 
258
  public function inject_pixels()
298
  $this->options = ( new Default_Options() )->get_default_options();
299
  } else {
300
  // Check if each single option has been set. If not, set them. That is necessary when new options are introduced.
301
+ // cleanup the db of this setting
302
+ // remove by end of 2021 latest
303
+ if ( array_key_exists( 'google_business_vertical', $this->options ) ) {
304
+ unset( $this->options['google_business_vertical'] );
305
+ }
306
  // add new default options to the options db array
307
  $this->options = ( new Default_Options() )->update_with_defaults( $this->options, ( new Default_Options() )->get_default_options() );
308
  }