Enhanced Ecommerce Google Analytics Plugin for WooCommerce - Version 3.0.2

Version Description

  • 17/03/2021 =
    • Product sync feature enhancement - Users can now map upto 25 product attributes which will help them opt for enhanced listing in Google search/Shopping
    • Auto check on the attributes like id, product title, product description, product link, image link, offer id, price, target country, content language, google merchant center category, sale price, availability, color, size, item_group_id. User does not need to worry about these attributes, the plugin will manage it in the back end when you opt for product syncing
    • Variable products are fully supported for 4 attributes - color, size, gender, age group.
    • Auto fetch of variable products data while syncing products into merchant center account
    • In case the domain claim fails, user can now manually claim website from plugin's interface by visiting Google Shopping tab
    • Some users raised a undefined index notice in version 3.0.1 that is resolved in this version.
Download this release

Release Info

Developer Tatvic
Plugin Icon 128x128 Enhanced Ecommerce Google Analytics Plugin for WooCommerce
Version 3.0.2
Comparing to
See all releases

Code changes from version 3.0.1 to 3.0.2

Files changed (49) hide show
  1. admin/class-enhanced-ecommerce-google-analytics-admin.php +2 -3
  2. admin/class-tvc-admin-helper.php +126 -16
  3. {includes/setup → admin}/css/custom-style.css +0 -0
  4. admin/css/enhanced-ecommerce-google-analytics-admin.css +46 -0
  5. admin/css/style.css +0 -11
  6. {images → admin/images}/ajax-loader.gif +0 -0
  7. admin/js/enhanced-ecommerce-google-analytics-admin.js +0 -42
  8. admin/js/sweetalert.min.js +0 -1
  9. admin/partials/enhanced-ecommerce-google-analytics-admin-display.php +1 -1
  10. admin/partials/general-fields.php +3 -6
  11. enhanced-ecommerce-google-analytics.php +2 -2
  12. includes/application/class-tvc-feed-controller.php +0 -208
  13. includes/application/class-tvc-feed-support.php +0 -301
  14. includes/application/google/gmc.txt +0 -23
  15. includes/application/google/gmc_attrbutes.json +0 -118
  16. includes/application/google/google.txt +0 -84
  17. includes/application/google/taxonomy.en-US.txt +0 -5583
  18. includes/application/google/tvc_google-source.js +0 -292
  19. includes/application/js/tvc_channel-functions.js +0 -707
  20. includes/application/js/tvc_channel-functions.min.js +0 -498
  21. includes/application/js/tvc_feedhandling.js +0 -144
  22. includes/application/js/tvc_feedhandling.min.js +0 -85
  23. includes/application/js/tvc_general-functions.js +0 -102
  24. includes/application/js/tvc_general-functions.min.js +0 -1
  25. includes/application/js/tvc_logic.js +0 -454
  26. includes/application/js/tvc_logic.min.js +0 -343
  27. includes/application/js/tvc_object-attribute-meta.js +0 -66
  28. includes/application/js/tvc_object-attribute-meta.min.js +0 -1
  29. includes/application/js/tvc_object-feed.js +0 -849
  30. includes/application/js/tvc_object-feed.min.js +0 -1
  31. includes/class-enhanced-ecommerce-google-analytics.php +6 -50
  32. includes/class-tvc-register-scripts.php +5 -128
  33. includes/data/class-tvc-ajax-file.php +1104 -1005
  34. includes/data/class-tvc-queries.php +3 -1
  35. includes/data/class-tvc-taxonomies.php +1 -1
  36. includes/data/js/tvc_data.js +0 -105
  37. includes/data/js/tvc_data.min.js +0 -1
  38. includes/data/js/tvc_feed-queue-string.js +0 -30
  39. includes/data/js/tvc_feed-queue-string.min.js +0 -1
  40. includes/data/js/tvc_metadatahandling.js +0 -596
  41. includes/data/js/tvc_metadatahandling.min.js +0 -1
  42. includes/libraries/tvc-async-request.php +0 -187
  43. includes/setup/add-campaign.php +1 -1
  44. includes/setup/google-shopping-feed-gaa-config.php +59 -18
  45. includes/setup/google-shopping-feed-shopping-campaigns.php +1 -1
  46. includes/setup/google-shopping-feed-sync-product.php +60 -19
  47. includes/setup/google-shopping-feed.php +54 -4
  48. includes/setup/help-html.php +4 -7
  49. includes/setup/json/geotargets.csv +0 -2616
admin/class-enhanced-ecommerce-google-analytics-admin.php CHANGED
@@ -78,7 +78,7 @@ class Enhanced_Ecommerce_Google_Analytics_Admin extends TVC_Admin_Helper {
78
  wp_register_style('aga_confirm', '//cdnjs.cloudflare.com/ajax/libs/jquery-confirm/3.3.2/jquery-confirm.min.css');
79
  wp_enqueue_style('aga_confirm');
80
 
81
- wp_enqueue_style('custom-css', ENHANCAD_PLUGIN_URL . '/includes/setup/css/custom-style.css', array(), $this->version, 'all' );
82
  if($this->is_current_tab_in(array('sync_product_page','gaa_config_page'))){
83
  wp_register_style('plugin-select2',ENHANCAD_PLUGIN_URL . '/includes/setup/plugins/select2/select2.min.css');
84
  wp_enqueue_style('plugin-select2');
@@ -104,7 +104,6 @@ class Enhanced_Ecommerce_Google_Analytics_Admin extends TVC_Admin_Helper {
104
  $screen = get_current_screen();
105
  if ($screen->id == 'toplevel_page_enhanced-ecommerce-google-analytics-admin-display' || (isset($_GET['page']) && $_GET['page'] == 'enhanced-ecommerce-google-analytics-admin-display')) {
106
 
107
- wp_enqueue_script( $this->plugin_name, plugin_dir_url( __FILE__ ) . 'js/sweetalert.min.js', array( 'jquery' ), $this->version, false );
108
  wp_enqueue_script( 'custom-jquery', ENHANCAD_PLUGIN_URL . '/admin/js/jquery-3.5.1.min.js', array( 'jquery' ), $this->version, false );
109
  wp_register_script('popper_bootstrap', '//cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js');
110
  wp_enqueue_script('popper_bootstrap');
@@ -114,7 +113,7 @@ class Enhanced_Ecommerce_Google_Analytics_Admin extends TVC_Admin_Helper {
114
  wp_enqueue_script('aga_bootstrap_mod');
115
  wp_register_script('aga_confirm_js', '//cdnjs.cloudflare.com/ajax/libs/jquery-confirm/3.3.2/jquery-confirm.min.js');
116
  wp_enqueue_script('aga_confirm_js');
117
- wp_enqueue_script($this->plugin_name, plugin_dir_url(__FILE__) . 'js/enhanced-ecommerce-google-analytics-admin.js', array('jquery'), $this->version, false);
118
  if($this->is_current_tab_in(array('sync_product_page','gaa_config_page'))){
119
  wp_register_script('plugin-select2',ENHANCAD_PLUGIN_URL . '/includes/setup/plugins/select2/select2.min.js');
120
  wp_enqueue_script('plugin-select2');
78
  wp_register_style('aga_confirm', '//cdnjs.cloudflare.com/ajax/libs/jquery-confirm/3.3.2/jquery-confirm.min.css');
79
  wp_enqueue_style('aga_confirm');
80
 
81
+ wp_enqueue_style('custom-css', ENHANCAD_PLUGIN_URL . '/admin/css/custom-style.css', array(), $this->version, 'all' );
82
  if($this->is_current_tab_in(array('sync_product_page','gaa_config_page'))){
83
  wp_register_style('plugin-select2',ENHANCAD_PLUGIN_URL . '/includes/setup/plugins/select2/select2.min.css');
84
  wp_enqueue_style('plugin-select2');
104
  $screen = get_current_screen();
105
  if ($screen->id == 'toplevel_page_enhanced-ecommerce-google-analytics-admin-display' || (isset($_GET['page']) && $_GET['page'] == 'enhanced-ecommerce-google-analytics-admin-display')) {
106
 
 
107
  wp_enqueue_script( 'custom-jquery', ENHANCAD_PLUGIN_URL . '/admin/js/jquery-3.5.1.min.js', array( 'jquery' ), $this->version, false );
108
  wp_register_script('popper_bootstrap', '//cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js');
109
  wp_enqueue_script('popper_bootstrap');
113
  wp_enqueue_script('aga_bootstrap_mod');
114
  wp_register_script('aga_confirm_js', '//cdnjs.cloudflare.com/ajax/libs/jquery-confirm/3.3.2/jquery-confirm.min.js');
115
  wp_enqueue_script('aga_confirm_js');
116
+ // wp_enqueue_script($this->plugin_name, plugin_dir_url(__FILE__) . 'js/enhanced-ecommerce-google-analytics-admin.js', array('jquery'), $this->version, false);
117
  if($this->is_current_tab_in(array('sync_product_page','gaa_config_page'))){
118
  wp_register_script('plugin-select2',ENHANCAD_PLUGIN_URL . '/includes/setup/plugins/select2/select2.min.js');
119
  wp_enqueue_script('plugin-select2');
admin/class-tvc-admin-helper.php CHANGED
@@ -24,8 +24,7 @@ Class TVC_Admin_Helper{
24
  }
25
  if (!class_exists('ShoppingApi')) {
26
  require_once(ENHANCAD_PLUGIN_DIR . 'includes/setup/ShoppingApi.php');
27
- }
28
-
29
  }
30
 
31
  public function is_ee_options_data_empty(){
@@ -40,9 +39,6 @@ Class TVC_Admin_Helper{
40
  return $this->ee_options_data;
41
  }else{
42
  $this->ee_options_data = unserialize(get_option('ee_api_data'));
43
- //echo "<pre>";
44
- //print_r($this->ee_options_data);
45
- //exit;
46
  return $this->ee_options_data;
47
  }
48
  }
@@ -54,8 +50,8 @@ Class TVC_Admin_Helper{
54
 
55
  $tvc_setting_db = [];
56
  $tvc_setting_db['subscription_id'] = $this->get_subscriptionId();
57
- $tvc_setting_db['enhanced_e_commerce_tracking'] = (($ee_options_settings['ga_eeT'] == "on" || $ee_options_settings['ga_eeT'])?1:0);
58
- $tvc_setting_db['add_gtag_snippet'] = (($ee_options_settings['ga_ST'] == "on" || $ee_options_settings['ga_ST'])?1:0);
59
 
60
 
61
  $tvc_setting_db['google-add'] ="";
@@ -136,10 +132,9 @@ Class TVC_Admin_Helper{
136
  if(!isset($GLOBALS['tatvicData']['tvc_subscription'])){
137
  $ee_options_settings = $this->get_ee_options_settings();
138
  }
139
- $this->subscriptionId = (isset($GLOBALS['tatvicData']['tvc_subscription'])) ? $GLOBALS['tatvicData']['tvc_subscription'] : $ee_options_settings['subscription_id'];
140
  return $this->subscriptionId;
141
- }
142
-
143
  }
144
  public function get_merchantId(){
145
  if(!empty($this->merchantId)){
@@ -227,7 +222,7 @@ Class TVC_Admin_Helper{
227
  if(!isset($GLOBALS['tatvicData']['tvc_customer'])){
228
  $ee_options_settings = $this->get_ee_options_settings();
229
  }
230
- $this->currentCustomerId = (isset($GLOBALS['tatvicData']['tvc_customer'])) ? $GLOBALS['tatvicData']['tvc_customer'] : $ee_options_settings['google_ads_id'];
231
  return $this->currentCustomerId;
232
  }
233
  }
@@ -254,19 +249,80 @@ Class TVC_Admin_Helper{
254
  }
255
 
256
  public function add_spinner_html(){
257
- $spinner_gif = ENHANCAD_PLUGIN_URL . '/images/ajax-loader.gif';
258
  echo '<div class="feed-spinner" id="feed-spinner" style="display:none;">
259
  <img id="img-spinner" src="' . $spinner_gif . '" alt="Loading" />
260
  </div>';
261
  }
262
 
263
  public function get_gmcAttributes() {
264
- $path = TVC_CHANNEL_DATA_DIR . '/google/gmc_attrbutes.json';
265
  $str = file_get_contents($path);
266
  $attributes = $str ? json_decode($str, true) : [];
267
  return $attributes;
268
  }
269
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
270
  public function check_setting_status(){
271
  if(!empty($this->setting_status)){
272
  return $this->setting_status;
@@ -431,5 +487,59 @@ Class TVC_Admin_Helper{
431
  }
432
  return false;
433
  }
434
- }
435
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  }
25
  if (!class_exists('ShoppingApi')) {
26
  require_once(ENHANCAD_PLUGIN_DIR . 'includes/setup/ShoppingApi.php');
27
+ }
 
28
  }
29
 
30
  public function is_ee_options_data_empty(){
39
  return $this->ee_options_data;
40
  }else{
41
  $this->ee_options_data = unserialize(get_option('ee_api_data'));
 
 
 
42
  return $this->ee_options_data;
43
  }
44
  }
50
 
51
  $tvc_setting_db = [];
52
  $tvc_setting_db['subscription_id'] = $this->get_subscriptionId();
53
+ $tvc_setting_db['enhanced_e_commerce_tracking'] = ((isset($ee_options_settings['ga_eeT']) && ($ee_options_settings['ga_eeT'] == "on" || $ee_options_settings['ga_eeT']))?1:0);
54
+ $tvc_setting_db['add_gtag_snippet'] = ((isset($ee_options_settings['ga_ST']) && ($ee_options_settings['ga_ST'] == "on" || $ee_options_settings['ga_ST']))?1:0);
55
 
56
 
57
  $tvc_setting_db['google-add'] ="";
132
  if(!isset($GLOBALS['tatvicData']['tvc_subscription'])){
133
  $ee_options_settings = $this->get_ee_options_settings();
134
  }
135
+ $this->subscriptionId = (isset($GLOBALS['tatvicData']['tvc_subscription'])) ? $GLOBALS['tatvicData']['tvc_subscription'] : ((isset($ee_options_settings['subscription_id']))?$ee_options_settings['subscription_id']:"");
136
  return $this->subscriptionId;
137
+ }
 
138
  }
139
  public function get_merchantId(){
140
  if(!empty($this->merchantId)){
222
  if(!isset($GLOBALS['tatvicData']['tvc_customer'])){
223
  $ee_options_settings = $this->get_ee_options_settings();
224
  }
225
+ $this->currentCustomerId = (isset($GLOBALS['tatvicData']['tvc_customer'])) ? $GLOBALS['tatvicData']['tvc_customer'] : ((isset($ee_options_settings['google_ads_id']))?$ee_options_settings['google_ads_id']:"");
226
  return $this->currentCustomerId;
227
  }
228
  }
249
  }
250
 
251
  public function add_spinner_html(){
252
+ $spinner_gif = ENHANCAD_PLUGIN_URL . '/admin/images/ajax-loader.gif';
253
  echo '<div class="feed-spinner" id="feed-spinner" style="display:none;">
254
  <img id="img-spinner" src="' . $spinner_gif . '" alt="Loading" />
255
  </div>';
256
  }
257
 
258
  public function get_gmcAttributes() {
259
+ $path = ENHANCAD_PLUGIN_URL . '/includes/setup/json/gmc_attrbutes.json';
260
  $str = file_get_contents($path);
261
  $attributes = $str ? json_decode($str, true) : [];
262
  return $attributes;
263
  }
264
+ public function get_gmc_countries_list() {
265
+ $path = ENHANCAD_PLUGIN_URL . '/includes/setup/json/countries.json';
266
+ $str = file_get_contents($path);
267
+ $attributes = $str ? json_decode($str, true) : [];
268
+ return $attributes;
269
+ }
270
+ public function get_gmc_language_list() {
271
+ $path = ENHANCAD_PLUGIN_URL . '/includes/setup/json/iso_lang.json';
272
+ $str = file_get_contents($path);
273
+ $attributes = $str ? json_decode($str, true) : [];
274
+ return $attributes;
275
+ }
276
+ /* start display form input*/
277
+ public function tvc_language_select($name, $class_id, string $label="Please Select", string $sel_val = "en", bool $require = false){
278
+ if($name){
279
+ $countries_list = $this->get_gmc_language_list();
280
+ ?>
281
+ <select class="form-control select2 <?php echo $class_id; ?> <?php echo ($require == true)?"field-required":""; ?>" name="<?php echo $name; ?>" id="<?php echo $class_id; ?>" >
282
+ <option value="0"><?php echo $label; ?></option>
283
+ <?php foreach ($countries_list as $Key => $val) {?>
284
+ <option value="<?php echo $val["code"];?>" <?php echo($val["code"] == $sel_val)?"selected":""; ?>><?php echo $val["name"]." (".$val["native_name"].")";?></option>
285
+ <?php
286
+ }?>
287
+ </select>
288
+ <?php
289
+ }
290
+ }
291
+ public function tvc_countries_select($name, $class_id, string $label="Please Select", bool $require = false){
292
+ if($name){
293
+ $countries_list = $this->get_gmc_countries_list();
294
+ $sel_val = $this->get_woo_country();
295
+ ?>
296
+ <select class="form-control select2 <?php echo $class_id; ?> <?php echo ($require == true)?"field-required":""; ?>" name="<?php echo $name; ?>" id="<?php echo $class_id; ?>" >
297
+ <option value="0"><?php echo $label; ?></option>
298
+ <?php foreach ($countries_list as $Key => $val) {?>
299
+ <option value="<?php echo $val["code"];?>" <?php echo($val["code"] == $sel_val)?"selected":""; ?>><?php echo $val["name"];?></option>
300
+ <?php
301
+ }?>
302
+ </select>
303
+ <?php
304
+ }
305
+ }
306
+ public function tvc_select($name, $class_id, string $label="Please Select", string $sel_val = null, bool $require = false, $option_list = array()){
307
+ if(!empty($option_list) && $name){
308
+ ?>
309
+ <select class="form-control select2 <?php echo $class_id; ?> <?php echo ($require == true)?"field-required":""; ?>" name="<?php echo $name; ?>" id="<?php echo $class_id; ?>" >
310
+ <option value="0"><?php echo $label; ?></option>
311
+ <?php foreach ($option_list as $Key => $val) {?>
312
+ <option value="<?php echo $val["field"];?>" <?php echo($val["field"] == $sel_val)?"selected":""; ?>><?php echo $val["field"];?></option>
313
+ <?php
314
+ }?>
315
+ </select>
316
+ <?php
317
+ }
318
+ }
319
+ public function tvc_text($name, string $type="text", string $class_id="", string $label=null, $sel_val = null, bool $require = false){
320
+ ?>
321
+ <input type="<?php echo $type; ?>" name="<?php echo $name; ?>" class="tvc-text <?php echo $class_id; ?>" id="<?php echo $class_id; ?>" placeholder="<?php echo $label; ?>" value="<?php echo $sel_val; ?>">
322
+ <?php
323
+ }
324
+
325
+ /* end from input*/
326
  public function check_setting_status(){
327
  if(!empty($this->setting_status)){
328
  return $this->setting_status;
487
  }
488
  return false;
489
  }
490
+
491
+ public function get_tvc_product_cat_list(){
492
+ $args = array(
493
+ 'hide_empty' => 1,
494
+ 'taxonomy' => 'product_cat',
495
+ 'orderby' => 'term_id'
496
+ );
497
+ $shop_categories_list = get_categories( $args );
498
+ $tvc_cat_id_list = [];
499
+ foreach ($shop_categories_list as $key => $value) {
500
+ $tvc_cat_id_list[]=$value->term_id;
501
+ }
502
+ return json_encode($tvc_cat_id_list);
503
+ }
504
+ public function get_tvc_product_cat_list_with_name(){
505
+ $args = array(
506
+ 'hide_empty' => 1,
507
+ 'taxonomy' => 'product_cat',
508
+ 'orderby' => 'term_id'
509
+ );
510
+ $shop_categories_list = get_categories( $args );
511
+ $tvc_cat_id_list = [];
512
+ foreach ($shop_categories_list as $key => $value) {
513
+ $tvc_cat_id_list[$value->term_id]=$value->name;
514
+ }
515
+ return $tvc_cat_id_list;
516
+ }
517
+
518
+ public function call_domain_claim(){
519
+ $googleDetail = [];
520
+ $google_detail = $this->get_ee_options_data();
521
+ //print_r($google_detail);
522
+ if(isset($google_detail['setting']) && $google_detail['setting']){
523
+ $googleDetail = $google_detail['setting'];
524
+ if($googleDetail->is_domain_claim == '0'){
525
+ $postData = [
526
+ 'merchant_id' => $googleDetail->merchant_id,
527
+ 'website_url' => $googleDetail->site_url,
528
+ 'subscription_id' => $googleDetail->id,
529
+ 'account_id' => $googleDetail->google_merchant_center_id
530
+ ];
531
+ $claimWebsite = $this->customApiObj->claimWebsite($postData);
532
+ //print_r($claimWebsite);
533
+ if(isset($claimWebsite->error) && !empty($claimWebsite->errors)){
534
+ return array('error'=>true, 'msg'=>$claimWebsite->errors[0]);
535
+ }else{
536
+ $this->set_update_api_to_db();
537
+ return array('error'=>false, 'msg'=>"Domain claimed successfully.");
538
+ }
539
+ }else{
540
+ return array('error'=>true, 'msg'=>"already domain claimed successfully");
541
+ }
542
+ }
543
+ }
544
+
545
+ }?>
{includes/setup → admin}/css/custom-style.css RENAMED
File without changes
admin/css/enhanced-ecommerce-google-analytics-admin.css CHANGED
@@ -466,6 +466,13 @@ ul.nav-tabs{
466
  -webkit-animation: 1s spin linear infinite;
467
  animation: 1s tvc-spin linear infinite;
468
  }
 
 
 
 
 
 
 
469
  #refresh_api{height: 25px;}
470
  .btn.tvc_api_sync_btn{
471
  min-width: 114px;
@@ -517,3 +524,42 @@ ul.nav-tabs{
517
  background-clip: border-box;
518
  border: 1px solid rgba(0,0,0,.125);
519
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
466
  -webkit-animation: 1s spin linear infinite;
467
  animation: 1s tvc-spin linear infinite;
468
  }
469
+ .domain-claim-spinner.tvc-nb-spinner{
470
+ top: 5px;
471
+ right: 38px;
472
+ margin-left: 0px;
473
+ width: 15px;
474
+ height: 15px;
475
+ }
476
  #refresh_api{height: 25px;}
477
  .btn.tvc_api_sync_btn{
478
  min-width: 114px;
524
  background-clip: border-box;
525
  border: 1px solid rgba(0,0,0,.125);
526
  }
527
+
528
+ /* popup */
529
+ .popup-modal.overlay {
530
+ position: fixed;
531
+ top: 0;
532
+ bottom: 0;
533
+ left: 0;
534
+ right: 0;
535
+ background: rgba(0, 0, 0, 0.7);
536
+ transition: opacity 500ms;
537
+ }
538
+ .popup-modal.overlay:target {
539
+ visibility: visible;
540
+ opacity: 1;
541
+ }
542
+ .popup-modal .modal-dialog .modal-content{
543
+ margin: 20px auto;
544
+ padding: 20px;
545
+ background: #fff;
546
+ border-radius: 5px;
547
+ position: relative;
548
+ transition: all 5s ease-in-out;
549
+ border: none;}
550
+ .popup-modal .modal-dialog .modal-content .close{
551
+ position: absolute;
552
+ top: 0px;
553
+ right: 10px;
554
+ transition: all 200ms;
555
+ font-size: 30px;
556
+ font-weight: bold;
557
+ text-decoration: none;
558
+ }
559
+ .popup-modal .tvc-text{
560
+ min-height: 30px;
561
+ max-width: 25rem;
562
+ width: 100%;
563
+ font-size: 14px;
564
+ }
565
+ #feed-spinner img{width: 60px;}
admin/css/style.css DELETED
@@ -1,11 +0,0 @@
1
- *{
2
- box-sizing: border-box;
3
- margin:0px;
4
- padding:0px;
5
- }
6
- body{
7
- background-image: url('../images/plugin_bk.png') !important;
8
- }
9
- .swal{
10
- background-color:#2c3e50;
11
- }
 
 
 
 
 
 
 
 
 
 
 
{images → admin/images}/ajax-loader.gif RENAMED
File without changes
admin/js/enhanced-ecommerce-google-analytics-admin.js DELETED
@@ -1,42 +0,0 @@
1
- (function( $ ) {
2
- 'use strict';
3
-
4
- /**
5
- * All of the code for your admin-facing JavaScript source
6
- * should reside in this file.
7
- *
8
- * Note: It has been assumed you will write jQuery code here, so the
9
- * $ function reference has been prepared for usage within the scope
10
- * of this function.
11
- *
12
- * This enables you to define handlers, for when the DOM is ready:
13
- *
14
- * $(function() {
15
- *
16
- * });
17
- *
18
- * When the window is loaded:
19
- *
20
- * $( window ).load(function() {
21
- *
22
- * });
23
- *
24
- * ...and/or other possibilities.
25
- *
26
- * Ideally, it is not considered best practise to attach more than a
27
- * single DOM-ready or window-load handler for a particular page.
28
- * Although scripts in the WordPress core, Plugins and Themes may be
29
- * practising this, we should strive to set a better example in our own work.
30
- */
31
-
32
- jQuery(document).ready(function(){
33
- jQuery('.download').click(function(){
34
- jQuery.confirm({
35
- theme : 'supervan',
36
- type: 'red',
37
- title: 'Note !',
38
- content: 'Deactivate the Enhanced Ecommerce Google analytics (Tatvic EE Plugin) before activating the free trial.',
39
- });
40
- });
41
- });
42
- })( jQuery );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/js/sweetalert.min.js DELETED
@@ -1 +0,0 @@
1
- !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.swal=e():t.swal=e()}(this,function(){return function(t){function e(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var n={};return e.m=t,e.c=n,e.d=function(t,n,o){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:o})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=8)}([function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o="swal-button";e.CLASS_NAMES={MODAL:"swal-modal",OVERLAY:"swal-overlay",SHOW_MODAL:"swal-overlay--show-modal",MODAL_TITLE:"swal-title",MODAL_TEXT:"swal-text",ICON:"swal-icon",ICON_CUSTOM:"swal-icon--custom",CONTENT:"swal-content",FOOTER:"swal-footer",BUTTON_CONTAINER:"swal-button-container",BUTTON:o,CONFIRM_BUTTON:o+"--confirm",CANCEL_BUTTON:o+"--cancel",DANGER_BUTTON:o+"--danger",BUTTON_LOADING:o+"--loading",BUTTON_LOADER:o+"__loader"},e.default=e.CLASS_NAMES},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getNode=function(t){var e="."+t;return document.querySelector(e)},e.stringToNode=function(t){var e=document.createElement("div");return e.innerHTML=t.trim(),e.firstChild},e.insertAfter=function(t,e){var n=e.nextSibling;e.parentNode.insertBefore(t,n)},e.removeNode=function(t){t.parentElement.removeChild(t)},e.throwErr=function(t){throw t=t.replace(/ +(?= )/g,""),"SweetAlert: "+(t=t.trim())},e.isPlainObject=function(t){if("[object Object]"!==Object.prototype.toString.call(t))return!1;var e=Object.getPrototypeOf(t);return null===e||e===Object.prototype},e.ordinalSuffixOf=function(t){var e=t%10,n=t%100;return 1===e&&11!==n?t+"st":2===e&&12!==n?t+"nd":3===e&&13!==n?t+"rd":t+"th"}},function(t,e,n){"use strict";function o(t){for(var n in t)e.hasOwnProperty(n)||(e[n]=t[n])}Object.defineProperty(e,"__esModule",{value:!0}),o(n(25));var r=n(26);e.overlayMarkup=r.default,o(n(27)),o(n(28)),o(n(29));var i=n(0),a=i.default.MODAL_TITLE,s=i.default.MODAL_TEXT,c=i.default.ICON,l=i.default.FOOTER;e.iconMarkup='\n <div class="'+c+'"></div>',e.titleMarkup='\n <div class="'+a+'"></div>\n',e.textMarkup='\n <div class="'+s+'"></div>',e.footerMarkup='\n <div class="'+l+'"></div>\n'},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(1);e.CONFIRM_KEY="confirm",e.CANCEL_KEY="cancel";var r={visible:!0,text:null,value:null,className:"",closeModal:!0},i=Object.assign({},r,{visible:!1,text:"Cancel",value:null}),a=Object.assign({},r,{text:"OK",value:!0});e.defaultButtonList={cancel:i,confirm:a};var s=function(t){switch(t){case e.CONFIRM_KEY:return a;case e.CANCEL_KEY:return i;default:var n=t.charAt(0).toUpperCase()+t.slice(1);return Object.assign({},r,{text:n,value:t})}},c=function(t,e){var n=s(t);return!0===e?Object.assign({},n,{visible:!0}):"string"==typeof e?Object.assign({},n,{visible:!0,text:e}):o.isPlainObject(e)?Object.assign({visible:!0},n,e):Object.assign({},n,{visible:!1})},l=function(t){for(var e={},n=0,o=Object.keys(t);n<o.length;n++){var r=o[n],a=t[r],s=c(r,a);e[r]=s}return e.cancel||(e.cancel=i),e},u=function(t){var n={};switch(t.length){case 1:n[e.CANCEL_KEY]=Object.assign({},i,{visible:!1});break;case 2:n[e.CANCEL_KEY]=c(e.CANCEL_KEY,t[0]),n[e.CONFIRM_KEY]=c(e.CONFIRM_KEY,t[1]);break;default:o.throwErr("Invalid number of 'buttons' in array ("+t.length+").\n If you want more than 2 buttons, you need to use an object!")}return n};e.getButtonListOpts=function(t){var n=e.defaultButtonList;return"string"==typeof t?n[e.CONFIRM_KEY]=c(e.CONFIRM_KEY,t):Array.isArray(t)?n=u(t):o.isPlainObject(t)?n=l(t):!0===t?n=u([!0,!0]):!1===t?n=u([!1,!1]):void 0===t&&(n=e.defaultButtonList),n}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(1),r=n(2),i=n(0),a=i.default.MODAL,s=i.default.OVERLAY,c=n(30),l=n(31),u=n(32),f=n(33);e.injectElIntoModal=function(t){var e=o.getNode(a),n=o.stringToNode(t);return e.appendChild(n),n};var d=function(t){t.className=a,t.textContent=""},p=function(t,e){d(t);var n=e.className;n&&t.classList.add(n)};e.initModalContent=function(t){var e=o.getNode(a);p(e,t),c.default(t.icon),l.initTitle(t.title),l.initText(t.text),f.default(t.content),u.default(t.buttons,t.dangerMode)};var m=function(){var t=o.getNode(s),e=o.stringToNode(r.modalMarkup);t.appendChild(e)};e.default=m},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(3),r={isOpen:!1,promise:null,actions:{},timer:null},i=Object.assign({},r);e.resetState=function(){i=Object.assign({},r)},e.setActionValue=function(t){if("string"==typeof t)return a(o.CONFIRM_KEY,t);for(var e in t)a(e,t[e])};var a=function(t,e){i.actions[t]||(i.actions[t]={}),Object.assign(i.actions[t],{value:e})};e.setActionOptionsFor=function(t,e){var n=(void 0===e?{}:e).closeModal,o=void 0===n||n;Object.assign(i.actions[t],{closeModal:o})},e.default=i},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(1),r=n(3),i=n(0),a=i.default.OVERLAY,s=i.default.SHOW_MODAL,c=i.default.BUTTON,l=i.default.BUTTON_LOADING,u=n(5);e.openModal=function(){o.getNode(a).classList.add(s),u.default.isOpen=!0};var f=function(){o.getNode(a).classList.remove(s),u.default.isOpen=!1};e.onAction=function(t){void 0===t&&(t=r.CANCEL_KEY);var e=u.default.actions[t],n=e.value;if(!1===e.closeModal){var i=c+"--"+t;o.getNode(i).classList.add(l)}else f();u.default.promise.resolve(n)},e.getState=function(){var t=Object.assign({},u.default);return delete t.promise,delete t.timer,t},e.stopLoading=function(){for(var t=document.querySelectorAll("."+c),e=0;e<t.length;e++){t[e].classList.remove(l)}}},function(t,e){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(n=window)}t.exports=n},function(t,e,n){(function(e){t.exports=e.sweetAlert=n(9)}).call(e,n(7))},function(t,e,n){(function(e){t.exports=e.swal=n(10)}).call(e,n(7))},function(t,e,n){"undefined"!=typeof window&&n(11),n(16);var o=n(23).default;t.exports=o},function(t,e,n){var o=n(12);"string"==typeof o&&(o=[[t.i,o,""]]);var r={insertAt:"top"};r.transform=void 0;n(14)(o,r);o.locals&&(t.exports=o.locals)},function(t,e,n){e=t.exports=n(13)(void 0),e.push([t.i,'.swal-icon--error{border-color:#f27474;-webkit-animation:animateErrorIcon .5s;animation:animateErrorIcon .5s}.swal-icon--error__x-mark{position:relative;display:block;-webkit-animation:animateXMark .5s;animation:animateXMark .5s}.swal-icon--error__line{position:absolute;height:5px;width:47px;background-color:#f27474;display:block;top:37px;border-radius:2px}.swal-icon--error__line--left{-webkit-transform:rotate(45deg);transform:rotate(45deg);left:17px}.swal-icon--error__line--right{-webkit-transform:rotate(-45deg);transform:rotate(-45deg);right:16px}@-webkit-keyframes animateErrorIcon{0%{-webkit-transform:rotateX(100deg);transform:rotateX(100deg);opacity:0}to{-webkit-transform:rotateX(0deg);transform:rotateX(0deg);opacity:1}}@keyframes animateErrorIcon{0%{-webkit-transform:rotateX(100deg);transform:rotateX(100deg);opacity:0}to{-webkit-transform:rotateX(0deg);transform:rotateX(0deg);opacity:1}}@-webkit-keyframes animateXMark{0%{-webkit-transform:scale(.4);transform:scale(.4);margin-top:26px;opacity:0}50%{-webkit-transform:scale(.4);transform:scale(.4);margin-top:26px;opacity:0}80%{-webkit-transform:scale(1.15);transform:scale(1.15);margin-top:-6px}to{-webkit-transform:scale(1);transform:scale(1);margin-top:0;opacity:1}}@keyframes animateXMark{0%{-webkit-transform:scale(.4);transform:scale(.4);margin-top:26px;opacity:0}50%{-webkit-transform:scale(.4);transform:scale(.4);margin-top:26px;opacity:0}80%{-webkit-transform:scale(1.15);transform:scale(1.15);margin-top:-6px}to{-webkit-transform:scale(1);transform:scale(1);margin-top:0;opacity:1}}.swal-icon--warning{border-color:#f8bb86;-webkit-animation:pulseWarning .75s infinite alternate;animation:pulseWarning .75s infinite alternate}.swal-icon--warning__body{width:5px;height:47px;top:10px;border-radius:2px;margin-left:-2px}.swal-icon--warning__body,.swal-icon--warning__dot{position:absolute;left:50%;background-color:#f8bb86}.swal-icon--warning__dot{width:7px;height:7px;border-radius:50%;margin-left:-4px;bottom:-11px}@-webkit-keyframes pulseWarning{0%{border-color:#f8d486}to{border-color:#f8bb86}}@keyframes pulseWarning{0%{border-color:#f8d486}to{border-color:#f8bb86}}.swal-icon--success{border-color:#a5dc86}.swal-icon--success:after,.swal-icon--success:before{content:"";border-radius:50%;position:absolute;width:60px;height:120px;background:#fff;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.swal-icon--success:before{border-radius:120px 0 0 120px;top:-7px;left:-33px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:60px 60px;transform-origin:60px 60px}.swal-icon--success:after{border-radius:0 120px 120px 0;top:-11px;left:30px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:0 60px;transform-origin:0 60px;-webkit-animation:rotatePlaceholder 4.25s ease-in;animation:rotatePlaceholder 4.25s ease-in}.swal-icon--success__ring{width:80px;height:80px;border:4px solid hsla(98,55%,69%,.2);border-radius:50%;box-sizing:content-box;position:absolute;left:-4px;top:-4px;z-index:2}.swal-icon--success__hide-corners{width:5px;height:90px;background-color:#fff;padding:1px;position:absolute;left:28px;top:8px;z-index:1;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.swal-icon--success__line{height:5px;background-color:#a5dc86;display:block;border-radius:2px;position:absolute;z-index:2}.swal-icon--success__line--tip{width:25px;left:14px;top:46px;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-animation:animateSuccessTip .75s;animation:animateSuccessTip .75s}.swal-icon--success__line--long{width:47px;right:8px;top:38px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-animation:animateSuccessLong .75s;animation:animateSuccessLong .75s}@-webkit-keyframes rotatePlaceholder{0%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}5%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}12%{-webkit-transform:rotate(-405deg);transform:rotate(-405deg)}to{-webkit-transform:rotate(-405deg);transform:rotate(-405deg)}}@keyframes rotatePlaceholder{0%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}5%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}12%{-webkit-transform:rotate(-405deg);transform:rotate(-405deg)}to{-webkit-transform:rotate(-405deg);transform:rotate(-405deg)}}@-webkit-keyframes animateSuccessTip{0%{width:0;left:1px;top:19px}54%{width:0;left:1px;top:19px}70%{width:50px;left:-8px;top:37px}84%{width:17px;left:21px;top:48px}to{width:25px;left:14px;top:45px}}@keyframes animateSuccessTip{0%{width:0;left:1px;top:19px}54%{width:0;left:1px;top:19px}70%{width:50px;left:-8px;top:37px}84%{width:17px;left:21px;top:48px}to{width:25px;left:14px;top:45px}}@-webkit-keyframes animateSuccessLong{0%{width:0;right:46px;top:54px}65%{width:0;right:46px;top:54px}84%{width:55px;right:0;top:35px}to{width:47px;right:8px;top:38px}}@keyframes animateSuccessLong{0%{width:0;right:46px;top:54px}65%{width:0;right:46px;top:54px}84%{width:55px;right:0;top:35px}to{width:47px;right:8px;top:38px}}.swal-icon--info{border-color:#c9dae1}.swal-icon--info:before{width:5px;height:29px;bottom:17px;border-radius:2px;margin-left:-2px}.swal-icon--info:after,.swal-icon--info:before{content:"";position:absolute;left:50%;background-color:#c9dae1}.swal-icon--info:after{width:7px;height:7px;border-radius:50%;margin-left:-3px;top:19px}.swal-icon{width:80px;height:80px;border-width:4px;border-style:solid;border-radius:50%;padding:0;position:relative;box-sizing:content-box;margin:20px auto}.swal-icon:first-child{margin-top:32px}.swal-icon--custom{width:auto;height:auto;max-width:100%;border:none;border-radius:0}.swal-icon img{max-width:100%;max-height:100%}.swal-title{color:rgba(0,0,0,.65);font-weight:600;text-transform:none;position:relative;display:block;padding:13px 16px;font-size:27px;line-height:normal;text-align:center;margin-bottom:0}.swal-title:first-child{margin-top:26px}.swal-title:not(:first-child){padding-bottom:0}.swal-title:not(:last-child){margin-bottom:13px}.swal-text{font-size:16px;position:relative;float:none;line-height:normal;vertical-align:top;text-align:left;display:inline-block;margin:0;padding:0 10px;font-weight:400;color:rgba(0,0,0,.64);max-width:calc(100% - 20px);overflow-wrap:break-word;box-sizing:border-box}.swal-text:first-child{margin-top:45px}.swal-text:last-child{margin-bottom:45px}.swal-footer{text-align:right;padding-top:13px;margin-top:13px;padding:13px 16px;border-radius:inherit;border-top-left-radius:0;border-top-right-radius:0}.swal-button-container{margin:5px;display:inline-block;position:relative}.swal-button{background-color:#7cd1f9;color:#fff;border:none;box-shadow:none;border-radius:5px;font-weight:600;font-size:14px;padding:10px 24px;margin:0;cursor:pointer}.swal-button[not:disabled]:hover{background-color:#78cbf2}.swal-button:active{background-color:#70bce0}.swal-button:focus{outline:none;box-shadow:0 0 0 1px #fff,0 0 0 3px rgba(43,114,165,.29)}.swal-button[disabled]{opacity:.5;cursor:default}.swal-button::-moz-focus-inner{border:0}.swal-button--cancel{color:#555;background-color:#efefef}.swal-button--cancel[not:disabled]:hover{background-color:#e8e8e8}.swal-button--cancel:active{background-color:#d7d7d7}.swal-button--cancel:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px rgba(116,136,150,.29)}.swal-button--danger{background-color:#e64942}.swal-button--danger[not:disabled]:hover{background-color:#df4740}.swal-button--danger:active{background-color:#cf423b}.swal-button--danger:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px rgba(165,43,43,.29)}.swal-content{padding:0 20px;margin-top:20px;font-size:medium}.swal-content:last-child{margin-bottom:20px}.swal-content__input,.swal-content__textarea{-webkit-appearance:none;background-color:#fff;border:none;font-size:14px;display:block;box-sizing:border-box;width:100%;border:1px solid rgba(0,0,0,.14);padding:10px 13px;border-radius:2px;transition:border-color .2s}.swal-content__input:focus,.swal-content__textarea:focus{outline:none;border-color:#6db8ff}.swal-content__textarea{resize:vertical}.swal-button--loading{color:transparent}.swal-button--loading~.swal-button__loader{opacity:1}.swal-button__loader{position:absolute;height:auto;width:43px;z-index:2;left:50%;top:50%;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);text-align:center;pointer-events:none;opacity:0}.swal-button__loader div{display:inline-block;float:none;vertical-align:baseline;width:9px;height:9px;padding:0;border:none;margin:2px;opacity:.4;border-radius:7px;background-color:hsla(0,0%,100%,.9);transition:background .2s;-webkit-animation:swal-loading-anim 1s infinite;animation:swal-loading-anim 1s infinite}.swal-button__loader div:nth-child(3n+2){-webkit-animation-delay:.15s;animation-delay:.15s}.swal-button__loader div:nth-child(3n+3){-webkit-animation-delay:.3s;animation-delay:.3s}@-webkit-keyframes swal-loading-anim{0%{opacity:.4}20%{opacity:.4}50%{opacity:1}to{opacity:.4}}@keyframes swal-loading-anim{0%{opacity:.4}20%{opacity:.4}50%{opacity:1}to{opacity:.4}}.swal-overlay{position:fixed;top:0;bottom:0;left:0;right:0;text-align:center;font-size:0;overflow-y:auto;background-color:rgba(0,0,0,.4);z-index:10000;pointer-events:none;opacity:0;transition:opacity .3s}.swal-overlay:before{content:" ";display:inline-block;vertical-align:middle;height:100%}.swal-overlay--show-modal{opacity:1;pointer-events:auto}.swal-overlay--show-modal .swal-modal{opacity:1;pointer-events:auto;box-sizing:border-box;-webkit-animation:showSweetAlert .3s;animation:showSweetAlert .3s;will-change:transform}.swal-modal{width:478px;opacity:0;pointer-events:none;background-color:#fff;text-align:center;border-radius:5px;position:static;margin:20px auto;display:inline-block;vertical-align:middle;-webkit-transform:scale(1);transform:scale(1);-webkit-transform-origin:50% 50%;transform-origin:50% 50%;z-index:10001;transition:opacity .2s,-webkit-transform .3s;transition:transform .3s,opacity .2s;transition:transform .3s,opacity .2s,-webkit-transform .3s}@media (max-width:500px){.swal-modal{width:calc(100% - 20px)}}@-webkit-keyframes showSweetAlert{0%{-webkit-transform:scale(1);transform:scale(1)}1%{-webkit-transform:scale(.5);transform:scale(.5)}45%{-webkit-transform:scale(1.05);transform:scale(1.05)}80%{-webkit-transform:scale(.95);transform:scale(.95)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes showSweetAlert{0%{-webkit-transform:scale(1);transform:scale(1)}1%{-webkit-transform:scale(.5);transform:scale(.5)}45%{-webkit-transform:scale(1.05);transform:scale(1.05)}80%{-webkit-transform:scale(.95);transform:scale(.95)}to{-webkit-transform:scale(1);transform:scale(1)}}',""])},function(t,e){function n(t,e){var n=t[1]||"",r=t[3];if(!r)return n;if(e&&"function"==typeof btoa){var i=o(r);return[n].concat(r.sources.map(function(t){return"/*# sourceURL="+r.sourceRoot+t+" */"})).concat([i]).join("\n")}return[n].join("\n")}function o(t){return"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(t))))+" */"}t.exports=function(t){var e=[];return e.toString=function(){return this.map(function(e){var o=n(e,t);return e[2]?"@media "+e[2]+"{"+o+"}":o}).join("")},e.i=function(t,n){"string"==typeof t&&(t=[[null,t,""]]);for(var o={},r=0;r<this.length;r++){var i=this[r][0];"number"==typeof i&&(o[i]=!0)}for(r=0;r<t.length;r++){var a=t[r];"number"==typeof a[0]&&o[a[0]]||(n&&!a[2]?a[2]=n:n&&(a[2]="("+a[2]+") and ("+n+")"),e.push(a))}},e}},function(t,e,n){function o(t,e){for(var n=0;n<t.length;n++){var o=t[n],r=m[o.id];if(r){r.refs++;for(var i=0;i<r.parts.length;i++)r.parts[i](o.parts[i]);for(;i<o.parts.length;i++)r.parts.push(u(o.parts[i],e))}else{for(var a=[],i=0;i<o.parts.length;i++)a.push(u(o.parts[i],e));m[o.id]={id:o.id,refs:1,parts:a}}}}function r(t,e){for(var n=[],o={},r=0;r<t.length;r++){var i=t[r],a=e.base?i[0]+e.base:i[0],s=i[1],c=i[2],l=i[3],u={css:s,media:c,sourceMap:l};o[a]?o[a].parts.push(u):n.push(o[a]={id:a,parts:[u]})}return n}function i(t,e){var n=v(t.insertInto);if(!n)throw new Error("Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.");var o=w[w.length-1];if("top"===t.insertAt)o?o.nextSibling?n.insertBefore(e,o.nextSibling):n.appendChild(e):n.insertBefore(e,n.firstChild),w.push(e);else{if("bottom"!==t.insertAt)throw new Error("Invalid value for parameter 'insertAt'. Must be 'top' or 'bottom'.");n.appendChild(e)}}function a(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t);var e=w.indexOf(t);e>=0&&w.splice(e,1)}function s(t){var e=document.createElement("style");return t.attrs.type="text/css",l(e,t.attrs),i(t,e),e}function c(t){var e=document.createElement("link");return t.attrs.type="text/css",t.attrs.rel="stylesheet",l(e,t.attrs),i(t,e),e}function l(t,e){Object.keys(e).forEach(function(n){t.setAttribute(n,e[n])})}function u(t,e){var n,o,r,i;if(e.transform&&t.css){if(!(i=e.transform(t.css)))return function(){};t.css=i}if(e.singleton){var l=h++;n=g||(g=s(e)),o=f.bind(null,n,l,!1),r=f.bind(null,n,l,!0)}else t.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(n=c(e),o=p.bind(null,n,e),r=function(){a(n),n.href&&URL.revokeObjectURL(n.href)}):(n=s(e),o=d.bind(null,n),r=function(){a(n)});return o(t),function(e){if(e){if(e.css===t.css&&e.media===t.media&&e.sourceMap===t.sourceMap)return;o(t=e)}else r()}}function f(t,e,n,o){var r=n?"":o.css;if(t.styleSheet)t.styleSheet.cssText=x(e,r);else{var i=document.createTextNode(r),a=t.childNodes;a[e]&&t.removeChild(a[e]),a.length?t.insertBefore(i,a[e]):t.appendChild(i)}}function d(t,e){var n=e.css,o=e.media;if(o&&t.setAttribute("media",o),t.styleSheet)t.styleSheet.cssText=n;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(n))}}function p(t,e,n){var o=n.css,r=n.sourceMap,i=void 0===e.convertToAbsoluteUrls&&r;(e.convertToAbsoluteUrls||i)&&(o=y(o)),r&&(o+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(r))))+" */");var a=new Blob([o],{type:"text/css"}),s=t.href;t.href=URL.createObjectURL(a),s&&URL.revokeObjectURL(s)}var m={},b=function(t){var e;return function(){return void 0===e&&(e=t.apply(this,arguments)),e}}(function(){return window&&document&&document.all&&!window.atob}),v=function(t){var e={};return function(n){return void 0===e[n]&&(e[n]=t.call(this,n)),e[n]}}(function(t){return document.querySelector(t)}),g=null,h=0,w=[],y=n(15);t.exports=function(t,e){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");e=e||{},e.attrs="object"==typeof e.attrs?e.attrs:{},e.singleton||(e.singleton=b()),e.insertInto||(e.insertInto="head"),e.insertAt||(e.insertAt="bottom");var n=r(t,e);return o(n,e),function(t){for(var i=[],a=0;a<n.length;a++){var s=n[a],c=m[s.id];c.refs--,i.push(c)}if(t){o(r(t,e),e)}for(var a=0;a<i.length;a++){var c=i[a];if(0===c.refs){for(var l=0;l<c.parts.length;l++)c.parts[l]();delete m[c.id]}}}};var x=function(){var t=[];return function(e,n){return t[e]=n,t.filter(Boolean).join("\n")}}()},function(t,e){t.exports=function(t){var e="undefined"!=typeof window&&window.location;if(!e)throw new Error("fixUrls requires window.location");if(!t||"string"!=typeof t)return t;var n=e.protocol+"//"+e.host,o=n+e.pathname.replace(/\/[^\/]*$/,"/");return t.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi,function(t,e){var r=e.trim().replace(/^"(.*)"$/,function(t,e){return e}).replace(/^'(.*)'$/,function(t,e){return e});if(/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/)/i.test(r))return t;var i;return i=0===r.indexOf("//")?r:0===r.indexOf("/")?n+r:o+r.replace(/^\.\//,""),"url("+JSON.stringify(i)+")"})}},function(t,e,n){var o=n(17);"undefined"==typeof window||window.Promise||(window.Promise=o),n(21),String.prototype.includes||(String.prototype.includes=function(t,e){"use strict";return"number"!=typeof e&&(e=0),!(e+t.length>this.length)&&-1!==this.indexOf(t,e)}),Array.prototype.includes||Object.defineProperty(Array.prototype,"includes",{value:function(t,e){if(null==this)throw new TypeError('"this" is null or not defined');var n=Object(this),o=n.length>>>0;if(0===o)return!1;for(var r=0|e,i=Math.max(r>=0?r:o-Math.abs(r),0);i<o;){if(function(t,e){return t===e||"number"==typeof t&&"number"==typeof e&&isNaN(t)&&isNaN(e)}(n[i],t))return!0;i++}return!1}}),"undefined"!=typeof window&&function(t){t.forEach(function(t){t.hasOwnProperty("remove")||Object.defineProperty(t,"remove",{configurable:!0,enumerable:!0,writable:!0,value:function(){this.parentNode.removeChild(this)}})})}([Element.prototype,CharacterData.prototype,DocumentType.prototype])},function(t,e,n){(function(e){!function(n){function o(){}function r(t,e){return function(){t.apply(e,arguments)}}function i(t){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof t)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],f(t,this)}function a(t,e){for(;3===t._state;)t=t._value;if(0===t._state)return void t._deferreds.push(e);t._handled=!0,i._immediateFn(function(){var n=1===t._state?e.onFulfilled:e.onRejected;if(null===n)return void(1===t._state?s:c)(e.promise,t._value);var o;try{o=n(t._value)}catch(t){return void c(e.promise,t)}s(e.promise,o)})}function s(t,e){try{if(e===t)throw new TypeError("A promise cannot be resolved with itself.");if(e&&("object"==typeof e||"function"==typeof e)){var n=e.then;if(e instanceof i)return t._state=3,t._value=e,void l(t);if("function"==typeof n)return void f(r(n,e),t)}t._state=1,t._value=e,l(t)}catch(e){c(t,e)}}function c(t,e){t._state=2,t._value=e,l(t)}function l(t){2===t._state&&0===t._deferreds.length&&i._immediateFn(function(){t._handled||i._unhandledRejectionFn(t._value)});for(var e=0,n=t._deferreds.length;e<n;e++)a(t,t._deferreds[e]);t._deferreds=null}function u(t,e,n){this.onFulfilled="function"==typeof t?t:null,this.onRejected="function"==typeof e?e:null,this.promise=n}function f(t,e){var n=!1;try{t(function(t){n||(n=!0,s(e,t))},function(t){n||(n=!0,c(e,t))})}catch(t){if(n)return;n=!0,c(e,t)}}var d=setTimeout;i.prototype.catch=function(t){return this.then(null,t)},i.prototype.then=function(t,e){var n=new this.constructor(o);return a(this,new u(t,e,n)),n},i.all=function(t){var e=Array.prototype.slice.call(t);return new i(function(t,n){function o(i,a){try{if(a&&("object"==typeof a||"function"==typeof a)){var s=a.then;if("function"==typeof s)return void s.call(a,function(t){o(i,t)},n)}e[i]=a,0==--r&&t(e)}catch(t){n(t)}}if(0===e.length)return t([]);for(var r=e.length,i=0;i<e.length;i++)o(i,e[i])})},i.resolve=function(t){return t&&"object"==typeof t&&t.constructor===i?t:new i(function(e){e(t)})},i.reject=function(t){return new i(function(e,n){n(t)})},i.race=function(t){return new i(function(e,n){for(var o=0,r=t.length;o<r;o++)t[o].then(e,n)})},i._immediateFn="function"==typeof e&&function(t){e(t)}||function(t){d(t,0)},i._unhandledRejectionFn=function(t){"undefined"!=typeof console&&console&&console.warn("Possible Unhandled Promise Rejection:",t)},i._setImmediateFn=function(t){i._immediateFn=t},i._setUnhandledRejectionFn=function(t){i._unhandledRejectionFn=t},void 0!==t&&t.exports?t.exports=i:n.Promise||(n.Promise=i)}(this)}).call(e,n(18).setImmediate)},function(t,e,n){function o(t,e){this._id=t,this._clearFn=e}var r=Function.prototype.apply;e.setTimeout=function(){return new o(r.call(setTimeout,window,arguments),clearTimeout)},e.setInterval=function(){return new o(r.call(setInterval,window,arguments),clearInterval)},e.clearTimeout=e.clearInterval=function(t){t&&t.close()},o.prototype.unref=o.prototype.ref=function(){},o.prototype.close=function(){this._clearFn.call(window,this._id)},e.enroll=function(t,e){clearTimeout(t._idleTimeoutId),t._idleTimeout=e},e.unenroll=function(t){clearTimeout(t._idleTimeoutId),t._idleTimeout=-1},e._unrefActive=e.active=function(t){clearTimeout(t._idleTimeoutId);var e=t._idleTimeout;e>=0&&(t._idleTimeoutId=setTimeout(function(){t._onTimeout&&t._onTimeout()},e))},n(19),e.setImmediate=setImmediate,e.clearImmediate=clearImmediate},function(t,e,n){(function(t,e){!function(t,n){"use strict";function o(t){"function"!=typeof t&&(t=new Function(""+t));for(var e=new Array(arguments.length-1),n=0;n<e.length;n++)e[n]=arguments[n+1];var o={callback:t,args:e};return l[c]=o,s(c),c++}function r(t){delete l[t]}function i(t){var e=t.callback,o=t.args;switch(o.length){case 0:e();break;case 1:e(o[0]);break;case 2:e(o[0],o[1]);break;case 3:e(o[0],o[1],o[2]);break;default:e.apply(n,o)}}function a(t){if(u)setTimeout(a,0,t);else{var e=l[t];if(e){u=!0;try{i(e)}finally{r(t),u=!1}}}}if(!t.setImmediate){var s,c=1,l={},u=!1,f=t.document,d=Object.getPrototypeOf&&Object.getPrototypeOf(t);d=d&&d.setTimeout?d:t,"[object process]"==={}.toString.call(t.process)?function(){s=function(t){e.nextTick(function(){a(t)})}}():function(){if(t.postMessage&&!t.importScripts){var e=!0,n=t.onmessage;return t.onmessage=function(){e=!1},t.postMessage("","*"),t.onmessage=n,e}}()?function(){var e="setImmediate$"+Math.random()+"$",n=function(n){n.source===t&&"string"==typeof n.data&&0===n.data.indexOf(e)&&a(+n.data.slice(e.length))};t.addEventListener?t.addEventListener("message",n,!1):t.attachEvent("onmessage",n),s=function(n){t.postMessage(e+n,"*")}}():t.MessageChannel?function(){var t=new MessageChannel;t.port1.onmessage=function(t){a(t.data)},s=function(e){t.port2.postMessage(e)}}():f&&"onreadystatechange"in f.createElement("script")?function(){var t=f.documentElement;s=function(e){var n=f.createElement("script");n.onreadystatechange=function(){a(e),n.onreadystatechange=null,t.removeChild(n),n=null},t.appendChild(n)}}():function(){s=function(t){setTimeout(a,0,t)}}(),d.setImmediate=o,d.clearImmediate=r}}("undefined"==typeof self?void 0===t?this:t:self)}).call(e,n(7),n(20))},function(t,e){function n(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function r(t){if(u===setTimeout)return setTimeout(t,0);if((u===n||!u)&&setTimeout)return u=setTimeout,setTimeout(t,0);try{return u(t,0)}catch(e){try{return u.call(null,t,0)}catch(e){return u.call(this,t,0)}}}function i(t){if(f===clearTimeout)return clearTimeout(t);if((f===o||!f)&&clearTimeout)return f=clearTimeout,clearTimeout(t);try{return f(t)}catch(e){try{return f.call(null,t)}catch(e){return f.call(this,t)}}}function a(){b&&p&&(b=!1,p.length?m=p.concat(m):v=-1,m.length&&s())}function s(){if(!b){var t=r(a);b=!0;for(var e=m.length;e;){for(p=m,m=[];++v<e;)p&&p[v].run();v=-1,e=m.length}p=null,b=!1,i(t)}}function c(t,e){this.fun=t,this.array=e}function l(){}var u,f,d=t.exports={};!function(){try{u="function"==typeof setTimeout?setTimeout:n}catch(t){u=n}try{f="function"==typeof clearTimeout?clearTimeout:o}catch(t){f=o}}();var p,m=[],b=!1,v=-1;d.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)e[n-1]=arguments[n];m.push(new c(t,e)),1!==m.length||b||r(s)},c.prototype.run=function(){this.fun.apply(null,this.array)},d.title="browser",d.browser=!0,d.env={},d.argv=[],d.version="",d.versions={},d.on=l,d.addListener=l,d.once=l,d.off=l,d.removeListener=l,d.removeAllListeners=l,d.emit=l,d.prependListener=l,d.prependOnceListener=l,d.listeners=function(t){return[]},d.binding=function(t){throw new Error("process.binding is not supported")},d.cwd=function(){return"/"},d.chdir=function(t){throw new Error("process.chdir is not supported")},d.umask=function(){return 0}},function(t,e,n){"use strict";n(22).polyfill()},function(t,e,n){"use strict";function o(t,e){if(void 0===t||null===t)throw new TypeError("Cannot convert first argument to object");for(var n=Object(t),o=1;o<arguments.length;o++){var r=arguments[o];if(void 0!==r&&null!==r)for(var i=Object.keys(Object(r)),a=0,s=i.length;a<s;a++){var c=i[a],l=Object.getOwnPropertyDescriptor(r,c);void 0!==l&&l.enumerable&&(n[c]=r[c])}}return n}function r(){Object.assign||Object.defineProperty(Object,"assign",{enumerable:!1,configurable:!0,writable:!0,value:o})}t.exports={assign:o,polyfill:r}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(24),r=n(6),i=n(5),a=n(36),s=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];if("undefined"!=typeof window){var n=a.getOpts.apply(void 0,t);return new Promise(function(t,e){i.default.promise={resolve:t,reject:e},o.default(n),setTimeout(function(){r.openModal()})})}};s.close=r.onAction,s.getState=r.getState,s.setActionValue=i.setActionValue,s.stopLoading=r.stopLoading,s.setDefaults=a.setDefaults,e.default=s},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(1),r=n(0),i=r.default.MODAL,a=n(4),s=n(34),c=n(35),l=n(1);e.init=function(t){o.getNode(i)||(document.body||l.throwErr("You can only use SweetAlert AFTER the DOM has loaded!"),s.default(),a.default()),a.initModalContent(t),c.default(t)},e.default=e.init},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(0),r=o.default.MODAL;e.modalMarkup='\n <div class="'+r+'" role="dialog" aria-modal="true"></div>',e.default=e.modalMarkup},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(0),r=o.default.OVERLAY,i='<div \n class="'+r+'"\n tabIndex="-1">\n </div>';e.default=i},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(0),r=o.default.ICON;e.errorIconMarkup=function(){var t=r+"--error",e=t+"__line";return'\n <div class="'+t+'__x-mark">\n <span class="'+e+" "+e+'--left"></span>\n <span class="'+e+" "+e+'--right"></span>\n </div>\n '},e.warningIconMarkup=function(){var t=r+"--warning";return'\n <span class="'+t+'__body">\n <span class="'+t+'__dot"></span>\n </span>\n '},e.successIconMarkup=function(){var t=r+"--success";return'\n <span class="'+t+"__line "+t+'__line--long"></span>\n <span class="'+t+"__line "+t+'__line--tip"></span>\n\n <div class="'+t+'__ring"></div>\n <div class="'+t+'__hide-corners"></div>\n '}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(0),r=o.default.CONTENT;e.contentMarkup='\n <div class="'+r+'">\n\n </div>\n'},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(0),r=o.default.BUTTON_CONTAINER,i=o.default.BUTTON,a=o.default.BUTTON_LOADER;e.buttonMarkup='\n <div class="'+r+'">\n\n <button\n class="'+i+'"\n ></button>\n\n <div class="'+a+'">\n <div></div>\n <div></div>\n <div></div>\n </div>\n\n </div>\n'},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(4),r=n(2),i=n(0),a=i.default.ICON,s=i.default.ICON_CUSTOM,c=["error","warning","success","info"],l={error:r.errorIconMarkup(),warning:r.warningIconMarkup(),success:r.successIconMarkup()},u=function(t,e){var n=a+"--"+t;e.classList.add(n);var o=l[t];o&&(e.innerHTML=o)},f=function(t,e){e.classList.add(s);var n=document.createElement("img");n.src=t,e.appendChild(n)},d=function(t){if(t){var e=o.injectElIntoModal(r.iconMarkup);c.includes(t)?u(t,e):f(t,e)}};e.default=d},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(2),r=n(4),i=function(t){navigator.userAgent.includes("AppleWebKit")&&(t.style.display="none",t.offsetHeight,t.style.display="")};e.initTitle=function(t){if(t){var e=r.injectElIntoModal(o.titleMarkup);e.textContent=t,i(e)}},e.initText=function(t){if(t){var e=document.createDocumentFragment();t.split("\n").forEach(function(t,n,o){e.appendChild(document.createTextNode(t)),n<o.length-1&&e.appendChild(document.createElement("br"))});var n=r.injectElIntoModal(o.textMarkup);n.appendChild(e),i(n)}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(1),r=n(4),i=n(0),a=i.default.BUTTON,s=i.default.DANGER_BUTTON,c=n(3),l=n(2),u=n(6),f=n(5),d=function(t,e,n){var r=e.text,i=e.value,d=e.className,p=e.closeModal,m=o.stringToNode(l.buttonMarkup),b=m.querySelector("."+a),v=a+"--"+t;if(b.classList.add(v),d){(Array.isArray(d)?d:d.split(" ")).filter(function(t){return t.length>0}).forEach(function(t){b.classList.add(t)})}n&&t===c.CONFIRM_KEY&&b.classList.add(s),b.textContent=r;var g={};return g[t]=i,f.setActionValue(g),f.setActionOptionsFor(t,{closeModal:p}),b.addEventListener("click",function(){return u.onAction(t)}),m},p=function(t,e){var n=r.injectElIntoModal(l.footerMarkup);for(var o in t){var i=t[o],a=d(o,i,e);i.visible&&n.appendChild(a)}0===n.children.length&&n.remove()};e.default=p},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(3),r=n(4),i=n(2),a=n(5),s=n(6),c=n(0),l=c.default.CONTENT,u=function(t){t.addEventListener("input",function(t){var e=t.target,n=e.value;a.setActionValue(n)}),t.addEventListener("keyup",function(t){if("Enter"===t.key)return s.onAction(o.CONFIRM_KEY)}),setTimeout(function(){t.focus(),a.setActionValue("")},0)},f=function(t,e,n){var o=document.createElement(e),r=l+"__"+e;o.classList.add(r);for(var i in n){var a=n[i];o[i]=a}"input"===e&&u(o),t.appendChild(o)},d=function(t){if(t){var e=r.injectElIntoModal(i.contentMarkup),n=t.element,o=t.attributes;"string"==typeof n?f(e,n,o):e.appendChild(n)}};e.default=d},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(1),r=n(2),i=function(){var t=o.stringToNode(r.overlayMarkup);document.body.appendChild(t)};e.default=i},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(5),r=n(6),i=n(1),a=n(3),s=n(0),c=s.default.MODAL,l=s.default.BUTTON,u=s.default.OVERLAY,f=function(t){t.preventDefault(),v()},d=function(t){t.preventDefault(),g()},p=function(t){if(o.default.isOpen)switch(t.key){case"Escape":return r.onAction(a.CANCEL_KEY)}},m=function(t){if(o.default.isOpen)switch(t.key){case"Tab":return f(t)}},b=function(t){if(o.default.isOpen)return"Tab"===t.key&&t.shiftKey?d(t):void 0},v=function(){var t=i.getNode(l);t&&(t.tabIndex=0,t.focus())},g=function(){var t=i.getNode(c),e=t.querySelectorAll("."+l),n=e.length-1,o=e[n];o&&o.focus()},h=function(t){t[t.length-1].addEventListener("keydown",m)},w=function(t){t[0].addEventListener("keydown",b)},y=function(){var t=i.getNode(c),e=t.querySelectorAll("."+l);e.length&&(h(e),w(e))},x=function(t){if(i.getNode(u)===t.target)return r.onAction(a.CANCEL_KEY)},_=function(t){var e=i.getNode(u);e.removeEventListener("click",x),t&&e.addEventListener("click",x)},k=function(t){o.default.timer&&clearTimeout(o.default.timer),t&&(o.default.timer=window.setTimeout(function(){return r.onAction(a.CANCEL_KEY)},t))},O=function(t){t.closeOnEsc?document.addEventListener("keyup",p):document.removeEventListener("keyup",p),t.dangerMode?v():g(),y(),_(t.closeOnClickOutside),k(t.timer)};e.default=O},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(1),r=n(3),i=n(37),a=n(38),s={title:null,text:null,icon:null,buttons:r.defaultButtonList,content:null,className:null,closeOnClickOutside:!0,closeOnEsc:!0,dangerMode:!1,timer:null},c=Object.assign({},s);e.setDefaults=function(t){c=Object.assign({},s,t)};var l=function(t){var e=t&&t.button,n=t&&t.buttons;return void 0!==e&&void 0!==n&&o.throwErr("Cannot set both 'button' and 'buttons' options!"),void 0!==e?{confirm:e}:n},u=function(t){return o.ordinalSuffixOf(t+1)},f=function(t,e){o.throwErr(u(e)+" argument ('"+t+"') is invalid")},d=function(t,e){var n=t+1,r=e[n];o.isPlainObject(r)||void 0===r||o.throwErr("Expected "+u(n)+" argument ('"+r+"') to be a plain object")},p=function(t,e){var n=t+1,r=e[n];void 0!==r&&o.throwErr("Unexpected "+u(n)+" argument ("+r+")")},m=function(t,e,n,r){var i=typeof e,a="string"===i,s=e instanceof Element;if(a){if(0===n)return{text:e};if(1===n)return{text:e,title:r[0]};if(2===n)return d(n,r),{icon:e};f(e,n)}else{if(s&&0===n)return d(n,r),{content:e};if(o.isPlainObject(e))return p(n,r),e;f(e,n)}};e.getOpts=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];var n={};t.forEach(function(e,o){var r=m(0,e,o,t);Object.assign(n,r)});var o=l(n);n.buttons=r.getButtonListOpts(o),delete n.button,n.content=i.getContentOpts(n.content);var u=Object.assign({},s,c,n);return Object.keys(u).forEach(function(t){a.DEPRECATED_OPTS[t]&&a.logDeprecation(t)}),u}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(1),r={element:"input",attributes:{placeholder:""}};e.getContentOpts=function(t){var e={};return o.isPlainObject(t)?Object.assign(e,t):t instanceof Element?{element:t}:"input"===t?r:null}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.logDeprecation=function(t){var n=e.DEPRECATED_OPTS[t],o=n.onlyRename,r=n.replacement,i=n.subOption,a=n.link,s=o?"renamed":"deprecated",c='SweetAlert warning: "'+t+'" option has been '+s+".";if(r){c+=" Please use"+(i?' "'+i+'" in ':" ")+'"'+r+'" instead.'}var l="https://sweetalert.js.org";c+=a?" More details: "+l+a:" More details: "+l+"/guides/#upgrading-from-1x",console.warn(c)},e.DEPRECATED_OPTS={type:{replacement:"icon",link:"/docs/#icon"},imageUrl:{replacement:"icon",link:"/docs/#icon"},customClass:{replacement:"className",onlyRename:!0,link:"/docs/#classname"},imageSize:{},showCancelButton:{replacement:"buttons",link:"/docs/#buttons"},showConfirmButton:{replacement:"button",link:"/docs/#button"},confirmButtonText:{replacement:"button",link:"/docs/#button"},confirmButtonColor:{},cancelButtonText:{replacement:"buttons",link:"/docs/#buttons"},closeOnConfirm:{replacement:"button",subOption:"closeModal",link:"/docs/#button"},closeOnCancel:{replacement:"buttons",subOption:"closeModal",link:"/docs/#buttons"},showLoaderOnConfirm:{replacement:"buttons"},animation:{},inputType:{replacement:"content",link:"/docs/#content"},inputValue:{replacement:"content",link:"/docs/#content"},inputPlaceholder:{replacement:"content",link:"/docs/#content"},html:{replacement:"content",link:"/docs/#content"},allowEscapeKey:{replacement:"closeOnEsc",onlyRename:!0,link:"/docs/#closeonesc"},allowClickOutside:{replacement:"closeOnClickOutside",onlyRename:!0,link:"/docs/#closeonclickoutside"}}}])});
 
admin/partials/enhanced-ecommerce-google-analytics-admin-display.php CHANGED
@@ -97,7 +97,7 @@ class TVC_Tabs {
97
  <li class="nav-item"><div class="border-left aga-tab nav-link <?php echo $this->is_active_tabs('about_plugin'); ?>"><a href="<?php echo $this->site_url.'about_plugin'; ?>">Premium <img class="new-img-blink" src='<?php echo plugins_url('../images/new-2.gif', __FILE__ ) ?>' /></a></div></li>
98
  <?php }*/ ?>
99
  <li class="tvc-menu-free-plan">
100
- <span>Free Plan: 500 Product sync limit</span>
101
  </li>
102
  </ul>
103
  </div>
97
  <li class="nav-item"><div class="border-left aga-tab nav-link <?php echo $this->is_active_tabs('about_plugin'); ?>"><a href="<?php echo $this->site_url.'about_plugin'; ?>">Premium <img class="new-img-blink" src='<?php echo plugins_url('../images/new-2.gif', __FILE__ ) ?>' /></a></div></li>
98
  <?php }*/ ?>
99
  <li class="tvc-menu-free-plan">
100
+ <span>Free Plan: 500 Product's sync limit</span>
101
  </li>
102
  </ul>
103
  </div>
admin/partials/general-fields.php CHANGED
@@ -316,7 +316,7 @@ Get richer data in the Analytics Multi-Channel Funnels reports."></i></label>
316
  <td>
317
  <label class = "align-middle">
318
  <?php $ga_PrivacyPolicy = !empty($data['ga_PrivacyPolicy']) ? 'checked' : ''; ?>
319
- <input type="checkbox" onchange="enableSubmit();" name="ga_PrivacyPolicy" id="ga_PrivacyPolicy" required="required" <?php echo $ga_PrivacyPolicy; ?>>
320
  <label for="ga_PrivacyPolicy">Accept Privacy Policy of Plugin</label>
321
 
322
  <p class="description">By using Tatvic Plugin, you agree to Tatvic plugin's <a href= "https://www.tatvic.com/privacy-policy/?ref=plugin_policy&utm_source=plugin_backend&utm_medium=woo_premium_plugin&utm_campaign=GDPR_complaince_ecomm_plugins" target="_blank">Privacy Policy</a></p>
@@ -355,11 +355,8 @@ Get richer data in the Analytics Multi-Channel Funnels reports."></i></label>
355
  </div>
356
  <div class="modal-footer">
357
  <a target="_blank" class="ee-oauth-container btn darken-4 white black-text" href="<?=esc_url($this->url)?>" style="text-transform:none; margin: 0 auto;">
358
- <div class="left">
359
- <img width="20px" style="margin-top:7px; margin-right:8px" alt="Google sign-in"
360
- src="https://upload.wikimedia.org/wikipedia/commons/thumb/5/53/Google_%22G%22_Logo.svg/512px-Google_%22G%22_Logo.svg.png" />
361
- </div>
362
- <p style="font-size: inherit; margin-top:5px; margin-right:8px; ">Sign In With Google</p>
363
  </a>
364
  <!--sigin with google end-->
365
  </div>
316
  <td>
317
  <label class = "align-middle">
318
  <?php $ga_PrivacyPolicy = !empty($data['ga_PrivacyPolicy']) ? 'checked' : ''; ?>
319
+ <input type="checkbox" name="ga_PrivacyPolicy" id="ga_PrivacyPolicy" required="required" <?php echo $ga_PrivacyPolicy; ?>>
320
  <label for="ga_PrivacyPolicy">Accept Privacy Policy of Plugin</label>
321
 
322
  <p class="description">By using Tatvic Plugin, you agree to Tatvic plugin's <a href= "https://www.tatvic.com/privacy-policy/?ref=plugin_policy&utm_source=plugin_backend&utm_medium=woo_premium_plugin&utm_campaign=GDPR_complaince_ecomm_plugins" target="_blank">Privacy Policy</a></p>
355
  </div>
356
  <div class="modal-footer">
357
  <a target="_blank" class="ee-oauth-container btn darken-4 white black-text" href="<?=esc_url($this->url)?>" style="text-transform:none; margin: 0 auto;">
358
+ <p style="font-size: inherit; margin-top:5px;"><img width="20px" style="margin-right:8px" alt="Google sign-in"
359
+ src="https://upload.wikimedia.org/wikipedia/commons/thumb/5/53/Google_%22G%22_Logo.svg/512px-Google_%22G%22_Logo.svg.png" />Sign In With Google</p>
 
 
 
360
  </a>
361
  <!--sigin with google end-->
362
  </div>
enhanced-ecommerce-google-analytics.php CHANGED
@@ -16,7 +16,7 @@
16
  * Plugin Name: Enhanced E-commerce for Woocommerce store
17
  * Plugin URI: https://www.tatvic.com/tatvic-labs/woocommerce-extension/
18
  * Description: Automates eCommerce tracking in Google Analytics, dynamic remarkting in Google Ads, and provides complete Google Shopping features.
19
- * Version: 3.0.1
20
  * Author: Tatvic
21
  * Author URI: www.tatvic.com
22
  * License: GPL-2.0+
@@ -38,7 +38,7 @@ if ( ! defined( 'WPINC' ) ) {
38
  * Start at version 1.0.0 and use SemVer - https://semver.org
39
  * Rename this for your plugin and update it as you release new versions.
40
  */
41
- define( 'PLUGIN_NAME_VERSION', '3.0.1' );
42
  $fullName = plugin_basename( __FILE__ );
43
  $dir = str_replace('/enhanced-ecommerce-google-analytics.php','',$fullName);
44
  if ( ! defined( 'ENHANCAD_PLUGIN_NAME' ) ) {
16
  * Plugin Name: Enhanced E-commerce for Woocommerce store
17
  * Plugin URI: https://www.tatvic.com/tatvic-labs/woocommerce-extension/
18
  * Description: Automates eCommerce tracking in Google Analytics, dynamic remarkting in Google Ads, and provides complete Google Shopping features.
19
+ * Version: 3.0.2
20
  * Author: Tatvic
21
  * Author URI: www.tatvic.com
22
  * License: GPL-2.0+
38
  * Start at version 1.0.0 and use SemVer - https://semver.org
39
  * Rename this for your plugin and update it as you release new versions.
40
  */
41
+ define( 'PLUGIN_NAME_VERSION', '3.0.2' );
42
  $fullName = plugin_basename( __FILE__ );
43
  $dir = str_replace('/enhanced-ecommerce-google-analytics.php','',$fullName);
44
  if ( ! defined( 'ENHANCAD_PLUGIN_NAME' ) ) {
includes/application/class-tvc-feed-controller.php DELETED
@@ -1,208 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Google Product Feed Controller Class.
5
- *
6
- * @package Google Product Feed Manager/Application/Classes
7
- * @version 1.3.0
8
- */
9
-
10
- if ( ! defined( 'ABSPATH' ) ) {
11
- exit;
12
- }
13
-
14
- if ( ! class_exists( 'TVC_Feed_Controller' ) ) :
15
-
16
- /**
17
- * Feed Controller Class
18
- *
19
- * @since 1.10.0
20
- */
21
- class TVC_Feed_Controller {
22
-
23
- /**
24
- * Removes a feed id from the feed queue
25
- *
26
- * @param string $feed_id
27
- */
28
- public static function remove_id_from_feed_queue( $feed_id ) {
29
- $feed_queue = self::get_feed_queue();
30
- $key = array_search( $feed_id, $feed_queue );
31
-
32
- if ( false !== $key ) {
33
- unset( $feed_queue[ $key ] );
34
- $feed_queue = array_values( $feed_queue ); // resort after unset
35
- update_site_option( 'tvc_feed_queue', $feed_queue );
36
-
37
- if ( self::feed_queue_is_empty() ) {
38
- tvc_clear_feed_process_data();
39
- }
40
- }
41
- }
42
-
43
- /**
44
- * Adds an feed id to the feed queue
45
- *
46
- * @param string $feed_id
47
- */
48
- public static function add_id_to_feed_queue( $feed_id ) {
49
- $feed_queue = self::get_feed_queue();
50
-
51
- if ( ! in_array( $feed_id, $feed_queue ) ) {
52
- array_push( $feed_queue, $feed_id );
53
- update_site_option( 'tvc_feed_queue', $feed_queue );
54
- }
55
- }
56
-
57
- /**
58
- * Gets the next feed id from the feed queue
59
- */
60
- public static function get_next_id_from_feed_queue() {
61
- $feed_queue = self::get_feed_queue();
62
-
63
- return count( $feed_queue ) > 0 ? $feed_queue[0] : false;
64
- }
65
-
66
- /**
67
- * Empties the feed queue
68
- */
69
- public static function clear_feed_queue() {
70
- update_site_option( 'tvc_feed_queue', array() );
71
- }
72
-
73
- /**
74
- * Checks if the feed queue is empty
75
- *
76
- * @return bool
77
- */
78
- public static function feed_queue_is_empty() {
79
- $queue = self::get_feed_queue();
80
-
81
- return ( count( $queue ) < 1 ) ? true : false;
82
- }
83
-
84
- /**
85
- * Returns the number of product ids that are still in the queue
86
- *
87
- * @since 2.3.0
88
- * @return int number of product ids still in the queue
89
- */
90
- public static function nr_ids_remaining_in_queue() {
91
- $queue = self::get_feed_queue();
92
-
93
- return count( $queue );
94
- }
95
-
96
- /**
97
- * Sets the background_process_is_running option
98
- *
99
- * @param bool $set (default false)
100
- */
101
- public static function set_feed_processing_flag( $set = false ) {
102
- $status = false !== $set ? 'true' : 'false';
103
- update_site_option( 'tvc_background_process_is_running', $status );
104
- }
105
-
106
- /**
107
- * Get the background_process_is_running status
108
- *
109
- * @return bool
110
- */
111
- public static function feed_is_processing() {
112
- $status = get_option( 'tvc_background_process_is_running', 'false' );
113
-
114
- return 'true' === $status ? true : false;
115
- }
116
-
117
- /**
118
- * Checks if a running feed size is still growing, in order to identify a failing feed process.
119
- *
120
- * @since 2.2.0
121
- *
122
- * @param string $feed_file String with the full path and name of the feed file.
123
- *
124
- * @return boolean False if the feed still grows, true if it stopped growing for a certain time.
125
- */
126
- public static function feed_processing_failed( $feed_file ) {
127
-
128
- if ( '' === $feed_file ) {
129
- return null;
130
- }
131
-
132
- $trans = get_transient( 'tvc_feed_file_size' );
133
-
134
- /**
135
- * Get the feed file name that's stored in the transient or take the $feed_file parameter.
136
- */
137
- $trans_feed_file = $trans ? substr( $trans, strrpos( $trans, '|' ) + 1 ) : $feed_file;
138
-
139
- /**
140
- * if the transient was empty or the feed file in the transient is not the currently active file, reset the transient
141
- */
142
- if ( false === $trans || $feed_file !== $trans_feed_file ) {
143
- $trans = '0|0|' . $feed_file;
144
- set_transient( 'tvc_feed_file_size', $trans, TVC_TRANSIENT_LIVE );
145
- }
146
-
147
- /**
148
- * Get the last data.
149
- */
150
- $stored = explode( '|', $trans );
151
- $prev_feed_size = $stored[0];
152
- $prev_feed_time_stamp = $stored[1];
153
- $feed_file = $trans_feed_file;
154
- $curr_feed_size = file_exists( $feed_file ) ? filesize( $feed_file ) : false;
155
-
156
- /**
157
- * If file does not exist, return true.
158
- */
159
- if ( false === $curr_feed_size ) {
160
- delete_transient( 'tvc_feed_file_size' ); // reset the counter
161
- return true;
162
- }
163
-
164
- // If the size of the feed has not grown.
165
- if ( $curr_feed_size <= $prev_feed_size ) {
166
- // And the delay time has passed.
167
- if ( $prev_feed_time_stamp + apply_filters( 'tvc_delay_failed_label', TVC_DELAY_FAILED_LABEL, $feed_file ) < time() ) {
168
- delete_transient( 'tvc_feed_file_size' ); // reset the counter
169
- return true;
170
- } else {
171
- return false;
172
- }
173
- } else { // If the file size has increased, reset the timer and return false.
174
- set_transient( 'tvc_feed_file_size', $curr_feed_size . '|' . time() . '|' . $feed_file, TVC_TRANSIENT_LIVE );
175
- return false;
176
- }
177
- }
178
-
179
- /**
180
- * Updates the timer that is used as reference to monitor if a file is growing during the feed production process.
181
- *
182
- * @since 2.11.0
183
- */
184
- public static function update_file_grow_monitoring_timer() {
185
- // Get the current monitor data.
186
- $grow_monitor_array = get_transient( 'tvc_feed_file_size' );
187
-
188
- if ( ! $grow_monitor_array ) { // The tvc_feed_file_size is not set in the non-background mode.
189
- return;
190
- }
191
-
192
- $grow_monitor_data = explode( '|', $grow_monitor_array );
193
-
194
- // Reset the timer part of the monitor.
195
- set_transient( 'tvc_feed_file_size', $grow_monitor_data[0] . '|' . time() . '|' . $grow_monitor_data[2], TVC_TRANSIENT_LIVE );
196
- }
197
-
198
- /**
199
- * Returns the current feed queue
200
- *
201
- * @return array with feed ids in the queue or an empty array
202
- */
203
- protected static function get_feed_queue() {
204
- return get_site_option( 'tvc_feed_queue', array() );
205
- }
206
- }
207
-
208
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/application/class-tvc-feed-support.php DELETED
@@ -1,301 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * TVC Product Feed Support Class.
5
- *
6
- * @package TVC Product Feed Manager/Application/Classes
7
- * @version 1.1.2
8
- */
9
-
10
- if ( ! defined( 'ABSPATH' ) ) {
11
- exit;
12
- }
13
-
14
- if ( ! class_exists( 'TVC_Feed_Support' ) ) :
15
-
16
- /**
17
- * Feed Support Class
18
- */
19
- class TVC_Feed_Support {
20
-
21
- /**
22
- * @param $query_object
23
- * @return bool|mixed
24
- */
25
- public function get_query_string_from_query_object( $query_object ) {
26
- // TODO: There's probably a better way to do this!
27
- foreach ( $query_object as $value ) {
28
- return $value;
29
- }
30
-
31
- return false;
32
- }
33
-
34
- /**
35
- * @param $feed_name
36
- * @param $relations_table
37
- * @return mixed|string
38
- */
39
- public function find_relation( $feed_name, $relations_table ) {
40
- $result = '';
41
-
42
- foreach ( $relations_table as $relation ) {
43
- if ( $relation['field'] === $feed_name ) {
44
- $result = $relation['db'];
45
- break;
46
- }
47
- }
48
-
49
- $relations_table = null;
50
-
51
- return $result;
52
- }
53
-
54
- /**
55
- * @param $term_id
56
- * @param $category_mapping
57
- * @return bool|int
58
- */
59
- public function category_is_selected( $term_id, $category_mapping ) {
60
- for ( $i = 0; $i < count( $category_mapping ); $i ++ ) {
61
- if ( (string) $term_id === $category_mapping[ $i ]->shopCategoryId ) {
62
- return $i;
63
- }
64
- }
65
- return false;
66
- }
67
-
68
- /**
69
- * @param $query_split
70
- * @param $product_data
71
- * @return bool
72
- */
73
- public function check_query_result_on_specific_row( $query_split, $product_data ) {
74
- $queries_class = new TVC_Feed_Queries;
75
- $current_data = key_exists( $query_split[1], $product_data ) ? $product_data[ $query_split[1] ] : '';
76
-
77
- // the following attributes can or will contain an array so surpress the type warning for these attributes
78
- $suppress_type_warning_attributes = apply_filters(
79
- 'tvc_suppress_type_warning_attributes',
80
- array(
81
- '_wp_attachement_metadata',
82
- )
83
- );
84
-
85
- if ( is_array( $current_data ) && ! in_array( $query_split[1], $suppress_type_warning_attributes ) ) { // A user had this once where he had an attribute that only showed "Array()" as value
86
- $product_id = key_exists( 'ID', $product_data ) ? $product_data['ID'] : 'unknown';
87
- $product_title = key_exists( 'post_title', $product_data ) ? $product_data['post_title'] : 'unknown';
88
-
89
- $error_message = "There is something wrong with the '" . $query_split[1] . "' attribute of product '$product_title' with id $product_id. It seems to be of a wrong type.";
90
-
91
- tvc_write_log_file( $error_message, 'debug' );
92
-
93
- $current_data = $current_data[0];
94
- }
95
-
96
- $result = true;
97
-
98
- switch ( $query_split[2] ) {
99
- case 0: // includes
100
- $result = $queries_class->includes_query( $query_split, $current_data );
101
- break;
102
-
103
- case 1: // does not include
104
- $result = $queries_class->does_not_include_query( $query_split, $current_data );
105
- break;
106
-
107
- case 2: // is equal to
108
- $result = $queries_class->is_equal_to_query( $query_split, $current_data );
109
- break;
110
-
111
- case 3: // is not equal to
112
- $result = $queries_class->is_not_equal_to_query( $query_split, $current_data );
113
- break;
114
-
115
- case 4: // is empty
116
- $result = $queries_class->is_empty( $current_data );
117
- break;
118
-
119
- case 5: // is not empty
120
- $result = $queries_class->is_not_empty_query( $current_data );
121
- break;
122
-
123
- case 6: // starts with
124
- $result = $queries_class->starts_with_query( $query_split, $current_data );
125
- break;
126
-
127
- case 7: // does not start with
128
- $result = $queries_class->does_not_start_with_query( $query_split, $current_data );
129
- break;
130
-
131
- case 8: // ends with
132
- $result = $queries_class->ends_with_query( $query_split, $current_data );
133
- break;
134
-
135
- case 9: // does not end with
136
- $result = $queries_class->does_not_end_with_query( $query_split, $current_data );
137
- break;
138
-
139
- case 10: // is greater than
140
- $result = $queries_class->is_greater_than_query( $query_split, $current_data );
141
- break;
142
-
143
- case 11: // is greater or equal to
144
- $result = $queries_class->is_greater_or_equal_to_query( $query_split, $current_data );
145
- break;
146
-
147
- case 12: // is smaller than
148
- $result = $queries_class->is_smaller_than_query( $query_split, $current_data );
149
- break;
150
-
151
- case 13: // is smaller or equal to
152
- $result = $queries_class->is_smaller_or_equal_to_query( $query_split, $current_data );
153
- break;
154
-
155
- case 14: // is between
156
- $result = $queries_class->is_between_query( $query_split, $current_data );
157
- break;
158
-
159
- default:
160
- break;
161
- }
162
-
163
- return $result;
164
- }
165
-
166
- /**
167
- * @param $current_value
168
- * @param $edit_string
169
- * @param $combination_string
170
- * @param $combined_data_elements
171
- * @param $feed_language
172
- * @return float|int|mixed|string
173
- */
174
- public function edit_value( $current_value, $edit_string, $combination_string, $combined_data_elements, $feed_language ) {
175
- $value_editors = new TVC_Feed_Value_Editors;
176
-
177
- $query_split = explode( '#', $edit_string );
178
-
179
- switch ( $query_split[1] ) {
180
- case 'change nothing':
181
- $result = $current_value;
182
- break;
183
-
184
- case 'overwrite':
185
- $result = $value_editors->overwrite_value( $query_split );
186
- break;
187
-
188
- case 'replace':
189
- $result = $value_editors->replace_value( $query_split, $current_value );
190
- break;
191
-
192
- case 'remove':
193
- $result = $value_editors->remove_value( $query_split, $current_value );
194
- break;
195
-
196
- case 'add prefix':
197
- $result = $value_editors->add_prefix_value( $query_split, $current_value );
198
- break;
199
-
200
- case 'add suffix':
201
- $result = $value_editors->add_suffix_value( $query_split, $current_value );
202
- break;
203
-
204
- case 'recalculate':
205
- $result = $value_editors->recalculate_value( $query_split, $current_value, $combination_string, $combined_data_elements, $feed_language );
206
- break;
207
-
208
- case 'convert to child-element':
209
- $result = $value_editors->convert_to_element( $query_split, $current_value );
210
- break;
211
-
212
- default:
213
- $result = false;
214
- break;
215
- }
216
-
217
- return $result;
218
- }
219
-
220
- /**
221
- * @param $feed_filter_array
222
- * @return array
223
- */
224
- public function get_column_names_from_feed_filter_array( $feed_filter_array ) {
225
- $empty_array = array();
226
- $filters = $feed_filter_array ? json_decode( $feed_filter_array[0]['meta_value'] ) : $empty_array;
227
- $column_names = array();
228
-
229
- foreach ( $filters as $filter ) {
230
- $query_string = $this->get_query_string_from_query_object( $filter );
231
- $query_parts = explode( '#', $query_string );
232
-
233
- array_push( $column_names, $query_parts[1] );
234
- }
235
-
236
- return $column_names;
237
- }
238
-
239
- /**
240
- * makes a unique feed for a copy of an existing feed
241
- *
242
- * @param string $current_feed_name
243
- *
244
- * @return string
245
- */
246
- public function next_unique_feed_name( $current_feed_name ) {
247
- $queries_class = new TVC_Queries();
248
-
249
- $title_end = explode( '_', $current_feed_name );
250
- $end_nr = end( $title_end );
251
-
252
- if ( count( $title_end ) > 1 && is_numeric( $end_nr ) ) {
253
- $new_title = substr_replace( $current_feed_name, ( $end_nr + 1 ), - strlen( $end_nr ) );
254
- } else {
255
- $new_title = $current_feed_name . '_1';
256
- $end_nr = '1';
257
- }
258
-
259
- // increase the end number of the title already exists
260
- while ( $queries_class->title_exists( $new_title ) ) {
261
- $new_title = substr_replace( $new_title, ( $end_nr + 1 ), - strlen( $end_nr ) );
262
- $end_nr ++;
263
- }
264
-
265
- return $new_title;
266
- }
267
-
268
- /**
269
- * Adds multiple single draft image urls to the product, specific for the Ricardo.ch channel
270
- *
271
- * @since 1.9.0
272
- *
273
- * @param array $product
274
- * @param array $images
275
- */
276
- public function process_ricardo_draftimages( &$product, $images ) {
277
- for ( $i = 0; $i < 10; $i ++ ) {
278
- $product["DraftImages[$i]"] = isset( $images[ $i ] ) ? $images[ $i ] : '';
279
- }
280
- }
281
-
282
- /**
283
- * Corrects issues where the active list is not the same as the data keys
284
- *
285
- * @since 1.9.0
286
- *
287
- * @param array $active_fields
288
- */
289
- public function correct_active_fields_list( &$active_fields ) {
290
- // correct for draft images in Ricardo.ch feed
291
- if ( ( $key = array_search( 'DraftImages', $active_fields ) ) !== false ) {
292
- unset( $active_fields[ $key ] );
293
- for ( $i = 0; $i < 10; $i ++ ) {
294
- array_push( $active_fields, "DraftImages[$i]" );
295
- }
296
- }
297
- }
298
- }
299
-
300
- // end of TVC_Feed_Support
301
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/application/google/gmc.txt DELETED
@@ -1,23 +0,0 @@
1
- id
2
- offerId
3
- title
4
- description
5
- item_group_id
6
- link
7
- image_link
8
- content_language
9
- target_country
10
- channel
11
- age_group
12
- availability
13
- availability_date
14
- brand
15
- color
16
- condition
17
- gender
18
- google_product_category
19
- gtin
20
- item_group_id
21
- mpn
22
- price
23
- sizes
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/application/google/gmc_attrbutes.json DELETED
@@ -1,118 +0,0 @@
1
- [
2
- {
3
- "field": "id",
4
- "required": 1,
5
- "desc": "Your product’s unique identifier",
6
- "wAttribute": "ID"
7
- },
8
- {
9
- "field": "title",
10
- "required": 1,
11
- "desc": "Your product’s name",
12
- "wAttribute": "post_title"
13
- },
14
- {
15
- "field": "description",
16
- "required": 1,
17
- "desc": "Your product’s description",
18
- "wAttribute": "post_excerpt"
19
- },
20
- {
21
- "field": "link",
22
- "desc": "Your product’s landing page",
23
- "required": 1
24
- },
25
- {
26
- "field": "image_link",
27
- "required": 1,
28
- "desc": "The URL of your product’s main image",
29
- "wAttribute": "_wp_attached_file"
30
- },
31
- {
32
- "field": "price",
33
- "required": 1,
34
- "desc": "Your product’s price",
35
- "wAttribute": "_sale_price"
36
-
37
- },
38
- {
39
- "field": "gtin",
40
- "desc": "Your product’s Global Trade Item Number (GTIN). Required for all new products with an assigned GTIN.",
41
- "wAttribute": "tvc_product_gtin"
42
- },
43
- {
44
- "field": "mpn",
45
- "desc": "Your product’s Global Trade Item Number (GTIN). Required for all new products with an assigned GTIN.",
46
- "wAttribute": "tvc_product_mpn"
47
- },
48
- {
49
- "field": "offer_id",
50
- "required": 1,
51
- "desc": "offer id",
52
- "wAttribute": "ID"
53
- },
54
- {
55
- "field": "brand",
56
- "desc": "Your product’s brand name",
57
- "wAttribute": "tvc_product_brand"
58
- },
59
- {
60
- "field": "availability",
61
- "desc": "Your product's availability",
62
- "wAttribute": "_stock_status"
63
- },
64
- {
65
- "field": "item_group_id",
66
- "desc": "ID for a group of products that come in different versions (variants)"
67
- },
68
- {
69
- "field": "sizes",
70
- "desc": "Your product’s size"
71
- },
72
- {
73
- "field": "color",
74
- "desc": "Your product’s color(s)"
75
- },
76
- {
77
- "field": "age_group",
78
- "desc": "The demographic for which your product is intended"
79
- },
80
- {
81
- "field": "gender",
82
- "desc": "The gender for which your product is intended"
83
- },
84
- {
85
- "field": "condition",
86
- "desc": "The condition of your product at time of sale"
87
- },
88
- {
89
-
90
- "field": "shipping",
91
- "desc": "Your product's shipping cost and the locations your product ships to"
92
- },
93
- {
94
-
95
- "field": "tax",
96
- "desc": "Your product’s sales tax rate in percent"
97
- },
98
- {
99
- "field": "product_type",
100
- "desc": "Product category that you define for your product"
101
- },
102
- {
103
- "field": "google_product_category",
104
- "desc": "product category"
105
- },
106
- {
107
- "field": "content_language",
108
- "desc": "content language"
109
- },
110
- {
111
- "field": "target_country",
112
- "desc": "Country for Google Shopping Listing"
113
- },
114
- {
115
- "field": "channel",
116
- "desc": "channel"
117
- }
118
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/application/google/google.txt DELETED
@@ -1,84 +0,0 @@
1
- 1 1 id
2
- 2 1 title
3
- 3 1 description
4
- 4 0 google_product_category
5
- 5 4 product_type
6
- 6 1 link
7
- 7 4 mobile_link
8
- 8 1 image_link
9
- 9 1 price
10
- 10 1 condition
11
- 11 1 availability
12
- 12 4 availability_date
13
- 13 0 brand
14
- 14 1 gtin
15
- 15 4 mpn
16
- 16 0 item_group_id
17
- 17 4 additional_image_link
18
- 18 4 sale_price
19
- 19 4 sale_price_effective_date
20
- 20 0 gender
21
- 21 0 age_group
22
- 22 0 color
23
- 23 0 size
24
- 24 4 material
25
- 25 4 pattern
26
- 26 4 shipping_weight
27
- 27 4 expiration_date
28
- 28 4 adwords_redirect
29
- 29 1 adult
30
- 30 0 multipack
31
- 31 1 identifier_exists
32
- 32 4 size_type
33
- 33 4 size_system
34
- 34 0 shipping
35
- 35 4 shipping_label
36
- 36 0 is_bundle
37
- 37 4 custom_label_0
38
- 38 4 custom_label_1
39
- 39 4 custom_label_2
40
- 40 4 custom_label_3
41
- 41 4 custom_label_4
42
- 42 4 unit_pricing_measure
43
- 43 4 unit_pricing_base_measure
44
- 44 4 energy_efficiency_class
45
- 45 4 min_energy_efficiency_class
46
- 46 4 max_energy_efficiency_class
47
- 47 0 tax
48
- 48 4 installment
49
- 49 4 loyalty_points
50
- 50 4 promotion_id
51
- 51 4 shipping_length
52
- 52 4 shipping_width
53
- 53 4 shipping_height
54
- 54 4 installment-months
55
- 55 4 installment-amount
56
- 56 4 loyalty_points-name
57
- 57 4 loyalty_points-pointsValue
58
- 58 4 loyalty_points-ratio
59
- 59 4 shipping-country
60
- 60 4 shipping-region
61
- 61 4 shipping-service
62
- 62 4 shipping-price
63
- 63 4 transit_time_label
64
- 64 4 tax-country
65
- 65 4 tax-region
66
- 66 4 tax-rate
67
- 67 4 tax-tax_ship
68
- 68 4 tax_category
69
- 69 4 display_ads_id
70
- 70 4 display_ads_similar_id
71
- 71 4 display_ads_title
72
- 72 4 display_ads_link
73
- 73 4 display_ads_value
74
- 74 4 excluded_destination
75
- 75 4 included_destination
76
- 76 4 adwords_grouping
77
- 77 4 adwords_labels
78
- 78 4 min_handling_time
79
- 79 4 max_handling_time
80
- 80 4 cost_of_goods_sold
81
- 81 0 subscription_cost
82
- 82 0 subscription_cost-period
83
- 83 0 subscription_cost-period_length
84
- 84 0 subscription_cost-amount
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/application/google/taxonomy.en-US.txt DELETED
@@ -1,5583 +0,0 @@
1
- # Google_Product_Taxonomy_Version: 2019-07-10
2
- Animals & Pet Supplies
3
- Animals & Pet Supplies > Live Animals
4
- Animals & Pet Supplies > Pet Supplies
5
- Animals & Pet Supplies > Pet Supplies > Bird Supplies
6
- Animals & Pet Supplies > Pet Supplies > Bird Supplies > Bird Cage Accessories
7
- Animals & Pet Supplies > Pet Supplies > Bird Supplies > Bird Cage Accessories > Bird Cage Bird Baths
8
- Animals & Pet Supplies > Pet Supplies > Bird Supplies > Bird Cage Accessories > Bird Cage Food & Water Dishes
9
- Animals & Pet Supplies > Pet Supplies > Bird Supplies > Bird Cages & Stands
10
- Animals & Pet Supplies > Pet Supplies > Bird Supplies > Bird Food
11
- Animals & Pet Supplies > Pet Supplies > Bird Supplies > Bird Gyms & Playstands
12
- Animals & Pet Supplies > Pet Supplies > Bird Supplies > Bird Ladders & Perches
13
- Animals & Pet Supplies > Pet Supplies > Bird Supplies > Bird Toys
14
- Animals & Pet Supplies > Pet Supplies > Bird Supplies > Bird Treats
15
- Animals & Pet Supplies > Pet Supplies > Cat Supplies
16
- Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Apparel
17
- Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Beds
18
- Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Food
19
- Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Food > Non-prescription Cat Food
20
- Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Food > Prescription Cat Food
21
- Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Furniture
22
- Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Furniture Accessories
23
- Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Litter
24
- Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Litter Box Liners
25
- Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Litter Box Mats
26
- Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Litter Boxes
27
- Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Toys
28
- Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Treats
29
- Animals & Pet Supplies > Pet Supplies > Dog Supplies
30
- Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Apparel
31
- Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Beds
32
- Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Diaper Pads & Liners
33
- Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Diapers
34
- Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Food
35
- Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Food > Non-prescription Dog Food
36
- Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Food > Prescription Dog Food
37
- Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Houses
38
- Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Kennel & Run Accessories
39
- Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Kennels & Runs
40
- Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Toys
41
- Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Treadmills
42
- Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Treats
43
- Animals & Pet Supplies > Pet Supplies > Fish Supplies
44
- Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquarium & Pond Tubing
45
- Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquarium Air Stones & Diffusers
46
- Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquarium Cleaning Supplies
47
- Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquarium Decor
48
- Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquarium Filters
49
- Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquarium Fish Nets
50
- Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquarium Gravel & Substrates
51
- Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquarium Lighting
52
- Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquarium Overflow Boxes
53
- Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquarium Stands
54
- Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquarium Temperature Controllers
55
- Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquarium Water Treatments
56
- Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquariums
57
- Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquatic Plant Fertilizers
58
- Animals & Pet Supplies > Pet Supplies > Fish Supplies > Fish Feeders
59
- Animals & Pet Supplies > Pet Supplies > Fish Supplies > Fish Food
60
- Animals & Pet Supplies > Pet Supplies > Pet Agility Equipment
61
- Animals & Pet Supplies > Pet Supplies > Pet Apparel Hangers
62
- Animals & Pet Supplies > Pet Supplies > Pet Bed Accessories
63
- Animals & Pet Supplies > Pet Supplies > Pet Bells & Charms
64
- Animals & Pet Supplies > Pet Supplies > Pet Biometric Monitors
65
- Animals & Pet Supplies > Pet Supplies > Pet Biometric Monitors > Pet Glucose Meters
66
- Animals & Pet Supplies > Pet Supplies > Pet Biometric Monitors > Pet Pedometers
67
- Animals & Pet Supplies > Pet Supplies > Pet Biometric Monitors > Pet Thermometers
68
- Animals & Pet Supplies > Pet Supplies > Pet Bowl Mats
69
- Animals & Pet Supplies > Pet Supplies > Pet Bowl Stands
70
- Animals & Pet Supplies > Pet Supplies > Pet Bowls, Feeders & Waterers
71
- Animals & Pet Supplies > Pet Supplies > Pet Carrier & Crate Accessories
72
- Animals & Pet Supplies > Pet Supplies > Pet Carriers & Crates
73
- Animals & Pet Supplies > Pet Supplies > Pet Collars & Harnesses
74
- Animals & Pet Supplies > Pet Supplies > Pet Containment Systems
75
- Animals & Pet Supplies > Pet Supplies > Pet Door Accessories
76
- Animals & Pet Supplies > Pet Supplies > Pet Doors
77
- Animals & Pet Supplies > Pet Supplies > Pet Eye Drops & Lubricants
78
- Animals & Pet Supplies > Pet Supplies > Pet First Aid & Emergency Kits
79
- Animals & Pet Supplies > Pet Supplies > Pet Flea & Tick Control
80
- Animals & Pet Supplies > Pet Supplies > Pet Food Containers
81
- Animals & Pet Supplies > Pet Supplies > Pet Food Scoops
82
- Animals & Pet Supplies > Pet Supplies > Pet Grooming Supplies
83
- Animals & Pet Supplies > Pet Supplies > Pet Grooming Supplies > Pet Combs & Brushes
84
- Animals & Pet Supplies > Pet Supplies > Pet Grooming Supplies > Pet Fragrances & Deodorizing Sprays
85
- Animals & Pet Supplies > Pet Supplies > Pet Grooming Supplies > Pet Hair Clippers & Trimmers
86
- Animals & Pet Supplies > Pet Supplies > Pet Grooming Supplies > Pet Hair Dryers
87
- Animals & Pet Supplies > Pet Supplies > Pet Grooming Supplies > Pet Nail Polish
88
- Animals & Pet Supplies > Pet Supplies > Pet Grooming Supplies > Pet Nail Tools
89
- Animals & Pet Supplies > Pet Supplies > Pet Grooming Supplies > Pet Shampoo & Conditioner
90
- Animals & Pet Supplies > Pet Supplies > Pet Grooming Supplies > Pet Wipes
91
- Animals & Pet Supplies > Pet Supplies > Pet Heating Pad Accessories
92
- Animals & Pet Supplies > Pet Supplies > Pet Heating Pads
93
- Animals & Pet Supplies > Pet Supplies > Pet ID Tags
94
- Animals & Pet Supplies > Pet Supplies > Pet Leash Extensions
95
- Animals & Pet Supplies > Pet Supplies > Pet Leashes
96
- Animals & Pet Supplies > Pet Supplies > Pet Medical Collars
97
- Animals & Pet Supplies > Pet Supplies > Pet Medical Tape & Bandages
98
- Animals & Pet Supplies > Pet Supplies > Pet Medicine
99
- Animals & Pet Supplies > Pet Supplies > Pet Muzzles
100
- Animals & Pet Supplies > Pet Supplies > Pet Oral Care Supplies
101
- Animals & Pet Supplies > Pet Supplies > Pet Playpens
102
- Animals & Pet Supplies > Pet Supplies > Pet Steps & Ramps
103
- Animals & Pet Supplies > Pet Supplies > Pet Strollers
104
- Animals & Pet Supplies > Pet Supplies > Pet Sunscreen
105
- Animals & Pet Supplies > Pet Supplies > Pet Training Aids
106
- Animals & Pet Supplies > Pet Supplies > Pet Training Aids > Pet Training Clickers & Treat Dispensers
107
- Animals & Pet Supplies > Pet Supplies > Pet Training Aids > Pet Training Pad Holders
108
- Animals & Pet Supplies > Pet Supplies > Pet Training Aids > Pet Training Pads
109
- Animals & Pet Supplies > Pet Supplies > Pet Training Aids > Pet Training Sprays & Solutions
110
- Animals & Pet Supplies > Pet Supplies > Pet Vitamins & Supplements
111
- Animals & Pet Supplies > Pet Supplies > Pet Waste Bag Dispensers & Holders
112
- Animals & Pet Supplies > Pet Supplies > Pet Waste Bags
113
- Animals & Pet Supplies > Pet Supplies > Pet Waste Disposal Systems & Tools
114
- Animals & Pet Supplies > Pet Supplies > Reptile & Amphibian Supplies
115
- Animals & Pet Supplies > Pet Supplies > Reptile & Amphibian Supplies > Reptile & Amphibian Food
116
- Animals & Pet Supplies > Pet Supplies > Reptile & Amphibian Supplies > Reptile & Amphibian Habitat Accessories
117
- Animals & Pet Supplies > Pet Supplies > Reptile & Amphibian Supplies > Reptile & Amphibian Habitat Heating & Lighting
118
- Animals & Pet Supplies > Pet Supplies > Reptile & Amphibian Supplies > Reptile & Amphibian Habitats
119
- Animals & Pet Supplies > Pet Supplies > Reptile & Amphibian Supplies > Reptile & Amphibian Substrates
120
- Animals & Pet Supplies > Pet Supplies > Small Animal Supplies
121
- Animals & Pet Supplies > Pet Supplies > Small Animal Supplies > Small Animal Bedding
122
- Animals & Pet Supplies > Pet Supplies > Small Animal Supplies > Small Animal Food
123
- Animals & Pet Supplies > Pet Supplies > Small Animal Supplies > Small Animal Habitat Accessories
124
- Animals & Pet Supplies > Pet Supplies > Small Animal Supplies > Small Animal Habitats & Cages
125
- Animals & Pet Supplies > Pet Supplies > Small Animal Supplies > Small Animal Treats
126
- Animals & Pet Supplies > Pet Supplies > Vehicle Pet Barriers
127
- Apparel & Accessories
128
- Apparel & Accessories > Clothing
129
- Apparel & Accessories > Clothing > Activewear
130
- Apparel & Accessories > Clothing > Activewear > Bicycle Activewear
131
- Apparel & Accessories > Clothing > Activewear > Bicycle Activewear > Bicycle Bibs
132
- Apparel & Accessories > Clothing > Activewear > Bicycle Activewear > Bicycle Jerseys
133
- Apparel & Accessories > Clothing > Activewear > Bicycle Activewear > Bicycle Shorts & Briefs
134
- Apparel & Accessories > Clothing > Activewear > Bicycle Activewear > Bicycle Skinsuits
135
- Apparel & Accessories > Clothing > Activewear > Bicycle Activewear > Bicycle Tights
136
- Apparel & Accessories > Clothing > Activewear > Boxing Shorts
137
- Apparel & Accessories > Clothing > Activewear > Dance Dresses, Skirts & Costumes
138
- Apparel & Accessories > Clothing > Activewear > Football Pants
139
- Apparel & Accessories > Clothing > Activewear > Hunting Clothing
140
- Apparel & Accessories > Clothing > Activewear > Hunting Clothing > Ghillie Suits
141
- Apparel & Accessories > Clothing > Activewear > Hunting Clothing > Hunting & Fishing Vests
142
- Apparel & Accessories > Clothing > Activewear > Hunting Clothing > Hunting & Tactical Pants
143
- Apparel & Accessories > Clothing > Activewear > Martial Arts Shorts
144
- Apparel & Accessories > Clothing > Activewear > Motorcycle Protective Clothing
145
- Apparel & Accessories > Clothing > Activewear > Motorcycle Protective Clothing > Motorcycle Jackets
146
- Apparel & Accessories > Clothing > Activewear > Motorcycle Protective Clothing > Motorcycle Pants
147
- Apparel & Accessories > Clothing > Activewear > Motorcycle Protective Clothing > Motorcycle Suits
148
- Apparel & Accessories > Clothing > Activewear > Paintball Clothing
149
- Apparel & Accessories > Clothing > Baby & Toddler Clothing
150
- Apparel & Accessories > Clothing > Baby & Toddler Clothing > Baby & Toddler Bottoms
151
- Apparel & Accessories > Clothing > Baby & Toddler Clothing > Baby & Toddler Diaper Covers
152
- Apparel & Accessories > Clothing > Baby & Toddler Clothing > Baby & Toddler Dresses
153
- Apparel & Accessories > Clothing > Baby & Toddler Clothing > Baby & Toddler Outerwear
154
- Apparel & Accessories > Clothing > Baby & Toddler Clothing > Baby & Toddler Outfits
155
- Apparel & Accessories > Clothing > Baby & Toddler Clothing > Baby & Toddler Sleepwear
156
- Apparel & Accessories > Clothing > Baby & Toddler Clothing > Baby & Toddler Socks & Tights
157
- Apparel & Accessories > Clothing > Baby & Toddler Clothing > Baby & Toddler Swimwear
158
- Apparel & Accessories > Clothing > Baby & Toddler Clothing > Baby & Toddler Tops
159
- Apparel & Accessories > Clothing > Baby & Toddler Clothing > Baby One-Pieces
160
- Apparel & Accessories > Clothing > Baby & Toddler Clothing > Toddler Underwear
161
- Apparel & Accessories > Clothing > Dresses
162
- Apparel & Accessories > Clothing > One-Pieces
163
- Apparel & Accessories > Clothing > One-Pieces > Jumpsuits & Rompers
164
- Apparel & Accessories > Clothing > One-Pieces > Leotards & Unitards
165
- Apparel & Accessories > Clothing > One-Pieces > Overalls
166
- Apparel & Accessories > Clothing > Outerwear
167
- Apparel & Accessories > Clothing > Outerwear > Chaps
168
- Apparel & Accessories > Clothing > Outerwear > Coats & Jackets
169
- Apparel & Accessories > Clothing > Outerwear > Rain Pants
170
- Apparel & Accessories > Clothing > Outerwear > Rain Suits
171
- Apparel & Accessories > Clothing > Outerwear > Snow Pants & Suits
172
- Apparel & Accessories > Clothing > Outerwear > Vests
173
- Apparel & Accessories > Clothing > Outfit Sets
174
- Apparel & Accessories > Clothing > Pants
175
- Apparel & Accessories > Clothing > Shirts & Tops
176
- Apparel & Accessories > Clothing > Shorts
177
- Apparel & Accessories > Clothing > Skirts
178
- Apparel & Accessories > Clothing > Skorts
179
- Apparel & Accessories > Clothing > Sleepwear & Loungewear
180
- Apparel & Accessories > Clothing > Sleepwear & Loungewear > Loungewear
181
- Apparel & Accessories > Clothing > Sleepwear & Loungewear > Nightgowns
182
- Apparel & Accessories > Clothing > Sleepwear & Loungewear > Pajamas
183
- Apparel & Accessories > Clothing > Sleepwear & Loungewear > Robes
184
- Apparel & Accessories > Clothing > Suits
185
- Apparel & Accessories > Clothing > Suits > Pant Suits
186
- Apparel & Accessories > Clothing > Suits > Skirt Suits
187
- Apparel & Accessories > Clothing > Suits > Tuxedos
188
- Apparel & Accessories > Clothing > Swimwear
189
- Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing
190
- Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Dirndls
191
- Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Hakama Trousers
192
- Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Japanese Black Formal Wear
193
- Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Kimono Outerwear
194
- Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Kimonos
195
- Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Religious Ceremonial Clothing
196
- Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Religious Ceremonial Clothing > Baptism & Communion Dresses
197
- Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Saris & Lehengas
198
- Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Traditional Leather Pants
199
- Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Yukata
200
- Apparel & Accessories > Clothing > Underwear & Socks
201
- Apparel & Accessories > Clothing > Underwear & Socks > Bra Accessories
202
- Apparel & Accessories > Clothing > Underwear & Socks > Bra Accessories > Bra Strap Pads
203
- Apparel & Accessories > Clothing > Underwear & Socks > Bra Accessories > Bra Straps & Extenders
204
- Apparel & Accessories > Clothing > Underwear & Socks > Bra Accessories > Breast Enhancing Inserts
205
- Apparel & Accessories > Clothing > Underwear & Socks > Bra Accessories > Breast Petals & Concealers
206
- Apparel & Accessories > Clothing > Underwear & Socks > Bras
207
- Apparel & Accessories > Clothing > Underwear & Socks > Hosiery
208
- Apparel & Accessories > Clothing > Underwear & Socks > Jock Straps
209
- Apparel & Accessories > Clothing > Underwear & Socks > Lingerie
210
- Apparel & Accessories > Clothing > Underwear & Socks > Lingerie Accessories
211
- Apparel & Accessories > Clothing > Underwear & Socks > Lingerie Accessories > Garter Belts
212
- Apparel & Accessories > Clothing > Underwear & Socks > Lingerie Accessories > Garters
213
- Apparel & Accessories > Clothing > Underwear & Socks > Long Johns
214
- Apparel & Accessories > Clothing > Underwear & Socks > Petticoats & Pettipants
215
- Apparel & Accessories > Clothing > Underwear & Socks > Shapewear
216
- Apparel & Accessories > Clothing > Underwear & Socks > Socks
217
- Apparel & Accessories > Clothing > Underwear & Socks > Undershirts
218
- Apparel & Accessories > Clothing > Underwear & Socks > Underwear
219
- Apparel & Accessories > Clothing > Underwear & Socks > Underwear Slips
220
- Apparel & Accessories > Clothing > Uniforms
221
- Apparel & Accessories > Clothing > Uniforms > Contractor Pants & Coveralls
222
- Apparel & Accessories > Clothing > Uniforms > Flight Suits
223
- Apparel & Accessories > Clothing > Uniforms > Food Service Uniforms
224
- Apparel & Accessories > Clothing > Uniforms > Food Service Uniforms > Chef's Hats
225
- Apparel & Accessories > Clothing > Uniforms > Food Service Uniforms > Chef's Jackets
226
- Apparel & Accessories > Clothing > Uniforms > Food Service Uniforms > Chef's Pants
227
- Apparel & Accessories > Clothing > Uniforms > Military Uniforms
228
- Apparel & Accessories > Clothing > Uniforms > School Uniforms
229
- Apparel & Accessories > Clothing > Uniforms > Security Uniforms
230
- Apparel & Accessories > Clothing > Uniforms > Sports Uniforms
231
- Apparel & Accessories > Clothing > Uniforms > Sports Uniforms > Baseball Uniforms
232
- Apparel & Accessories > Clothing > Uniforms > Sports Uniforms > Basketball Uniforms
233
- Apparel & Accessories > Clothing > Uniforms > Sports Uniforms > Cheerleading Uniforms
234
- Apparel & Accessories > Clothing > Uniforms > Sports Uniforms > Cricket Uniforms
235
- Apparel & Accessories > Clothing > Uniforms > Sports Uniforms > Football Uniforms
236
- Apparel & Accessories > Clothing > Uniforms > Sports Uniforms > Hockey Uniforms
237
- Apparel & Accessories > Clothing > Uniforms > Sports Uniforms > Martial Arts Uniforms
238
- Apparel & Accessories > Clothing > Uniforms > Sports Uniforms > Officiating Uniforms
239
- Apparel & Accessories > Clothing > Uniforms > Sports Uniforms > Soccer Uniforms
240
- Apparel & Accessories > Clothing > Uniforms > Sports Uniforms > Softball Uniforms
241
- Apparel & Accessories > Clothing > Uniforms > Sports Uniforms > Wrestling Uniforms
242
- Apparel & Accessories > Clothing > Uniforms > White Coats
243
- Apparel & Accessories > Clothing > Wedding & Bridal Party Dresses
244
- Apparel & Accessories > Clothing > Wedding & Bridal Party Dresses > Bridal Party Dresses
245
- Apparel & Accessories > Clothing > Wedding & Bridal Party Dresses > Wedding Dresses
246
- Apparel & Accessories > Clothing Accessories
247
- Apparel & Accessories > Clothing Accessories > Arm Warmers & Sleeves
248
- Apparel & Accessories > Clothing Accessories > Baby & Toddler Clothing Accessories
249
- Apparel & Accessories > Clothing Accessories > Baby & Toddler Clothing Accessories > Baby & Toddler Belts
250
- Apparel & Accessories > Clothing Accessories > Baby & Toddler Clothing Accessories > Baby & Toddler Gloves & Mittens
251
- Apparel & Accessories > Clothing Accessories > Baby & Toddler Clothing Accessories > Baby & Toddler Hats
252
- Apparel & Accessories > Clothing Accessories > Baby & Toddler Clothing Accessories > Baby Protective Wear
253
- Apparel & Accessories > Clothing Accessories > Balaclavas
254
- Apparel & Accessories > Clothing Accessories > Bandanas & Headties
255
- Apparel & Accessories > Clothing Accessories > Bandanas & Headties > Bandanas
256
- Apparel & Accessories > Clothing Accessories > Bandanas & Headties > Hair Care Wraps
257
- Apparel & Accessories > Clothing Accessories > Belt Buckles
258
- Apparel & Accessories > Clothing Accessories > Belts
259
- Apparel & Accessories > Clothing Accessories > Bridal Accessories
260
- Apparel & Accessories > Clothing Accessories > Bridal Accessories > Bridal Veils
261
- Apparel & Accessories > Clothing Accessories > Button Studs
262
- Apparel & Accessories > Clothing Accessories > Collar Stays
263
- Apparel & Accessories > Clothing Accessories > Cufflinks
264
- Apparel & Accessories > Clothing Accessories > Decorative Fans
265
- Apparel & Accessories > Clothing Accessories > Earmuffs
266
- Apparel & Accessories > Clothing Accessories > Gloves & Mittens
267
- Apparel & Accessories > Clothing Accessories > Hair Accessories
268
- Apparel & Accessories > Clothing Accessories > Hair Accessories > Hair Bun & Volume Shapers
269
- Apparel & Accessories > Clothing Accessories > Hair Accessories > Hair Combs
270
- Apparel & Accessories > Clothing Accessories > Hair Accessories > Hair Extensions
271
- Apparel & Accessories > Clothing Accessories > Hair Accessories > Hair Forks & Sticks
272
- Apparel & Accessories > Clothing Accessories > Hair Accessories > Hair Nets
273
- Apparel & Accessories > Clothing Accessories > Hair Accessories > Hair Pins, Claws & Clips
274
- Apparel & Accessories > Clothing Accessories > Hair Accessories > Hair Pins, Claws & Clips > Barrettes
275
- Apparel & Accessories > Clothing Accessories > Hair Accessories > Hair Pins, Claws & Clips > Hair Claws & Clips
276
- Apparel & Accessories > Clothing Accessories > Hair Accessories > Hair Pins, Claws & Clips > Hair Pins
277
- Apparel & Accessories > Clothing Accessories > Hair Accessories > Hair Wreaths
278
- Apparel & Accessories > Clothing Accessories > Hair Accessories > Headbands
279
- Apparel & Accessories > Clothing Accessories > Hair Accessories > Ponytail Holders
280
- Apparel & Accessories > Clothing Accessories > Hair Accessories > Tiaras
281
- Apparel & Accessories > Clothing Accessories > Hair Accessories > Wig Accessories
282
- Apparel & Accessories > Clothing Accessories > Hair Accessories > Wig Accessories > Wig Caps
283
- Apparel & Accessories > Clothing Accessories > Hair Accessories > Wig Accessories > Wig Glue & Tape
284
- Apparel & Accessories > Clothing Accessories > Hair Accessories > Wigs
285
- Apparel & Accessories > Clothing Accessories > Hand Muffs
286
- Apparel & Accessories > Clothing Accessories > Handkerchiefs
287
- Apparel & Accessories > Clothing Accessories > Hats
288
- Apparel & Accessories > Clothing Accessories > Headwear
289
- Apparel & Accessories > Clothing Accessories > Headwear > Fascinators
290
- Apparel & Accessories > Clothing Accessories > Headwear > Headdresses
291
- Apparel & Accessories > Clothing Accessories > Headwear > Turbans
292
- Apparel & Accessories > Clothing Accessories > Leg Warmers
293
- Apparel & Accessories > Clothing Accessories > Leis
294
- Apparel & Accessories > Clothing Accessories > Maternity Belts & Support Bands
295
- Apparel & Accessories > Clothing Accessories > Neck Gaiters
296
- Apparel & Accessories > Clothing Accessories > Neckties
297
- Apparel & Accessories > Clothing Accessories > Pinback Buttons
298
- Apparel & Accessories > Clothing Accessories > Sashes
299
- Apparel & Accessories > Clothing Accessories > Scarves & Shawls
300
- Apparel & Accessories > Clothing Accessories > Scarves & Shawls > Scarves
301
- Apparel & Accessories > Clothing Accessories > Scarves & Shawls > Shawls
302
- Apparel & Accessories > Clothing Accessories > Sunglasses
303
- Apparel & Accessories > Clothing Accessories > Suspenders
304
- Apparel