Enhanced Ecommerce Google Analytics Plugin for WooCommerce - Version 3.1.0

Version Description

  • 15/06/2021 =
    • Enhanced user experience with new UI
    • Earlier some users were able to see 25 products only on product sync dashboard, the issue is fixed now
    • Added customized notifications to track the activty and functioning of plugin
    • Added customer support number to quickly reach out to us for any query
    • API performance enhancements
Download this release

Release Info

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

Code changes from version 3.0.5 to 3.1.0

Files changed (63) hide show
  1. admin/class-enhanced-ecommerce-google-analytics-admin.php +246 -83
  2. admin/class-enhanced-ecommerce-google-analytics-settings.php +0 -16
  3. admin/class-tvc-admin-auto-product-sync-helper.php +34 -17
  4. admin/class-tvc-admin-db-helper.php +49 -5
  5. admin/class-tvc-admin-helper.php +317 -67
  6. admin/css/bootstrap.rtl.min.css +7 -0
  7. admin/css/custom-style.css +2071 -583
  8. admin/css/dataTables.bootstrap4.min.css +1 -0
  9. admin/css/enhanced-ecommerce-google-analytics-admin.css +156 -167
  10. admin/images/banner.png +0 -0
  11. admin/images/cotlw.gif +0 -0
  12. admin/images/icon/add.svg +35 -0
  13. admin/images/icon/arrow-down-sign-to-navigate.svg +1 -0
  14. admin/images/icon/information.svg +1 -0
  15. admin/images/icon/informationI.svg +1 -0
  16. admin/images/icon/lamp.svg +1 -0
  17. admin/images/icon/left-angle-arrow.svg +1 -0
  18. admin/images/icon/notification.svg +1 -0
  19. admin/images/icon/refresh.svg +1 -0
  20. admin/images/icon/right-arrow.svg +1 -0
  21. admin/images/icon/tick-round.svg +1 -0
  22. admin/images/icon/undraw_update_uxn2.svg +1 -0
  23. admin/images/new-2.gif +0 -0
  24. admin/images/new-img.gif +0 -0
  25. admin/images/plugin_bk.png +0 -0
  26. admin/images/woo_banner_adv.gif +0 -0
  27. admin/js/dataTables.bootstrap4.min.js +14 -0
  28. admin/js/jquery.dataTables.min.js +184 -0
  29. admin/js/slick.min.js +1 -0
  30. admin/js/tvc-ee-custom.js +7 -0
  31. admin/partials/about-plugin.php +2 -2
  32. admin/partials/enhanced-ecommerce-google-analytics-admin-display.php +74 -86
  33. admin/partials/general-fields.php +375 -320
  34. admin/partials/sidebar.php +0 -60
  35. enhanced-ecommerce-google-analytics.php +4 -51
  36. google_ads_php.ini +0 -14
  37. includes/class-enhanced-ecommerce-google-analytics.php +3 -10
  38. includes/class-tvc-register-scripts.php +4 -9
  39. includes/data/class-tvc-ajax-calls.php +1 -7
  40. includes/data/class-tvc-ajax-data.php +0 -448
  41. includes/data/class-tvc-ajax-file.php +64 -345
  42. includes/data/class-tvc-feed-crud-handler.php +0 -88
  43. includes/data/class-tvc-file.php +0 -246
  44. includes/data/class-tvc-queries.php +0 -972
  45. includes/data/js/tvc_ajaxdatahandling.js +1 -717
  46. includes/data/js/tvc_ajaxdatahandling.min.js +0 -364
  47. includes/setup/CustomApi.php +98 -75
  48. includes/setup/ShoppingApi.php +9 -16
  49. includes/setup/SmartShoppingCampaign.php +0 -431
  50. includes/setup/add-campaign.php +360 -460
  51. includes/setup/class-tatvic-category-selector-element.php +3 -13
  52. includes/setup/google-ads.php +123 -128
  53. includes/setup/google-shopping-feed-gaa-config.php +95 -94
  54. includes/setup/google-shopping-feed-shopping-campaigns.php +624 -663
  55. includes/setup/google-shopping-feed-sync-product.php +175 -142
  56. includes/setup/google-shopping-feed.php +143 -141
  57. includes/setup/help-html.php +346 -99
  58. includes/setup/json/client-secrets.json +1 -14
  59. includes/setup/tatvic-category-wrapper.php +2 -4
  60. includes/user-interface/tvc-url-functions.php +0 -85
  61. public/class-enhanced-ecommerce-google-analytics-public.php +27 -4
  62. public/partials/class-enhanced-ecommerce-google-analytics-public-display.php +0 -16
  63. readme.txt +9 -2
admin/class-enhanced-ecommerce-google-analytics-admin.php CHANGED
@@ -52,14 +52,17 @@ class Enhanced_Ecommerce_Google_Analytics_Admin extends TVC_Admin_Helper {
52
  protected $ga_LC;
53
  protected $ga_eeT;
54
  protected $site_url;
 
55
  public function __construct($plugin_name, $version) {
56
  $this->plugin_name = $plugin_name;
57
  $this->version = $version;
58
  $this->url = $this->get_connect_url();
59
  $this->site_url = "admin.php?page=enhanced-ecommerce-google-analytics-admin-display&tab=";
 
60
  }
61
  public function tvc_admin_notice(){
62
- //global $pagenow;
 
63
  $ee_additional_data = $this->get_ee_additional_data();
64
  if(isset($ee_additional_data['dismissed_ee_adimin_notic_a']) && $ee_additional_data['dismissed_ee_adimin_notic_a'] == 1){
65
  }else{
@@ -100,10 +103,7 @@ class Enhanced_Ecommerce_Google_Analytics_Admin extends TVC_Admin_Helper {
100
  } );
101
  })( jQuery );
102
  </script>
103
- <?php
104
-
105
-
106
-
107
  }
108
 
109
 
@@ -113,30 +113,32 @@ class Enhanced_Ecommerce_Google_Analytics_Admin extends TVC_Admin_Helper {
113
  * @since 1.0.0
114
  */
115
  public function enqueue_styles() {
116
- $screen = get_current_screen();
117
- if ($screen->id == 'toplevel_page_enhanced-ecommerce-google-analytics-admin-display' || (isset($_GET['page']) && $_GET['page'] == 'enhanced-ecommerce-google-analytics-admin-display')) {
118
- wp_register_style('font_awesome', '//use.fontawesome.com/releases/v5.0.13/css/all.css');
119
- wp_enqueue_style('font_awesome');
120
- wp_register_style('plugin-bootstrap',ENHANCAD_PLUGIN_URL . '/includes/setup/plugins/bootstrap/css/bootstrap.min.css');
121
- wp_enqueue_style('plugin-bootstrap');
 
 
 
 
 
 
 
 
 
 
 
122
  wp_register_style('aga_confirm', '//cdnjs.cloudflare.com/ajax/libs/jquery-confirm/3.3.2/jquery-confirm.min.css');
123
  wp_enqueue_style('aga_confirm');
124
-
125
- wp_enqueue_style('custom-css', ENHANCAD_PLUGIN_URL . '/admin/css/custom-style.css', array(), $this->version, 'all' );
126
- if($this->is_current_tab_in(array('sync_product_page','gaa_config_page'))){
127
- wp_register_style('plugin-select2',ENHANCAD_PLUGIN_URL . '/includes/setup/plugins/select2/select2.min.css');
128
- wp_enqueue_style('plugin-select2');
129
- wp_register_style('plugin-steps',ENHANCAD_PLUGIN_URL . '/includes/setup/plugins/jquery-steps/jquery.steps.css');
130
- wp_enqueue_style('plugin-steps');
131
- }
132
- if($this->is_current_tab_in(array("shopping_campaigns_page","add_campaign_page"))){
133
- wp_register_style('plugin-select2',ENHANCAD_PLUGIN_URL . '/includes/setup/plugins/select2/select2.min.css');
134
- wp_enqueue_style('plugin-select2');
135
- wp_register_style('bootstrap-datepicker',ENHANCAD_PLUGIN_URL. '/includes/setup/plugins/datepicker/bootstrap-datepicker.min.css');
136
- wp_enqueue_style('bootstrap-datepicker');
137
- }
138
- wp_enqueue_style($this->plugin_name, plugin_dir_url(__FILE__) . 'css/enhanced-ecommerce-google-analytics-admin.css', array(), $this->version, 'all');
139
- }
140
  }
141
 
142
  /**
@@ -145,34 +147,42 @@ class Enhanced_Ecommerce_Google_Analytics_Admin extends TVC_Admin_Helper {
145
  * @since 1.0.0
146
  */
147
  public function enqueue_scripts() {
148
- $screen = get_current_screen();
149
- if ($screen->id == 'toplevel_page_enhanced-ecommerce-google-analytics-admin-display' || (isset($_GET['page']) && $_GET['page'] == 'enhanced-ecommerce-google-analytics-admin-display')) {
150
 
151
- wp_enqueue_script( 'custom-jquery', ENHANCAD_PLUGIN_URL . '/admin/js/jquery-3.5.1.min.js', array( 'jquery' ), $this->version, false );
152
- wp_register_script('popper_bootstrap', '//cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js');
153
- wp_enqueue_script('popper_bootstrap');
154
- wp_register_script('aga_bootstrap', '//maxcdn.bootstrapcdn.com/bootstrap/4.5.1/js/bootstrap.min.js');
155
- wp_enqueue_script('aga_bootstrap');
156
- wp_register_script('aga_bootstrap_mod', 'https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/js/bootstrap.bundle.min.js');
157
- wp_enqueue_script('aga_bootstrap_mod');
158
- wp_register_script('aga_confirm_js', '//cdnjs.cloudflare.com/ajax/libs/jquery-confirm/3.3.2/jquery-confirm.min.js');
159
- wp_enqueue_script('aga_confirm_js');
160
- wp_enqueue_script( 'tvc-ee-custom-js', ENHANCAD_PLUGIN_URL . '/admin/js/tvc-ee-custom.js', array( 'jquery' ), $this->version, false );
161
- if($this->is_current_tab_in(array('sync_product_page','gaa_config_page'))){
162
- wp_register_script('plugin-select2',ENHANCAD_PLUGIN_URL . '/includes/setup/plugins/select2/select2.min.js');
163
- wp_enqueue_script('plugin-select2');
164
- wp_register_script('plugin-step-js',ENHANCAD_PLUGIN_URL . '/includes/setup/plugins/jquery-steps/jquery.steps.js');
165
- wp_enqueue_script('plugin-step-js');
166
- }
167
- if($this->is_current_tab_in(array("shopping_campaigns_page","add_campaign_page"))){
168
- wp_register_script('plugin-select2',ENHANCAD_PLUGIN_URL . '/includes/setup/plugins/select2/select2.min.js');
169
- wp_enqueue_script('plugin-select2');
170
- wp_register_script('plugin-chart',ENHANCAD_PLUGIN_URL . '/includes/setup/plugins/chart/chart.js');
171
- wp_enqueue_script('plugin-chart');
172
- wp_register_script('bootstrap_datepicker',ENHANCAD_PLUGIN_URL . '/includes/setup/plugins/datepicker/bootstrap-datepicker.min.js');
173
- wp_enqueue_script('bootstrap_datepicker');
174
- }
175
- }
 
 
 
 
 
 
 
 
176
  }
177
 
178
  /**
@@ -180,26 +190,168 @@ class Enhanced_Ecommerce_Google_Analytics_Admin extends TVC_Admin_Helper {
180
  *
181
  * @since 1.0.0
182
  */
183
- public function display_admin_page() {
184
- add_menu_page(
185
- 'Tatvic EE Plugin', 'Tatvic EE Plugin', 'manage_options', "enhanced-ecommerce-google-analytics-admin-display", array($this, 'showPage'), plugin_dir_url(__FILE__) . 'images/tatvic_logo.png', 26
186
- );
187
- add_submenu_page(
188
- 'enhanced-ecommerce-google-analytics-admin-display',
189
- esc_html__('Google Ads', 'actionable-google-analytics-admin-display'),
190
- esc_html__('Google Ads', 'actionable-google-analytics-admin-display'),
191
- 'manage_woocommerce',
192
- 'enhanced-ecommerce-google-analytics-admin-display&tab=google_ads',
193
- array($this, 'showPage')
194
- );
195
- add_submenu_page(
196
- 'enhanced-ecommerce-google-analytics-admin-display',
197
- esc_html__('Google Shopping', 'enhanced-ecommerce-google-analytics-admin-display'),
198
- esc_html__('Google Shopping', 'enhanced-ecommerce-google-analytics-admin-display'),
199
- 'manage_woocommerce',
200
- 'enhanced-ecommerce-google-analytics-admin-display&tab=google_shopping_feed',
201
- array($this, 'showPage')
202
- );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
203
  }
204
  /**
205
  * Display Tab page.
@@ -207,9 +359,12 @@ class Enhanced_Ecommerce_Google_Analytics_Admin extends TVC_Admin_Helper {
207
  * @since 1.0.0
208
  */
209
  public function showPage() {
210
- echo '<div class="tvc_plugin_container">';
211
- require_once( 'partials/enhanced-ecommerce-google-analytics-admin-display.php');
212
- new TVC_Tabs();
 
 
 
213
  echo $this->call_tvc_site_verified_and_domain_claim();
214
  if (!empty($_GET['tab'])) {
215
  $get_action = $_GET['tab'];
@@ -219,8 +374,10 @@ class Enhanced_Ecommerce_Google_Analytics_Admin extends TVC_Admin_Helper {
219
  if (method_exists($this, $get_action)) {
220
  $this->$get_action();
221
  }
222
- echo '</div>';
223
- echo $this->get_tvc_popup_message();
 
 
224
  }
225
  public function check_nall_and_message($val, $msg, $msg_false){
226
  if((isset($val) && $val != "" && $val != 0) ){
@@ -229,8 +386,13 @@ class Enhanced_Ecommerce_Google_Analytics_Admin extends TVC_Admin_Helper {
229
  return $msg_false;
230
  }
231
  }
232
-
233
- public function general_settings() {
 
 
 
 
 
234
  require_once( 'partials/general-fields.php');
235
  }
236
  public function google_ads() {
@@ -262,7 +424,8 @@ class Enhanced_Ecommerce_Google_Analytics_Admin extends TVC_Admin_Helper {
262
  include(ENHANCAD_PLUGIN_DIR . 'includes/setup/help-html.php');
263
  include(ENHANCAD_PLUGIN_DIR . 'includes/setup/add-campaign.php');
264
  new AddCampaign();
265
- }
 
266
  public function conversion_tracking() {
267
  require_once( 'partials/conversion-tracking.php');
268
  }
@@ -299,5 +462,5 @@ class Enhanced_Ecommerce_Google_Analytics_Admin extends TVC_Admin_Helper {
299
  public function end_time() {
300
  $this->country_location();
301
  return strtotime('11:59 PM');
302
- }
303
  }
52
  protected $ga_LC;
53
  protected $ga_eeT;
54
  protected $site_url;
55
+ protected $pro_plan_site;
56
  public function __construct($plugin_name, $version) {
57
  $this->plugin_name = $plugin_name;
58
  $this->version = $version;
59
  $this->url = $this->get_connect_url();
60
  $this->site_url = "admin.php?page=enhanced-ecommerce-google-analytics-admin-display&tab=";
61
+ $this->pro_plan_site = $this->get_pro_plan_site();
62
  }
63
  public function tvc_admin_notice(){
64
+ // add fixed message notification
65
+ $this->add_tvc_fixed_nofification();
66
  $ee_additional_data = $this->get_ee_additional_data();
67
  if(isset($ee_additional_data['dismissed_ee_adimin_notic_a']) && $ee_additional_data['dismissed_ee_adimin_notic_a'] == 1){
68
  }else{
103
  } );
104
  })( jQuery );
105
  </script>
106
+ <?php
 
 
 
107
  }
108
 
109
 
113
  * @since 1.0.0
114
  */
115
  public function enqueue_styles() {
116
+ $screen = get_current_screen();
117
+ if ($screen->id == 'toplevel_page_enhanced-ecommerce-google-analytics-admin-display' || (isset($_GET['page']) && $_GET['page'] == 'enhanced-ecommerce-google-analytics-admin-display')) {
118
+ wp_register_style('font_awesome', '//use.fontawesome.com/releases/v5.0.13/css/all.css');
119
+ wp_enqueue_style('font_awesome');
120
+ wp_register_style('plugin-bootstrap',ENHANCAD_PLUGIN_URL . '/includes/setup/plugins/bootstrap/css/bootstrap.min.css');
121
+ wp_enqueue_style('plugin-bootstrap');
122
+ wp_enqueue_style('custom-css', ENHANCAD_PLUGIN_URL . '/admin/css/custom-style.css', array(), $this->version, 'all' );
123
+ //if(is_rtl()){ }
124
+ if($this->is_current_tab_in(array('sync_product_page','gaa_config_page'))){
125
+ wp_register_style('plugin-select2',ENHANCAD_PLUGIN_URL . '/includes/setup/plugins/select2/select2.min.css');
126
+ wp_enqueue_style('plugin-select2');
127
+ wp_register_style('plugin-steps',ENHANCAD_PLUGIN_URL . '/includes/setup/plugins/jquery-steps/jquery.steps.css');
128
+ wp_enqueue_style('plugin-steps');
129
+ wp_register_style('tvc-dataTables-css', ENHANCAD_PLUGIN_URL.'/admin/css/dataTables.bootstrap4.min.css');
130
+ wp_enqueue_style('tvc-dataTables-css');
131
+ }
132
+ if($this->is_current_tab_in(array("shopping_campaigns_page","add_campaign_page"))){
133
  wp_register_style('aga_confirm', '//cdnjs.cloudflare.com/ajax/libs/jquery-confirm/3.3.2/jquery-confirm.min.css');
134
  wp_enqueue_style('aga_confirm');
135
+ wp_register_style('plugin-select2',ENHANCAD_PLUGIN_URL . '/includes/setup/plugins/select2/select2.min.css');
136
+ wp_enqueue_style('plugin-select2');
137
+ wp_register_style('tvc-bootstrap-datepicker-css',ENHANCAD_PLUGIN_URL. '/includes/setup/plugins/datepicker/bootstrap-datepicker.min.css');
138
+ wp_enqueue_style('tvc-bootstrap-datepicker-css');
139
+ }
140
+ wp_enqueue_style($this->plugin_name, plugin_dir_url(__FILE__) . 'css/enhanced-ecommerce-google-analytics-admin.css', array(), $this->version, 'all');
141
+ }
 
 
 
 
 
 
 
 
 
142
  }
143
 
144
  /**
147
  * @since 1.0.0
148
  */
149
  public function enqueue_scripts() {
150
+ $screen = get_current_screen();
151
+ if ($screen->id == 'toplevel_page_enhanced-ecommerce-google-analytics-admin-display' || (isset($_GET['page']) && $_GET['page'] == 'enhanced-ecommerce-google-analytics-admin-display')) {
152
 
153
+ wp_enqueue_script( 'custom-jquery', ENHANCAD_PLUGIN_URL . '/admin/js/jquery-3.5.1.min.js', array( 'jquery' ), $this->version, false );
154
+ wp_register_script('popper_bootstrap', '//cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js');
155
+ wp_enqueue_script('popper_bootstrap');
156
+ wp_register_script('atvc_bootstrap', '//maxcdn.bootstrapcdn.com/bootstrap/4.5.1/js/bootstrap.min.js');
157
+ wp_enqueue_script('atvc_bootstrap');
158
+ wp_register_script('tvc_bootstrap_mod', 'https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/js/bootstrap.bundle.min.js');
159
+ wp_enqueue_script('tvc_bootstrap_mod');
160
+
161
+ wp_enqueue_script( 'tvc-ee-custom-js', ENHANCAD_PLUGIN_URL . '/admin/js/tvc-ee-custom.js', array( 'jquery' ), $this->version, false );
162
+
163
+ wp_enqueue_script( 'tvc-ee-slick-js', ENHANCAD_PLUGIN_URL . '/admin/js/slick.min.js', array( 'jquery' ), $this->version, false );
164
+
165
+ if($this->is_current_tab_in(array('sync_product_page','gaa_config_page'))){
166
+ wp_register_script('plugin-select2',ENHANCAD_PLUGIN_URL . '/includes/setup/plugins/select2/select2.min.js');
167
+ wp_enqueue_script('plugin-select2');
168
+ wp_register_script('plugin-step-js',ENHANCAD_PLUGIN_URL . '/includes/setup/plugins/jquery-steps/jquery.steps.js');
169
+ wp_enqueue_script('plugin-step-js');
170
+ }
171
+ if($this->is_current_tab_in(array('sync_product_page'))){
172
+ wp_enqueue_script( 'tvc-ee-dataTables-js', ENHANCAD_PLUGIN_URL . '/admin/js/jquery.dataTables.min.js', array( 'jquery' ), $this->version, false );
173
+ wp_enqueue_script( 'tvc-ee-dataTables-1-js', ENHANCAD_PLUGIN_URL . '/admin/js/dataTables.bootstrap4.min.js', array( 'jquery' ), $this->version, false );
174
+ }
175
+ if($this->is_current_tab_in(array("shopping_campaigns_page","add_campaign_page"))){
176
+ wp_register_script('tvc_confirm_js', '//cdnjs.cloudflare.com/ajax/libs/jquery-confirm/3.3.2/jquery-confirm.min.js');
177
+ wp_enqueue_script('tvc_confirm_js');
178
+ wp_register_script('plugin-select2',ENHANCAD_PLUGIN_URL . '/includes/setup/plugins/select2/select2.min.js');
179
+ wp_enqueue_script('plugin-select2');
180
+ wp_register_script('plugin-chart',ENHANCAD_PLUGIN_URL . '/includes/setup/plugins/chart/chart.js');
181
+ wp_enqueue_script('plugin-chart');
182
+ wp_register_script('tvc-bootstrap-datepicker-js',ENHANCAD_PLUGIN_URL . '/includes/setup/plugins/datepicker/bootstrap-datepicker.min.js');
183
+ wp_enqueue_script('tvc-bootstrap-datepicker-js');
184
+ }
185
+ }
186
  }
187
 
188
  /**
190
  *
191
  * @since 1.0.0
192
  */
193
+ public function display_admin_page() {
194
+ add_menu_page(
195
+ 'Tatvic EE Plugin', 'Tatvic EE Plugin', 'manage_options', "enhanced-ecommerce-google-analytics-admin-display", array($this, 'showPage'), plugin_dir_url(__FILE__) . 'images/tatvic_logo.png', 26
196
+ );
197
+ add_submenu_page('enhanced-ecommerce-google-analytics-admin-display', 'Google Analytics', 'Google Analytics', 'manage_options', 'enhanced-ecommerce-google-analytics-admin-display' );
198
+ add_submenu_page(
199
+ 'enhanced-ecommerce-google-analytics-admin-display',
200
+ esc_html__('Google Ads', 'enhanced-ecommerce-google-analytics-admin-display'),
201
+ esc_html__('Google Ads', 'enhanced-ecommerce-google-analytics-admin-display'),
202
+ 'manage_options',
203
+ 'enhanced-ecommerce-google-analytics-admin-display&tab=google_ads',
204
+ array($this, 'showPage')
205
+ );
206
+ add_submenu_page(
207
+ 'enhanced-ecommerce-google-analytics-admin-display',
208
+ esc_html__('Google Shopping', 'enhanced-ecommerce-google-analytics-admin-display'),
209
+ esc_html__('Google Shopping', 'enhanced-ecommerce-google-analytics-admin-display'),
210
+ 'manage_options',
211
+ 'enhanced-ecommerce-google-analytics-admin-display&tab=google_shopping_feed',
212
+ array($this, 'showPage')
213
+ );
214
+ }
215
+ protected function create_head(){
216
+ $google_detail = $this->get_ee_options_data();
217
+ $googleDetail = "";
218
+ if(isset($google_detail['setting'])){
219
+ $googleDetail = $google_detail['setting'];
220
+ }
221
+ $plan_name = "Free Plan";
222
+ $plan_price = "";
223
+ $product_sync_max_limit ="Products sync limit ( 100 )";
224
+ $plan_id = 1;
225
+ if(isset($googleDetail->plan_id) && !in_array($googleDetail->plan_id, array("1"))){
226
+ $plan_id = $googleDetail->plan_id;
227
+ }
228
+ if(isset($googleDetail->plan_name) && !in_array($googleDetail->plan_id, array("1"))){
229
+ $plan_name = $googleDetail->plan_name;
230
+ }
231
+ if(isset($googleDetail->price) && !in_array($googleDetail->plan_id, array("1"))){
232
+ $plan_price = " (".$googleDetail->price." USD)";
233
+ }
234
+ if(isset($googleDetail->max_limit)){
235
+ $max_limit = $googleDetail->max_limit;
236
+ if(in_array($plan_id, array("7","8"))){
237
+ $max_limit = "Unlimited";
238
+ }
239
+ $product_sync_max_limit = "Product sync limit ( ".$max_limit." )";
240
+ }
241
+ ?>
242
+ <div class="container">
243
+ <div class="header-section">
244
+ <?php if($plan_id == 1){?>
245
+ <div class="top-section">
246
+ <p>You are using free plugin. To unlock more features consider <a href="<?php echo $this->pro_plan_site; ?>" target="_blank" class="text-underline">upgrading to pro</a>..!!!</p>
247
+ </div>
248
+ <?php } ?>
249
+ <nav class="navbar navbar-section">
250
+ <a class="navbar-brand">
251
+ <img src="https://d3rv1nmzvje89q.cloudfront.net/optimized_v5/2017/02/logo_optimize-1024x310.png"/>
252
+ </a>
253
+ <div class="form-inline">
254
+ <span class="nav-btn">
255
+ <span class="badge badge-primary free-plan"><?php echo $plan_name; //echo $plan_price;?> - <?php echo $product_sync_max_limit; ?></span>
256
+ </span>
257
+ <?php $ee_msg_list = $this->get_ee_msg_nofification_list();
258
+ $active_count = 0;
259
+ if(!empty($ee_msg_list)){
260
+ $html = "";
261
+ foreach ($ee_msg_list as $key => $value) {
262
+ if( isset($value["active"]) && $value["active"] == 1 ){
263
+ $active_count++;
264
+ $m_date = isset($value["date"])?"<span class=\"tvc-msg_date\">".$value["date"]."</span>":"";
265
+ $m_title = isset($value["title"])?"<h4 class=\"tvc-msg_title\">".$value["title"]."</h4>":"";
266
+ $m_html = isset($value["html"])?"<span class=\"tvc-msg_text\">".base64_decode($value["html"])."</span>":"";
267
+ $target = (isset($value["link_type"]) && $value["link_type"] == "external")?"target=\"_blank\"":"";
268
+ $m_link = isset($value["link"])?"<a ".$target." href=".$value["link"]." class=\"tvc-notification-button is-secondary\">".$value["link_title"]."</a>":"";
269
+
270
+ $html.="<li>
271
+ <section class=\"tvc-msg plain\">
272
+ <div class=\"tvc-msg_wrapper\">
273
+ <div class=\"tvc-msg_content\">".$m_date . $m_title.$m_html."</div>
274
+ <div class=\"tvc-msg_actions\">
275
+ ".$m_link."
276
+ <div class=\"tvc-dropdown\">
277
+ <button type=\"button\" data-id=".$key." class=\"tvc-notification-button is-tertiary is-dismissible-notification\">Dismiss</button>
278
+ </div>
279
+ </div>
280
+ </div>
281
+ </section>
282
+ </li>";
283
+ }
284
+ }
285
+ }
286
+ ?>
287
+ <div class="tvc-notification">
288
+ <a href="javascript:void(0)" class="nav-btn" aria-haspopup="true" aria-expanded="false">
289
+ <img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/notification.svg'; ?>" alt="notification" class="nav-icon"/>
290
+ <span class="badge badge-primary not-count"><?php echo $active_count; ?></span>
291
+ </a>
292
+ <?php if($html!=""){?>
293
+ <div class="dropdown-menu tvc-notification-dropdown-menu">
294
+ <ul>
295
+ <?php echo $html; ?>
296
+ </ul>
297
+ <script>
298
+ (function( $ ) {
299
+ $('.tvc-notification a.nav-btn').on('click', function (event) {
300
+ event.preventDefault();
301
+ $(this).parent().toggleClass('show');
302
+ $(".tvc-notification-dropdown-menu").toggleClass('show');
303
+ });
304
+ $('body').on('click', function (e) {
305
+ if(!$('.tvc-notification').is(e.target) && $('.tvc-notification').has(e.target).length === 0 && $('.show').has(e.target).length === 0 ){
306
+ $('.tvc-notification-dropdown-menu').removeClass('show');
307
+ $('.tvc-notification').removeClass('show');
308
+ }
309
+ });
310
+ $(function(){
311
+ $( '.tvc-notification' ).on( 'click', '.is-dismissible-notification', function( event, el ) {
312
+ var this_id = $(this);
313
+ var ee_dismiss_id = $(this).attr("data-id");
314
+ jQuery.post(myAjaxNonces.ajaxurl,{
315
+ action: "tvc_call_notification_dismiss",
316
+ data:{ee_dismiss_id:ee_dismiss_id},
317
+ dataType: "json",
318
+ TVCNonce: myAjaxNonces.apiotificationDismissNonce
319
+ },function( response ){
320
+ var rsp = JSON.parse(response);
321
+ if(rsp.status == "success"){
322
+ this_id.parent().parent().parent().parent().parent().slideUp();
323
+ }
324
+ });
325
+ });
326
+ });
327
+ })( jQuery );
328
+ </script>
329
+ </div>
330
+ <?php } ?>
331
+ </div>
332
+ <?php /*
333
+ <div class="account-dropdown">
334
+ <button type="button" class="btn dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
335
+ <?php
336
+ if (isset($_GET['tab']) && $_GET['tab'] == 'configuration_summary') {
337
+ echo 'Configuration Summary';
338
+ } else {
339
+ echo 'Account Summary';
340
+ }
341
+ ?>
342
+ </button>
343
+ <div class="dropdown-menu dropdown-menu-right">
344
+ <ul>
345
+ <li><a href="<?php echo admin_url('admin.php?page=enhanced-ecommerce-google-analytics-admin-display&id=account-summary'); ?>" class="dropdown-item" type="button">Account Summary</a></li>
346
+ <li><a href="<?php echo admin_url('admin.php?page=enhanced-ecommerce-google-analytics-admin-display&id=configuration-summary'); ?>" class="dropdown-item" type="button">Configuration Summary</a></li>
347
+ </ul>
348
+ </div>
349
+ </div> */ ?>
350
+ </div>
351
+ </nav>
352
+ </div>
353
+ </div>
354
+ <?php
355
  }
356
  /**
357
  * Display Tab page.
359
  * @since 1.0.0
360
  */
361
  public function showPage() {
362
+ echo '<div class="tvc_plugin_container">';
363
+ require_once( 'partials/enhanced-ecommerce-google-analytics-admin-display.php');
364
+ $this->create_head();
365
+ echo '<div class="container">
366
+ <div class="wiz-tab">';
367
+ new TVC_Tabs();
368
  echo $this->call_tvc_site_verified_and_domain_claim();
369
  if (!empty($_GET['tab'])) {
370
  $get_action = $_GET['tab'];
374
  if (method_exists($this, $get_action)) {
375
  $this->$get_action();
376
  }
377
+ echo '</div>
378
+ </div>
379
+ </div>';
380
+ echo $this->get_tvc_popup_message();
381
  }
382
  public function check_nall_and_message($val, $msg, $msg_false){
383
  if((isset($val) && $val != "" && $val != 0) ){
386
  return $msg_false;
387
  }
388
  }
389
+ /*public function account(){
390
+ require_once(ENHANCAD_PLUGIN_DIR . 'includes/setup/help-html.php');
391
+ require_once(ENHANCAD_PLUGIN_DIR . 'includes/setup/account.php');
392
+ new TVC_Account();
393
+ }*/
394
+ public function general_settings() {
395
+ require_once(ENHANCAD_PLUGIN_DIR . 'includes/setup/help-html.php');
396
  require_once( 'partials/general-fields.php');
397
  }
398
  public function google_ads() {
424
  include(ENHANCAD_PLUGIN_DIR . 'includes/setup/help-html.php');
425
  include(ENHANCAD_PLUGIN_DIR . 'includes/setup/add-campaign.php');
426
  new AddCampaign();
427
+ }
428
+ /*
429
  public function conversion_tracking() {
430
  require_once( 'partials/conversion-tracking.php');
431
  }
462
  public function end_time() {
463
  $this->country_location();
464
  return strtotime('11:59 PM');
465
+ }*/
466
  }
admin/class-enhanced-ecommerce-google-analytics-settings.php CHANGED
@@ -77,7 +77,6 @@ class Enhanced_Ecommerce_Google_Settings {
77
 
78
  update_option($settings, serialize( $get_ee_settings ));
79
  }
80
- self::admin_notice__success();
81
  }
82
 
83
  public static function update_analytics_options($settings) {
@@ -129,19 +128,4 @@ class Enhanced_Ecommerce_Google_Settings {
129
  update_option($settings, serialize( $get_ee_settings ));
130
  }
131
  }
132
-
133
-
134
- private static function admin_notice__success() {
135
- $class = 'notice notice-success';
136
- $message = __( 'Your settings have been saved.', 'sample-text-domain' );
137
- printf( '<div class="%1$s"><p>%2$s</p></div>', esc_attr( $class ), esc_html( $message ) );
138
-
139
- }
140
- public function show_message(){
141
- echo '
142
- <div class="notice notice-warning is-dismissible">
143
- <strong><p>Get all the 9 GA - Enhanced Ecommerce reports, 20+ custom dimensions and metrics, google ads conversion tracking, FB pixel tracking, Google Optimize integration and many more advanced features in the <a href="https://codecanyon.net/item/actionable-google-analytics-for-woocommerce/9899552?utm_source=TatvicEE&utm_medium=DashboardMsgText&utm_campaign=WPlisting" target="_blank">Premium Version</a>.</p></strong>
144
- </div>
145
- ';
146
- }
147
  }
77
 
78
  update_option($settings, serialize( $get_ee_settings ));
79
  }
 
80
  }
81
 
82
  public static function update_analytics_options($settings) {
128
  update_option($settings, serialize( $get_ee_settings ));
129
  }
130
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
131
  }
admin/class-tvc-admin-auto-product-sync-helper.php CHANGED
@@ -40,6 +40,7 @@ if ( ! class_exists( 'TVC_Admin_Auto_Product_sync_Helper' ) ) {
40
  public function add_table_in_db(){
41
  //add_filter( 'cron_schedules', array($this,'tvc_add_cron_interval') );
42
  global $wpdb;
 
43
  $tablename = $wpdb->prefix ."ee_product_sync_data";
44
  $query = $wpdb->prepare( 'SHOW TABLES LIKE %s', $wpdb->esc_like( $tablename ) );
45
  if ( $wpdb->get_var( $query ) === $tablename ) {
@@ -50,10 +51,38 @@ if ( ! class_exists( 'TVC_Admin_Auto_Product_sync_Helper' ) ) {
50
  $this->import_last_sync_in_db();
51
  }
52
  }
53
-
54
  $tablename = $wpdb->prefix ."ee_product_sync_call";
55
- $sql_create = "CREATE TABLE ".$tablename." ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT, `sync_product_ids` LONGTEXT NULL, `w_total_product` INT(10) NOT NULL , `total_sync_product` INT(10) NOT NULL ,last_sync DATETIME NOT NULL, create_sync DATETIME NOT NULL, next_sync DATETIME NOT NULL, `last_sync_product_id` BIGINT(20) NOT NULL, `action_scheduler_id` INT(10) NOT NULL, `status` INT(1) NOT NULL COMMENT '0 failed, 1 completed', PRIMARY KEY (`id`) );";
56
- if(!maybe_create_table( $tablename, $sql_create )){ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
  }
58
 
59
  public function import_last_sync_in_db(){
@@ -142,18 +171,6 @@ if ( ! class_exists( 'TVC_Admin_Auto_Product_sync_Helper' ) ) {
142
  }
143
  }
144
  }
145
-
146
- public function tvc_get_post_meta($post_id){
147
- $where ="post_id = ".$post_id;
148
- $rows = $this->TVC_Admin_DB_Helper->tvc_get_results_in_array('postmeta', $where, array('meta_key','meta_value'));
149
- $metas = array();
150
- if(!empty($rows)){
151
- foreach($rows as $val){
152
- $metas[$val['meta_key']] = $val['meta_value'];
153
- }
154
- }
155
- return $metas;
156
- }
157
 
158
  public function tvc_get_map_product_attribute($products, $tvc_currency, $merchantId){
159
  if(!empty($products)){
@@ -164,7 +181,7 @@ if ( ! class_exists( 'TVC_Admin_Auto_Product_sync_Helper' ) ) {
164
  foreach ($products as $postkey => $postvalue) {
165
  $product_ids[] = $postvalue->w_product_id;
166
  $postmeta = [];
167
- $postmeta = $this->tvc_get_post_meta($postvalue->w_product_id);
168
  $prd = wc_get_product($postvalue->w_product_id);
169
  $postObj = (object) array_merge((array) get_post($postvalue->w_product_id), (array) $postmeta);
170
 
@@ -223,7 +240,7 @@ if ( ! class_exists( 'TVC_Admin_Auto_Product_sync_Helper' ) ) {
223
  $p_variations = $prd->get_available_variations();
224
  if(!empty($p_variations)){
225
  foreach ($p_variations as $v_key => $v_value) {
226
- $postmeta_var = (object)$this->tvc_get_post_meta($v_value['variation_id']);
227
  $formArray_val = $formArray['title'];
228
  $product['title'] = (isset($postObj->$formArray_val))?$postObj->$formArray_val:get_the_title($postvalue->w_product_id);
229
  $tvc_temp_desc_key = $formArray['description'];
40
  public function add_table_in_db(){
41
  //add_filter( 'cron_schedules', array($this,'tvc_add_cron_interval') );
42
  global $wpdb;
43
+ /* cteate table for save sync product settings */
44
  $tablename = $wpdb->prefix ."ee_product_sync_data";
45
  $query = $wpdb->prepare( 'SHOW TABLES LIKE %s', $wpdb->esc_like( $tablename ) );
46
  if ( $wpdb->get_var( $query ) === $tablename ) {
51
  $this->import_last_sync_in_db();
52
  }
53
  }
54
+ /* cteate table for save auto sync product call */
55
  $tablename = $wpdb->prefix ."ee_product_sync_call";
56
+ $query = $wpdb->prepare( 'SHOW TABLES LIKE %s', $wpdb->esc_like( $tablename ) );
57
+ if ( $wpdb->get_var( $query ) === $tablename ) {
58
+ }else{
59
+ $sql_create = "CREATE TABLE ".$tablename." ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT, `sync_product_ids` LONGTEXT NULL, `w_total_product` INT(10) NOT NULL , `total_sync_product` INT(10) NOT NULL ,last_sync DATETIME NOT NULL, create_sync DATETIME NOT NULL, next_sync DATETIME NOT NULL, `last_sync_product_id` BIGINT(20) NOT NULL, `action_scheduler_id` INT(10) NOT NULL, `status` INT(1) NOT NULL COMMENT '0 failed, 1 completed', PRIMARY KEY (`id`) );";
60
+ if(!maybe_create_table( $tablename, $sql_create )){ }
61
+ }
62
+
63
+ /* cteate table for save GMC sync product list */
64
+ $tablename = $wpdb->prefix ."ee_products_sync_list";
65
+ $query = $wpdb->prepare( 'SHOW TABLES LIKE %s', $wpdb->esc_like( $tablename ) );
66
+ if ( $wpdb->get_var( $query ) === $tablename ) {
67
+ }else{
68
+ $sql_create = "CREATE TABLE ".$tablename." ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT , `gmc_id` VARCHAR(200) NOT NULL , `name` VARCHAR(200) NOT NULL , `product_id` VARCHAR(100) NOT NULL , `google_status` VARCHAR(50) NOT NULL , `image_link` VARCHAR(200) NOT NULL, `issues` LONGTEXT NOT NULL, PRIMARY KEY (`id`) );";
69
+ if(maybe_create_table( $tablename, $sql_create )){
70
+ $this->TVC_Admin_Helper->import_gmc_products_sync_in_db();
71
+
72
+ $product_status = $this->TVC_Admin_DB_Helper->tvc_get_counts_groupby('ee_products_sync_list','google_status');
73
+ $syncProductStat = array("approved" => 0, "disapproved" => 0, "pending" => 0 );
74
+ foreach ($product_status as $key => $value) {
75
+ if(isset($value['google_status']) ){
76
+ $syncProductStat[$value['google_status']] = (isset($value['count']) && $value['count'] >0)?$value['count']:0;
77
+ }
78
+ }
79
+ $syncProductStat["total"] = $this->TVC_Admin_DB_Helper->tvc_row_count('ee_products_sync_list');
80
+ $google_detail = $this->TVC_Admin_Helper->get_ee_options_data();
81
+ $google_detail['prod_sync_status'] = (object)$syncProductStat;
82
+ $this->TVC_Admin_Helper->set_ee_options_data($google_detail);
83
+ }
84
+ }
85
+
86
  }
87
 
88
  public function import_last_sync_in_db(){
171
  }
172
  }
173
  }
 
 
 
 
 
 
 
 
 
 
 
 
174
 
175
  public function tvc_get_map_product_attribute($products, $tvc_currency, $merchantId){
176
  if(!empty($products)){
181
  foreach ($products as $postkey => $postvalue) {
182
  $product_ids[] = $postvalue->w_product_id;
183
  $postmeta = [];
184
+ $postmeta = $this->TVC_Admin_Helper->tvc_get_post_meta($postvalue->w_product_id);
185
  $prd = wc_get_product($postvalue->w_product_id);
186
  $postObj = (object) array_merge((array) get_post($postvalue->w_product_id), (array) $postmeta);
187
 
240
  $p_variations = $prd->get_available_variations();
241
  if(!empty($p_variations)){
242
  foreach ($p_variations as $v_key => $v_value) {
243
+ $postmeta_var = (object)$this->TVC_Admin_Helper->tvc_get_post_meta($v_value['variation_id']);
244
  $formArray_val = $formArray['title'];
245
  $product['title'] = (isset($postObj->$formArray_val))?$postObj->$formArray_val:get_the_title($postvalue->w_product_id);
246
  $tvc_temp_desc_key = $formArray['description'];
admin/class-tvc-admin-db-helper.php CHANGED
@@ -58,6 +58,17 @@ if ( ! class_exists( 'TVC_Admin_DB_Helper' ) ) {
58
  return ;
59
  }
60
 
 
 
 
 
 
 
 
 
 
 
 
61
  public function tvc_get_results_in_array($table, $where, $fields, $concat = false){
62
  global $wpdb;
63
  $tablename = $wpdb->prefix .$table;
@@ -76,6 +87,27 @@ if ( ! class_exists( 'TVC_Admin_DB_Helper' ) ) {
76
  }
77
  }
78
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  public function tvc_get_last_row($table, $fields=null){
80
  if($table ==""){
81
  return;
@@ -92,10 +124,22 @@ if ( ! class_exists( 'TVC_Admin_DB_Helper' ) ) {
92
  }
93
  }
94
 
95
-
96
-
 
 
 
 
 
 
 
 
97
 
 
 
 
 
 
 
98
  }
99
- }
100
-
101
- ?>
58
  return ;
59
  }
60
 
61
+ public function tvc_check_row($table, $where){
62
+ global $wpdb;
63
+ $tablename = $wpdb->prefix .$table;
64
+ if($table =="" || $where == ""){
65
+ return;
66
+ }else{
67
+ $sql = "select count(*) from ".$tablename." where ".$where;
68
+ return $wpdb->get_var($sql);
69
+ }
70
+ }
71
+
72
  public function tvc_get_results_in_array($table, $where, $fields, $concat = false){
73
  global $wpdb;
74
  $tablename = $wpdb->prefix .$table;
87
  }
88
  }
89
 
90
+ public function tvc_get_results($table, $where = null, $fields = array()){
91
+ global $wpdb;
92
+ $tablename = $wpdb->prefix .$table;
93
+ if($table =="" ){
94
+ return;
95
+ }else {
96
+ $p_where ="";
97
+ if($where){
98
+ $p_where = "where";
99
+ }
100
+ if( !empty($fields) ) {
101
+ $fields = implode(',', $fields);
102
+ $sql = "select ".$fields." from ".$tablename." ".$p_where." ".$where;
103
+ return $wpdb->get_results($sql);
104
+ }else{
105
+ $sql = "select * from ".$tablename." ".$p_where." ".$where;
106
+ return $wpdb->get_results($sql);
107
+ }
108
+ }
109
+ }
110
+
111
  public function tvc_get_last_row($table, $fields=null){
112
  if($table ==""){
113
  return;
124
  }
125
  }
126
 
127
+ public function tvc_get_counts_groupby($table, $fields_by){
128
+ global $wpdb;
129
+ $tablename = $wpdb->prefix .$table;
130
+ if($table =="" || $fields_by == ""){
131
+ return;
132
+ }else{
133
+ $sql = "select ".$fields_by.", count(*) as count from ".$tablename." GROUP BY ".$fields_by." ORDER BY count DESC ";
134
+ return $wpdb->get_results($sql, ARRAY_A);
135
+ }
136
+ }
137
 
138
+ public function tvc_safe_truncate_table($table){
139
+ $query = $wpdb->prepare( 'SHOW TABLES LIKE %s', $wpdb->esc_like( $table ) );
140
+ if ( $wpdb->get_var( $query ) === $table ) {
141
+ $wpdb->query("TRUNCATE TABLE IF EXISTS ".$table);
142
+ }
143
+ }
144
  }
145
+ }
 
 
admin/class-tvc-admin-helper.php CHANGED
@@ -30,7 +30,32 @@ Class TVC_Admin_Helper{
30
  require_once(ENHANCAD_PLUGIN_DIR . 'includes/setup/ShoppingApi.php');
31
  }
32
  }
33
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
  public function is_need_to_update_api_to_db(){
35
  if($this->get_subscriptionId() != ""){
36
  $google_detail = $this->get_ee_options_data();
@@ -38,7 +63,7 @@ Class TVC_Admin_Helper{
38
  $current = current_time( 'timestamp' );
39
  //echo date( 'M-d-Y H:i', current_time( 'timestamp' ))."==>".date( 'M-d-Y H:i', $google_detail['sync_time']);
40
  $diffrent_hours = floor(( $current - $google_detail['sync_time'])/(60*60));
41
- if($diffrent_hours > 5){
42
  return true;
43
  }
44
  }else if(empty($google_detail)){
@@ -47,6 +72,9 @@ Class TVC_Admin_Helper{
47
  }
48
  return false;
49
  }
 
 
 
50
  public function is_ee_options_data_empty(){
51
  if($this->get_subscriptionId() != ""){
52
  if(empty($this->get_ee_options_data())){
@@ -54,51 +82,44 @@ Class TVC_Admin_Helper{
54
  }
55
  }
56
  }
57
- public function get_ee_options_data(){
58
- if(!empty($this->ee_options_data)){
59
- return $this->ee_options_data;
60
- }else{
61
- $this->ee_options_data = unserialize(get_option('ee_api_data'));
62
- return $this->ee_options_data;
 
 
 
 
 
 
 
 
 
 
 
63
  }
64
  }
65
- public function set_update_db_to_api(){
66
- if($this->get_subscriptionId() != ""){
67
- $ee_options_settings = $this->get_ee_options_settings();
68
- $ads_ert = get_option('ads_ert');
69
- $ads_edrt = get_option('ads_edrt');
70
-
71
- $tvc_setting_db = [];
72
- $tvc_setting_db['subscription_id'] = $this->get_subscriptionId();
73
- $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);
74
- $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);
75
-
76
-
77
- $tvc_setting_db['google-add'] ="";
78
- $tvc_setting_db['remarketing_tags'] = (($ads_ert == "on" || $ads_ert)?1:0);
79
- $tvc_setting_db['dynamic_remarketing_tags'] = (($ads_edrt == "on" || $ads_edrt)?1:0);
80
- $customApiObj = new CustomApi();
81
- $response = $customApiObj->updateTrackingOption($tvc_setting_db);
82
-
83
- }
84
- //return true;
85
- }
86
- public function set_update_api_to_db($googleDetail = null){
87
  if(empty($googleDetail)){
88
  $google_detail = $this->customApiObj->getGoogleAnalyticDetail();
89
- if(isset($google_detail->data['status']) && $google_detail->data['status'] == 200){
90
- if (isset($google_detail->data['data'])) {
91
- $googleDetail = $google_detail->data['data'];
92
  }
93
  }else{
94
- //return 0;
95
  }
96
  }
97
  $syncProductStat = [];
98
  $syncProductList = [];
99
  $campaigns_list = [];
100
- if(isset($googleDetail->google_merchant_center_id) || isset($googleDetail->google_ads_id) ){
101
- $syncProduct_list_res = $this->customApiObj->getSyncProductList(['merchant_id' => $this->get_merchantId()]);
102
  if(isset($syncProduct_list_res->data) && isset($syncProduct_list_res->status) && $syncProduct_list_res->status == 200){
103
  if (isset($syncProduct_list_res->data->statistics)) {
104
  $syncProductStat = $syncProduct_list_res->data->statistics;
@@ -106,8 +127,22 @@ Class TVC_Admin_Helper{
106
  if (isset($syncProduct_list_res->data->products)) {
107
  $syncProductList = $syncProduct_list_res->data->products;
108
  }
109
- }
110
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
  $shopping_api = new ShoppingApi();
112
  $campaigns_list_res = $shopping_api->getCampaigns();
113
  if(isset($campaigns_list_res->data) && isset($campaigns_list_res->status) && $campaigns_list_res->status == 200) {
@@ -116,28 +151,90 @@ Class TVC_Admin_Helper{
116
  }
117
  }
118
  }
119
- $this->set_ee_options_data(array("setting" => $googleDetail, "prod_sync_status" =>$syncProductStat,"prod_sync_list" =>$syncProductList, "campaigns_list"=>$campaigns_list, "sync_time"=>current_time( 'timestamp' )));
120
- /*$tvc_msg ="";
121
- if(!empty($googleDetail)){
122
- $tvc_msg = "Configuration Setting";
123
- }
124
- if(!empty($syncProductList)){
125
- $tvc_msg = ($tvc_msg != "")?$tvc_msg.", Product Sync":"Product Sync";
126
- }
127
- if(!empty($campaigns_list)){
128
- $tvc_msg = ($tvc_msg != "")?$tvc_msg.", Shopping Campaigns":"Shopping Campaigns";
129
- }*/
130
- return "Details updated successfully.";
131
  }
132
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
  public function set_ee_options_data($ee_options_data){
134
  update_option("ee_api_data", serialize($ee_options_data));
135
  }
136
-
 
 
137
  public function set_ee_additional_data($ee_additional_data){
138
  update_option("ee_additional_data", serialize($ee_additional_data));
139
  }
140
-
 
 
141
  public function get_ee_additional_data(){
142
  if(!empty($this->ee_additional_data)){
143
  return $this->ee_additional_data;
@@ -146,7 +243,9 @@ Class TVC_Admin_Helper{
146
  return $this->ee_additional_data;
147
  }
148
  }
149
-
 
 
150
  public function get_ee_options_settings(){
151
  if(!empty($this->e_options_settings)){
152
  return $this->e_options_settings;
@@ -155,7 +254,9 @@ Class TVC_Admin_Helper{
155
  return $this->e_options_settings;
156
  }
157
  }
158
-
 
 
159
  public function get_subscriptionId(){
160
  if(!empty($this->subscriptionId)){
161
  return $this->subscriptionId;
@@ -168,6 +269,9 @@ Class TVC_Admin_Helper{
168
  return $this->subscriptionId;
169
  }
170
  }
 
 
 
171
  public function get_merchantId(){
172
  if(!empty($this->merchantId)){
173
  return $this->merchantId;
@@ -181,6 +285,9 @@ Class TVC_Admin_Helper{
181
  return $this->merchantId;
182
  }
183
  }
 
 
 
184
  public function get_main_merchantId(){
185
  if(!empty($this->main_merchantId)){
186
  return $this->main_merchantId;
@@ -194,7 +301,9 @@ Class TVC_Admin_Helper{
194
  return $this->main_merchantId;
195
  }
196
  }
197
-
 
 
198
  public function get_time_zone(){
199
  if(!empty($this->time_zone)){
200
  return $this->time_zone;
@@ -245,6 +354,7 @@ Class TVC_Admin_Helper{
245
  return $this->woo_country;
246
  }
247
  }
 
248
  //tvc_customer = >google_ads_id
249
  public function get_currentCustomerId(){
250
  if(!empty($this->currentCustomerId)){
@@ -284,7 +394,7 @@ Class TVC_Admin_Helper{
284
  $spinner_gif = ENHANCAD_PLUGIN_URL . '/admin/images/ajax-loader.gif';
285
  echo '<div class="feed-spinner" id="feed-spinner" style="display:none;">
286
  <img id="img-spinner" src="' . $spinner_gif . '" alt="Loading" />
287
- </div>';
288
  }
289
 
290
  public function get_gmcAttributes() {
@@ -306,7 +416,7 @@ Class TVC_Admin_Helper{
306
  return $attributes;
307
  }
308
  /* start display form input*/
309
- public function tvc_language_select($name, $class_id, string $label="Please Select", string $sel_val = "en", bool $require = false){
310
  if($name){
311
  $countries_list = $this->get_gmc_language_list();
312
  ?>
@@ -320,7 +430,7 @@ Class TVC_Admin_Helper{
320
  <?php
321
  }
322
  }
323
- public function tvc_countries_select($name, $class_id, string $label="Please Select", bool $require = false){
324
  if($name){
325
  $countries_list = $this->get_gmc_countries_list();
326
  $sel_val = $this->get_woo_country();
@@ -335,7 +445,7 @@ Class TVC_Admin_Helper{
335
  <?php
336
  }
337
  }
338
- public function tvc_select($name, $class_id, string $label="Please Select", string $sel_val = null, bool $require = false, $option_list = array()){
339
  if(!empty($option_list) && $name){
340
  ?>
341
  <select class="form-control select2 <?php echo $class_id; ?> <?php echo ($require == true)?"field-required":""; ?>" name="<?php echo $name; ?>" id="<?php echo $class_id; ?>" >
@@ -396,8 +506,6 @@ Class TVC_Admin_Helper{
396
  $setting_status['google_analytic_msg']= "";
397
  }
398
  // for google shopping
399
- //echo "<pre>";
400
- //print_r($googleDetail);
401
  if(property_exists($googleDetail,"google_merchant_center_id") && property_exists($googleDetail,"google_ads_id") ){
402
  //main tab
403
  if( $googleDetail->google_merchant_center_id != "" && $googleDetail->google_ads_id != ""){
@@ -632,15 +740,15 @@ Class TVC_Admin_Helper{
632
  public function call_domain_claim(){
633
  $googleDetail = [];
634
  $google_detail = $this->get_ee_options_data();
635
- //print_r($google_detail);
636
  if(isset($google_detail['setting']) && $google_detail['setting']){
637
  $googleDetail = $google_detail['setting'];
638
  if($googleDetail->is_site_verified == '0'){
639
  return array('error'=>true, 'msg'=>"First need to verified your site. Click on site verification refresh icon to verified your site.");
640
  }else if(property_exists($googleDetail,"is_domain_claim") && $googleDetail->is_domain_claim == '0'){
 
641
  $postData = [
642
  'merchant_id' => $googleDetail->merchant_id,
643
- 'website_url' => $googleDetail->site_url,
644
  'subscription_id' => $googleDetail->id,
645
  'account_id' => $googleDetail->google_merchant_center_id
646
  ];
@@ -664,9 +772,10 @@ Class TVC_Admin_Helper{
664
  if(isset($google_detail['setting']) && $google_detail['setting']){
665
  $googleDetail = $google_detail['setting'];
666
  if(property_exists($googleDetail,"is_site_verified") && $googleDetail->is_site_verified == '0'){
 
667
  $postData = [
668
- 'merchant_id' => $googleDetail->merchant_id,
669
- 'website_url' => $googleDetail->site_url,
670
  'subscription_id' => $googleDetail->id,
671
  'account_id' => $googleDetail->google_merchant_center_id
672
  ];
@@ -745,4 +854,145 @@ Class TVC_Admin_Helper{
745
  return $this->TVC_Admin_DB_Helper->tvc_get_last_row('ee_product_sync_call', array("total_sync_product","create_sync","next_sync","status"));
746
  }
747
 
748
- }?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  require_once(ENHANCAD_PLUGIN_DIR . 'includes/setup/ShoppingApi.php');
31
  }
32
  }
33
+ /*
34
+ * verstion auto updated
35
+ */
36
+ public function need_auto_update_db(){
37
+ $old_ee_auto_update_id ="tvc_3.0.4";
38
+ $new_ee_auto_update_id ="tvc_4.0.0";
39
+ $ee_auto_update_id = get_option('ee_auto_update_id');
40
+ if($ee_auto_update_id!=""){
41
+ if( $ee_auto_update_id != $new_ee_auto_update_id){
42
+ global $wpdb;
43
+ $tablename = $wpdb->prefix ."ee_products_sync_list";
44
+ $wpdb->query("DROP TABLE IF EXISTS ".$tablename);
45
+ $tablename = $wpdb->prefix ."ee_product_sync_data";
46
+ $this->TVC_Admin_DB_Helper->tvc_safe_truncate_table($tablename);
47
+ $tablename = $wpdb->prefix ."ee_product_sync_call";
48
+ $this->TVC_Admin_DB_Helper->tvc_safe_truncate_table($tablename);
49
+ new TVC_Admin_Auto_Product_sync_Helper();
50
+ update_option("ee_auto_update_id", $new_ee_auto_update_id);
51
+ }
52
+ }else{
53
+ update_option("ee_auto_update_id", $old_ee_auto_update_id);
54
+ }
55
+ }
56
+ /*
57
+ * Check auto update time
58
+ */
59
  public function is_need_to_update_api_to_db(){
60
  if($this->get_subscriptionId() != ""){
61
  $google_detail = $this->get_ee_options_data();
63
  $current = current_time( 'timestamp' );
64
  //echo date( 'M-d-Y H:i', current_time( 'timestamp' ))."==>".date( 'M-d-Y H:i', $google_detail['sync_time']);
65
  $diffrent_hours = floor(( $current - $google_detail['sync_time'])/(60*60));
66
+ if($diffrent_hours > 11){
67
  return true;
68
  }
69
  }else if(empty($google_detail)){
72
  }
73
  return false;
74
  }
75
+ /*
76
+ * if user has subscription id and if DB data is empty then call update data
77
+ */
78
  public function is_ee_options_data_empty(){
79
  if($this->get_subscriptionId() != ""){
80
  if(empty($this->get_ee_options_data())){
82
  }
83
  }
84
  }
85
+
86
+ /*
87
+ * Update user only subscription details in DB
88
+ */
89
+ public function update_subscription_details_api_to_db($googleDetail = null){
90
+ if(empty($googleDetail)){
91
+ $google_detail = $this->customApiObj->getGoogleAnalyticDetail();
92
+ if(property_exists($google_detail,"error") && $google_detail->error == false){
93
+ if(property_exists($google_detail,"data") && $google_detail->data != ""){
94
+ $googleDetail = $google_detail->data;
95
+ }
96
+ }
97
+ }
98
+ if(!empty($googleDetail)){
99
+ $get_ee_options_data = $this->get_ee_options_data();
100
+ $get_ee_options_data["setting"] = $googleDetail;
101
+ $this->set_ee_options_data($get_ee_options_data);
102
  }
103
  }
104
+ /*
105
+ * Update user subscription and shopping details in DB
106
+ */
107
+ public function set_update_api_to_db($googleDetail = null, $is_import_gmc_products = true){
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
  if(empty($googleDetail)){
109
  $google_detail = $this->customApiObj->getGoogleAnalyticDetail();
110
+ if(property_exists($google_detail,"error") && $google_detail->error == false){
111
+ if(property_exists($google_detail,"data") && $google_detail->data != "") {
112
+ $googleDetail = $google_detail->data;
113
  }
114
  }else{
115
+ return array("error"=>true, "message"=>"Please try after some time.");
116
  }
117
  }
118
  $syncProductStat = [];
119
  $syncProductList = [];
120
  $campaigns_list = [];
121
+ if(isset($googleDetail->google_merchant_center_id) && $googleDetail->google_merchant_center_id != ""){
122
+ /*$syncProduct_list_res = $this->customApiObj->getSyncProductList(['merchant_id' => $this->get_merchantId()]);
123
  if(isset($syncProduct_list_res->data) && isset($syncProduct_list_res->status) && $syncProduct_list_res->status == 200){
124
  if (isset($syncProduct_list_res->data->statistics)) {
125
  $syncProductStat = $syncProduct_list_res->data->statistics;
127
  if (isset($syncProduct_list_res->data->products)) {
128
  $syncProductList = $syncProduct_list_res->data->products;
129
  }
130
+ }*/
131
+ if($is_import_gmc_products){
132
+ $this->import_gmc_products_sync_in_db();
133
+ }
134
+ $product_status = $this->TVC_Admin_DB_Helper->tvc_get_counts_groupby('ee_products_sync_list','google_status');
135
+ $syncProductStat = array("approved" => 0, "disapproved" => 0, "pending" => 0 );
136
+ foreach ($product_status as $key => $value) {
137
+ if(isset($value['google_status']) ){
138
+ $syncProductStat[$value['google_status']] = (isset($value['count']) && $value['count'] >0)?$value['count']:0;
139
+ }
140
+ }
141
+ $syncProductStat["total"] = $this->TVC_Admin_DB_Helper->tvc_row_count('ee_products_sync_list');
142
+ }else{
143
+ $syncProductStat = array("total" =>0, "approved" => 0, "disapproved" => 0, "pending" => 0 );
144
+ }
145
+ if(isset($googleDetail->google_ads_id) && $googleDetail->google_ads_id != ""){
146
  $shopping_api = new ShoppingApi();
147
  $campaigns_list_res = $shopping_api->getCampaigns();
148
  if(isset($campaigns_list_res->data) && isset($campaigns_list_res->status) && $campaigns_list_res->status == 200) {
151
  }
152
  }
153
  }
154
+
155
+ $this->set_ee_options_data(array("setting" => $googleDetail, "prod_sync_status" => (object) $syncProductStat, "campaigns_list"=>$campaigns_list, "sync_time"=>current_time( 'timestamp' )));
156
+ return array("error"=>false, "message"=>"Details updated successfully.");
 
 
 
 
 
 
 
 
 
157
  }
158
+ /*
159
+ * import GMC products in DB
160
+ */
161
+ public function import_gmc_products_sync_in_db($next_page_token = null){
162
+ $merchant_id = $this->get_merchantId();
163
+ $last_row = $this->TVC_Admin_DB_Helper->tvc_get_last_row('ee_products_sync_list',array("gmc_id"));
164
+ if(!empty($last_row) && isset($last_row['gmc_id']) && $last_row['gmc_id'] != $merchant_id){
165
+ global $wpdb;
166
+ $tablename = $wpdb->prefix ."ee_products_sync_list";
167
+ $wpdb->query("DROP TABLE IF EXISTS ".$tablename);
168
+ $tablename = $wpdb->prefix ."ee_product_sync_data";
169
+ $this->TVC_Admin_DB_Helper->tvc_safe_truncate_table($tablename);
170
+ $tablename = $wpdb->prefix ."ee_product_sync_call";
171
+ $this->TVC_Admin_DB_Helper->tvc_safe_truncate_table($tablename);
172
+ new TVC_Admin_Auto_Product_sync_Helper();
173
+ }
174
+ if( $merchant_id != "" ){
175
+ $args = array( 'merchant_id' => $merchant_id );
176
+ if($next_page_token != ""){
177
+ $args["pageToken"] = $next_page_token;
178
+ }
179
+ $syncProduct_list_res = $this->customApiObj->getSyncProductList($args);
180
+ if(isset($syncProduct_list_res->data) && isset($syncProduct_list_res->status) && $syncProduct_list_res->status == 200){
181
+ if (isset($syncProduct_list_res->data->products)) {
182
+ $rs_next_page_token = $syncProduct_list_res->data->nextPageToken;
183
+ $sync_product_list = $syncProduct_list_res->data->products;
184
+ if(!empty($sync_product_list)){
185
+ foreach ($sync_product_list as $key => $value) {
186
+ $googleStatus =$value->googleStatus;
187
+ if ($value->googleStatus != "disapproved" && $value->googleStatus != "approved") {
188
+ $googleStatus = "pending";
189
+ }
190
+ $t_data = array(
191
+ 'gmc_id' => $merchant_id,
192
+ 'name'=>$value->name,
193
+ 'product_id'=>$value->productId,
194
+ 'google_status'=>$googleStatus,
195
+ 'image_link'=> $value->imageLink,
196
+ 'issues'=>json_encode($value->issues)
197
+ );
198
+ $where ="product_id = '".$value->productId."'";
199
+ $row_count = $this->TVC_Admin_DB_Helper->tvc_check_row('ee_products_sync_list', $where);
200
+ if($row_count == 0){
201
+ $this->TVC_Admin_DB_Helper->tvc_add_row('ee_products_sync_list', $t_data);
202
+ }
203
+ }
204
+ }
205
+ if($rs_next_page_token!=""){
206
+ $this->import_gmc_products_sync_in_db($rs_next_page_token);
207
+ }
208
+ }
209
+ }
210
+ }
211
+ }
212
+ /*
213
+ * get API data from DB
214
+ */
215
+ public function get_ee_options_data(){
216
+ if(!empty($this->ee_options_data)){
217
+ return $this->ee_options_data;
218
+ }else{
219
+ $this->ee_options_data = unserialize(get_option('ee_api_data'));
220
+ return $this->ee_options_data;
221
+ }
222
+ }
223
+ /*
224
+ * set API data in DB
225
+ */
226
  public function set_ee_options_data($ee_options_data){
227
  update_option("ee_api_data", serialize($ee_options_data));
228
  }
229
+ /*
230
+ * set additional data in DB
231
+ */
232
  public function set_ee_additional_data($ee_additional_data){
233
  update_option("ee_additional_data", serialize($ee_additional_data));
234
  }
235
+ /*
236
+ * get additional data from DB
237
+ */
238
  public function get_ee_additional_data(){
239
  if(!empty($this->ee_additional_data)){
240
  return $this->ee_additional_data;
243
  return $this->ee_additional_data;
244
  }
245
  }
246
+ /*
247
+ * get plugin setting data from DB
248
+ */
249
  public function get_ee_options_settings(){
250
  if(!empty($this->e_options_settings)){
251
  return $this->e_options_settings;
254
  return $this->e_options_settings;
255
  }
256
  }
257
+ /*
258
+ * get subscriptionId
259
+ */
260
  public function get_subscriptionId(){
261
  if(!empty($this->subscriptionId)){
262
  return $this->subscriptionId;
269
  return $this->subscriptionId;
270
  }
271
  }
272
+ /*
273
+ * get merchantId
274
+ */
275
  public function get_merchantId(){
276
  if(!empty($this->merchantId)){
277
  return $this->merchantId;
285
  return $this->merchantId;
286
  }
287
  }
288
+ /*
289
+ * get main_merchantId
290
+ */
291
  public function get_main_merchantId(){
292
  if(!empty($this->main_merchantId)){
293
  return $this->main_merchantId;
301
  return $this->main_merchantId;
302
  }
303
  }
304
+ /*
305
+ * get admin time zone
306
+ */
307
  public function get_time_zone(){
308
  if(!empty($this->time_zone)){
309
  return $this->time_zone;
354
  return $this->woo_country;
355
  }
356
  }
357
+
358
  //tvc_customer = >google_ads_id
359
  public function get_currentCustomerId(){
360
  if(!empty($this->currentCustomerId)){
394
  $spinner_gif = ENHANCAD_PLUGIN_URL . '/admin/images/ajax-loader.gif';
395
  echo '<div class="feed-spinner" id="feed-spinner" style="display:none;">
396
  <img id="img-spinner" src="' . $spinner_gif . '" alt="Loading" />
397
+ </div>';
398
  }
399
 
400
  public function get_gmcAttributes() {
416
  return $attributes;
417
  }
418
  /* start display form input*/
419
+ public function tvc_language_select($name, $class_id="", string $label="Please Select", string $sel_val = "en", bool $require = false){
420
  if($name){
421
  $countries_list = $this->get_gmc_language_list();
422
  ?>
430
  <?php
431
  }
432
  }
433
+ public function tvc_countries_select($name, $class_id="", string $label="Please Select", bool $require = false){
434
  if($name){
435
  $countries_list = $this->get_gmc_countries_list();
436
  $sel_val = $this->get_woo_country();
445
  <?php
446
  }
447
  }
448
+ public function tvc_select($name, $class_id="", string $label="Please Select", string $sel_val = null, bool $require = false, $option_list = array()){
449
  if(!empty($option_list) && $name){
450
  ?>
451
  <select class="form-control select2 <?php echo $class_id; ?> <?php echo ($require == true)?"field-required":""; ?>" name="<?php echo $name; ?>" id="<?php echo $class_id; ?>" >
506
  $setting_status['google_analytic_msg']= "";
507
  }
508
  // for google shopping
 
 
509
  if(property_exists($googleDetail,"google_merchant_center_id") && property_exists($googleDetail,"google_ads_id") ){
510
  //main tab
511
  if( $googleDetail->google_merchant_center_id != "" && $googleDetail->google_ads_id != ""){
740
  public function call_domain_claim(){
741
  $googleDetail = [];
742
  $google_detail = $this->get_ee_options_data();
 
743
  if(isset($google_detail['setting']) && $google_detail['setting']){
744
  $googleDetail = $google_detail['setting'];
745
  if($googleDetail->is_site_verified == '0'){
746
  return array('error'=>true, 'msg'=>"First need to verified your site. Click on site verification refresh icon to verified your site.");
747
  }else if(property_exists($googleDetail,"is_domain_claim") && $googleDetail->is_domain_claim == '0'){
748
+ //'website_url' => $googleDetail->site_url,
749
  $postData = [
750
  'merchant_id' => $googleDetail->merchant_id,
751
+ 'website_url' => get_site_url(),
752
  'subscription_id' => $googleDetail->id,
753
  'account_id' => $googleDetail->google_merchant_center_id
754
  ];
772
  if(isset($google_detail['setting']) && $google_detail['setting']){
773
  $googleDetail = $google_detail['setting'];
774
  if(property_exists($googleDetail,"is_site_verified") && $googleDetail->is_site_verified == '0'){
775
+ //'website_url' => $googleDetail->site_url,
776
  $postData = [
777
+ 'merchant_id' => $googleDetail->merchant_id,
778
+ 'website_url' => get_site_url(),
779
  'subscription_id' => $googleDetail->id,
780
  'account_id' => $googleDetail->google_merchant_center_id
781
  ];
854
  return $this->TVC_Admin_DB_Helper->tvc_get_last_row('ee_product_sync_call', array("total_sync_product","create_sync","next_sync","status"));
855
  }
856
 
857
+ public function tvc_get_post_meta($post_id){
858
+ $where ="post_id = ".$post_id;
859
+ $rows = $this->TVC_Admin_DB_Helper->tvc_get_results_in_array('postmeta', $where, array('meta_key','meta_value'));
860
+ $metas = array();
861
+ if(!empty($rows)){
862
+ foreach($rows as $val){
863
+ $metas[$val['meta_key']] = $val['meta_value'];
864
+ }
865
+ }
866
+ return $metas;
867
+ }
868
+
869
+ public function getTableColumns($table) {
870
+ global $wpdb;
871
+ $tablename = $wpdb->prefix .$table;
872
+ return $wpdb->get_results("SELECT column_name as field FROM information_schema.columns WHERE table_name = '$table'");
873
+ }
874
+
875
+ public function getTableData($table = null, $columns = array()) {
876
+ if($table ==""){
877
+ $table = $wpdb->prefix.'postmeta';
878
+ }
879
+ global $wpdb;
880
+ return $wpdb->get_results("SELECT DISTINCT " . implode(',', $columns) . " as field FROM $table");
881
+ }
882
+ /* message notification */
883
+ public function set_ee_msg_nofification_list($ee_msg_list){
884
+ update_option("ee_msg_nofifications", serialize($ee_msg_list));
885
+ }
886
+ public function get_ee_msg_nofification_list(){
887
+ return unserialize(get_option('ee_msg_nofifications'));
888
+ }
889
+ public function add_ee_msg_nofification($key, $html, $title = null, $link = null, $link_title = null, $overwrite= false, $link_type = "internal"){
890
+ $ee_msg_list = $this->get_ee_msg_nofification_list();
891
+ if((!isset($ee_msg_list[$key]) && $html !="") ||($overwrite == true && isset($ee_msg_list[$key]) && $html !="")){
892
+ $msg = array();
893
+ $date_formate=get_option('date_format')." ".get_option('time_format');
894
+ if($date_formate ==""){
895
+ $date_formate = 'M-d-Y';
896
+ }
897
+ $msg["title"] = isset($title)?$title:"";
898
+ $msg["date"] = date( $date_formate, current_time( 'timestamp' ) );
899
+ $msg["html"] = base64_encode((isset($html))?$html:"");
900
+ if($link != ""){
901
+ $msg["link"] = $link;
902
+ $msg["link_title"] = (isset($link_title) && $link_title)?$link_title:"Learn more";
903
+ $msg["link_type"] = $link_type;
904
+ }
905
+ $msg["active"] = 1;
906
+ $ee_msg_list[$key] = $msg;
907
+ $this->set_ee_msg_nofification_list($ee_msg_list);
908
+ }
909
+ }
910
+
911
+ public function add_tvc_fixed_nofification(){
912
+ $nofifications = [];
913
+ /*
914
+ * add fixed notification
915
+ */
916
+ $nofifications["tvc_f_notif_1"] = array(
917
+ "tittle"=>"Congratulations..!! You are one step closer.",
918
+ "html"=>"Thanks for installing the new avatar of Enhanced Ecommerce for WooCommerce plugin. Explore the full potential of Google Analytics, Google Ads and Google shopping by setting up all your Google accounts and take data driven decisions to scale your eCommerce business faster."
919
+ );
920
+ $nofifications["tvc_f_notif_2"] = array(
921
+ "tittle"=>"Share your feedback.",
922
+ "html"=>"Your feedback is very important to us. Please write about your experience and the the new feature requests here.",
923
+ "link"=>"https://wordpress.org/support/plugin/enhanced-e-commerce-for-woocommerce-store/reviews/",
924
+ "link_title"=>"Share Feedback",
925
+ "link_type"=>"external"
926
+ );
927
+ /*
928
+ * add payment notification
929
+ */
930
+ $google_detail = $this->get_ee_options_data();
931
+ if(isset($google_detail['setting'])){
932
+ $googleDetail = $google_detail['setting'];
933
+
934
+ if(isset($googleDetail->subscription_expiry_date) && !in_array($googleDetail->plan_id, array("1"))){
935
+ $current = strtotime("now");
936
+ //echo "<br>curent date: ".date( 'M-d-Y H:i',$current);
937
+ $subscription_expiry_time = strtotime($googleDetail->subscription_expiry_date);
938
+ //echo "<br>subscription expiry date: ".date( 'M-d-Y H:i',$subscription_expiry_time);
939
+ $diffrent_day = floor(( $subscription_expiry_time - $current)/(60*60*24) +1);
940
+ if($diffrent_day < 6 && $diffrent_day > 0){
941
+ $befor_day = $diffrent_day." ".($diffrent_day == 1 ? 'day':'days');
942
+ $nofifications["tvc_pay_not_".date("YYYY_m_d",$current)] = array(
943
+ "tittle"=>"Gentle reminder",
944
+ "html"=>"Your plan is expiring in ".$befor_day.". Payment will be auto debited from your configured paypal account on “next billing date”."
945
+ );
946
+ }
947
+ $diffrent_day = floor(( $current - $subscription_expiry_time)/(60*60*24)-1);
948
+ /*if($diffrent_day == 5 ){
949
+ $nofifications["tvc_expired_plan_not_".date("YYYY_m_d",$current)] = array(
950
+ "tittle"=>"Your plan expired.",
951
+ "html"=>"Your subscription plan has been expiring in some time."
952
+ );
953
+ }*/
954
+ if($diffrent_day == 6 ){
955
+ $nofifications["tvc_expired_plan_not_".date("YYYY_m_d",$current)] = array(
956
+ "tittle"=>"Plan Expired..!!",
957
+ "html"=>"Your plan is expired now. Contact “analytics2@tatvic.com” or call us at “(415) 968-6313” to renew your plan."
958
+ );
959
+ }
960
+ }
961
+
962
+ }
963
+ /*
964
+ * add notifications
965
+ */
966
+ if(!empty($nofifications)){
967
+ foreach ($nofifications as $key => $value){
968
+ if(isset($value["html"]) && $value["html"] != ""){
969
+ $n_link = isset($value["link"])?$value["link"]:"";
970
+ $n_link_title = isset($value["link_title"])?$value["link_title"]:"";
971
+ $link_type = isset($value["link_type"])?$value["link_type"]:"";
972
+ $this->add_ee_msg_nofification( $key, $value["html"], $value["tittle"], $n_link, $n_link_title, "", $link_type);
973
+ }
974
+ }
975
+ }
976
+ }
977
+
978
+ public function active_licence($licence_key, $subscription_id){
979
+ if($licence_key != ""){
980
+ $customObj = new CustomApi();
981
+ return $customObj->active_licence_Key($licence_key, $subscription_id);
982
+ }
983
+ }
984
+
985
+ public function get_pro_plan_site(){
986
+ return "https://codecanyon.net/item/actionable-google-analytics-for-woocommerce/9899552?utm_source=TatvicEE&utm_medium=DashboardBuyBottom&utm_campaign=WPlisting";
987
+ }
988
+
989
+ public function is_ga_property(){
990
+ $data = $this->get_ee_options_settings();
991
+ $is_connected = false;
992
+ if((isset($data['ga_id']) && $data['ga_id'] != '') || (isset($data['ga_id']) && $data['ga_id'] != '')){
993
+ return true;
994
+ }else{
995
+ return false;
996
+ }
997
+ }
998
+ }
admin/css/bootstrap.rtl.min.css ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ @charset "UTF-8";/*!
2
+ * Bootstrap v5.0.1 (https://getbootstrap.com/)
3
+ * Copyright 2011-2021 The Bootstrap Authors
4
+ * Copyright 2011-2021 Twitter, Inc.
5
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
6
+ */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0))}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-font-sans-serif);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-right:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-right:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:right}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:right;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:right}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}[type=email],[type=number],[type=tel],[type=url]{direction:ltr}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-right:0;list-style:none}.list-inline{padding-right:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-left:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{width:100%;padding-left:var(--bs-gutter-x,.75rem);padding-right:var(--bs-gutter-x,.75rem);margin-left:auto;margin-right:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-left:calc(var(--bs-gutter-x)/ -2);margin-right:calc(var(--bs-gutter-x)/ -2)}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-left:calc(var(--bs-gutter-x)/ 2);padding-right:calc(var(--bs-gutter-x)/ 2);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.3333333333%}.col-2{flex:0 0 auto;width:16.6666666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.3333333333%}.col-5{flex:0 0 auto;width:41.6666666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.3333333333%}.col-8{flex:0 0 auto;width:66.6666666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.3333333333%}.col-11{flex:0 0 auto;width:91.6666666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-right:8.3333333333%}.offset-2{margin-right:16.6666666667%}.offset-3{margin-right:25%}.offset-4{margin-right:33.3333333333%}.offset-5{margin-right:41.6666666667%}.offset-6{margin-right:50%}.offset-7{margin-right:58.3333333333%}.offset-8{margin-right:66.6666666667%}.offset-9{margin-right:75%}.offset-10{margin-right:83.3333333333%}.offset-11{margin-right:91.6666666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.3333333333%}.col-sm-2{flex:0 0 auto;width:16.6666666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.3333333333%}.col-sm-5{flex:0 0 auto;width:41.6666666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.3333333333%}.col-sm-8{flex:0 0 auto;width:66.6666666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.3333333333%}.col-sm-11{flex:0 0 auto;width:91.6666666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-right:0}.offset-sm-1{margin-right:8.3333333333%}.offset-sm-2{margin-right:16.6666666667%}.offset-sm-3{margin-right:25%}.offset-sm-4{margin-right:33.3333333333%}.offset-sm-5{margin-right:41.6666666667%}.offset-sm-6{margin-right:50%}.offset-sm-7{margin-right:58.3333333333%}.offset-sm-8{margin-right:66.6666666667%}.offset-sm-9{margin-right:75%}.offset-sm-10{margin-right:83.3333333333%}.offset-sm-11{margin-right:91.6666666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.3333333333%}.col-md-2{flex:0 0 auto;width:16.6666666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.3333333333%}.col-md-5{flex:0 0 auto;width:41.6666666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.3333333333%}.col-md-8{flex:0 0 auto;width:66.6666666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.3333333333%}.col-md-11{flex:0 0 auto;width:91.6666666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-right:0}.offset-md-1{margin-right:8.3333333333%}.offset-md-2{margin-right:16.6666666667%}.offset-md-3{margin-right:25%}.offset-md-4{margin-right:33.3333333333%}.offset-md-5{margin-right:41.6666666667%}.offset-md-6{margin-right:50%}.offset-md-7{margin-right:58.3333333333%}.offset-md-8{margin-right:66.6666666667%}.offset-md-9{margin-right:75%}.offset-md-10{margin-right:83.3333333333%}.offset-md-11{margin-right:91.6666666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.3333333333%}.col-lg-2{flex:0 0 auto;width:16.6666666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.3333333333%}.col-lg-5{flex:0 0 auto;width:41.6666666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.3333333333%}.col-lg-8{flex:0 0 auto;width:66.6666666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.3333333333%}.col-lg-11{flex:0 0 auto;width:91.6666666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-right:0}.offset-lg-1{margin-right:8.3333333333%}.offset-lg-2{margin-right:16.6666666667%}.offset-lg-3{margin-right:25%}.offset-lg-4{margin-right:33.3333333333%}.offset-lg-5{margin-right:41.6666666667%}.offset-lg-6{margin-right:50%}.offset-lg-7{margin-right:58.3333333333%}.offset-lg-8{margin-right:66.6666666667%}.offset-lg-9{margin-right:75%}.offset-lg-10{margin-right:83.3333333333%}.offset-lg-11{margin-right:91.6666666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.3333333333%}.col-xl-2{flex:0 0 auto;width:16.6666666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.3333333333%}.col-xl-5{flex:0 0 auto;width:41.6666666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.3333333333%}.col-xl-8{flex:0 0 auto;width:66.6666666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.3333333333%}.col-xl-11{flex:0 0 auto;width:91.6666666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-right:0}.offset-xl-1{margin-right:8.3333333333%}.offset-xl-2{margin-right:16.6666666667%}.offset-xl-3{margin-right:25%}.offset-xl-4{margin-right:33.3333333333%}.offset-xl-5{margin-right:41.6666666667%}.offset-xl-6{margin-right:50%}.offset-xl-7{margin-right:58.3333333333%}.offset-xl-8{margin-right:66.6666666667%}.offset-xl-9{margin-right:75%}.offset-xl-10{margin-right:83.3333333333%}.offset-xl-11{margin-right:91.6666666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.3333333333%}.col-xxl-2{flex:0 0 auto;width:16.6666666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.3333333333%}.col-xxl-5{flex:0 0 auto;width:41.6666666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.3333333333%}.col-xxl-8{flex:0 0 auto;width:66.6666666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.3333333333%}.col-xxl-11{flex:0 0 auto;width:91.6666666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-right:0}.offset-xxl-1{margin-right:8.3333333333%}.offset-xxl-2{margin-right:16.6666666667%}.offset-xxl-3{margin-right:25%}.offset-xxl-4{margin-right:33.3333333333%}.offset-xxl-5{margin-right:41.6666666667%}.offset-xxl-6{margin-right:50%}.offset-xxl-7{margin-right:58.3333333333%}.offset-xxl-8{margin-right:66.6666666667%}.offset-xxl-9{margin-right:75%}.offset-xxl-10{margin-right:83.3333333333%}.offset-xxl-11{margin-right:91.6666666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-bg:transparent;--bs-table-accent-bg:transparent;--bs-table-striped-color:#212529;--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:#212529;--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:#212529;--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg:#cfe2ff;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:#000;border-color:#bacbe6}.table-secondary{--bs-table-bg:#e2e3e5;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:#000;border-color:#cbccce}.table-success{--bs-table-bg:#d1e7dd;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:#000;border-color:#bcd0c7}.table-info{--bs-table-bg:#cff4fc;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:#000;border-color:#badce3}.table-warning{--bs-table-bg:#fff3cd;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:#000;border-color:#e6dbb9}.table-danger{--bs-table-bg:#f8d7da;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg:#f8f9fa;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg:#212529;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:#fff;border-color:#373b3e}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-left:0;padding-right:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{max-width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem .75rem .375rem 2.25rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:left .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-left:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-right:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-right:1rem;font-size:1.25rem}.form-check{display:block;min-height:1.5rem;padding-right:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:right;margin-right:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{opacity:.5}.form-switch{padding-right:2.5em}.form-switch .form-check-input{width:2em;margin-right:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:right center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:left center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline{display:inline-block;margin-left:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);padding:1rem .75rem}.form-floating>label{position:absolute;top:0;right:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:100% 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(-.15rem)}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(-.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(-.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-left:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu){border-top-left-radius:0;border-bottom-left-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-right:-1px;border-top-right-radius:0;border-bottom-right-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#198754;padding-left:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:left calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-left:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) left calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-left:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:left .75rem center,center left 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-right:.5em}.input-group .form-control.is-valid,.input-group .form-select.is-valid,.was-validated .input-group .form-control:valid,.was-validated .input-group .form-select:valid{z-index:1}.input-group .form-control.is-valid:focus,.input-group .form-select.is-valid:focus,.was-validated .input-group .form-control:valid:focus,.was-validated .input-group .form-select:valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-left:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:left calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-left:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) left calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-left:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:left .75rem center,center left 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-right:.5em}.input-group .form-control.is-invalid,.input-group .form-select.is-invalid,.was-validated .input-group .form-control:invalid,.was-validated .input-group .form-select:invalid{z-index:2}.input-group .form-control.is-invalid:focus,.input-group .form-select.is-invalid:focus,.was-validated .input-group .form-control:invalid:focus,.was-validated .input-group .form-select:invalid:focus{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-primary:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-check:active+.btn-primary,.btn-check:checked+.btn-primary,.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:active+.btn-primary:focus,.btn-check:checked+.btn-primary:focus,.btn-primary.active:focus,.btn-primary:active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-check:active+.btn-secondary,.btn-check:checked+.btn-secondary,.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:active+.btn-secondary:focus,.btn-check:checked+.btn-secondary:focus,.btn-secondary.active:focus,.btn-secondary:active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-success{color:#fff;background-color:#198754;border-color:#198754}.btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-check:active+.btn-success,.btn-check:checked+.btn-success,.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:active+.btn-success:focus,.btn-check:checked+.btn-success:focus,.btn-success.active:focus,.btn-success:active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-info{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-info:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-check:active+.btn-info,.btn-check:checked+.btn-info,.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:active+.btn-info:focus,.btn-check:checked+.btn-info:focus,.btn-info.active:focus,.btn-info:active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-info.disabled,.btn-info:disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-check:active+.btn-warning,.btn-check:checked+.btn-warning,.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:active+.btn-warning:focus,.btn-check:checked+.btn-warning:focus,.btn-warning.active:focus,.btn-warning:active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-check:active+.btn-danger,.btn-check:checked+.btn-danger,.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:active+.btn-danger:focus,.btn-check:checked+.btn-danger:focus,.btn-danger.active:focus,.btn-danger:active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-check:active+.btn-light,.btn-check:checked+.btn-light,.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:active+.btn-light:focus,.btn-check:checked+.btn-light:focus,.btn-light.active:focus,.btn-light:active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-light.disabled,.btn-light:disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-dark{color:#fff;background-color:#212529;border-color:#212529}.btn-dark:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-check:active+.btn-dark,.btn-check:checked+.btn-dark,.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:active+.btn-dark:focus,.btn-check:checked+.btn-dark:focus,.btn-dark.active:focus,.btn-dark:active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#212529;border-color:#212529}.btn-outline-primary{color:#0d6efd;border-color:#0d6efd}.btn-outline-primary:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-check:active+.btn-outline-primary,.btn-check:checked+.btn-outline-primary,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show,.btn-outline-primary:active{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:active+.btn-outline-primary:focus,.btn-check:checked+.btn-outline-primary:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus,.btn-outline-primary:active:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0d6efd;background-color:transparent}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-check:active+.btn-outline-secondary,.btn-check:checked+.btn-outline-secondary,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show,.btn-outline-secondary:active{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:active+.btn-outline-secondary:focus,.btn-check:checked+.btn-outline-secondary:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus,.btn-outline-secondary:active:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-check:active+.btn-outline-success,.btn-check:checked+.btn-outline-success,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show,.btn-outline-success:active{color:#fff;background-color:#198754;border-color:#198754}.btn-check:active+.btn-outline-success:focus,.btn-check:checked+.btn-outline-success:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus,.btn-outline-success:active:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-info:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-check:active+.btn-outline-info,.btn-check:checked+.btn-outline-info,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show,.btn-outline-info:active{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:active+.btn-outline-info:focus,.btn-check:checked+.btn-outline-info:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus,.btn-outline-info:active:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#0dcaf0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-check:active+.btn-outline-warning,.btn-check:checked+.btn-outline-warning,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show,.btn-outline-warning:active{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:active+.btn-outline-warning:focus,.btn-check:checked+.btn-outline-warning:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus,.btn-outline-warning:active:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-check:active+.btn-outline-danger,.btn-check:checked+.btn-outline-danger,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show,.btn-outline-danger:active{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:active+.btn-outline-danger:focus,.btn-check:checked+.btn-outline-danger:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus,.btn-outline-danger:active:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-check:active+.btn-outline-light,.btn-check:checked+.btn-outline-light,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show,.btn-outline-light:active{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:active+.btn-outline-light:focus,.btn-check:checked+.btn-outline-light:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus,.btn-outline-light:active:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#212529;border-color:#212529}.btn-outline-dark:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-check:active+.btn-outline-dark,.btn-check:checked+.btn-outline-dark,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show,.btn-outline-dark:active{color:#fff;background-color:#212529;border-color:#212529}.btn-check:active+.btn-outline-dark:focus,.btn-check:checked+.btn-outline-dark:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus,.btn-outline-dark:active:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#212529;background-color:transparent}.btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}.btn-link:hover{color:#0a58ca}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropend,.dropstart,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-left:.3em solid transparent;border-bottom:0;border-right:.3em solid transparent}.dropdown-toggle:empty::after{margin-right:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#212529;text-align:right;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu[data-bs-popper]{top:100%;right:0;margin-top:.125rem}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:0;border-left:.3em solid transparent;border-bottom:.3em solid;border-right:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-right:0}.dropend .dropdown-menu[data-bs-popper]{top:0;left:auto;right:100%;margin-top:0;margin-right:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-left:0;border-bottom:.3em solid transparent;border-right:.3em solid}.dropend .dropdown-toggle:empty::after{margin-right:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;left:100%;right:auto;margin-top:0;margin-left:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-right:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-left:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-right:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:focus,.dropdown-menu-dark .dropdown-item:hover{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-right:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-right-radius:0;border-bottom-right-radius:0}.dropdown-toggle-split{padding-left:.5625rem;padding-right:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-right:0}.dropstart .dropdown-toggle-split::before{margin-left:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-left:.375rem;padding-right:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-left:.75rem;padding-right:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-left-radius:0;border-bottom-right-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-right-radius:0;border-top-left-radius:0}.nav{display:flex;flex-wrap:wrap;padding-right:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#0d6efd;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:#0a58ca}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:0 0;border:1px solid transparent;border-top-right-radius:.25rem;border-top-left-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.nav-pills .nav-link{background:0 0;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#0d6efd}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-left:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-right:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-left:0;padding-right:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem;transition:box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.55)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.55);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.55)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.55);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.55)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-left:0;margin-right:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-right-radius:calc(.25rem - 1px);border-top-left-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-left-radius:calc(.25rem - 1px);border-bottom-right-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-right:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.5rem 1rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-left:-.5rem;margin-bottom:-.5rem;margin-right:-.5rem;border-bottom:0}.card-header-pills{margin-left:-.5rem;margin-right:-.5rem}.card-img-overlay{position:absolute;top:0;left:0;bottom:0;right:0;padding:1rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-right-radius:calc(.25rem - 1px);border-top-left-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-left-radius:calc(.25rem - 1px);border-bottom-right-radius:calc(.25rem - 1px)}.card-group>.card{margin-bottom:.75rem}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-right:0;border-right:0}.card-group>.card:not(:last-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:not(:first-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-right-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;text-align:right;background-color:#fff;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#0c63e4;background-color:#e7f1ff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-right:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px solid rgba(0,0,0,.125)}.accordion-item:first-of-type{border-top-right-radius:.25rem;border-top-left-radius:.25rem}.accordion-item:first-of-type .accordion-button{border-top-right-radius:calc(.25rem - 1px);border-top-left-radius:calc(.25rem - 1px)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-left-radius:calc(.25rem - 1px);border-bottom-right-radius:calc(.25rem - 1px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-left:0;border-right:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-right:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:right;padding-left:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-right:0;list-style:none}.page-link{position:relative;display:block;color:#0d6efd;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#0a58ca;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#0a58ca;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.page-item:not(:first-child) .page-link{margin-right:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item:last-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-left:3rem}.alert-dismissible .btn-close{position:absolute;top:0;left:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{color:#636464;background-color:#fefefe;border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{color:#141619;background-color:#d3d3d4;border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{display:flex;flex-direction:column;padding-right:0;margin-bottom:0;border-radius:.25rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#212529;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-right-radius:inherit;border-top-left-radius:inherit}.list-group-item:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-right-radius:.25rem;border-top-left-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-left-radius:.25rem;border-bottom-right-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-right-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-right:-1px;border-right-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-right-radius:.25rem;border-top-left-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-left-radius:.25rem;border-bottom-right-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-right-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-right:-1px;border-right-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-right-radius:.25rem;border-top-left-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-left-radius:.25rem;border-bottom-right-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-right-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-right:-1px;border-right-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-right-radius:.25rem;border-top-left-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-left-radius:.25rem;border-bottom-right-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-right-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-right:-1px;border-right-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-right-radius:.25rem;border-top-left-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-left-radius:.25rem;border-bottom-right-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-right-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-right:-1px;border-right-width:1px}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-right-radius:.25rem;border-top-left-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-left-radius:.25rem;border-bottom-right-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-right-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-right:-1px;border-right-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem rgba(0,0,0,.15);border-radius:.25rem}.toast:not(.showing):not(.show){opacity:0}.toast.hide{display:none}.toast-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-right-radius:calc(.25rem - 1px);border-top-left-radius:calc(.25rem - 1px)}.toast-header .btn-close{margin-left:-.375rem;margin-right:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;right:0;z-index:1060;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-right-radius:calc(.3rem - 1px);border-top-left-radius:calc(.3rem - 1px)}.modal-header .btn-close{padding:.5rem .5rem;margin:-.5rem auto -.5rem -.5rem}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-left-radius:calc(.3rem - 1px);border-bottom-right-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:right;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[data-popper-placement^=right],.bs-tooltip-end{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.bs-tooltip-auto[data-popper-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[data-popper-placement^=left],.bs-tooltip-start{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:right;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;right:50%;display:block;width:1rem;margin-right:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid #d8d8d8;border-top-right-radius:calc(.3rem - 1px);border-top-left-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:right;width:100%;margin-left:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{right:0}.carousel-control-next{left:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;left:0;bottom:0;right:0;z-index:2;display:flex;justify-content:center;padding:0;margin-left:15%;margin-bottom:1rem;margin-right:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-left:3px;margin-right:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;left:15%;bottom:1.25rem;right:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-left-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1050;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1rem}.offcanvas-header .btn-close{padding:.5rem .5rem;margin:-.5rem auto -.5rem -.5rem}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1rem 1rem;overflow-y:auto}.offcanvas-start{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,.2);transform:translateX(100%)}.offcanvas-end{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,.2);transform:translateX(-100%)}.offcanvas-top{top:0;left:0;right:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,.2);transform:translateY(-100%)}.offcanvas-bottom{left:0;right:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#0d6efd}.link-primary:focus,.link-primary:hover{color:#0a58ca}.link-secondary{color:#6c757d}.link-secondary:focus,.link-secondary:hover{color:#565e64}.link-success{color:#198754}.link-success:focus,.link-success:hover{color:#146c43}.link-info{color:#0dcaf0}.link-info:focus,.link-info:hover{color:#3dd5f3}.link-warning{color:#ffc107}.link-warning:focus,.link-warning:hover{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:focus,.link-danger:hover{color:#b02a37}.link-light{color:#f8f9fa}.link-light:focus,.link-light:hover{color:#f9fafb}.link-dark{color:#212529}.link-dark:focus,.link-dark:hover{color:#1a1e21}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;right:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio:calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio:calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;left:0;right:0;z-index:1030}.fixed-bottom{position:fixed;left:0;bottom:0;right:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;left:0;bottom:0;right:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:right!important}.float-end{float:left!important}.float-none{float:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{right:0!important}.start-50{right:50%!important}.start-100{right:100%!important}.end-0{left:0!important}.end-50{left:50%!important}.end-100{left:100%!important}.translate-middle{transform:translate(50%,-50%)!important}.translate-middle-x{transform:translateX(50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px solid #dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-left:1px solid #dee2e6!important}.border-end-0{border-left:0!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-right:1px solid #dee2e6!important}.border-start-0{border-right:0!important}.border-primary{border-color:#0d6efd!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#198754!important}.border-info{border-color:#0dcaf0!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#212529!important}.border-white{border-color:#fff!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-left:0!important;margin-right:0!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-3{margin-left:1rem!important;margin-right:1rem!important}.mx-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-5{margin-left:3rem!important;margin-right:3rem!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-left:0!important}.me-1{margin-left:.25rem!important}.me-2{margin-left:.5rem!important}.me-3{margin-left:1rem!important}.me-4{margin-left:1.5rem!important}.me-5{margin-left:3rem!important}.me-auto{margin-left:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-right:0!important}.ms-1{margin-right:.25rem!important}.ms-2{margin-right:.5rem!important}.ms-3{margin-right:1rem!important}.ms-4{margin-right:1.5rem!important}.ms-5{margin-right:3rem!important}.ms-auto{margin-right:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-left:0!important;padding-right:0!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-3{padding-left:1rem!important;padding-right:1rem!important}.px-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-5{padding-left:3rem!important;padding-right:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-left:0!important}.pe-1{padding-left:.25rem!important}.pe-2{padding-left:.5rem!important}.pe-3{padding-left:1rem!important}.pe-4{padding-left:1.5rem!important}.pe-5{padding-left:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-right:0!important}.ps-1{padding-right:.25rem!important}.ps-2{padding-right:.5rem!important}.ps-3{padding-right:1rem!important}.ps-4{padding-right:1.5rem!important}.ps-5{padding-right:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:right!important}.text-end{text-align:left!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-primary{color:#0d6efd!important}.text-secondary{color:#6c757d!important}.text-success{color:#198754!important}.text-info{color:#0dcaf0!important}.text-warning{color:#ffc107!important}.text-danger{color:#dc3545!important}.text-light{color:#f8f9fa!important}.text-dark{color:#212529!important}.text-white{color:#fff!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-reset{color:inherit!important}.bg-primary{background-color:#0d6efd!important}.bg-secondary{background-color:#6c757d!important}.bg-success{background-color:#198754!important}.bg-info{background-color:#0dcaf0!important}.bg-warning{background-color:#ffc107!important}.bg-danger{background-color:#dc3545!important}.bg-light{background-color:#f8f9fa!important}.bg-dark{background-color:#212529!important}.bg-body{background-color:#fff!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.25rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.2rem!important}.rounded-2{border-radius:.25rem!important}.rounded-3{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-right-radius:.25rem!important;border-top-left-radius:.25rem!important}.rounded-end{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-bottom{border-bottom-left-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-start{border-bottom-right-radius:.25rem!important;border-top-right-radius:.25rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:right!important}.float-sm-end{float:left!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-left:0!important;margin-right:0!important}.mx-sm-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-sm-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-sm-3{margin-left:1rem!important;margin-right:1rem!important}.mx-sm-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-sm-5{margin-left:3rem!important;margin-right:3rem!important}.mx-sm-auto{margin-left:auto!important;margin-right:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-left:0!important}.me-sm-1{margin-left:.25rem!important}.me-sm-2{margin-left:.5rem!important}.me-sm-3{margin-left:1rem!important}.me-sm-4{margin-left:1.5rem!important}.me-sm-5{margin-left:3rem!important}.me-sm-auto{margin-left:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-right:0!important}.ms-sm-1{margin-right:.25rem!important}.ms-sm-2{margin-right:.5rem!important}.ms-sm-3{margin-right:1rem!important}.ms-sm-4{margin-right:1.5rem!important}.ms-sm-5{margin-right:3rem!important}.ms-sm-auto{margin-right:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-left:0!important;padding-right:0!important}.px-sm-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-sm-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-sm-3{padding-left:1rem!important;padding-right:1rem!important}.px-sm-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-sm-5{padding-left:3rem!important;padding-right:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-left:0!important}.pe-sm-1{padding-left:.25rem!important}.pe-sm-2{padding-left:.5rem!important}.pe-sm-3{padding-left:1rem!important}.pe-sm-4{padding-left:1.5rem!important}.pe-sm-5{padding-left:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-right:0!important}.ps-sm-1{padding-right:.25rem!important}.ps-sm-2{padding-right:.5rem!important}.ps-sm-3{padding-right:1rem!important}.ps-sm-4{padding-right:1.5rem!important}.ps-sm-5{padding-right:3rem!important}.text-sm-start{text-align:right!important}.text-sm-end{text-align:left!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:right!important}.float-md-end{float:left!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-left:0!important;margin-right:0!important}.mx-md-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-md-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-md-3{margin-left:1rem!important;margin-right:1rem!important}.mx-md-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-md-5{margin-left:3rem!important;margin-right:3rem!important}.mx-md-auto{margin-left:auto!important;margin-right:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-left:0!important}.me-md-1{margin-left:.25rem!important}.me-md-2{margin-left:.5rem!important}.me-md-3{margin-left:1rem!important}.me-md-4{margin-left:1.5rem!important}.me-md-5{margin-left:3rem!important}.me-md-auto{margin-left:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-right:0!important}.ms-md-1{margin-right:.25rem!important}.ms-md-2{margin-right:.5rem!important}.ms-md-3{margin-right:1rem!important}.ms-md-4{margin-right:1.5rem!important}.ms-md-5{margin-right:3rem!important}.ms-md-auto{margin-right:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-left:0!important;padding-right:0!important}.px-md-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-md-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-md-3{padding-left:1rem!important;padding-right:1rem!important}.px-md-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-md-5{padding-left:3rem!important;padding-right:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-left:0!important}.pe-md-1{padding-left:.25rem!important}.pe-md-2{padding-left:.5rem!important}.pe-md-3{padding-left:1rem!important}.pe-md-4{padding-left:1.5rem!important}.pe-md-5{padding-left:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-right:0!important}.ps-md-1{padding-right:.25rem!important}.ps-md-2{padding-right:.5rem!important}.ps-md-3{padding-right:1rem!important}.ps-md-4{padding-right:1.5rem!important}.ps-md-5{padding-right:3rem!important}.text-md-start{text-align:right!important}.text-md-end{text-align:left!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:right!important}.float-lg-end{float:left!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-left:0!important;margin-right:0!important}.mx-lg-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-lg-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-lg-3{margin-left:1rem!important;margin-right:1rem!important}.mx-lg-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-lg-5{margin-left:3rem!important;margin-right:3rem!important}.mx-lg-auto{margin-left:auto!important;margin-right:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-left:0!important}.me-lg-1{margin-left:.25rem!important}.me-lg-2{margin-left:.5rem!important}.me-lg-3{margin-left:1rem!important}.me-lg-4{margin-left:1.5rem!important}.me-lg-5{margin-left:3rem!important}.me-lg-auto{margin-left:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-right:0!important}.ms-lg-1{margin-right:.25rem!important}.ms-lg-2{margin-right:.5rem!important}.ms-lg-3{margin-right:1rem!important}.ms-lg-4{margin-right:1.5rem!important}.ms-lg-5{margin-right:3rem!important}.ms-lg-auto{margin-right:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-left:0!important;padding-right:0!important}.px-lg-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-lg-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-lg-3{padding-left:1rem!important;padding-right:1rem!important}.px-lg-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-lg-5{padding-left:3rem!important;padding-right:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-left:0!important}.pe-lg-1{padding-left:.25rem!important}.pe-lg-2{padding-left:.5rem!important}.pe-lg-3{padding-left:1rem!important}.pe-lg-4{padding-left:1.5rem!important}.pe-lg-5{padding-left:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-right:0!important}.ps-lg-1{padding-right:.25rem!important}.ps-lg-2{padding-right:.5rem!important}.ps-lg-3{padding-right:1rem!important}.ps-lg-4{padding-right:1.5rem!important}.ps-lg-5{padding-right:3rem!important}.text-lg-start{text-align:right!important}.text-lg-end{text-align:left!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:right!important}.float-xl-end{float:left!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-left:0!important;margin-right:0!important}.mx-xl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xl-3{margin-left:1rem!important;margin-right:1rem!important}.mx-xl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xl-5{margin-left:3rem!important;margin-right:3rem!important}.mx-xl-auto{margin-left:auto!important;margin-right:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-left:0!important}.me-xl-1{margin-left:.25rem!important}.me-xl-2{margin-left:.5rem!important}.me-xl-3{margin-left:1rem!important}.me-xl-4{margin-left:1.5rem!important}.me-xl-5{margin-left:3rem!important}.me-xl-auto{margin-left:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-right:0!important}.ms-xl-1{margin-right:.25rem!important}.ms-xl-2{margin-right:.5rem!important}.ms-xl-3{margin-right:1rem!important}.ms-xl-4{margin-right:1.5rem!important}.ms-xl-5{margin-right:3rem!important}.ms-xl-auto{margin-right:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-left:0!important;padding-right:0!important}.px-xl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xl-3{padding-left:1rem!important;padding-right:1rem!important}.px-xl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xl-5{padding-left:3rem!important;padding-right:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-left:0!important}.pe-xl-1{padding-left:.25rem!important}.pe-xl-2{padding-left:.5rem!important}.pe-xl-3{padding-left:1rem!important}.pe-xl-4{padding-left:1.5rem!important}.pe-xl-5{padding-left:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-right:0!important}.ps-xl-1{padding-right:.25rem!important}.ps-xl-2{padding-right:.5rem!important}.ps-xl-3{padding-right:1rem!important}.ps-xl-4{padding-right:1.5rem!important}.ps-xl-5{padding-right:3rem!important}.text-xl-start{text-align:right!important}.text-xl-end{text-align:left!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:right!important}.float-xxl-end{float:left!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-left:0!important;margin-right:0!important}.mx-xxl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xxl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xxl-3{margin-left:1rem!important;margin-right:1rem!important}.mx-xxl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xxl-5{margin-left:3rem!important;margin-right:3rem!important}.mx-xxl-auto{margin-left:auto!important;margin-right:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-left:0!important}.me-xxl-1{margin-left:.25rem!important}.me-xxl-2{margin-left:.5rem!important}.me-xxl-3{margin-left:1rem!important}.me-xxl-4{margin-left:1.5rem!important}.me-xxl-5{margin-left:3rem!important}.me-xxl-auto{margin-left:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-right:0!important}.ms-xxl-1{margin-right:.25rem!important}.ms-xxl-2{margin-right:.5rem!important}.ms-xxl-3{margin-right:1rem!important}.ms-xxl-4{margin-right:1.5rem!important}.ms-xxl-5{margin-right:3rem!important}.ms-xxl-auto{margin-right:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-left:0!important;padding-right:0!important}.px-xxl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xxl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xxl-3{padding-left:1rem!important;padding-right:1rem!important}.px-xxl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xxl-5{padding-left:3rem!important;padding-right:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-left:0!important}.pe-xxl-1{padding-left:.25rem!important}.pe-xxl-2{padding-left:.5rem!important}.pe-xxl-3{padding-left:1rem!important}.pe-xxl-4{padding-left:1.5rem!important}.pe-xxl-5{padding-left:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-right:0!important}.ps-xxl-1{padding-right:.25rem!important}.ps-xxl-2{padding-right:.5rem!important}.ps-xxl-3{padding-right:1rem!important}.ps-xxl-4{padding-right:1.5rem!important}.ps-xxl-5{padding-right:3rem!important}.text-xxl-start{text-align:right!important}.text-xxl-end{text-align:left!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}
7
+ /*# sourceMappingURL=bootstrap.rtl.min.css.map */
admin/css/custom-style.css CHANGED
@@ -1,1143 +1,2531 @@
 
1
  html,
2
  body {
3
- height: 100%;
4
  }
5
 
6
  body {
7
- margin: 0;
8
- padding: 0;
9
- -webkit-font-smoothing: antialiased;
10
- -moz-osx-font-smoothing: grayscale;
11
- font-size: 14px;
12
- color: #000000;
13
- font-weight: 400;
14
- line-height: normal;
15
- background-color: #ffffff;
 
16
  }
17
 
18
  p {
19
- font-size: 14px;
20
- line-height: 18px;
21
  }
22
 
23
  a {
24
- -webkit-transition: all ease 0.5s;
25
- transition: all ease 0.5s;
26
- color: #03a2b7;
27
  }
28
 
29
  a:hover {
30
- text-decoration: none;
31
- -webkit-transition: all ease 0.5s;
32
- transition: all ease 0.5s;
33
- color: #03a2b7;
34
  }
35
 
36
  a:focus {
37
- -webkit-box-shadow: none !important;
38
- box-shadow: none !important;
39
  }
40
 
41
  ul {
42
- margin-bottom: 0;
43
  }
44
 
45
  a:focus,
46
  button:focus,
47
  input[type="checkbox"],
48
  input[type="radio"] {
49
- outline: none;
50
  }
51
 
52
  :focus {
53
- -ms-box-shadow: none;
54
- -webkit-box-shadow: none;
55
- box-shadow: none;
56
- outline: none;
57
  }
58
 
59
  .text-underline {
60
- text-decoration: underline;
 
 
 
 
61
  }
62
 
63
  section {
64
- padding: 10px 0;
65
  }
66
 
67
  .title {
68
- font-weight: bold;
69
- font-size: 20px;
70
- margin-bottom: 10px;
71
  }
72
 
73
  .sub-title {
74
- margin-bottom: 5px;
75
- font-size: 14px;
 
 
 
 
76
  }
77
 
78
  .campaigns .campaign-date {
79
- border: 1px solid #d1d1d1;
80
- padding: 8px;
81
  }
82
 
83
  .campaigns .radio-buttons .custom-control-label {
84
- width: 100%;
85
  }
86
 
87
  .chart {
88
- border: 1px solid #d1d1d1;
89
- padding: 8px;
90
- margin-bottom: 15px;
91
- background-color: #FFFFFF;
92
  }
93
 
94
- .dataTables_length {
95
- display: none;
 
 
 
 
 
 
 
 
96
  }
97
 
 
 
 
 
98
  .table-section {
99
- border: 1px solid #d1d1d1;
100
- padding: 8px;
101
- margin-bottom: 15px;
102
- background-color: #FFFFFF;
 
 
 
103
  }
104
 
105
  .table-section .table {
106
- margin-bottom: 0;
107
  }
108
 
109
  .table-section .table thead th {
110
- border: 0;
111
- padding: 0.35rem;
 
 
112
  }
113
 
114
  .table-section .table tr th,
115
  .table-section .table tr td {
116
- border: 0;
117
  }
118
 
119
  .table-section .table tr td {
120
- padding: 0.35rem;
 
121
  }
122
 
123
  .table-section .table tr td.product-image {
124
- /*width: 70px;*/
125
  }
126
 
127
  .table-section .table tr td.product-image img {
128
- width: 100%;
129
- -o-object-fit: cover;
130
- object-fit: cover;
 
 
 
 
 
131
  }
132
 
133
  .table-section .pagination {
134
- -webkit-box-pack: end;
135
- -ms-flex-pack: end;
136
- justify-content: flex-end;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
137
  }
138
 
139
  .btn-white {
140
- background-color: #FFFFFF;
141
- border: 1px solid #000000;
142
- color: #000000;
143
- padding: 5px 10px;
144
- font-size: 14px;
145
- line-height: normal;
146
- border-radius: 0;
147
- font-weight: 700;
148
  }
149
 
150
  .btn-white:focus {
151
- -webkit-box-shadow: none !important;
152
- box-shadow: none !important;
153
  }
154
 
155
  .btn-grey {
156
- background-color: #eeeeee;
157
  }
158
 
159
  .text-underline {
160
- text-decoration: underline;
161
  }
162
 
163
  .arrow-angle {
164
- border-color: #888 transparent transparent transparent;
165
- border-style: solid;
166
- border-width: 8px 7px 0 7px;
167
- height: 0;
168
- width: 0;
169
  }
170
 
171
  .popup-modal .modal-dialog .modal-content {
172
- border-radius: 50px;
173
- border: 2px solid #d1d1d1;
174
- background: #ffffff;
175
  }
176
 
177
  .popup-modal .modal-dialog .modal-header {
178
- text-align: center;
179
- -webkit-box-align: center;
180
- -ms-flex-align: center;
181
- align-items: center;
182
- -webkit-box-pack: center;
183
- -ms-flex-pack: center;
184
- justify-content: center;
185
- border: 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
186
  }
187
 
188
  .accordion .card {
189
- margin-bottom: 15px;
190
- background-color: transparent;
191
- border: 1px solid #d1d1d1 !important;
192
- padding:0 !important;
193
- max-width:100% !important;
194
  }
195
 
196
  .accordion .card:last-child {
197
- margin-bottom: 0 !important;
198
  }
199
 
200
  .accordion .card .card-header {
201
- padding: 0;
202
- background-color: transparent;
203
- border-radius: 0;
204
- border: 0;
205
  }
206
 
207
  .accordion .card .card-header .btn {
208
- padding: 5px 15px;
209
- display: block;
210
- width: 100%;
211
- text-align: left;
212
- color: #000000;
213
- font-weight: 500;
214
- font-size: 14px;
215
- position: relative;
216
- padding-right: 40px !important;
217
  }
218
 
219
  .accordion .card .card-header .btn:hover {
220
- text-decoration: none;
221
  }
222
 
223
  .accordion .card .card-header .btn:focus {
224
- text-decoration: none;
225
- outline: none;
226
- -webkit-box-shadow: none;
227
- box-shadow: none;
228
  }
229
 
230
  .accordion .card .card-header .btn:after {
231
- content: "";
232
- border-color: #888 transparent transparent transparent;
233
- border-style: solid;
234
- border-width: 8px 7px 0 7px;
235
- height: 0;
236
- width: 0;
237
- position: absolute;
238
- right: 10px;
239
- top: 11px;
240
- -webkit-transform: rotate(180deg);
241
- transform: rotate(180deg);
242
  }
243
 
244
  .accordion .card .card-header .btn.collapsed:after {
245
- -webkit-transform: rotate(0deg);
246
- transform: rotate(0deg);
247
  }
248
 
249
  .accordion .card .card-body {
250
- padding: 10px 15px;
251
  }
252
 
253
  .accordion .card .card-body p {
254
- font-size: 14px;
255
- margin-bottom: 0.35rem;
256
  }
257
 
258
  .accordion .card .card-body .table-section {
259
- border: 0;
260
- padding: 0;
261
- margin-bottom: 0;
262
  }
263
 
264
  .accordion .card .card-body .table-section .table tr td {
265
- font-size: 14px;
266
  }
267
 
268
  .accordion-section .accordion .card {
269
- margin-bottom: 15px;
270
- border-radius: 0;
271
- border: 1px solid #d1d1d1;
272
- background-color: #ffffff;
273
  }
274
 
275
  .accordion-section .accordion .card .card-header {
276
- padding: 0;
277
- background-color: transparent;
278
- border-radius: 0;
279
- border: 0;
280
  }
281
 
282
  .accordion-section .accordion .card .card-header .btn {
283
- padding: 5px 10px;
284
- display: block;
285
- width: 100%;
286
- text-align: left;
287
- color: #000000;
288
- font-weight: 700;
289
- font-size: 14px;
290
  }
291
 
292
  .accordion-section .accordion .card .card-header .btn:hover {
293
- text-decoration: none;
294
  }
295
 
296
  .accordion-section .accordion .card .card-header .btn:focus {
297
- text-decoration: none;
298
- outline: none;
299
- -webkit-box-shadow: none;
300
- box-shadow: none;
301
  }
302
 
303
  .accordion-section .accordion .card .card-body {
304
- padding: 10px 15px;
305
  }
306
 
307
  .nbk-tbl {
308
- background-color: transparent;
309
- border: 0;
310
- padding: 0;
311
- margin-bottom: 0;
312
  }
313
 
314
  .card-wrapper {
315
- max-width: 700px;
316
- margin: 0 auto;
317
  }
318
 
319
  .wrapper-main {
320
- max-width: 90%;
321
- margin: 0 auto;
322
- padding-bottom: 15px;
323
  }
324
 
325
  .configuration-section .note-follow {
326
- border: 1px solid #d1d1d1;
327
- padding: 10px 15px;
328
- border-radius: 10px;
329
- margin-bottom: 15px;
330
  }
331
 
332
  .configuration-section .note-follow p {
333
- margin-bottom: 0;
334
  }
335
 
336
  .configuration-section .confg-card .card {
337
- border-radius: 25px;
338
- background-color: #EEEEEE;
339
- border-color: #d1d1d1;
340
- height: 100%;
 
 
 
341
  }
342
 
343
  .configuration-section .confg-card .card .card-header {
344
- background-color: transparent;
345
- border: 0;
346
- text-align: center;
347
- padding-left: 15px;
348
- padding-right: 15px;
349
  }
350
 
351
  .configuration-section .confg-card .card .card-header:first-child {
352
- border-radius: calc(25px - 1px) calc(25px - 1px) 0 0;
353
  }
354
 
355
  .configuration-section .confg-card .card .card-header .confg-title {
356
- font-weight: 700;
357
- font-size: 14px;
358
- margin: 0;
 
359
  }
360
 
361
  .configuration-section .confg-card .card .card-body {
362
- padding: 15px;
363
  }
364
 
365
  .configuration-section .confg-card .card .card-body .list-unstyled {
366
- margin: 0;
367
  }
368
 
369
  .configuration-section .confg-card .card .card-body .list-unstyled li {
370
- display: block;
371
- margin-bottom: 10px;
372
  }
373
 
374
  .configuration-section .confg-card .card .card-body .list-unstyled li:last-child {
375
- margin-bottom: 0;
376
  }
377
 
378
  .configuration-section .confg-card .card .card-body .list-unstyled li .text {
379
- display: block;
380
  }
381
 
382
  .configuration-section .confg-card .card .card-body .list-unstyled li .list-image img {
383
- max-width: 18px;
384
  }
385
 
386
  .configuration-section .confg-card .card .card-footer {
387
- background-color: transparent;
388
- border: 0;
389
- text-align: center;
390
- padding-left: 15px;
391
- padding-right: 15px;
392
  }
393
 
394
  .configuration-section .confg-card .card .card-footer:last-child {
395
- border-radius: 0 0 calc(25px - 1px) calc(25px - 1px);
396
  }
397
 
398
  .configuration-section .confg-card .card .card-footer .explr {
399
- padding: 0;
400
- font-weight: 700;
401
- font-size: 14px;
402
- text-decoration: underline;
403
- color: #000000;
404
  }
405
 
406
  .border-right {
407
- border-right: 1px solid #d1d1d1;
408
  }
409
 
410
  @media (min-width: 576px) {
411
- .modal-sm-custom {
412
- max-width: 355px;
413
- }
414
  }
415
 
416
  .dataTables_paginate .page-item .page-link {
417
- color: #000000;
418
  }
419
 
420
  .dataTables_paginate .page-item.active .page-link {
421
- background-color: #000000;
422
- border-color: #000000;
423
- color: #ffffff !important;
424
- font-weight: 700;
425
  }
426
 
427
  .dataTables_paginate .page-item.disabled {
428
- opacity: 0.5;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
429
  }
430
 
431
  .header-section {
432
- display: block;
 
433
  }
434
 
435
  .header-section .top-section {
436
- background-color: #D9D9D9;
437
- padding: 5px 15px;
438
  }
439
 
440
  .header-section .top-section p {
441
- margin-bottom: 0;
442
- text-align: center;
 
 
443
  }
444
 
445
  .header-section .navbar-section {
446
- border-bottom: 1px solid #d1d1d1;
447
- padding: 5px 0;
448
- margin-bottom: 15px;
 
 
 
449
  }
450
 
451
  .header-section .navbar-section .navbar-brand img {
452
- max-width: 150px;
453
- max-height: 30px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
454
  }
455
 
456
  .header-section .navbar-section .account-dropdown .btn {
457
- border: 0;
458
- font-size: 14px;
459
- font-weight: 700;
460
  }
461
 
462
  .header-section .navbar-section .account-dropdown .btn.dropdown-toggle::after {
463
- border-color: #888 transparent transparent transparent;
464
- border-style: solid;
465
- border-width: 8px 7px 0 7px;
466
- vertical-align: middle;
 
 
 
 
 
467
  }
468
 
469
  .header-section .navbar-section .account-dropdown .btn:focus {
470
- -webkit-box-shadow: none;
471
- box-shadow: none;
472
  }
473
 
474
  .header-section .navbar-section .account-dropdown .dropdown-menu {
475
- padding: 0;
476
- margin: 0;
477
- border-radius: 0;
 
 
 
 
 
478
  }
479
 
480
  .header-section .navbar-section .account-dropdown .dropdown-menu .dropdown-item {
481
- font-size: 14px;
482
- padding: 5px 10px;
 
 
 
 
 
 
 
 
483
  }
484
 
485
  .header-section .navbar-section .account-dropdown .dropdown-menu .dropdown-item:focus {
486
- color: #16181b;
487
- background-color: #f8f9fa;
488
  }
489
 
490
  .form-group {
491
- position: relative;
492
  }
493
 
494
  .form-control, .select2.select2-container--default .select2-selection--single {
495
- border-color: #CCCCCC;
496
- height: 28px;
497
- font-size: 14px;
498
- }
499
-
 
 
 
 
500
  .form-control::-webkit-input-placeholder, .select2.select2-container--default .select2-selection--single::-webkit-input-placeholder {
501
- color: #B2B2B2;
502
  }
503
 
504
  .form-control::-ms-input-placeholder, .select2.select2-container--default .select2-selection--single::-ms-input-placeholder {
505
- color: #B2B2B2;
506
  }
507
 
508
  .form-control:-ms-input-placeholder, .select2.select2-container--default .select2-selection--single:-ms-input-placeholder {
509
- color: #B2B2B2;
510
  }
511
 
512
  .form-control::placeholder, .select2.select2-container--default .select2-selection--single::placeholder {
513
- color: #B2B2B2;
514
  }
515
 
516
  .form-control:focus, .select2.select2-container--default .select2-selection--single:focus {
517
- -ms-box-shadow: none;
518
- -webkit-box-shadow: none;
519
- box-shadow: none;
520
- outline: none;
521
- border-color: #1A2750;
522
  }
523
 
524
  .select2 {
525
- width: 100% !important;
 
 
 
 
 
 
 
 
526
  }
527
 
528
  .select2.select2-container--default .select2-selection__arrow b {
529
- border-color: #888888 transparent transparent transparent !important;
530
- border-width: 8px 7px 0 7px !important;
531
- margin-left: -8px !important;
532
- margin-top: -3.5px !important;
 
 
 
 
 
533
  }
534
 
535
  .select2.select2-container--default.select2-container--open .select2-selection__arrow b {
536
- border-color: transparent transparent #888888 transparent !important;
537
- border-width: 0px 7px 8px 7px !important;
 
 
 
 
538
  }
539
 
540
  .select2-dropdown {
541
- border-color: #CCCCCC !important;
542
  }
543
 
544
  .select2-dropdown .select2-results__options .select2-results__option--highlighted {
545
- background-color: #1A2750 !important;
546
- color: #FFFFFF !important;
547
  }
548
 
549
  .select2-dropdown .select2-results__options .select2-results__option--selected {
550
- background-color: #58AA46 !important;
551
- color: #FFFFFF !important;
552
  }
553
 
554
  .input-daterange .form-control, .input-daterange .select2.select2-container--default .select2-selection--single, .select2.select2-container--default .input-daterange .select2-selection--single {
555
- text-align: left;
556
- border-radius: 0.25rem !important;
 
 
 
557
  }
558
 
559
  .input-daterange .text {
560
- font-size: 14px;
 
 
 
 
 
 
 
 
 
 
561
  }
562
 
563
  .datepicker.datepicker-dropdown {
564
- border-color: #CCCCCC !important;
565
- font-size: 14px;
 
 
 
 
 
 
 
 
 
566
  }
567
 
568
  .datepicker th {
569
- font-weight: 500 !important;
570
  }
571
 
572
  .datepicker td,
573
  .datepicker th {
574
- width: 30px !important;
575
- height: 30px !important;
 
576
  }
577
 
578
  .datepicker td.day.active {
579
- background: #1A2750 !important;
580
  }
581
 
582
  .datepicker td.day.today {
583
- background: #58AA46 !important;
584
- color: #FFFFFF;
585
  }
586
 
587
  .datepicker td span.month.active {
588
- background: #1A2750 !important;
589
  }
590
 
591
  .datepicker td span.year.active, .datepicker td span.year.focused {
592
- background: #1A2750 !important;
593
  }
594
 
595
  .custom-control .custom-control-input:focus ~ .custom-control-label::before {
596
- -ms-box-shadow: none;
597
- -webkit-box-shadow: none;
598
- box-shadow: none;
599
- outline: none;
600
  }
601
 
602
  .custom-control.custom-radio .custom-control-label {
603
- padding-left: 0;
604
  }
605
 
606
  .custom-control.custom-radio .custom-control-label::before {
607
- width: 16px;
608
- height: 16px;
609
- background-color: transparent;
610
- border-width: 1.5px;
611
- border-color: #6b6b6b;
612
- top: 1px;
613
  }
614
 
615
  .custom-control.custom-radio .custom-control-input:checked ~ .custom-control-label::before {
616
- background: #d1d1d1;
617
- border-color: #6b6b6b;
618
  }
619
 
620
  .custom-control.custom-radio .custom-control-input:checked ~ .custom-control-label::after {
621
- width: 10px;
622
- height: 10px;
623
- border-radius: 50%;
624
- background-image: none;
625
- background-color: #000000;
626
- margin-left: 3px;
627
- top: 4px;
628
  }
629
 
630
  .custom-control.custom-checkbox .custom-control-label:before {
631
- border-radius: 0;
632
- margin-top: -3px;
 
633
  }
634
 
635
  .custom-control.custom-checkbox .custom-control-input:checked ~ .custom-control-label:before {
636
- background-color: #000000;
637
- border-color: #000000;
 
638
  }
639
 
640
  .custom-control.custom-checkbox .custom-control-input:checked ~ .custom-control-label:after {
641
- background-color: #000000;
642
- border-color: #000000;
643
- margin-top: -3px;
644
  }
645
 
646
  .custom-control.custom-checkbox .custom-control-input:focus:not(:checked) ~ .custom-control-label::before {
647
- -ms-box-shadow: none;
648
- -webkit-box-shadow: none;
649
- box-shadow: none;
650
- outline: none;
651
- border-color: #000000;
652
  }
653
 
654
  .custom-switch .custom-control-label:before {
655
- border-radius: 3px;
 
 
656
  }
657
 
658
  .custom-switch .custom-control-label:after {
659
- width: calc(20px);
660
- height: calc(20px);
661
- border-radius: 50%;
662
- top: 1.5px;
663
- left: calc(-2.65rem + 2px);
664
  }
665
 
666
  .custom-switch .custom-control-input:checked ~ .custom-control-label:after {
667
- background-color: #38761d;
668
- -webkit-transform: translateX(1.25rem);
669
- transform: translateX(1.25rem);
 
670
  }
671
 
672
- .custom-switch .custom-control-input:checked ~ .custom-control-label:before {
673
- border-color: #adb5bd;
674
- background-color: #FFFFFF;
675
  }
676
 
677
  textarea.form-control, .select2.select2-container--default textarea.select2-selection--single {
678
- height: auto !important;
679
  }
680
 
681
  .form-label-control {
682
- margin-bottom: 0.8rem;
 
683
  }
684
 
685
  .campaign-date .custom-control-label {
686
- display: inline;
687
  }
688
 
689
  .campaign-date .custom-control-label .custom-radio .select2 {
690
- vertical-align: middle;
691
  }
692
 
693
  .wiz-tab .nav-pills {
694
- border-top: 1px solid #eeeeee;
695
- border-bottom: 1px solid #eeeeee;
 
 
696
  }
697
 
 
 
 
 
 
 
 
 
 
698
  .wiz-tab .nav-pills .nav-item .nav-link {
699
- color: #000000;
700
- border-left: 1px solid #eeeeee;
701
- padding: 5px 10px;
702
- -webkit-box-align: center;
703
- -ms-flex-align: center;
704
- align-items: center;
705
- -webkit-box-pack: center;
706
- -ms-flex-pack: center;
707
- justify-content: center;
708
- display: -webkit-box;
709
- display: -ms-flexbox;
710
- display: flex;
711
- height: 100%;
712
- border-radius: 0;
713
- font-size: 15px;
714
- font-weight: 700;
 
715
  }
716
 
717
  .wiz-tab .nav-pills .nav-item .nav-link.active {
718
- background: #eeeeee;
 
 
719
  }
720
 
721
  .tab-content {
722
- margin-top: 15px;
723
- padding-bottom: 15px;
724
  }
725
 
726
  .tab-content .tab-card {
727
- background: #eeeeee;
728
- border: 1px solid #d1d1d1;
729
- padding: 15px;
730
- margin-bottom: 15px;
731
  }
732
 
733
  .tab-content .tab-card.bg-none {
734
- background: none;
735
- border: 0;
736
- padding: 0;
737
  }
738
 
739
  .tab-content .tab-card .text-header {
740
- font-size: 16px;
741
- font-weight: 700;
742
- text-align: center;
743
- margin-bottom: 1rem;
 
 
 
 
 
 
 
 
 
744
  }
745
 
746
  .tab-content .tab-card .db-btn {
747
- text-align: center;
748
- margin-bottom: 15px;
749
  }
750
 
751
  .tab-content .tab-card .db-btn .btn {
752
- margin-right: 0.5rem;
753
  }
754
 
755
  .tab-content .tab-card .custom-control-label {
756
- font-size: 14px;
757
  }
758
 
759
  .tab-content .white-box {
760
- background-color: #FFFFFF;
761
- border: 1px solid #d1d1d1;
762
- padding: 10px;
763
- margin-bottom: 15px;
764
  }
765
 
766
  .tab-content .white-box:last-child {
767
- margin-bottom: 0;
768
  }
769
 
770
  .tab-content .text-m {
771
- display: block;
772
- margin-bottom: 0.35rem;
773
- font-size: 14px;
774
  }
775
 
776
  .btn-google {
777
- border: 2px solid #d1d1d1;
778
- border-radius: 0;
 
 
 
779
  }
780
 
781
  .btn-google img {
782
- width: 25px;
783
- margin-right: 1.5rem;
784
  }
785
 
786
  .licence {
787
- border: 1px solid #d1d1d1;
788
- padding: 15px;
789
- margin-bottom: 15px;
 
790
  }
791
 
792
  .licence p {
793
- margin-bottom: 0.35rem;
794
- font-size: 14px;
795
  }
796
 
797
  .licence .input-group {
798
- margin-top: 15px;
799
  }
800
 
801
  .licence .input-group .form-control, .licence .input-group .select2.select2-container--default .select2-selection--single, .select2.select2-container--default .licence .input-group .select2-selection--single {
802
- border-radius: 0;
803
- border-color: #000000;
804
- background-color: #eeeeee;
805
- margin-right: 15px;
806
- font-size: 14px;
807
- color: #000000;
808
  }
809
 
810
  .licence .input-group .input-group-append {
811
- margin-left: 0;
812
  }
813
 
814
  .licence .input-group .input-group-append .btn {
815
- padding: 3px 20px;
 
 
 
 
 
 
 
 
816
  }
817
 
818
  .ecom-track {
819
- margin-top: 5px;
820
- margin-bottom: 0;
821
  }
822
 
823
  .ecom-track li {
824
- margin-bottom: 15px;
825
- font-size: 14px;
826
  }
827
 
828
  .ecom-track li .img-icon {
829
- width: 18px;
830
- margin-right: 5px;
831
  }
832
 
833
  .ecom-track li .trk-text {
834
- vertical-align: middle;
835
  }
836
 
837
  .premium-list {
838
- margin-bottom: 0;
839
- margin-top: 15px;
840
  }
841
 
842
  .premium-list li {
843
- margin-bottom: 15px;
844
- font-size: 14px;
845
  }
846
 
847
  .premium-list li span {
848
- position: relative;
849
- display: block;
850
- padding-left: 15px;
851
  }
852
 
853
  .premium-list li span:before {
854
- content: '';
855
- width: 5px;
856
- height: 5px;
857
- border-radius: 50%;
858
- background: #000;
859
- position: absolute;
860
- left: 0;
861
- top: 7px;
862
  }
863
 
864
  .google-account-analytics .ga-title {
865
- font-size: 14px;
866
- font-weight: 700;
867
- margin-bottom: 0;
868
  }
869
 
870
  .google-account-analytics .ga-text {
871
- margin-bottom: 0;
872
  }
873
 
874
- .content-heading {
875
- font-size: 18px;
876
- font-weight: 700;
 
 
 
 
877
  }
878
 
879
- .gsf-sec .card .card-footer {
880
- padding: 0 !important;
881
- border-top: 1px solid #d1d1d1 !important;
 
882
  }
883
 
884
- .gsf-sec .card .card-footer .btn {
885
- font-size: 14px;
886
- padding: 0.75rem 15px;
887
- font-weight: 700;
888
  }
889
 
890
- .gsf-sec .card.configure-card .list-unstyled {
891
- counter-reset: index;
892
  }
893
 
894
- .gsf-sec .card.configure-card .list-unstyled li {
895
- position: relative;
896
- padding-left: 20px;
897
  }
898
 
899
- .gsf-sec .card.configure-card .list-unstyled li:before {
900
- content: counter(index) ".";
901
- counter-increment: index;
902
- position: absolute;
903
- top: 0;
904
- left: 0;
905
  }
906
 
907
- .wizard-section.campaign-wizard {
908
- padding: 0;
 
 
 
 
 
 
909
  }
910
 
911
- .wizard-section.campaign-wizard .wizard-content .wizard .steps ul li .step {
912
- visibility: hidden;
 
 
913
  }
914
 
915
- .wizard-section.campaign-wizard .wizard-content .wizard .steps ul li::before {
916
- content: '' !important;
917
- width: 10px;
918
- height: 10px;
919
- background-color: #000;
920
- display: inline-block;
921
- position: absolute;
922
- left: 50%;
923
- top: 50%;
924
- margin-top: -5px;
925
- border-radius: 50%;
926
- z-index: 10;
927
  }
928
 
929
- .wizard-section.campaign-wizard .wizard-content .wizard .steps ul li.done::before {
930
- background-color: #03a2b7;
 
 
931
  }
932
 
933
- .wizard-section.campaign-wizard .wizard-content .wizard .content .heading-tbl {
934
- font-size: 16px;
935
- text-decoration: underline;
936
- margin-bottom: 1rem;
937
- font-weight: 400;
938
  }
939
 
940
- .wizard-section.campaign-wizard .wizard-content .wizard .content .td-head {
941
- display: block;
942
- font-weight: 700;
 
 
 
 
 
 
 
 
 
 
 
943
  }
944
 
945
- .sync-new-product {
946
- /*margin-top: 15px;
947
- padding-top: 15px;
948
- border-top: 1px solid #d1d1d1;*/
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
949
  }
950
 
951
- .sync-new-product .product-card .row [class*="col-"] {
952
- padding: 15px;
 
953
  }
954
 
955
- .sync-new-product .product-card .card {
956
- padding: 15px;
957
- text-align: center;
 
 
 
 
 
958
  }
959
 
960
- .sync-new-product .product-card .card .pro-title {
961
- font-size: 12px;
962
- font-weight: 400;
963
- margin-bottom: 15px;
964
  }
965
 
966
- .sync-new-product .product-card .card .pro-count {
967
- font-size: 28px;
968
- font-weight: 700;
969
- margin-bottom: 0;
 
 
 
970
  }
971
 
972
- .sync-new-product .product-card .card.pending .pro-count {
973
- color: #F3CA52;
 
 
 
 
 
974
  }
975
 
976
- .sync-new-product .product-card .card.approved .pro-count {
977
- color: #41A854;
 
 
 
 
 
 
978
  }
979
 
980
- .sync-new-product .product-card .card.disapproved .pro-count {
981
- color: #EA473B;
982
  }
983
 
984
- .sync-new-product .title {
985
- font-size: 14px;
986
- font-weight: 500;
987
  }
988
 
989
- .wizard-section {
990
- padding: 20px 0;
991
  }
992
 
993
- .wizard-section .wizard-content .wizard {
994
- background: #fff;
 
 
 
995
  }
996
 
997
- .wizard-section .wizard-content .wizard .steps {
998
- margin-bottom: calc(1.5rem + 15px);
 
 
999
  }
1000
 
1001
- .wizard-section .wizard-content .wizard .steps ul li.current .step, .wizard-section .wizard-content .wizard .steps ul li.current .wiz-title {
1002
- font-weight: 700;
1003
- color: #000000;
 
1004
  }
1005
 
1006
- .wizard-section .wizard-content .wizard .steps ul li.done .step {
1007
- background-color: transparent;
1008
- border-color: transparent;
1009
- color: #03a2b7;
1010
- font-weight: 700;
1011
  }
1012
 
1013
- .wizard-section .wizard-content .wizard .steps ul li.done .wiz-title {
1014
- color: #03a2b7;
1015
- font-weight: 700;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1016
  }
1017
 
1018
  .wizard-section .wizard-content .wizard .steps ul li a {
1019
- padding: 0;
1020
- margin: 0;
 
 
1021
  }
1022
 
1023
  .wizard-section .wizard-content .wizard .steps ul li .step {
1024
- width: auto;
1025
- height: auto;
1026
- border: 0;
1027
- font-size: 14px;
1028
- color: #000000;
1029
- line-height: normal;
1030
- border-radius: 0;
1031
- position: static;
1032
- margin: 0;
1033
- display: block;
 
 
1034
  }
1035
 
1036
  .wizard-section .wizard-content .wizard .steps ul li:before {
1037
- content: none !important;
1038
  }
1039
 
1040
  .wizard-section .wizard-content .wizard .steps ul li:after {
1041
- content: '';
1042
- height: 0.5px !important;
1043
- background: #000000 !important;
1044
- position: absolute;
1045
- left: 50%;
1046
- top: 50% !important;
1047
- -webkit-transform: translateY(-50%);
1048
- transform: translateY(-50%);
1049
- width: 100% !important;
1050
  }
1051
 
1052
  .wizard-section .wizard-content .wizard .steps ul li .wiz-title {
1053
- color: #000000;
1054
- font-weight: 400;
1055
- display: block;
1056
- margin-top: 15px;
1057
  }
1058
 
1059
  .wizard-section .wizard-content .wizard .actions {
1060
- margin-top: 1.5rem;
1061
- text-align: center;
 
 
 
 
1062
  }
1063
 
1064
  .wizard-section .wizard-content .wizard .actions ul {
1065
- width: 100%;
1066
- display: -webkit-box;
1067
- display: -ms-flexbox;
1068
- display: flex;
1069
- -webkit-box-pack: center;
1070
- -ms-flex-pack: center;
1071
- justify-content: center;
 
 
 
 
 
1072
  }
1073
 
1074
  .wizard-section .wizard-content .wizard .actions ul li a.next-step, .wizard-section .wizard-content .wizard .actions ul li a.prev-step {
1075
- background: #d1d1d1;
1076
- min-width: 100px;
1077
- font-weight: 700;
1078
- color: #000000;
1079
- border: 1px solid #000000;
1080
- border-radius: 0;
1081
  }
1082
 
1083
  .wizard-section .wizard-content .wizard .actions ul li a.next-step:hover, .wizard-section .wizard-content .wizard .actions ul li a.prev-step:hover {
1084
- color: #000000;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1085
  }
1086
 
1087
  .wizard-section .wizard-content .wizard .actions ul li.disabled {
1088
- display: none;
 
 
 
 
 
 
 
 
 
1089
  }
1090
 
1091
  .creating-account {
1092
- margin-bottom: 1rem;
1093
- counter-reset: indexing;
1094
  }
1095
 
1096
  .creating-account li {
1097
- position: relative;
1098
- padding-left: 20px;
1099
- margin-bottom: 5px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1100
  }
1101
 
1102
- .creating-account li:before {
1103
- content: counter(indexing) ".";
1104
- counter-increment: indexing;
1105
- position: absolute;
1106
- top: 0;
1107
- left: 0;
1108
  }
1109
- /*# sourceMappingURL=style.css.map */
1110
 
1111
- .gsf-sec{
1112
- padding-bottom: 15px;
1113
  }
1114
 
1115
- .config-head-nav {
1116
- height: 100% !important;
1117
- border-radius: 25px;
1118
- background-color: #EEEEEE;
1119
- border-color: #d1d1d1;
1120
- background-clip: border-box;
1121
- border: 1px solid rgba(0,0,0,.125);
1122
  }
1123
 
1124
- .config-head-active {
1125
- background-color: #2D73C5 !important;
1126
- border-radius: 25px;
1127
- border-color: #2D73C5;
1128
- background-clip: border-box;
1129
- border: 1px solid rgba(0,0,0,.125);
1130
- color: #fff !important;
1131
  }
1132
 
1133
- /*.show {
1134
- display: block;
 
1135
  }
1136
 
1137
- .hide {
1138
- display: none;
1139
- }*/
 
1140
 
 
1141
  #feed-spinner {
1142
  /* height: 50px; */
1143
  left: 0;
@@ -1152,9 +2540,6 @@ textarea.form-control, .select2.select2-container--default textarea.select2-sele
1152
  background: rgba(255,255,255,0.65);
1153
  bottom: 0;
1154
  right: 0;
1155
- /* display: flex;
1156
- justify-content: center;
1157
- align-items: center;*/
1158
  }
1159
  #feed-spinner img {
1160
  position: absolute;
@@ -1163,9 +2548,112 @@ textarea.form-control, .select2.select2-container--default textarea.select2-sele
1163
  transform: translate(-50%,-50%);
1164
  }
1165
 
1166
- .config-head-nav .btn{
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1167
  height: 100%;
1168
- display: flex;
1169
- align-items: center;
1170
- justify-content: center;
1171
- }
 
 
1
+ @import url("https://fonts.googleapis.com/css2?family=Lato:wght@300;400;700;900&display=swap");
2
  html,
3
  body {
4
+ height: 100%;
5
  }
6
 
7
  body {
8
+ margin: 0;
9
+ padding: 0;
10
+ -webkit-font-smoothing: antialiased;
11
+ -moz-osx-font-smoothing: grayscale;
12
+ font-size: 14px;
13
+ color: #25283D;
14
+ font-weight: 400;
15
+ line-height: normal;
16
+ background-color: #F2F2F2;
17
+ font-family: 'Lato', sans-serif;
18
  }
19
 
20
  p {
21
+ font-size: 14px;
22
+ line-height: 18px;
23
  }
24
 
25
  a {
26
+ -webkit-transition: all ease 0.5s;
27
+ transition: all ease 0.5s;
28
+ color: #2D62ED;
29
  }
30
 
31
  a:hover {
32
+ text-decoration: none;
33
+ -webkit-transition: all ease 0.5s;
34
+ transition: all ease 0.5s;
35
+ color: #2D62ED;
36
  }
37
 
38
  a:focus {
39
+ -webkit-box-shadow: none !important;
40
+ box-shadow: none !important;
41
  }
42
 
43
  ul {
44
+ margin-bottom: 0;
45
  }
46
 
47
  a:focus,
48
  button:focus,
49
  input[type="checkbox"],
50
  input[type="radio"] {
51
+ outline: none;
52
  }
53
 
54
  :focus {
55
+ -ms-box-shadow: none;
56
+ -webkit-box-shadow: none;
57
+ box-shadow: none;
58
+ outline: none;
59
  }
60
 
61
  .text-underline {
62
+ text-decoration: underline;
63
+ }
64
+
65
+ .blue-color {
66
+ color: #2D62ED !important;
67
  }
68
 
69
  section {
70
+ padding: 10px 0;
71
  }
72
 
73
  .title {
74
+ font-size: 16px;
75
+ font-weight: 700;
76
+ margin-bottom: 20px;
77
  }
78
 
79
  .sub-title {
80
+ margin-bottom: 5px;
81
+ font-size: 14px;
82
+ }
83
+
84
+ .upgrade {
85
+ color: #03D7FD;
86
  }
87
 
88
  .campaigns .campaign-date {
89
+ border: 1px solid #A9A9A9;
90
+ padding: 8px;
91
  }
92
 
93
  .campaigns .radio-buttons .custom-control-label {
94
+ width: 100%;
95
  }
96
 
97
  .chart {
98
+ margin-bottom: 15px;
99
+ background-color: #FFFFFF;
 
 
100
  }
101
 
102
+ .chart canvas {
103
+ -ms-box-shadow: 0 3px 6px #00000029;
104
+ -webkit-box-shadow: 0 3px 6px #00000029;
105
+ box-shadow: 0 3px 6px #00000029;
106
+ border-radius: 10px;
107
+ }
108
+
109
+ .chart .sub-title {
110
+ margin-bottom: 10px;
111
+ color: #5E5E5E;
112
  }
113
 
114
+ /*.dataTables_length {
115
+ display: none;
116
+ }*/
117
+
118
  .table-section {
119
+ padding: 8px;
120
+ margin-bottom: 15px;
121
+ background-color: #FFFFFF;
122
+ border-radius: 10px;
123
+ -ms-box-shadow: 0 3px 6px #00000029;
124
+ -webkit-box-shadow: 0 3px 6px #00000029;
125
+ box-shadow: 0 3px 6px #00000029;
126
  }
127
 
128
  .table-section .table {
129
+ margin-bottom: 0;
130
  }
131
 
132
  .table-section .table thead th {
133
+ border: 0;
134
+ padding: 0.45rem;
135
+ color: #25283D;
136
+ vertical-align: top;
137
  }
138
 
139
  .table-section .table tr th,
140
  .table-section .table tr td {
141
+ border: 0;
142
  }
143
 
144
  .table-section .table tr td {
145
+ padding: 0.45rem;
146
+ color: #5E5E5E;
147
  }
148
 
149
  .table-section .table tr td.product-image {
150
+ width: 70px;
151
  }
152
 
153
  .table-section .table tr td.product-image img {
154
+ width: 100%;
155
+ -o-object-fit: cover;
156
+ object-fit: cover;
157
+ }
158
+
159
+ .table-section .table tr td .text-underline {
160
+ text-decoration: none;
161
+ color: #5E5E5E;
162
  }
163
 
164
  .table-section .pagination {
165
+ -webkit-box-pack: end;
166
+ -ms-flex-pack: end;
167
+ justify-content: flex-end;
168
+ }
169
+
170
+ .btn {
171
+ border-radius: 500px;
172
+ padding: 0.375rem 1rem;
173
+ font-size: 14px;
174
+ }
175
+
176
+ .btn:focus, .btn:active {
177
+ -ms-box-shadow: none !important;
178
+ -webkit-box-shadow: none !important;
179
+ box-shadow: none !important;
180
+ outline: 0 !important;
181
+ }
182
+
183
+ .btn-primary {
184
+ background-color: #2D62ED;
185
+ border-color: #2D62ED;
186
+ }
187
+
188
+ .btn-primary:hover, .btn-primary:focus, .btn-primary.focus {
189
+ background-color: #1248d5 !important;
190
+ border-color: #1248d5 !important;
191
+ }
192
+
193
+ .btn-secondary {
194
+ background-color: #FFFFFF;
195
+ border-color: #FFFFFF;
196
+ color: #2D62ED !important;
197
+ }
198
+
199
+ .btn-secondary:hover, .btn-secondary:focus, .btn-secondary.focus {
200
+ background-color: #1248d5 !important;
201
+ border-color: #1248d5 !important;
202
+ color: #FFFFFF !important;
203
+ }
204
+
205
+ .btn-default {
206
+ background-color: #F2F2F2;
207
+ border-color: #F2F2F2;
208
+ color: #25283D;
209
+ }
210
+
211
+ .btn-default:hover, .btn-default:focus, .btn-default.focus {
212
+ background-color: #d9d9d9 !important;
213
+ border-color: #d9d9d9 !important;
214
+ }
215
+
216
+ .btn-outline-primary {
217
+ color: #2D62ED;
218
+ border-color: #2D62ED;
219
+ }
220
+
221
+ .btn-outline-primary:hover, .btn-outline-primary:focus, .btn-outline-primary.focus {
222
+ background-color: #2D62ED !important;
223
+ border-color: #2D62ED !important;
224
+ color: #FFFFFF !important;
225
  }
226
 
227
  .btn-white {
228
+ background-color: #FFFFFF;
229
+ border: 1px solid #000000;
230
+ color: #000000;
231
+ padding: 5px 10px;
232
+ font-size: 14px;
233
+ line-height: normal;
234
+ border-radius: 0;
235
+ font-weight: 700;
236
  }
237
 
238
  .btn-white:focus {
239
+ -webkit-box-shadow: none !important;
240
+ box-shadow: none !important;
241
  }
242
 
243
  .btn-grey {
244
+ background-color: #F2F2F2 !important;
245
  }
246
 
247
  .text-underline {
248
+ text-decoration: underline;
249
  }
250
 
251
  .arrow-angle {
252
+ border-color: #888 transparent transparent transparent;
253
+ border-style: solid;
254
+ border-width: 8px 7px 0 7px;
255
+ height: 0;
256
+ width: 0;
257
  }
258
 
259
  .popup-modal .modal-dialog .modal-content {
260
+ border-radius: 15px;
261
+ border: 1px solid #707070;
262
+ background: #FAFAFA;
263
  }
264
 
265
  .popup-modal .modal-dialog .modal-header {
266
+ border: 0;
267
+ padding: 30px;
268
+ }
269
+
270
+ .popup-modal .modal-dialog .modal-header .modal-title {
271
+ font-weight: 700;
272
+ }
273
+
274
+ .popup-modal .modal-dialog .modal-body {
275
+ padding: 30px;
276
+ }
277
+
278
+ .popup-modal .modal-dialog .modal-body p {
279
+ color: #5E5E5E;
280
+ }
281
+
282
+ .popup-modal .modal-dialog .close {
283
+ position: absolute;
284
+ right: 10px;
285
+ top: 5px;
286
+ padding: 0;
287
+ margin: 0;
288
+ font-weight: 300;
289
+ opacity: 1;
290
+ color: #25283D;
291
+ font-size: 1.8rem;
292
+ }
293
+
294
+ .popup-modal .modal-dialog .mw-100 {
295
+ min-width: 100px;
296
  }
297
 
298
  .accordion .card {
299
+ margin-bottom: 15px;
300
+ background-color: transparent;
301
+ border: 1px solid #d1d1d1 !important;
 
 
302
  }
303
 
304
  .accordion .card:last-child {
305
+ margin-bottom: 0 !important;
306
  }
307
 
308
  .accordion .card .card-header {
309
+ padding: 0;
310
+ background-color: transparent;
311
+ border-radius: 0;
312
+ border: 0;
313
  }
314
 
315
  .accordion .card .card-header .btn {
316
+ padding: 5px 15px;
317
+ display: block;
318
+ width: 100%;
319
+ text-align: left;
320
+ color: #000000;
321
+ font-weight: 500;
322
+ font-size: 14px;
323
+ position: relative;
324
+ padding-right: 40px !important;
325
  }
326
 
327
  .accordion .card .card-header .btn:hover {
328
+ text-decoration: none;
329
  }
330
 
331
  .accordion .card .card-header .btn:focus {
332
+ text-decoration: none;
333
+ outline: none;
334
+ -webkit-box-shadow: none;
335
+ box-shadow: none;
336
  }
337
 
338
  .accordion .card .card-header .btn:after {
339
+ content: "";
340
+ border-color: #888 transparent transparent transparent;
341
+ border-style: solid;
342
+ border-width: 8px 7px 0 7px;
343
+ height: 0;
344
+ width: 0;
345
+ position: absolute;
346
+ right: 10px;
347
+ top: 11px;
348
+ -webkit-transform: rotate(180deg);
349
+ transform: rotate(180deg);
350
  }
351
 
352
  .accordion .card .card-header .btn.collapsed:after {
353
+ -webkit-transform: rotate(0deg);
354
+ transform: rotate(0deg);
355
  }
356
 
357
  .accordion .card .card-body {
358
+ padding: 10px 15px;
359
  }
360
 
361
  .accordion .card .card-body p {
362
+ font-size: 14px;
363
+ margin-bottom: 0.35rem;
364
  }
365
 
366
  .accordion .card .card-body .table-section {
367
+ border: 0;
368
+ padding: 0;
369
+ margin-bottom: 0;
370
  }
371
 
372
  .accordion .card .card-body .table-section .table tr td {
373
+ font-size: 14px;
374
  }
375
 
376
  .accordion-section .accordion .card {
377
+ margin-bottom: 15px;
378
+ border-radius: 0;
379
+ border: 1px solid #d1d1d1;
380
+ background-color: #ffffff;
381
  }
382
 
383
  .accordion-section .accordion .card .card-header {
384
+ padding: 0;
385
+ background-color: transparent;
386
+ border-radius: 0;
387
+ border: 0;
388
  }
389
 
390
  .accordion-section .accordion .card .card-header .btn {
391
+ padding: 5px 10px;
392
+ display: block;
393
+ width: 100%;
394
+ text-align: left;
395
+ color: #000000;
396
+ font-weight: 700;
397
+ font-size: 14px;
398
  }
399
 
400
  .accordion-section .accordion .card .card-header .btn:hover {
401
+ text-decoration: none;
402
  }
403
 
404
  .accordion-section .accordion .card .card-header .btn:focus {
405
+ text-decoration: none;
406
+ outline: none;
407
+ -webkit-box-shadow: none;
408
+ box-shadow: none;
409
  }
410
 
411
  .accordion-section .accordion .card .card-body {
412
+ padding: 10px 15px;
413
  }
414
 
415
  .nbk-tbl {
416
+ background-color: transparent;
417
+ border: 0;
418
+ padding: 0;
419
+ margin-bottom: 0;
420
  }
421
 
422
  .card-wrapper {
423
+ max-width: 100%;
424
+ margin: 0 auto;
425
  }
426
 
427
  .wrapper-main {
428
+ max-width: 90%;
429
+ margin: 0 auto;
 
430
  }
431
 
432
  .configuration-section .note-follow {
433
+ border: 1px solid #A9A9A9;
434
+ padding: 10px 15px;
435
+ border-radius: 10px;
436
+ margin-bottom: 15px;
437
  }
438
 
439
  .configuration-section .note-follow p {
440
+ margin-bottom: 0;
441
  }
442
 
443
  .configuration-section .confg-card .card {
444
+ border-radius: 15px;
445
+ background-color: #FFFFFF;
446
+ -ms-box-shadow: 0 3px 5px #00000029;
447
+ -webkit-box-shadow: 0 3px 5px #00000029;
448
+ box-shadow: 0 3px 5px #00000029;
449
+ height: 100%;
450
+ border: 0;
451
  }
452
 
453
  .configuration-section .confg-card .card .card-header {
454
+ background-color: #000338;
455
+ border: 0;
456
+ text-align: center;
457
+ padding-left: 15px;
458
+ padding-right: 15px;
459
  }
460
 
461
  .configuration-section .confg-card .card .card-header:first-child {
462
+ border-radius: calc(15px - 1px) calc(15px - 1px) 0 0;
463
  }
464
 
465
  .configuration-section .confg-card .card .card-header .confg-title {
466
+ font-weight: 700;
467
+ font-size: 14px;
468
+ color: #FFFFFF;
469
+ margin: 0;
470
  }
471
 
472
  .configuration-section .confg-card .card .card-body {
473
+ padding: 15px;
474
  }
475
 
476
  .configuration-section .confg-card .card .card-body .list-unstyled {
477
+ margin: 0;
478
  }
479
 
480
  .configuration-section .confg-card .card .card-body .list-unstyled li {
481
+ display: block;
482
+ margin-bottom: 10px;
483
  }
484
 
485
  .configuration-section .confg-card .card .card-body .list-unstyled li:last-child {
486
+ margin-bottom: 0;
487
  }
488
 
489
  .configuration-section .confg-card .card .card-body .list-unstyled li .text {
490
+ display: block;
491
  }
492
 
493
  .configuration-section .confg-card .card .card-body .list-unstyled li .list-image img {
494
+ max-width: 18px;
495
  }
496
 
497
  .configuration-section .confg-card .card .card-footer {
498
+ background-color: transparent;
499
+ border: 0;
500
+ text-align: center;
501
+ padding-left: 15px;
502
+ padding-right: 15px;
503
  }
504
 
505
  .configuration-section .confg-card .card .card-footer:last-child {
506
+ border-radius: 0 0 calc(15px - 1px) calc(15px - 1px);
507
  }
508
 
509
  .configuration-section .confg-card .card .card-footer .explr {
510
+ padding: 0;
511
+ font-weight: 700;
512
+ font-size: 14px;
513
+ text-decoration: underline;
514
+ color: #000000;
515
  }
516
 
517
  .border-right {
518
+ border-right: 1px solid #A9A9A9;
519
  }
520
 
521
  @media (min-width: 576px) {
522
+ .modal-sm-custom {
523
+ max-width: 355px;
524
+ }
525
  }
526
 
527
  .dataTables_paginate .page-item .page-link {
528
+ color: #000000;
529
  }
530
 
531
  .dataTables_paginate .page-item.active .page-link {
532
+ background-color: #000000;
533
+ border-color: #000000;
534
+ color: #ffffff !important;
535
+ font-weight: 700;
536
  }
537
 
538
  .dataTables_paginate .page-item.disabled {
539
+ opacity: 0.5;
540
+ }
541
+
542
+ .loader-section {
543
+ position: fixed;
544
+ top: 0;
545
+ bottom: 0;
546
+ left: 0;
547
+ right: 0;
548
+ height: 100%;
549
+ background-color: rgba(255, 255, 255, 0.85);
550
+ display: -webkit-box;
551
+ display: -ms-flexbox;
552
+ display: flex;
553
+ -webkit-box-pack: center;
554
+ -ms-flex-pack: center;
555
+ justify-content: center;
556
+ -webkit-box-align: center;
557
+ -ms-flex-align: center;
558
+ align-items: center;
559
+ z-index: 999;
560
+ }
561
+
562
+ .loader-section img {
563
+ max-width: 80px;
564
+ }
565
+
566
+ .border-right {
567
+ border-right: 0 !important;
568
+ }
569
+
570
+ .right-content {
571
+ border: 0.5px solid #A9A9A9;
572
+ border-radius: 15px;
573
+ margin-bottom: 30px;
574
+ padding: 15px;
575
+ }
576
+
577
+ .right-content:last-child {
578
+ margin-bottom: 0;
579
+ }
580
+
581
+ .right-content p {
582
+ margin-bottom: 0;
583
+ }
584
+
585
+ .right-content .content-section {
586
+ position: relative;
587
+ padding-left: 30px;
588
+ }
589
+
590
+ .right-content .content-section .content-icon {
591
+ position: absolute;
592
+ left: 0;
593
+ top: 0;
594
+ }
595
+
596
+ .right-content .content-section .content-icon img {
597
+ width: 20px;
598
+ }
599
+
600
+ .right-content .pagination {
601
+ margin-top: 5px;
602
+ }
603
+
604
+ .right-content .pagination .page-item .page-link {
605
+ padding: 0 5px;
606
+ border: 0;
607
+ color: #25283D;
608
+ }
609
+ .right-content .pagination .page-item .paging_info{padding: 0 5px; border: 0; color: #25283D; margin-top: 1px; display: inline-block;}
610
+ .right-content .pagination .page-item span.page-link {
611
+ cursor: pointer;
612
+ }
613
+
614
+ .right-content .pagination .page-item.page-prev img {
615
+ -webkit-transform: rotate(90deg);
616
+ transform: rotate(90deg);
617
+ }
618
+
619
+ .right-content .pagination .page-item.page-next img {
620
+ -webkit-transform: rotate(-90deg);
621
+ transform: rotate(-90deg);
622
+ }
623
+
624
+ .listing-content {
625
+ margin-bottom: 0;
626
+ margin-top: 15px;
627
+ }
628
+
629
+ .listing-content li {
630
+ margin-bottom: 12px;
631
+ font-size: 14px;
632
+ position: relative;
633
+ padding-left: 24px;
634
+ color: #5E5E5E;
635
+ }
636
+
637
+ .listing-content li:last-child {
638
+ margin-bottom: 0;
639
+ }
640
+
641
+ .listing-content li .tick-icon {
642
+ position: absolute;
643
+ left: 0;
644
+ top: 5px;
645
+ width: 14px;
646
+ }
647
+
648
+ .custom-tooltip {
649
+ position: relative;
650
+ }
651
+
652
+ .custom-tooltip:hover .tooltip-drop {
653
+ display: block;
654
+ }
655
+
656
+ .custom-tooltip .tooltip-drop {
657
+ position: absolute;
658
+ background-color: #C0F2CA;
659
+ padding: 25px 15px 15px 15px;
660
+ top: 0;
661
+ border-radius: 15px;
662
+ min-width: 16rem;
663
+ z-index: 1;
664
+ display: none;
665
+ }
666
+
667
+ .custom-tooltip .tooltip-drop .tooltip-title {
668
+ font-size: 16px;
669
+ color: #5E5E5E;
670
+ }
671
+
672
+ .custom-tooltip .tooltip-drop p {
673
+ font-size: 12px;
674
+ color: #757575;
675
+ font-weight: 400;
676
+ margin-bottom: 0;
677
+ }
678
+
679
+ .alert-message {
680
+ text-align: right;
681
+ }
682
+
683
+ .alert-message .alert {
684
+ display: inline-block;
685
+ border-radius: 500px;
686
+ border: 0;
687
+ padding-top: 0.5rem;
688
+ padding-bottom: 0.5rem;
689
+ color: #FFFFFF;
690
+ background-color: #66BB6A;
691
+ padding-left: 30px;
692
+ }
693
+ .alert-message.tvc-alert-success .alert:after {
694
+ content: '\2713';
695
+ position: absolute;
696
+ left: 12px;
697
+ }
698
+
699
+ .alert-message .error {
700
+ display: inline-block;
701
+ border-radius: 500px;
702
+ border: 0;
703
+ padding-top: 0.5rem;
704
+ padding-bottom: 0.5rem;
705
+ color: #FFFFFF;
706
+ background-color: #dc3232;
707
+ }
708
+
709
+ .tooltip.show {
710
+ opacity: 1;
711
+ }
712
+
713
+ .tooltip .arrow {
714
+ display: none;
715
+ }
716
+
717
+ .tooltip .tooltip-inner {
718
+ background-color: #FFFFFF;
719
+ color: #5E5E5E;
720
+ font-size: 12px;
721
+ text-align: left;
722
  }
723
 
724
  .header-section {
725
+ display: block;
726
+ background-color: #FFFFFF;
727
  }
728
 
729
  .header-section .top-section {
730
+ background-color: #25283D;
731
+ padding: 8px 15px;
732
  }
733
 
734
  .header-section .top-section p {
735
+ margin-bottom: 0;
736
+ text-align: center;
737
+ color: #FFFFFF;
738
+ font-weight: 700;
739
  }
740
 
741
  .header-section .navbar-section {
742
+ padding: 15px 0;
743
+ margin-bottom: 0;
744
+ }
745
+
746
+ .header-section .navbar-section .navbar-brand {
747
+ padding-left: 15px;
748
  }
749
 
750
  .header-section .navbar-section .navbar-brand img {
751
+ max-width: 150px;
752
+ max-height: 30px;
753
+ }
754
+
755
+ .header-section .navbar-section .nav-btn {
756
+ position: relative;
757
+ margin: 0 18px;
758
+ }
759
+
760
+ .header-section .navbar-section .nav-btn .nav-icon {
761
+ max-width: 19px;
762
+ }
763
+
764
+ .header-section .navbar-section .nav-btn .not-count {
765
+ position: absolute;
766
+ top: -5px;
767
+ right: -15px;
768
+ width: 20px;
769
+ height: 20px;
770
+ line-height: 20px;
771
+ text-align: center;
772
+ padding: 0;
773
+ border-radius: 50%;
774
+ background-color: #2D62ED;
775
+ }
776
+
777
+ .header-section .navbar-section .nav-btn .free-plan {
778
+ background-color: rgba(8, 114, 252, 0.1);
779
+ color: #0872FC;
780
+ border-radius: 500px;
781
+ padding: 5px 10px;
782
+ font-size: 14px;
783
+ font-weight: 400;
784
+ text-transform: capitalize;
785
  }
786
 
787
  .header-section .navbar-section .account-dropdown .btn {
788
+ border: 0;
789
+ font-size: 14px;
790
+ font-weight: 700;
791
  }
792
 
793
  .header-section .navbar-section .account-dropdown .btn.dropdown-toggle::after {
794
+ border: solid black;
795
+ border-style: solid;
796
+ border-width: 0 1px 1px 0;
797
+ vertical-align: middle;
798
+ -webkit-transform: rotate(45deg);
799
+ transform: rotate(45deg);
800
+ padding: 3px;
801
+ margin-left: 10px;
802
+ margin-top: -2px;
803
  }
804
 
805
  .header-section .navbar-section .account-dropdown .btn:focus {
806
+ -webkit-box-shadow: none;
807
+ box-shadow: none;
808
  }
809
 
810
  .header-section .navbar-section .account-dropdown .dropdown-menu {
811
+ padding: 0;
812
+ margin: -15px 1rem 0 0;
813
+ border-radius: 0;
814
+ border: 0;
815
+ border-radius: 5px;
816
+ -ms-box-shadow: 0 3px 6px #00000029;
817
+ -webkit-box-shadow: 0 3px 6px #00000029;
818
+ box-shadow: 0 3px 6px #00000029;
819
  }
820
 
821
  .header-section .navbar-section .account-dropdown .dropdown-menu .dropdown-item {
822
+ font-size: 14px;
823
+ padding: 5px 10px;
824
+ }
825
+
826
+ .header-section .navbar-section .account-dropdown .dropdown-menu .dropdown-item:first-child {
827
+ border-radius: 4px 4px 0 0;
828
+ }
829
+
830
+ .header-section .navbar-section .account-dropdown .dropdown-menu .dropdown-item:last-child {
831
+ border-radius: 0 0 4px 4px;
832
  }
833
 
834
  .header-section .navbar-section .account-dropdown .dropdown-menu .dropdown-item:focus {
835
+ color: #16181b;
836
+ background-color: #f8f9fa;
837
  }
838
 
839
  .form-group {
840
+ position: relative;
841
  }
842
 
843
  .form-control, .select2.select2-container--default .select2-selection--single {
844
+ border-color: #707070;
845
+ height: 30px;
846
+ font-size: 14px;
847
+ background-color: #FFFFFF;
848
+ border-width: 0.5px;
849
+ border-radius: 15px;
850
+ padding-left: 7px;
851
+ }
852
+ .wp-core-ui select{padding-left: 15px; margin-top: 2px; border-radius: 15px; background-position: right 8px top 55%;}
853
  .form-control::-webkit-input-placeholder, .select2.select2-container--default .select2-selection--single::-webkit-input-placeholder {
854
+ color: #B2B2B2;
855
  }
856
 
857
  .form-control::-ms-input-placeholder, .select2.select2-container--default .select2-selection--single::-ms-input-placeholder {
858
+ color: #B2B2B2;
859
  }
860
 
861
  .form-control:-ms-input-placeholder, .select2.select2-container--default .select2-selection--single:-ms-input-placeholder {
862
+ color: #B2B2B2;
863
  }
864
 
865
  .form-control::placeholder, .select2.select2-container--default .select2-selection--single::placeholder {
866
+ color: #B2B2B2;
867
  }
868
 
869
  .form-control:focus, .select2.select2-container--default .select2-selection--single:focus {
870
+ -ms-box-shadow: none;
871
+ -webkit-box-shadow: none;
872
+ box-shadow: none;
873
+ outline: none;
874
+ border-color: #1A2750;
875
  }
876
 
877
  .select2 {
878
+ width: 100% !important;
879
+ }
880
+
881
+ /*.select2.select2-container--default .select2-selection--single .select2-selection__rendered {
882
+ line-height: 38px;
883
+ }*/
884
+
885
+ .select2.select2-container--default .select2-selection__arrow {
886
+ height: 40px !important;
887
  }
888
 
889
  .select2.select2-container--default .select2-selection__arrow b {
890
+ border: solid #888888 !important;
891
+ border-style: solid;
892
+ border-width: 0 1px 1px 0 !important;
893
+ vertical-align: middle;
894
+ -webkit-transform: rotate(45deg);
895
+ transform: rotate(45deg);
896
+ padding: 3px;
897
+ margin-left: -8px !important;
898
+ margin-top: -5.5px !important;
899
  }
900
 
901
  .select2.select2-container--default.select2-container--open .select2-selection__arrow b {
902
+ border: solid #888888;
903
+ border-style: solid;
904
+ border-width: 0 1px 1px 0 !important;
905
+ -webkit-transform: rotate(-135deg);
906
+ transform: rotate(-135deg);
907
+ margin-top: 0 !important;
908
  }
909
 
910
  .select2-dropdown {
911
+ border-color: #707070 !important;
912
  }
913
 
914
  .select2-dropdown .select2-results__options .select2-results__option--highlighted {
915
+ background-color: #5c85f1 !important;
916
+ color: #FFFFFF !important;
917
  }
918
 
919
  .select2-dropdown .select2-results__options .select2-results__option--selected {
920
+ background-color: #2D62ED !important;
921
+ color: #FFFFFF !important;
922
  }
923
 
924
  .input-daterange .form-control, .input-daterange .select2.select2-container--default .select2-selection--single, .select2.select2-container--default .input-daterange .select2-selection--single {
925
+ text-align: left;
926
+ border-radius: 10px !important;
927
+ border-width: 0.5px;
928
+ height: 35px;
929
+ background: url(../images/icon/arrow-down-sign-to-navigate.svg) no-repeat 95%;
930
  }
931
 
932
  .input-daterange .text {
933
+ font-size: 14px;
934
+ }
935
+
936
+ .campaing-date {
937
+ width: 350px;
938
+ }
939
+
940
+ .campaing-date .input-group {
941
+ -webkit-box-align: center;
942
+ -ms-flex-align: center;
943
+ align-items: center;
944
  }
945
 
946
  .datepicker.datepicker-dropdown {
947
+ border: 0;
948
+ font-size: 14px;
949
+ border-radius: 15px;
950
+ -ms-box-shadow: 0 3px 6px #272D3B33;
951
+ -webkit-box-shadow: 0 3px 6px #272D3B33;
952
+ box-shadow: 0 3px 6px #272D3B33;
953
+ width: 220px;
954
+ }
955
+
956
+ .datepicker .table-condensed {
957
+ width: 100%;
958
  }
959
 
960
  .datepicker th {
961
+ font-weight: 500 !important;
962
  }
963
 
964
  .datepicker td,
965
  .datepicker th {
966
+ width: 30px !important;
967
+ height: 30px !important;
968
+ border-radius: 50% !important;
969
  }
970
 
971
  .datepicker td.day.active {
972
+ background: #1A2750 !important;
973
  }
974
 
975
  .datepicker td.day.today {
976
+ background: #2D62ED !important;
977
+ color: #FFFFFF;
978
  }
979
 
980
  .datepicker td span.month.active {
981
+ background: #1A2750 !important;
982
  }
983
 
984
  .datepicker td span.year.active, .datepicker td span.year.focused {
985
+ background: #1A2750 !important;
986
  }
987
 
988
  .custom-control .custom-control-input:focus ~ .custom-control-label::before {
989
+ -ms-box-shadow: none;
990
+ -webkit-box-shadow: none;
991
+ box-shadow: none;
992
+ outline: none;
993
  }
994
 
995
  .custom-control.custom-radio .custom-control-label {
996
+ padding-left: 0;
997
  }
998
 
999
  .custom-control.custom-radio .custom-control-label::before {
1000
+ width: 16px;
1001
+ height: 16px;
1002
+ background-color: transparent;
1003
+ border-width: 1px;
1004
+ border-color: #707070;
1005
+ top: 1px;
1006
  }
1007
 
1008
  .custom-control.custom-radio .custom-control-input:checked ~ .custom-control-label::before {
1009
+ border-color: #707070;
 
1010
  }
1011
 
1012
  .custom-control.custom-radio .custom-control-input:checked ~ .custom-control-label::after {
1013
+ width: 8px;
1014
+ height: 8px;
1015
+ border-radius: 50%;
1016
+ background-image: none;
1017
+ background-color: #2D62ED;
1018
+ margin-left: 4px;
1019
+ top: 5px;
1020
  }
1021
 
1022
  .custom-control.custom-checkbox .custom-control-label:before {
1023
+ border-radius: 2px;
1024
+ margin-top: -3px;
1025
+ border-color: #5E5E5E;
1026
  }
1027
 
1028
  .custom-control.custom-checkbox .custom-control-input:checked ~ .custom-control-label:before {
1029
+ background-color: #2D62ED;
1030
+ border-color: #2D62ED;
1031
+ border-radius: 2px;
1032
  }
1033
 
1034
  .custom-control.custom-checkbox .custom-control-input:checked ~ .custom-control-label:after {
1035
+ margin-top: -3px;
1036
+ background-image: url(../img/tick-white.svg);
 
1037
  }
1038
 
1039
  .custom-control.custom-checkbox .custom-control-input:focus:not(:checked) ~ .custom-control-label::before {
1040
+ -ms-box-shadow: none;
1041
+ -webkit-box-shadow: none;
1042
+ box-shadow: none;
1043
+ outline: none;
1044
+ border-color: #2D62ED;
1045
  }
1046
 
1047
  .custom-switch .custom-control-label:before {
1048
+ width: 35px;
1049
+ height: 20px;
1050
+ border-radius: 500px;
1051
  }
1052
 
1053
  .custom-switch .custom-control-label:after {
1054
+ left: calc(-2.25rem + 3px);
1055
+ top: calc(.25rem + 4px);
 
 
 
1056
  }
1057
 
1058
  .custom-switch .custom-control-input:checked ~ .custom-control-label:after {
1059
+ -webkit-transform: translateX(1.25rem);
1060
+ transform: translateX(1.25rem);
1061
+ top: calc(.25rem + 4px);
1062
+ left: calc(-2.25rem + 1px);
1063
  }
1064
 
1065
+ .custom-control-label {
1066
+ color: #5E5E5E;
 
1067
  }
1068
 
1069
  textarea.form-control, .select2.select2-container--default textarea.select2-selection--single {
1070
+ height: auto !important;
1071
  }
1072
 
1073
  .form-label-control {
1074
+ margin-bottom: 0.8rem;
1075
+ font-weight: 700;
1076
  }
1077
 
1078
  .campaign-date .custom-control-label {
1079
+ display: inline;
1080
  }
1081
 
1082
  .campaign-date .custom-control-label .custom-radio .select2 {
1083
+ vertical-align: middle;
1084
  }
1085
 
1086
  .wiz-tab .nav-pills {
1087
+ -ms-box-shadow: 0 1px 2px #00000029;
1088
+ -webkit-box-shadow: 0 1px 2px #00000029;
1089
+ box-shadow: 0 1px 2px #00000029;
1090
+ background-color: #FFFFFF;
1091
  }
1092
 
1093
+ .wiz-tab .nav-pills .nav-item {
1094
+ -ms-flex-preferred-size: auto;
1095
+ flex-basis: auto;
1096
+ -webkit-box-flex: initial;
1097
+ -ms-flex-positive: initial;
1098
+ flex-grow: initial;
1099
+ margin-bottom: 0px !important;
1100
+ }
1101
+ .wiz-tab .nav-pills .nav-item .nav-link a{color: #000000;}
1102
  .wiz-tab .nav-pills .nav-item .nav-link {
1103
+ color: #000000;
1104
+ padding: 15px 20px;
1105
+ -webkit-box-align: center;
1106
+ -ms-flex-align: center;
1107
+ align-items: center;
1108
+ -webkit-box-pack: center;
1109
+ -ms-flex-pack: center;
1110
+ justify-content: center;
1111
+ display: -webkit-box;
1112
+ display: -ms-flexbox;
1113
+ display: flex;
1114
+ height: 100%;
1115
+ border-radius: 0;
1116
+ font-size: 14px;
1117
+ font-weight: 700;
1118
+ text-transform: uppercase;
1119
+ border-bottom: 2px solid transparent;
1120
  }
1121
 
1122
  .wiz-tab .nav-pills .nav-item .nav-link.active {
1123
+ border-color: #0872FC !important;
1124
+ color: #0872FC !important;
1125
+ background-color: transparent !important;
1126
  }
1127
 
1128
  .tab-content {
1129
+ margin-top: 15px;
1130
+ padding-bottom: 15px;
1131
  }
1132
 
1133
  .tab-content .tab-card {
1134
+ background: #ffffff;
1135
+ padding: 30px;
1136
+ border-radius: 15px;
 
1137
  }
1138
 
1139
  .tab-content .tab-card.bg-none {
1140
+ background: none;
1141
+ border: 0;
1142
+ padding: 0;
1143
  }
1144
 
1145
  .tab-content .tab-card .text-header {
1146
+ font-size: 20px;
1147
+ font-weight: 700;
1148
+ margin-bottom: 1.5rem;
1149
+ }
1150
+
1151
+ .tab-content .tab-card .working {
1152
+ max-width: 100%;
1153
+ text-align: center;
1154
+ }
1155
+
1156
+ .tab-content .tab-card .working img {
1157
+ max-width: 100%;
1158
+ margin: 0 auto;
1159
  }
1160
 
1161
  .tab-content .tab-card .db-btn {
1162
+ margin-top: 30px;
 
1163
  }
1164
 
1165
  .tab-content .tab-card .db-btn .btn {
1166
+ margin-right: 30px;
1167
  }
1168
 
1169
  .tab-content .tab-card .custom-control-label {
1170
+ font-size: 14px;
1171
  }
1172
 
1173
  .tab-content .white-box {
1174
+ background-color: #FFFFFF;
1175
+ border: 1px solid #d1d1d1;
1176
+ padding: 10px;
1177
+ margin-bottom: 15px;
1178
  }
1179
 
1180
  .tab-content .white-box:last-child {
1181
+ margin-bottom: 0;
1182
  }
1183
 
1184
  .tab-content .text-m {
1185
+ display: block;
1186
+ margin-bottom: 0.35rem;
1187
+ font-size: 14px;
1188
  }
1189
 
1190
  .btn-google {
1191
+ -ms-box-shadow: 3px 3px 3px #00000029;
1192
+ -webkit-box-shadow: 3px 3px 3px #00000029;
1193
+ box-shadow: 3px 3px 3px #00000029;
1194
+ font-weight: 900;
1195
+ font-size: 14px;
1196
  }
1197
 
1198
  .btn-google img {
1199
+ width: 25px;
1200
+ margin-right: 1.5rem;
1201
  }
1202
 
1203
  .licence {
1204
+ border: 0.5px solid #A9A9A9;
1205
+ padding: 30px;
1206
+ margin-bottom: 15px;
1207
+ border-radius: 15px;
1208
  }
1209
 
1210
  .licence p {
1211
+ margin-bottom: 0.35rem;
1212
+ font-size: 14px;
1213
  }
1214
 
1215
  .licence .input-group {
1216
+ margin-top: 15px;
1217
  }
1218
 
1219
  .licence .input-group .form-control, .licence .input-group .select2.select2-container--default .select2-selection--single, .select2.select2-container--default .licence .input-group .select2-selection--single {
1220
+ border-radius: 10px;
1221
+ margin-right: 15px;
1222
+ color: #000000;
 
 
 
1223
  }
1224
 
1225
  .licence .input-group .input-group-append {
1226
+ margin-left: 0;
1227
  }
1228
 
1229
  .licence .input-group .input-group-append .btn {
1230
+ width: 40px;
1231
+ height: 40px;
1232
+ padding: 0;
1233
+ border-radius: 50%;
1234
+ line-height: normal;
1235
+ }
1236
+
1237
+ .licence .input-group .input-group-append .btn img {
1238
+ max-width: 18px;
1239
  }
1240
 
1241
  .ecom-track {
1242
+ margin-top: 5px;
1243
+ margin-bottom: 0;
1244
  }
1245
 
1246
  .ecom-track li {
1247
+ margin-bottom: 15px;
1248
+ font-size: 14px;
1249
  }
1250
 
1251
  .ecom-track li .img-icon {
1252
+ width: 18px;
1253
+ margin-right: 5px;
1254
  }
1255
 
1256
  .ecom-track li .trk-text {
1257
+ vertical-align: middle;
1258
  }
1259
 
1260
  .premium-list {
1261
+ margin-bottom: 0;
1262
+ margin-top: 15px;
1263
  }
1264
 
1265
  .premium-list li {
1266
+ margin-bottom: 15px;
1267
+ font-size: 14px;
1268
  }
1269
 
1270
  .premium-list li span {
1271
+ position: relative;
1272
+ display: block;
1273
+ padding-left: 15px;
1274
  }
1275
 
1276
  .premium-list li span:before {
1277
+ content: '';
1278
+ width: 5px;
1279
+ height: 5px;
1280
+ border-radius: 50%;
1281
+ background: #000;
1282
+ position: absolute;
1283
+ left: 0;
1284
+ top: 7px;
1285
  }
1286
 
1287
  .google-account-analytics .ga-title {
1288
+ font-size: 14px;
1289
+ font-weight: 700;
1290
+ margin-bottom: 0;
1291
  }
1292
 
1293
  .google-account-analytics .ga-text {
1294
+ margin-bottom: 0;
1295
  }
1296
 
1297
+ .google-account-analytics .acc-num {
1298
+ display: inline-block;
1299
+ border: 0.5px solid #A9A9A9;
1300
+ border-radius: 10px;
1301
+ padding: 5px 8px;
1302
+ min-width: 180px;
1303
+ text-align: right;
1304
  }
1305
 
1306
+ .google-account-analytics .acc-num .ga-text {
1307
+ font-weight: 900;
1308
+ border-right: 1px solid #A9A9A9;
1309
+ padding: 0 5px;
1310
  }
1311
 
1312
+ .google-account-analytics .acc-num .ga-text:last-child {
1313
+ border-right: 0;
1314
+ padding-right: 0;
 
1315
  }
1316
 
1317
+ .google-account-analytics .acc-num p {
1318
+ display: inline-block;
1319
  }
1320
 
1321
+ .content-heading {
1322
+ font-size: 18px;
1323
+ font-weight: 700;
1324
  }
1325
 
1326
+ .wizard-section.campaign-wizard {
1327
+ padding: 0;
 
 
 
 
1328
  }
1329
 
1330
+ .wizard-section.campaign-wizard .wizard-content .wizard .steps {
1331
+ border-radius: 0 !important;
1332
+ -ms-box-shadow: none;
1333
+ -webkit-box-shadow: none;
1334
+ box-shadow: none;
1335
+ background-color: transparent;
1336
+ max-width: 520px;
1337
+ margin: 0 auto 20px auto;
1338
  }
1339
 
1340
+ .wizard-section.campaign-wizard .wizard-content .wizard .steps ul li {
1341
+ text-align: center;
1342
+ border-right: 0;
1343
+ padding: 0 25px;
1344
  }
1345
 
1346
+ .wizard-section.campaign-wizard .wizard-content .wizard .steps ul li:last-child::before {
1347
+ display: none;
 
 
 
 
 
 
 
 
 
 
1348
  }
1349
 
1350
+ .wizard-section.campaign-wizard .wizard-content .wizard .steps ul li .wiz-title {
1351
+ color: #5E5E5E;
1352
+ font-size: 14px;
1353
+ font-weight: 400;
1354
  }
1355
 
1356
+ .wizard-section.campaign-wizard .wizard-content .wizard .steps ul li .step {
1357
+ visibility: hidden;
 
 
 
1358
  }
1359
 
1360
+ .wizard-section.campaign-wizard .wizard-content .wizard .steps ul li a::before {
1361
+ content: '' !important;
1362
+ width: 16px;
1363
+ height: 16px;
1364
+ border: 1px solid #707070;
1365
+ display: inline-block;
1366
+ position: absolute;
1367
+ margin: 0 auto;
1368
+ left: 0;
1369
+ right: 0;
1370
+ top: 0;
1371
+ border-radius: 50%;
1372
+ z-index: 10;
1373
+ background-color: #F2F2F2;
1374
  }
1375
 
1376
+ .wizard-section.campaign-wizard .wizard-content .wizard .steps ul li::before {
1377
+ content: '' !important;
1378
+ width: 100%;
1379
+ border: 2px solid #5E5E5E;
1380
+ display: inline-block;
1381
+ position: absolute;
1382
+ left: 50%;
1383
+ top: 0;
1384
+ margin-top: 5px;
1385
+ }
1386
+
1387
+ .wizard-section.campaign-wizard .wizard-content .wizard .steps ul li.current {
1388
+ background-color: transparent;
1389
+ }
1390
+
1391
+ .wizard-section.campaign-wizard .wizard-content .wizard .steps ul li.current .wiz-title {
1392
+ color: #25283D;
1393
+ font-weight: 700;
1394
+ }
1395
+
1396
+ .wizard-section.campaign-wizard .wizard-content .wizard .steps ul li.current a::after {
1397
+ content: '' !important;
1398
+ width: calc(16px - 8px);
1399
+ height: calc(16px - 8px);
1400
+ background-color: #2D62ED;
1401
+ display: inline-block;
1402
+ position: absolute;
1403
+ margin: 0 auto;
1404
+ left: 0;
1405
+ right: 0;
1406
+ top: 0;
1407
+ margin-top: 4px;
1408
+ border-radius: 50%;
1409
+ z-index: 10;
1410
+ }
1411
+
1412
+ .wizard-section.campaign-wizard .wizard-content .wizard .steps ul li.done a::before {
1413
+ top: 0;
1414
+ width: 16px;
1415
+ height: 16px;
1416
+ background-size: 16px auto;
1417
+ border-color: transparent;
1418
+ }
1419
+
1420
+ .wizard-section.campaign-wizard .wizard-content .wizard .steps ul li.done a::after {
1421
+ display: none;
1422
  }
1423
 
1424
+ .wizard-section.campaign-wizard .wizard-content .wizard .steps ul li.done a .wiz-title {
1425
+ color: #25283D;
1426
+ font-weight: 400;
1427
  }
1428
 
1429
+ .wizard-section.campaign-wizard .wizard-content .wizard .content {
1430
+ background-color: transparent;
1431
+ -ms-box-shadow: none;
1432
+ -webkit-box-shadow: none;
1433
+ box-shadow: none;
1434
+ padding: 0;
1435
+ margin-bottom: 30px;
1436
+ overflow: initial;
1437
  }
1438
 
1439
+ .wizard-section.campaign-wizard .wizard-content .wizard .content > .body {
1440
+ padding: 0;
 
 
1441
  }
1442
 
1443
+ .wizard-section.campaign-wizard .wizard-content .wizard .content .card-wrapper {
1444
+ background-color: #F2F2F2;
1445
+ -ms-box-shadow: none;
1446
+ -webkit-box-shadow: none;
1447
+ box-shadow: none;
1448
+ padding: 0;
1449
+ border-radius: 15px;
1450
  }
1451
 
1452
+ .wizard-section.campaign-wizard .wizard-content .wizard .content .card-wrapper .row:first-child {
1453
+ background-color: #000338;
1454
+ padding: 15px;
1455
+ margin-bottom: 1rem;
1456
+ margin-left: 0;
1457
+ margin-right: 0;
1458
+ border-radius: calc(15px - 1px) calc(15px - 1px) 0 0;
1459
  }
1460
 
1461
+ .wizard-section.campaign-wizard .wizard-content .wizard .content .card-wrapper .row:first-child .heading-tbl {
1462
+ margin-bottom: 0;
1463
+ font-size: 15px;
1464
+ color: #FFFFFF;
1465
+ text-decoration: none;
1466
+ font-weight: normal;
1467
+ border-right: 1px solid #FFFFFF;
1468
+ text-align: center;
1469
  }
1470
 
1471
+ .wizard-section.campaign-wizard .wizard-content .wizard .content .card-wrapper .row:first-child .col-6:last-child .heading-tbl {
1472
+ border-right: 0;
1473
  }
1474
 
1475
+ .wizard-section.campaign-wizard .wizard-content .wizard .content .card-wrapper .row .col-6 .form-group {
1476
+ padding-left: 15px;
1477
+ padding-right: 15px;
1478
  }
1479
 
1480
+ .wizard-section.campaign-wizard .wizard-content .wizard .content .card-wrapper .row .col-6 .form-group .form-label-control {
1481
+ margin-bottom: 0;
1482
  }
1483
 
1484
+ .wizard-section.campaign-wizard .wizard-content .wizard .content .heading-tbl {
1485
+ font-size: 16px;
1486
+ text-decoration: underline;
1487
+ margin-bottom: 1rem;
1488
+ font-weight: 400;
1489
  }
1490
 
1491
+ .wizard-section.campaign-wizard .wizard-content .wizard .content .td-head {
1492
+ display: block;
1493
+ font-weight: 700;
1494
+ text-align: right;
1495
  }
1496
 
1497
+ .wizard-section.campaign-wizard .wizard-content .wizard .actions {
1498
+ position: static;
1499
+ height: auto;
1500
+ padding: 0;
1501
  }
1502
 
1503
+ .wizard-section.campaign-wizard .wizard-content .wizard .actions ul {
1504
+ -webkit-box-pack: start;
1505
+ -ms-flex-pack: start;
1506
+ justify-content: flex-start;
 
1507
  }
1508
 
1509
+ .sync-new-product .product-card {
1510
+ background-color: #F2F2F2;
1511
+ border-radius: 10px;
1512
+ -ms-box-shadow: 0 3px 6px #00000029;
1513
+ -webkit-box-shadow: 0 3px 6px #00000029;
1514
+ box-shadow: 0 3px 6px #00000029;
1515
+ margin-top: 1rem;
1516
+ }
1517
+
1518
+ .sync-new-product .product-card .row {
1519
+ margin-left: 0;
1520
+ margin-right: 0;
1521
+ }
1522
+
1523
+ .sync-new-product .product-card .row [class*="col-"] {
1524
+ padding: 0;
1525
+ }
1526
+
1527
+ .sync-new-product .product-card .row [class*="col-"]:first-child .card {
1528
+ border-radius: calc(10px - 1px) 0 0 calc(10px - 1px);
1529
+ margin-left: -1px;
1530
+ }
1531
+
1532
+ .sync-new-product .product-card .row [class*="col-"]:last-child .card {
1533
+ border-radius: 0 0 calc(10px - 1px) calc(10px - 1px);
1534
+ margin-right: -1px;
1535
+ }
1536
+
1537
+ .sync-new-product .product-card .row [class*="col"]:last-child .card:after {
1538
+ border-right: 0;
1539
+ }
1540
+
1541
+ .sync-new-product .product-card .card {
1542
+ border: 0;
1543
+ padding: 10px 5px;
1544
+ text-align: center;
1545
+ border-radius: 0;
1546
+ background-color: transparent;
1547
+ }
1548
+
1549
+ .sync-new-product .product-card .col:after {
1550
+ content: '';
1551
+ border-right: 1px solid #A9A9A9;
1552
+ display: block;
1553
+ position: absolute;
1554
+ top: 25px;
1555
+ bottom: 5px;
1556
+ right: 0;
1557
+ }
1558
+ .sync-new-product .product-card .col:last-child:after {
1559
+ border-right: 0;
1560
+ }
1561
+
1562
+ .sync-new-product .product-card .card.active {
1563
+ background-color: #FFFFFF;
1564
+ }
1565
+
1566
+ .sync-new-product .product-card .card.active .pro-title, .sync-new-product .product-card .card.active .pro-count {
1567
+ color: #2D62ED !important;
1568
+ }
1569
+
1570
+ .sync-new-product .product-card .card.active:before {
1571
+ content: '';
1572
+ border-bottom: 2px solid #2D62ED;
1573
+ display: block;
1574
+ position: absolute;
1575
+ left: 5px;
1576
+ bottom: 0;
1577
+ right: 5px;
1578
+ }
1579
+
1580
+ .sync-new-product .product-card .card.active:after {
1581
+ border-color: #FFFFFF;
1582
+ }
1583
+
1584
+ .sync-new-product .product-card .card .pro-title {
1585
+ font-weight: 400;
1586
+ margin-bottom: 0;
1587
+ }
1588
+
1589
+ .sync-new-product .product-card .card .pro-count {
1590
+ font-size: 35px;
1591
+ font-weight: 900;
1592
+ margin-bottom: 0;
1593
+ }
1594
+
1595
+ .sync-new-product .product-card .card.pending .pro-count, .sync-new-product .product-card .card.pending .pro-title {
1596
+ color: #5E5E5E;
1597
+ }
1598
+
1599
+ .sync-new-product .product-card .card.approved .pro-count, .sync-new-product .product-card .card.approved .pro-title {
1600
+ color: #66BB6A;
1601
+ }
1602
+
1603
+ .sync-new-product .product-card .card.disapproved .pro-count, .sync-new-product .product-card .card.disapproved .pro-title {
1604
+ color: #EE2C3C;
1605
+ }
1606
+
1607
+ .sync-new-product .title {
1608
+ font-size: 14px;
1609
+ font-weight: 500;
1610
+ }
1611
+
1612
+ .feature-list-section {
1613
+ background: transparent linear-gradient(63deg, #03D7FD 0%, #0872FC 100%) 0% 0% no-repeat padding-box;
1614
+ border-radius: 15px;
1615
+ padding: 15px 30px;
1616
+ margin-top: 30px;
1617
+ }
1618
+
1619
+ .feature-list-section .feature-heading {
1620
+ text-align: center;
1621
+ margin-bottom: 30px;
1622
+ }
1623
+
1624
+ .feature-list-section .feature-heading span {
1625
+ border-bottom: 1px solid #FFFFFF;
1626
+ padding: 0 10px 5px 10px;
1627
+ font-size: 18px;
1628
+ color: #FFFFFF;
1629
+ }
1630
+
1631
+ .feature-list-section .media {
1632
+ position: relative;
1633
+ max-width: 85%;
1634
+ }
1635
+
1636
+ .feature-list-section .media .feature-icon {
1637
+ width: 50px;
1638
+ margin-right: 20px;
1639
+ }
1640
+
1641
+ .feature-list-section .media .feature-icon .img-tg {
1642
+ max-width: 50px;
1643
+ }
1644
+
1645
+ .feature-list-section .media .title-feature {
1646
+ color: #FFFFFF;
1647
+ font-size: 14px;
1648
+ font-weight: 900;
1649
+ margin-bottom: 6px;
1650
+ }
1651
+
1652
+ .feature-list-section .media .feature-content {
1653
+ color: #FFFFFF;
1654
+ font-weight: 300;
1655
+ margin-bottom: 0;
1656
+ }
1657
+
1658
+ .feature-list-section .media.lock .feature-icon, .feature-list-section .media.lock .media-body {
1659
+ opacity: 0.5;
1660
+ }
1661
+
1662
+ .feature-list-section .media .lock-icon {
1663
+ position: absolute;
1664
+ top: 12px;
1665
+ left: -30px;
1666
+ }
1667
+
1668
+ .feature-list-section .list-section {
1669
+ margin-bottom: 0;
1670
+ }
1671
+
1672
+ .feature-list-section .list-section .row > [class*="col-"] {
1673
+ padding-bottom: 15px;
1674
+ display: -webkit-box;
1675
+ display: -ms-flexbox;
1676
+ display: flex;
1677
+ -webkit-box-pack: center;
1678
+ -ms-flex-pack: center;
1679
+ justify-content: center;
1680
+ }
1681
+
1682
+ .feature-list-section .unlock-premium {
1683
+ text-align: center;
1684
+ margin-top: 50px;
1685
+ }
1686
+
1687
+ .feature-list-section .unlock-premium .btn:hover img, .feature-list-section .unlock-premium .btn:focus img {
1688
+ -webkit-filter: grayscale(100%) brightness(100);
1689
+ filter: grayscale(100%) brightness(100);
1690
+ }
1691
+
1692
+ .google-slider {
1693
+ margin-top: 30px;
1694
+ -ms-box-shadow: 1px 1px 4px #00000026;
1695
+ -webkit-box-shadow: 1px 1px 4px #00000026;
1696
+ box-shadow: 1px 1px 4px #00000026;
1697
+ padding: 30px;
1698
+ border-radius: 15px;
1699
+ }
1700
+
1701
+ .google-slider .slider-img img {
1702
+ max-width: 400px;
1703
+ }
1704
+
1705
+ .google-slider .sld-hd {
1706
+ font-size: 12px;
1707
+ color: #A9A9A9;
1708
+ margin-bottom: 15px;
1709
+ }
1710
+
1711
+ .google-slider .sld-sbhd {
1712
+ font-size: 18px;
1713
+ margin-bottom: 15px;
1714
+ font-weight: 700;
1715
+ }
1716
+
1717
+ .google-slider .sld-cnt {
1718
+ font-size: 14px;
1719
+ color: #5E5E5E;
1720
+ }
1721
+
1722
+ .google-slider .sld-list {
1723
+ margin-bottom: 0;
1724
+ margin-top: 30px;
1725
+ }
1726
+
1727
+ .google-slider .sld-list li {
1728
+ margin-bottom: 12px;
1729
+ font-weight: 700;
1730
+ font-size: 14px;
1731
+ position: relative;
1732
+ padding-left: 24px;
1733
+ }
1734
+
1735
+ .google-slider .sld-list li:last-child {
1736
+ margin-bottom: 0;
1737
+ }
1738
+
1739
+ .google-slider .sld-list li .tick-icon {
1740
+ position: absolute;
1741
+ left: 0;
1742
+ top: 5px;
1743
+ width: 14px;
1744
+ }
1745
+
1746
+ .google-slider .carousel-item {
1747
+ padding: 0 30px;
1748
+ }
1749
+
1750
+ .testimonials {
1751
+ margin-top: 30px;
1752
+ }
1753
+
1754
+ .testimonials ul li {
1755
+ margin-bottom: 15px;
1756
+ }
1757
+
1758
+ .testimonials ul li:last-child {
1759
+ margin-bottom: 0;
1760
+ }
1761
+
1762
+ .testimonials ul li:nth-child(even) .user-details {
1763
+ -webkit-box-ordinal-group: 3;
1764
+ -ms-flex-order: 2;
1765
+ order: 2;
1766
+ margin-left: 50px;
1767
+ margin-right: 0 !important;
1768
+ }
1769
+
1770
+ .testimonials ul li:nth-child(even) .media-body {
1771
+ -webkit-box-ordinal-group: 2;
1772
+ -ms-flex-order: 1;
1773
+ order: 1;
1774
+ }
1775
+
1776
+ .testimonials ul li .testimonila-box {
1777
+ background-color: #000338;
1778
+ padding: 15px 30px;
1779
+ border-radius: 15px;
1780
+ }
1781
+
1782
+ .testimonials ul li .testimonila-box .user-details {
1783
+ margin-right: 50px;
1784
+ }
1785
+
1786
+ .testimonials ul li .testimonila-box .user-details .user-image-box {
1787
+ width: 100px;
1788
+ height: 100px;
1789
+ border-radius: 50%;
1790
+ margin: 0 auto 5px auto;
1791
+ }
1792
+
1793
+ .testimonials ul li .testimonila-box .user-details .user-image-box .user-image {
1794
+ border-radius: 50%;
1795
+ width: 100%;
1796
+ height: 100%;
1797
+ -o-object-fit: cover;
1798
+ object-fit: cover;
1799
+ }
1800
+
1801
+ .testimonials ul li .testimonila-box .user-details .user-name {
1802
+ font-size: 12px;
1803
+ color: #FFFFFF;
1804
+ margin-bottom: 3px;
1805
+ text-align: center;
1806
+ }
1807
+
1808
+ .testimonials ul li .testimonila-box .user-details .designation {
1809
+ color: #FFFFFF;
1810
+ font-weight: 300;
1811
+ text-align: center;
1812
+ font-size: 12px;
1813
+ margin-bottom: 0;
1814
+ }
1815
+
1816
+ .testimonials ul li .testimonila-box .testi-content {
1817
+ color: #FFFFFF;
1818
+ font-size: 13px;
1819
+ font-weight: 300;
1820
+ padding: 0 20px;
1821
+ margin-bottom: 0;
1822
+ }
1823
+
1824
+ .testimonials ul li .testimonila-box .quote {
1825
+ font-weight: 900;
1826
+ font-size: 30px;
1827
+ opacity: rgba(255, 255, 255, 0.5);
1828
+ margin-bottom: 0;
1829
+ }
1830
+
1831
+ .carousel-indicators {
1832
+ bottom: -30px;
1833
+ }
1834
+
1835
+ .carousel-indicators li {
1836
+ width: 7px;
1837
+ height: 7px;
1838
+ border: 1px solid #FFFFFF;
1839
+ background-color: transparent;
1840
+ border-radius: 50%;
1841
+ opacity: 1;
1842
+ }
1843
+
1844
+ .carousel-indicators li.active {
1845
+ background-color: #FFFFFF;
1846
+ border-color: #FFFFFF;
1847
+ }
1848
+
1849
+ .carousel-control-prev, .carousel-control-next {
1850
+ opacity: 1;
1851
+ width: auto;
1852
+ bottom: auto;
1853
+ top: 50%;
1854
+ -webkit-transform: translateY(-50%);
1855
+ transform: translateY(-50%);
1856
+ left: -15px;
1857
+ }
1858
+
1859
+ .carousel-control-prev .carousel-control-prev-icon, .carousel-control-next .carousel-control-prev-icon {
1860
+ background-image: none;
1861
+ }
1862
+
1863
+ .carousel-control-prev .carousel-control-prev-icon img, .carousel-control-next .carousel-control-prev-icon img {
1864
+ -webkit-transform: rotate(90deg);
1865
+ transform: rotate(90deg);
1866
+ width: 15px;
1867
+ }
1868
+
1869
+ .carousel-control-next {
1870
+ left: auto;
1871
+ right: -15px;
1872
+ }
1873
+
1874
+ .carousel-control-next .carousel-control-next-icon {
1875
+ background-image: none;
1876
+ }
1877
+
1878
+ .carousel-control-next .carousel-control-next-icon img {
1879
+ -webkit-transform: rotate(-90deg);
1880
+ transform: rotate(-90deg);
1881
+ width: 15px;
1882
+ }
1883
+
1884
+ .rating {
1885
+ padding: 30px 0 0 0;
1886
+ text-align: center;
1887
+ }
1888
+
1889
+ .rating .rating-text {
1890
+ font-size: 18px;
1891
+ font-weight: 700;
1892
+ margin-left: 24px;
1893
+ }
1894
+
1895
+ .upgrade-section {
1896
+ margin-bottom: 30px;
1897
+ }
1898
+
1899
+ .upgrade-section .upgrade-info {
1900
+ background-color: #F2F2F2;
1901
+ padding: 10px 15px;
1902
+ border-radius: 15px;
1903
+ }
1904
+
1905
+ .upgrade-section .upgrade-info span {
1906
+ font-size: 16px;
1907
+ }
1908
+
1909
+ .upgrade-section .upgrade-info .btn-outline-primary {
1910
+ background-color: #FFFFFF;
1911
+ }
1912
+
1913
+ .upgrade-section .package-details {
1914
+ margin-top: 30px;
1915
+ }
1916
+
1917
+ .upgrade-section .package-details .package-card {
1918
+ border: 0;
1919
+ border-radius: 15px;
1920
+ -ms-box-shadow: 0 3px 10px #00000029;
1921
+ -webkit-box-shadow: 0 3px 10px #00000029;
1922
+ box-shadow: 0 3px 10px #00000029;
1923
+ }
1924
+
1925
+ .upgrade-section .package-details .package-card .card-header {
1926
+ border-radius: calc(15px - 1px) calc(15px - 1px) 0 0;
1927
+ border-bottom: 0;
1928
+ background: transparent -webkit-gradient(linear, right top, left top, from(#03D7FD), to(#0872FC)) 0% 0% no-repeat padding-box;
1929
+ background: transparent linear-gradient(270deg, #03D7FD 0%, #0872FC 100%) 0% 0% no-repeat padding-box;
1930
+ padding: 25px;
1931
+ }
1932
+
1933
+ .upgrade-section .package-details .package-card .card-header .package-name {
1934
+ color: #FFFFFF;
1935
+ font-weight: 900;
1936
+ font-size: 18px;
1937
+ margin-bottom: 0;
1938
+ }
1939
+
1940
+ .upgrade-section .package-details .package-card .card-body {
1941
+ padding: 25px 25px 0 25px;
1942
+ }
1943
+
1944
+ .upgrade-section .package-details .package-card .card-body .service-provide li {
1945
+ color: #7F7F7F;
1946
+ border-bottom: 1px solid #EDEDED;
1947
+ padding-bottom: 10px;
1948
+ padding-top: 10px;
1949
+ }
1950
+
1951
+ .upgrade-section .package-details .package-card .card-body .service-provide li:first-child {
1952
+ padding-top: 0;
1953
+ }
1954
+
1955
+ .upgrade-section .package-details .package-card .card-body .service-provide li:last-child {
1956
+ border-bottom: 0;
1957
+ }
1958
+
1959
+ .upgrade-section .package-details .package-card .card-body .service-provide li img {
1960
+ max-width: 15px;
1961
+ }
1962
+
1963
+ .upgrade-section .package-details .package-card .card-footer {
1964
+ border-radius: 0 0 calc(15px - 1px) calc(15px - 1px);
1965
+ border-bottom: 0;
1966
+ background-color: transparent;
1967
+ border-top: 0;
1968
+ text-align: center;
1969
+ padding: 25px;
1970
+ }
1971
+
1972
+ .back-btn {
1973
+ padding: 0;
1974
+ color: #25283D;
1975
+ position: absolute;
1976
+ top: -25px;
1977
+ left: 0;
1978
+ font-size: 12px;
1979
+ }
1980
+
1981
+ .back-btn span {
1982
+ vertical-align: middle;
1983
+ padding-left: 3px;
1984
+ }
1985
+
1986
+ .edit-section .edit-tabs {
1987
+ border: 0.5px solid #A9A9A9;
1988
+ border-radius: 15px;
1989
+ }
1990
+
1991
+ .edit-section .edit-tabs .nav-item {
1992
+ margin-bottom: 0;
1993
+ }
1994
+
1995
+ .edit-section .edit-tabs .nav-item:last-child .nav-link {
1996
+ border-right: 0;
1997
+ border-radius: 0 calc(15px - 1px) calc(15px - 1px) 0;
1998
+ margin-right: -1px;
1999
+ }
2000
+
2001
+ .edit-section .edit-tabs .nav-item:first-child .nav-link {
2002
+ border-radius: calc(15px - 1px) 0 0 calc(15px - 1px);
2003
+ }
2004
+
2005
+ .edit-section .edit-tabs .nav-link {
2006
+ border: 0;
2007
+ border-right: 0.5px solid #A9A9A9;
2008
+ border-radius: 0;
2009
+ color: #5E5E5E;
2010
+ font-size: 16px;
2011
+ font-weight: 700;
2012
+ padding: 12px 8px;
2013
+ }
2014
+ .edit-section .edit-tabs .nav-link a{
2015
+ color: #5E5E5E;
2016
+ }
2017
+
2018
+ .edit-section .edit-tabs .nav-link.active {
2019
+ background-color: #000338 !important;
2020
+ color: #FFFFFF !important;
2021
+ }
2022
+ .edit-section .edit-tabs .nav-link.active a{
2023
+ background-color: #000338 !important;
2024
+ color: #FFFFFF !important;
2025
+ }
2026
+
2027
+ .product-title {
2028
+ font-size: 16px;
2029
+ font-weight: 700;
2030
+ color: #5E5E5E;
2031
+ margin-bottom: 15px;
2032
+ }
2033
+
2034
+ .total-products {
2035
+ margin-top: 30px;
2036
+ }
2037
+
2038
+ .total-products .table-section {
2039
+ background-color: #F2F2F2;
2040
+ border-radius: 15px;
2041
+ padding: 0 15px;
2042
+ border: 0;
2043
+ -ms-box-shadow: none;
2044
+ -webkit-box-shadow: none;
2045
+ box-shadow: none;
2046
+ }
2047
+
2048
+ .total-products .table-section .table th, .total-products .table-section .table td {
2049
+ color: #5E5E5E;
2050
+ }
2051
+
2052
+ .total-products .table-section .table tr th {
2053
+ padding: 10px 10px;
2054
+ }
2055
+
2056
+ .total-products .table-section .table tbody tr td {
2057
+ padding: 25px 10px;
2058
+ background-color: #FFFFFF;
2059
+ vertical-align: middle;
2060
+ position: relative;
2061
+ }
2062
+
2063
+ .total-products .table-section .table tbody tr td:after {
2064
+ content: '';
2065
+ border-right: 1px solid #A9A9A9;
2066
+ display: block;
2067
+ position: absolute;
2068
+ top: 10px;
2069
+ bottom: 20px;
2070
+ right: 0;
2071
+ }
2072
+ .total-products .table-section .table tbody tr td:before{
2073
+ content: '';
2074
+ border-bottom: 10px solid #f2f2f2;
2075
+ position: absolute;
2076
+ display: block;
2077
+ width: 100%;
2078
+ top: 10px;
2079
+ bottom: 0px;
2080
+ right: 0;
2081
+ }
2082
+
2083
+ .total-products .table-section .table tbody tr td:first-child {
2084
+ border-radius: 15px 0 0 15px;
2085
+ }
2086
+
2087
+ .total-products .table-section .table tbody tr td:first-child:after {
2088
+ border-right: 0;
2089
+ }
2090
+
2091
+ .total-products .table-section .table tbody tr td:last-child {
2092
+ border-radius: 0 15px 15px 0;
2093
+ }
2094
+
2095
+ .total-products .table-section .table tbody tr td:last-child:after {
2096
+ border-right: 0;
2097
+ }
2098
+
2099
+ .total-products .table-section .table tbody tr td.product-image {
2100
+ width: 80px;
2101
+ }
2102
+
2103
+ .smart-shopping-section .sec-title {
2104
+ font-size: 16px;
2105
+ font-weight: 700;
2106
+ }
2107
+
2108
+ .smart-shopping-section .create-campaign-btn .btn {
2109
+ width: 190px;
2110
+ }
2111
+
2112
+ .account-performance {
2113
+ margin-top: 15px;
2114
+ }
2115
+
2116
+ .pro-account {
2117
+ max-width: 250px;
2118
+ position: relative;
2119
+ margin-top: 30px;
2120
+ }
2121
+
2122
+ .pro-account .card {
2123
+ border: 0;
2124
+ border-radius: 10px;
2125
+ -ms-box-shadow: 0 3px 6px #272D3B33;
2126
+ -webkit-box-shadow: 0 3px 6px #272D3B33;
2127
+ box-shadow: 0 3px 6px #272D3B33;
2128
+ }
2129
+
2130
+ .pro-account .card .card-footer {
2131
+ background-color: transparent;
2132
+ border-top: 0;
2133
+ text-align: center;
2134
+ }
2135
+
2136
+ .pro-account .card .card-body .account-img {
2137
+ margin-bottom: 15px;
2138
+ position: absolute;
2139
+ top: -60px;
2140
+ }
2141
+
2142
+ .pro-account .card .card-body .account-img img {
2143
+ max-width: 100%;
2144
+ }
2145
+
2146
+ .pro-account .card .card-body .pro-content {
2147
+ margin-top: 90px;
2148
+ }
2149
+
2150
+ .pro-account .card .card-body .pro-content p {
2151
+ margin-bottom: 0;
2152
+ }
2153
+
2154
+ .pro-account .card .card-body .userName {
2155
+ font-weight: 900;
2156
+ font-size: 14px;
2157
+ }
2158
+
2159
+ /*.dataTables_info {
2160
+ display: none;
2161
+ }*/
2162
+
2163
+ .informanal-section {
2164
+ margin-left: 3px;
2165
+ }
2166
+
2167
+ .informanal-section img {
2168
+ width: 12px;
2169
+ }
2170
+
2171
+ .mt--top {
2172
+ margin-top: -60px;
2173
+ }
2174
+
2175
+ .bottom-section {
2176
+ position: fixed;
2177
+ right: 70px;
2178
+ bottom: 30px;
2179
+ }
2180
+
2181
+ .bottom-section .dropdown .btn {
2182
+ width: 50px;
2183
+ height: 50px;
2184
+ padding: 10px;
2185
+ background-color: #000338;
2186
+ position: relative;
2187
+ z-index: 1001;
2188
+ }
2189
+
2190
+ .bottom-section .dropdown .btn img {
2191
+ max-width: 100%;
2192
+ max-height: 100%;
2193
+ }
2194
+
2195
+ .bottom-section .dropdown .dropdown-menu {
2196
+ background-color: transparent;
2197
+ border: 0;
2198
+ min-width: auto;
2199
+ display: block !important;
2200
+ -webkit-transform: none !important;
2201
+ transform: none !important;
2202
+ top: auto !important;
2203
+ bottom: 100%;
2204
+ padding: 0;
2205
+ margin: 0;
2206
+ right: 0;
2207
+ }
2208
+
2209
+ .bottom-section .dropdown .dropdown-menu li {
2210
+ padding: 0;
2211
+ position: relative;
2212
+ margin: 10px 0;
2213
+ }
2214
+
2215
+ .bottom-section .dropdown .dropdown-menu li .item-text {
2216
+ padding-left: 45px;
2217
+ padding-top: 10px;
2218
+ display: block;
2219
+ color: #000338;
2220
+ display: none;
2221
+ }
2222
+
2223
+ .bottom-section .dropdown .dropdown-menu li:after {
2224
+ content: '';
2225
+ height: 100%;
2226
+ width: 1px;
2227
+ border-left: 1px dashed #000338;
2228
+ position: absolute;
2229
+ top: 100%;
2230
+ bottom: 0;
2231
+ left: 50%;
2232
+ -webkit-transform: translateX(-50%);
2233
+ transform: translateX(-50%);
2234
+ }
2235
+
2236
+ .bottom-section .dropdown .dropdown-menu li .dropdown-item {
2237
+ width: calc(50px - 10px);
2238
+ height: calc(50px - 10px);
2239
+ padding: 0;
2240
+ background-color: #FFFFFF;
2241
+ border-radius: 50%;
2242
+ position: relative;
2243
+ z-index: 1;
2244
+ margin: 0 auto;
2245
+ }
2246
+
2247
+ .bottom-section .dropdown .dropdown-menu li .dropdown-item img {
2248
+ max-width: 50%;
2249
+ position: absolute;
2250
+ top: 50%;
2251
+ left: 50%;
2252
+ -webkit-transform: translate(-50%, -50%);
2253
+ transform: translate(-50%, -50%);
2254
+ }
2255
+
2256
+ .bottom-section .dropdown .dropdown-menu li .dropdown-item:hover {
2257
+ background-color: #03D7FD;
2258
+ }
2259
+
2260
+ .bottom-section .dropdown .dropdown-menu li .dropdown-item:hover img {
2261
+ -webkit-filter: grayscale(100%) brightness(30%) sepia(100%) hue-rotate(-180deg) saturate(700%) contrast(0.8);
2262
+ filter: grayscale(100%) brightness(30%) sepia(100%) hue-rotate(-180deg) saturate(700%) contrast(0.8);
2263
+ }
2264
+
2265
+ .bottom-section .dropdown .dropdown-menu li .dropdown-item:hover .item-text {
2266
+ display: block;
2267
+ }
2268
+
2269
+ .tapme .tooltip-inner {
2270
+ background-color: #03D7FD;
2271
+ color: #000338;
2272
+ border-radius: 500px;
2273
+ -ms-box-shadow: 0 3px 6px #00000029;
2274
+ -webkit-box-shadow: 0 3px 6px #00000029;
2275
+ box-shadow: 0 3px 6px #00000029;
2276
+ font-weight: 700;
2277
+ }
2278
+
2279
+ .wizard-section {
2280
+ padding: 20px 0;
2281
+ }
2282
+
2283
+ .wizard-section .wizard-content .wizard {
2284
+ overflow: initial;
2285
+ position: relative;
2286
+ }
2287
+
2288
+ .wizard-section .wizard-content .wizard .steps {
2289
+ margin-bottom: 15px;
2290
+ border-radius: 15px;
2291
+ background: #fff;
2292
+ -ms-box-shadow: 0 0 10px #00000029;
2293
+ -webkit-box-shadow: 0 0 10px #00000029;
2294
+ box-shadow: 0 0 10px #00000029;
2295
+ }
2296
+
2297
+ .wizard-section .wizard-content .wizard .steps ul li {
2298
+ text-align: left;
2299
+ padding: 15px 30px;
2300
+ border-right: 1px solid #EDEDED;
2301
+ }
2302
+
2303
+ .wizard-section .wizard-content .wizard .steps ul li:first-child {
2304
+ border-radius: 15px 0 0 15px;
2305
+ }
2306
+
2307
+ .wizard-section .wizard-content .wizard .steps ul li:last-child {
2308
+ border-right: 0;
2309
+ border-radius: 0 15px 15px 0;
2310
+ }
2311
+
2312
+ .wizard-section .wizard-content .wizard .steps ul li.current {
2313
+ background-color: #2D62ED;
2314
+ }
2315
+
2316
+ .wizard-section .wizard-content .wizard .steps ul li.current .step, .wizard-section .wizard-content .wizard .steps ul li.current .wiz-title {
2317
+ font-weight: 400;
2318
+ color: #FFFFFF;
2319
+ }
2320
+
2321
+ .wizard-section .wizard-content .wizard .steps ul li.current .step {
2322
+ background-color: transparent;
2323
+ }
2324
+
2325
+ .wizard-section .wizard-content .wizard .steps ul li.done a {
2326
+ padding-left: 25px;
2327
+ }
2328
+
2329
+ .wizard-section .wizard-content .wizard .steps ul li.done a:before {
2330
+ content: '' !important;
2331
+ width: 24px;
2332
+ height: 24px;
2333
+ position: absolute;
2334
+ background: url(../images/icon/tick-round.svg) no-repeat left top;
2335
+ background-size: 24px auto;
2336
+ top: 8px;
2337
+ left: -15px;
2338
+ }
2339
+
2340
+ .wizard-section .wizard-content .wizard .steps ul li.done .step {
2341
+ background-color: transparent;
2342
+ border-color: transparent;
2343
+ color: #9D9D9D;
2344
+ font-weight: 400;
2345
+ }
2346
+
2347
+ .wizard-section .wizard-content .wizard .steps ul li.done .wiz-title {
2348
+ color: #9D9D9D;
2349
+ font-weight: 400;
2350
  }
2351
 
2352
  .wizard-section .wizard-content .wizard .steps ul li a {
2353
+ padding: 0;
2354
+ margin: 0;
2355
+ -webkit-transition: none;
2356
+ transition: none;
2357
  }
2358
 
2359
  .wizard-section .wizard-content .wizard .steps ul li .step {
2360
+ width: auto;
2361
+ height: auto;
2362
+ border: 0;
2363
+ font-size: 14px;
2364
+ color: #9D9D9D;
2365
+ line-height: normal;
2366
+ border-radius: 0;
2367
+ position: static;
2368
+ margin: 0;
2369
+ display: block;
2370
+ text-align: left;
2371
+ font-weight: 700;
2372
  }
2373
 
2374
  .wizard-section .wizard-content .wizard .steps ul li:before {
2375
+ content: none !important;
2376
  }
2377
 
2378
  .wizard-section .wizard-content .wizard .steps ul li:after {
2379
+ content: none !important;
 
 
 
 
 
 
 
 
2380
  }
2381
 
2382
  .wizard-section .wizard-content .wizard .steps ul li .wiz-title {
2383
+ color: #9D9D9D;
2384
+ font-weight: 700;
2385
+ display: block;
2386
+ margin-top: 5px;
2387
  }
2388
 
2389
  .wizard-section .wizard-content .wizard .actions {
2390
+ margin-top: 0;
2391
+ text-align: center;
2392
+ position: absolute;
2393
+ height: 60px;
2394
+ bottom: 0;
2395
+ padding: 0 30px;
2396
  }
2397
 
2398
  .wizard-section .wizard-content .wizard .actions ul {
2399
+ width: 100%;
2400
+ display: -webkit-box;
2401
+ display: -ms-flexbox;
2402
+ display: flex;
2403
+ -webkit-box-pack: center;
2404
+ -ms-flex-pack: center;
2405
+ justify-content: center;
2406
+ }
2407
+
2408
+ .wizard-section .wizard-content .wizard .actions ul li {
2409
+ margin-left: 0 !important;
2410
+ margin-right: 25px;
2411
  }
2412
 
2413
  .wizard-section .wizard-content .wizard .actions ul li a.next-step, .wizard-section .wizard-content .wizard .actions ul li a.prev-step {
2414
+ background: #2D62ED;
2415
+ min-width: 100px;
2416
+ font-weight: 700;
2417
+ color: #FFFFFF;
2418
+ border: 1px solid #2D62ED;
2419
+ border-radius: 500px;
2420
  }
2421
 
2422
  .wizard-section .wizard-content .wizard .actions ul li a.next-step:hover, .wizard-section .wizard-content .wizard .actions ul li a.prev-step:hover {
2423
+ background-color: #1248d5 !important;
2424
+ border-color: #1248d5 !important;
2425
+ color: #FFFFFF;
2426
+ }
2427
+
2428
+ .wizard-section .wizard-content .wizard .actions ul li a.prev-step {
2429
+ background-color: #F2F2F2;
2430
+ border-color: #F2F2F2;
2431
+ color: #25283D;
2432
+ }
2433
+
2434
+ .wizard-section .wizard-content .wizard .actions ul li a.prev-step:hover {
2435
+ background-color: #d9d9d9 !important;
2436
+ border-color: #d9d9d9 !important;
2437
+ color: #25283D;
2438
  }
2439
 
2440
  .wizard-section .wizard-content .wizard .actions ul li.disabled {
2441
+ display: none;
2442
+ }
2443
+
2444
+ .wizard-section .wizard-content .wizard .content {
2445
+ background-color: #FFFFFF;
2446
+ border-radius: 15px;
2447
+ -ms-box-shadow: 0 0 10px #00000029;
2448
+ -webkit-box-shadow: 0 0 10px #00000029;
2449
+ box-shadow: 0 0 10px #00000029;
2450
+ padding: 30px 30px 90px 30px;
2451
  }
2452
 
2453
  .creating-account {
2454
+ margin-bottom: 1rem;
 
2455
  }
2456
 
2457
  .creating-account li {
2458
+ position: relative;
2459
+ margin-bottom: 5px;
2460
+ color: #5E5E5E;
2461
+ }
2462
+
2463
+ .information {
2464
+ width: 20px;
2465
+ height: 20px;
2466
+ line-height: 20px;
2467
+ background-color: #5CB16D;
2468
+ border-radius: 50%;
2469
+ display: inline-block;
2470
+ color: #FFFFFF;
2471
+ text-align: center;
2472
+ font-size: 12px;
2473
+ position: relative;
2474
+ z-index: 2;
2475
+ }
2476
+
2477
+ .advance-settings {
2478
+ display: inline-block;
2479
+ position: relative;
2480
+ margin-left: 5px;
2481
+ }
2482
+
2483
+ .advance-settings .setting-icon {
2484
+ width: 20px;
2485
+ height: 20px;
2486
+ line-height: 16px;
2487
+ border: 1px solid #2D62ED;
2488
+ border-radius: 50%;
2489
+ display: block;
2490
+ color: #FFFFFF;
2491
+ text-align: center;
2492
+ font-size: 18px;
2493
+ color: #2D62ED;
2494
+ font-weight: 700;
2495
  }
2496
 
2497
+ .advance-settings .dropdown-menu {
2498
+ background-color: #F7F7F7;
2499
+ min-width: 27rem;
2500
+ border-radius: 15px;
2501
+ border: 0;
2502
+ padding: 15px;
2503
  }
 
2504
 
2505
+ .advance-settings .dropdown-menu .form-group {
2506
+ margin-bottom: 5px;
2507
  }
2508
 
2509
+ .configuration-section .card {
2510
+ padding: 0px !important;
 
 
 
 
 
2511
  }
2512
 
2513
+ .container {
2514
+ max-width: 100% !important;
2515
+ margin: 0px !important;
 
 
 
 
2516
  }
2517
 
2518
+ .custom-thresold-label{
2519
+ font-size: 14px;
2520
+ color: #5E5E5E;
2521
  }
2522
 
2523
+ .right-content .pagination .page-item .page-link img{
2524
+ width: 100%;
2525
+ height: 100%;
2526
+ }
2527
 
2528
+ /*# sourceMappingURL=style.css.map */
2529
  #feed-spinner {
2530
  /* height: 50px; */
2531
  left: 0;
2540
  background: rgba(255,255,255,0.65);
2541
  bottom: 0;
2542
  right: 0;
 
 
 
2543
  }
2544
  #feed-spinner img {
2545
  position: absolute;
2548
  transform: translate(-50%,-50%);
2549
  }
2550
 
2551
+ /* slick slider */
2552
+ .slick-slider{
2553
+ position: relative;
2554
+ display: block;
2555
+ box-sizing: border-box;
2556
+ -webkit-user-select: none;
2557
+ -moz-user-select: none;
2558
+ -ms-user-select: none;
2559
+ user-select: none;
2560
+
2561
+ -webkit-touch-callout: none;
2562
+ -khtml-user-select: none;
2563
+ -ms-touch-action: pan-y;
2564
+ touch-action: pan-y;
2565
+ -webkit-tap-highlight-color: transparent;
2566
+ }
2567
+
2568
+ .slick-list{
2569
+ position: relative;
2570
+
2571
+ display: block;
2572
+ overflow: hidden;
2573
+
2574
+ margin: 0;
2575
+ padding: 0;
2576
+ }
2577
+ .slick-list:focus{
2578
+ outline: none;
2579
+ }
2580
+ .slick-list.dragging{
2581
+ cursor: pointer;
2582
+ cursor: hand;
2583
+ }
2584
+
2585
+ .slick-slider .slick-track, .slick-slider .slick-list{
2586
+ -webkit-transform: translate3d(0, 0, 0);
2587
+ -moz-transform: translate3d(0, 0, 0);
2588
+ -ms-transform: translate3d(0, 0, 0);
2589
+ -o-transform: translate3d(0, 0, 0);
2590
+ transform: translate3d(0, 0, 0);
2591
+ }
2592
+
2593
+ .slick-track{
2594
+ position: relative;
2595
+ top: 0;
2596
+ left: 0;
2597
+
2598
+ display: block;
2599
+ margin-left: auto;
2600
+ margin-right: auto;
2601
+ }
2602
+ .slick-track:before, .slick-track:after{
2603
+ display: table;
2604
+
2605
+ content: '';
2606
+ }
2607
+ .slick-track:after{
2608
+ clear: both;
2609
+ }
2610
+ .slick-loading .slick-track{
2611
+ visibility: hidden;
2612
+ }
2613
+
2614
+ .slick-slide{
2615
+ display: none;
2616
+ float: left;
2617
+
2618
+ height: 100%;
2619
+ min-height: 1px;
2620
+ }
2621
+ [dir='rtl'] .slick-slide{
2622
+ float: right;
2623
+ }
2624
+ .slick-slide img{
2625
+ display: block;
2626
+ }
2627
+ .slick-slide.slick-loading img{
2628
+ display: none;
2629
+ }
2630
+ .slick-slide.dragging img{
2631
+ pointer-events: none;
2632
+ }
2633
+ .slick-initialized .slick-slide{
2634
+ display: block;
2635
+ }
2636
+ .slick-loading .slick-slide{
2637
+ visibility: hidden;
2638
+ }
2639
+ .slick-vertical .slick-slide{
2640
+ display: block;
2641
+ height: auto;
2642
+ border: 1px solid transparent;
2643
+ }
2644
+ .slick-arrow.slick-hidden {
2645
+ display: none;
2646
+ }
2647
+ .tvc-hide{
2648
+ display: none;
2649
+ }
2650
+ .tvc_licence_key_change_wapper{height: 40px;}
2651
+ .tvc_licence_key_change{cursor: pointer;}
2652
+ .tvc_licence_key_change_wapper.google-account-analytics .acc-num{text-align: left; min-width: 100%; border: 1.3px solid #b4b9be; display: table;
2653
  height: 100%;
2654
+ vertical-align: middle;
2655
+ background: #f4f4f4; border-radius: 20px; padding: 5px 15px;}
2656
+ .tvc_licence_key_change_wapper.google-account-analytics .acc-num .tvc_licence_key_change{display: table-cell; vertical-align: middle;}
2657
+ .tvc_licence_key_change_wapper.google-account-analytics .acc-num .tvc_licence_key{display: table-cell; letter-spacing: 8px;
2658
+ font-size: 15px; width: calc(100% - 110px); vertical-align: middle; font-weight: 400;}
2659
+ .tvc_licence_key_change_wapper.google-account-analytics .acc-num .tvc_licence_key_title{vertical-align: middle; display: table-cell;}
admin/css/dataTables.bootstrap4.min.css ADDED
@@ -0,0 +1 @@
 
1
+ table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important;border-spacing:0}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:auto;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:.85em}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap;justify-content:flex-end}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable>thead>tr>th:active,table.dataTable>thead>tr>td:active{outline:none}table.dataTable>thead>tr>th:not(.sorting_disabled),table.dataTable>thead>tr>td:not(.sorting_disabled){padding-right:30px}table.dataTable>thead .sorting,table.dataTable>thead .sorting_asc,table.dataTable>thead .sorting_desc,table.dataTable>thead .sorting_asc_disabled,table.dataTable>thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable>thead .sorting:before,table.dataTable>thead .sorting:after,table.dataTable>thead .sorting_asc:before,table.dataTable>thead .sorting_asc:after,table.dataTable>thead .sorting_desc:before,table.dataTable>thead .sorting_desc:after,table.dataTable>thead .sorting_asc_disabled:before,table.dataTable>thead .sorting_asc_disabled:after,table.dataTable>thead .sorting_desc_disabled:before,table.dataTable>thead .sorting_desc_disabled:after{position:absolute;bottom:.9em;display:block;opacity:.3}table.dataTable>thead .sorting:before,table.dataTable>thead .sorting_asc:before,table.dataTable>thead .sorting_desc:before,table.dataTable>thead .sorting_asc_disabled:before,table.dataTable>thead .sorting_desc_disabled:before{right:1em;content:"↑"}table.dataTable>thead .sorting:after,table.dataTable>thead .sorting_asc:after,table.dataTable>thead .sorting_desc:after,table.dataTable>thead .sorting_asc_disabled:after,table.dataTable>thead .sorting_desc_disabled:after{right:.5em;content:"↓"}table.dataTable>thead .sorting_asc:before,table.dataTable>thead .sorting_desc:after{opacity:1}table.dataTable>thead .sorting_asc_disabled:before,table.dataTable>thead .sorting_desc_disabled:after{opacity:0}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody table thead .sorting:before,div.dataTables_scrollBody table thead .sorting_asc:before,div.dataTables_scrollBody table thead .sorting_desc:before,div.dataTables_scrollBody table thead .sorting:after,div.dataTables_scrollBody table thead .sorting_asc:after,div.dataTables_scrollBody table thead .sorting_desc:after{display:none}div.dataTables_scrollBody table tbody tr:first-child th,div.dataTables_scrollBody table tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot>.dataTables_scrollFootInner{box-sizing:content-box}div.dataTables_scrollFoot>.dataTables_scrollFootInner>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:center !important}}table.dataTable.table-sm>thead>tr>th:not(.sorting_disabled){padding-right:20px}table.dataTable.table-sm .sorting:before,table.dataTable.table-sm .sorting_asc:before,table.dataTable.table-sm .sorting_desc:before{top:5px;right:.85em}table.dataTable.table-sm .sorting:after,table.dataTable.table-sm .sorting_asc:after,table.dataTable.table-sm .sorting_desc:after{top:5px}table.table-bordered.dataTable{border-right-width:0}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:1px}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:last-child{padding-right:0}
admin/css/enhanced-ecommerce-google-analytics-admin.css CHANGED
@@ -11,30 +11,7 @@
11
  body{
12
  background: #f1f1f1 !important;
13
  }
14
- .tvc_plugin_container{
15
- font-family: 'Lato', sans-serif;
16
- font-size: 16px;
17
- }
18
- .tvc_plugin_container .tvc_plugin_sidebar, .tvc_plugin_container .right-content ol li{
19
- font-size: 14px;
20
- }
21
- .tvc_plugin_container .right-content p, .tvc_plugin_container .right-content ol{
22
- margin-bottom: 0.5rem;
23
- }
24
- .nav-link.active{
25
- color: #fff !important;
26
- background-color: #2D73C5 !important;
27
- }
28
- a.aga-tab{
29
- color:#4A4A4A !important;
30
- line-height: 2em;
31
- }
32
- .table td{
33
- vertical-align: middle !important;
34
- }
35
- td{
36
- width:8%;
37
- }
38
  .popover{
39
  max-width:500px !important;
40
  }
@@ -54,9 +31,7 @@ input[type=checkbox]{
54
  -ms-transition: all 1.5s ease;
55
  transition: all 1.5s ease;
56
  }
57
- .align-middle{
58
- font-size: 15px;
59
- }
60
  input[type=checkbox]:checked::before {
61
  height:16px;
62
  width:16px;
@@ -68,35 +43,7 @@ input[type=checkbox]:checked::before {
68
  h5{
69
  margin-top: 5px;
70
  }
71
- @media only screen and (min-width: 1200px){
72
- .container{
73
- margin-left: 8% !important;
74
- width:auto;
75
- }
76
- .banner{
77
- width:100%;
78
- }
79
- .banner-new {
80
- background: #253574;
81
- margin-left: 10px;
82
- padding: 10px;
83
- }
84
- .banner-new p {
85
- color: #fff;
86
- text-align: center;
87
- font-size: 20px;
88
- margin-bottom: 0;
89
- }
90
- .banner-new a {color: #fff;}
91
- .clickhere-txt {vertical-align: middle;display: grid;}
92
- .clickhere-txt a{font-size: 12px;text-decoration: underline;}
93
- }
94
- @media only screen and (min-width: 1920px){
95
- .container{
96
- margin-left: 6% !important;
97
- width:auto;
98
- }
99
- }
100
  .try-btn{
101
  width: auto;
102
  border: black;
@@ -154,44 +101,21 @@ h5{
154
  }
155
  .ee-oauth-container{
156
  display: inline-block;
157
- width: 50%;
158
  max-width: 100%;
159
  padding: 5px;
160
  border: 1px solid #bfbfbf;
161
- height: 45px;
162
- border-radius: 5px;
163
  background-color: #fff;
164
  }
165
  .left {
166
  float: left;
167
  }
168
  /* checkbox admin*/
169
- .wizard-section .wizard-content .wizard .actions ul li a.next-step, .wizard-section .wizard-content .wizard .actions ul li a.prev-step{
170
- color: #fff !important;
171
- background-color: #1e7e34 !important;
172
- border-color: #1c7430;
173
- cursor: pointer;
174
- text-decoration: none;
175
- display: inline-block;
176
- font-weight: 400;
177
- color: #212529;
178
- text-align: center;
179
- vertical-align: middle;
180
- -webkit-user-select: none;
181
- -moz-user-select: none;
182
- -ms-user-select: none;
183
- user-select: none;
184
- background-color: transparent;
185
- border: 1px solid transparent;
186
- padding: .375rem .75rem;
187
- font-size: 1rem;
188
- line-height: 1.5;
189
- border-radius: .25rem;
190
- transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;
191
- }
192
 
193
  .tvc_ee_plugin_form .align-middle{margin: 0 auto;}
194
- .tvc_ee_plugin_form .align-middle label, label.tvc-custom-control-input{margin: 0 auto; font-size: 15px;}
195
  .tvc_ee_plugin_form [type="checkbox"]:not(:checked),
196
  .tvc_ee_plugin_form [type="checkbox"]:checked {
197
  position: absolute;
@@ -210,6 +134,8 @@ h5{
210
  position: relative;
211
  padding-left: 22px;
212
  cursor: pointer;
 
 
213
  }
214
 
215
  .tvc_ee_plugin_form [type="checkbox"]:not(:checked)+label:before,
@@ -218,8 +144,8 @@ h5{
218
  position: absolute;
219
  left: 0;
220
  top: 2px;
221
- width: 16px;
222
- height: 16px;
223
  background: #fff;
224
  border-radius: 3px;
225
  box-shadow: inset 0 1px 3px rgba(0, 0, 0, .1);
@@ -237,7 +163,7 @@ h5{
237
  position: absolute;
238
  top: 4px;
239
  left: 2px;
240
- font-size: 14px;
241
  font-weight: bold;
242
  line-height: 0.8;
243
  color: #fff;
@@ -254,25 +180,14 @@ h5{
254
  opacity: 1;
255
  transform: scale(1);
256
  }
257
- /* Admin nav menu item config-success */
258
- .nav-tabs .nav-link.active a{color: #fff; text-decoration: none; }
259
- .nav-tabs .nav-link a{text-decoration: none; max-height: 15px; display: inline-block;}
260
- .nav-tabs .nav-link.active {
261
- z-index: 9;
262
- border-radius: 0;
263
- }
264
-
265
- .nav-tabs .nav-link{text-align: center;
266
- padding: .8rem 0; width: 160px; z-index: 9; border: none;}
267
 
268
- img.config-success, .nav-tabs li img.config-success, .nav-tabs li img.config-fail{
269
- width: 16px;
270
- margin: 3px;
271
- margin-top: 0px;
272
  }
273
  .configuration-section img.config-success, .configuration-section img.config-fail {
274
  width: 16px;
275
- margin-left: 5px;
276
  margin-top: 1px;
277
  }
278
  .tvc-tooltip {
@@ -287,19 +202,20 @@ img.config-success, .nav-tabs li img.config-success, .nav-tabs li img.config-fai
287
  z-index: 999;
288
  }
289
  .tvc-tooltip .tvc-tooltiptext {
 
 
290
  visibility: hidden;
291
  position: absolute;
292
  min-width: 400px;
293
- background-color: #2D73C5;
294
- border:1px solid #2D73C5;
295
  color: #fff;
296
  text-align: left;
297
- padding: 8px;
298
- border-radius: 6px;
299
- z-index: 999;
300
-
301
  transition: opacity .6s;
302
  cursor: auto;
 
303
  }
304
  .tvc-tooltip .tvc-tooltiptext a{
305
  color: #fff;
@@ -315,33 +231,35 @@ img.config-success, .nav-tabs li img.config-success, .nav-tabs li img.config-fai
315
  left: 98%;
316
  }
317
  .configuration-section .tvc-tooltip-right{
318
- top: -4px;
319
  left: 102%;
320
  }
321
  .tvc-tooltip.active .tvc-tooltip-right {
322
- top: -2px;
323
  left: 103%;
324
  }
 
 
 
 
325
  .tvc-tooltip-right::after {
326
  content: "";
327
  position: absolute;
328
- top: 50%;
329
  right: 100%;
 
330
  margin-top: -5px;
331
  border-width: 5px;
332
  border-style: solid;
333
- border-color: transparent #2D73C5 transparent transparent;
334
  }
335
- .tvc-tooltip-top::after {
336
- content: "";
337
- position: absolute;
338
- top: 100%;
339
- left: 50%;
340
- margin-left: -5px;
341
- border-width: 5px;
342
- border-style: solid;
343
- border-color: #555 transparent transparent transparent;
344
  }
 
 
 
345
  #ee_plugin_form .align-middle{position: relative;}
346
 
347
 
@@ -432,23 +350,12 @@ button.tvc_animate_btn:hover::after, button.tvc_animate_btn:focus::after {
432
  line-height: 22px;
433
  min-height: 30px;
434
  }
435
- .tvc_plugin_container ul.nav-tabs{
436
- margin-top: 20px;
437
- background-color: #fff;
438
- position: relative;
439
- }
440
  .wp-core-ui .notice.is-dismissible {
441
  padding: 0 1.4rem 0 1rem;
442
- margin: 0.5rem 1.25rem 0;
443
- }
444
- #googleShoppingFeed .card{
445
- padding: 0.7rem;
446
  }
447
- #googleShoppingFeed .card .card-body{ padding: 5px;}
448
- .gsf-sec .card .card-footer{padding: 5px !important;}
449
- #googleShoppingFeed .card .card-header{padding: 15px 5px;}
450
- #googleShoppingFeed .card .card-header .confg-title{font-size: 15px;}
451
- .tvc_plugin_container .modal-dialog{ max-width: 650px;}
452
  .change_prodct_feed_cat {text-decoration: underline; transition: all ease 0.5s; color: #03a2b7; margin-left: 10px; cursor: pointer;}
453
  .config-head-active a{ color: #fff !important;}
454
  #staticBackdrop .modal-body, #tvc_google_connect .modal-body{padding: 2rem;}
@@ -498,9 +405,11 @@ button.tvc_animate_btn:hover::after, button.tvc_animate_btn:focus::after {
498
  color: #1e7e34;
499
  }
500
  .tvc-api-sunc{
501
- margin-bottom: 20px;
502
  text-align: right;
503
  }
 
 
 
504
  .tvc-api-sunc span{
505
  color: #03a2b7;
506
  font-weight: 700;
@@ -510,22 +419,6 @@ button.tvc_animate_btn:hover::after, button.tvc_animate_btn:focus::after {
510
  0% { transform: rotate(0deg); }
511
  100% { transform: rotate(360deg); }
512
  }
513
- .tvc-menu-free-plan{ position: absolute;
514
- right: 35px;
515
- top: 11px;}
516
- .tvc-menu-free-plan span {
517
- color: #03a2b7;
518
- font-size: 14px;
519
- font-weight: 700;
520
- padding: 7px 16px;
521
- height: 100% !important;
522
- vertical-align: middle;
523
- border-radius: 25px;
524
- background-color: #EEEEEE;
525
- border-color: #d1d1d1;
526
- background-clip: border-box;
527
- border: 1px solid rgba(0,0,0,.125);
528
- }
529
 
530
  /* popup */
531
  .popup-modal.overlay {
@@ -543,19 +436,14 @@ button.tvc_animate_btn:hover::after, button.tvc_animate_btn:focus::after {
543
  }
544
  .popup-modal .modal-dialog .modal-content{
545
  margin: 20px auto;
546
- padding: 20px;
547
- background: #fff;
548
- border-radius: 5px;
549
- position: relative;
550
- transition: all 5s ease-in-out;
551
- border: none;}
552
  .popup-modal .modal-dialog .modal-content .close{
553
  position: absolute;
554
  top: 0px;
555
  right: 10px;
556
  transition: all 200ms;
557
  font-size: 30px;
558
- font-weight: bold;
559
  text-decoration: none;
560
  }
561
  .popup-modal .tvc-text{
@@ -563,6 +451,7 @@ button.tvc_animate_btn:hover::after, button.tvc_animate_btn:focus::after {
563
  max-width: 25rem;
564
  width: 100%;
565
  font-size: 14px;
 
566
  }
567
  #feed-spinner img{width: 60px;}
568
  /* Popup box BEGIN */
@@ -644,19 +533,20 @@ button.tvc_animate_btn:hover::after, button.tvc_animate_btn:focus::after {
644
  .tvc-notice-error .call_both_verification-spinner{
645
  right: 5px;top: 10px;margin-left: 0;
646
  }
647
- .product-auto-sync-details table { border-collapse: collapse;
 
648
  border-spacing: 0;
649
  width: 100%; border-color: grey; margin-top: 5px;}
650
 
651
- .product-auto-sync-details table tr {
652
  display: table-row;
653
  vertical-align: inherit;
654
  border-color: inherit;
655
  }
656
- .product-auto-sync-details table tr th {
657
  padding-top: 11px;
658
  padding-bottom: 11px;
659
- background-color: #28a745;
660
  color: white;
661
  border: 1px solid #ddd;
662
  text-align: left;
@@ -664,15 +554,114 @@ button.tvc_animate_btn:hover::after, button.tvc_animate_btn:focus::after {
664
  display: table-cell;
665
  vertical-align: inherit;
666
  font-weight: bold;
667
- text-align: center;
668
- font-size: 15px;
669
  }
670
- .product-auto-sync-details table tr td {
671
  display: table-cell;
672
  vertical-align: inherit;
673
  border: 1px solid #ddd;
674
  text-align: left;
675
  padding: 8px 3px;
676
- text-align: center;
677
- font-size: 15px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
678
  }
11
  body{
12
  background: #f1f1f1 !important;
13
  }
14
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  .popover{
16
  max-width:500px !important;
17
  }
31
  -ms-transition: all 1.5s ease;
32
  transition: all 1.5s ease;
33
  }
34
+
 
 
35
  input[type=checkbox]:checked::before {
36
  height:16px;
37
  width:16px;
43
  h5{
44
  margin-top: 5px;
45
  }
46
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  .try-btn{
48
  width: auto;
49
  border: black;
101
  }
102
  .ee-oauth-container{
103
  display: inline-block;
104
+ width: 200px;
105
  max-width: 100%;
106
  padding: 5px;
107
  border: 1px solid #bfbfbf;
108
+ height: 40px;
109
+ border-radius: 30px;
110
  background-color: #fff;
111
  }
112
  .left {
113
  float: left;
114
  }
115
  /* checkbox admin*/
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
 
117
  .tvc_ee_plugin_form .align-middle{margin: 0 auto;}
118
+ /*.tvc_ee_plugin_form .align-middle label, label.tvc-custom-control-input{margin: 0 auto; font-size: 15px;} */
119
  .tvc_ee_plugin_form [type="checkbox"]:not(:checked),
120
  .tvc_ee_plugin_form [type="checkbox"]:checked {
121
  position: absolute;
134
  position: relative;
135
  padding-left: 22px;
136
  cursor: pointer;
137
+ color: #5E5E5E;
138
+ font-size: 14px;
139
  }
140
 
141
  .tvc_ee_plugin_form [type="checkbox"]:not(:checked)+label:before,
144
  position: absolute;
145
  left: 0;
146
  top: 2px;
147
+ width: 15px;
148
+ height: 15px;
149
  background: #fff;
150
  border-radius: 3px;
151
  box-shadow: inset 0 1px 3px rgba(0, 0, 0, .1);
163
  position: absolute;
164
  top: 4px;
165
  left: 2px;
166
+ font-size: 13px;
167
  font-weight: bold;
168
  line-height: 0.8;
169
  color: #fff;
180
  opacity: 1;
181
  transform: scale(1);
182
  }
183
+ #ee_plugin_form table th{padding: .75em 0; }
 
 
 
 
 
 
 
 
 
184
 
185
+ img.config-success, .nav-tabs li img.config-success, img.config-fail ,.nav-tabs li img.config-fail{
186
+ width: 14px; margin-right: 2px;
 
 
187
  }
188
  .configuration-section img.config-success, .configuration-section img.config-fail {
189
  width: 16px;
190
+ margin-left: 3px;
191
  margin-top: 1px;
192
  }
193
  .tvc-tooltip {
202
  z-index: 999;
203
  }
204
  .tvc-tooltip .tvc-tooltiptext {
205
+ font-weight: normal;
206
+ font-size: 14px;
207
  visibility: hidden;
208
  position: absolute;
209
  min-width: 400px;
210
+ background-color: #000338;
 
211
  color: #fff;
212
  text-align: left;
213
+ padding: 5px 6px;
214
+ border-radius: 15px 50px 30px 5px;
215
+ z-index: 999;
 
216
  transition: opacity .6s;
217
  cursor: auto;
218
+
219
  }
220
  .tvc-tooltip .tvc-tooltiptext a{
221
  color: #fff;
231
  left: 98%;
232
  }
233
  .configuration-section .tvc-tooltip-right{
234
+ top: -32px;
235
  left: 102%;
236
  }
237
  .tvc-tooltip.active .tvc-tooltip-right {
238
+ top: -32px;
239
  left: 103%;
240
  }
241
+ .edit-tabs li:last-child .tvc-tooltip-right {
242
+ top: -32px;
243
+ left: 100%;
244
+ }
245
  .tvc-tooltip-right::after {
246
  content: "";
247
  position: absolute;
248
+ top: 83%;
249
  right: 100%;
250
+
251
  margin-top: -5px;
252
  border-width: 5px;
253
  border-style: solid;
254
+ border-color: transparent #000338 transparent transparent;
255
  }
256
+ #syncProduct.popup-modal .tvc-tooltip{ position: absolute;
257
+ display: inline-block;
258
+ width: auto; top: -5px; margin-left: 2px;
 
 
 
 
 
 
259
  }
260
+ #syncProduct.popup-modal .tvc-tooltip .tvc-tooltip-right{ bottom: 6px;
261
+ left: 125%; min-width: 285px; top: auto;}
262
+
263
  #ee_plugin_form .align-middle{position: relative;}
264
 
265
 
350
  line-height: 22px;
351
  min-height: 30px;
352
  }
353
+
 
 
 
 
354
  .wp-core-ui .notice.is-dismissible {
355
  padding: 0 1.4rem 0 1rem;
356
+ margin: 10px 14px 0 2px;
 
 
 
357
  }
358
+ .tvc_plugin_container .modal-dialog{ max-width: 700px;}
 
 
 
 
359
  .change_prodct_feed_cat {text-decoration: underline; transition: all ease 0.5s; color: #03a2b7; margin-left: 10px; cursor: pointer;}
360
  .config-head-active a{ color: #fff !important;}
361
  #staticBackdrop .modal-body, #tvc_google_connect .modal-body{padding: 2rem;}
405
  color: #1e7e34;
406
  }
407
  .tvc-api-sunc{
 
408
  text-align: right;
409
  }
410
+ #googleShoppingFeed .tvc-api-sunc{
411
+ margin-bottom: 5px;
412
+ }
413
  .tvc-api-sunc span{
414
  color: #03a2b7;
415
  font-weight: 700;
419
  0% { transform: rotate(0deg); }
420
  100% { transform: rotate(360deg); }
421
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
422
 
423
  /* popup */
424
  .popup-modal.overlay {
436
  }
437
  .popup-modal .modal-dialog .modal-content{
438
  margin: 20px auto;
439
+ }
 
 
 
 
 
440
  .popup-modal .modal-dialog .modal-content .close{
441
  position: absolute;
442
  top: 0px;
443
  right: 10px;
444
  transition: all 200ms;
445
  font-size: 30px;
446
+
447
  text-decoration: none;
448
  }
449
  .popup-modal .tvc-text{
451
  max-width: 25rem;
452
  width: 100%;
453
  font-size: 14px;
454
+ border-radius: 15px;
455
  }
456
  #feed-spinner img{width: 60px;}
457
  /* Popup box BEGIN */
533
  .tvc-notice-error .call_both_verification-spinner{
534
  right: 5px;top: 10px;margin-left: 0;
535
  }
536
+
537
+ .tvc-table table, .product-auto-sync-details table { border-collapse: collapse;
538
  border-spacing: 0;
539
  width: 100%; border-color: grey; margin-top: 5px;}
540
 
541
+ .tvc-table table tr, .product-auto-sync-details table tr {
542
  display: table-row;
543
  vertical-align: inherit;
544
  border-color: inherit;
545
  }
546
+ .tvc-table table tr th, .product-auto-sync-details table tr th {
547
  padding-top: 11px;
548
  padding-bottom: 11px;
549
+ background-color: #000338;
550
  color: white;
551
  border: 1px solid #ddd;
552
  text-align: left;
554
  display: table-cell;
555
  vertical-align: inherit;
556
  font-weight: bold;
557
+ text-align: center;
 
558
  }
559
+ .tvc-table table tr td, .product-auto-sync-details table tr td {
560
  display: table-cell;
561
  vertical-align: inherit;
562
  border: 1px solid #ddd;
563
  text-align: left;
564
  padding: 8px 3px;
565
+ text-align: center;
566
+ }
567
+ #tvc-account-page .tvc-table table tr th{padding: 14px; width: 25%;
568
+ text-align: left;
569
+ }
570
+ #tvc-account-page .tvc-table{margin-top:30px; }
571
+ #productSync .shop-category{text-align: right;}
572
+
573
+ .tvc_plugin_container .notice, div.error, div.updated {margin: 0;}
574
+ .select2-container--default .select2-selection--single .select2-selection__arrow b{top: 35%; border: solid #2f3d4a !important; border-width: 0 2px 2px 0 !important;}
575
+ .tvc-notification{position: relative;}
576
+ .tvc-notification-dropdown-menu{
577
+ width: 420px;
578
+ right: 0;
579
+ left: auto;
580
+ background: #F1F1F1;
581
+
582
+ }
583
+ .tvc-notification .tvc-msg.plain{ position: relative;
584
+ color: #757575;
585
+ background: #fff;
586
+ border-radius: 2px;
587
+ font-size: 13px;
588
+ font-size: .8125rem;
589
+ margin: 7px; padding: 0px 10px;}
590
+ /*.tvc-notification li:last-child .tvc-msg.plain,*/
591
+ .tvc-notification li:last-child{margin-bottom: 0;}
592
+ .tvc-notification .tvc-msg_title{color: #1e1e1e;
593
+ font-size: 16px;
594
+ font-size: 1rem;
595
+ font-style: normal;
596
+ line-height: 1.5;
597
+ font-weight: 700;
598
+ margin: 3px 0;}
599
+ .tvc-notification .tvc-dropdown{display: inline;}
600
+ .tvc-notification .tvc-msg_content {padding: 10px 0;}
601
+ .tvc-notification .tvc-msg_actions{border-top: 1px solid #e0e0e0; padding: 10px 0;}
602
+ .tvc-notification .tvc-notification-button{display: inline-flex; border-radius: 15px; text-decoration: none; align-items: center; border: 0; padding: 6px 12px;}
603
+ .tvc-notification .tvc-notification-button.is-tertiary{ white-space: nowrap; color: #007cba; background: transparent; outline: 1px solid transparent;}
604
+ .tvc-notification .tvc-notification-button.is-secondary{
605
+ box-shadow: inset 0 0 0 1px #007cba;
606
+ outline: 1px solid transparent;}
607
+ .tvc-notification .dropdown-menu{padding: 0; margin-top: 10px; border: 0.5px solid #A9A9A9;}
608
+ .tvc-notification .dropdown-menu:before {
609
+ content: "";
610
+ position: absolute;
611
+ top: 0;
612
+ right: 0;
613
+ width: 0;
614
+ height: 0;
615
+ transform: translate(-1rem, -100%);
616
+ border-left: 0.75rem solid transparent;
617
+ border-right: 0.75rem solid transparent;
618
+ border-bottom: 0.75rem solid #A9A9A9;
619
+ }
620
+ #sync-product #tvc-sync-product-list_wrapper{padding: 10px 0;}
621
+ #sync-product table.dataTable{margin-top: 0px !important;}
622
+ #tvc-sync-product-list_paginate{ margin-top: 10px;}
623
+ /*#sync-product table tbody{display: table-caption;}*/
624
+ .tvc-help-slider .slick-slide::-webkit-scrollbar-track, .tvc-b-value-slider .slick-slide::-webkit-scrollbar-track, #sync-product .dataTables_scrollBody::-webkit-scrollbar-track {
625
+ -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
626
+ background-color: #F5F5F5;
627
+ border-radius: 10px;
628
+ }
629
+
630
+ .tvc-help-slider .slick-slide::-webkit-scrollbar, .tvc-b-value-slider .slick-slide::-webkit-scrollbar, #sync-product .dataTables_scrollBody::-webkit-scrollbar {
631
+ width: 8px;
632
+ background-color: #F5F5F5;
633
+ }
634
+
635
+ .tvc-help-slider .slick-slide::-webkit-scrollbar-thumb, .tvc-b-value-slider .slick-slide::-webkit-scrollbar-thumb, #sync-product .dataTables_scrollBody::-webkit-scrollbar-thumb {
636
+ background-color: #777;
637
+ border-radius: 10px;
638
+ }
639
+ #sync-product .dataTables_length label{margin: 0;}
640
+ #sync-product div.dataTables_filter input{border-radius: 15px;}
641
+ .tvc-licence .input-group .form-control{height: 40px; letter-spacing: 8px; font-size: 18px;}
642
+ button#ee_submit_plugin, button#google-add{ min-width: 80px;}
643
+ .ga-text span{font-weight:normal;}
644
+ .tvc-help-slider, .tvc-b-value-slider{
645
+ height: 120px;
646
+ padding: 0;
647
+ }
648
+ .slick-slide{
649
+ overflow-y: auto;
650
+ height: 120px;
651
+ }
652
+ .tvc-footer-links{text-align: center;}
653
+ .tvc-footer-links a{text-decoration: underline; margin-left: 5px; margin-right: 5px;}
654
+ .right-content .content-section .slick-slide img{display: inline-block;
655
+ margin: 0 3px;}
656
+ ul.nav.nav-pills.nav-justified{position: relative;}
657
+ .tvc-help-need{position: absolute; right: 15px; bottom: 15px;}
658
+ .tvc_plugin_container .container{ padding-left: 2px;}
659
+ .tvc_plugin_container{margin-top: 10px;}
660
+
661
+ img{
662
+ image-rendering: -moz-crisp-edges;
663
+ image-rendering: -o-crisp-edges;
664
+ image-rendering: -webkit-optimize-contrast;
665
+ image-rendering: crisp-edges;
666
+ -ms-interpolation-mode: nearest-neighbor;
667
  }
admin/images/banner.png DELETED
Binary file
admin/images/cotlw.gif DELETED
Binary file
admin/images/icon/add.svg ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.com/svgjs" version="1.1" width="14.907" height="14.907" x="0" y="0" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512" xml:space="preserve" class=""><g transform="matrix(1,0,0,1,0,0)">
3
+ <linearGradient xmlns="http://www.w3.org/2000/svg" id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="0" y1="258" x2="512" y2="512" gradientTransform="matrix(1 0 0 -1 0 514)"><stop stop-opacity="1" stop-color="#42445a" offset="0"/><stop stop-opacity="1" stop-color="#0872fc" offset="1"/></linearGradient>
4
+ <path xmlns="http://www.w3.org/2000/svg" style="fill:url(#SVGID_1_);" d="M512,256c0,141.503-114.517,256-256,256C114.497,512,0,397.483,0,256c0-11.046,8.954-20,20-20 s20,8.954,20,20c0,119.392,96.622,216,216,216c119.392,0,216-96.622,216-216c0-119.392-96.622-216-216-216c-11.046,0-20-8.954-20-20 s8.954-20,20-20C397.503,0,512,114.517,512,256z M160.406,61.8l25.869-10.716c10.204-4.228,15.051-15.927,10.823-26.132 s-15.926-15.054-26.132-10.823l-25.869,10.716c-10.204,4.228-15.051,15.927-10.823,26.132 C138.488,61.148,150.168,66.038,160.406,61.8z M93.366,113.165l19.799-19.799c7.811-7.811,7.811-20.475,0-28.285 s-20.475-7.811-28.285,0L65.081,84.88c-7.811,7.811-7.811,20.475,0,28.285C72.89,120.974,85.555,120.976,93.366,113.165z M24.952,197.099c10.227,4.236,21.914-0.642,26.132-10.823l10.716-25.87c4.228-10.205-0.619-21.904-10.823-26.132 c-10.207-4.227-21.904,0.619-26.132,10.823l-10.716,25.869C9.901,181.172,14.748,192.871,24.952,197.099z M256,156 c-11.046,0-20,8.954-20,20v60h-60c-11.046,0-20,8.954-20,20c0,11.046,8.954,20,20,20h60v60c0,11.046,8.954,20,20,20 c11.046,0,20-8.954,20-20v-60h60c11.046,0,20-8.954,20-20s-8.954-20-20-20h-60v-60C276,164.954,267.046,156,256,156z" fill=""/>
5
+ <g xmlns="http://www.w3.org/2000/svg">
6
+ </g>
7
+ <g xmlns="http://www.w3.org/2000/svg">
8
+ </g>
9
+ <g xmlns="http://www.w3.org/2000/svg">
10
+ </g>
11
+ <g xmlns="http://www.w3.org/2000/svg">
12
+ </g>
13
+ <g xmlns="http://www.w3.org/2000/svg">
14
+ </g>
15
+ <g xmlns="http://www.w3.org/2000/svg">
16
+ </g>
17
+ <g xmlns="http://www.w3.org/2000/svg">
18
+ </g>
19
+ <g xmlns="http://www.w3.org/2000/svg">
20
+ </g>
21
+ <g xmlns="http://www.w3.org/2000/svg">
22
+ </g>
23
+ <g xmlns="http://www.w3.org/2000/svg">
24
+ </g>
25
+ <g xmlns="http://www.w3.org/2000/svg">
26
+ </g>
27
+ <g xmlns="http://www.w3.org/2000/svg">
28
+ </g>
29
+ <g xmlns="http://www.w3.org/2000/svg">
30
+ </g>
31
+ <g xmlns="http://www.w3.org/2000/svg">
32
+ </g>
33
+ <g xmlns="http://www.w3.org/2000/svg">
34
+ </g>
35
+ </g></svg>
admin/images/icon/arrow-down-sign-to-navigate.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="10.915" height="6.222" viewBox="0 0 10.915 6.222"><defs><style>.a{fill:#25283d;}</style></defs><g transform="translate(-0.001 -97.141)"><path class="a" d="M5.458,103.362a.762.762,0,0,1-.54-.224L.225,98.445a.764.764,0,0,1,1.081-1.081l4.153,4.153,4.153-4.153a.764.764,0,1,1,1.081,1.081L6,103.139A.762.762,0,0,1,5.458,103.362Z" transform="translate(0 0)"/></g></svg>
admin/images/icon/information.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" viewBox="0 0 25 25"><defs><style>.a{fill:#25283d;}</style></defs><circle class="a" cx="1.221" cy="1.221" r="1.221" transform="translate(11.279 17.261)"/><path class="a" d="M12.5,0A12.5,12.5,0,1,0,25,12.5,12.493,12.493,0,0,0,12.5,0Zm0,23.047A10.547,10.547,0,1,1,23.047,12.5,10.541,10.541,0,0,1,12.5,23.047Z"/><path class="a" d="M179.906,128.5A3.911,3.911,0,0,0,176,132.406a.977.977,0,0,0,1.953,0,1.953,1.953,0,1,1,1.953,1.953.977.977,0,0,0-.977.977v2.441a.977.977,0,0,0,1.953,0v-1.588a3.907,3.907,0,0,0-.977-7.689Z" transform="translate(-167.406 -122.226)"/></svg>
admin/images/icon/informationI.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="13.164" height="13.164" viewBox="0 0 13.164 13.164"><defs><style>.a{fill:#5e5e5e;}</style></defs><path class="a" d="M6.582,0a6.582,6.582,0,1,0,6.582,6.582A6.59,6.59,0,0,0,6.582,0Zm0,11.967a5.385,5.385,0,1,1,5.385-5.385A5.391,5.391,0,0,1,6.582,11.967Z"/><path class="a" d="M145.8,70a.8.8,0,1,0,.8.8A.8.8,0,0,0,145.8,70Z" transform="translate(-139.218 -67.208)"/><path class="a" d="M150.6,140a.6.6,0,0,0-.6.6v3.59a.6.6,0,1,0,1.2,0V140.6A.6.6,0,0,0,150.6,140Z" transform="translate(-144.016 -134.415)"/></svg>
admin/images/icon/lamp.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="31.266" height="31.266" viewBox="0 0 31.266 31.266"><defs><style>.a{fill:#25283d;stroke:#25283d;stroke-width:0.5px;}</style></defs><g transform="translate(0.25 0.25)"><g transform="translate(6.41 6.41)"><path class="a" d="M15.9,29.357H12.051a2.081,2.081,0,0,1-1.923-2.307V24.357a4.452,4.452,0,0,0-1.666-3.333A8.861,8.861,0,0,1,5,13.845,9.123,9.123,0,0,1,13.845,5a9.009,9.009,0,0,1,6.41,2.564,9.126,9.126,0,0,1,2.692,6.41A8.621,8.621,0,0,1,19.614,20.9a4.681,4.681,0,0,0-1.795,3.589v2.948A1.972,1.972,0,0,1,15.9,29.357ZM13.973,6.282a7.862,7.862,0,0,0-7.692,7.563A7.535,7.535,0,0,0,9.23,20a5.586,5.586,0,0,1,2.179,4.359v2.692c0,.256,0,1.026.641,1.026H15.9a.606.606,0,0,0,.641-.641V24.485a6.23,6.23,0,0,1,2.307-4.615,7.475,7.475,0,0,0,2.82-5.9,7.663,7.663,0,0,0-2.307-5.512,7.556,7.556,0,0,0-5.384-2.179Z" transform="translate(-5 -5)"/></g><g transform="translate(11.537 25.638)"><path class="a" d="M16.051,21.282H9.641a.641.641,0,1,1,0-1.282h6.41a.641.641,0,1,1,0,1.282Z" transform="translate(-9 -20)"/></g><g transform="translate(14.742)"><path class="a" d="M12.141,3.846A.606.606,0,0,1,11.5,3.2V.641a.641.641,0,0,1,1.282,0V3.2A.606.606,0,0,1,12.141,3.846Z" transform="translate(-11.5)"/></g><g transform="translate(23.267 4.423)"><path class="a" d="M18.855,6.463a.771.771,0,0,1-.513-.128.62.62,0,0,1,0-.9l1.795-1.795a.635.635,0,0,1,.9.9L19.24,6.334A1.291,1.291,0,0,1,18.855,6.463Z" transform="translate(-18.15 -3.45)"/></g><g transform="translate(26.92 14.742)"><path class="a" d="M24.2,12.782H21.641a.641.641,0,0,1,0-1.282H24.2a.641.641,0,1,1,0,1.282Z" transform="translate(-21 -11.5)"/></g><g transform="translate(23.267 23.395)"><path class="a" d="M20.65,21.263a.771.771,0,0,1-.513-.128L18.342,19.34a.635.635,0,0,1,.9-.9l1.795,1.795a.62.62,0,0,1,0,.9c0,.128-.128.128-.385.128Z" transform="translate(-18.15 -18.25)"/></g><g transform="translate(4.294 23.395)"><path class="a" d="M4.055,21.263a.771.771,0,0,1-.513-.128.62.62,0,0,1,0-.9l1.795-1.795a.635.635,0,1,1,.9.9L4.44,21.134a.471.471,0,0,1-.385.128Z" transform="translate(-3.35 -18.25)"/></g><g transform="translate(0 14.742)"><path class="a" d="M3.2,12.782H.641a.641.641,0,0,1,0-1.282H3.2a.641.641,0,0,1,0,1.282Z" transform="translate(0 -11.5)"/></g><g transform="translate(4.294 4.294)"><path class="a" d="M5.85,6.491a.771.771,0,0,1-.513-.128L3.542,4.44a.635.635,0,0,1,.9-.9L6.234,5.337a.62.62,0,0,1,0,.9c-.128.128-.256.256-.385.256Z" transform="translate(-3.35 -3.35)"/></g><g transform="translate(14.742 9.614)"><path class="a" d="M17.269,13.91a.606.606,0,0,1-.641-.641,4.542,4.542,0,0,0-4.487-4.487.641.641,0,0,1,0-1.282,5.745,5.745,0,0,1,5.769,5.769A.606.606,0,0,1,17.269,13.91Z" transform="translate(-11.5 -7.5)"/></g></g></svg>
admin/images/icon/left-angle-arrow.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="6.929" height="11.029" viewBox="0 0 6.929 11.029"><defs><style>.a{fill:none;stroke:#5e5e5e;stroke-linecap:round;stroke-width:2px;}</style></defs><g transform="translate(1.414 1.414)"><g transform="translate(0 4.1)"><line class="a" x1="4.1" y1="4.1"/></g><line class="a" x1="4.1" y2="4.1" transform="translate(0)"/></g></svg>
admin/images/icon/notification.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="19.459" height="22.14" viewBox="0 0 19.459 22.14"><g transform="translate(-30.999)"><path d="M47.431,11.367V9.3a6.714,6.714,0,0,0-4.757-6.414V1.946a1.946,1.946,0,0,0-3.892,0v.937A6.714,6.714,0,0,0,34.026,9.3v2.07a10.185,10.185,0,0,1-2.846,7.081.649.649,0,0,0,.468,1.1h5.9a3.243,3.243,0,0,0,6.356,0h5.9a.649.649,0,0,0,.468-1.1A10.185,10.185,0,0,1,47.431,11.367ZM40.08,1.946a.649.649,0,0,1,1.3,0v.68c-.213-.021-.43-.031-.649-.031s-.435.011-.649.031Zm.649,18.9a1.949,1.949,0,0,1-1.834-1.3h3.669A1.949,1.949,0,0,1,40.728,20.843Zm-7.683-2.595a11.468,11.468,0,0,0,2.278-6.881V9.3a5.405,5.405,0,0,1,10.811,0v2.07a11.468,11.468,0,0,0,2.278,6.881Z"/></g></svg>
admin/images/icon/refresh.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="14.907" height="14.907" viewBox="0 0 14.907 14.907"><defs><style>.a{fill:#0872fc;}</style></defs><g transform="translate(0 0)"><path class="a" d="M1.79,8.141a5.9,5.9,0,0,1-.044-.687,5.683,5.683,0,0,1,9.535-4.2l-.5.512a.447.447,0,0,0-.114.437A.457.457,0,0,0,11,4.5c.088.018,2.976.948,2.792.911a.442.442,0,0,0,.515-.515c-.018-.088-.657-3.3-.62-3.112a.433.433,0,0,0-.734-.218l-.428.419A7.458,7.458,0,0,0,0,7.453v.017c0,.246.011.436.024.582a.437.437,0,0,0,.349.389l.9.179a.437.437,0,0,0,.519-.48Zm0,0"/><path class="a" d="M34.385,215.613l-.9-.183a.437.437,0,0,0-.521.481,5.945,5.945,0,0,1,.045.692,5.676,5.676,0,0,1-9.535,4.193l.5-.5a.447.447,0,0,0,.114-.437.457.457,0,0,0-.332-.3c-.088-.018-2.976-.948-2.792-.911a.428.428,0,0,0-.393.122.435.435,0,0,0-.122.393l.62,3.083a.437.437,0,0,0,.306.332.42.42,0,0,0,.428-.113l.419-.419A7.442,7.442,0,0,0,34.757,216.6v-.026c0-.194-.007-.384-.023-.572a.437.437,0,0,0-.348-.39Zm0,0" transform="translate(-19.85 -209.149)"/></g></svg>
admin/images/icon/right-arrow.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="21.717" height="18.067" viewBox="0 0 21.717 18.067"><defs><style>.a{fill:#fff;}</style></defs><g transform="translate(1.507 -40.092)"><g transform="translate(-1.507 40.092)"><path class="a" d="M21.37,49.536l-7.843-7.843a1.192,1.192,0,0,0-1.681,0l-.712.712a1.18,1.18,0,0,0-.347.84,1.2,1.2,0,0,0,.347.85l4.575,4.585H1.173A1.16,1.16,0,0,0,0,49.85v1.007a1.2,1.2,0,0,0,1.173,1.22H15.761l-4.627,4.611a1.177,1.177,0,0,0,0,1.669l.712.71a1.192,1.192,0,0,0,1.681,0l7.843-7.843a1.2,1.2,0,0,0,0-1.687Z" transform="translate(0 -41.346)"/></g></g></svg>
admin/images/icon/tick-round.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="41" height="41" viewBox="0 0 41 41"><defs><style>.a{fill:#66bb6a;}.b{fill:#fff;stroke:#fff;}</style></defs><g transform="translate(-1199 -247)"><circle class="a" cx="20.5" cy="20.5" r="20.5" transform="translate(1199 247)"/><g transform="translate(1205.572 257.288)"><g transform="translate(0 0)"><path class="b" d="M26.263,68.388a1.333,1.333,0,0,0-1.885,0L8.412,84.355,2.275,78.217A1.333,1.333,0,1,0,.39,80.1l7.08,7.08a1.333,1.333,0,0,0,1.885,0L26.263,70.273A1.333,1.333,0,0,0,26.263,68.388Z" transform="translate(0 -67.997)"/></g></g></g></svg>
admin/images/icon/undraw_update_uxn2.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="248.265" height="151.87" viewBox="0 0 248.265 151.87"><defs><style>.a,.j{fill:#0872fc;}.a,.b,.f,.g{opacity:0.1;}.b,.e{fill:#03d7fd;}.c{fill:url(#a);}.d{fill:#fbbebe;}.h{fill:#3f3d56;}.i{fill:#ff007c;}.k{fill:#434175;}</style><linearGradient id="a" x1="27.757" y1="1" x2="27.757" y2="0.003" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="gray" stop-opacity="0.251"/><stop offset="0.54" stop-color="gray" stop-opacity="0.122"/><stop offset="1" stop-color="gray" stop-opacity="0.102"/></linearGradient></defs><path class="a" d="M642.879,316.847a6.872,6.872,0,0,0-3.988.435,5.876,5.876,0,0,1-4.811-.021,6.72,6.72,0,0,0-5.631.109,3.481,3.481,0,0,1-1.622.407c-2.283,0-4.183-2.3-4.578-5.334a4.42,4.42,0,0,0,1.141-1.232,6.412,6.412,0,0,1,11.448-.038,4.406,4.406,0,0,0,3.8,2.083h.06C640.527,313.265,642.1,314.723,642.879,316.847Z" transform="translate(-492.827 -265.582)"/><path class="b" d="M649.869,280.2l-3.691,2.342,2.24-4.076a3.662,3.662,0,0,0-2.233-.8h-.059a4.317,4.317,0,0,1-.766-.055l-1.246.792.537-.975a4.442,4.442,0,0,1-2.188-1.665l-2.24,1.427,1.427-2.571a6.556,6.556,0,0,0-5.015-2.537,6.877,6.877,0,0,0-5.74,3.543,4.28,4.28,0,0,1-3.8,2.045h-.126c-2.571,0-4.654,2.915-4.654,6.509s2.083,6.509,4.654,6.509a3.5,3.5,0,0,0,1.622-.4,6.711,6.711,0,0,1,5.631-.112,5.876,5.876,0,0,0,4.789.012,6.727,6.727,0,0,1,5.584.107,3.484,3.484,0,0,0,1.6.4c2.571,0,4.654-2.913,4.654-6.509a8.266,8.266,0,0,0-.977-3.983Z" transform="translate(-492.872 -238.462)"/><path class="c" d="M568.4,302.824c.145-.021.29-.05.433-.086a1.362,1.362,0,0,1-.121.414,1.781,1.781,0,0,1-.675.594.207.207,0,0,0-.262-.017c-.307.181-.552.447-.877.6-.114.057-.238.1-.345.164a1.887,1.887,0,0,0-.642.668.476.476,0,0,0-.076.476.385.385,0,0,0,.131.117.759.759,0,0,0,.452.136,1.693,1.693,0,0,0,.285-.059c.1-.017.257,0,.385-.024a2.167,2.167,0,0,0,.542-.14l.635-.221a3.492,3.492,0,0,0,.526-.216c.1-.052.195-.117.3-.166a2.352,2.352,0,0,1,.357-.126l.361-.107a.388.388,0,0,1,.164-.021c.05,0,.093.04.143.055a.426.426,0,0,0,.238-.021l.421-.121a.792.792,0,0,0,.25-.1.766.766,0,0,0,.224-.644,4.888,4.888,0,0,0-.124-1.068.338.338,0,0,0-.135.1c-.043-.062-.093-.119-.138-.174a2.065,2.065,0,0,1-.419-.77,1.378,1.378,0,0,0,.376-.419,9.2,9.2,0,0,0-.9-2.449c-.147-.238-.316-.476-.476-.713-.438-.694-.528-1.572-1.027-2.221a.385.385,0,0,1,0-.454c.057-.074.15-.147.131-.238s-.081-.131-.055-.193.043-.048.069-.071c.083-.078.074-.214.081-.331a1.632,1.632,0,0,1,.364-.792.459.459,0,0,1,.133-.145c.045-.029.1-.04.143-.069.162-.1.15-.335.226-.509.1-.238.352-.347.518-.533.209-.238.262-.568.476-.775a.593.593,0,0,1,.071-.059,3.784,3.784,0,0,0-.128,1.084c-.021,1.253.288,2.552.143,3.8a2.623,2.623,0,0,0,1.344,2.466,6.42,6.42,0,0,0,1.046.445c.537.193,1.07.39,1.6.609q.556.238,1.1.5a14.107,14.107,0,0,1,1.3.725,5,5,0,0,1,1.4,1.16,1.119,1.119,0,0,0,.618-.238c.14.112.312.2.445.319a1.356,1.356,0,0,1,.35.692h-.055l.019.371a.157.157,0,0,1-.014.093.183.183,0,0,1-.05.045l-.285.193c-.207.14-.435.316-.447.568a.283.283,0,0,0,.062.2.44.44,0,0,0,.254.114,4.44,4.44,0,0,0,1.508.138.989.989,0,0,0,.642-.295,1.265,1.265,0,0,0,.238-.616c.062-.373.114-.749.155-1.127a2.473,2.473,0,0,1,.152-.747.088.088,0,0,1,.04-.05h.069a.1.1,0,0,0,.045-.071,4.565,4.565,0,0,0,.133-1.12.784.784,0,0,0-.045-.288.575.575,0,0,0-.4-.307,3.062,3.062,0,0,0-.511-.059,2.322,2.322,0,0,1-.426-.081.409.409,0,0,0-.176-.021.126.126,0,0,0-.109.124.143.143,0,0,0,.024.059l-.145-.029c-.117-.021-.283-.074-.454-.114v-.09a.178.178,0,0,0-.1-.159l-2.447-1.308-.459-.238c-1-.537-2.04-1.032-3.044-1.569-.069.021-.124-.057-.143-.124s-.033-.152-.1-.181-.074-.017-.1-.043a.1.1,0,0,1-.017-.081c.033-.49.383-.939.312-1.427a1.723,1.723,0,0,1-.088-.614,2.517,2.517,0,0,1,.186-.388c.119-.3,0-.656.131-.951a2.234,2.234,0,0,0,.178-.6,4.136,4.136,0,0,1,.373-1.189,2.117,2.117,0,0,1,.345-.526c.074-.081.157-.152.226-.238a1.929,1.929,0,0,0,.352-.92,4.421,4.421,0,0,0,.05-1.8,2.551,2.551,0,0,1-.114-.606c0-.238.1-.528-.021-.725a.635.635,0,0,0,.238-.4.457.457,0,0,1,.033-.162.419.419,0,0,1,.155-.14.644.644,0,0,0,.238-.637c.126.057.259-.071.319-.2s.107-.283.238-.335a1.824,1.824,0,0,1,.278-.04c.147-.038.238-.181.342-.292a2.615,2.615,0,0,1,.787-.487,8.736,8.736,0,0,0,2.14-1.729,7.267,7.267,0,0,0,.923-1.044,3.372,3.372,0,0,0,.2-.335h.017v.019a.461.461,0,0,0,.033.121c.029.1.064.193.1.288a2.1,2.1,0,0,0,.411.785,1.047,1.047,0,0,0,.093.083.957.957,0,0,0,.119.081,1.465,1.465,0,0,0,.545.164c.071,0,.145.014.219.017h.219l1.5.04a4.324,4.324,0,0,1-.521-2.63c.086-2.335.54-4.692.119-6.989a1.82,1.82,0,0,0-.288-.78,1.612,1.612,0,0,0-.951-.516,5.736,5.736,0,0,1-1.061-.271,4.39,4.39,0,0,0-.835-.4,1.845,1.845,0,0,0-.666,0c-.271.04-.54.088-.809.143l-.064.014h-.321l-.026.012-.024.012-.024.012-.024.012-.024.014-.021.014-.021.014-.021.017-.019.014-.021.019-.017.014-.021.021-.014.017a.112.112,0,0,0-.021.026v.014l-.026.038h0a.681.681,0,0,0-.052.112.516.516,0,0,0-.017.057,1.088,1.088,0,0,0-.021.121v.185a.753.753,0,0,0,.021.207,2.259,2.259,0,0,0-.107,3.822,1.034,1.034,0,0,1,0,.112v.024a3.04,3.04,0,0,1-.041.39,5.318,5.318,0,0,0-1.115-.1c-.224,0-.447.019-.673.038-.238-.285-.457-.6-.671-.908l-.495-.725a7.313,7.313,0,0,1-.476-.744c-.121-.238-.216-.476-.35-.713-.278-.476-.735-.87-.79-1.415l-.131.029c-.071-.119-.162-.238-.2-.309a6.034,6.034,0,0,1-.411-1.208,1.868,1.868,0,0,0-.2-.625,1.4,1.4,0,0,0-.288-.3,1.9,1.9,0,0,0-.618-.39.794.794,0,0,0-.63.036c-.033-.012-.064-.026-.1-.036a.766.766,0,0,0-.7.081.951.951,0,0,0-.309.649,1.61,1.61,0,0,0,.167.984,3.918,3.918,0,0,0,.792.82,3.2,3.2,0,0,1,.5.618,6.753,6.753,0,0,1-.038,1.5c-.036.214-.09.423-.109.637-.069.778.335,1.555.193,2.321a.561.561,0,0,0,.261.6,2.981,2.981,0,0,0,.678.185c.447.114.837.4,1.286.509.209.05.426.059.633.114h.033a1.505,1.505,0,0,0-.333.633c-.09.39,0,.806-.1,1.189a2.708,2.708,0,0,1-.454.873L573,282.461a10.15,10.15,0,0,1-.8,1.053c-.5.545-1.363.977-1.615,1.634l-.021-.048c-.359.264-.492.756-.78,1.1-.138.167-.311.3-.464.454a5.1,5.1,0,0,0-.5.749,11.421,11.421,0,0,0-1.161,1.848c-.159.345-.283.713-.409,1.061a40.155,40.155,0,0,0-1.65,4.195,7.866,7.866,0,0,0-.333,1.039,2.021,2.021,0,0,0,.326,1.1c.281.523.587,1.032.837,1.569.147.314.273.637.435.951s.395.642.578.973A11.2,11.2,0,0,1,568.4,302.824Zm6.131-26.56-.043-.021a1.521,1.521,0,0,1-.452-.3,3.5,3.5,0,0,1-.694-1.643c-.014-.067-.029-.136-.04-.2A9.719,9.719,0,0,1,574.532,276.264Z" transform="translate(-449.389 -236.199)"/><path class="d" d="M589.722,271.382a1.843,1.843,0,0,0-.2-.621,1.408,1.408,0,0,0-.29-.3,1.9,1.9,0,0,0-.618-.385.771.771,0,0,0-.713.081.937.937,0,0,0-.309.644,1.592,1.592,0,0,0,.167.977,4.079,4.079,0,0,0,.792.816,3.094,3.094,0,0,1,.518.644,1.8,1.8,0,0,0,.238.345.445.445,0,0,0,.373.147.644.644,0,0,0,.3-.178c.112-.1.416-.276.426-.433s-.238-.414-.288-.533A6.013,6.013,0,0,1,589.722,271.382Z" transform="translate(-466.399 -236.884)"/><path class="e" d="M600.4,287.294a5.43,5.43,0,0,0-1.5-.185,7.832,7.832,0,0,1-2.518-.043,4.365,4.365,0,0,1-.6-.262,1.55,1.55,0,0,1-.449-.295,3.444,3.444,0,0,1-.7-1.631,10.651,10.651,0,0,1-.19-1.736,1.365,1.365,0,0,1-.659.174.476.476,0,0,1-.459-.426,7.08,7.08,0,0,1-.031,1.617c-.036.212-.09.419-.109.633-.069.77.338,1.543.193,2.3a.556.556,0,0,0,.262.595,2.965,2.965,0,0,0,.68.185c.447.114.839.4,1.289.5.209.05.426.059.633.114.3.078.566.238.868.3.226.04.459.012.69.031s.395.069.592.076a1.722,1.722,0,0,0,1.277-.633,5.491,5.491,0,0,0,.735-1.325Z" transform="translate(-470.667 -246.694)"/><path class="f" d="M600.4,287.294a5.43,5.43,0,0,0-1.5-.185,7.832,7.832,0,0,1-2.518-.043,4.365,4.365,0,0,1-.6-.262,1.55,1.55,0,0,1-.449-.295,3.444,3.444,0,0,1-.7-1.631,10.651,10.651,0,0,1-.19-1.736,1.365,1.365,0,0,1-.659.174.476.476,0,0,1-.459-.426,7.08,7.08,0,0,1-.031,1.617c-.036.212-.09.419-.109.633-.069.77.338,1.543.193,2.3a.556.556,0,0,0,.262.595,2.965,2.965,0,0,0,.68.185c.447.114.839.4,1.289.5.209.05.426.059.633.114.3.078.566.238.868.3.226.04.459.012.69.031s.395.069.592.076a1.722,1.722,0,0,0,1.277-.633,5.491,5.491,0,0,0,.735-1.325Z" transform="translate(-470.667 -246.694)"/><g class="g" transform="translate(72.29 32.622)"><path class="h" d="M454.239,652.08V653.3a4.59,4.59,0,0,1-9.179,0V652.08a4.59,4.59,0,1,1,9.179,0Z" transform="translate(-430.062 -557.213)"/><path class="h" d="M445.06,565.8V564.58a4.59,4.59,0,1,1,9.179,0V565.8a4.537,4.537,0,0,1-.2,1.327,4.587,4.587,0,0,1-8.982-1.327Z" transform="translate(-430.062 -490.521)"/><path class="h" d="M454.239,608.29v1.225a4.59,4.59,0,0,1-9.179,0V608.29a4.59,4.59,0,1,1,9.179,0Z" transform="translate(-430.062 -523.837)"/><path class="h" d="M449.65,691.24a4.6,4.6,0,0,1,4.59,4.592v1.222a4.59,4.59,0,0,1-9.179,0v-1.222A4.6,4.6,0,0,1,449.65,691.24Z" transform="translate(-430.062 -590.56)"/><path class="f" d="M445.06,579.78v1.106a4.587,4.587,0,0,0,8.982,1.325Z" transform="translate(-430.062 -505.605)"/><path class="f" d="M445.06,623.53v1.108a4.59,4.59,0,0,0,8.982,1.327Z" transform="translate(-430.062 -538.951)"/><path class="f" d="M445.06,667.29V668.4a4.59,4.59,0,0,0,8.982,1.327Z" transform="translate(-430.062 -572.305)"/><path class="f" d="M445.06,711v1.106a4.587,4.587,0,0,0,8.982,1.327Z" transform="translate(-430.062 -605.621)"/><path class="h" d="M402.6,618.582l.366.281a1.734,1.734,0,0,0,2.468-2.378,1.693,1.693,0,0,0-.35-.366l-.366-.276a1.734,1.734,0,0,0-2.119,2.747Z" transform="translate(-397.182 -532.816)"/><path class="h" d="M417.8,625.9l.366.283a1.734,1.734,0,0,1-2.119,2.747l-.366-.283A1.734,1.734,0,0,1,417.8,625.9Z" transform="translate(-407.159 -540.484)"/><path class="h" d="M430.885,636l.366.283a1.734,1.734,0,0,1-2.119,2.747l-.366-.283A1.734,1.734,0,0,1,430.885,636Z" transform="translate(-417.129 -548.182)"/><path class="h" d="M443.96,646.1l.366.283a1.734,1.734,0,1,1-2.119,2.747l-.371-.283a1.734,1.734,0,0,1,2.119-2.747Z" transform="translate(-427.091 -555.88)"/><path class="f" d="M404.9,621.824l.333.254A1.734,1.734,0,0,0,407.7,619.7Z" transform="translate(-399.453 -536.032)"/><path class="f" d="M418,631.924l.333.254A1.734,1.734,0,0,0,420.8,629.8Z" transform="translate(-409.437 -543.73)"/><path class="f" d="M431.08,642.024l.331.255a1.734,1.734,0,0,0,2.471-2.378Z" transform="translate(-419.407 -551.428)"/><path class="e" d="M394.487,296.627a5.2,5.2,0,1,0,0,10.4,5.2,5.2,0,1,0,0,10.4,5.2,5.2,0,1,0,0,10.406,5.2,5.2,0,1,0,0,10.4H419.58a5.2,5.2,0,1,0,0-10.405,5.2,5.2,0,1,0,0-10.406,5.2,5.2,0,1,0,0-10.4,5.2,5.2,0,1,0,0-10.4,5.2,5.2,0,1,0,0-10.406,5.2,5.2,0,1,0,0-10.4h-1.146c-.659-4.475-5.707-7.957-11.859-7.957s-11.2,3.481-11.859,7.957h-.238a5.2,5.2,0,1,0,0,10.4,5.2,5.2,0,1,0,0,10.406Z" transform="translate(-387.446 -267.86)"/><path class="f" d="M389.72,306.521a5.217,5.217,0,0,0,5.2,5.2h25.093l-24.941-10.4h-.152A5.217,5.217,0,0,0,389.72,306.521Z" transform="translate(-387.882 -293.363)"/><path class="f" d="M441.286,350.323a5.232,5.232,0,0,1-5.2,5.2H411l24.943-10.406h.152a5.232,5.232,0,0,1,5.191,5.2Z" transform="translate(-404.102 -326.747)"/><path class="f" d="M441.286,437.783a5.217,5.217,0,0,1-5.2,5.2H411l24.943-10.4h.152A5.217,5.217,0,0,1,441.286,437.783Z" transform="translate(-404.102 -393.409)"/><path class="f" d="M441.286,525.323a5.217,5.217,0,0,1-5.2,5.2H411l24.943-10.4h.152A5.217,5.217,0,0,1,441.286,525.323Z" transform="translate(-404.102 -460.132)"/><path class="f" d="M389.72,394.031a5.217,5.217,0,0,0,5.2,5.2h25.093l-24.941-10.4h-.152A5.217,5.217,0,0,0,389.72,394.031Z" transform="translate(-387.882 -360.063)"/><path class="f" d="M389.72,481.533a5.232,5.232,0,0,0,5.2,5.2h25.093L395.075,476.33h-.152A5.232,5.232,0,0,0,389.72,481.533Z" transform="translate(-387.882 -426.756)"/><path class="e" d="M386.705,611.7l8.264-4.449a4.342,4.342,0,0,1-1.053-6.057,1.945,1.945,0,0,0-2.635-.792l-.378.2c-1.011-1.358-3.294-1.608-5.317-.518s-3.07,3.132-2.495,4.723l-.074.04a4.353,4.353,0,0,1,1.052,6.063,1.946,1.946,0,0,0,2.636.791Z" transform="translate(-381.992 -520.564)"/><path class="f" d="M382.264,621.653a1.952,1.952,0,0,0,2.635.792L393.155,618,383.1,619l-.05.026A1.952,1.952,0,0,0,382.264,621.653Z" transform="translate(-382.024 -534.736)"/><path class="f" d="M410.653,618.145a1.95,1.95,0,0,1-.79,2.635l-8.264,4.449,6.368-7.847.05-.029A1.952,1.952,0,0,1,410.653,618.145Z" transform="translate(-396.937 -534.068)"/></g><g class="g" transform="translate(44.938 111.481)"><path class="h" d="M287.7,709.428v.35a1.317,1.317,0,0,1-2.632,0v-.35a1.317,1.317,0,1,1,2.632,0Z" transform="translate(-280.763 -682.235)"/><path class="h" d="M285.07,685.049V684.7a1.317,1.317,0,0,1,2.632,0v.352a1.273,1.273,0,0,1-.057.38,1.315,1.315,0,0,1-2.575-.38Z" transform="translate(-280.767 -663.471)"/><path class="h" d="M287.7,696.888v.35a1.317,1.317,0,0,1-2.632,0v-.35a1.317,1.317,0,1,1,2.632,0Z" transform="translate(-280.763 -672.677)"/><path class="h" d="M286.384,720.83a1.32,1.32,0,0,1,1.315,1.317v.35a1.317,1.317,0,1,1-2.632,0v-.35A1.32,1.32,0,0,1,286.384,720.83Z" transform="translate(-280.763 -691.973)"/><path class="f" d="M285.07,688.89v.316a1.315,1.315,0,0,0,2.575.381Z" transform="translate(-280.767 -667.628)"/><path class="f" d="M285.07,701.43v.316a1.315,1.315,0,0,0,2.575.38Z" transform="translate(-280.767 -677.186)"/><path class="f" d="M285.07,714v.316a1.315,1.315,0,0,0,2.575.38Z" transform="translate(-280.767 -686.767)"/><path class="f" d="M285.07,726.51v.316a1.315,1.315,0,0,0,2.575.38Z" transform="translate(-280.767 -696.302)"/><path class="h" d="M272.916,699.994l.1.083a.5.5,0,0,0,.713-.683.477.477,0,0,0-.1-.107l-.1-.081a.5.5,0,1,0-.609.787Z" transform="translate(-271.359 -675.412)"/><path class="h" d="M277.26,702.107l.1.081a.5.5,0,1,1-.606.787l-.107-.081a.5.5,0,0,1,.609-.787Z" transform="translate(-274.202 -677.622)"/><path class="h" d="M281.051,705.026l.1.081a.5.5,0,1,1-.606.787l-.1-.081a.5.5,0,0,1,.606-.787Z" transform="translate(-277.102 -679.855)"/><path class="h" d="M284.8,707.926l.1.081a.5.5,0,1,1-.606.787l-.1-.081a.5.5,0,0,1,.606-.787Z" transform="translate(-279.96 -682.065)"/><path class="f" d="M273.56,700.939l.1.074a.5.5,0,0,0,.713-.682Z" transform="translate(-271.994 -676.348)"/><path class="f" d="M277.32,703.829l.1.074a.5.5,0,0,0,.713-.682Z" transform="translate(-274.86 -678.551)"/><path class="f" d="M281.07,706.721l.1.071a.5.5,0,0,0,.7-.088.5.5,0,0,0,0-.594Z" transform="translate(-277.718 -680.753)"/><path class="e" d="M270.7,607.725a3.391,3.391,0,0,1-1.434,4.474,1.492,1.492,0,0,1-.057,2.983,1.491,1.491,0,1,1,0,2.982,1.491,1.491,0,0,0,1.491,1.491h7.193a3.334,3.334,0,0,1,1.491-4.473,1.492,1.492,0,0,1-.057-2.983,1.492,1.492,0,0,1,.057-2.983,1.491,1.491,0,0,1,0-2.982,1.491,1.491,0,1,1,0-2.982,1.491,1.491,0,0,0-1.491-1.491h-.328c-.19-1.282-1.638-2.28-3.4-2.28s-3.21,1-3.4,2.28H270.7a3.334,3.334,0,0,1-1.491,4.473A1.491,1.491,0,0,0,270.7,607.725Z" transform="translate(-268.678 -599.48)"/><path class="f" d="M269.21,610.561a1.5,1.5,0,0,0,1.491,1.491h7.193l-7.148-2.982H270.7a1.5,1.5,0,0,0-1.491,1.491Z" transform="translate(-268.678 -606.79)"/><path class="f" d="M283.984,623.1a1.5,1.5,0,0,1-1.491,1.491H275.3l7.148-2.982h.045A1.5,1.5,0,0,1,283.984,623.1Z" transform="translate(-273.32 -616.347)"/><path class="f" d="M283.984,648.213a1.5,1.5,0,0,1-1.491,1.491H275.3l7.148-2.984h.045a1.5,1.5,0,0,1,1.491,1.493Z" transform="translate(-273.32 -635.486)"/><path class="f" d="M283.984,673.271a1.5,1.5,0,0,1-1.491,1.491H275.3l7.148-2.982h.045a1.5,1.5,0,0,1,1.491,1.491Z" transform="translate(-273.32 -654.587)"/><path class="f" d="M269.21,635.641a1.5,1.5,0,0,0,1.491,1.491h7.193l-7.148-2.982H270.7a1.5,1.5,0,0,0-1.491,1.491Z" transform="translate(-268.678 -625.905)"/><path class="f" d="M269.21,660.731a1.5,1.5,0,0,0,1.491,1.491h7.193l-7.148-2.982H270.7A1.5,1.5,0,0,0,269.21,660.731Z" transform="translate(-268.678 -645.029)"/><path class="i" d="M269.25,698.031l2.378-1.277a1.241,1.241,0,0,1-.3-1.736.556.556,0,0,0-.756-.226l-.107.057a1.373,1.373,0,0,0-2.238,1.206l-.021.012a1.241,1.241,0,0,1,.3,1.736A.559.559,0,0,0,269.25,698.031Z" transform="translate(-267.893 -671.909)"/><path class="f" d="M267.047,700.917a.559.559,0,0,0,.756.238l2.378-1.275-2.894.266h-.014a.559.559,0,0,0-.226.77Z" transform="translate(-266.974 -676.005)"/><path class="f" d="M275.184,699.889a.561.561,0,0,1-.226.756l-2.378,1.275,1.824-2.25h.014a.561.561,0,0,1,.766.219Z" transform="translate(-271.247 -675.791)"/></g><g class="g" transform="translate(163.649 9.046)"><path class="h" d="M834.26,637.065v1.491a5.6,5.6,0,0,0,11.191,0v-1.491a5.6,5.6,0,0,0-11.191,0Z" transform="translate(-818.07 -521.427)"/><path class="h" d="M845.451,531.886V530.4a5.6,5.6,0,0,0-11.191,0v1.491a5.5,5.5,0,0,0,.238,1.617,5.593,5.593,0,0,0,10.939-1.617Z" transform="translate(-818.07 -440.124)"/><path class="h" d="M834.26,583.725v1.493a5.6,5.6,0,1,0,11.191,0v-1.493a5.6,5.6,0,1,0-11.191,0Z" transform="translate(-818.07 -480.772)"/><path class="h" d="M839.855,684.8a5.612,5.612,0,0,0-5.6,5.6v1.491a5.6,5.6,0,0,0,11.191,0V690.4A5.61,5.61,0,0,0,839.855,684.8Z" transform="translate(-818.07 -562.075)"/><path class="f" d="M846.259,548.93v1.348A5.593,5.593,0,0,1,835.32,551.9Z" transform="translate(-818.878 -458.516)"/><path class="f" d="M846.259,602.27v1.348a5.593,5.593,0,0,1-10.939,1.617Z" transform="translate(-818.878 -499.171)"/><path class="f" d="M846.259,655.6v1.348a5.593,5.593,0,0,1-10.939,1.617Z" transform="translate(-818.878 -539.819)"/><path class="f" d="M846.259,708.93v1.348A5.593,5.593,0,0,1,835.32,711.9Z" transform="translate(-818.878 -580.467)"/><path class="h" d="M918.1,596.2l-.447.345a2.114,2.114,0,0,1-3.011-2.9,2.044,2.044,0,0,1,.428-.445l.447-.345A2.114,2.114,0,0,1,918.1,596.2Z" transform="translate(-879.04 -491.655)"/><path class="h" d="M899.425,605.144l-.445.34a2.114,2.114,0,1,0,2.583,3.346l.445-.342a2.114,2.114,0,0,0-2.583-3.348Z" transform="translate(-866.738 -501.022)"/><path class="h" d="M883.467,617.469l-.447.345a2.114,2.114,0,1,0,2.583,3.346l.447-.342a2.114,2.114,0,1,0-2.583-3.348Z" transform="translate(-854.573 -510.42)"/><path class="h" d="M867.656,629.666l-.445.342a2.114,2.114,0,1,0,2.583,3.348l.445-.345a2.114,2.114,0,1,0-2.583-3.346Z" transform="translate(-842.558 -519.69)"/><path class="f" d="M918.062,600.172l-.4.312a2.114,2.114,0,0,1-3.011-2.9Z" transform="translate(-879.04 -495.596)"/><path class="f" d="M902.187,612.482l-.4.309a2.114,2.114,0,0,1-3-2.9Z" transform="translate(-866.96 -504.979)"/><path class="f" d="M886.164,624.79l-.4.312a2.114,2.114,0,0,1-3.011-2.9Z" transform="translate(-854.73 -514.362)"/><path class="e" d="M803.258,203.784a6.342,6.342,0,0,1,0,12.684,6.342,6.342,0,1,1,0,12.683,6.342,6.342,0,0,1,0,12.681,6.342,6.342,0,1,1,0,12.684H772.669a6.342,6.342,0,0,1,0-12.684,6.342,6.342,0,1,1,0-12.683,6.342,6.342,0,1,1,0-12.681,6.342,6.342,0,0,1,0-12.684,6.342,6.342,0,1,1,0-12.683,6.342,6.342,0,1,1,0-12.681h1.4c.8-5.455,6.968-9.7,14.456-9.7s13.652,4.245,14.456,9.7h.278a6.342,6.342,0,1,1,0,12.683,6.342,6.342,0,0,1,0,12.681Z" transform="translate(-766.176 -168.72)"/><path class="f" d="M830.408,215.852a6.359,6.359,0,0,1-6.34,6.34H793.48l30.4-12.682h.188A6.359,6.359,0,0,1,830.408,215.852Z" transform="translate(-786.987 -199.81)"/><path class="f" d="M767.6,269.182a6.359,6.359,0,0,0,6.342,6.34h30.586l-30.4-12.682h-.185a6.361,6.361,0,0,0-6.342,6.342Z" transform="translate(-767.261 -240.458)"/><path class="f" d="M767.6,375.85a6.361,6.361,0,0,0,6.342,6.342h30.586l-30.4-12.682h-.185a6.359,6.359,0,0,0-6.342,6.34Z" transform="translate(-767.261 -321.762)"/><path class="f" d="M767.6,482.512a6.361,6.361,0,0,0,6.342,6.342h30.586l-30.4-12.684h-.185a6.361,6.361,0,0,0-6.342,6.342Z" transform="translate(-767.261 -403.058)"/><path class="f" d="M830.408,322.512a6.359,6.359,0,0,1-6.34,6.342H793.48l30.4-12.684h.188A6.359,6.359,0,0,1,830.408,322.512Z" transform="translate(-786.987 -281.106)"/><path class="f" d="M830.408,429.182a6.359,6.359,0,0,1-6.34,6.34H793.48l30.4-12.682h.188A6.359,6.359,0,0,1,830.408,429.182Z" transform="translate(-786.987 -362.41)"/><path class="e" d="M898.188,587.78l-10.073-5.422a3.522,3.522,0,0,0,.839-6.218,2.378,2.378,0,0,1,3.658-2.133l.461.238c1.232-1.665,4.012-1.959,6.478-.633s3.745,3.819,3.042,5.757l.093.05a3.556,3.556,0,0,0-.9,6.211,2.378,2.378,0,0,1-3.6,2.15Z" transform="translate(-858.279 -476.694)"/><path class="f" d="M914.424,599.921a2.378,2.378,0,0,1-3.213.951L901.14,595.45l12.259,1.213.062.033a2.378,2.378,0,0,1,.963,3.225Z" transform="translate(-869.045 -493.973)"/><path class="f" d="M886.986,595.7a2.378,2.378,0,0,0,.963,3.213l10.073,5.422-7.764-9.564-.059-.033A2.378,2.378,0,0,0,886.986,595.7Z" transform="translate(-858.043 -493.214)"/></g><ellipse class="h" cx="124.132" cy="5.469" rx="124.132" ry="5.469" transform="translate(0 140.931)"/><ellipse class="f" cx="26.872" cy="3.584" rx="26.872" ry="3.584" transform="translate(92.505 142.579)"/><path class="h" d="M547.408,369.494a5.469,5.469,0,0,1-6.482-5.964c.623-5.507,2.561-14.38,7.862-27.7,6.145-15.443,3.928-19.174-2.656-30.248C544,302,541.594,297.949,539,292.741c-6.7-13.379-4.152-23.69-.847-29.965a30.448,30.448,0,0,1,9.1-10.556l5.189,8.585-.476.476c-.012,0,.238,0,.6.659a20.739,20.739,0,0,0-4.915,6.295c-2.877,5.762-2.5,12.366,1.13,19.612,2.428,4.856,4.73,8.73,6.761,12.147,3.648,6.135,6.528,10.982,7.481,17.1.987,6.333-.238,13.146-4.064,22.781-5.044,12.672-6.658,20.6-7.151,24.86a5.481,5.481,0,0,1-4.392,4.756Z" transform="translate(-426.17 -223.318)"/><path class="j" d="M409,22.009,431.009,0l22.222,22.009h-15.1V38.838H424.1V22.116Z" transform="translate(-311.739)"/><ellipse class="f" cx="14.03" cy="1.871" rx="14.03" ry="1.871" transform="translate(153.382 142.327)"/><path class="h" d="M764.98,540.839a2.854,2.854,0,0,1-3.384-3.113c.323-2.875,1.336-7.507,4.1-14.461,3.208-8.064,2.05-10.011-1.386-15.795-1.11-1.867-2.378-3.986-3.731-6.706-3.491-6.984-2.164-12.366-.438-15.643a15.9,15.9,0,0,1,4.756-5.512l2.709,4.483-.252.238s.128,0,.314.345a10.815,10.815,0,0,0-2.568,3.286c-1.5,3.008-1.3,6.454.592,10.24,1.268,2.535,2.468,4.559,3.529,6.342,1.9,3.2,3.408,5.733,3.907,8.929.514,3.305-.121,6.863-2.124,11.89-2.632,6.616-3.477,10.756-3.734,12.979a2.854,2.854,0,0,1-2.292,2.485Z" transform="translate(-596.595 -396.634)"/><path class="j" d="M655.44,296.951l11.491-11.491,11.6,11.491H670.65v8.787h-7.324v-8.73Z" transform="translate(-499.575 -217.577)"/><ellipse class="f" cx="14.03" cy="1.871" rx="14.03" ry="1.871" transform="translate(57.31 142.327)"/><path class="h" d="M347.237,540.839a2.854,2.854,0,0,0,3.384-3.113c-.323-2.875-1.336-7.507-4.1-14.461-3.208-8.064-2.05-10.011,1.386-15.795,1.111-1.867,2.378-3.986,3.731-6.706,3.491-6.984,2.164-12.366.438-15.643a15.9,15.9,0,0,0-4.756-5.512l-2.709,4.483.252.238s-.128,0-.314.345a10.815,10.815,0,0,1,2.568,3.286c1.5,3.008,1.3,6.454-.592,10.24-1.267,2.535-2.468,4.559-3.529,6.342-1.9,3.2-3.408,5.733-3.907,8.929-.514,3.305.121,6.863,2.124,11.89,2.632,6.616,3.477,10.756,3.733,12.979a2.854,2.854,0,0,0,2.292,2.485Z" transform="translate(-276.869 -396.634)"/><path class="j" d="M274.535,296.951,263.045,285.46l-11.6,11.491h7.885v8.787h7.324v-8.73Z" transform="translate(-191.647 -217.577)"/><ellipse class="f" cx="4.994" cy="0.595" rx="4.994" ry="0.595" transform="translate(114.253 69.861) rotate(-16.49)"/><ellipse class="f" cx="4.994" cy="0.595" rx="4.994" ry="0.595" transform="translate(116.393 74.618) rotate(-16.49)"/><ellipse class="f" cx="4.994" cy="0.595" rx="4.994" ry="0.595" transform="translate(118.77 78.184) rotate(-16.49)"/><ellipse class="f" cx="4.994" cy="0.595" rx="4.994" ry="0.595" transform="translate(120.674 81.751) rotate(-16.49)"/><path class="j" d="M919.88,701.586h-10.1a3.16,3.16,0,0,0-1.873-5.216,2.1,2.1,0,0,1,1.873-3.162h.461c.264-1.8,2.3-3.206,4.77-3.208s4.518,1.4,4.777,3.2h.093a4.683,4.683,0,0,0,2.1,6.283,2.1,2.1,0,0,1-2.095,2.1Z" transform="translate(-710.33 -556.993)"/><path class="f" d="M928.922,705.552a2.1,2.1,0,0,1-2.093,2.095h-10.1l10.035-4.2h.062A2.1,2.1,0,0,1,928.922,705.552Z" transform="translate(-717.279 -567.244)"/><path class="f" d="M908.17,723.315a2.1,2.1,0,0,0,2.1,2.093h10.1l-10.042-4.178h-.055A2.1,2.1,0,0,0,908.17,723.315Z" transform="translate(-710.754 -580.796)"/><path class="j" d="M678.812,707.125h-5.733a2.659,2.659,0,0,0-1.189-3.567,1.189,1.189,0,0,1,1.189-1.189h.264a2.927,2.927,0,0,1,5.417,0h.052A2.659,2.659,0,0,0,680,705.931a1.189,1.189,0,0,1-1.189,1.189Z" transform="translate(-530.662 -565.034)"/><path class="f" d="M683.812,709.389a1.189,1.189,0,0,1-1.189,1.189H676.89L682.6,708.2h.026A1.189,1.189,0,0,1,683.812,709.389Z" transform="translate(-534.473 -570.865)"/><path class="f" d="M672.05,719.419a1.189,1.189,0,0,0,1.189,1.189h5.731l-5.707-2.378h-.036A1.189,1.189,0,0,0,672.05,719.419Z" transform="translate(-530.784 -578.51)"/><path class="j" d="M202.274,712.027H190.146a3.794,3.794,0,0,0-2.241-6.258,2.514,2.514,0,0,1,2.241-3.791h.552c.316-2.162,2.758-3.845,5.724-3.848s5.41,1.677,5.731,3.836h.109A5.689,5.689,0,0,0,204.7,709.5a2.514,2.514,0,0,1-2.436,2.512Z" transform="translate(-161.503 -563.19)"/><path class="f" d="M213.087,716.783a2.518,2.518,0,0,1-2.509,2.514H198.45l12.038-5.037h.074A2.523,2.523,0,0,1,213.087,716.783Z" transform="translate(-169.807 -575.484)"/><path class="f" d="M188.22,738.044a2.521,2.521,0,0,0,2.516,2.509h12.128l-12.049-5.013h-.074A2.523,2.523,0,0,0,188.22,738.044Z" transform="translate(-162.01 -591.703)"/><path class="a" d="M307.727,263.184a4.832,4.832,0,0,0-2.8.3,4.107,4.107,0,0,1-3.353,0,4.709,4.709,0,0,0-3.943.076,2.447,2.447,0,0,1-1.134.285c-1.6,0-2.927-1.61-3.2-3.736a3.078,3.078,0,0,0,.8-.861,4.493,4.493,0,0,1,8.019-.026,3.091,3.091,0,0,0,2.654,1.458h.043A3.367,3.367,0,0,1,307.727,263.184Z" transform="translate(-242.094 -226.786)"/><path class="b" d="M312.59,237.5l-2.583,1.638,1.567-2.854a2.542,2.542,0,0,0-1.562-.559h-.04a2.853,2.853,0,0,1-.535-.038l-.878.554.376-.682A3.122,3.122,0,0,1,307.4,234.4l-1.572,1,.989-1.8a4.589,4.589,0,0,0-3.51-1.774,4.8,4.8,0,0,0-4.019,2.478,3.008,3.008,0,0,1-2.656,1.427h-.078c-1.8,0-3.258,2.04-3.258,4.556s1.46,4.556,3.258,4.556a2.418,2.418,0,0,0,1.134-.285,4.708,4.708,0,0,1,3.943-.076,4.162,4.162,0,0,0,1.686.361,4.112,4.112,0,0,0,1.665-.354,4.706,4.706,0,0,1,3.907.076,2.435,2.435,0,0,0,1.122.278c1.8,0,3.258-2.04,3.258-4.556A5.791,5.791,0,0,0,312.59,237.5Z" transform="translate(-242.101 -207.769)"/><path class="a" d="M210.62,373.184a4.832,4.832,0,0,1,2.792.3,4.1,4.1,0,0,0,3.351,0,4.708,4.708,0,0,1,3.943.076,2.454,2.454,0,0,0,1.134.285c1.6,0,2.93-1.61,3.206-3.736a3.041,3.041,0,0,1-.8-.861,4.493,4.493,0,0,0-8.019-.026,3.091,3.091,0,0,1-2.663,1.455h-.04A3.345,3.345,0,0,0,210.62,373.184Z" transform="translate(-179.083 -310.627)"/><path class="b" d="M187.959,347.493l2.583,1.638-1.569-2.854a2.547,2.547,0,0,1,1.562-.559h.043a2.856,2.856,0,0,0,.535-.038l.875.554-.376-.682a3.127,3.127,0,0,0,1.534-1.163l1.567.994-.992-1.8a4.594,4.594,0,0,1,3.512-1.774,4.815,4.815,0,0,1,4.019,2.478,3.006,3.006,0,0,0,2.656,1.427h.086c1.8,0,3.258,2.04,3.258,4.556s-1.458,4.556-3.258,4.556a2.433,2.433,0,0,1-1.134-.285,4.708,4.708,0,0,0-3.943-.076,4.15,4.15,0,0,1-1.684.361,4.1,4.1,0,0,1-1.665-.354,4.711,4.711,0,0,0-3.909.076,2.428,2.428,0,0,1-1.122.278c-1.8,0-3.258-2.04-3.258-4.556A5.79,5.79,0,0,1,187.959,347.493Z" transform="translate(-161.292 -291.603)"/><path class="d" d="M623.625,401.146a1.242,1.242,0,0,1,.433.136,1.024,1.024,0,0,1,.378.507,4.471,4.471,0,0,1,.252,1.586,3.4,3.4,0,0,1-.164,1.286.8.8,0,0,1-.214.335.742.742,0,0,1-.295.143.787.787,0,0,1-.692-.086,1.1,1.1,0,0,1-.307-.713,1.681,1.681,0,0,0-.411-.994c-.2-.183-.476-.276-.621-.5a1.068,1.068,0,0,1,.029-.923c.093-.262.238-.789.5-.923S623.342,401.093,623.625,401.146Z" transform="translate(-492.551 -336.685)"/><path class="d" d="M577.4,405.468a2.031,2.031,0,0,0,.426.787c.121.14.271.309.207.476a.4.4,0,0,1-.114.155,5.8,5.8,0,0,1-3.389,1.455.127.127,0,0,1-.06,0c-.036-.017-.045-.062-.05-.1a1.262,1.262,0,0,1,0-.39,1.16,1.16,0,0,1,.587-.685,1.864,1.864,0,0,0,.69-.6c.181-.34.1-.782.319-1.1a1.153,1.153,0,0,1,.808-.416c.1-.017.333-.136.423-.081S577.365,405.361,577.4,405.468Z" transform="translate(-456.36 -339.728)"/><path class="e" d="M624.454,401.217a.126.126,0,0,1,.109-.124.373.373,0,0,1,.176.024,2.619,2.619,0,0,0,.426.078,3.093,3.093,0,0,1,.514.059.58.58,0,0,1,.4.3.765.765,0,0,1,.045.285,4.517,4.517,0,0,1-.133,1.113.079.079,0,0,1-.045.069.168.168,0,0,1-.069,0,.09.09,0,0,0-.04.048,2.456,2.456,0,0,0-.152.744c-.043.373-.093.747-.155,1.118a1.246,1.246,0,0,1-.238.611,1.011,1.011,0,0,1-.642.295,4.519,4.519,0,0,1-1.512-.138.44.44,0,0,1-.254-.114.292.292,0,0,1-.062-.2c0-.238.238-.426.447-.564l.309-.188a.152.152,0,0,0,.05-.045.172.172,0,0,0,.014-.093l-.019-.366a1.046,1.046,0,0,1,.906.576c.04.078.078.171.159.2a.212.212,0,0,0,.25-.152.64.64,0,0,0,0-.321c-.167-.9-.126-1.819-.238-2.725a.6.6,0,0,0-.093-.285C624.556,401.36,624.465,401.307,624.454,401.217Z" transform="translate(-493.258 -336.787)"/><path class="e" d="M569.811,412.046c-.043.069-.109.121-.147.195a.164.164,0,0,0,.031.216.211.211,0,0,0,.133.014,4.478,4.478,0,0,0,2.414-1.092,1.663,1.663,0,0,0,.295-.326c.078-.119.145-.264.278-.314a4.826,4.826,0,0,1,.126,1.061.754.754,0,0,1-.238.64.769.769,0,0,1-.238.1l-.421.119a.425.425,0,0,1-.238.021,1.058,1.058,0,0,0-.145-.052.343.343,0,0,0-.162.019l-.361.107a2.066,2.066,0,0,0-.359.124c-.1.05-.2.114-.3.169a3.733,3.733,0,0,1-.526.212l-.637.221a2.245,2.245,0,0,1-.542.14,2.324,2.324,0,0,0-.385.021c-.128.021-.188.05-.288.059a.773.773,0,0,1-.452-.133.446.446,0,0,1-.131-.119c-.09-.14,0-.328.078-.476a1.84,1.84,0,0,1,.644-.666c.112-.062.238-.107.345-.162.326-.157.571-.421.877-.6S569.947,411.822,569.811,412.046Z" transform="translate(-451.082 -344.141)"/><path class="d" d="M614.92,298.583a2.659,2.659,0,0,0,1.127.44,4.771,4.771,0,0,0,.637.033,16.515,16.515,0,0,0,2.654-.221,3.285,3.285,0,0,1-.835-1.3,2.175,2.175,0,0,1-.04-.813,6.379,6.379,0,0,1,.238-1.025,6.812,6.812,0,0,1-1.122-.029c-.212-.021-.732-.214-.918-.067s-.043.616-.038.839a.086.086,0,0,1,0,.024,2.674,2.674,0,0,1-.214.98,1.843,1.843,0,0,1-1.489,1.137Z" transform="translate(-487.24 -256.342)"/><path class="f" d="M621.922,296.443a2.24,2.24,0,0,0,1.829.281,6.378,6.378,0,0,1,.238-1.025,6.812,6.812,0,0,1-1.122-.029c-.212-.021-.732-.214-.918-.067S621.917,296.219,621.922,296.443Z" transform="translate(-492.527 -256.342)"/><circle class="d" cx="2.235" cy="2.235" r="2.235" transform="translate(128.382 35.891)"/><path class="e" d="M587.4,312.445a1.044,1.044,0,0,0,.5.9,1.922,1.922,0,0,0,.547.193,10.753,10.753,0,0,0,3.12.385,1.74,1.74,0,0,0,.661-.138.713.713,0,0,0,.409-.511.29.29,0,0,1,.185-.3.632.632,0,0,0,.238-.633c.128.057.262-.071.321-.2s.107-.281.238-.333a1.783,1.783,0,0,1,.278-.04c.147-.038.238-.181.342-.29a2.574,2.574,0,0,1,.79-.476,8.76,8.76,0,0,0,2.14-1.719,7.2,7.2,0,0,0,.923-1.034c.074-.109.143-.221.2-.335a9.441,9.441,0,0,0,.516-1.177,1.37,1.37,0,0,0,.131-.675.55.55,0,0,0,0-.062,1.287,1.287,0,0,0-.2-.409,1.712,1.712,0,0,0-.916-.754,2.633,2.633,0,0,0-1.189.1,2.906,2.906,0,0,1-.4.062,3.716,3.716,0,0,1-1.244-.2l-.445-.121c-.221-.062-.333-.331-.556-.378a.81.81,0,0,0-.3.017,4.1,4.1,0,0,0-1.317.43,2,2,0,0,0-.255.174,1.627,1.627,0,0,0-.595.877c-.093.388,0,.8-.1,1.189a2.631,2.631,0,0,1-.454.866l-1.089,1.565a9.508,9.508,0,0,1-.8,1.044C588.494,311.1,587.417,311.579,587.4,312.445Z" transform="translate(-466.264 -263.013)"/><path class="d" d="M592.782,271.382a1.842,1.842,0,0,0-.2-.621,1.407,1.407,0,0,0-.29-.3,1.9,1.9,0,0,0-.618-.385.771.771,0,0,0-.713.081.937.937,0,0,0-.309.644,1.591,1.591,0,0,0,.167.977,4.079,4.079,0,0,0,.792.816,3.094,3.094,0,0,1,.518.644,1.8,1.8,0,0,0,.238.345.445.445,0,0,0,.373.147.645.645,0,0,0,.3-.178c.112-.1.416-.276.426-.433s-.238-.414-.288-.533A6.017,6.017,0,0,1,592.782,271.382Z" transform="translate(-468.731 -236.884)"/><path class="k" d="M565.51,348.149c.281.518.59,1.023.839,1.558.145.312.273.633.435.935s.395.64.58.965a11.22,11.22,0,0,1,.966,2.673,5.379,5.379,0,0,0,1.9-.668c.038-.024.076-.048.112-.074a1.369,1.369,0,0,0,.385-.423,8.97,8.97,0,0,0-.9-2.43c-.145-.238-.314-.476-.476-.713-.44-.69-.53-1.56-1.03-2.207a.378.378,0,0,1,0-.449c.057-.074.15-.145.131-.238s-.083-.131-.055-.193.043-.048.069-.069c.083-.078.074-.214.081-.328a1.624,1.624,0,0,1,.364-.79.509.509,0,0,1,.133-.143c.045-.029.1-.04.145-.069.159-.1.147-.333.224-.507.1-.238.354-.342.518-.528.212-.238.264-.564.476-.768a.616.616,0,0,1,.074-.059,3.639,3.639,0,0,0-.131,1.077c-.021,1.244.29,2.533.143,3.769a2.6,2.6,0,0,0,1.346,2.452,6.434,6.434,0,0,0,1.049.44c.537.19,1.073.388,1.6.606q.557.238,1.1.5a13.558,13.558,0,0,1,1.3.713,5,5,0,0,1,1.4,1.151,1.251,1.251,0,0,0,.9-.5,3.47,3.47,0,0,0,.5-.937,2.582,2.582,0,0,0,.238-.882.169.169,0,0,0-.1-.159l-2.452-1.3-.459-.238c-1-.533-2.045-1.025-3.049-1.558-.067.019-.124-.057-.143-.124s-.033-.15-.1-.181-.074-.014-.1-.04a.1.1,0,0,1-.017-.081c.033-.476.383-.932.312-1.415a1.7,1.7,0,0,1-.088-.609,2.851,2.851,0,0,1,.185-.385c.121-.295,0-.652.133-.951a2.14,2.14,0,0,0,.176-.6,4.1,4.1,0,0,1,.376-1.189,2.14,2.14,0,0,1,.345-.523c.074-.078.157-.15.238-.238a1.9,1.9,0,0,0,.352-.913,4.365,4.365,0,0,0,.05-1.788,2.636,2.636,0,0,1-.114-.6c0-.271.121-.587-.067-.782a.6.6,0,0,0-.273-.14,8.667,8.667,0,0,0-1.329-.238l-2.05-.266a1.9,1.9,0,0,1-.682-.176,1.363,1.363,0,0,1-.573-.735c-.361.262-.495.751-.782,1.089a5.35,5.35,0,0,1-.476.452,5.474,5.474,0,0,0-.514.633,11.206,11.206,0,0,0-1.161,1.836c-.159.342-.283.7-.411,1.053a42.763,42.763,0,0,0-1.665,4.164,8,8,0,0,0-.333,1.032A2,2,0,0,0,565.51,348.149Z" transform="translate(-449.313 -287.769)"/><path class="f" d="M610.772,334.693a.611.611,0,0,1,.074.3c-.045-.238-.357-.352-.376-.575,0-.1,0-.1.074-.043S610.682,334.605,610.772,334.693Z" transform="translate(-483.848 -285.908)"/><path class="f" d="M607.1,338.527a.475.475,0,0,1,.14.209.528.528,0,0,1,.029.366c-.045-.021-.06-.078-.074-.126a.886.886,0,0,0-.1-.216c-.036-.059-.207-.2-.2-.262S607.052,338.494,607.1,338.527Z" transform="translate(-481.119 -289.057)"/><path class="f" d="M607.3,304.9a2.379,2.379,0,0,0,.476.314c.442.224.932.342,1.379.559a6.408,6.408,0,0,1,.64.373l1.325.839a1.579,1.579,0,0,1,.292.221c.157.171.157.476.3.652a.882.882,0,0,0,.644.3,2.118,2.118,0,0,0,.713-.121,3.663,3.663,0,0,0,.409-.15,1.942,1.942,0,0,0,.392-.224,1.127,1.127,0,0,0,.476-.732,1.469,1.469,0,0,0-.078-.6,2.24,2.24,0,0,0-.143-.361,1.173,1.173,0,0,0-.112-.19,2.108,2.108,0,0,0-1.358-.735c-.273-.052-.552-.086-.825-.133a2.9,2.9,0,0,1-.4.062,3.717,3.717,0,0,1-1.244-.2l-.445-.121c-.221-.062-.333-.331-.556-.378a.811.811,0,0,0-.3.017,4.1,4.1,0,0,0-1.317.43A2,2,0,0,0,607.3,304.9Z" transform="translate(-481.432 -262.99)"/><path class="e" d="M597.63,282c.057.54.511.937.789,1.4.136.238.238.476.352.713a7.225,7.225,0,0,0,.476.737l.5.713a7.458,7.458,0,0,0,.951,1.206,10.855,10.855,0,0,1,1.812.828,9.183,9.183,0,0,0,1.55.314,2.108,2.108,0,0,1,1.358.735,2.021,2.021,0,0,1,.254.554,1.459,1.459,0,0,1,.078.6,1.127,1.127,0,0,1-.476.73,2.472,2.472,0,0,1-.8.373,2.06,2.06,0,0,1-.713.121.873.873,0,0,1-.644-.3c-.145-.181-.143-.476-.3-.649a1.456,1.456,0,0,0-.293-.221l-1.325-.839a6.4,6.4,0,0,0-.64-.373c-.447-.219-.937-.335-1.379-.561a1.671,1.671,0,0,1-.951-1.082,10.531,10.531,0,0,0-2.195-4c.029,0,.019-.071.031-.1a1.284,1.284,0,0,1,.649-.656,3.8,3.8,0,0,1,.92-.24Z" transform="translate(-472.842 -246.016)"/><path class="k" d="M622.433,278.659a.8.8,0,0,1,.093-.476,1.049,1.049,0,0,1,.735-.388c.269-.057.537-.1.809-.143a1.857,1.857,0,0,1,.668-.012,4.52,4.52,0,0,1,.835.395,5.785,5.785,0,0,0,1.061.271,1.605,1.605,0,0,1,.951.511,1.782,1.782,0,0,1,.283.792c.423,2.283-.033,4.623-.119,6.944a4.229,4.229,0,0,0,.523,2.616l-1.5-.038a1.843,1.843,0,0,1-1.1-.269,1.8,1.8,0,0,1-.5-.863,2.672,2.672,0,0,1-.193-.773c-.024-.547.285-1.082.186-1.617a1.8,1.8,0,0,0-.69-1.006,6.308,6.308,0,0,1-.911-.811,2.943,2.943,0,0,1-.476-2.074,7.827,7.827,0,0,0,.074-1.289,1.627,1.627,0,0,0-.34-.906A1.256,1.256,0,0,1,622.433,278.659Z" transform="translate(-492.962 -242.675)"/><path class="f" d="M622.513,278.765a1.03,1.03,0,0,1,.713-.385.7.7,0,0,0-.357.281.8.8,0,0,0-.093.476,1.246,1.246,0,0,0,.385.866,1.627,1.627,0,0,1,.34.9,7.849,7.849,0,0,1-.074,1.291,3,3,0,0,0,.476,2.071,6.3,6.3,0,0,0,.911.811,1.809,1.809,0,0,1,.68.987c.1.537-.209,1.072-.185,1.617a2.65,2.65,0,0,0,.193.773,1.365,1.365,0,0,0,1.605,1.132l1.065.029c.024.038.048.076.074.114l-1.5-.038a1.843,1.843,0,0,1-1.1-.269,1.8,1.8,0,0,1-.5-.863,2.672,2.672,0,0,1-.193-.773c-.024-.547.285-1.082.185-1.617a1.8,1.8,0,0,0-.678-.985,6.3,6.3,0,0,1-.911-.811,2.943,2.943,0,0,1-.476-2.074,7.834,7.834,0,0,0,.074-1.289,1.627,1.627,0,0,0-.34-.906,1.256,1.256,0,0,1-.385-.866.8.8,0,0,1,.1-.476Z" transform="translate(-492.949 -243.257)"/><path class="f" d="M575.37,364.632l2.766,6.718a1.369,1.369,0,0,0,.385-.423,8.972,8.972,0,0,0-.9-2.43c-.145-.238-.314-.476-.476-.713-.44-.69-.53-1.56-1.03-2.207a.378.378,0,0,1,0-.449c.057-.074.15-.145.131-.238s-.083-.131-.055-.193.043-.048.069-.069c.083-.078.074-.214.081-.328a1.624,1.624,0,0,1,.364-.789.509.509,0,0,1,.133-.143c.045-.029.1-.04.145-.069.159-.1.147-.333.224-.507.1-.238.354-.342.518-.528.212-.238.264-.564.476-.768l.019-.048-.209-1.3Z" transform="translate(-457.095 -305.582)"/></svg>
admin/images/new-2.gif DELETED
Binary file
admin/images/new-img.gif DELETED
Binary file
admin/images/plugin_bk.png DELETED
Binary file
admin/images/woo_banner_adv.gif DELETED
Binary file
admin/js/dataTables.bootstrap4.min.js ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ DataTables Bootstrap 4 integration
3
+ ©2011-2017 SpryMedia Ltd - datatables.net/license
4
+ */
5
+ var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(a,b,c){a instanceof String&&(a=String(a));for(var e=a.length,d=0;d<e;d++){var f=a[d];if(b.call(c,f,d,a))return{i:d,v:f}}return{i:-1,v:void 0}};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.SIMPLE_FROUND_POLYFILL=!1;$jscomp.ISOLATE_POLYFILLS=!1;
6
+ $jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};$jscomp.getGlobal=function(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("Cannot find global object");};$jscomp.global=$jscomp.getGlobal(this);
7
+ $jscomp.IS_SYMBOL_NATIVE="function"===typeof Symbol&&"symbol"===typeof Symbol("x");$jscomp.TRUST_ES6_POLYFILLS=!$jscomp.ISOLATE_POLYFILLS||$jscomp.IS_SYMBOL_NATIVE;$jscomp.polyfills={};$jscomp.propertyToPolyfillSymbol={};$jscomp.POLYFILL_PREFIX="$jscp$";var $jscomp$lookupPolyfilledValue=function(a,b){var c=$jscomp.propertyToPolyfillSymbol[b];if(null==c)return a[b];c=a[c];return void 0!==c?c:a[b]};
8
+ $jscomp.polyfill=function(a,b,c,e){b&&($jscomp.ISOLATE_POLYFILLS?$jscomp.polyfillIsolated(a,b,c,e):$jscomp.polyfillUnisolated(a,b,c,e))};$jscomp.polyfillUnisolated=function(a,b,c,e){c=$jscomp.global;a=a.split(".");for(e=0;e<a.length-1;e++){var d=a[e];if(!(d in c))return;c=c[d]}a=a[a.length-1];e=c[a];b=b(e);b!=e&&null!=b&&$jscomp.defineProperty(c,a,{configurable:!0,writable:!0,value:b})};
9
+ $jscomp.polyfillIsolated=function(a,b,c,e){var d=a.split(".");a=1===d.length;e=d[0];e=!a&&e in $jscomp.polyfills?$jscomp.polyfills:$jscomp.global;for(var f=0;f<d.length-1;f++){var l=d[f];if(!(l in e))return;e=e[l]}d=d[d.length-1];c=$jscomp.IS_SYMBOL_NATIVE&&"es6"===c?e[d]:null;b=b(c);null!=b&&(a?$jscomp.defineProperty($jscomp.polyfills,d,{configurable:!0,writable:!0,value:b}):b!==c&&($jscomp.propertyToPolyfillSymbol[d]=$jscomp.IS_SYMBOL_NATIVE?$jscomp.global.Symbol(d):$jscomp.POLYFILL_PREFIX+d,d=
10
+ $jscomp.propertyToPolyfillSymbol[d],$jscomp.defineProperty(e,d,{configurable:!0,writable:!0,value:b})))};$jscomp.polyfill("Array.prototype.find",function(a){return a?a:function(b,c){return $jscomp.findInternal(this,b,c).v}},"es6","es3");
11
+ (function(a){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(b){return a(b,window,document)}):"object"===typeof exports?module.exports=function(b,c){b||(b=window);c&&c.fn.dataTable||(c=require("datatables.net")(b,c).$);return a(c,b,b.document)}:a(jQuery,window,document)})(function(a,b,c,e){var d=a.fn.dataTable;a.extend(!0,d.defaults,{dom:"<'row'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
12
+ renderer:"bootstrap"});a.extend(d.ext.classes,{sWrapper:"dataTables_wrapper dt-bootstrap4",sFilterInput:"form-control form-control-sm",sLengthSelect:"custom-select custom-select-sm form-control form-control-sm",sProcessing:"dataTables_processing card",sPageButton:"paginate_button page-item"});d.ext.renderer.pageButton.bootstrap=function(f,l,A,B,m,t){var u=new d.Api(f),C=f.oClasses,n=f.oLanguage.oPaginate,D=f.oLanguage.oAria.paginate||{},h,k,v=0,y=function(q,w){var x,E=function(p){p.preventDefault();
13
+ a(p.currentTarget).hasClass("disabled")||u.page()==p.data.action||u.page(p.data.action).draw("page")};var r=0;for(x=w.length;r<x;r++){var g=w[r];if(Array.isArray(g))y(q,g);else{k=h="";switch(g){case "ellipsis":h="&#x2026;";k="disabled";break;case "first":h=n.sFirst;k=g+(0<m?"":" disabled");break;case "previous":h=n.sPrevious;k=g+(0<m?"":" disabled");break;case "next":h=n.sNext;k=g+(m<t-1?"":" disabled");break;case "last":h=n.sLast;k=g+(m<t-1?"":" disabled");break;default:h=g+1,k=m===g?"active":""}if(h){var F=
14
+ a("<li>",{"class":C.sPageButton+" "+k,id:0===A&&"string"===typeof g?f.sTableId+"_"+g:null}).append(a("<a>",{href:"#","aria-controls":f.sTableId,"aria-label":D[g],"data-dt-idx":v,tabindex:f.iTabIndex,"class":"page-link"}).html(h)).appendTo(q);f.oApi._fnBindAction(F,{action:g},E);v++}}}};try{var z=a(l).find(c.activeElement).data("dt-idx")}catch(q){}y(a(l).empty().html('<ul class="pagination"/>').children("ul"),B);z!==e&&a(l).find("[data-dt-idx="+z+"]").trigger("focus")};return d});
admin/js/jquery.dataTables.min.js ADDED
@@ -0,0 +1,184 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ Copyright 2008-2021 SpryMedia Ltd.
3
+
4
+ This source file is free software, available under the following license:
5
+ MIT license - http://datatables.net/license
6
+
7
+ This source file is distributed in the hope that it will be useful, but
8
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
9
+ or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
10
+
11
+ For details please refer to: http://www.datatables.net
12
+ DataTables 1.10.24
13
+ ©2008-2021 SpryMedia Ltd - datatables.net/license
14
+ */
15
+ var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(k,y,z){k instanceof String&&(k=String(k));for(var q=k.length,G=0;G<q;G++){var O=k[G];if(y.call(z,O,G,k))return{i:G,v:O}}return{i:-1,v:void 0}};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.SIMPLE_FROUND_POLYFILL=!1;$jscomp.ISOLATE_POLYFILLS=!1;
16
+ $jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(k,y,z){if(k==Array.prototype||k==Object.prototype)return k;k[y]=z.value;return k};$jscomp.getGlobal=function(k){k=["object"==typeof globalThis&&globalThis,k,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var y=0;y<k.length;++y){var z=k[y];if(z&&z.Math==Math)return z}throw Error("Cannot find global object");};$jscomp.global=$jscomp.getGlobal(this);
17
+ $jscomp.IS_SYMBOL_NATIVE="function"===typeof Symbol&&"symbol"===typeof Symbol("x");$jscomp.TRUST_ES6_POLYFILLS=!$jscomp.ISOLATE_POLYFILLS||$jscomp.IS_SYMBOL_NATIVE;$jscomp.polyfills={};$jscomp.propertyToPolyfillSymbol={};$jscomp.POLYFILL_PREFIX="$jscp$";var $jscomp$lookupPolyfilledValue=function(k,y){var z=$jscomp.propertyToPolyfillSymbol[y];if(null==z)return k[y];z=k[z];return void 0!==z?z:k[y]};
18
+ $jscomp.polyfill=function(k,y,z,q){y&&($jscomp.ISOLATE_POLYFILLS?$jscomp.polyfillIsolated(k,y,z,q):$jscomp.polyfillUnisolated(k,y,z,q))};$jscomp.polyfillUnisolated=function(k,y,z,q){z=$jscomp.global;k=k.split(".");for(q=0;q<k.length-1;q++){var G=k[q];if(!(G in z))return;z=z[G]}k=k[k.length-1];q=z[k];y=y(q);y!=q&&null!=y&&$jscomp.defineProperty(z,k,{configurable:!0,writable:!0,value:y})};
19
+ $jscomp.polyfillIsolated=function(k,y,z,q){var G=k.split(".");k=1===G.length;q=G[0];q=!k&&q in $jscomp.polyfills?$jscomp.polyfills:$jscomp.global;for(var O=0;O<G.length-1;O++){var ma=G[O];if(!(ma in q))return;q=q[ma]}G=G[G.length-1];z=$jscomp.IS_SYMBOL_NATIVE&&"es6"===z?q[G]:null;y=y(z);null!=y&&(k?$jscomp.defineProperty($jscomp.polyfills,G,{configurable:!0,writable:!0,value:y}):y!==z&&($jscomp.propertyToPolyfillSymbol[G]=$jscomp.IS_SYMBOL_NATIVE?$jscomp.global.Symbol(G):$jscomp.POLYFILL_PREFIX+G,
20
+ G=$jscomp.propertyToPolyfillSymbol[G],$jscomp.defineProperty(q,G,{configurable:!0,writable:!0,value:y})))};$jscomp.polyfill("Array.prototype.find",function(k){return k?k:function(y,z){return $jscomp.findInternal(this,y,z).v}},"es6","es3");
21
+ (function(k){"function"===typeof define&&define.amd?define(["jquery"],function(y){return k(y,window,document)}):"object"===typeof exports?module.exports=function(y,z){y||(y=window);z||(z="undefined"!==typeof window?require("jquery"):require("jquery")(y));return k(z,y,y.document)}:k(jQuery,window,document)})(function(k,y,z,q){function G(a){var b,c,d={};k.each(a,function(e,f){(b=e.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(b[1]+" ")&&(c=e.replace(b[0],b[2].toLowerCase()),
22
+ d[c]=e,"o"===b[1]&&G(a[e]))});a._hungarianMap=d}function O(a,b,c){a._hungarianMap||G(a);var d;k.each(b,function(e,f){d=a._hungarianMap[e];d===q||!c&&b[d]!==q||("o"===d.charAt(0)?(b[d]||(b[d]={}),k.extend(!0,b[d],b[e]),O(a[d],b[d],c)):b[d]=b[e])})}function ma(a){var b=u.defaults.oLanguage,c=b.sDecimal;c&&Va(c);if(a){var d=a.sZeroRecords;!a.sEmptyTable&&d&&"No data available in table"===b.sEmptyTable&&V(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&d&&"Loading..."===b.sLoadingRecords&&V(a,a,
23
+ "sZeroRecords","sLoadingRecords");a.sInfoThousands&&(a.sThousands=a.sInfoThousands);(a=a.sDecimal)&&c!==a&&Va(a)}}function yb(a){R(a,"ordering","bSort");R(a,"orderMulti","bSortMulti");R(a,"orderClasses","bSortClasses");R(a,"orderCellsTop","bSortCellsTop");R(a,"order","aaSorting");R(a,"orderFixed","aaSortingFixed");R(a,"paging","bPaginate");R(a,"pagingType","sPaginationType");R(a,"pageLength","iDisplayLength");R(a,"searching","bFilter");"boolean"===typeof a.sScrollX&&(a.sScrollX=a.sScrollX?"100%":
24
+ "");"boolean"===typeof a.scrollX&&(a.scrollX=a.scrollX?"100%":"");if(a=a.aoSearchCols)for(var b=0,c=a.length;b<c;b++)a[b]&&O(u.models.oSearch,a[b])}function zb(a){R(a,"orderable","bSortable");R(a,"orderData","aDataSort");R(a,"orderSequence","asSorting");R(a,"orderDataType","sortDataType");var b=a.aDataSort;"number"!==typeof b||Array.isArray(b)||(a.aDataSort=[b])}function Ab(a){if(!u.__browser){var b={};u.__browser=b;var c=k("<div/>").css({position:"fixed",top:0,left:-1*k(y).scrollLeft(),height:1,
25
+ width:1,overflow:"hidden"}).append(k("<div/>").css({position:"absolute",top:1,left:1,width:100,overflow:"scroll"}).append(k("<div/>").css({width:"100%",height:10}))).appendTo("body"),d=c.children(),e=d.children();b.barWidth=d[0].offsetWidth-d[0].clientWidth;b.bScrollOversize=100===e[0].offsetWidth&&100!==d[0].clientWidth;b.bScrollbarLeft=1!==Math.round(e.offset().left);b.bBounding=c[0].getBoundingClientRect().width?!0:!1;c.remove()}k.extend(a.oBrowser,u.__browser);a.oScroll.iBarWidth=u.__browser.barWidth}
26
+ function Bb(a,b,c,d,e,f){var g=!1;if(c!==q){var h=c;g=!0}for(;d!==e;)a.hasOwnProperty(d)&&(h=g?b(h,a[d],d,a):a[d],g=!0,d+=f);return h}function Wa(a,b){var c=u.defaults.column,d=a.aoColumns.length;c=k.extend({},u.models.oColumn,c,{nTh:b?b:z.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols;c[d]=k.extend({},u.models.oSearch,c[d]);Da(a,d,k(b).data())}function Da(a,b,c){b=a.aoColumns[b];
27
+ var d=a.oClasses,e=k(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=e.attr("width")||null;var f=(e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);f&&(b.sWidthOrig=f[1])}c!==q&&null!==c&&(zb(c),O(u.defaults.column,c,!0),c.mDataProp===q||c.mData||(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),c.sClass&&e.addClass(c.sClass),k.extend(b,c),V(b,c,"sWidth","sWidthOrig"),c.iDataSort!==q&&(b.aDataSort=[c.iDataSort]),V(b,c,"aDataSort"));var g=b.mData,h=ia(g),
28
+ l=b.mRender?ia(b.mRender):null;c=function(n){return"string"===typeof n&&-1!==n.indexOf("@")};b._bAttrSrc=k.isPlainObject(g)&&(c(g.sort)||c(g.type)||c(g.filter));b._setter=null;b.fnGetData=function(n,m,p){var t=h(n,m,q,p);return l&&m?l(t,m,n,p):t};b.fnSetData=function(n,m,p){return da(g)(n,m,p)};"number"!==typeof g&&(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,e.addClass(d.sSortableNone));a=-1!==k.inArray("asc",b.asSorting);c=-1!==k.inArray("desc",b.asSorting);b.bSortable&&(a||c)?a&&!c?
29
+ (b.sSortingClass=d.sSortableAsc,b.sSortingClassJUI=d.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI):(b.sSortingClass=d.sSortableNone,b.sSortingClassJUI="")}function ra(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Xa(a);for(var c=0,d=b.length;c<d;c++)b[c].nTh.style.width=b[c].sWidth}b=a.oScroll;""===b.sY&&""===b.sX||Ea(a);H(a,null,"column-sizing",[a])}function sa(a,b){a=Fa(a,"bVisible");
30
+ return"number"===typeof a[b]?a[b]:null}function ta(a,b){a=Fa(a,"bVisible");b=k.inArray(b,a);return-1!==b?b:null}function na(a){var b=0;k.each(a.aoColumns,function(c,d){d.bVisible&&"none"!==k(d.nTh).css("display")&&b++});return b}function Fa(a,b){var c=[];k.map(a.aoColumns,function(d,e){d[b]&&c.push(e)});return c}function Ya(a){var b=a.aoColumns,c=a.aoData,d=u.ext.type.detect,e,f,g;var h=0;for(e=b.length;h<e;h++){var l=b[h];var n=[];if(!l.sType&&l._sManualType)l.sType=l._sManualType;else if(!l.sType){var m=
31
+ 0;for(f=d.length;m<f;m++){var p=0;for(g=c.length;p<g;p++){n[p]===q&&(n[p]=S(a,p,h,"type"));var t=d[m](n[p],a);if(!t&&m!==d.length-1)break;if("html"===t)break}if(t){l.sType=t;break}}l.sType||(l.sType="string")}}}function Cb(a,b,c,d){var e,f,g,h=a.aoColumns;if(b)for(e=b.length-1;0<=e;e--){var l=b[e];var n=l.targets!==q?l.targets:l.aTargets;Array.isArray(n)||(n=[n]);var m=0;for(f=n.length;m<f;m++)if("number"===typeof n[m]&&0<=n[m]){for(;h.length<=n[m];)Wa(a);d(n[m],l)}else if("number"===typeof n[m]&&
32
+ 0>n[m])d(h.length+n[m],l);else if("string"===typeof n[m]){var p=0;for(g=h.length;p<g;p++)("_all"==n[m]||k(h[p].nTh).hasClass(n[m]))&&d(p,l)}}if(c)for(e=0,a=c.length;e<a;e++)d(e,c[e])}function ea(a,b,c,d){var e=a.aoData.length,f=k.extend(!0,{},u.models.oRow,{src:c?"dom":"data",idx:e});f._aData=b;a.aoData.push(f);for(var g=a.aoColumns,h=0,l=g.length;h<l;h++)g[h].sType=null;a.aiDisplayMaster.push(e);b=a.rowIdFn(b);b!==q&&(a.aIds[b]=f);!c&&a.oFeatures.bDeferRender||Za(a,e,c,d);return e}function Ga(a,
33
+ b){var c;b instanceof k||(b=k(b));return b.map(function(d,e){c=$a(a,e);return ea(a,c.data,e,c.cells)})}function S(a,b,c,d){var e=a.iDraw,f=a.aoColumns[c],g=a.aoData[b]._aData,h=f.sDefaultContent,l=f.fnGetData(g,d,{settings:a,row:b,col:c});if(l===q)return a.iDrawError!=e&&null===h&&(aa(a,0,"Requested unknown parameter "+("function"==typeof f.mData?"{function}":"'"+f.mData+"'")+" for row "+b+", column "+c,4),a.iDrawError=e),h;if((l===g||null===l)&&null!==h&&d!==q)l=h;else if("function"===typeof l)return l.call(g);
34
+ return null===l&&"display"==d?"":l}function Db(a,b,c,d){a.aoColumns[c].fnSetData(a.aoData[b]._aData,d,{settings:a,row:b,col:c})}function ab(a){return k.map(a.match(/(\\.|[^\.])+/g)||[""],function(b){return b.replace(/\\\./g,".")})}function ia(a){if(k.isPlainObject(a)){var b={};k.each(a,function(d,e){e&&(b[d]=ia(e))});return function(d,e,f,g){var h=b[e]||b._;return h!==q?h(d,e,f,g):d}}if(null===a)return function(d){return d};if("function"===typeof a)return function(d,e,f,g){return a(d,e,f,g)};if("string"!==
35
+ typeof a||-1===a.indexOf(".")&&-1===a.indexOf("[")&&-1===a.indexOf("("))return function(d,e){return d[a]};var c=function(d,e,f){if(""!==f){var g=ab(f);for(var h=0,l=g.length;h<l;h++){f=g[h].match(ua);var n=g[h].match(oa);if(f){g[h]=g[h].replace(ua,"");""!==g[h]&&(d=d[g[h]]);n=[];g.splice(0,h+1);g=g.join(".");if(Array.isArray(d))for(h=0,l=d.length;h<l;h++)n.push(c(d[h],e,g));d=f[0].substring(1,f[0].length-1);d=""===d?n:n.join(d);break}else if(n){g[h]=g[h].replace(oa,"");d=d[g[h]]();continue}if(null===
36
+ d||d[g[h]]===q)return q;d=d[g[h]]}}return d};return function(d,e){return c(d,e,a)}}function da(a){if(k.isPlainObject(a))return da(a._);if(null===a)return function(){};if("function"===typeof a)return function(c,d,e){a(c,"set",d,e)};if("string"!==typeof a||-1===a.indexOf(".")&&-1===a.indexOf("[")&&-1===a.indexOf("("))return function(c,d){c[a]=d};var b=function(c,d,e){e=ab(e);var f=e[e.length-1];for(var g,h,l=0,n=e.length-1;l<n;l++){if("__proto__"===e[l]||"constructor"===e[l])throw Error("Cannot set prototype values");
37
+ g=e[l].match(ua);h=e[l].match(oa);if(g){e[l]=e[l].replace(ua,"");c[e[l]]=[];f=e.slice();f.splice(0,l+1);g=f.join(".");if(Array.isArray(d))for(h=0,n=d.length;h<n;h++)f={},b(f,d[h],g),c[e[l]].push(f);else c[e[l]]=d;return}h&&(e[l]=e[l].replace(oa,""),c=c[e[l]](d));if(null===c[e[l]]||c[e[l]]===q)c[e[l]]={};c=c[e[l]]}if(f.match(oa))c[f.replace(oa,"")](d);else c[f.replace(ua,"")]=d};return function(c,d){return b(c,d,a)}}function bb(a){return T(a.aoData,"_aData")}function Ha(a){a.aoData.length=0;a.aiDisplayMaster.length=
38
+ 0;a.aiDisplay.length=0;a.aIds={}}function Ia(a,b,c){for(var d=-1,e=0,f=a.length;e<f;e++)a[e]==b?d=e:a[e]>b&&a[e]--; -1!=d&&c===q&&a.splice(d,1)}function va(a,b,c,d){var e=a.aoData[b],f,g=function(l,n){for(;l.childNodes.length;)l.removeChild(l.firstChild);l.innerHTML=S(a,b,n,"display")};if("dom"!==c&&(c&&"auto"!==c||"dom"!==e.src)){var h=e.anCells;if(h)if(d!==q)g(h[d],d);else for(c=0,f=h.length;c<f;c++)g(h[c],c)}else e._aData=$a(a,e,d,d===q?q:e._aData).data;e._aSortData=null;e._aFilterData=null;g=
39
+ a.aoColumns;if(d!==q)g[d].sType=null;else{c=0;for(f=g.length;c<f;c++)g[c].sType=null;cb(a,e)}}function $a(a,b,c,d){var e=[],f=b.firstChild,g,h=0,l,n=a.aoColumns,m=a._rowReadObject;d=d!==q?d:m?{}:[];var p=function(x,r){if("string"===typeof x){var A=x.indexOf("@");-1!==A&&(A=x.substring(A+1),da(x)(d,r.getAttribute(A)))}},t=function(x){if(c===q||c===h)g=n[h],l=x.innerHTML.trim(),g&&g._bAttrSrc?(da(g.mData._)(d,l),p(g.mData.sort,x),p(g.mData.type,x),p(g.mData.filter,x)):m?(g._setter||(g._setter=da(g.mData)),
40
+ g._setter(d,l)):d[h]=l;h++};if(f)for(;f;){var v=f.nodeName.toUpperCase();if("TD"==v||"TH"==v)t(f),e.push(f);f=f.nextSibling}else for(e=b.anCells,f=0,v=e.length;f<v;f++)t(e[f]);(b=b.firstChild?b:b.nTr)&&(b=b.getAttribute("id"))&&da(a.rowId)(d,b);return{data:d,cells:e}}function Za(a,b,c,d){var e=a.aoData[b],f=e._aData,g=[],h,l;if(null===e.nTr){var n=c||z.createElement("tr");e.nTr=n;e.anCells=g;n._DT_RowIndex=b;cb(a,e);var m=0;for(h=a.aoColumns.length;m<h;m++){var p=a.aoColumns[m];e=(l=c?!1:!0)?z.createElement(p.sCellType):
41
+ d[m];e._DT_CellIndex={row:b,column:m};g.push(e);if(l||!(!p.mRender&&p.mData===m||k.isPlainObject(p.mData)&&p.mData._===m+".display"))e.innerHTML=S(a,b,m,"display");p.sClass&&(e.className+=" "+p.sClass);p.bVisible&&!c?n.appendChild(e):!p.bVisible&&c&&e.parentNode.removeChild(e);p.fnCreatedCell&&p.fnCreatedCell.call(a.oInstance,e,S(a,b,m),f,b,m)}H(a,"aoRowCreatedCallback",null,[n,f,b,g])}}function cb(a,b){var c=b.nTr,d=b._aData;if(c){if(a=a.rowIdFn(d))c.id=a;d.DT_RowClass&&(a=d.DT_RowClass.split(" "),
42
+ b.__rowc=b.__rowc?Ja(b.__rowc.concat(a)):a,k(c).removeClass(b.__rowc.join(" ")).addClass(d.DT_RowClass));d.DT_RowAttr&&k(c).attr(d.DT_RowAttr);d.DT_RowData&&k(c).data(d.DT_RowData)}}function Eb(a){var b,c,d=a.nTHead,e=a.nTFoot,f=0===k("th, td",d).length,g=a.oClasses,h=a.aoColumns;f&&(c=k("<tr/>").appendTo(d));var l=0;for(b=h.length;l<b;l++){var n=h[l];var m=k(n.nTh).addClass(n.sClass);f&&m.appendTo(c);a.oFeatures.bSort&&(m.addClass(n.sSortingClass),!1!==n.bSortable&&(m.attr("tabindex",a.iTabIndex).attr("aria-controls",
43
+ a.sTableId),db(a,n.nTh,l)));n.sTitle!=m[0].innerHTML&&m.html(n.sTitle);eb(a,"header")(a,m,n,g)}f&&wa(a.aoHeader,d);k(d).children("tr").attr("role","row");k(d).children("tr").children("th, td").addClass(g.sHeaderTH);k(e).children("tr").children("th, td").addClass(g.sFooterTH);if(null!==e)for(a=a.aoFooter[0],l=0,b=a.length;l<b;l++)n=h[l],n.nTf=a[l].cell,n.sClass&&k(n.nTf).addClass(n.sClass)}function xa(a,b,c){var d,e,f=[],g=[],h=a.aoColumns.length;if(b){c===q&&(c=!1);var l=0;for(d=b.length;l<d;l++){f[l]=
44
+ b[l].slice();f[l].nTr=b[l].nTr;for(e=h-1;0<=e;e--)a.aoColumns[e].bVisible||c||f[l].splice(e,1);g.push([])}l=0;for(d=f.length;l<d;l++){if(a=f[l].nTr)for(;e=a.firstChild;)a.removeChild(e);e=0;for(b=f[l].length;e<b;e++){var n=h=1;if(g[l][e]===q){a.appendChild(f[l][e].cell);for(g[l][e]=1;f[l+h]!==q&&f[l][e].cell==f[l+h][e].cell;)g[l+h][e]=1,h++;for(;f[l][e+n]!==q&&f[l][e].cell==f[l][e+n].cell;){for(c=0;c<h;c++)g[l+c][e+n]=1;n++}k(f[l][e].cell).attr("rowspan",h).attr("colspan",n)}}}}}function fa(a){var b=
45
+ H(a,"aoPreDrawCallback","preDraw",[a]);if(-1!==k.inArray(!1,b))U(a,!1);else{b=[];var c=0,d=a.asStripeClasses,e=d.length,f=a.oLanguage,g=a.iInitDisplayStart,h="ssp"==P(a),l=a.aiDisplay;a.bDrawing=!0;g!==q&&-1!==g&&(a._iDisplayStart=h?g:g>=a.fnRecordsDisplay()?0:g,a.iInitDisplayStart=-1);g=a._iDisplayStart;var n=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,U(a,!1);else if(!h)a.iDraw++;else if(!a.bDestroying&&!Fb(a))return;if(0!==l.length)for(f=h?a.aoData.length:n,h=h?0:g;h<f;h++){var m=
46
+ l[h],p=a.aoData[m];null===p.nTr&&Za(a,m);var t=p.nTr;if(0!==e){var v=d[c%e];p._sRowStripe!=v&&(k(t).removeClass(p._sRowStripe).addClass(v),p._sRowStripe=v)}H(a,"aoRowCallback",null,[t,p._aData,c,h,m]);b.push(t);c++}else c=f.sZeroRecords,1==a.iDraw&&"ajax"==P(a)?c=f.sLoadingRecords:f.sEmptyTable&&0===a.fnRecordsTotal()&&(c=f.sEmptyTable),b[0]=k("<tr/>",{"class":e?d[0]:""}).append(k("<td />",{valign:"top",colSpan:na(a),"class":a.oClasses.sRowEmpty}).html(c))[0];H(a,"aoHeaderCallback","header",[k(a.nTHead).children("tr")[0],
47
+ bb(a),g,n,l]);H(a,"aoFooterCallback","footer",[k(a.nTFoot).children("tr")[0],bb(a),g,n,l]);d=k(a.nTBody);d.children().detach();d.append(k(b));H(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function ja(a,b){var c=a.oFeatures,d=c.bFilter;c.bSort&&Gb(a);d?ya(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;fa(a);a._drawHold=!1}function Hb(a){var b=a.oClasses,c=k(a.nTable);c=k("<div/>").insertBefore(c);var d=a.oFeatures,
48
+ e=k("<div/>",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=e[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var f=a.sDom.split(""),g,h,l,n,m,p,t=0;t<f.length;t++){g=null;h=f[t];if("<"==h){l=k("<div/>")[0];n=f[t+1];if("'"==n||'"'==n){m="";for(p=2;f[t+p]!=n;)m+=f[t+p],p++;"H"==m?m=b.sJUIHeader:"F"==m&&(m=b.sJUIFooter);-1!=m.indexOf(".")?(n=m.split("."),l.id=n[0].substr(1,n[0].length-1),l.className=n[1]):"#"==m.charAt(0)?l.id=m.substr(1,
49
+ m.length-1):l.className=m;t+=p}e.append(l);e=k(l)}else if(">"==h)e=e.parent();else if("l"==h&&d.bPaginate&&d.bLengthChange)g=Ib(a);else if("f"==h&&d.bFilter)g=Jb(a);else if("r"==h&&d.bProcessing)g=Kb(a);else if("t"==h)g=Lb(a);else if("i"==h&&d.bInfo)g=Mb(a);else if("p"==h&&d.bPaginate)g=Nb(a);else if(0!==u.ext.feature.length)for(l=u.ext.feature,p=0,n=l.length;p<n;p++)if(h==l[p].cFeature){g=l[p].fnInit(a);break}g&&(l=a.aanFeatures,l[h]||(l[h]=[]),l[h].push(g),e.append(g))}c.replaceWith(e);a.nHolding=
50
+ null}function wa(a,b){b=k(b).children("tr");var c,d,e;a.splice(0,a.length);var f=0;for(e=b.length;f<e;f++)a.push([]);f=0;for(e=b.length;f<e;f++){var g=b[f];for(c=g.firstChild;c;){if("TD"==c.nodeName.toUpperCase()||"TH"==c.nodeName.toUpperCase()){var h=1*c.getAttribute("colspan");var l=1*c.getAttribute("rowspan");h=h&&0!==h&&1!==h?h:1;l=l&&0!==l&&1!==l?l:1;var n=0;for(d=a[f];d[n];)n++;var m=n;var p=1===h?!0:!1;for(d=0;d<h;d++)for(n=0;n<l;n++)a[f+n][m+d]={cell:c,unique:p},a[f+n].nTr=g}c=c.nextSibling}}}
51
+ function Ka(a,b,c){var d=[];c||(c=a.aoHeader,b&&(c=[],wa(c,b)));b=0;for(var e=c.length;b<e;b++)for(var f=0,g=c[b].length;f<g;f++)!c[b][f].unique||d[f]&&a.bSortCellsTop||(d[f]=c[b][f].cell);return d}function La(a,b,c){H(a,"aoServerParams","serverParams",[b]);if(b&&Array.isArray(b)){var d={},e=/(.*?)\[\]$/;k.each(b,function(m,p){(m=p.name.match(e))?(m=m[0],d[m]||(d[m]=[]),d[m].push(p.value)):d[p.name]=p.value});b=d}var f=a.ajax,g=a.oInstance,h=function(m){H(a,null,"xhr",[a,m,a.jqXHR]);c(m)};if(k.isPlainObject(f)&&
52
+ f.data){var l=f.data;var n="function"===typeof l?l(b,a):l;b="function"===typeof l&&n?n:k.extend(!0,b,n);delete f.data}n={data:b,success:function(m){var p=m.error||m.sError;p&&aa(a,0,p);a.json=m;h(m)},dataType:"json",cache:!1,type:a.sServerMethod,error:function(m,p,t){t=H(a,null,"xhr",[a,null,a.jqXHR]);-1===k.inArray(!0,t)&&("parsererror"==p?aa(a,0,"Invalid JSON response",1):4===m.readyState&&aa(a,0,"Ajax error",7));U(a,!1)}};a.oAjaxData=b;H(a,null,"preXhr",[a,b]);a.fnServerData?a.fnServerData.call(g,
53
+ a.sAjaxSource,k.map(b,function(m,p){return{name:p,value:m}}),h,a):a.sAjaxSource||"string"===typeof f?a.jqXHR=k.ajax(k.extend(n,{url:f||a.sAjaxSource})):"function"===typeof f?a.jqXHR=f.call(g,b,h,a):(a.jqXHR=k.ajax(k.extend(n,f)),f.data=l)}function Fb(a){return a.bAjaxDataGet?(a.iDraw++,U(a,!0),La(a,Ob(a),function(b){Pb(a,b)}),!1):!0}function Ob(a){var b=a.aoColumns,c=b.length,d=a.oFeatures,e=a.oPreviousSearch,f=a.aoPreSearchCols,g=[],h=pa(a);var l=a._iDisplayStart;var n=!1!==d.bPaginate?a._iDisplayLength:
54
+ -1;var m=function(x,r){g.push({name:x,value:r})};m("sEcho",a.iDraw);m("iColumns",c);m("sColumns",T(b,"sName").join(","));m("iDisplayStart",l);m("iDisplayLength",n);var p={draw:a.iDraw,columns:[],order:[],start:l,length:n,search:{value:e.sSearch,regex:e.bRegex}};for(l=0;l<c;l++){var t=b[l];var v=f[l];n="function"==typeof t.mData?"function":t.mData;p.columns.push({data:n,name:t.sName,searchable:t.bSearchable,orderable:t.bSortable,search:{value:v.sSearch,regex:v.bRegex}});m("mDataProp_"+l,n);d.bFilter&&
55
+ (m("sSearch_"+l,v.sSearch),m("bRegex_"+l,v.bRegex),m("bSearchable_"+l,t.bSearchable));d.bSort&&m("bSortable_"+l,t.bSortable)}d.bFilter&&(m("sSearch",e.sSearch),m("bRegex",e.bRegex));d.bSort&&(k.each(h,function(x,r){p.order.push({column:r.col,dir:r.dir});m("iSortCol_"+x,r.col);m("sSortDir_"+x,r.dir)}),m("iSortingCols",h.length));b=u.ext.legacy.ajax;return null===b?a.sAjaxSource?g:p:b?g:p}function Pb(a,b){var c=function(g,h){return b[g]!==q?b[g]:b[h]},d=Ma(a,b),e=c("sEcho","draw"),f=c("iTotalRecords",
56
+ "recordsTotal");c=c("iTotalDisplayRecords","recordsFiltered");if(e!==q){if(1*e<a.iDraw)return;a.iDraw=1*e}Ha(a);a._iRecordsTotal=parseInt(f,10);a._iRecordsDisplay=parseInt(c,10);e=0;for(f=d.length;e<f;e++)ea(a,d[e]);a.aiDisplay=a.aiDisplayMaster.slice();a.bAjaxDataGet=!1;fa(a);a._bInitComplete||Na(a,b);a.bAjaxDataGet=!0;U(a,!1)}function Ma(a,b){a=k.isPlainObject(a.ajax)&&a.ajax.dataSrc!==q?a.ajax.dataSrc:a.sAjaxDataProp;return"data"===a?b.aaData||b[a]:""!==a?ia(a)(b):b}function Jb(a){var b=a.oClasses,
57
+ c=a.sTableId,d=a.oLanguage,e=a.oPreviousSearch,f=a.aanFeatures,g='<input type="search" class="'+b.sFilterInput+'"/>',h=d.sSearch;h=h.match(/_INPUT_/)?h.replace("_INPUT_",g):h+g;b=k("<div/>",{id:f.f?null:c+"_filter","class":b.sFilter}).append(k("<label/>").append(h));var l=function(){var m=this.value?this.value:"";m!=e.sSearch&&(ya(a,{sSearch:m,bRegex:e.bRegex,bSmart:e.bSmart,bCaseInsensitive:e.bCaseInsensitive}),a._iDisplayStart=0,fa(a))};f=null!==a.searchDelay?a.searchDelay:"ssp"===P(a)?400:0;var n=
58
+ k("input",b).val(e.sSearch).attr("placeholder",d.sSearchPlaceholder).on("keyup.DT search.DT input.DT paste.DT cut.DT",f?fb(l,f):l).on("mouseup",function(m){setTimeout(function(){l.call(n[0])},10)}).on("keypress.DT",function(m){if(13==m.keyCode)return!1}).attr("aria-controls",c);k(a.nTable).on("search.dt.DT",function(m,p){if(a===p)try{n[0]!==z.activeElement&&n.val(e.sSearch)}catch(t){}});return b[0]}function ya(a,b,c){var d=a.oPreviousSearch,e=a.aoPreSearchCols,f=function(h){d.sSearch=h.sSearch;d.bRegex=
59
+ h.bRegex;d.bSmart=h.bSmart;d.bCaseInsensitive=h.bCaseInsensitive},g=function(h){return h.bEscapeRegex!==q?!h.bEscapeRegex:h.bRegex};Ya(a);if("ssp"!=P(a)){Qb(a,b.sSearch,c,g(b),b.bSmart,b.bCaseInsensitive);f(b);for(b=0;b<e.length;b++)Rb(a,e[b].sSearch,b,g(e[b]),e[b].bSmart,e[b].bCaseInsensitive);Sb(a)}else f(b);a.bFiltered=!0;H(a,null,"search",[a])}function Sb(a){for(var b=u.ext.search,c=a.aiDisplay,d,e,f=0,g=b.length;f<g;f++){for(var h=[],l=0,n=c.length;l<n;l++)e=c[l],d=a.aoData[e],b[f](a,d._aFilterData,
60
+ e,d._aData,l)&&h.push(e);c.length=0;k.merge(c,h)}}function Rb(a,b,c,d,e,f){if(""!==b){var g=[],h=a.aiDisplay;d=gb(b,d,e,f);for(e=0;e<h.length;e++)b=a.aoData[h[e]]._aFilterData[c],d.test(b)&&g.push(h[e]);a.aiDisplay=g}}function Qb(a,b,c,d,e,f){e=gb(b,d,e,f);var g=a.oPreviousSearch.sSearch,h=a.aiDisplayMaster;f=[];0!==u.ext.search.length&&(c=!0);var l=Tb(a);if(0>=b.length)a.aiDisplay=h.slice();else{if(l||c||d||g.length>b.length||0!==b.indexOf(g)||a.bSorted)a.aiDisplay=h.slice();b=a.aiDisplay;for(c=
61
+ 0;c<b.length;c++)e.test(a.aoData[b[c]]._sFilterRow)&&f.push(b[c]);a.aiDisplay=f}}function gb(a,b,c,d){a=b?a:hb(a);c&&(a="^(?=.*?"+k.map(a.match(/"[^"]+"|[^ ]+/g)||[""],function(e){if('"'===e.charAt(0)){var f=e.match(/^"(.*)"$/);e=f?f[1]:e}return e.replace('"',"")}).join(")(?=.*?")+").*$");return new RegExp(a,d?"i":"")}function Tb(a){var b=a.aoColumns,c,d,e=u.ext.type.search;var f=!1;var g=0;for(c=a.aoData.length;g<c;g++){var h=a.aoData[g];if(!h._aFilterData){var l=[];var n=0;for(d=b.length;n<d;n++){f=
62
+ b[n];if(f.bSearchable){var m=S(a,g,n,"filter");e[f.sType]&&(m=e[f.sType](m));null===m&&(m="");"string"!==typeof m&&m.toString&&(m=m.toString())}else m="";m.indexOf&&-1!==m.indexOf("&")&&(Oa.innerHTML=m,m=rc?Oa.textContent:Oa.innerText);m.replace&&(m=m.replace(/[\r\n\u2028]/g,""));l.push(m)}h._aFilterData=l;h._sFilterRow=l.join(" ");f=!0}}return f}function Ub(a){return{search:a.sSearch,smart:a.bSmart,regex:a.bRegex,caseInsensitive:a.bCaseInsensitive}}function Vb(a){return{sSearch:a.search,bSmart:a.smart,
63
+ bRegex:a.regex,bCaseInsensitive:a.caseInsensitive}}function Mb(a){var b=a.sTableId,c=a.aanFeatures.i,d=k("<div/>",{"class":a.oClasses.sInfo,id:c?null:b+"_info"});c||(a.aoDrawCallback.push({fn:Wb,sName:"information"}),d.attr("role","status").attr("aria-live","polite"),k(a.nTable).attr("aria-describedby",b+"_info"));return d[0]}function Wb(a){var b=a.aanFeatures.i;if(0!==b.length){var c=a.oLanguage,d=a._iDisplayStart+1,e=a.fnDisplayEnd(),f=a.fnRecordsTotal(),g=a.fnRecordsDisplay(),h=g?c.sInfo:c.sInfoEmpty;
64
+ g!==f&&(h+=" "+c.sInfoFiltered);h+=c.sInfoPostFix;h=Xb(a,h);c=c.fnInfoCallback;null!==c&&(h=c.call(a.oInstance,a,d,e,f,g,h));k(b).html(h)}}function Xb(a,b){var c=a.fnFormatNumber,d=a._iDisplayStart+1,e=a._iDisplayLength,f=a.fnRecordsDisplay(),g=-1===e;return b.replace(/_START_/g,c.call(a,d)).replace(/_END_/g,c.call(a,a.fnDisplayEnd())).replace(/_MAX_/g,c.call(a,a.fnRecordsTotal())).replace(/_TOTAL_/g,c.call(a,f)).replace(/_PAGE_/g,c.call(a,g?1:Math.ceil(d/e))).replace(/_PAGES_/g,c.call(a,g?1:Math.ceil(f/
65
+ e)))}function za(a){var b=a.iInitDisplayStart,c=a.aoColumns;var d=a.oFeatures;var e=a.bDeferLoading;if(a.bInitialised){Hb(a);Eb(a);xa(a,a.aoHeader);xa(a,a.aoFooter);U(a,!0);d.bAutoWidth&&Xa(a);var f=0;for(d=c.length;f<d;f++){var g=c[f];g.sWidth&&(g.nTh.style.width=K(g.sWidth))}H(a,null,"preInit",[a]);ja(a);c=P(a);if("ssp"!=c||e)"ajax"==c?La(a,[],function(h){var l=Ma(a,h);for(f=0;f<l.length;f++)ea(a,l[f]);a.iInitDisplayStart=b;ja(a);U(a,!1);Na(a,h)},a):(U(a,!1),Na(a))}else setTimeout(function(){za(a)},
66
+ 200)}function Na(a,b){a._bInitComplete=!0;(b||a.oInit.aaData)&&ra(a);H(a,null,"plugin-init",[a,b]);H(a,"aoInitComplete","init",[a,b])}function ib(a,b){b=parseInt(b,10);a._iDisplayLength=b;jb(a);H(a,null,"length",[a,b])}function Ib(a){var b=a.oClasses,c=a.sTableId,d=a.aLengthMenu,e=Array.isArray(d[0]),f=e?d[0]:d;d=e?d[1]:d;e=k("<select/>",{name:c+"_length","aria-controls":c,"class":b.sLengthSelect});for(var g=0,h=f.length;g<h;g++)e[0][g]=new Option("number"===typeof d[g]?a.fnFormatNumber(d[g]):d[g],
67
+ f[g]);var l=k("<div><label/></div>").addClass(b.sLength);a.aanFeatures.l||(l[0].id=c+"_length");l.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",e[0].outerHTML));k("select",l).val(a._iDisplayLength).on("change.DT",function(n){ib(a,k(this).val());fa(a)});k(a.nTable).on("length.dt.DT",function(n,m,p){a===m&&k("select",l).val(p)});return l[0]}function Nb(a){var b=a.sPaginationType,c=u.ext.pager[b],d="function"===typeof c,e=function(g){fa(g)};b=k("<div/>").addClass(a.oClasses.sPaging+b)[0];
68
+ var f=a.aanFeatures;d||c.fnInit(a,b,e);f.p||(b.id=a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(g){if(d){var h=g._iDisplayStart,l=g._iDisplayLength,n=g.fnRecordsDisplay(),m=-1===l;h=m?0:Math.ceil(h/l);l=m?1:Math.ceil(n/l);n=c(h,l);var p;m=0;for(p=f.p.length;m<p;m++)eb(g,"pageButton")(g,f.p[m],m,n,h,l)}else c.fnUpdate(g,e)},sName:"pagination"}));return b}function kb(a,b,c){var d=a._iDisplayStart,e=a._iDisplayLength,f=a.fnRecordsDisplay();0===f||-1===e?d=0:"number"===typeof b?(d=b*e,d>f&&
69
+ (d=0)):"first"==b?d=0:"previous"==b?(d=0<=e?d-e:0,0>d&&(d=0)):"next"==b?d+e<f&&(d+=e):"last"==b?d=Math.floor((f-1)/e)*e:aa(a,0,"Unknown paging action: "+b,5);b=a._iDisplayStart!==d;a._iDisplayStart=d;b&&(H(a,null,"page",[a]),c&&fa(a));return b}function Kb(a){return k("<div/>",{id:a.aanFeatures.r?null:a.sTableId+"_processing","class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function U(a,b){a.oFeatures.bProcessing&&k(a.aanFeatures.r).css("display",b?"block":"none");
70
+ H(a,null,"processing",[a,b])}function Lb(a){var b=k(a.nTable);b.attr("role","grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var d=c.sX,e=c.sY,f=a.oClasses,g=b.children("caption"),h=g.length?g[0]._captionSide:null,l=k(b[0].cloneNode(!1)),n=k(b[0].cloneNode(!1)),m=b.children("tfoot");m.length||(m=null);l=k("<div/>",{"class":f.sScrollWrapper}).append(k("<div/>",{"class":f.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:d?d?K(d):null:"100%"}).append(k("<div/>",
71
+ {"class":f.sScrollHeadInner}).css({"box-sizing":"content-box",width:c.sXInner||"100%"}).append(l.removeAttr("id").css("margin-left",0).append("top"===h?g:null).append(b.children("thead"))))).append(k("<div/>",{"class":f.sScrollBody}).css({position:"relative",overflow:"auto",width:d?K(d):null}).append(b));m&&l.append(k("<div/>",{"class":f.sScrollFoot}).css({overflow:"hidden",border:0,width:d?d?K(d):null:"100%"}).append(k("<div/>",{"class":f.sScrollFootInner}).append(n.removeAttr("id").css("margin-left",
72
+ 0).append("bottom"===h?g:null).append(b.children("tfoot")))));b=l.children();var p=b[0];f=b[1];var t=m?b[2]:null;if(d)k(f).on("scroll.DT",function(v){v=this.scrollLeft;p.scrollLeft=v;m&&(t.scrollLeft=v)});k(f).css("max-height",e);c.bCollapse||k(f).css("height",e);a.nScrollHead=p;a.nScrollBody=f;a.nScrollFoot=t;a.aoDrawCallback.push({fn:Ea,sName:"scrolling"});return l[0]}function Ea(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY;b=b.iBarWidth;var f=k(a.nScrollHead),g=f[0].style,h=f.children("div"),l=
73
+ h[0].style,n=h.children("table");h=a.nScrollBody;var m=k(h),p=h.style,t=k(a.nScrollFoot).children("div"),v=t.children("table"),x=k(a.nTHead),r=k(a.nTable),A=r[0],E=A.style,I=a.nTFoot?k(a.nTFoot):null,W=a.oBrowser,M=W.bScrollOversize,C=T(a.aoColumns,"nTh"),B=[],ba=[],X=[],lb=[],Aa,Yb=function(F){F=F.style;F.paddingTop="0";F.paddingBottom="0";F.borderTopWidth="0";F.borderBottomWidth="0";F.height=0};var ha=h.scrollHeight>h.clientHeight;if(a.scrollBarVis!==ha&&a.scrollBarVis!==q)a.scrollBarVis=ha,ra(a);
74
+ else{a.scrollBarVis=ha;r.children("thead, tfoot").remove();if(I){var ka=I.clone().prependTo(r);var la=I.find("tr");ka=ka.find("tr")}var mb=x.clone().prependTo(r);x=x.find("tr");ha=mb.find("tr");mb.find("th, td").removeAttr("tabindex");c||(p.width="100%",f[0].style.width="100%");k.each(Ka(a,mb),function(F,Y){Aa=sa(a,F);Y.style.width=a.aoColumns[Aa].sWidth});I&&Z(function(F){F.style.width=""},ka);f=r.outerWidth();""===c?(E.width="100%",M&&(r.find("tbody").height()>h.offsetHeight||"scroll"==m.css("overflow-y"))&&
75
+ (E.width=K(r.outerWidth()-b)),f=r.outerWidth()):""!==d&&(E.width=K(d),f=r.outerWidth());Z(Yb,ha);Z(function(F){X.push(F.innerHTML);B.push(K(k(F).css("width")))},ha);Z(function(F,Y){-1!==k.inArray(F,C)&&(F.style.width=B[Y])},x);k(ha).height(0);I&&(Z(Yb,ka),Z(function(F){lb.push(F.innerHTML);ba.push(K(k(F).css("width")))},ka),Z(function(F,Y){F.style.width=ba[Y]},la),k(ka).height(0));Z(function(F,Y){F.innerHTML='<div class="dataTables_sizing">'+X[Y]+"</div>";F.childNodes[0].style.height="0";F.childNodes[0].style.overflow=
76
+ "hidden";F.style.width=B[Y]},ha);I&&Z(function(F,Y){F.innerHTML='<div class="dataTables_sizing">'+lb[Y]+"</div>";F.childNodes[0].style.height="0";F.childNodes[0].style.overflow="hidden";F.style.width=ba[Y]},ka);r.outerWidth()<f?(la=h.scrollHeight>h.offsetHeight||"scroll"==m.css("overflow-y")?f+b:f,M&&(h.scrollHeight>h.offsetHeight||"scroll"==m.css("overflow-y"))&&(E.width=K(la-b)),""!==c&&""===d||aa(a,1,"Possible column misalignment",6)):la="100%";p.width=K(la);g.width=K(la);I&&(a.nScrollFoot.style.width=
77
+ K(la));!e&&M&&(p.height=K(A.offsetHeight+b));c=r.outerWidth();n[0].style.width=K(c);l.width=K(c);d=r.height()>h.clientHeight||"scroll"==m.css("overflow-y");e="padding"+(W.bScrollbarLeft?"Left":"Right");l[e]=d?b+"px":"0px";I&&(v[0].style.width=K(c),t[0].style.width=K(c),t[0].style[e]=d?b+"px":"0px");r.children("colgroup").insertBefore(r.children("thead"));m.trigger("scroll");!a.bSorted&&!a.bFiltered||a._drawHold||(h.scrollTop=0)}}function Z(a,b,c){for(var d=0,e=0,f=b.length,g,h;e<f;){g=b[e].firstChild;
78
+ for(h=c?c[e].firstChild:null;g;)1===g.nodeType&&(c?a(g,h,d):a(g,d),d++),g=g.nextSibling,h=c?h.nextSibling:null;e++}}function Xa(a){var b=a.nTable,c=a.aoColumns,d=a.oScroll,e=d.sY,f=d.sX,g=d.sXInner,h=c.length,l=Fa(a,"bVisible"),n=k("th",a.nTHead),m=b.getAttribute("width"),p=b.parentNode,t=!1,v,x=a.oBrowser;d=x.bScrollOversize;(v=b.style.width)&&-1!==v.indexOf("%")&&(m=v);for(v=0;v<l.length;v++){var r=c[l[v]];null!==r.sWidth&&(r.sWidth=Zb(r.sWidthOrig,p),t=!0)}if(d||!t&&!f&&!e&&h==na(a)&&h==n.length)for(v=
79
+ 0;v<h;v++)l=sa(a,v),null!==l&&(c[l].sWidth=K(n.eq(v).width()));else{h=k(b).clone().css("visibility","hidden").removeAttr("id");h.find("tbody tr").remove();var A=k("<tr/>").appendTo(h.find("tbody"));h.find("thead, tfoot").remove();h.append(k(a.nTHead).clone()).append(k(a.nTFoot).clone());h.find("tfoot th, tfoot td").css("width","");n=Ka(a,h.find("thead")[0]);for(v=0;v<l.length;v++)r=c[l[v]],n[v].style.width=null!==r.sWidthOrig&&""!==r.sWidthOrig?K(r.sWidthOrig):"",r.sWidthOrig&&f&&k(n[v]).append(k("<div/>").css({width:r.sWidthOrig,
80
+ margin:0,padding:0,border:0,height:1}));if(a.aoData.length)for(v=0;v<l.length;v++)t=l[v],r=c[t],k($b(a,t)).clone(!1).append(r.sContentPadding).appendTo(A);k("[name]",h).removeAttr("name");r=k("<div/>").css(f||e?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(h).appendTo(p);f&&g?h.width(g):f?(h.css("width","auto"),h.removeAttr("width"),h.width()<p.clientWidth&&m&&h.width(p.clientWidth)):e?h.width(p.clientWidth):m&&h.width(m);for(v=e=0;v<l.length;v++)p=k(n[v]),g=p.outerWidth()-
81
+ p.width(),p=x.bBounding?Math.ceil(n[v].getBoundingClientRect().width):p.outerWidth(),e+=p,c[l[v]].sWidth=K(p-g);b.style.width=K(e);r.remove()}m&&(b.style.width=K(m));!m&&!f||a._reszEvt||(b=function(){k(y).on("resize.DT-"+a.sInstance,fb(function(){ra(a)}))},d?setTimeout(b,1E3):b(),a._reszEvt=!0)}function Zb(a,b){if(!a)return 0;a=k("<div/>").css("width",K(a)).appendTo(b||z.body);b=a[0].offsetWidth;a.remove();return b}function $b(a,b){var c=ac(a,b);if(0>c)return null;var d=a.aoData[c];return d.nTr?d.anCells[b]:
82
+ k("<td/>").html(S(a,c,b,"display"))[0]}function ac(a,b){for(var c,d=-1,e=-1,f=0,g=a.aoData.length;f<g;f++)c=S(a,f,b,"display")+"",c=c.replace(sc,""),c=c.replace(/&nbsp;/g," "),c.length>d&&(d=c.length,e=f);return e}function K(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function pa(a){var b=[],c=a.aoColumns;var d=a.aaSortingFixed;var e=k.isPlainObject(d);var f=[];var g=function(m){m.length&&!Array.isArray(m[0])?f.push(m):k.merge(f,m)};Array.isArray(d)&&g(d);
83
+ e&&d.pre&&g(d.pre);g(a.aaSorting);e&&d.post&&g(d.post);for(a=0;a<f.length;a++){var h=f[a][0];g=c[h].aDataSort;d=0;for(e=g.length;d<e;d++){var l=g[d];var n=c[l].sType||"string";f[a]._idx===q&&(f[a]._idx=k.inArray(f[a][1],c[l].asSorting));b.push({src:h,col:l,dir:f[a][1],index:f[a]._idx,type:n,formatter:u.ext.type.order[n+"-pre"]})}}return b}function Gb(a){var b,c=[],d=u.ext.type.order,e=a.aoData,f=0,g=a.aiDisplayMaster;Ya(a);var h=pa(a);var l=0;for(b=h.length;l<b;l++){var n=h[l];n.formatter&&f++;bc(a,
84
+ n.col)}if("ssp"!=P(a)&&0!==h.length){l=0;for(b=g.length;l<b;l++)c[g[l]]=l;f===h.length?g.sort(function(m,p){var t,v=h.length,x=e[m]._aSortData,r=e[p]._aSortData;for(t=0;t<v;t++){var A=h[t];var E=x[A.col];var I=r[A.col];E=E<I?-1:E>I?1:0;if(0!==E)return"asc"===A.dir?E:-E}E=c[m];I=c[p];return E<I?-1:E>I?1:0}):g.sort(function(m,p){var t,v=h.length,x=e[m]._aSortData,r=e[p]._aSortData;for(t=0;t<v;t++){var A=h[t];var E=x[A.col];var I=r[A.col];A=d[A.type+"-"+A.dir]||d["string-"+A.dir];E=A(E,I);if(0!==E)return E}E=
85
+ c[m];I=c[p];return E<I?-1:E>I?1:0})}a.bSorted=!0}function cc(a){var b=a.aoColumns,c=pa(a);a=a.oLanguage.oAria;for(var d=0,e=b.length;d<e;d++){var f=b[d];var g=f.asSorting;var h=f.sTitle.replace(/<.*?>/g,"");var l=f.nTh;l.removeAttribute("aria-sort");f.bSortable&&(0<c.length&&c[0].col==d?(l.setAttribute("aria-sort","asc"==c[0].dir?"ascending":"descending"),f=g[c[0].index+1]||g[0]):f=g[0],h+="asc"===f?a.sSortAscending:a.sSortDescending);l.setAttribute("aria-label",h)}}function nb(a,b,c,d){var e=a.aaSorting,
86
+ f=a.aoColumns[b].asSorting,g=function(h,l){var n=h._idx;n===q&&(n=k.inArray(h[1],f));return n+1<f.length?n+1:l?null:0};"number"===typeof e[0]&&(e=a.aaSorting=[e]);c&&a.oFeatures.bSortMulti?(c=k.inArray(b,T(e,"0")),-1!==c?(b=g(e[c],!0),null===b&&1===e.length&&(b=0),null===b?e.splice(c,1):(e[c][1]=f[b],e[c]._idx=b)):(e.push([b,f[0],0]),e[e.length-1]._idx=0)):e.length&&e[0][0]==b?(b=g(e[0]),e.length=1,e[0][1]=f[b],e[0]._idx=b):(e.length=0,e.push([b,f[0]]),e[0]._idx=0);ja(a);"function"==typeof d&&d(a)}
87
+ function db(a,b,c,d){var e=a.aoColumns[c];ob(b,{},function(f){!1!==e.bSortable&&(a.oFeatures.bProcessing?(U(a,!0),setTimeout(function(){nb(a,c,f.shiftKey,d);"ssp"!==P(a)&&U(a,!1)},0)):nb(a,c,f.shiftKey,d))})}function Pa(a){var b=a.aLastSort,c=a.oClasses.sSortColumn,d=pa(a),e=a.oFeatures,f;if(e.bSort&&e.bSortClasses){e=0;for(f=b.length;e<f;e++){var g=b[e].src;k(T(a.aoData,"anCells",g)).removeClass(c+(2>e?e+1:3))}e=0;for(f=d.length;e<f;e++)g=d[e].src,k(T(a.aoData,"anCells",g)).addClass(c+(2>e?e+1:3))}a.aLastSort=
88
+ d}function bc(a,b){var c=a.aoColumns[b],d=u.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,ta(a,b)));for(var f,g=u.ext.type.order[c.sType+"-pre"],h=0,l=a.aoData.length;h<l;h++)if(c=a.aoData[h],c._aSortData||(c._aSortData=[]),!c._aSortData[b]||d)f=d?e[h]:S(a,h,b,"sort"),c._aSortData[b]=g?g(f):f}function Qa(a){if(a.oFeatures.bStateSave&&!a.bDestroying){var b={time:+new Date,start:a._iDisplayStart,length:a._iDisplayLength,order:k.extend(!0,[],a.aaSorting),search:Ub(a.oPreviousSearch),columns:k.map(a.aoColumns,
89
+ function(c,d){return{visible:c.bVisible,search:Ub(a.aoPreSearchCols[d])}})};H(a,"aoStateSaveParams","stateSaveParams",[a,b]);a.oSavedState=b;a.fnStateSaveCallback.call(a.oInstance,a,b)}}function dc(a,b,c){var d,e,f=a.aoColumns;b=function(h){if(h&&h.time){var l=H(a,"aoStateLoadParams","stateLoadParams",[a,h]);if(-1===k.inArray(!1,l)&&(l=a.iStateDuration,!(0<l&&h.time<+new Date-1E3*l||h.columns&&f.length!==h.columns.length))){a.oLoadedState=k.extend(!0,{},h);h.start!==q&&(a._iDisplayStart=h.start,a.iInitDisplayStart=
90
+ h.start);h.length!==q&&(a._iDisplayLength=h.length);h.order!==q&&(a.aaSorting=[],k.each(h.order,function(n,m){a.aaSorting.push(m[0]>=f.length?[0,m[1]]:m)}));h.search!==q&&k.extend(a.oPreviousSearch,Vb(h.search));if(h.columns)for(d=0,e=h.columns.length;d<e;d++)l=h.columns[d],l.visible!==q&&(f[d].bVisible=l.visible),l.search!==q&&k.extend(a.aoPreSearchCols[d],Vb(l.search));H(a,"aoStateLoaded","stateLoaded",[a,h])}}c()};if(a.oFeatures.bStateSave){var g=a.fnStateLoadCallback.call(a.oInstance,a,b);g!==
91
+ q&&b(g)}else c()}function Ra(a){var b=u.settings;a=k.inArray(a,T(b,"nTable"));return-1!==a?b[a]:null}function aa(a,b,c,d){c="DataTables warning: "+(a?"table id="+a.sTableId+" - ":"")+c;d&&(c+=". For more information about this error, please see http://datatables.net/tn/"+d);if(b)y.console&&console.log&&console.log(c);else if(b=u.ext,b=b.sErrMode||b.errMode,a&&H(a,null,"error",[a,d,c]),"alert"==b)alert(c);else{if("throw"==b)throw Error(c);"function"==typeof b&&b(a,d,c)}}function V(a,b,c,d){Array.isArray(c)?
92
+ k.each(c,function(e,f){Array.isArray(f)?V(a,b,f[0],f[1]):V(a,b,f)}):(d===q&&(d=c),b[c]!==q&&(a[d]=b[c]))}function pb(a,b,c){var d;for(d in b)if(b.hasOwnProperty(d)){var e=b[d];k.isPlainObject(e)?(k.isPlainObject(a[d])||(a[d]={}),k.extend(!0,a[d],e)):c&&"data"!==d&&"aaData"!==d&&Array.isArray(e)?a[d]=e.slice():a[d]=e}return a}function ob(a,b,c){k(a).on("click.DT",b,function(d){k(a).trigger("blur");c(d)}).on("keypress.DT",b,function(d){13===d.which&&(d.preventDefault(),c(d))}).on("selectstart.DT",function(){return!1})}
93
+ function Q(a,b,c,d){c&&a[b].push({fn:c,sName:d})}function H(a,b,c,d){var e=[];b&&(e=k.map(a[b].slice().reverse(),function(f,g){return f.fn.apply(a.oInstance,d)}));null!==c&&(b=k.Event(c+".dt"),k(a.nTable).trigger(b,d),e.push(b.result));return e}function jb(a){var b=a._iDisplayStart,c=a.fnDisplayEnd(),d=a._iDisplayLength;b>=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function eb(a,b){a=a.renderer;var c=u.ext.renderer[b];return k.isPlainObject(a)&&a[b]?c[a[b]]||c._:"string"===typeof a?c[a]||
94
+ c._:c._}function P(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function Ba(a,b){var c=ec.numbers_length,d=Math.floor(c/2);b<=c?a=qa(0,b):a<=d?(a=qa(0,c-2),a.push("ellipsis"),a.push(b-1)):(a>=b-1-d?a=qa(b-(c-2),b):(a=qa(a-d+2,a+d-1),a.push("ellipsis"),a.push(b-1)),a.splice(0,0,"ellipsis"),a.splice(0,0,0));a.DT_el="span";return a}function Va(a){k.each({num:function(b){return Sa(b,a)},"num-fmt":function(b){return Sa(b,a,qb)},"html-num":function(b){return Sa(b,a,Ta)},"html-num-fmt":function(b){return Sa(b,
95
+ a,Ta,qb)}},function(b,c){L.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(L.type.search[b+a]=L.type.search.html)})}function fc(a){return function(){var b=[Ra(this[u.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return u.ext.internal[a].apply(this,b)}}var u=function(a){this.$=function(f,g){return this.api(!0).$(f,g)};this._=function(f,g){return this.api(!0).rows(f,g).data()};this.api=function(f){return f?new D(Ra(this[L.iApiIndex])):new D(this)};this.fnAddData=function(f,g){var h=this.api(!0);
96
+ f=Array.isArray(f)&&(Array.isArray(f[0])||k.isPlainObject(f[0]))?h.rows.add(f):h.row.add(f);(g===q||g)&&h.draw();return f.flatten().toArray()};this.fnAdjustColumnSizing=function(f){var g=this.api(!0).columns.adjust(),h=g.settings()[0],l=h.oScroll;f===q||f?g.draw(!1):(""!==l.sX||""!==l.sY)&&Ea(h)};this.fnClearTable=function(f){var g=this.api(!0).clear();(f===q||f)&&g.draw()};this.fnClose=function(f){this.api(!0).row(f).child.hide()};this.fnDeleteRow=function(f,g,h){var l=this.api(!0);f=l.rows(f);var n=
97
+ f.settings()[0],m=n.aoData[f[0][0]];f.remove();g&&g.call(this,n,m);(h===q||h)&&l.draw();return m};this.fnDestroy=function(f){this.api(!0).destroy(f)};this.fnDraw=function(f){this.api(!0).draw(f)};this.fnFilter=function(f,g,h,l,n,m){n=this.api(!0);null===g||g===q?n.search(f,h,l,m):n.column(g).search(f,h,l,m);n.draw()};this.fnGetData=function(f,g){var h=this.api(!0);if(f!==q){var l=f.nodeName?f.nodeName.toLowerCase():"";return g!==q||"td"==l||"th"==l?h.cell(f,g).data():h.row(f).data()||null}return h.data().toArray()};
98
+ this.fnGetNodes=function(f){var g=this.api(!0);return f!==q?g.row(f).node():g.rows().nodes().flatten().toArray()};this.fnGetPosition=function(f){var g=this.api(!0),h=f.nodeName.toUpperCase();return"TR"==h?g.row(f).index():"TD"==h||"TH"==h?(f=g.cell(f).index(),[f.row,f.columnVisible,f.column]):null};this.fnIsOpen=function(f){return this.api(!0).row(f).child.isShown()};this.fnOpen=function(f,g,h){return this.api(!0).row(f).child(g,h).show().child()[0]};this.fnPageChange=function(f,g){f=this.api(!0).page(f);
99
+ (g===q||g)&&f.draw(!1)};this.fnSetColumnVis=function(f,g,h){f=this.api(!0).column(f).visible(g);(h===q||h)&&f.columns.adjust().draw()};this.fnSettings=function(){return Ra(this[L.iApiIndex])};this.fnSort=function(f){this.api(!0).order(f).draw()};this.fnSortListener=function(f,g,h){this.api(!0).order.listener(f,g,h)};this.fnUpdate=function(f,g,h,l,n){var m=this.api(!0);h===q||null===h?m.row(g).data(f):m.cell(g,h).data(f);(n===q||n)&&m.columns.adjust();(l===q||l)&&m.draw();return 0};this.fnVersionCheck=
100
+ L.fnVersionCheck;var b=this,c=a===q,d=this.length;c&&(a={});this.oApi=this.internal=L.internal;for(var e in u.ext.internal)e&&(this[e]=fc(e));this.each(function(){var f={},g=1<d?pb(f,a,!0):a,h=0,l;f=this.getAttribute("id");var n=!1,m=u.defaults,p=k(this);if("table"!=this.nodeName.toLowerCase())aa(null,0,"Non-table node initialisation ("+this.nodeName+")",2);else{yb(m);zb(m.column);O(m,m,!0);O(m.column,m.column,!0);O(m,k.extend(g,p.data()),!0);var t=u.settings;h=0;for(l=t.length;h<l;h++){var v=t[h];
101
+ if(v.nTable==this||v.nTHead&&v.nTHead.parentNode==this||v.nTFoot&&v.nTFoot.parentNode==this){var x=g.bRetrieve!==q?g.bRetrieve:m.bRetrieve;if(c||x)return v.oInstance;if(g.bDestroy!==q?g.bDestroy:m.bDestroy){v.oInstance.fnDestroy();break}else{aa(v,0,"Cannot reinitialise DataTable",3);return}}if(v.sTableId==this.id){t.splice(h,1);break}}if(null===f||""===f)this.id=f="DataTables_Table_"+u.ext._unique++;var r=k.extend(!0,{},u.models.oSettings,{sDestroyWidth:p[0].style.width,sInstance:f,sTableId:f});r.nTable=
102
+ this;r.oApi=b.internal;r.oInit=g;t.push(r);r.oInstance=1===b.length?b:p.dataTable();yb(g);ma(g.oLanguage);g.aLengthMenu&&!g.iDisplayLength&&(g.iDisplayLength=Array.isArray(g.aLengthMenu[0])?g.aLengthMenu[0][0]:g.aLengthMenu[0]);g=pb(k.extend(!0,{},m),g);V(r.oFeatures,g,"bPaginate bLengthChange bFilter bSort bSortMulti bInfo bProcessing bAutoWidth bSortClasses bServerSide bDeferRender".split(" "));V(r,g,["asStripeClasses","ajax","fnServerData","fnFormatNumber","sServerMethod","aaSorting","aaSortingFixed",
103
+ "aLengthMenu","sPaginationType","sAjaxSource","sAjaxDataProp","iStateDuration","sDom","bSortCellsTop","iTabIndex","fnStateLoadCallback","fnStateSaveCallback","renderer","searchDelay","rowId",["iCookieDuration","iStateDuration"],["oSearch","oPreviousSearch"],["aoSearchCols","aoPreSearchCols"],["iDisplayLength","_iDisplayLength"]]);V(r.oScroll,g,[["sScrollX","sX"],["sScrollXInner","sXInner"],["sScrollY","sY"],["bScrollCollapse","bCollapse"]]);V(r.oLanguage,g,"fnInfoCallback");Q(r,"aoDrawCallback",g.fnDrawCallback,
104
+ "user");Q(r,"aoServerParams",g.fnServerParams,"user");Q(r,"aoStateSaveParams",g.fnStateSaveParams,"user");Q(r,"aoStateLoadParams",g.fnStateLoadParams,"user");Q(r,"aoStateLoaded",g.fnStateLoaded,"user");Q(r,"aoRowCallback",g.fnRowCallback,"user");Q(r,"aoRowCreatedCallback",g.fnCreatedRow,"user");Q(r,"aoHeaderCallback",g.fnHeaderCallback,"user");Q(r,"aoFooterCallback",g.fnFooterCallback,"user");Q(r,"aoInitComplete",g.fnInitComplete,"user");Q(r,"aoPreDrawCallback",g.fnPreDrawCallback,"user");r.rowIdFn=
105
+ ia(g.rowId);Ab(r);var A=r.oClasses;k.extend(A,u.ext.classes,g.oClasses);p.addClass(A.sTable);r.iInitDisplayStart===q&&(r.iInitDisplayStart=g.iDisplayStart,r._iDisplayStart=g.iDisplayStart);null!==g.iDeferLoading&&(r.bDeferLoading=!0,f=Array.isArray(g.iDeferLoading),r._iRecordsDisplay=f?g.iDeferLoading[0]:g.iDeferLoading,r._iRecordsTotal=f?g.iDeferLoading[1]:g.iDeferLoading);var E=r.oLanguage;k.extend(!0,E,g.oLanguage);E.sUrl?(k.ajax({dataType:"json",url:E.sUrl,success:function(C){ma(C);O(m.oLanguage,
106
+ C);k.extend(!0,E,C);H(r,null,"i18n",[r]);za(r)},error:function(){za(r)}}),n=!0):H(r,null,"i18n",[r]);null===g.asStripeClasses&&(r.asStripeClasses=[A.sStripeOdd,A.sStripeEven]);f=r.asStripeClasses;var I=p.children("tbody").find("tr").eq(0);-1!==k.inArray(!0,k.map(f,function(C,B){return I.hasClass(C)}))&&(k("tbody tr",this).removeClass(f.join(" ")),r.asDestroyStripes=f.slice());f=[];t=this.getElementsByTagName("thead");0!==t.length&&(wa(r.aoHeader,t[0]),f=Ka(r));if(null===g.aoColumns)for(t=[],h=0,l=
107
+ f.length;h<l;h++)t.push(null);else t=g.aoColumns;h=0;for(l=t.length;h<l;h++)Wa(r,f?f[h]:null);Cb(r,g.aoColumnDefs,t,function(C,B){Da(r,C,B)});if(I.length){var W=function(C,B){return null!==C.getAttribute("data-"+B)?B:null};k(I[0]).children("th, td").each(function(C,B){var ba=r.aoColumns[C];if(ba.mData===C){var X=W(B,"sort")||W(B,"order");B=W(B,"filter")||W(B,"search");if(null!==X||null!==B)ba.mData={_:C+".display",sort:null!==X?C+".@data-"+X:q,type:null!==X?C+".@data-"+X:q,filter:null!==B?C+".@data-"+
108
+ B:q},Da(r,C)}})}var M=r.oFeatures;f=function(){if(g.aaSorting===q){var C=r.aaSorting;h=0;for(l=C.length;h<l;h++)C[h][1]=r.aoColumns[h].asSorting[0]}Pa(r);M.bSort&&Q(r,"aoDrawCallback",function(){if(r.bSorted){var ba=pa(r),X={};k.each(ba,function(lb,Aa){X[Aa.src]=Aa.dir});H(r,null,"order",[r,ba,X]);cc(r)}});Q(r,"aoDrawCallback",function(){(r.bSorted||"ssp"===P(r)||M.bDeferRender)&&Pa(r)},"sc");C=p.children("caption").each(function(){this._captionSide=k(this).css("caption-side")});var B=p.children("thead");
109
+ 0===B.length&&(B=k("<thead/>").appendTo(p));r.nTHead=B[0];B=p.children("tbody");0===B.length&&(B=k("<tbody/>").appendTo(p));r.nTBody=B[0];B=p.children("tfoot");0===B.length&&0<C.length&&(""!==r.oScroll.sX||""!==r.oScroll.sY)&&(B=k("<tfoot/>").appendTo(p));0===B.length||0===B.children().length?p.addClass(A.sNoFooter):0<B.length&&(r.nTFoot=B[0],wa(r.aoFooter,r.nTFoot));if(g.aaData)for(h=0;h<g.aaData.length;h++)ea(r,g.aaData[h]);else(r.bDeferLoading||"dom"==P(r))&&Ga(r,k(r.nTBody).children("tr"));r.aiDisplay=
110
+ r.aiDisplayMaster.slice();r.bInitialised=!0;!1===n&&za(r)};g.bStateSave?(M.bStateSave=!0,Q(r,"aoDrawCallback",Qa,"state_save"),dc(r,g,f)):f()}});b=null;return this},L,w,J,rb={},gc=/[\r\n\u2028]/g,Ta=/<.*?>/g,tc=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,uc=/(\/|\.|\*|\+|\?|\||\(|\)|\[|\]|\{|\}|\\|\$|\^|\-)/g,qb=/['\u00A0,$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfkɃΞ]/gi,ca=function(a){return a&&!0!==a&&"-"!==a?!1:!0},hc=function(a){var b=parseInt(a,10);return!isNaN(b)&&
111
+ isFinite(a)?b:null},ic=function(a,b){rb[b]||(rb[b]=new RegExp(hb(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace(rb[b],"."):a},sb=function(a,b,c){var d="string"===typeof a;if(ca(a))return!0;b&&d&&(a=ic(a,b));c&&d&&(a=a.replace(qb,""));return!isNaN(parseFloat(a))&&isFinite(a)},jc=function(a,b,c){return ca(a)?!0:ca(a)||"string"===typeof a?sb(a.replace(Ta,""),b,c)?!0:null:null},T=function(a,b,c){var d=[],e=0,f=a.length;if(c!==q)for(;e<f;e++)a[e]&&a[e][b]&&d.push(a[e][b][c]);else for(;e<
112
+ f;e++)a[e]&&d.push(a[e][b]);return d},Ca=function(a,b,c,d){var e=[],f=0,g=b.length;if(d!==q)for(;f<g;f++)a[b[f]][c]&&e.push(a[b[f]][c][d]);else for(;f<g;f++)e.push(a[b[f]][c]);return e},qa=function(a,b){var c=[];if(b===q){b=0;var d=a}else d=b,b=a;for(a=b;a<d;a++)c.push(a);return c},kc=function(a){for(var b=[],c=0,d=a.length;c<d;c++)a[c]&&b.push(a[c]);return b},Ja=function(a){a:{if(!(2>a.length)){var b=a.slice().sort();for(var c=b[0],d=1,e=b.length;d<e;d++){if(b[d]===c){b=!1;break a}c=b[d]}}b=!0}if(b)return a.slice();
113
+ b=[];e=a.length;var f,g=0;d=0;a:for(;d<e;d++){c=a[d];for(f=0;f<g;f++)if(b[f]===c)continue a;b.push(c);g++}return b},lc=function(a,b){if(Array.isArray(b))for(var c=0;c<b.length;c++)lc(a,b[c]);else a.push(b);return a};Array.isArray||(Array.isArray=function(a){return"[object Array]"===Object.prototype.toString.call(a)});String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")});u.util={throttle:function(a,b){var c=b!==q?b:200,d,e;return function(){var f=
114
+ this,g=+new Date,h=arguments;d&&g<d+c?(clearTimeout(e),e=setTimeout(function(){d=q;a.apply(f,h)},c)):(d=g,a.apply(f,h))}},escapeRegex:function(a){return a.replace(uc,"\\$1")}};var R=function(a,b,c){a[b]!==q&&(a[c]=a[b])},ua=/\[.*?\]$/,oa=/\(\)$/,hb=u.util.escapeRegex,Oa=k("<div>")[0],rc=Oa.textContent!==q,sc=/<.*?>/g,fb=u.util.throttle,mc=[],N=Array.prototype,vc=function(a){var b,c=u.settings,d=k.map(c,function(f,g){return f.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase()){var e=
115
+ k.inArray(a,d);return-1!==e?[c[e]]:null}if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===typeof a?b=k(a):a instanceof k&&(b=a)}else return[];if(b)return b.map(function(f){e=k.inArray(this,d);return-1!==e?c[e]:null}).toArray()};var D=function(a,b){if(!(this instanceof D))return new D(a,b);var c=[],d=function(g){(g=vc(g))&&c.push.apply(c,g)};if(Array.isArray(a))for(var e=0,f=a.length;e<f;e++)d(a[e]);else d(a);this.context=Ja(c);b&&k.merge(this,b);this.selector={rows:null,
116
+ cols:null,opts:null};D.extend(this,this,mc)};u.Api=D;k.extend(D.prototype,{any:function(){return 0!==this.count()},concat:N.concat,context:[],count:function(){return this.flatten().length},each:function(a){for(var b=0,c=this.length;b<c;b++)a.call(this,this[b],b,this);return this},eq:function(a){var b=this.context;return b.length>a?new D(b[a],this[a]):null},filter:function(a){var b=[];if(N.filter)b=N.filter.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)a.call(this,this[c],c,this)&&b.push(this[c]);
117
+ return new D(this.context,b)},flatten:function(){var a=[];return new D(this.context,a.concat.apply(a,this.toArray()))},join:N.join,indexOf:N.indexOf||function(a,b){b=b||0;for(var c=this.length;b<c;b++)if(this[b]===a)return b;return-1},iterator:function(a,b,c,d){var e=[],f,g,h=this.context,l,n=this.selector;"string"===typeof a&&(d=c,c=b,b=a,a=!1);var m=0;for(f=h.length;m<f;m++){var p=new D(h[m]);if("table"===b){var t=c.call(p,h[m],m);t!==q&&e.push(t)}else if("columns"===b||"rows"===b)t=c.call(p,h[m],
118
+ this[m],m),t!==q&&e.push(t);else if("column"===b||"column-rows"===b||"row"===b||"cell"===b){var v=this[m];"column-rows"===b&&(l=Ua(h[m],n.opts));var x=0;for(g=v.length;x<g;x++)t=v[x],t="cell"===b?c.call(p,h[m],t.row,t.column,m,x):c.call(p,h[m],t,m,x,l),t!==q&&e.push(t)}}return e.length||d?(a=new D(h,a?e.concat.apply([],e):e),b=a.selector,b.rows=n.rows,b.cols=n.cols,b.opts=n.opts,a):this},lastIndexOf:N.lastIndexOf||function(a,b){return this.indexOf.apply(this.toArray.reverse(),arguments)},length:0,
119
+ map:function(a){var b=[];if(N.map)b=N.map.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)b.push(a.call(this,this[c],c));return new D(this.context,b)},pluck:function(a){return this.map(function(b){return b[a]})},pop:N.pop,push:N.push,reduce:N.reduce||function(a,b){return Bb(this,a,b,0,this.length,1)},reduceRight:N.reduceRight||function(a,b){return Bb(this,a,b,this.length-1,-1,-1)},reverse:N.reverse,selector:null,shift:N.shift,slice:function(){return new D(this.context,this)},sort:N.sort,
120
+ splice:N.splice,toArray:function(){return N.slice.call(this)},to$:function(){return k(this)},toJQuery:function(){return k(this)},unique:function(){return new D(this.context,Ja(this))},unshift:N.unshift});D.extend=function(a,b,c){if(c.length&&b&&(b instanceof D||b.__dt_wrapper)){var d,e=function(h,l,n){return function(){var m=l.apply(h,arguments);D.extend(m,m,n.methodExt);return m}};var f=0;for(d=c.length;f<d;f++){var g=c[f];b[g.name]="function"===g.type?e(a,g.val,g):"object"===g.type?{}:g.val;b[g.name].__dt_wrapper=
121
+ !0;D.extend(a,b[g.name],g.propExt)}}};D.register=w=function(a,b){if(Array.isArray(a))for(var c=0,d=a.length;c<d;c++)D.register(a[c],b);else{d=a.split(".");var e=mc,f;a=0;for(c=d.length;a<c;a++){var g=(f=-1!==d[a].indexOf("()"))?d[a].replace("()",""):d[a];a:{var h=0;for(var l=e.length;h<l;h++)if(e[h].name===g){h=e[h];break a}h=null}h||(h={name:g,val:{},methodExt:[],propExt:[],type:"object"},e.push(h));a===c-1?(h.val=b,h.type="function"===typeof b?"function":k.isPlainObject(b)?"object":"other"):e=f?
122
+ h.methodExt:h.propExt}}};D.registerPlural=J=function(a,b,c){D.register(a,c);D.register(b,function(){var d=c.apply(this,arguments);return d===this?this:d instanceof D?d.length?Array.isArray(d[0])?new D(d.context,d[0]):d[0]:q:d})};var nc=function(a,b){if(Array.isArray(a))return k.map(a,function(d){return nc(d,b)});if("number"===typeof a)return[b[a]];var c=k.map(b,function(d,e){return d.nTable});return k(c).filter(a).map(function(d){d=k.inArray(this,c);return b[d]}).toArray()};w("tables()",function(a){return a!==
123
+ q&&null!==a?new D(nc(a,this.context)):this});w("table()",function(a){a=this.tables(a);var b=a.context;return b.length?new D(b[0]):a});J("tables().nodes()","table().node()",function(){return this.iterator("table",function(a){return a.nTable},1)});J("tables().body()","table().body()",function(){return this.iterator("table",function(a){return a.nTBody},1)});J("tables().header()","table().header()",function(){return this.iterator("table",function(a){return a.nTHead},1)});J("tables().footer()","table().footer()",
124
+ function(){return this.iterator("table",function(a){return a.nTFoot},1)});J("tables().containers()","table().container()",function(){return this.iterator("table",function(a){return a.nTableWrapper},1)});w("draw()",function(a){return this.iterator("table",function(b){"page"===a?fa(b):("string"===typeof a&&(a="full-hold"===a?!1:!0),ja(b,!1===a))})});w("page()",function(a){return a===q?this.page.info().page:this.iterator("table",function(b){kb(b,a)})});w("page.info()",function(a){if(0===this.context.length)return q;
125
+ a=this.context[0];var b=a._iDisplayStart,c=a.oFeatures.bPaginate?a._iDisplayLength:-1,d=a.fnRecordsDisplay(),e=-1===c;return{page:e?0:Math.floor(b/c),pages:e?1:Math.ceil(d/c),start:b,end:a.fnDisplayEnd(),length:c,recordsTotal:a.fnRecordsTotal(),recordsDisplay:d,serverSide:"ssp"===P(a)}});w("page.len()",function(a){return a===q?0!==this.context.length?this.context[0]._iDisplayLength:q:this.iterator("table",function(b){ib(b,a)})});var oc=function(a,b,c){if(c){var d=new D(a);d.one("draw",function(){c(d.ajax.json())})}if("ssp"==
126
+ P(a))ja(a,b);else{U(a,!0);var e=a.jqXHR;e&&4!==e.readyState&&e.abort();La(a,[],function(f){Ha(a);f=Ma(a,f);for(var g=0,h=f.length;g<h;g++)ea(a,f[g]);ja(a,b);U(a,!1)})}};w("ajax.json()",function(){var a=this.context;if(0<a.length)return a[0].json});w("ajax.params()",function(){var a=this.context;if(0<a.length)return a[0].oAjaxData});w("ajax.reload()",function(a,b){return this.iterator("table",function(c){oc(c,!1===b,a)})});w("ajax.url()",function(a){var b=this.context;if(a===q){if(0===b.length)return q;
127
+ b=b[0];return b.ajax?k.isPlainObject(b.ajax)?b.ajax.url:b.ajax:b.sAjaxSource}return this.iterator("table",function(c){k.isPlainObject(c.ajax)?c.ajax.url=a:c.ajax=a})});w("ajax.url().load()",function(a,b){return this.iterator("table",function(c){oc(c,!1===b,a)})});var tb=function(a,b,c,d,e){var f=[],g,h,l;var n=typeof b;b&&"string"!==n&&"function"!==n&&b.length!==q||(b=[b]);n=0;for(h=b.length;n<h;n++){var m=b[n]&&b[n].split&&!b[n].match(/[\[\(:]/)?b[n].split(","):[b[n]];var p=0;for(l=m.length;p<l;p++)(g=
128
+ c("string"===typeof m[p]?m[p].trim():m[p]))&&g.length&&(f=f.concat(g))}a=L.selector[a];if(a.length)for(n=0,h=a.length;n<h;n++)f=a[n](d,e,f);return Ja(f)},ub=function(a){a||(a={});a.filter&&a.search===q&&(a.search=a.filter);return k.extend({search:"none",order:"current",page:"all"},a)},vb=function(a){for(var b=0,c=a.length;b<c;b++)if(0<a[b].length)return a[0]=a[b],a[0].length=1,a.length=1,a.context=[a.context[b]],a;a.length=0;return a},Ua=function(a,b){var c=[],d=a.aiDisplay;var e=a.aiDisplayMaster;
129
+ var f=b.search;var g=b.order;b=b.page;if("ssp"==P(a))return"removed"===f?[]:qa(0,e.length);if("current"==b)for(g=a._iDisplayStart,a=a.fnDisplayEnd();g<a;g++)c.push(d[g]);else if("current"==g||"applied"==g)if("none"==f)c=e.slice();else if("applied"==f)c=d.slice();else{if("removed"==f){var h={};g=0;for(a=d.length;g<a;g++)h[d[g]]=null;c=k.map(e,function(l){return h.hasOwnProperty(l)?null:l})}}else if("index"==g||"original"==g)for(g=0,a=a.aoData.length;g<a;g++)"none"==f?c.push(g):(e=k.inArray(g,d),(-1===
130
+ e&&"removed"==f||0<=e&&"applied"==f)&&c.push(g));return c},wc=function(a,b,c){var d;return tb("row",b,function(e){var f=hc(e),g=a.aoData;if(null!==f&&!c)return[f];d||(d=Ua(a,c));if(null!==f&&-1!==k.inArray(f,d))return[f];if(null===e||e===q||""===e)return d;if("function"===typeof e)return k.map(d,function(l){var n=g[l];return e(l,n._aData,n.nTr)?l:null});if(e.nodeName){f=e._DT_RowIndex;var h=e._DT_CellIndex;if(f!==q)return g[f]&&g[f].nTr===e?[f]:[];if(h)return g[h.row]&&g[h.row].nTr===e.parentNode?
131
+ [h.row]:[];f=k(e).closest("*[data-dt-row]");return f.length?[f.data("dt-row")]:[]}if("string"===typeof e&&"#"===e.charAt(0)&&(f=a.aIds[e.replace(/^#/,"")],f!==q))return[f.idx];f=kc(Ca(a.aoData,d,"nTr"));return k(f).filter(e).map(function(){return this._DT_RowIndex}).toArray()},a,c)};w("rows()",function(a,b){a===q?a="":k.isPlainObject(a)&&(b=a,a="");b=ub(b);var c=this.iterator("table",function(d){return wc(d,a,b)},1);c.selector.rows=a;c.selector.opts=b;return c});w("rows().nodes()",function(){return this.iterator("row",
132
+ function(a,b){return a.aoData[b].nTr||q},1)});w("rows().data()",function(){return this.iterator(!0,"rows",function(a,b){return Ca(a.aoData,b,"_aData")},1)});J("rows().cache()","row().cache()",function(a){return this.iterator("row",function(b,c){b=b.aoData[c];return"search"===a?b._aFilterData:b._aSortData},1)});J("rows().invalidate()","row().invalidate()",function(a){return this.iterator("row",function(b,c){va(b,c,a)})});J("rows().indexes()","row().index()",function(){return this.iterator("row",function(a,
133
+ b){return b},1)});J("rows().ids()","row().id()",function(a){for(var b=[],c=this.context,d=0,e=c.length;d<e;d++)for(var f=0,g=this[d].length;f<g;f++){var h=c[d].rowIdFn(c[d].aoData[this[d][f]]._aData);b.push((!0===a?"#":"")+h)}return new D(c,b)});J("rows().remove()","row().remove()",function(){var a=this;this.iterator("row",function(b,c,d){var e=b.aoData,f=e[c],g,h;e.splice(c,1);var l=0;for(g=e.length;l<g;l++){var n=e[l];var m=n.anCells;null!==n.nTr&&(n.nTr._DT_RowIndex=l);if(null!==m)for(n=0,h=m.length;n<
134
+ h;n++)m[n]._DT_CellIndex.row=l}Ia(b.aiDisplayMaster,c);Ia(b.aiDisplay,c);Ia(a[d],c,!1);0<b._iRecordsDisplay&&b._iRecordsDisplay--;jb(b);c=b.rowIdFn(f._aData);c!==q&&delete b.aIds[c]});this.iterator("table",function(b){for(var c=0,d=b.aoData.length;c<d;c++)b.aoData[c].idx=c});return this});w("rows.add()",function(a){var b=this.iterator("table",function(d){var e,f=[];var g=0;for(e=a.length;g<e;g++){var h=a[g];h.nodeName&&"TR"===h.nodeName.toUpperCase()?f.push(Ga(d,h)[0]):f.push(ea(d,h))}return f},1),
135
+ c=this.rows(-1);c.pop();k.merge(c,b);return c});w("row()",function(a,b){return vb(this.rows(a,b))});w("row().data()",function(a){var b=this.context;if(a===q)return b.length&&this.length?b[0].aoData[this[0]]._aData:q;var c=b[0].aoData[this[0]];c._aData=a;Array.isArray(a)&&c.nTr&&c.nTr.id&&da(b[0].rowId)(a,c.nTr.id);va(b[0],this[0],"data");return this});w("row().node()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]].nTr||null:null});w("row.add()",function(a){a instanceof
136
+ k&&a.length&&(a=a[0]);var b=this.iterator("table",function(c){return a.nodeName&&"TR"===a.nodeName.toUpperCase()?Ga(c,a)[0]:ea(c,a)});return this.row(b[0])});var xc=function(a,b,c,d){var e=[],f=function(g,h){if(Array.isArray(g)||g instanceof k)for(var l=0,n=g.length;l<n;l++)f(g[l],h);else g.nodeName&&"tr"===g.nodeName.toLowerCase()?e.push(g):(l=k("<tr><td></td></tr>").addClass(h),k("td",l).addClass(h).html(g)[0].colSpan=na(a),e.push(l[0]))};f(c,d);b._details&&b._details.detach();b._details=k(e);b._detailsShow&&
137
+ b._details.insertAfter(b.nTr)},wb=function(a,b){var c=a.context;c.length&&(a=c[0].aoData[b!==q?b:a[0]])&&a._details&&(a._details.remove(),a._detailsShow=q,a._details=q)},pc=function(a,b){var c=a.context;c.length&&a.length&&(a=c[0].aoData[a[0]],a._details&&((a._detailsShow=b)?a._details.insertAfter(a.nTr):a._details.detach(),yc(c[0])))},yc=function(a){var b=new D(a),c=a.aoData;b.off("draw.dt.DT_details column-visibility.dt.DT_details destroy.dt.DT_details");0<T(c,"_details").length&&(b.on("draw.dt.DT_details",
138
+ function(d,e){a===e&&b.rows({page:"current"}).eq(0).each(function(f){f=c[f];f._detailsShow&&f._details.insertAfter(f.nTr)})}),b.on("column-visibility.dt.DT_details",function(d,e,f,g){if(a===e)for(e=na(e),f=0,g=c.length;f<g;f++)d=c[f],d._details&&d._details.children("td[colspan]").attr("colspan",e)}),b.on("destroy.dt.DT_details",function(d,e){if(a===e)for(d=0,e=c.length;d<e;d++)c[d]._details&&wb(b,d)}))};w("row().child()",function(a,b){var c=this.context;if(a===q)return c.length&&this.length?c[0].aoData[this[0]]._details:
139
+ q;!0===a?this.child.show():!1===a?wb(this):c.length&&this.length&&xc(c[0],c[0].aoData[this[0]],a,b);return this});w(["row().child.show()","row().child().show()"],function(a){pc(this,!0);return this});w(["row().child.hide()","row().child().hide()"],function(){pc(this,!1);return this});w(["row().child.remove()","row().child().remove()"],function(){wb(this);return this});w("row().child.isShown()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]]._detailsShow||!1:!1});var zc=
140
+ /^([^:]+):(name|visIdx|visible)$/,qc=function(a,b,c,d,e){c=[];d=0;for(var f=e.length;d<f;d++)c.push(S(a,e[d],b));return c},Ac=function(a,b,c){var d=a.aoColumns,e=T(d,"sName"),f=T(d,"nTh");return tb("column",b,function(g){var h=hc(g);if(""===g)return qa(d.length);if(null!==h)return[0<=h?h:d.length+h];if("function"===typeof g){var l=Ua(a,c);return k.map(d,function(p,t){return g(t,qc(a,t,0,0,l),f[t])?t:null})}var n="string"===typeof g?g.match(zc):"";if(n)switch(n[2]){case "visIdx":case "visible":h=parseInt(n[1],
141
+ 10);if(0>h){var m=k.map(d,function(p,t){return p.bVisible?t:null});return[m[m.length+h]]}return[sa(a,h)];case "name":return k.map(e,function(p,t){return p===n[1]?t:null});default:return[]}if(g.nodeName&&g._DT_CellIndex)return[g._DT_CellIndex.column];h=k(f).filter(g).map(function(){return k.inArray(this,f)}).toArray();if(h.length||!g.nodeName)return h;h=k(g).closest("*[data-dt-column]");return h.length?[h.data("dt-column")]:[]},a,c)};w("columns()",function(a,b){a===q?a="":k.isPlainObject(a)&&(b=a,
142
+ a="");b=ub(b);var c=this.iterator("table",function(d){return Ac(d,a,b)},1);c.selector.cols=a;c.selector.opts=b;return c});J("columns().header()","column().header()",function(a,b){return this.iterator("column",function(c,d){return c.aoColumns[d].nTh},1)});J("columns().footer()","column().footer()",function(a,b){return this.iterator("column",function(c,d){return c.aoColumns[d].nTf},1)});J("columns().data()","column().data()",function(){return this.iterator("column-rows",qc,1)});J("columns().dataSrc()",
143
+ "column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData},1)});J("columns().cache()","column().cache()",function(a){return this.iterator("column-rows",function(b,c,d,e,f){return Ca(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)},1)});J("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,d,e){return Ca(a.aoData,e,"anCells",b)},1)});J("columns().visible()","column().visible()",function(a,b){var c=
144
+ this,d=this.iterator("column",function(e,f){if(a===q)return e.aoColumns[f].bVisible;var g=e.aoColumns,h=g[f],l=e.aoData,n;if(a!==q&&h.bVisible!==a){if(a){var m=k.inArray(!0,T(g,"bVisible"),f+1);g=0;for(n=l.length;g<n;g++){var p=l[g].nTr;e=l[g].anCells;p&&p.insertBefore(e[f],e[m]||null)}}else k(T(e.aoData,"anCells",f)).detach();h.bVisible=a}});a!==q&&this.iterator("table",function(e){xa(e,e.aoHeader);xa(e,e.aoFooter);e.aiDisplay.length||k(e.nTBody).find("td[colspan]").attr("colspan",na(e));Qa(e);c.iterator("column",
145
+ function(f,g){H(f,null,"column-visibility",[f,g,a,b])});(b===q||b)&&c.columns.adjust()});return d});J("columns().indexes()","column().index()",function(a){return this.iterator("column",function(b,c){return"visible"===a?ta(b,c):c},1)});w("columns.adjust()",function(){return this.iterator("table",function(a){ra(a)},1)});w("column.index()",function(a,b){if(0!==this.context.length){var c=this.context[0];if("fromVisible"===a||"toData"===a)return sa(c,b);if("fromData"===a||"toVisible"===a)return ta(c,b)}});
146
+ w("column()",function(a,b){return vb(this.columns(a,b))});var Bc=function(a,b,c){var d=a.aoData,e=Ua(a,c),f=kc(Ca(d,e,"anCells")),g=k(lc([],f)),h,l=a.aoColumns.length,n,m,p,t,v,x;return tb("cell",b,function(r){var A="function"===typeof r;if(null===r||r===q||A){n=[];m=0;for(p=e.length;m<p;m++)for(h=e[m],t=0;t<l;t++)v={row:h,column:t},A?(x=d[h],r(v,S(a,h,t),x.anCells?x.anCells[t]:null)&&n.push(v)):n.push(v);return n}if(k.isPlainObject(r))return r.column!==q&&r.row!==q&&-1!==k.inArray(r.row,e)?[r]:[];
147
+ A=g.filter(r).map(function(E,I){return{row:I._DT_CellIndex.row,column:I._DT_CellIndex.column}}).toArray();if(A.length||!r.nodeName)return A;x=k(r).closest("*[data-dt-row]");return x.length?[{row:x.data("dt-row"),column:x.data("dt-column")}]:[]},a,c)};w("cells()",function(a,b,c){k.isPlainObject(a)&&(a.row===q?(c=a,a=null):(c=b,b=null));k.isPlainObject(b)&&(c=b,b=null);if(null===b||b===q)return this.iterator("table",function(m){return Bc(m,a,ub(c))});var d=c?{page:c.page,order:c.order,search:c.search}:
148
+ {},e=this.columns(b,d),f=this.rows(a,d),g,h,l,n;d=this.iterator("table",function(m,p){m=[];g=0;for(h=f[p].length;g<h;g++)for(l=0,n=e[p].length;l<n;l++)m.push({row:f[p][g],column:e[p][l]});return m},1);d=c&&c.selected?this.cells(d,c):d;k.extend(d.selector,{cols:b,rows:a,opts:c});return d});J("cells().nodes()","cell().node()",function(){return this.iterator("cell",function(a,b,c){return(a=a.aoData[b])&&a.anCells?a.anCells[c]:q},1)});w("cells().data()",function(){return this.iterator("cell",function(a,
149
+ b,c){return S(a,b,c)},1)});J("cells().cache()","cell().cache()",function(a){a="search"===a?"_aFilterData":"_aSortData";return this.iterator("cell",function(b,c,d){return b.aoData[c][a][d]},1)});J("cells().render()","cell().render()",function(a){return this.iterator("cell",function(b,c,d){return S(b,c,d,a)},1)});J("cells().indexes()","cell().index()",function(){return this.iterator("cell",function(a,b,c){return{row:b,column:c,columnVisible:ta(a,c)}},1)});J("cells().invalidate()","cell().invalidate()",
150
+ function(a){return this.iterator("cell",function(b,c,d){va(b,c,a,d)})});w("cell()",function(a,b,c){return vb(this.cells(a,b,c))});w("cell().data()",function(a){var b=this.context,c=this[0];if(a===q)return b.length&&c.length?S(b[0],c[0].row,c[0].column):q;Db(b[0],c[0].row,c[0].column,a);va(b[0],c[0].row,"data",c[0].column);return this});w("order()",function(a,b){var c=this.context;if(a===q)return 0!==c.length?c[0].aaSorting:q;"number"===typeof a?a=[[a,b]]:a.length&&!Array.isArray(a[0])&&(a=Array.prototype.slice.call(arguments));
151
+ return this.iterator("table",function(d){d.aaSorting=a.slice()})});w("order.listener()",function(a,b,c){return this.iterator("table",function(d){db(d,a,b,c)})});w("order.fixed()",function(a){if(!a){var b=this.context;b=b.length?b[0].aaSortingFixed:q;return Array.isArray(b)?{pre:b}:b}return this.iterator("table",function(c){c.aaSortingFixed=k.extend(!0,{},a)})});w(["columns().order()","column().order()"],function(a){var b=this;return this.iterator("table",function(c,d){var e=[];k.each(b[d],function(f,
152
+ g){e.push([g,a])});c.aaSorting=e})});w("search()",function(a,b,c,d){var e=this.context;return a===q?0!==e.length?e[0].oPreviousSearch.sSearch:q:this.iterator("table",function(f){f.oFeatures.bFilter&&ya(f,k.extend({},f.oPreviousSearch,{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===d?!0:d}),1)})});J("columns().search()","column().search()",function(a,b,c,d){return this.iterator("column",function(e,f){var g=e.aoPreSearchCols;if(a===q)return g[f].sSearch;e.oFeatures.bFilter&&
153
+ (k.extend(g[f],{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===d?!0:d}),ya(e,e.oPreviousSearch,1))})});w("state()",function(){return this.context.length?this.context[0].oSavedState:null});w("state.clear()",function(){return this.iterator("table",function(a){a.fnStateSaveCallback.call(a.oInstance,a,{})})});w("state.loaded()",function(){return this.context.length?this.context[0].oLoadedState:null});w("state.save()",function(){return this.iterator("table",function(a){Qa(a)})});
154
+ u.versionCheck=u.fnVersionCheck=function(a){var b=u.version.split(".");a=a.split(".");for(var c,d,e=0,f=a.length;e<f;e++)if(c=parseInt(b[e],10)||0,d=parseInt(a[e],10)||0,c!==d)return c>d;return!0};u.isDataTable=u.fnIsDataTable=function(a){var b=k(a).get(0),c=!1;if(a instanceof u.Api)return!0;k.each(u.settings,function(d,e){d=e.nScrollHead?k("table",e.nScrollHead)[0]:null;var f=e.nScrollFoot?k("table",e.nScrollFoot)[0]:null;if(e.nTable===b||d===b||f===b)c=!0});return c};u.tables=u.fnTables=function(a){var b=
155
+ !1;k.isPlainObject(a)&&(b=a.api,a=a.visible);var c=k.map(u.settings,function(d){if(!a||a&&k(d.nTable).is(":visible"))return d.nTable});return b?new D(c):c};u.camelToHungarian=O;w("$()",function(a,b){b=this.rows(b).nodes();b=k(b);return k([].concat(b.filter(a).toArray(),b.find(a).toArray()))});k.each(["on","one","off"],function(a,b){w(b+"()",function(){var c=Array.prototype.slice.call(arguments);c[0]=k.map(c[0].split(/\s/),function(e){return e.match(/\.dt\b/)?e:e+".dt"}).join(" ");var d=k(this.tables().nodes());
156
+ d[b].apply(d,c);return this})});w("clear()",function(){return this.iterator("table",function(a){Ha(a)})});w("settings()",function(){return new D(this.context,this.context)});w("init()",function(){var a=this.context;return a.length?a[0].oInit:null});w("data()",function(){return this.iterator("table",function(a){return T(a.aoData,"_aData")}).flatten()});w("destroy()",function(a){a=a||!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,d=b.oClasses,e=b.nTable,f=b.nTBody,g=b.nTHead,
157
+ h=b.nTFoot,l=k(e);f=k(f);var n=k(b.nTableWrapper),m=k.map(b.aoData,function(t){return t.nTr}),p;b.bDestroying=!0;H(b,"aoDestroyCallback","destroy",[b]);a||(new D(b)).columns().visible(!0);n.off(".DT").find(":not(tbody *)").off(".DT");k(y).off(".DT-"+b.sInstance);e!=g.parentNode&&(l.children("thead").detach(),l.append(g));h&&e!=h.parentNode&&(l.children("tfoot").detach(),l.append(h));b.aaSorting=[];b.aaSortingFixed=[];Pa(b);k(m).removeClass(b.asStripeClasses.join(" "));k("th, td",g).removeClass(d.sSortable+
158
+ " "+d.sSortableAsc+" "+d.sSortableDesc+" "+d.sSortableNone);f.children().detach();f.append(m);g=a?"remove":"detach";l[g]();n[g]();!a&&c&&(c.insertBefore(e,b.nTableReinsertBefore),l.css("width",b.sDestroyWidth).removeClass(d.sTable),(p=b.asDestroyStripes.length)&&f.children().each(function(t){k(this).addClass(b.asDestroyStripes[t%p])}));c=k.inArray(b,u.settings);-1!==c&&u.settings.splice(c,1)})});k.each(["column","row","cell"],function(a,b){w(b+"s().every()",function(c){var d=this.selector.opts,e=
159
+ this;return this.iterator(b,function(f,g,h,l,n){c.call(e[b](g,"cell"===b?h:d,"cell"===b?d:q),g,h,l,n)})})});w("i18n()",function(a,b,c){var d=this.context[0];a=ia(a)(d.oLanguage);a===q&&(a=b);c!==q&&k.isPlainObject(a)&&(a=a[c]!==q?a[c]:a._);return a.replace("%d",c)});u.version="1.10.24";u.settings=[];u.models={};u.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};u.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,
160
+ idx:-1};u.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};u.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,
161
+ 25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,
162
+ fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){return{}}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+"_"+location.pathname,JSON.stringify(b))}catch(c){}},
163
+ fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",
164
+ sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:k.extend({},u.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"};G(u.defaults);u.defaults.column={aDataSort:null,
165
+ iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};G(u.defaults.column);u.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,
166
+ iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],
167
+ aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,json:q,oAjaxData:q,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,
168
+ iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==P(this)?1*this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==P(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var a=this._iDisplayLength,b=this._iDisplayStart,c=b+a,d=this.aiDisplay.length,e=this.oFeatures,
169
+ f=e.bPaginate;return e.bServerSide?!1===f||-1===a?b+d:Math.min(b+a,this._iRecordsDisplay):!f||c>d||-1===a?d:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null};u.ext=L={buttons:{},classes:{},builder:"-source-",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:u.fnVersionCheck,
170
+ iApiIndex:0,oJUIClasses:{},sVersion:u.version};k.extend(L,{afnFiltering:L.search,aTypes:L.type.detect,ofnSearch:L.type.search,oSort:L.type.order,afnSortData:L.order,aoFeatures:L.feature,oApi:L.internal,oStdClasses:L.classes,oPagination:L.pager});k.extend(u.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",
171
+ sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_desc_disabled",sSortableDesc:"sorting_asc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",
172
+ sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""});var ec=u.ext.pager;k.extend(ec,{simple:function(a,b){return["previous","next"]},full:function(a,b){return["first","previous","next","last"]},numbers:function(a,b){return[Ba(a,b)]},simple_numbers:function(a,b){return["previous",Ba(a,b),"next"]},
173
+ full_numbers:function(a,b){return["first","previous",Ba(a,b),"next","last"]},first_last_numbers:function(a,b){return["first",Ba(a,b),"last"]},_numbers:Ba,numbers_length:7});k.extend(!0,u.ext.renderer,{pageButton:{_:function(a,b,c,d,e,f){var g=a.oClasses,h=a.oLanguage.oPaginate,l=a.oLanguage.oAria.paginate||{},n,m,p=0,t=function(x,r){var A,E=g.sPageButtonDisabled,I=function(B){kb(a,B.data.action,!0)};var W=0;for(A=r.length;W<A;W++){var M=r[W];if(Array.isArray(M)){var C=k("<"+(M.DT_el||"div")+"/>").appendTo(x);
174
+ t(C,M)}else{n=null;m=M;C=a.iTabIndex;switch(M){case "ellipsis":x.append('<span class="ellipsis">&#x2026;</span>');break;case "first":n=h.sFirst;0===e&&(C=-1,m+=" "+E);break;case "previous":n=h.sPrevious;0===e&&(C=-1,m+=" "+E);break;case "next":n=h.sNext;if(0===f||e===f-1)C=-1,m+=" "+E;break;case "last":n=h.sLast;if(0===f||e===f-1)C=-1,m+=" "+E;break;default:n=a.fnFormatNumber(M+1),m=e===M?g.sPageButtonActive:""}null!==n&&(C=k("<a>",{"class":g.sPageButton+" "+m,"aria-controls":a.sTableId,"aria-label":l[M],
175
+ "data-dt-idx":p,tabindex:C,id:0===c&&"string"===typeof M?a.sTableId+"_"+M:null}).html(n).appendTo(x),ob(C,{action:M},I),p++)}}};try{var v=k(b).find(z.activeElement).data("dt-idx")}catch(x){}t(k(b).empty(),d);v!==q&&k(b).find("[data-dt-idx="+v+"]").trigger("focus")}}});k.extend(u.ext.type.detect,[function(a,b){b=b.oLanguage.sDecimal;return sb(a,b)?"num"+b:null},function(a,b){if(a&&!(a instanceof Date)&&!tc.test(a))return null;b=Date.parse(a);return null!==b&&!isNaN(b)||ca(a)?"date":null},function(a,
176
+ b){b=b.oLanguage.sDecimal;return sb(a,b,!0)?"num-fmt"+b:null},function(a,b){b=b.oLanguage.sDecimal;return jc(a,b)?"html-num"+b:null},function(a,b){b=b.oLanguage.sDecimal;return jc(a,b,!0)?"html-num-fmt"+b:null},function(a,b){return ca(a)||"string"===typeof a&&-1!==a.indexOf("<")?"html":null}]);k.extend(u.ext.type.search,{html:function(a){return ca(a)?a:"string"===typeof a?a.replace(gc," ").replace(Ta,""):""},string:function(a){return ca(a)?a:"string"===typeof a?a.replace(gc," "):a}});var Sa=function(a,
177
+ b,c,d){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=ic(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};k.extend(L.type.order,{"date-pre":function(a){a=Date.parse(a);return isNaN(a)?-Infinity:a},"html-pre":function(a){return ca(a)?"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return ca(a)?"":"string"===typeof a?a.toLowerCase():a.toString?a.toString():""},"string-asc":function(a,b){return a<b?-1:a>b?1:0},"string-desc":function(a,b){return a<
178
+ b?1:a>b?-1:0}});Va("");k.extend(!0,u.ext.renderer,{header:{_:function(a,b,c,d){k(a.nTable).on("order.dt.DT",function(e,f,g,h){a===f&&(e=c.idx,b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass("asc"==h[e]?d.sSortAsc:"desc"==h[e]?d.sSortDesc:c.sSortingClass))})},jqueryui:function(a,b,c,d){k("<div/>").addClass(d.sSortJUIWrapper).append(b.contents()).append(k("<span/>").addClass(d.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);k(a.nTable).on("order.dt.DT",function(e,f,g,h){a===f&&(e=c.idx,b.removeClass(d.sSortAsc+
179
+ " "+d.sSortDesc).addClass("asc"==h[e]?d.sSortAsc:"desc"==h[e]?d.sSortDesc:c.sSortingClass),b.find("span."+d.sSortIcon).removeClass(d.sSortJUIAsc+" "+d.sSortJUIDesc+" "+d.sSortJUI+" "+d.sSortJUIAscAllowed+" "+d.sSortJUIDescAllowed).addClass("asc"==h[e]?d.sSortJUIAsc:"desc"==h[e]?d.sSortJUIDesc:c.sSortingClassJUI))})}}});var xb=function(a){return"string"===typeof a?a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"):a};u.render={number:function(a,b,c,d,e){return{display:function(f){if("number"!==
180
+ typeof f&&"string"!==typeof f)return f;var g=0>f?"-":"",h=parseFloat(f);if(isNaN(h))return xb(f);h=h.toFixed(c);f=Math.abs(h);h=parseInt(f,10);f=c?b+(f-h).toFixed(c).substring(2):"";return g+(d||"")+h.toString().replace(/\B(?=(\d{3})+(?!\d))/g,a)+f+(e||"")}}},text:function(){return{display:xb,filter:xb}}};k.extend(u.ext.internal,{_fnExternApiFunc:fc,_fnBuildAjax:La,_fnAjaxUpdate:Fb,_fnAjaxParameters:Ob,_fnAjaxUpdateDraw:Pb,_fnAjaxDataSrc:Ma,_fnAddColumn:Wa,_fnColumnOptions:Da,_fnAdjustColumnSizing:ra,
181
+ _fnVisibleToColumnIndex:sa,_fnColumnIndexToVisible:ta,_fnVisbleColumns:na,_fnGetColumns:Fa,_fnColumnTypes:Ya,_fnApplyColumnDefs:Cb,_fnHungarianMap:G,_fnCamelToHungarian:O,_fnLanguageCompat:ma,_fnBrowserDetect:Ab,_fnAddData:ea,_fnAddTr:Ga,_fnNodeToDataIndex:function(a,b){return b._DT_RowIndex!==q?b._DT_RowIndex:null},_fnNodeToColumnIndex:function(a,b,c){return k.inArray(c,a.aoData[b].anCells)},_fnGetCellData:S,_fnSetCellData:Db,_fnSplitObjNotation:ab,_fnGetObjectDataFn:ia,_fnSetObjectDataFn:da,_fnGetDataMaster:bb,
182
+ _fnClearTable:Ha,_fnDeleteIndex:Ia,_fnInvalidate:va,_fnGetRowElements:$a,_fnCreateTr:Za,_fnBuildHead:Eb,_fnDrawHead:xa,_fnDraw:fa,_fnReDraw:ja,_fnAddOptionsHtml:Hb,_fnDetectHeader:wa,_fnGetUniqueThs:Ka,_fnFeatureHtmlFilter:Jb,_fnFilterComplete:ya,_fnFilterCustom:Sb,_fnFilterColumn:Rb,_fnFilter:Qb,_fnFilterCreateSearch:gb,_fnEscapeRegex:hb,_fnFilterData:Tb,_fnFeatureHtmlInfo:Mb,_fnUpdateInfo:Wb,_fnInfoMacros:Xb,_fnInitialise:za,_fnInitComplete:Na,_fnLengthChange:ib,_fnFeatureHtmlLength:Ib,_fnFeatureHtmlPaginate:Nb,
183
+ _fnPageChange:kb,_fnFeatureHtmlProcessing:Kb,_fnProcessingDisplay:U,_fnFeatureHtmlTable:Lb,_fnScrollDraw:Ea,_fnApplyToChildren:Z,_fnCalculateColumnWidths:Xa,_fnThrottle:fb,_fnConvertToWidth:Zb,_fnGetWidestNode:$b,_fnGetMaxLenString:ac,_fnStringToCss:K,_fnSortFlatten:pa,_fnSort:Gb,_fnSortAria:cc,_fnSortListener:nb,_fnSortAttachListener:db,_fnSortingClasses:Pa,_fnSortData:bc,_fnSaveState:Qa,_fnLoadState:dc,_fnSettingsFromNode:Ra,_fnLog:aa,_fnMap:V,_fnBindAction:ob,_fnCallbackReg:Q,_fnCallbackFire:H,
184
+ _fnLengthOverflow:jb,_fnRenderer:eb,_fnDataSource:P,_fnRowAttributes:cb,_fnExtend:pb,_fnCalculateEnd:function(){}});k.fn.dataTable=u;u.$=k;k.fn.dataTableSettings=u.settings;k.fn.dataTableExt=u.ext;k.fn.DataTable=function(a){return k(this).dataTable(a).api()};k.each(u,function(a,b){k.fn.DataTable[a]=b});return k.fn.dataTable});
admin/js/slick.min.js ADDED
@@ -0,0 +1 @@
 
1
+ !function(i){"use strict";"function"==typeof define&&define.amd?define(["jquery"],i):"undefined"!=typeof exports?module.exports=i(require("jquery")):i(jQuery)}(function(i){"use strict";var e=window.Slick||{};(e=function(){var e=0;return function(t,o){var s,n=this;n.defaults={accessibility:!0,adaptiveHeight:!1,appendArrows:i(t),appendDots:i(t),arrows:!0,asNavFor:null,prevArrow:'<button class="slick-prev" aria-label="Previous" type="button">Previous</button>',nextArrow:'<button class="slick-next" aria-label="Next" type="button">Next</button>',autoplay:!1,autoplaySpeed:3e3,centerMode:!1,centerPadding:"50px",cssEase:"ease",customPaging:function(e,t){return i('<button type="button" />').text(t+1)},dots:!1,dotsClass:"slick-dots",draggable:!0,easing:"linear",edgeFriction:.35,fade:!1,focusOnSelect:!1,focusOnChange:!1,infinite:!0,initialSlide:0,lazyLoad:"ondemand",mobileFirst:!1,pauseOnHover:!0,pauseOnFocus:!0,pauseOnDotsHover:!1,respondTo:"window",responsive:null,rows:1,rtl:!1,slide:"",slidesPerRow:1,slidesToShow:1,slidesToScroll:1,speed:500,swipe:!0,swipeToSlide:!1,touchMove:!0,touchThreshold:5,useCSS:!0,useTransform:!0,variableWidth:!1,vertical:!1,verticalSwiping:!1,waitForAnimate:!0,zIndex:1e3},n.initials={animating:!1,dragging:!1,autoPlayTimer:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,$dots:null,listWidth:null,listHeight:null,loadIndex:0,$nextArrow:null,$prevArrow:null,scrolling:!1,slideCount:null,slideWidth:null,$slideTrack:null,$slides:null,sliding:!1,slideOffset:0,swipeLeft:null,swiping:!1,$list:null,touchObject:{},transformsEnabled:!1,unslicked:!1},i.extend(n,n.initials),n.activeBreakpoint=null,n.animType=null,n.animProp=null,n.breakpoints=[],n.breakpointSettings=[],n.cssTransitions=!1,n.focussed=!1,n.interrupted=!1,n.hidden="hidden",n.paused=!0,n.positionProp=null,n.respondTo=null,n.rowCount=1,n.shouldClick=!0,n.$slider=i(t),n.$slidesCache=null,n.transformType=null,n.transitionType=null,n.visibilityChange="visibilitychange",n.windowWidth=0,n.windowTimer=null,s=i(t).data("slick")||{},n.options=i.extend({},n.defaults,o,s),n.currentSlide=n.options.initialSlide,n.originalSettings=n.options,void 0!==document.mozHidden?(n.hidden="mozHidden",n.visibilityChange="mozvisibilitychange"):void 0!==document.webkitHidden&&(n.hidden="webkitHidden",n.visibilityChange="webkitvisibilitychange"),n.autoPlay=i.proxy(n.autoPlay,n),n.autoPlayClear=i.proxy(n.autoPlayClear,n),n.autoPlayIterator=i.proxy(n.autoPlayIterator,n),n.changeSlide=i.proxy(n.changeSlide,n),n.clickHandler=i.proxy(n.clickHandler,n),n.selectHandler=i.proxy(n.selectHandler,n),n.setPosition=i.proxy(n.setPosition,n),n.swipeHandler=i.proxy(n.swipeHandler,n),n.dragHandler=i.proxy(n.dragHandler,n),n.keyHandler=i.proxy(n.keyHandler,n),n.instanceUid=e++,n.htmlExpr=/^(?:\s*(<[\w\W]+>)[^>]*)$/,n.registerBreakpoints(),n.init(!0)}}()).prototype.activateADA=function(){this.$slideTrack.find(".slick-active").attr({"aria-hidden":"false"}).find("a, input, button, select").attr({tabindex:"0"})},e.prototype.addSlide=e.prototype.slickAdd=function(e,t,o){var s=this;if("boolean"==typeof t)o=t,t=null;else if(t<0||t>=s.slideCount)return!1;s.unload(),"number"==typeof t?0===t&&0===s.$slides.length?i(e).appendTo(s.$slideTrack):o?i(e).insertBefore(s.$slides.eq(t)):i(e).insertAfter(s.$slides.eq(t)):!0===o?i(e).prependTo(s.$slideTrack):i(e).appendTo(s.$slideTrack),s.$slides=s.$slideTrack.children(this.options.slide),s.$slideTrack.children(this.options.slide).detach(),s.$slideTrack.append(s.$slides),s.$slides.each(function(e,t){i(t).attr("data-slick-index",e)}),s.$slidesCache=s.$slides,s.reinit()},e.prototype.animateHeight=function(){var i=this;if(1===i.options.slidesToShow&&!0===i.options.adaptiveHeight&&!1===i.options.vertical){var e=i.$slides.eq(i.currentSlide).outerHeight(!0);i.$list.animate({height:e},i.options.speed)}},e.prototype.animateSlide=function(e,t){var o={},s=this;s.animateHeight(),!0===s.options.rtl&&!1===s.options.vertical&&(e=-e),!1===s.transformsEnabled?!1===s.options.vertical?s.$slideTrack.animate({left:e},s.options.speed,s.options.easing,t):s.$slideTrack.animate({top:e},s.options.speed,s.options.easing,t):!1===s.cssTransitions?(!0===s.options.rtl&&(s.currentLeft=-s.currentLeft),i({animStart:s.currentLeft}).animate({animStart:e},{duration:s.options.speed,easing:s.options.easing,step:function(i){i=Math.ceil(i),!1===s.options.vertical?(o[s.animType]="translate("+i+"px, 0px)",s.$slideTrack.css(o)):(o[s.animType]="translate(0px,"+i+"px)",s.$slideTrack.css(o))},complete:function(){t&&t.call()}})):(s.applyTransition(),e=Math.ceil(e),!1===s.options.vertical?o[s.animType]="translate3d("+e+"px, 0px, 0px)":o[s.animType]="translate3d(0px,"+e+"px, 0px)",s.$slideTrack.css(o),t&&setTimeout(function(){s.disableTransition(),t.call()},s.options.speed))},e.prototype.getNavTarget=function(){var e=this,t=e.options.asNavFor;return t&&null!==t&&(t=i(t).not(e.$slider)),t},e.prototype.asNavFor=function(e){var t=this.getNavTarget();null!==t&&"object"==typeof t&&t.each(function(){var t=i(this).slick("getSlick");t.unslicked||t.slideHandler(e,!0)})},e.prototype.applyTransition=function(i){var e=this,t={};!1===e.options.fade?t[e.transitionType]=e.transformType+" "+e.options.speed+"ms "+e.options.cssEase:t[e.transitionType]="opacity "+e.options.speed+"ms "+e.options.cssEase,!1===e.options.fade?e.$slideTrack.css(t):e.$slides.eq(i).css(t)},e.prototype.autoPlay=function(){var i=this;i.autoPlayClear(),i.slideCount>i.options.slidesToShow&&(i.autoPlayTimer=setInterval(i.autoPlayIterator,i.options.autoplaySpeed))},e.prototype.autoPlayClear=function(){var i=this;i.autoPlayTimer&&clearInterval(i.autoPlayTimer)},e.prototype.autoPlayIterator=function(){var i=this,e=i.currentSlide+i.options.slidesToScroll;i.paused||i.interrupted||i.focussed||(!1===i.options.infinite&&(1===i.direction&&i.currentSlide+1===i.slideCount-1?i.direction=0:0===i.direction&&(e=i.currentSlide-i.options.slidesToScroll,i.currentSlide-1==0&&(i.direction=1))),i.slideHandler(e))},e.prototype.buildArrows=function(){var e=this;!0===e.options.arrows&&(e.$prevArrow=i(e.options.prevArrow).addClass("slick-arrow"),e.$nextArrow=i(e.options.nextArrow).addClass("slick-arrow"),e.slideCount>e.options.slidesToShow?(e.$prevArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),e.$nextArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),e.htmlExpr.test(e.options.prevArrow)&&e.$prevArrow.prependTo(e.options.appendArrows),e.htmlExpr.test(e.options.nextArrow)&&e.$nextArrow.appendTo(e.options.appendArrows),!0!==e.options.infinite&&e.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true")):e.$prevArrow.add(e.$nextArrow).addClass("slick-hidden").attr({"aria-disabled":"true",tabindex:"-1"}))},e.prototype.buildDots=function(){var e,t,o=this;if(!0===o.options.dots){for(o.$slider.addClass("slick-dotted"),t=i("<ul />").addClass(o.options.dotsClass),e=0;e<=o.getDotCount();e+=1)t.append(i("<li />").append(o.options.customPaging.call(this,o,e)));o.$dots=t.appendTo(o.options.appendDots),o.$dots.find("li").first().addClass("slick-active")}},e.prototype.buildOut=function(){var e=this;e.$slides=e.$slider.children(e.options.slide+":not(.slick-cloned)").addClass("slick-slide"),e.slideCount=e.$slides.length,e.$slides.each(function(e,t){i(t).attr("data-slick-index",e).data("originalStyling",i(t).attr("style")||"")}),e.$slider.addClass("slick-slider"),e.$slideTrack=0===e.slideCount?i('<div class="slick-track"/>').appendTo(e.$slider):e.$slides.wrapAll('<div class="slick-track"/>').parent(),e.$list=e.$slideTrack.wrap('<div class="slick-list"/>').parent(),e.$slideTrack.css("opacity",0),!0!==e.options.centerMode&&!0!==e.options.swipeToSlide||(e.options.slidesToScroll=1),i("img[data-lazy]",e.$slider).not("[src]").addClass("slick-loading"),e.setupInfinite(),e.buildArrows(),e.buildDots(),e.updateDots(),e.setSlideClasses("number"==typeof e.currentSlide?e.currentSlide:0),!0===e.options.draggable&&e.$list.addClass("draggable")},e.prototype.buildRows=function(){var i,e,t,o,s,n,r,l=this;if(o=document.createDocumentFragment(),n=l.$slider.children(),l.options.rows>1){for(r=l.options.slidesPerRow*l.options.rows,s=Math.ceil(n.length/r),i=0;i<s;i++){var d=document.createElement("div");for(e=0;e<l.options.rows;e++){var a=document.createElement("div");for(t=0;t<l.options.slidesPerRow;t++){var c=i*r+(e*l.options.slidesPerRow+t);n.get(c)&&a.appendChild(n.get(c))}d.appendChild(a)}o.appendChild(d)}l.$slider.empty().append(o),l.$slider.children().children().children().css({width:100/l.options.slidesPerRow+"%",display:"inline-block"})}},e.prototype.checkResponsive=function(e,t){var o,s,n,r=this,l=!1,d=r.$slider.width(),a=window.innerWidth||i(window).width();if("window"===r.respondTo?n=a:"slider"===r.respondTo?n=d:"min"===r.respondTo&&(n=Math.min(a,d)),r.options.responsive&&r.options.responsive.length&&null!==r.options.responsive){s=null;for(o in r.breakpoints)r.breakpoints.hasOwnProperty(o)&&(!1===r.originalSettings.mobileFirst?n<r.breakpoints[o]&&(s=r.breakpoints[o]):n>r.breakpoints[o]&&(s=r.breakpoints[o]));null!==s?null!==r.activeBreakpoint?(s!==r.activeBreakpoint||t)&&(r.activeBreakpoint=s,"unslick"===r.breakpointSettings[s]?r.unslick(s):(r.options=i.extend({},r.originalSettings,r.breakpointSettings[s]),!0===e&&(r.currentSlide=r.options.initialSlide),r.refresh(e)),l=s):(r.activeBreakpoint=s,"unslick"===r.breakpointSettings[s]?r.unslick(s):(r.options=i.extend({},r.originalSettings,r.breakpointSettings[s]),!0===e&&(r.currentSlide=r.options.initialSlide),r.refresh(e)),l=s):null!==r.activeBreakpoint&&(r.activeBreakpoint=null,r.options=r.originalSettings,!0===e&&(r.currentSlide=r.options.initialSlide),r.refresh(e),l=s),e||!1===l||r.$slider.trigger("breakpoint",[r,l])}},e.prototype.changeSlide=function(e,t){var o,s,n,r=this,l=i(e.currentTarget);switch(l.is("a")&&e.preventDefault(),l.is("li")||(l=l.closest("li")),n=r.slideCount%r.options.slidesToScroll!=0,o=n?0:(r.slideCount-r.currentSlide)%r.options.slidesToScroll,e.data.message){case"previous":s=0===o?r.options.slidesToScroll:r.options.slidesToShow-o,r.slideCount>r.options.slidesToShow&&r.slideHandler(r.currentSlide-s,!1,t);break;case"next":s=0===o?r.options.slidesToScroll:o,r.slideCount>r.options.slidesToShow&&r.slideHandler(r.currentSlide+s,!1,t);break;case"index":var d=0===e.data.index?0:e.data.index||l.index()*r.options.slidesToScroll;r.slideHandler(r.checkNavigable(d),!1,t),l.children().trigger("focus");break;default:return}},e.prototype.checkNavigable=function(i){var e,t;if(e=this.getNavigableIndexes(),t=0,i>e[e.length-1])i=e[e.length-1];else for(var o in e){if(i<e[o]){i=t;break}t=e[o]}return i},e.prototype.cleanUpEvents=function(){var e=this;e.options.dots&&null!==e.$dots&&(i("li",e.$dots).off("click.slick",e.changeSlide).off("mouseenter.slick",i.proxy(e.interrupt,e,!0)).off("mouseleave.slick",i.proxy(e.interrupt,e,!1)),!0===e.options.accessibility&&e.$dots.off("keydown.slick",e.keyHandler)),e.$slider.off("focus.slick blur.slick"),!0===e.options.arrows&&e.slideCount>e.options.slidesToShow&&(e.$prevArrow&&e.$prevArrow.off("click.slick",e.changeSlide),e.$nextArrow&&e.$nextArrow.off("click.slick",e.changeSlide),!0===e.options.accessibility&&(e.$prevArrow&&e.$prevArrow.off("keydown.slick",e.keyHandler),e.$nextArrow&&e.$nextArrow.off("keydown.slick",e.keyHandler))),e.$list.off("touchstart.slick mousedown.slick",e.swipeHandler),e.$list.off("touchmove.slick mousemove.slick",e.swipeHandler),e.$list.off("touchend.slick mouseup.slick",e.swipeHandler),e.$list.off("touchcancel.slick mouseleave.slick",e.swipeHandler),e.$list.off("click.slick",e.clickHandler),i(document).off(e.visibilityChange,e.visibility),e.cleanUpSlideEvents(),!0===e.options.accessibility&&e.$list.off("keydown.slick",e.keyHandler),!0===e.options.focusOnSelect&&i(e.$slideTrack).children().off("click.slick",e.selectHandler),i(window).off("orientationchange.slick.slick-"+e.instanceUid,e.orientationChange),i(window).off("resize.slick.slick-"+e.instanceUid,e.resize),i("[draggable!=true]",e.$slideTrack).off("dragstart",e.preventDefault),i(window).off("load.slick.slick-"+e.instanceUid,e.setPosition)},e.prototype.cleanUpSlideEvents=function(){var e=this;e.$list.off("mouseenter.slick",i.proxy(e.interrupt,e,!0)),e.$list.off("mouseleave.slick",i.proxy(e.interrupt,e,!1))},e.prototype.cleanUpRows=function(){var i,e=this;e.options.rows>1&&((i=e.$slides.children().children()).removeAttr("style"),e.$slider.empty().append(i))},e.prototype.clickHandler=function(i){!1===this.shouldClick&&(i.stopImmediatePropagation(),i.stopPropagation(),i.preventDefault())},e.prototype.destroy=function(e){var t=this;t.autoPlayClear(),t.touchObject={},t.cleanUpEvents(),i(".slick-cloned",t.$slider).detach(),t.$dots&&t.$dots.remove(),t.$prevArrow&&t.$prevArrow.length&&(t.$prevArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display",""),t.htmlExpr.test(t.options.prevArrow)&&t.$prevArrow.remove()),t.$nextArrow&&t.$nextArrow.length&&(t.$nextArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display",""),t.htmlExpr.test(t.options.nextArrow)&&t.$nextArrow.remove()),t.$slides&&(t.$slides.removeClass("slick-slide slick-active slick-center slick-visible slick-current").removeAttr("aria-hidden").removeAttr("data-slick-index").each(function(){i(this).attr("style",i(this).data("originalStyling"))}),t.$slideTrack.children(this.options.slide).detach(),t.$slideTrack.detach(),t.$list.detach(),t.$slider.append(t.$slides)),t.cleanUpRows(),t.$slider.removeClass("slick-slider"),t.$slider.removeClass("slick-initialized"),t.$slider.removeClass("slick-dotted"),t.unslicked=!0,e||t.$slider.trigger("destroy",[t])},e.prototype.disableTransition=function(i){var e=this,t={};t[e.transitionType]="",!1===e.options.fade?e.$slideTrack.css(t):e.$slides.eq(i).css(t)},e.prototype.fadeSlide=function(i,e){var t=this;!1===t.cssTransitions?(t.$slides.eq(i).css({zIndex:t.options.zIndex}),t.$slides.eq(i).animate({opacity:1},t.options.speed,t.options.easing,e)):(t.applyTransition(i),t.$slides.eq(i).css({opacity:1,zIndex:t.options.zIndex}),e&&setTimeout(function(){t.disableTransition(i),e.call()},t.options.speed))},e.prototype.fadeSlideOut=function(i){var e=this;!1===e.cssTransitions?e.$slides.eq(i).animate({opacity:0,zIndex:e.options.zIndex-2},e.options.speed,e.options.easing):(e.applyTransition(i),e.$slides.eq(i).css({opacity:0,zIndex:e.options.zIndex-2}))},e.prototype.filterSlides=e.prototype.slickFilter=function(i){var e=this;null!==i&&(e.$slidesCache=e.$slides,e.unload(),e.$slideTrack.children(this.options.slide).detach(),e.$slidesCache.filter(i).appendTo(e.$slideTrack),e.reinit())},e.prototype.focusHandler=function(){var e=this;e.$slider.off("focus.slick blur.slick").on("focus.slick blur.slick","*",function(t){t.stopImmediatePropagation();var o=i(this);setTimeout(function(){e.options.pauseOnFocus&&(e.focussed=o.is(":focus"),e.autoPlay())},0)})},e.prototype.getCurrent=e.prototype.slickCurrentSlide=function(){return this.currentSlide},e.prototype.getDotCount=function(){var i=this,e=0,t=0,o=0;if(!0===i.options.infinite)if(i.slideCount<=i.options.slidesToShow)++o;else for(;e<i.slideCount;)++o,e=t+i.options.slidesToScroll,t+=i.options.slidesToScroll<=i.options.slidesToShow?i.options.slidesToScroll:i.options.slidesToShow;else if(!0===i.options.centerMode)o=i.slideCount;else if(i.options.asNavFor)for(;e<i.slideCount;)++o,e=t+i.options.slidesToScroll,t+=i.options.slidesToScroll<=i.options.slidesToShow?i.options.slidesToScroll:i.options.slidesToShow;else o=1+Math.ceil((i.slideCount-i.options.slidesToShow)/i.options.slidesToScroll);return o-1},e.prototype.getLeft=function(i){var e,t,o,s,n=this,r=0;return n.slideOffset=0,t=n.$slides.first().outerHeight(!0),!0===n.options.infinite?(n.slideCount>n.options.slidesToShow&&(n.slideOffset=n.slideWidth*n.options.slidesToShow*-1,s=-1,!0===n.options.vertical&&!0===n.options.centerMode&&(2===n.options.slidesToShow?s=-1.5:1===n.options.slidesToShow&&(s=-2)),r=t*n.options.slidesToShow*s),n.slideCount%n.options.slidesToScroll!=0&&i+n.options.slidesToScroll>n.slideCount&&n.slideCount>n.options.slidesToShow&&(i>n.slideCount?(n.slideOffset=(n.options.slidesToShow-(i-n.slideCount))*n.slideWidth*-1,r=(n.options.slidesToShow-(i-n.slideCount))*t*-1):(n.slideOffset=n.slideCount%n.options.slidesToScroll*n.slideWidth*-1,r=n.slideCount%n.options.slidesToScroll*t*-1))):i+n.options.slidesToShow>n.slideCount&&(n.slideOffset=(i+n.options.slidesToShow-n.slideCount)*n.slideWidth,r=(i+n.options.slidesToShow-n.slideCount)*t),n.slideCount<=n.options.slidesToShow&&(n.slideOffset=0,r=0),!0===n.options.centerMode&&n.slideCount<=n.options.slidesToShow?n.slideOffset=n.slideWidth*Math.floor(n.options.slidesToShow)/2-n.slideWidth*n.slideCount/2:!0===n.options.centerMode&&!0===n.options.infinite?n.slideOffset+=n.slideWidth*Math.floor(n.options.slidesToShow/2)-n.slideWidth:!0===n.options.centerMode&&(n.slideOffset=0,n.slideOffset+=n.slideWidth*Math.floor(n.options.slidesToShow/2)),e=!1===n.options.vertical?i*n.slideWidth*-1+n.slideOffset:i*t*-1+r,!0===n.options.variableWidth&&(o=n.slideCount<=n.options.slidesToShow||!1===n.options.infinite?n.$slideTrack.children(".slick-slide").eq(i):n.$slideTrack.children(".slick-slide").eq(i+n.options.slidesToShow),e=!0===n.options.rtl?o[0]?-1*(n.$slideTrack.width()-o[0].offsetLeft-o.width()):0:o[0]?-1*o[0].offsetLeft:0,!0===n.options.centerMode&&(o=n.slideCount<=n.options.slidesToShow||!1===n.options.infinite?n.$slideTrack.children(".slick-slide").eq(i):n.$slideTrack.children(".slick-slide").eq(i+n.options.slidesToShow+1),e=!0===n.options.rtl?o[0]?-1*(n.$slideTrack.width()-o[0].offsetLeft-o.width()):0:o[0]?-1*o[0].offsetLeft:0,e+=(n.$list.width()-o.outerWidth())/2)),e},e.prototype.getOption=e.prototype.slickGetOption=function(i){return this.options[i]},e.prototype.getNavigableIndexes=function(){var i,e=this,t=0,o=0,s=[];for(!1===e.options.infinite?i=e.slideCount:(t=-1*e.options.slidesToScroll,o=-1*e.options.slidesToScroll,i=2*e.slideCount);t<i;)s.push(t),t=o+e.options.slidesToScroll,o+=e.options.slidesToScroll<=e.options.slidesToShow?e.options.slidesToScroll:e.options.slidesToShow;return s},e.prototype.getSlick=function(){return this},e.prototype.getSlideCount=function(){var e,t,o=this;return t=!0===o.options.centerMode?o.slideWidth*Math.floor(o.options.slidesToShow/2):0,!0===o.options.swipeToSlide?(o.$slideTrack.find(".slick-slide").each(function(s,n){if(n.offsetLeft-t+i(n).outerWidth()/2>-1*o.swipeLeft)return e=n,!1}),Math.abs(i(e).attr("data-slick-index")-o.currentSlide)||1):o.options.slidesToScroll},e.prototype.goTo=e.prototype.slickGoTo=function(i,e){this.changeSlide({data:{message:"index",index:parseInt(i)}},e)},e.prototype.init=function(e){var t=this;i(t.$slider).hasClass("slick-initialized")||(i(t.$slider).addClass("slick-initialized"),t.buildRows(),t.buildOut(),t.setProps(),t.startLoad(),t.loadSlider(),t.initializeEvents(),t.updateArrows(),t.updateDots(),t.checkResponsive(!0),t.focusHandler()),e&&t.$slider.trigger("init",[t]),!0===t.options.accessibility&&t.initADA(),t.options.autoplay&&(t.paused=!1,t.autoPlay())},e.prototype.initADA=function(){var e=this,t=Math.ceil(e.slideCount/e.options.slidesToShow),o=e.getNavigableIndexes().filter(function(i){return i>=0&&i<e.slideCount});e.$slides.add(e.$slideTrack.find(".slick-cloned")).attr({"aria-hidden":"true",tabindex:"-1"}).find("a, input, button, select").attr({tabindex:"-1"}),null!==e.$dots&&(e.$slides.not(e.$slideTrack.find(".slick-cloned")).each(function(t){var s=o.indexOf(t);i(this).attr({role:"tabpanel",id:"slick-slide"+e.instanceUid+t,tabindex:-1}),-1!==s&&i(this).attr({"aria-describedby":"slick-slide-control"+e.instanceUid+s})}),e.$dots.attr("role","tablist").find("li").each(function(s){var n=o[s];i(this).attr({role:"presentation"}),i(this).find("button").first().attr({role:"tab",id:"slick-slide-control"+e.instanceUid+s,"aria-controls":"slick-slide"+e.instanceUid+n,"aria-label":s+1+" of "+t,"aria-selected":null,tabindex:"-1"})}).eq(e.currentSlide).find("button").attr({"aria-selected":"true",tabindex:"0"}).end());for(var s=e.currentSlide,n=s+e.options.slidesToShow;s<n;s++)e.$slides.eq(s).attr("tabindex",0);e.activateADA()},e.prototype.initArrowEvents=function(){var i=this;!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.off("click.slick").on("click.slick",{message:"previous"},i.changeSlide),i.$nextArrow.off("click.slick").on("click.slick",{message:"next"},i.changeSlide),!0===i.options.accessibility&&(i.$prevArrow.on("keydown.slick",i.keyHandler),i.$nextArrow.on("keydown.slick",i.keyHandler)))},e.prototype.initDotEvents=function(){var e=this;!0===e.options.dots&&(i("li",e.$dots).on("click.slick",{message:"index"},e.changeSlide),!0===e.options.accessibility&&e.$dots.on("keydown.slick",e.keyHandler)),!0===e.options.dots&&!0===e.options.pauseOnDotsHover&&i("li",e.$dots).on("mouseenter.slick",i.proxy(e.interrupt,e,!0)).on("mouseleave.slick",i.proxy(e.interrupt,e,!1))},e.prototype.initSlideEvents=function(){var e=this;e.options.pauseOnHover&&(e.$list.on("mouseenter.slick",i.proxy(e.interrupt,e,!0)),e.$list.on("mouseleave.slick",i.proxy(e.interrupt,e,!1)))},e.prototype.initializeEvents=function(){var e=this;e.initArrowEvents(),e.initDotEvents(),e.initSlideEvents(),e.$list.on("touchstart.slick mousedown.slick",{action:"start"},e.swipeHandler),e.$list.on("touchmove.slick mousemove.slick",{action:"move"},e.swipeHandler),e.$list.on("touchend.slick mouseup.slick",{action:"end"},e.swipeHandler),e.$list.on("touchcancel.slick mouseleave.slick",{action:"end"},e.swipeHandler),e.$list.on("click.slick",e.clickHandler),i(document).on(e.visibilityChange,i.proxy(e.visibility,e)),!0===e.options.accessibility&&e.$list.on("keydown.slick",e.keyHandler),!0===e.options.focusOnSelect&&i(e.$slideTrack).children().on("click.slick",e.selectHandler),i(window).on("orientationchange.slick.slick-"+e.instanceUid,i.proxy(e.orientationChange,e)),i(window).on("resize.slick.slick-"+e.instanceUid,i.proxy(e.resize,e)),i("[draggable!=true]",e.$slideTrack).on("dragstart",e.preventDefault),i(window).on("load.slick.slick-"+e.instanceUid,e.setPosition),i(e.setPosition)},e.prototype.initUI=function(){var i=this;!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.show(),i.$nextArrow.show()),!0===i.options.dots&&i.slideCount>i.options.slidesToShow&&i.$dots.show()},e.prototype.keyHandler=function(i){var e=this;i.target.tagName.match("TEXTAREA|INPUT|SELECT")||(37===i.keyCode&&!0===e.options.accessibility?e.changeSlide({data:{message:!0===e.options.rtl?"next":"previous"}}):39===i.keyCode&&!0===e.options.accessibility&&e.changeSlide({data:{message:!0===e.options.rtl?"previous":"next"}}))},e.prototype.lazyLoad=function(){function e(e){i("img[data-lazy]",e).each(function(){var e=i(this),t=i(this).attr("data-lazy"),o=i(this).attr("data-srcset"),s=i(this).attr("data-sizes")||n.$slider.attr("data-sizes"),r=document.createElement("img");r.onload=function(){e.animate({opacity:0},100,function(){o&&(e.attr("srcset",o),s&&e.attr("sizes",s)),e.attr("src",t).animate({opacity:1},200,function(){e.removeAttr("data-lazy data-srcset data-sizes").removeClass("slick-loading")}),n.$slider.trigger("lazyLoaded",[n,e,t])})},r.onerror=function(){e.removeAttr("data-lazy").removeClass("slick-loading").addClass("slick-lazyload-error"),n.$slider.trigger("lazyLoadError",[n,e,t])},r.src=t})}var t,o,s,n=this;if(!0===n.options.centerMode?!0===n.options.infinite?s=(o=n.currentSlide+(n.options.slidesToShow/2+1))+n.options.slidesToShow+2:(o=Math.max(0,n.currentSlide-(n.options.slidesToShow/2+1)),s=n.options.slidesToShow/2+1+2+n.currentSlide):(o=n.options.infinite?n.options.slidesToShow+n.currentSlide:n.currentSlide,s=Math.ceil(o+n.options.slidesToShow),!0===n.options.fade&&(o>0&&o--,s<=n.slideCount&&s++)),t=n.$slider.find(".slick-slide").slice(o,s),"anticipated"===n.options.lazyLoad)for(var r=o-1,l=s,d=n.$slider.find(".slick-slide"),a=0;a<n.options.slidesToScroll;a++)r<0&&(r=n.slideCount-1),t=(t=t.add(d.eq(r))).add(d.eq(l)),r--,l++;e(t),n.slideCount<=n.options.slidesToShow?e(n.$slider.find(".slick-slide")):n.currentSlide>=n.slideCount-n.options.slidesToShow?e(n.$slider.find(".slick-cloned").slice(0,n.options.slidesToShow)):0===n.currentSlide&&e(n.$slider.find(".slick-cloned").slice(-1*n.options.slidesToShow))},e.prototype.loadSlider=function(){var i=this;i.setPosition(),i.$slideTrack.css({opacity:1}),i.$slider.removeClass("slick-loading"),i.initUI(),"progressive"===i.options.lazyLoad&&i.progressiveLazyLoad()},e.prototype.next=e.prototype.slickNext=function(){this.changeSlide({data:{message:"next"}})},e.prototype.orientationChange=function(){var i=this;i.checkResponsive(),i.setPosition()},e.prototype.pause=e.prototype.slickPause=function(){var i=this;i.autoPlayClear(),i.paused=!0},e.prototype.play=e.prototype.slickPlay=function(){var i=this;i.autoPlay(),i.options.autoplay=!0,i.paused=!1,i.focussed=!1,i.interrupted=!1},e.prototype.postSlide=function(e){var t=this;t.unslicked||(t.$slider.trigger("afterChange",[t,e]),t.animating=!1,t.slideCount>t.options.slidesToShow&&t.setPosition(),t.swipeLeft=null,t.options.autoplay&&t.autoPlay(),!0===t.options.accessibility&&(t.initADA(),t.options.focusOnChange&&i(t.$slides.get(t.currentSlide)).attr("tabindex",0).focus()))},e.prototype.prev=e.prototype.slickPrev=function(){this.changeSlide({data:{message:"previous"}})},e.prototype.preventDefault=function(i){i.preventDefault()},e.prototype.progressiveLazyLoad=function(e){e=e||1;var t,o,s,n,r,l=this,d=i("img[data-lazy]",l.$slider);d.length?(t=d.first(),o=t.attr("data-lazy"),s=t.attr("data-srcset"),n=t.attr("data-sizes")||l.$slider.attr("data-sizes"),(r=document.createElement("img")).onload=function(){s&&(t.attr("srcset",s),n&&t.attr("sizes",n)),t.attr("src",o).removeAttr("data-lazy data-srcset data-sizes").removeClass("slick-loading"),!0===l.options.adaptiveHeight&&l.setPosition(),l.$slider.trigger("lazyLoaded",[l,t,o]),l.progressiveLazyLoad()},r.onerror=function(){e<3?setTimeout(function(){l.progressiveLazyLoad(e+1)},500):(t.removeAttr("data-lazy").removeClass("slick-loading").addClass("slick-lazyload-error"),l.$slider.trigger("lazyLoadError",[l,t,o]),l.progressiveLazyLoad())},r.src=o):l.$slider.trigger("allImagesLoaded",[l])},e.prototype.refresh=function(e){var t,o,s=this;o=s.slideCount-s.options.slidesToShow,!s.options.infinite&&s.currentSlide>o&&(s.currentSlide=o),s.slideCount<=s.options.slidesToShow&&(s.currentSlide=0),t=s.currentSlide,s.destroy(!0),i.extend(s,s.initials,{currentSlide:t}),s.init(),e||s.changeSlide({data:{message:"index",index:t}},!1)},e.prototype.registerBreakpoints=function(){var e,t,o,s=this,n=s.options.responsive||null;if("array"===i.type(n)&&n.length){s.respondTo=s.options.respondTo||"window";for(e in n)if(o=s.breakpoints.length-1,n.hasOwnProperty(e)){for(t=n[e].breakpoint;o>=0;)s.breakpoints[o]&&s.breakpoints[o]===t&&s.breakpoints.splice(o,1),o--;s.breakpoints.push(t),s.breakpointSettings[t]=n[e].settings}s.breakpoints.sort(function(i,e){return s.options.mobileFirst?i-e:e-i})}},e.prototype.reinit=function(){var e=this;e.$slides=e.$slideTrack.children(e.options.slide).addClass("slick-slide"),e.slideCount=e.$slides.length,e.currentSlide>=e.slideCount&&0!==e.currentSlide&&(e.currentSlide=e.currentSlide-e.options.slidesToScroll),e.slideCount<=e.options.slidesToShow&&(e.currentSlide=0),e.registerBreakpoints(),e.setProps(),e.setupInfinite(),e.buildArrows(),e.updateArrows(),e.initArrowEvents(),e.buildDots(),e.updateDots(),e.initDotEvents(),e.cleanUpSlideEvents(),e.initSlideEvents(),e.checkResponsive(!1,!0),!0===e.options.focusOnSelect&&i(e.$slideTrack).children().on("click.slick",e.selectHandler),e.setSlideClasses("number"==typeof e.currentSlide?e.currentSlide:0),e.setPosition(),e.focusHandler(),e.paused=!e.options.autoplay,e.autoPlay(),e.$slider.trigger("reInit",[e])},e.prototype.resize=function(){var e=this;i(window).width()!==e.windowWidth&&(clearTimeout(e.windowDelay),e.windowDelay=window.setTimeout(function(){e.windowWidth=i(window).width(),e.checkResponsive(),e.unslicked||e.setPosition()},50))},e.prototype.removeSlide=e.prototype.slickRemove=function(i,e,t){var o=this;if(i="boolean"==typeof i?!0===(e=i)?0:o.slideCount-1:!0===e?--i:i,o.slideCount<1||i<0||i>o.slideCount-1)return!1;o.unload(),!0===t?o.$slideTrack.children().remove():o.$slideTrack.children(this.options.slide).eq(i).remove(),o.$slides=o.$slideTrack.children(this.options.slide),o.$slideTrack.children(this.options.slide).detach(),o.$slideTrack.append(o.$slides),o.$slidesCache=o.$slides,o.reinit()},e.prototype.setCSS=function(i){var e,t,o=this,s={};!0===o.options.rtl&&(i=-i),e="left"==o.positionProp?Math.ceil(i)+"px":"0px",t="top"==o.positionProp?Math.ceil(i)+"px":"0px",s[o.positionProp]=i,!1===o.transformsEnabled?o.$slideTrack.css(s):(s={},!1===o.cssTransitions?(s[o.animType]="translate("+e+", "+t+")",o.$slideTrack.css(s)):(s[o.animType]="translate3d("+e+", "+t+", 0px)",o.$slideTrack.css(s)))},e.prototype.setDimensions=function(){var i=this;!1===i.options.vertical?!0===i.options.centerMode&&i.$list.css({padding:"0px "+i.options.centerPadding}):(i.$list.height(i.$slides.first().outerHeight(!0)*i.options.slidesToShow),!0===i.options.centerMode&&i.$list.css({padding:i.options.centerPadding+" 0px"})),i.listWidth=i.$list.width(),i.listHeight=i.$list.height(),!1===i.options.vertical&&!1===i.options.variableWidth?(i.slideWidth=Math.ceil(i.listWidth/i.options.slidesToShow),i.$slideTrack.width(Math.ceil(i.slideWidth*i.$slideTrack.children(".slick-slide").length))):!0===i.options.variableWidth?i.$slideTrack.width(5e3*i.slideCount):(i.slideWidth=Math.ceil(i.listWidth),i.$slideTrack.height(Math.ceil(i.$slides.first().outerHeight(!0)*i.$slideTrack.children(".slick-slide").length)));var e=i.$slides.first().outerWidth(!0)-i.$slides.first().width();!1===i.options.variableWidth&&i.$slideTrack.children(".slick-slide").width(i.slideWidth-e)},e.prototype.setFade=function(){var e,t=this;t.$slides.each(function(o,s){e=t.slideWidth*o*-1,!0===t.options.rtl?i(s).css({position:"relative",right:e,top:0,zIndex:t.options.zIndex-2,opacity:0}):i(s).css({position:"relative",left:e,top:0,zIndex:t.options.zIndex-2,opacity:0})}),t.$slides.eq(t.currentSlide).css({zIndex:t.options.zIndex-1,opacity:1})},e.prototype.setHeight=function(){var i=this;if(1===i.options.slidesToShow&&!0===i.options.adaptiveHeight&&!1===i.options.vertical){var e=i.$slides.eq(i.currentSlide).outerHeight(!0);i.$list.css("height",e)}},e.prototype.setOption=e.prototype.slickSetOption=function(){var e,t,o,s,n,r=this,l=!1;if("object"===i.type(arguments[0])?(o=arguments[0],l=arguments[1],n="multiple"):"string"===i.type(arguments[0])&&(o=arguments[0],s=arguments[1],l=arguments[2],"responsive"===arguments[0]&&"array"===i.type(arguments[1])?n="responsive":void 0!==arguments[1]&&(n="single")),"single"===n)r.options[o]=s;else if("multiple"===n)i.each(o,function(i,e){r.options[i]=e});else if("responsive"===n)for(t in s)if("array"!==i.type(r.options.responsive))r.options.responsive=[s[t]];else{for(e=r.options.responsive.length-1;e>=0;)r.options.responsive[e].breakpoint===s[t].breakpoint&&r.options.responsive.splice(e,1),e--;r.options.responsive.push(s[t])}l&&(r.unload(),r.reinit())},e.prototype.setPosition=function(){var i=this;i.setDimensions(),i.setHeight(),!1===i.options.fade?i.setCSS(i.getLeft(i.currentSlide)):i.setFade(),i.$slider.trigger("setPosition",[i])},e.prototype.setProps=function(){var i=this,e=document.body.style;i.positionProp=!0===i.options.vertical?"top":"left","top"===i.positionProp?i.$slider.addClass("slick-vertical"):i.$slider.removeClass("slick-vertical"),void 0===e.WebkitTransition&&void 0===e.MozTransition&&void 0===e.msTransition||!0===i.options.useCSS&&(i.cssTransitions=!0),i.options.fade&&("number"==typeof i.options.zIndex?i.options.zIndex<3&&(i.options.zIndex=3):i.options.zIndex=i.defaults.zIndex),void 0!==e.OTransform&&(i.animType="OTransform",i.transformType="-o-transform",i.transitionType="OTransition",void 0===e.perspectiveProperty&&void 0===e.webkitPerspective&&(i.animType=!1)),void 0!==e.MozTransform&&(i.animType="MozTransform",i.transformType="-moz-transform",i.transitionType="MozTransition",void 0===e.perspectiveProperty&&void 0===e.MozPerspective&&(i.animType=!1)),void 0!==e.webkitTransform&&(i.animType="webkitTransform",i.transformType="-webkit-transform",i.transitionType="webkitTransition",void 0===e.perspectiveProperty&&void 0===e.webkitPerspective&&(i.animType=!1)),void 0!==e.msTransform&&(i.animType="msTransform",i.transformType="-ms-transform",i.transitionType="msTransition",void 0===e.msTransform&&(i.animType=!1)),void 0!==e.transform&&!1!==i.animType&&(i.animType="transform",i.transformType="transform",i.transitionType="transition"),i.transformsEnabled=i.options.useTransform&&null!==i.animType&&!1!==i.animType},e.prototype.setSlideClasses=function(i){var e,t,o,s,n=this;if(t=n.$slider.find(".slick-slide").removeClass("slick-active slick-center slick-current").attr("aria-hidden","true"),n.$slides.eq(i).addClass("slick-current"),!0===n.options.centerMode){var r=n.options.slidesToShow%2==0?1:0;e=Math.floor(n.options.slidesToShow/2),!0===n.options.infinite&&(i>=e&&i<=n.slideCount-1-e?n.$slides.slice(i-e+r,i+e+1).addClass("slick-active").attr("aria-hidden","false"):(o=n.options.slidesToShow+i,t.slice(o-e+1+r,o+e+2).addClass("slick-active").attr("aria-hidden","false")),0===i?t.eq(t.length-1-n.options.slidesToShow).addClass("slick-center"):i===n.slideCount-1&&t.eq(n.options.slidesToShow).addClass("slick-center")),n.$slides.eq(i).addClass("slick-center")}else i>=0&&i<=n.slideCount-n.options.slidesToShow?n.$slides.slice(i,i+n.options.slidesToShow).addClass("slick-active").attr("aria-hidden","false"):t.length<=n.options.slidesToShow?t.addClass("slick-active").attr("aria-hidden","false"):(s=n.slideCount%n.options.slidesToShow,o=!0===n.options.infinite?n.options.slidesToShow+i:i,n.options.slidesToShow==n.options.slidesToScroll&&n.slideCount-i<n.options.slidesToShow?t.slice(o-(n.options.slidesToShow-s),o+s).addClass("slick-active").attr("aria-hidden","false"):t.slice(o,o+n.options.slidesToShow).addClass("slick-active").attr("aria-hidden","false"));"ondemand"!==n.options.lazyLoad&&"anticipated"!==n.options.lazyLoad||n.lazyLoad()},e.prototype.setupInfinite=function(){var e,t,o,s=this;if(!0===s.options.fade&&(s.options.centerMode=!1),!0===s.options.infinite&&!1===s.options.fade&&(t=null,s.slideCount>s.options.slidesToShow)){for(o=!0===s.options.centerMode?s.options.slidesToShow+1:s.options.slidesToShow,e=s.slideCount;e>s.slideCount-o;e-=1)t=e-1,i(s.$slides[t]).clone(!0).attr("id","").attr("data-slick-index",t-s.slideCount).prependTo(s.$slideTrack).addClass("slick-cloned");for(e=0;e<o+s.slideCount;e+=1)t=e,i(s.$slides[t]).clone(!0).attr("id","").attr("data-slick-index",t+s.slideCount).appendTo(s.$slideTrack).addClass("slick-cloned");s.$slideTrack.find(".slick-cloned").find("[id]").each(function(){i(this).attr("id","")})}},e.prototype.interrupt=function(i){var e=this;i||e.autoPlay(),e.interrupted=i},e.prototype.selectHandler=function(e){var t=this,o=i(e.target).is(".slick-slide")?i(e.target):i(e.target).parents(".slick-slide"),s=parseInt(o.attr("data-slick-index"));s||(s=0),t.slideCount<=t.options.slidesToShow?t.slideHandler(s,!1,!0):t.slideHandler(s)},e.prototype.slideHandler=function(i,e,t){var o,s,n,r,l,d=null,a=this;if(e=e||!1,!(!0===a.animating&&!0===a.options.waitForAnimate||!0===a.options.fade&&a.currentSlide===i))if(!1===e&&a.asNavFor(i),o=i,d=a.getLeft(o),r=a.getLeft(a.currentSlide),a.currentLeft=null===a.swipeLeft?r:a.swipeLeft,!1===a.options.infinite&&!1===a.options.centerMode&&(i<0||i>a.getDotCount()*a.options.slidesToScroll))!1===a.options.fade&&(o=a.currentSlide,!0!==t?a.animateSlide(r,function(){a.postSlide(o)}):a.postSlide(o));else if(!1===a.options.infinite&&!0===a.options.centerMode&&(i<0||i>a.slideCount-a.options.slidesToScroll))!1===a.options.fade&&(o=a.currentSlide,!0!==t?a.animateSlide(r,function(){a.postSlide(o)}):a.postSlide(o));else{if(a.options.autoplay&&clearInterval(a.autoPlayTimer),s=o<0?a.slideCount%a.options.slidesToScroll!=0?a.slideCount-a.slideCount%a.options.slidesToScroll:a.slideCount+o:o>=a.slideCount?a.slideCount%a.options.slidesToScroll!=0?0:o-a.slideCount:o,a.animating=!0,a.$slider.trigger("beforeChange",[a,a.currentSlide,s]),n=a.currentSlide,a.currentSlide=s,a.setSlideClasses(a.currentSlide),a.options.asNavFor&&(l=(l=a.getNavTarget()).slick("getSlick")).slideCount<=l.options.slidesToShow&&l.setSlideClasses(a.currentSlide),a.updateDots(),a.updateArrows(),!0===a.options.fade)return!0!==t?(a.fadeSlideOut(n),a.fadeSlide(s,function(){a.postSlide(s)})):a.postSlide(s),void a.animateHeight();!0!==t?a.animateSlide(d,function(){a.postSlide(s)}):a.postSlide(s)}},e.prototype.startLoad=function(){var i=this;!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.hide(),i.$nextArrow.hide()),!0===i.options.dots&&i.slideCount>i.options.slidesToShow&&i.$dots.hide(),i.$slider.addClass("slick-loading")},e.prototype.swipeDirection=function(){var i,e,t,o,s=this;return i=s.touchObject.startX-s.touchObject.curX,e=s.touchObject.startY-s.touchObject.curY,t=Math.atan2(e,i),(o=Math.round(180*t/Math.PI))<0&&(o=360-Math.abs(o)),o<=45&&o>=0?!1===s.options.rtl?"left":"right":o<=360&&o>=315?!1===s.options.rtl?"left":"right":o>=135&&o<=225?!1===s.options.rtl?"right":"left":!0===s.options.verticalSwiping?o>=35&&o<=135?"down":"up":"vertical"},e.prototype.swipeEnd=function(i){var e,t,o=this;if(o.dragging=!1,o.swiping=!1,o.scrolling)return o.scrolling=!1,!1;if(o.interrupted=!1,o.shouldClick=!(o.touchObject.swipeLength>10),void 0===o.touchObject.curX)return!1;if(!0===o.touchObject.edgeHit&&o.$slider.trigger("edge",[o,o.swipeDirection()]),o.touchObject.swipeLength>=o.touchObject.minSwipe){switch(t=o.swipeDirection()){case"left":case"down":e=o.options.swipeToSlide?o.checkNavigable(o.currentSlide+o.getSlideCount()):o.currentSlide+o.getSlideCount(),o.currentDirection=0;break;case"right":case"up":e=o.options.swipeToSlide?o.checkNavigable(o.currentSlide-o.getSlideCount()):o.currentSlide-o.getSlideCount(),o.currentDirection=1}"vertical"!=t&&(o.slideHandler(e),o.touchObject={},o.$slider.trigger("swipe",[o,t]))}else o.touchObject.startX!==o.touchObject.curX&&(o.slideHandler(o.currentSlide),o.touchObject={})},e.prototype.swipeHandler=function(i){var e=this;if(!(!1===e.options.swipe||"ontouchend"in document&&!1===e.options.swipe||!1===e.options.draggable&&-1!==i.type.indexOf("mouse")))switch(e.touchObject.fingerCount=i.originalEvent&&void 0!==i.originalEvent.touches?i.originalEvent.touches.length:1,e.touchObject.minSwipe=e.listWidth/e.options.touchThreshold,!0===e.options.verticalSwiping&&(e.touchObject.minSwipe=e.listHeight/e.options.touchThreshold),i.data.action){case"start":e.swipeStart(i);break;case"move":e.swipeMove(i);break;case"end":e.swipeEnd(i)}},e.prototype.swipeMove=function(i){var e,t,o,s,n,r,l=this;return n=void 0!==i.originalEvent?i.originalEvent.touches:null,!(!l.dragging||l.scrolling||n&&1!==n.length)&&(e=l.getLeft(l.currentSlide),l.touchObject.curX=void 0!==n?n[0].pageX:i.clientX,l.touchObject.curY=void 0!==n?n[0].pageY:i.clientY,l.touchObject.swipeLength=Math.round(Math.sqrt(Math.pow(l.touchObject.curX-l.touchObject.startX,2))),r=Math.round(Math.sqrt(Math.pow(l.touchObject.curY-l.touchObject.startY,2))),!l.options.verticalSwiping&&!l.swiping&&r>4?(l.scrolling=!0,!1):(!0===l.options.verticalSwiping&&(l.touchObject.swipeLength=r),t=l.swipeDirection(),void 0!==i.originalEvent&&l.touchObject.swipeLength>4&&(l.swiping=!0,i.preventDefault()),s=(!1===l.options.rtl?1:-1)*(l.touchObject.curX>l.touchObject.startX?1:-1),!0===l.options.verticalSwiping&&(s=l.touchObject.curY>l.touchObject.startY?1:-1),o=l.touchObject.swipeLength,l.touchObject.edgeHit=!1,!1===l.options.infinite&&(0===l.currentSlide&&"right"===t||l.currentSlide>=l.getDotCount()&&"left"===t)&&(o=l.touchObject.swipeLength*l.options.edgeFriction,l.touchObject.edgeHit=!0),!1===l.options.vertical?l.swipeLeft=e+o*s:l.swipeLeft=e+o*(l.$list.height()/l.listWidth)*s,!0===l.options.verticalSwiping&&(l.swipeLeft=e+o*s),!0!==l.options.fade&&!1!==l.options.touchMove&&(!0===l.animating?(l.swipeLeft=null,!1):void l.setCSS(l.swipeLeft))))},e.prototype.swipeStart=function(i){var e,t=this;if(t.interrupted=!0,1!==t.touchObject.fingerCount||t.slideCount<=t.options.slidesToShow)return t.touchObject={},!1;void 0!==i.originalEvent&&void 0!==i.originalEvent.touches&&(e=i.originalEvent.touches[0]),t.touchObject.startX=t.touchObject.curX=void 0!==e?e.pageX:i.clientX,t.touchObject.startY=t.touchObject.curY=void 0!==e?e.pageY:i.clientY,t.dragging=!0},e.prototype.unfilterSlides=e.prototype.slickUnfilter=function(){var i=this;null!==i.$slidesCache&&(i.unload(),i.$slideTrack.children(this.options.slide).detach(),i.$slidesCache.appendTo(i.$slideTrack),i.reinit())},e.prototype.unload=function(){var e=this;i(".slick-cloned",e.$slider).remove(),e.$dots&&e.$dots.remove(),e.$prevArrow&&e.htmlExpr.test(e.options.prevArrow)&&e.$prevArrow.remove(),e.$nextArrow&&e.htmlExpr.test(e.options.nextArrow)&&e.$nextArrow.remove(),e.$slides.removeClass("slick-slide slick-active slick-visible slick-current").attr("aria-hidden","true").css("width","")},e.prototype.unslick=function(i){var e=this;e.$slider.trigger("unslick",[e,i]),e.destroy()},e.prototype.updateArrows=function(){var i=this;Math.floor(i.options.slidesToShow/2),!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&!i.options.infinite&&(i.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false"),i.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false"),0===i.currentSlide?(i.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true"),i.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false")):i.currentSlide>=i.slideCount-i.options.slidesToShow&&!1===i.options.centerMode?(i.$nextArrow.addClass("slick-disabled").attr("aria-disabled","true"),i.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false")):i.currentSlide>=i.slideCount-1&&!0===i.options.centerMode&&(i.$nextArrow.addClass("slick-disabled").attr("aria-disabled","true"),i.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false")))},e.prototype.updateDots=function(){var i=this;null!==i.$dots&&(i.$dots.find("li").removeClass("slick-active").end(),i.$dots.find("li").eq(Math.floor(i.currentSlide/i.options.slidesToScroll)).addClass("slick-active"))},e.prototype.visibility=function(){var i=this;i.options.autoplay&&(document[i.hidden]?i.interrupted=!0:i.interrupted=!1)},i.fn.slick=function(){var i,t,o=this,s=arguments[0],n=Array.prototype.slice.call(arguments,1),r=o.length;for(i=0;i<r;i++)if("object"==typeof s||void 0===s?o[i].slick=new e(o[i],s):t=o[i].slick[s].apply(o[i].slick,n),void 0!==t)return t;return o}});
admin/js/tvc-ee-custom.js CHANGED
@@ -45,5 +45,12 @@ var tvc_helper = {
45
  let tvc_popup_box = document.getElementById('tvc_popup_box');
46
  tvc_popup_box.classList.add("tvc_popup_box_close");
47
  //tvc_popup_box.style.display = "none";
 
 
 
 
 
 
 
48
  }
49
  };
45
  let tvc_popup_box = document.getElementById('tvc_popup_box');
46
  tvc_popup_box.classList.add("tvc_popup_box_close");
47
  //tvc_popup_box.style.display = "none";
48
+ },
49
+ loaderSection:function(isShow) {
50
+ if (isShow){
51
+ $('#feed-spinner').show();
52
+ }else{
53
+ $('#feed-spinner').hide();
54
+ }
55
  }
56
  };
admin/partials/about-plugin.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
  $message = new Enhanced_Ecommerce_Google_Settings();
3
- $obj = new Enhanced_Ecommerce_Google_Analytics_Admin($plugin_name = 'enhanced-e-commerce-for-woocommerce-store', $version = PLUGIN_NAME_VERSION);
4
  $today = $obj->today();
5
  $start = $obj->start_date();
6
  $end = $obj->end_date();
@@ -161,7 +161,7 @@ $endtime = $obj->end_time();
161
  <tr>
162
  <th class="w-25"></th>
163
  <th class="w-25"></th>
164
- <th class=""><a href="https://codecanyon.net/item/actionable-google-analytics-for-woocommerce/9899552?utm_source=TatvicEE&utm_medium=DashboardBuyBottom&utm_campaign=WPlisting" target="_blank"><button class="btn btn-primary"><strong>Get premium plugin</strong>
165
  <?php if($today >= $start && $today <= $end && $currentime <= $endtime) {?>
166
  <img class="new-img-blink-side" src='<?php echo plugins_url('../images/discount.gif', __FILE__ ) ?>' />
167
  <?php }?>
1
  <?php
2
  $message = new Enhanced_Ecommerce_Google_Settings();
3
+ $obj = new Enhanced_Ecommerce_Google_Analytics_Admin($plugin_name = 'enhanced-e-commerce-for-woocommerce-store', $version = PLUGIN_TVC_VERSION);
4
  $today = $obj->today();
5
  $start = $obj->start_date();
6
  $end = $obj->end_date();
161
  <tr>
162
  <th class="w-25"></th>
163
  <th class="w-25"></th>
164
+ <th class=""><a href="#" target="_blank"><button class="btn btn-primary"><strong>Get premium plugin</strong>
165
  <?php if($today >= $start && $today <= $end && $currentime <= $endtime) {?>
166
  <img class="new-img-blink-side" src='<?php echo plugins_url('../images/discount.gif', __FILE__ ) ?>' />
167
  <?php }?>
admin/partials/enhanced-ecommerce-google-analytics-admin-display.php CHANGED
@@ -15,92 +15,80 @@ if (!defined('ABSPATH')) {
15
  exit;
16
  }
17
  class TVC_Tabs {
18
- protected $TVC_Admin_Helper;
19
- protected $site_url;
20
- public function __construct() {
21
- $this->TVC_Admin_Helper = new TVC_Admin_Helper();
22
- $this->site_url = "admin.php?page=enhanced-ecommerce-google-analytics-admin-display&tab=";
23
- $this->create_tabs();
24
- }
25
- protected function info_htnml($validation){
26
- if($validation == true){
27
- return '<img src="'.ENHANCAD_PLUGIN_URL.'/admin/images/config-success.svg" alt="configuration success" class="config-success">';
28
- }else{
29
- return '<img src="'.ENHANCAD_PLUGIN_URL.'/admin/images/exclaimation.png" alt="configuration success" class="config-fail">';
30
- }
31
- }
32
- /* add active tab class */
33
- protected function is_active_tabs($tab_name=""){
34
- if($tab_name!="" && isset($_GET['tab']) && $_GET['tab'] == $tab_name){
35
- return "active";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  }
37
- return ;
38
- }
39
- protected function create_tabs(){
40
- $setting_status = $this->TVC_Admin_Helper->check_setting_status();
41
- //print_r($setting_status); exit;
42
- /*$today = $obj->today();
43
- $start = $obj->start_date();
44
- $end = $obj->end_date();
45
- $currentime = $obj->current_time();
46
- $endtime = $obj->end_time();*/
47
  ?>
48
- <div class="container-fluid">
49
- <ul class="nav nav-tabs nav-pills">
50
- <li class="nav-item">
51
- <div class="tvc-tooltip <?php echo (empty($_GET['tab']))?'active':$this->is_active_tabs('general_settings'); ?>">
52
- <?php if(isset($setting_status['google_analytic']) && $setting_status['google_analytic'] == false ){?>
53
- <?php echo (isset($setting_status['google_analytic_msg'])?'<span class="tvc-tooltiptext tvc-tooltip-right">'.$setting_status['google_analytic_msg'].'</span>':"") ?>
54
- <?php }?>
55
- <div class="border-left aga-tab nav-item nav-link <?php echo (empty($_GET['tab']))?'active':$this->is_active_tabs('general_settings'); ?>">
56
- <?php if(isset($setting_status['google_analytic']) ){
57
- echo $this->info_htnml($setting_status['google_analytic']);
58
- }?>
59
- <a href="<?php echo $this->site_url.'general_settings'; ?>" class=""> Google Analytics</a>
60
- </div>
61
- </div>
62
- </li>
63
- <li class="nav-item">
64
- <div class="tvc-tooltip <?php echo $this->is_active_tabs('google_ads'); ?>">
65
- <?php if(isset($setting_status['google_ads']) && $setting_status['google_ads'] == false ){?>
66
- <?php echo (isset($setting_status['google_ads'])?'<span class="tvc-tooltiptext tvc-tooltip-right">'.$setting_status['google_ads_msg'].'</span>':"") ?>
67
- <?php } ?>
68
- <div class="border-left aga-tab nav-link <?php echo $this->is_active_tabs('google_ads'); ?>">
69
- <?php if(isset($setting_status['google_ads']) ){
70
- echo $this->info_htnml($setting_status['google_ads']);
71
- }?>
72
- <a href="<?php echo $this->site_url.'google_ads'; ?>" class="">Google Ads</a>
73
- </div>
74
- </li>
75
- <?php
76
- $sub_tab_active="";
77
- if(isset($_GET['tab']) && ($_GET['tab'] == 'google_shopping_feed' || $_GET['tab'] == 'gaa_config_page' || $_GET['tab'] == 'sync_product_page' || $_GET['tab'] == 'shopping_campaigns_page' || $_GET['tab'] == 'add_campaign_page')){
78
- $sub_tab_active="active";
79
- }
80
- ?>
81
- <li class="nav-item">
82
- <div class="tvc-tooltip <?php echo (($sub_tab_active)?$sub_tab_active:$this->is_active_tabs('google_shopping_feed')); ?>">
83
- <?php if(isset($setting_status['google_shopping']) && $setting_status['google_shopping'] == false ){?>
84
- <?php echo (isset($setting_status['google_shopping_msg'])?'<span class="tvc-tooltiptext tvc-tooltip-right">'.$setting_status['google_shopping_msg'].'</span>':"") ?>
85
- <?php } ?>
86
- <div class="border-left aga-tab nav-link <?php echo (($sub_tab_active)?$sub_tab_active:$this->is_active_tabs('google_shopping_feed')); ?>">
87
- <?php if(isset($setting_status['google_shopping']) ){
88
- echo $this->info_htnml($setting_status['google_shopping']);
89
- }?>
90
- <a href="<?php echo $this->site_url.'google_shopping_feed'; ?>" class="">Google Shopping</a>
91
- </div>
92
- </li>
93
- <?php /*if($today >= $start && $today <= $end && $currentime <= $endtime) {?>
94
- <li class="nav-item">
95
- <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/discount.gif', __FILE__ ) ?>' /></a></div></li>
96
- <?php } else { ?>
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: Products sync limit - 500 </span>
101
- </li>
102
- </ul>
103
- </div>
104
- <?php
105
- }
106
  } ?>
15
  exit;
16
  }
17
  class TVC_Tabs {
18
+ protected $TVC_Admin_Helper;
19
+ protected $site_url;
20
+ public function __construct() {
21
+ $this->TVC_Admin_Helper = new TVC_Admin_Helper();
22
+ $this->site_url = "admin.php?page=enhanced-ecommerce-google-analytics-admin-display&tab=";
23
+
24
+ $this->create_tabs();
25
+ }
26
+ protected function info_htnml($validation){
27
+ if($validation == true){
28
+ return '<img src="'.ENHANCAD_PLUGIN_URL.'/admin/images/config-success.svg" alt="configuration success" class="config-success">';
29
+ }else{
30
+ return '<img src="'.ENHANCAD_PLUGIN_URL.'/admin/images/exclaimation.png" alt="configuration success" class="config-fail">';
31
+ }
32
+ }
33
+ /* add active tab class */
34
+ protected function is_active_tabs($tab_name=""){
35
+ if($tab_name!="" && isset($_GET['tab']) && $_GET['tab'] == $tab_name){
36
+ return "active";
37
+ }
38
+ return ;
39
+ }
40
+
41
+ protected function create_tabs(){
42
+ $setting_status = $this->TVC_Admin_Helper->check_setting_status();
43
+ ?>
44
+ <ul class="nav nav-pills nav-justified">
45
+ <li class="nav-item">
46
+ <div class="tvc-tooltip <?php echo (empty($_GET['tab']))?'active':$this->is_active_tabs('general_settings'); ?>">
47
+ <?php if(isset($setting_status['google_analytic']) && $setting_status['google_analytic'] == false ){?>
48
+ <?php echo (isset($setting_status['google_analytic_msg'])?'<span class="tvc-tooltiptext tvc-tooltip-right">'.$setting_status['google_analytic_msg'].'</span>':"") ?>
49
+ <?php }?>
50
+ <div class="nav-item nav-link <?php echo (empty($_GET['tab']))?'active':$this->is_active_tabs('general_settings'); ?>">
51
+ <?php if(isset($setting_status['google_analytic']) ){
52
+ echo $this->info_htnml($setting_status['google_analytic']);
53
+ }?>
54
+ <a href="<?php echo $this->site_url.'general_settings'; ?>" class=""> Google Analytics</a>
55
+ </div>
56
+ </div>
57
+ </li>
58
+ <li class="nav-item">
59
+ <div class="tvc-tooltip <?php echo $this->is_active_tabs('google_ads'); ?>">
60
+ <?php if(isset($setting_status['google_ads']) && $setting_status['google_ads'] == false ){?>
61
+ <?php echo (isset($setting_status['google_ads'])?'<span class="tvc-tooltiptext tvc-tooltip-right">'.$setting_status['google_ads_msg'].'</span>':"") ?>
62
+ <?php } ?>
63
+ <div class="nav-link <?php echo $this->is_active_tabs('google_ads'); ?>">
64
+ <?php if(isset($setting_status['google_ads']) ){
65
+ echo $this->info_htnml($setting_status['google_ads']);
66
+ }?>
67
+ <a href="<?php echo $this->site_url.'google_ads'; ?>" class="">Google Ads</a>
68
+ </div>
69
+ </li>
70
+ <?php
71
+ $sub_tab_active="";
72
+ if(isset($_GET['tab']) && ($_GET['tab'] == 'google_shopping_feed' || $_GET['tab'] == 'gaa_config_page' || $_GET['tab'] == 'sync_product_page' || $_GET['tab'] == 'shopping_campaigns_page' || $_GET['tab'] == 'add_campaign_page')){
73
+ $sub_tab_active="active";
74
  }
 
 
 
 
 
 
 
 
 
 
75
  ?>
76
+ <li class="nav-item">
77
+ <div class="tvc-tooltip <?php echo (($sub_tab_active)?$sub_tab_active:$this->is_active_tabs('google_shopping_feed')); ?>">
78
+ <?php if(isset($setting_status['google_shopping']) && $setting_status['google_shopping'] == false ){
79
+ echo (isset($setting_status['google_shopping_msg'])?'<span class="tvc-tooltiptext tvc-tooltip-right">'.$setting_status['google_shopping_msg'].'</span>':"");
80
+ } ?>
81
+ <div class="nav-link <?php echo (($sub_tab_active)?$sub_tab_active:$this->is_active_tabs('google_shopping_feed')); ?>">
82
+ <?php if(isset($setting_status['google_shopping']) ){
83
+ echo $this->info_htnml($setting_status['google_shopping']);
84
+ } ?>
85
+ <a href="<?php echo $this->site_url.'google_shopping_feed'; ?>" class="">Google Shopping</a>
86
+ </div>
87
+ </li>
88
+ <li class="tvc-help-need">
89
+ For any query, reach out to us at <a href="tel:+1 (415) 968-6313">+1 (415) 968-6313</a>
90
+ </li>
91
+ </ul>
92
+ <?php
93
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94
  } ?>
admin/partials/general-fields.php CHANGED
@@ -1,104 +1,119 @@
1
  <?php
2
  echo "<script>var return_url ='".esc_url($this->url)."';</script>";
3
  $TVC_Admin_Helper = new TVC_Admin_Helper();
4
- if (isset($_GET['connect']) && isset($_GET['subscription_id'])) {
5
-
6
- if (isset($_GET['subscription_id']) && $_GET['subscription_id']) {
7
- $_POST['subscription_id'] = $_GET['subscription_id'];
8
- Enhanced_Ecommerce_Google_Settings::add_update_settings('ee_options');
9
- }
10
- $customApiObj = new CustomApi();
11
- $google_detail = $customApiObj->getGoogleAnalyticDetail();
12
- if(isset($google_detail->data['status']) && $google_detail->data['status'] == 200 && !isset($_POST['ee_submit_plugin'])){
13
- if (isset($google_detail->data['data'])) {
14
- $googleDetail = $google_detail->data['data'];
15
- // save API data in DB
16
- $postData = [
17
- 'merchant_id' => $googleDetail->merchant_id,
18
- 'website_url' => $googleDetail->site_url,
19
- 'subscription_id' => $googleDetail->id,
20
- 'account_id' => $googleDetail->google_merchant_center_id
21
- ];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
 
23
- if ($googleDetail->is_site_verified == '0') {
24
- $postData['method']="file";
25
- $siteVerificationToken = $customApiObj->siteVerificationToken($postData);
26
- if (isset($siteVerificationToken->error) && !empty($siteVerificationToken->errors)) {
27
- goto call_method_tag;
28
- } else {
29
- $myFile = ABSPATH.$siteVerificationToken->data->token;
30
- if (!file_exists($myFile)) {
31
- $fh = fopen($myFile, 'w+');
32
- chmod($myFile,0777);
33
- $stringData = "google-site-verification: ".$siteVerificationToken->data->token;
34
- fwrite($fh, $stringData);
35
- fclose($fh);
36
- }
37
- $postData['method']="file";
38
- $siteVerification = $customApiObj->siteVerification($postData);
39
- if (isset($siteVerification->error) && !empty($siteVerification->errors)) {
40
- call_method_tag:
41
- //methd using tag
42
- $postData['method']="meta";
43
- $siteVerificationToken_tag = $customApiObj->siteVerificationToken($postData);
44
- if(isset($siteVerificationToken_tag->data->token) && $siteVerificationToken_tag->data->token){
45
- $TVC_Admin_Helper->set_ee_additional_data(array("add_site_varification_tag"=>1,"site_varification_tag_val"=> base64_encode($siteVerificationToken_tag->data->token)));
46
- sleep(1);
47
- $siteVerification_tag = $customApiObj->siteVerification($postData);
48
- if(isset($siteVerification_tag->error) && !empty($siteVerification_tag->errors)){
49
- }else{
50
- $googleDetail->is_site_verified = '1';
51
- }
52
- }
53
- } else {
54
- $googleDetail->is_site_verified = '1';
55
- }
56
- }
57
- }
58
- if ($googleDetail->is_domain_claim == '0') {
59
- $claimWebsite = $customApiObj->claimWebsite($postData);
60
- if (isset($claimWebsite->error) && !empty($claimWebsite->errors)) {
61
- } else {
62
- $googleDetail->is_domain_claim = '1';
63
- }
64
- }
65
- $_POST['subscription_id'] = $googleDetail->id;
66
- $_POST['ga_eeT'] = (isset($googleDetail->enhanced_e_commerce_tracking) && $googleDetail->enhanced_e_commerce_tracking == "1") ? "on" : "";
67
-
68
- $_POST['ga_ST'] = (isset($googleDetail->add_gtag_snippet) && $googleDetail->add_gtag_snippet == "1") ? "on" : "";
69
- $_POST['gm_id'] = $googleDetail->measurement_id;
70
- $_POST['ga_id'] = $googleDetail->property_id;
71
- $_POST['google_ads_id'] = $googleDetail->google_ads_id;
72
- $_POST['google_merchant_id'] = $googleDetail->google_merchant_center_id;
73
- $_POST['tracking_option'] = $googleDetail->tracking_option;
74
- $_POST['ga_gUser'] = 'on';
75
- //$_POST['ga_gCkout'] = 'on';
76
- $_POST['ga_Impr'] = 6;
77
- $_POST['ga_IPA'] = 'on';
78
- $_POST['ga_OPTOUT'] = 'on';
79
- $_POST['ga_PrivacyPolicy'] = 'on';
80
- $_POST['google-analytic'] = '';
81
- //update option in wordpress local database
82
- update_option('ads_tracking_id', $googleDetail->google_ads_id);
83
- update_option('ads_ert', $googleDetail->remarketing_tags);
84
- update_option('ads_edrt', $googleDetail->dynamic_remarketing_tags);
85
- Enhanced_Ecommerce_Google_Settings::add_update_settings('ee_options');
86
- //save data in DB
87
- $TVC_Admin_Helper->set_update_api_to_db($googleDetail);
88
- if(isset($googleDetail->google_merchant_center_id) || isset($googleDetail->google_ads_id) ){
89
- if( $googleDetail->google_merchant_center_id != "" && $googleDetail->google_ads_id != ""){
90
- wp_redirect("admin.php?page=enhanced-ecommerce-google-analytics-admin-display&tab=sync_product_page&welcome_msg=true");
91
- exit;
92
- }else{
93
- wp_redirect("admin.php?page=enhanced-ecommerce-google-analytics-admin-display&tab=gaa_config_page&welcome_msg=true");
94
- exit;
95
- }
96
- }
97
  }
 
98
  }
 
99
  } else if(isset($_GET['connect']) && !isset($_POST['ee_submit_plugin'])) {
100
  $googleDetail = [];
101
- $class = 'notice notice-error';
102
  $message_p = esc_html__('Google analytic detail is empty.');
103
  printf('<div class="%1$s"><p>%2$s</p></div>', esc_attr($class), esc_html($message_p));
104
  }else{
@@ -107,17 +122,19 @@ if (isset($_GET['connect']) && isset($_GET['subscription_id'])) {
107
  $message = new Enhanced_Ecommerce_Google_Settings();
108
  if (isset($_POST['ee_submit_plugin'])) {
109
  if(!empty($_POST['ga_id'])){
110
- $_POST['tracking_option'] = "UA";
111
  }
112
  if(!empty($_POST['gm_id'])){
113
- $_POST['tracking_option'] = "GA4";
114
  }
115
  if(!empty($_POST['gm_id']) && !empty($_POST['ga_id'])){
116
- $_POST['tracking_option'] = "BOTH";
117
  }
118
  update_option('ads_tracking_id', $_POST['google_ads_id']);
119
 
120
  Enhanced_Ecommerce_Google_Settings::add_update_settings('ee_options');
 
 
121
  /* API Save */
122
  /*if(isset($_POST['ga_eeT'])){
123
  $_POST['enhanced_e_commerce_tracking']=($_POST['ga_eeT']=="on")?1:0;
@@ -148,237 +165,275 @@ if (isset($_POST['ee_submit_plugin'])) {
148
  $r_message = esc_html__('Connect Google account to enable more features.');
149
  printf('<div class="%1$s"><p>%2$s</p></div>', esc_attr($class), esc_html('Error : ' . $r_message));
150
  }*/
151
-
152
  }
153
  $data = unserialize(get_option('ee_options'));
154
- $ads_trck_id = $TVC_Admin_Helper->get_ee_options_settings();
155
- ?>
156
- <div class="container-fluid">
157
- <div class="row">
158
- <div class= "col col-9" >
159
- <div class="card mw-100" style="padding:0px;">
160
- <?php $message->show_message(); ?>
161
- <?php /* <div class="card-header">
162
- <h3>Enhanced Ecommerce Google Analytics <a href = "https://wordpress.org/support/plugin/enhanced-e-commerce-for-woocommerce-store/reviews/" target="_blank" style="float: right">
163
- <div class="rating">
164
- <span>☆</span><span>☆</span><span>☆</span><span>☆</span><span>☆</span>
165
- </div>
166
- </a>
167
- </h3>
168
- </div>*/ ?>
169
- <div class="card-body">
170
- <form id="ee_plugin_form" class="tvc_ee_plugin_form" method="post" action="" enctype="multipart/form-data" >
171
- <table class="table table-bordered">
172
- <tbody>
173
- <tr>
174
- <td>
175
- <label class="align-middle" for="woocommerce_ee_google_analytics_ga_id">Universal Analytics ID</label>
176
- </td>
177
- <td>
178
- <?php if(isset($data['ga_id']) && $data['ga_id'] != '') { ?>
179
- <span class="tvc_title_val"><?= $data['ga_id']; ?></span>
180
- <p class="hint-text" style="color: #666;display: inline-block;float: right;padding-top: 5px;">To update analytics id, <a target="_blank" href="<?=esc_url($this->url)?>">click here</a></p>
181
- <?php } else {?>
182
- <div class="tvc_animate_btn_wrap">
183
- <button type="button" class="btn btn-primary tvc_animate_btn" data-toggle="modal" data-target="#staticBackdrop">
184
- Connect
185
- </button>
186
- </div>
187
- <?php } ?>
188
- </td>
189
-
190
- </tr>
191
- <tr>
192
- <td>
193
- <label class="align-middle" for="woocommerce_ee_google_analytics_ga_id">Google Analytics 4 ID</label>
194
- </td>
195
- <td>
196
- <?php if(isset($data['gm_id']) && $data['gm_id'] != '') { ?>
197
- <span class="tvc_title_val"><?= $data['gm_id']; ?></span>
198
- <p class="hint-text" style="color: #666;display: inline-block;float: right;padding-top: 5px;">To update google analytics 4 id, <a target="_blank" href="<?=esc_url($this->url)?>">click here</a></p>
199
- <?php } else {?>
200
- <div class="tvc_animate_btn_wrap">
201
- <button type="button" class="btn btn-primary tvc_animate_btn" data-toggle="modal" data-target="#staticBackdrop">
202
- Connect
203
- </button>
204
- </div>
205
- <?php } ?>
206
- </td>
207
-
208
- </tr>
209
- <tr>
210
- <td>
211
- <label class="align-middle" for="woocommerce_ee_google_analytics_ads_id">Linked Google Ads Account <i style="cursor: help;" class="fas fa-question-circle" title="To link Google Ads and Google Analytics, you’ll need administrative access to a Google Ads account and “Edit permissions” to a Google Analytics account.
212
- Why link Google Ads and Analytics account?
213
- When you link Google Ads and Analytics, you can:
214
- See ad and site performance data in the Google Ads reports in Analytics.
215
- Import Analytics goals and Ecommerce transactions into your Google Ads account.
216
- Import cross-device conversions into your Google Ads account when you activate Google signals.
217
- Import Analytics metrics like Bounce Rate, Avg. Session Duration, and Pages/Session into your Google Ads account.
218
- Enhance your Google Ads remarketing with Analytics Remarketing and Dynamic Remarketing.
219
- Get richer data in the Analytics Multi-Channel Funnels reports."></i></label>
220
- </td>
221
- <td>
222
- <?php if(isset($data['google_ads_id']) && $data['google_ads_id'] != '') { ?>
223
- <span class="tvc_title_val"><?= $data['google_ads_id']; ?></span>
224
- <p class="hint-text" style="color: #666;display: inline-block;float: right;padding-top: 5px;">To update ads account id, <a target="_blank" href="<?=esc_url($this->url)?>">click here</a></p>
225
- <?php } else {?>
226
- <div class="tvc_animate_btn_wrap">
227
- <button type="button" class="btn btn-primary tvc_animate_btn" data-toggle="modal" data-target="#staticBackdrop">
228
- Connect
229
- </button>
230
- </div>
231
- <?php } ?>
232
- </td>
233
-
234
- </tr>
235
- <tr>
236
- <td>
237
- <label class="align-middle" for="woocommerce_ee_google_analytics_merchant_id">Linked Google Merchant Center Account</label>
238
- </td>
239
- <td>
240
- <?php if(isset($data['google_merchant_id']) && $data['google_merchant_id'] != '') { ?>
241
- <span class="tvc_title_val"><?= $data['google_merchant_id']; ?></span>
242
- <p class="hint-text" style="color: #666;display: inline-block;float: right;padding-top: 5px;">To update merchant account id, <a target="_blank" href="<?=esc_url($this->url)?>">click here</a></p>
243
- <?php } else {?>
244
- <div class="tvc_animate_btn_wrap">
245
- <button type="button" class="btn btn-primary tvc_animate_btn" data-toggle="modal" data-target="#staticBackdrop">
246
- Connect
247
- </button>
248
- </div>
249
- <?php } ?>
250
- </td>
251
 
252
- </tr>
253
- <tr>
254
- <td>
255
- <label class="align-middle" for="tracking_code">Tracking Code</label>
256
- </td>
257
- <td>
258
- <label class = "align-middle">
259
- <?php $ga_ST = !empty($data['ga_ST']) ? 'checked' : ''; ?>
260
- <input type="checkbox" name="ga_ST" id="ga_ST" <?php echo $ga_ST; ?> >
261
- <label for="ga_ST">Add Global Site Tracking Code 'gtag.js'</label>
262
-
263
- <i style="cursor: help;" class="fas fa-question-circle" title="This feature adds new gtag.js tracking code to your store. You don't need to enable this if gtag.js is implemented via any third party analytics plugin."></i>
264
- <!--<p class="description">This feature adds new gtag.js tracking code to your store. You don't need to enable this if gtag.js is implemented via any third party analytics plugin.</p>-->
265
- </label><br/>
266
- <label class = "align-middle">
267
- <?php $ga_eeT = !empty($data['ga_eeT']) ? 'checked' : ''; ?>
268
- <input type="checkbox" name="ga_eeT" id="ga_eeT" <?php echo $ga_eeT; ?> >
269
- <label for="ga_eeT">Add Enhanced Ecommerce Tracking Code</label>
270
-
271
- <i style="cursor: help;" class="fas fa-question-circle" title="This feature adds Enhanced Ecommerce Tracking Code to your Store"></i>
272
- <!--<p class="description">This feature adds Enhanced Ecommerce Tracking Code to your Store</p>-->
273
- </label><br/>
274
- <label class = "align-middle">
275
- <?php $ga_gUser = !empty($data['ga_gUser']) ? 'checked' : ''; ?>
276
- <input type="checkbox" name="ga_gUser" id="ga_gUser" <?php echo $ga_gUser; ?> >
277
- <label for="ga_gUser">Add Code to Track the Login Step of Guest Users (Optional)</label>
278
-
279
- <i style="cursor: help;" class="fas fa-question-circle" title="If you have Guest Check out enable, we recommend you to add this code"></i>
280
- <!--<p class="description">If you have Guest Check out enable, we recommend you to add this code</p>-->
281
- </label><br/>
282
- </td>
283
- </tr>
284
- <tr>
285
- <td>
286
- <label for="ga_Impr">Impression Thresold</label>
287
- </td>
288
- <td>
289
- <?php $ga_Impr = !empty($data['ga_Impr']) ? $data['ga_Impr'] : 6; ?>
290
- <input type="number" min="1" id="ga_Impr" name = "ga_Impr" value = "<?php echo $ga_Impr; ?>">
291
- <label for="ga_Impr"></label>
292
- <i style="cursor: help;" class="fas fa-question-circle" title="This feature sets Impression threshold for category page. It sends hit after these many numbers of products impressions."></i>
293
- <p class="description"><br><b>Note : To avoid processing load on server we recommend upto 6 Impression Thresold.</b></p>
294
- </td>
295
- </tr>
296
- <tr>
297
- <td>
298
- <label class = "align-middle" for="ga_IPA">I.P. Anoymization</label>
299
- </td>
300
- <td>
301
- <label class = "align-middle">
302
- <?php $ga_IPA = !empty($data['ga_IPA']) ? 'checked' : ''; ?>
303
- <input class="" type="checkbox" name="ga_IPA" id="ga_IPA" <?php echo $ga_IPA; ?>>
304
- <label for="ga_IPA">Enable I.P. Anonymization</label>
305
-
306
- <i style="cursor: help;" class="fas fa-question-circle" title="Use this feature to anonymize (or stop collecting) the I.P Address of your users in Google Analytics. Be in legal compliance by using I.P Anonymization which is important for EU countries As per the GDPR compliance"></i>
307
- <!-- <p class="description">Use this feature to anonymize (or stop collecting) the I.P Address of your users in Google Analytics. Be in legal compliance by using I.P Anonymization which is important for EU countries As per the GDPR compliance</p>-->
308
- </label>
309
- </td>
310
- </tr>
311
- <tr>
312
- <td>
313
- <label class = "align-middle" for="ga_OPTOUT">Google Analytics Opt Out</label>
314
- </td>
315
- <td>
316
- <label class = "align-middle">
317
- <?php $ga_OPTOUT = !empty($data['ga_OPTOUT']) ? 'checked' : ''; ?>
318
- <input class="" type="checkbox" name="ga_OPTOUT" id="ga_OPTOUT" <?php echo $ga_OPTOUT; ?>>
319
- <label for="ga_OPTOUT">Enable Google Analytics Opt Out (Optional)</label>
320
-
321
- <i style="cursor: help;" class="fas fa-question-circle" title="Use this feature to provide website visitors the ability to prevent their data from being used by Google Analytics As per the GDPR compliance.Go through the documentation to check the setup"></i>
322
- <!--<p class="description">Use this feature to provide website visitors the ability to prevent their data from being used by Google Analytics As per the GDPR compliance.Go through the documentation to check the setup</p>-->
323
- </label>
324
- </td>
325
- </tr>
326
- <tr>
327
- <td>
328
- <label class = "align-middle" for="ga_PrivacyPolicy">Privacy Policy</label>
329
- </td>
330
- <td>
331
- <label class = "align-middle">
332
- <?php $ga_PrivacyPolicy = !empty($data['ga_PrivacyPolicy']) ? 'checked' : ''; ?>
333
- <input type="checkbox" name="ga_PrivacyPolicy" id="ga_PrivacyPolicy" required="required" <?php echo $ga_PrivacyPolicy; ?>>
334
- <label for="ga_PrivacyPolicy">Accept Privacy Policy of Plugin</label>
335
-
336
- <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>
337
- </label>
338
- </td>
339
- </tr>
340
- </tbody>
341
- </table>
342
- <p class="submit save-for-later" id="save-for-later">
343
 
344
- <input type="hidden" id="ga_id" name = "ga_id" value="<?= (!empty($data['ga_id']))?$data['ga_id']:""; ?>"/>
345
- <input type="hidden" id="gm_id" name = "gm_id" value="<?= (!empty($data['gm_id']))?$data['gm_id']:""; ?>"/>
346
- <input type="hidden" id="google_ads_id" name = "google_ads_id" value="<?= (!empty($data['google_ads_id']))?$data['google_ads_id']:""; ?>"/>
347
- <input type="hidden" id="google_merchant_id" name = "google_merchant_id" value="<?= (!empty($data['google_merchant_id']))?$data['google_merchant_id']:""; ?>"/>
348
- <input type="hidden" name="subscription_id" value="<?php echo (!empty($data['subscription_id']))?$data['subscription_id']:""; ?>">
349
- <button type="submit" class="btn btn-primary btn-success" id="ee_submit_plugin" name="ee_submit_plugin">Submit</button>
350
- </p>
351
- </form>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
352
  </div>
 
353
  </div>
354
- <!-- Modal -->
355
- <div class="modal fade" id="staticBackdrop" data-backdrop="static" data-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
356
- <div class="modal-dialog modal-dialog-centered">
357
- <div class="modal-content">
358
- <div class="modal-header">
359
- <h5 class="modal-title" id="staticBackdropLabel">Connect Tatvic with your website</h5>
360
- <button type="button" class="close" data-dismiss="modal" aria-label="Close">
361
- <span aria-hidden="true">&times;</span>
362
- </button>
363
- </div>
364
- <div class="modal-body">
365
- By continuing from here, you will be redirected to Tatvic’s website to configure your google analytics, google ads and google merchant center accounts.
366
- <br>
367
- <br>
368
- Make sure you sign in with the google account that has all privileges to access google analytics, google ads and google merchant center account.
369
- </div>
370
- <div class="modal-footer">
371
- <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;">
372
- <p style="font-size: inherit; margin-top:5px;"><img width="20px" style="margin-right:8px" alt="Google sign-in"
373
- 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>
374
- </a>
375
- <!--sigin with google end-->
376
- </div>
377
- </div>
378
  </div>
 
379
  </div>
380
- <!-- Modal End -->
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
381
  </div>
382
- <?php require_once('sidebar.php'); ?>
383
  </div>
384
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <?php
2
  echo "<script>var return_url ='".esc_url($this->url)."';</script>";
3
  $TVC_Admin_Helper = new TVC_Admin_Helper();
4
+ $class = "";
5
+ $message_p = "";
6
+ if (isset($_GET['connect']) && isset($_GET['subscription_id'])) {
7
+ /*
8
+ * save subscription_id in "ee_options" and then API call for get subscription details
9
+ */
10
+ if (isset($_GET['subscription_id']) && $_GET['subscription_id']) {
11
+ $_POST['subscription_id'] = $_GET['subscription_id'];
12
+ Enhanced_Ecommerce_Google_Settings::add_update_settings('ee_options');
13
+ }
14
+ $customApiObj = new CustomApi();
15
+ $google_detail = $customApiObj->getGoogleAnalyticDetail();
16
+ /*
17
+ * active licence key while come from server page
18
+ */
19
+ $ee_additional_data = $TVC_Admin_Helper->get_ee_additional_data();
20
+ if(isset($ee_additional_data['temp_active_licence_key']) && $ee_additional_data['temp_active_licence_key'] != ""){
21
+ $licence_key = $ee_additional_data['temp_active_licence_key'];
22
+ $TVC_Admin_Helper->active_licence($licence_key, $_GET['subscription_id']);
23
+ unset($ee_additional_data['temp_active_licence_key']);
24
+ $TVC_Admin_Helper->set_ee_additional_data($ee_additional_data);
25
+ }
26
+
27
+ if(property_exists($google_detail,"error") && $google_detail->error == false && !isset($_POST['ee_submit_plugin'])){
28
+ if(property_exists($google_detail,"data") && $google_detail->data != ""){
29
+ $googleDetail = $google_detail->data;
30
+ //'website_url' => $googleDetail->site_url,
31
+ $postData = [
32
+ 'merchant_id' => $googleDetail->merchant_id,
33
+ 'website_url' => get_site_url(),
34
+ 'subscription_id' => $googleDetail->id,
35
+ 'account_id' => $googleDetail->google_merchant_center_id
36
+ ];
37
 
38
+ if ($googleDetail->is_site_verified == '0') {
39
+ $postData['method']="file";
40
+ $siteVerificationToken = $customApiObj->siteVerificationToken($postData);
41
+ if (isset($siteVerificationToken->error) && !empty($siteVerificationToken->errors)) {
42
+ goto call_method_tag;
43
+ } else {
44
+ $myFile = ABSPATH.$siteVerificationToken->data->token;
45
+ if (!file_exists($myFile)) {
46
+ $fh = fopen($myFile, 'w+');
47
+ chmod($myFile,0777);
48
+ $stringData = "google-site-verification: ".$siteVerificationToken->data->token;
49
+ fwrite($fh, $stringData);
50
+ fclose($fh);
51
+ }
52
+ $postData['method']="file";
53
+ $siteVerification = $customApiObj->siteVerification($postData);
54
+ if (isset($siteVerification->error) && !empty($siteVerification->errors)) {
55
+ call_method_tag:
56
+ //methd using tag
57
+ $postData['method']="meta";
58
+ $siteVerificationToken_tag = $customApiObj->siteVerificationToken($postData);
59
+ if(isset($siteVerificationToken_tag->data->token) && $siteVerificationToken_tag->data->token){
60
+ $TVC_Admin_Helper->set_ee_additional_data(array("add_site_varification_tag"=>1,"site_varification_tag_val"=> base64_encode($siteVerificationToken_tag->data->token)));
61
+ sleep(1);
62
+ $siteVerification_tag = $customApiObj->siteVerification($postData);
63
+ if(isset($siteVerification_tag->error) && !empty($siteVerification_tag->errors)){
64
+ }else{
65
+ $googleDetail->is_site_verified = '1';
66
+ }
67
+ }
68
+ } else {
69
+ $googleDetail->is_site_verified = '1';
70
+ }
71
+ }
72
+ }
73
+ if ($googleDetail->is_domain_claim == '0') {
74
+ $claimWebsite = $customApiObj->claimWebsite($postData);
75
+ if (isset($claimWebsite->error) && !empty($claimWebsite->errors)) {
76
+ } else {
77
+ $googleDetail->is_domain_claim = '1';
78
+ }
79
+ }
80
+ $_POST['subscription_id'] = $googleDetail->id;
81
+ $_POST['ga_eeT'] = (isset($googleDetail->enhanced_e_commerce_tracking) && $googleDetail->enhanced_e_commerce_tracking == "1") ? "on" : "";
82
+
83
+ $_POST['ga_ST'] = (isset($googleDetail->add_gtag_snippet) && $googleDetail->add_gtag_snippet == "1") ? "on" : "";
84
+ $_POST['gm_id'] = $googleDetail->measurement_id;
85
+ $_POST['ga_id'] = $googleDetail->property_id;
86
+ $_POST['google_ads_id'] = $googleDetail->google_ads_id;
87
+ $_POST['google_merchant_id'] = $googleDetail->google_merchant_center_id;
88
+ $_POST['tracking_option'] = $googleDetail->tracking_option;
89
+ $_POST['ga_gUser'] = 'on';
90
+ //$_POST['ga_gCkout'] = 'on';
91
+ $_POST['ga_Impr'] = 6;
92
+ $_POST['ga_IPA'] = 'on';
93
+ $_POST['ga_OPTOUT'] = 'on';
94
+ $_POST['ga_PrivacyPolicy'] = 'on';
95
+ $_POST['google-analytic'] = '';
96
+ //update option in wordpress local database
97
+ update_option('ads_tracking_id', $googleDetail->google_ads_id);
98
+ update_option('ads_ert', $googleDetail->remarketing_tags);
99
+ update_option('ads_edrt', $googleDetail->dynamic_remarketing_tags);
100
+ Enhanced_Ecommerce_Google_Settings::add_update_settings('ee_options');
101
+ //save data in DB
102
+ $TVC_Admin_Helper->set_update_api_to_db($googleDetail, false);
103
+ if(isset($googleDetail->google_merchant_center_id) || isset($googleDetail->google_ads_id) ){
104
+ if( $googleDetail->google_merchant_center_id != "" && $googleDetail->google_ads_id != ""){
105
+ wp_redirect("admin.php?page=enhanced-ecommerce-google-analytics-admin-display&tab=sync_product_page&welcome_msg=true");
106
+ exit;
107
+ }else{
108
+ wp_redirect("admin.php?page=enhanced-ecommerce-google-analytics-admin-display&tab=gaa_config_page&welcome_msg=true");
109
+ exit;
 
 
110
  }
111
+ }
112
  }
113
+ }
114
  } else if(isset($_GET['connect']) && !isset($_POST['ee_submit_plugin'])) {
115
  $googleDetail = [];
116
+ $class = 'alert-message tvc-alert-error';
117
  $message_p = esc_html__('Google analytic detail is empty.');
118
  printf('<div class="%1$s"><p>%2$s</p></div>', esc_attr($class), esc_html($message_p));
119
  }else{
122
  $message = new Enhanced_Ecommerce_Google_Settings();
123
  if (isset($_POST['ee_submit_plugin'])) {
124
  if(!empty($_POST['ga_id'])){
125
+ $_POST['tracking_option'] = "UA";
126
  }
127
  if(!empty($_POST['gm_id'])){
128
+ $_POST['tracking_option'] = "GA4";
129
  }
130
  if(!empty($_POST['gm_id']) && !empty($_POST['ga_id'])){
131
+ $_POST['tracking_option'] = "BOTH";
132
  }
133
  update_option('ads_tracking_id', $_POST['google_ads_id']);
134
 
135
  Enhanced_Ecommerce_Google_Settings::add_update_settings('ee_options');
136
+ $class = 'alert-message tvc-alert-success';
137
+ $message_p = __( 'Your settings have been saved.', 'sample-text-domain' );
138
  /* API Save */
139
  /*if(isset($_POST['ga_eeT'])){
140
  $_POST['enhanced_e_commerce_tracking']=($_POST['ga_eeT']=="on")?1:0;
165
  $r_message = esc_html__('Connect Google account to enable more features.');
166
  printf('<div class="%1$s"><p>%2$s</p></div>', esc_attr($class), esc_html('Error : ' . $r_message));
167
  }*/
 
168
  }
169
  $data = unserialize(get_option('ee_options'));
170
+ $subscription_id = $TVC_Admin_Helper->get_subscriptionId();
171
+ $TVC_Admin_Helper->add_spinner_html();
172
+ $google_detail = $TVC_Admin_Helper->get_ee_options_data();
173
+ $googleDetail = "";
174
+ $plan_id = 1;
175
+ if(isset($google_detail['setting'])){
176
+ $googleDetail = $google_detail['setting'];
177
+ if(isset($googleDetail->plan_id) && !in_array($googleDetail->plan_id, array("1"))){
178
+ $plan_id = $googleDetail->plan_id;
179
+ }
180
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
181
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
182
 
183
+ ?>
184
+ <div class="tab-content">
185
+ <?php if($message_p){
186
+ printf('<div class="%1$s"><div class="alert">%2$s</div></div>', esc_attr($class), esc_html($message_p));
187
+ }?>
188
+ <div class="tab-pane show active" id="googleShoppingFeed">
189
+ <div class="tab-card">
190
+ <div class="row">
191
+ <div class="col-md-6 col-lg-8 border-right">
192
+ <?php if($plan_id == 1){?>
193
+ <div class="licence tvc-licence" >
194
+ <div class="tvc_licence_key_wapper <?php if($plan_id != 1){?>tvc-hide<?php }?>">
195
+ <p>You are using our free plugin, no licence needed ! Happy analyzing..!! :)</p>
196
+ <p class="font-weight-bold">To unlock more features of google products, consider our <a href="<?php echo $TVC_Admin_Helper->get_pro_plan_site(); ?>" target="_blank">pro version.</a></p>
197
+ <?php /*
198
+ <form method="post" name="google-analytic" id="tvc-licence-active">
199
+ <div class="input-group">
200
+ <input type="text" id="licence_key" name="licence_key" class="form-control" placeholder="Already purchased? Enter licence key" required="">
201
+ <div class="input-group-append">
202
+ <button type="submit" class="btn btn-primary" name="verify-licence-key"><img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/right-arrow.svg'; ?>" alt="active licence key"></button>
203
+ </div>
204
+ </div>
205
+ </form>
206
+ */ ?>
207
+ </div>
208
+ </div>
209
+ <?php }?>
210
+ <div class="google-account-analytics">
211
+ <div class="row mb-3">
212
+ <div class="col-6 col-md-6 col-lg-6">
213
+ <h2 class="ga-title">Connected Google Analytics Account:</h2>
214
+ </div>
215
+ <div class="col-6 col-md-6 col-lg-6 text-right">
216
+ <div class="acc-num">
217
+ <p class="ga-text">
218
+ <?php echo ((isset($data['ga_id']) && $data['ga_id'] != '') ? $data['ga_id'] : '<span>Get started</span>'); ?>
219
+ </p>
220
+ <?php
221
+ if (isset($data['ga_id']) && $data['ga_id'] != '') {
222
+ echo '<p class="ga-text text-right"><a target="_blank" href="' . $this->url . '" class="text-underline"><img src="'. ENHANCAD_PLUGIN_URL.'/admin/images/icon/refresh.svg" alt="refresh"/></a></p>';
223
+ } else {
224
+ echo '<p class="ga-text text-right"><a href="#" class="text-underline" data-toggle="modal" data-target="#tvc_google_connect"><img src="'. ENHANCAD_PLUGIN_URL.'/admin/images/icon/add.svg" alt="connect account"/></a></p>';
225
+ }?>
226
  </div>
227
+ </div>
228
  </div>
229
+ <div class="row mb-3">
230
+ <div class="col-6 col-md-6 col-lg-6">
231
+ <h2 class="ga-title">Connected Google Analytics 4 Account:</h2>
232
+ </div>
233
+ <div class="col-6 col-md-6 col-lg-6 text-right">
234
+ <div class="acc-num">
235
+ <p class="ga-text">
236
+ <?php echo ((isset($data['gm_id']) && $data['gm_id'] != '') ? $data['gm_id'] : '<span>Get started</span>'); ?>
237
+ </p>
238
+ <?php
239
+ if (isset($data['gm_id']) && $data['gm_id'] != '') {
240
+ echo '<p class="ga-text text-right"><a target="_blank" href="' . $this->url . '" class="text-underline"><img src="'. ENHANCAD_PLUGIN_URL.'/admin/images/icon/refresh.svg" alt="refresh"/></a></p>';
241
+ } else {
242
+ echo '<p class="ga-text text-right"><a href="#" class="text-underline" data-toggle="modal" data-target="#tvc_google_connect"><img src="'. ENHANCAD_PLUGIN_URL.'/admin/images/icon/add.svg" alt="connect account"/></a></p>';
243
+ }?>
 
 
 
 
 
 
 
 
 
244
  </div>
245
+ </div>
246
  </div>
247
+ <div class="row mb-3">
248
+ <div class="col-6 col-md-6 col-lg-6">
249
+ <h2 class="ga-title">Linked Google Ads Account:</h2>
250
+ </div>
251
+ <div class="col-6 col-md-6 col-lg-6 text-right">
252
+ <div class="acc-num">
253
+ <p class="ga-text">
254
+ <?php echo ((isset($data['google_ads_id']) && $data['google_ads_id'] != '') ? $data['google_ads_id'] : '<span>Get started</span>'); ?>
255
+ </p>
256
+ <?php
257
+ if (isset($data['google_ads_id']) && $data['google_ads_id'] != '') {
258
+ echo '<p class="ga-text text-right"><a target="_blank" href="' . $this->url . '" class="text-underline"><img src="'. ENHANCAD_PLUGIN_URL.'/admin/images/icon/refresh.svg" alt="refresh"/></a></p>';
259
+ } else {
260
+ echo '<p class="ga-text text-right"><a href="#" class="text-underline" data-toggle="modal" data-target="#tvc_google_connect"><img src="'. ENHANCAD_PLUGIN_URL.'/admin/images/icon/add.svg" alt="connect account"/></a></p>';
261
+ }?>
262
+ </div>
263
+ </div>
264
+ </div>
265
+ <div class="row mb-3">
266
+ <div class="col-6 col-md-6 col-lg-6">
267
+ <h2 class="ga-title">Linked Google Merchant Center Account:</h2>
268
+ </div>
269
+ <div class="col-6 col-md-6 col-lg-6 text-right">
270
+ <div class="acc-num">
271
+ <p class="ga-text">
272
+ <?php echo ((isset($data['google_merchant_id']) && $data['google_merchant_id'] != '') ? $data['google_merchant_id'] : '<span>Get started</span>'); ?>
273
+ </p>
274
+ <?php
275
+ if (isset($data['google_merchant_id']) && $data['google_merchant_id'] != '') {
276
+ echo '<p class="ga-text text-right"><a target="_blank" href="' . $this->url . '" class="text-underline"><img src="'. ENHANCAD_PLUGIN_URL.'/admin/images/icon/refresh.svg" alt="refresh"/></a></p>';
277
+ } else {
278
+ echo '<p class="ga-text text-right"><a href="#" class="text-underline" data-toggle="modal" data-target="#tvc_google_connect"><img src="'. ENHANCAD_PLUGIN_URL.'/admin/images/icon/add.svg" alt="connect account"/></a></p>';
279
+ }?>
280
+ </div>
281
+ </div>
282
+ </div>
283
+ </div>
284
+
285
+ <form id="ee_plugin_form" class="tvc_ee_plugin_form" name="google-analytic-setting-form" method="post" >
286
+ <table class="table">
287
+ <tbody>
288
+ <tr>
289
+ <th>
290
+ <label class="align-middle" for="tracking_code">Tracking Code</label>
291
+ </th>
292
+ <td>
293
+ <label class = "align-middle">
294
+ <?php $ga_ST = !empty($data['ga_ST']) ? 'checked' : ''; ?>
295
+ <input type="checkbox" name="ga_ST" id="ga_ST" <?php echo $ga_ST; ?> >
296
+ <label class="custom-control-label" for="ga_ST">Add Global Site Tracking Code 'gtag.js'</label>
297
+
298
+ <i style="cursor: help;" class="fas fa-question-circle" title="This feature adds new gtag.js tracking code to your store. You don't need to enable this if gtag.js is implemented via any third party analytics plugin."></i>
299
+ </label><br/>
300
+ <label class = "align-middle">
301
+ <?php $ga_eeT = !empty($data['ga_eeT']) ? 'checked' : ''; ?>
302
+ <input type="checkbox" name="ga_eeT" id="ga_eeT" <?php echo $ga_eeT; ?> >
303
+ <label class="custom-control-label" for="ga_eeT">Add Enhanced Ecommerce Tracking Code</label>
304
+
305
+ <i style="cursor: help;" class="fas fa-question-circle" title="This feature adds Enhanced Ecommerce Tracking Code to your Store"></i>
306
+ </label><br/>
307
+ <label class = "align-middle">
308
+ <?php $ga_gUser = !empty($data['ga_gUser']) ? 'checked' : ''; ?>
309
+ <input type="checkbox" name="ga_gUser" id="ga_gUser" <?php echo $ga_gUser; ?> >
310
+ <label class="custom-control-label" for="ga_gUser">Add Code to Track the Login Step of Guest Users (Optional)</label>
311
+
312
+ <i style="cursor: help;" class="fas fa-question-circle" title="If you have Guest Check out enable, we recommend you to add this code"></i>
313
+ </label>
314
+ </td>
315
+ </tr>
316
+ <tr>
317
+ <th>
318
+ <label for="ga_Impr">Impression Thresold</label>
319
+ </th>
320
+ <td>
321
+ <?php $ga_Impr = !empty($data['ga_Impr']) ? $data['ga_Impr'] : 6; ?>
322
+ <input type="number" min="1" id="ga_Impr" name = "ga_Impr" value = "<?php echo $ga_Impr; ?>">
323
+ <label for="ga_Impr"></label>
324
+ <i style="cursor: help;" class="fas fa-question-circle" title="This feature sets Impression threshold for category page. It sends hit after these many numbers of products impressions."></i>
325
+ <p class="description"><b>Note : To avoid processing load on server we recommend upto 6 Impression Thresold.</b></p>
326
+ </td>
327
+ </tr>
328
+ <tr>
329
+ <th>
330
+ <label class = "align-middle" for="ga_IPA">I.P. Anoymization</label>
331
+ </th>
332
+ <td>
333
+ <label class = "align-middle">
334
+ <?php $ga_IPA = !empty($data['ga_IPA']) ? 'checked' : ''; ?>
335
+ <input class="" type="checkbox" name="ga_IPA" id="ga_IPA" <?php echo $ga_IPA; ?>>
336
+ <label class="custom-control-label" for="ga_IPA">Enable I.P. Anonymization</label>
337
+
338
+ <i style="cursor: help;" class="fas fa-question-circle" title="Use this feature to anonymize (or stop collecting) the I.P Address of your users in Google Analytics. Be in legal compliance by using I.P Anonymization which is important for EU countries As per the GDPR compliance"></i>
339
+ </label>
340
+ </td>
341
+ </tr>
342
+ <tr>
343
+ <th>
344
+ <label class = "align-middle" for="ga_OPTOUT">Google Analytics Opt Out</label>
345
+ </th>
346
+ <td>
347
+ <label class = "align-middle">
348
+ <?php $ga_OPTOUT = !empty($data['ga_OPTOUT']) ? 'checked' : ''; ?>
349
+ <input class="" type="checkbox" name="ga_OPTOUT" id="ga_OPTOUT" <?php echo $ga_OPTOUT; ?>>
350
+ <label class="custom-control-label" for="ga_OPTOUT">Enable Google Analytics Opt Out (Optional)</label>
351
+
352
+ <i style="cursor: help;" class="fas fa-question-circle" title="Use this feature to provide website visitors the ability to prevent their data from being used by Google Analytics As per the GDPR compliance.Go through the documentation to check the setup"></i>
353
+ </label>
354
+ </td>
355
+ </tr>
356
+ <tr>
357
+ <th>
358
+ <label class = "align-middle" for="ga_PrivacyPolicy">Privacy Policy</label>
359
+ </th>
360
+ <td>
361
+ <label class = "align-middle">
362
+ <?php $ga_PrivacyPolicy = !empty($data['ga_PrivacyPolicy']) ? 'checked' : ''; ?>
363
+ <input type="checkbox" name="ga_PrivacyPolicy" id="ga_PrivacyPolicy" required="required" <?php echo $ga_PrivacyPolicy; ?>>
364
+ <label class="custom-control-label" for="ga_PrivacyPolicy">Accept Privacy Policy of Plugin</label>
365
+
366
+ <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>
367
+ </label>
368
+ </td>
369
+ </tr>
370
+ </tbody>
371
+ </table>
372
+ <p class="submit save-for-later" id="save-for-later">
373
+ <input type="hidden" id="ga_id" name = "ga_id" value="<?= (!empty($data['ga_id']))?$data['ga_id']:""; ?>"/>
374
+ <input type="hidden" id="gm_id" name = "gm_id" value="<?= (!empty($data['gm_id']))?$data['gm_id']:""; ?>"/>
375
+ <input type="hidden" id="google_ads_id" name = "google_ads_id" value="<?= (!empty($data['google_ads_id']))?$data['google_ads_id']:""; ?>"/>
376
+ <input type="hidden" id="google_merchant_id" name = "google_merchant_id" value="<?= (!empty($data['google_merchant_id']))?$data['google_merchant_id']:""; ?>"/>
377
+ <input type="hidden" name="subscription_id" value="<?php echo (!empty($data['subscription_id']))?$data['subscription_id']:""; ?>">
378
+ <button type="submit" class="btn btn-primary" id="ee_submit_plugin" name="ee_submit_plugin">Save</button>
379
+ </p>
380
+ </form>
381
+ </div>
382
+ <div class="col-md-6 col-lg-4">
383
+ <?php echo get_tvc_google_ga_sidebar(); ?>
384
  </div>
385
+ </div>
386
  </div>
387
+ </div>
388
+ </div>
389
+ <?php echo get_connect_google_popup_html();
390
+ echo get_connect_google_popup_html_to_active_licence();
391
+ ?>
392
+ <script>
393
+ $(document).ready(function () {
394
+ $(document).on('click','#tvc_google_connect_active_licence_close',function(event){
395
+ $('#tvc_google_connect_active_licence').modal('hide');
396
+ });
397
+ $(document).on('click','.tvc_licence_key_change',function(event){
398
+ $(".tvc_licence_key_change_wapper").slideUp(500);
399
+ $(".tvc_licence_key_wapper").slideDown(700);
400
+ });
401
+ $(document).on('submit','form#tvc-licence-active',function(event){
402
+ event.preventDefault();
403
+ let licence_key = $("#licence_key").val();
404
+ var form_data = jQuery("#tvc-licence-active").serialize();
405
+ if(licence_key!=""){
406
+ var data = {
407
+ action: "tvc_call_active_licence",
408
+ licence_key:licence_key
409
+ };
410
+ $.ajax({
411
+ type: "POST",
412
+ dataType: "json",
413
+ url: myAjaxNonces.ajaxurl,
414
+ data: data,
415
+ beforeSend: function(){
416
+ tvc_helper.loaderSection(true);
417
+ },
418
+ success: function(response){
419
+ if (response.error === false) {
420
+ tvc_helper.tvc_alert("success","",response.message);
421
+ setTimeout(function(){
422
+ location.reload();
423
+ }, 2000);
424
+ }else{
425
+ if( response.is_connect == false){
426
+ $('#tvc_google_connect_active_licence').modal('show');
427
+ }else{
428
+ tvc_helper.tvc_alert("error","",response.message);
429
+ }
430
+ }
431
+ tvc_helper.loaderSection(false);
432
+ }
433
+ });
434
+ }else{
435
+ tvc_helper.tvc_alert("error","Licence key is required.");
436
+ }
437
+ });
438
+ });
439
+ </script>
admin/partials/sidebar.php DELETED
@@ -1,60 +0,0 @@
1
- <?php
2
- $obj = new Enhanced_Ecommerce_Google_Analytics_Admin($plugin_name = 'enhanced-e-commerce-for-woocommerce-store', $version = PLUGIN_NAME_VERSION);
3
- $today = $obj->today();
4
- $start = $obj->start_date();
5
- $end = $obj->end_date();
6
- $currentime = $obj->current_time();
7
- $endtime = $obj->end_time();
8
-
9
- ?>
10
- <div class="col col-xs-3">
11
- <div class="tvc_plugin_sidebar">
12
- <div class="card" style="padding: 0px;">
13
- <div class="card-header">
14
- <h5> Important Links</h5>
15
- </div>
16
- <div class="card-body">
17
- <ul>
18
- <li style="padding-bottom:5px;"><a href="http://plugins.tatvic.com/help-center/Installation-Manual.pdf" target="_blank">Installation Manual</a></li>
19
- <li style="padding-bottom:5px;"><a href="http://plugins.tatvic.com/help-center/Google-shopping-Guide.pdf" target="_blank">Google shopping guide</a></li>
20
- <li style="padding-bottom:5px;"><a href="https://wordpress.org/plugins/enhanced-e-commerce-for-woocommerce-store/faq/" target="_blank">FAQ</a></li>
21
- <li style="padding-bottom:5px;"><a href="https://www.tatvic.com/contact/?utm_source=TatvicEE&utm_medium=Dashboard&utm_campaign=WPlisting" target="_blank">Support</a></li>
22
- <li style="padding-bottom:5px;"><a href="https://www.tatvic.com/privacy-policy/?ref=plugin_policy&utm_source=plugin_backend&utm_medium=woo_free_plugin&utm_campaign=GDPR_complaince_ecomm_plugins" target="_blank">Privacy Policy</a></li>
23
- <li style="padding-bottom:5px;"><a href="https://wordpress.org/plugins/enhanced-e-commerce-for-woocommerce-store/#developers" target="_blank">Change Logs</a></li>
24
- </ul>
25
- </div>
26
- </div>
27
- <div class="card" style="padding: 0px;">
28
- <div class="card-header">
29
- <h5>Rate Us!</h5>
30
- </div>
31
- <div class="card-body">
32
- <ul>
33
- <li style="padding-bottom:5px;">Do you Like our Plugin? Please Spare few minutes to give <h3><a href = "https://wordpress.org/support/plugin/enhanced-e-commerce-for-woocommerce-store/reviews/" target="_blank" style="float: right">
34
- <div class="rating">
35
- <span>☆</span><span>☆</span><span>☆</span><span>☆</span><span>☆</span>
36
- </div>
37
- </a></h3> Rating..!!</li>
38
- </ul>
39
- </div>
40
- </div>
41
- <div class="card" style="padding: 0px;">
42
- <div class="card-header">
43
- <h5>Tatvic also Offers</h5>
44
- </div>
45
- <div class="card-body">
46
- <ul>
47
- <li style="padding-bottom:5px;"><img src='<?php echo plugins_url('../images/woo.png', __FILE__ ) ?>' />&nbsp;<a href="https://codecanyon.net/item/actionable-google-analytics-for-woocommerce/9899552?utm_source=TatvicEE&utm_medium=DashboardSide&utm_campaign=WPlisting
48
- " target="_blank">Actionable Google Analytics for WooCommerce - Premium Version</a>
49
- <?php if($today >= $start && $today <= $end && $currentime <= $endtime) {?>
50
- <img class="new-img-blink-side" src='<?php echo plugins_url('../images/discount.gif', __FILE__ ) ?>' /><?php } ?></li>
51
- <li style="padding-bottom:5px;"><img style="width:25px;height: 25px;" src='<?php echo plugins_url('../images/tatvic_logo.png', __FILE__ ) ?>' />&nbsp;<a href="https://codecanyon.net/item/google-feed-manager-for-woocommerce-by-tatvic/27104089?utm_source=TatvicEE&utm_medium=Side&utm_campaign=SideGMC" target="_blank">Google Feed Manager For WooCommerce</a></li>
52
- <li style="padding-bottom:5px;"><img src='<?php echo plugins_url('../images/m1.png', __FILE__ ) ?>' />&nbsp;<a href="https://1.envato.market/79Oky" target="_blank">Actionable Google Analytics for Magento</a></li>
53
- <li style="padding-bottom:5px;"><img src='<?php echo plugins_url('../images/m2.png', __FILE__ ) ?>' />&nbsp;<a href="https://marketplace.magento.com/tatvic-actionablegoogleanalytics.html" target="_blank">Actionable Google Analytics for Magento2</a></li>
54
- <li style="padding-bottom:5px;"><img src='<?php echo plugins_url('../images/shopify_new.png', __FILE__ ) ?>' />&nbsp;<a href="https://apps.shopify.com/google-universal-analytics-enhanced-ecommerce" target="_blank">Actionable Google Analytics for Shopify</a></li>
55
- <li style="padding-bottom:5px;"><img style="width:25px;height: 25px;" src='<?php echo plugins_url('../images/tatvic_logo.png', __FILE__ ) ?>' />&nbsp;<a href="https://www.tatvic.com/excel-add-in-google-analytics/?utm_source=excel_tool_signup&utm_medium=woo_free_plugin&utm_campaign=excel_free_trial" target="_blank">Tatvic Ninja Excel AddIn</a></li>
56
- </ul>
57
- </div>
58
- </div>
59
- </div>
60
- </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.5
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.5' );
42
  $fullName = plugin_basename( __FILE__ );
43
  $dir = str_replace('/enhanced-ecommerce-google-analytics.php','',$fullName);
44
  if ( ! defined( 'ENHANCAD_PLUGIN_NAME' ) ) {
@@ -52,61 +52,14 @@ if ( ! defined( 'ENHANCAD_PLUGIN_DIR' ) ) {
52
  if ( ! defined( 'ENHANCAD_PLUGIN_URL' ) ) {
53
  define( 'ENHANCAD_PLUGIN_URL', plugins_url() . '/' . ENHANCAD_PLUGIN_NAME );
54
  }
55
- // Store the transient alive time
56
- if ( ! defined( 'TVC_TRANSIENT_LIVE' ) ) {
57
- define( 'TVC_TRANSIENT_LIVE', 20 * MINUTE_IN_SECONDS );
58
- }
59
- // Store the base uploads folder, should also work in a multi site environment
60
- if ( ! defined( 'TVC_UPLOADS_DIR' ) ) {
61
- $wp_upload_dir = wp_get_upload_dir(); // @since 2.10.0 switched from wp_upload_dir to wp_get_upload_dir.
62
- $upload_dir = is_multisite() && defined( 'UPLOADS' ) ? UPLOADS : $wp_upload_dir['basedir'];
63
- if ( ! file_exists( $upload_dir ) && ! is_dir( $upload_dir ) ) {
64
- define( 'TVC_UPLOADS_DIR', $wp_upload_dir['basedir'] );
65
- } else {
66
- define( 'TVC_UPLOADS_DIR', $upload_dir );
67
- }
68
- }
69
 
70
- if ( ! defined( 'TVC_UPLOADS_URL' ) ) {
71
- $wp_upload_dir = wp_upload_dir();
72
- // correct baseurl for https if required
73
- if ( is_ssl() ) {
74
- $url = str_replace( 'http://', 'https://', $wp_upload_dir['baseurl'] );
75
- } else {
76
- $url = $wp_upload_dir['baseurl'];
77
- }
78
- define( 'TVC_UPLOADS_URL', apply_filters( 'tvc_corrected_uploads_url', $url ) );
79
- }
80
- // store the folder that contains the channels data
81
- if ( ! defined( 'TVC_CHANNEL_DATA_DIR' ) ) {
82
- define( 'TVC_CHANNEL_DATA_DIR', ENHANCAD_PLUGIN_DIR . 'includes/application' );
83
- }
84
- // store the folder that contains the backup files
85
- if ( ! defined( 'TVC_BACKUP_DIR' ) ) {
86
- define( 'TVC_BACKUP_DIR', TVC_UPLOADS_DIR . '/tvc-backups' );
87
- }
88
- // store the folder that contains the feeds
89
- if ( ! defined( 'TVC_FEEDS_DIR' ) ) {
90
- define( 'TVC_FEEDS_DIR', TVC_UPLOADS_DIR . '/tvc-feeds' );
91
- }
92
- // Store the plugin constructor
93
- if ( ! defined( 'TVC_PLUGIN_CONSTRUCTOR' ) ) {
94
- define( 'TVC_PLUGIN_CONSTRUCTOR', plugin_basename( __FILE__ ) );
95
- }
96
- // Store the plugin title
97
- if ( ! defined( 'TVC_EDD_SL_ITEM_NAME' ) ) {
98
- define( 'TVC_EDD_SL_ITEM_NAME', 'Tatvic Product Feed Manager' );
99
- }
100
- // Store the plugin title
101
- if ( ! defined( 'TVC_MIN_REQUIRED_WC_VERSION' ) ) {
102
- define( 'TVC_MIN_REQUIRED_WC_VERSION', '3.0.0' );
103
- }
104
  if ( ! defined( 'TVC_API_CALL_URL' ) ) {
105
- define( 'TVC_API_CALL_URL', 'https://connect.tatvic.com/laravelapi/public/api' );
106
  }
107
  if ( ! defined( 'TVC_AUTH_CONNECT_URL' ) ) {
108
  define( 'TVC_AUTH_CONNECT_URL', 'estorenew.tatvic.com' );
109
  }
 
110
  if(!defined('TVC_Admin_Helper')){
111
  include(ENHANCAD_PLUGIN_DIR . '/admin/class-tvc-admin-helper.php');
112
  }
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.1.0
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_TVC_VERSION', '3.1.0' );
42
  $fullName = plugin_basename( __FILE__ );
43
  $dir = str_replace('/enhanced-ecommerce-google-analytics.php','',$fullName);
44
  if ( ! defined( 'ENHANCAD_PLUGIN_NAME' ) ) {
52
  if ( ! defined( 'ENHANCAD_PLUGIN_URL' ) ) {
53
  define( 'ENHANCAD_PLUGIN_URL', plugins_url() . '/' . ENHANCAD_PLUGIN_NAME );
54
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
55
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56
  if ( ! defined( 'TVC_API_CALL_URL' ) ) {
57
+ define( 'TVC_API_CALL_URL', 'https://connect.tatvic.com/laravelapi/public/api' );
58
  }
59
  if ( ! defined( 'TVC_AUTH_CONNECT_URL' ) ) {
60
  define( 'TVC_AUTH_CONNECT_URL', 'estorenew.tatvic.com' );
61
  }
62
+
63
  if(!defined('TVC_Admin_Helper')){
64
  include(ENHANCAD_PLUGIN_DIR . '/admin/class-tvc-admin-helper.php');
65
  }
google_ads_php.ini DELETED
@@ -1,14 +0,0 @@
1
- [GOOGLE_ADS]
2
- name = "Google Ads"
3
- developerToken = "R0IEth5fQ1Ac59qB2Wf8Aw"
4
- loginCustomerId = "9704619790"
5
-
6
- [LOGGING]
7
- logFilePath = ""
8
-
9
- [OAUTH2]
10
- clientId = "854883711805-4bm7ik0lq2jcdvdk0qu8sgtd4jdc1k7o.apps.googleusercontent.com"
11
- clientSecret = "mwgFJ25-FMPEyeNtI-TIMJIZ"
12
- refreshToken = "1//0glkEtsa8PNuwCgYIARAAGBASNwF-L9IrBZQjIINEw2MMO_M_mRdKwoNCBwJtHXtahh5Bj4oQR01ErmhaBB2TqE68rkP8JaELISU"
13
- developerToken = "R0IEth5fQ1Ac59qB2Wf8Aw"
14
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/class-enhanced-ecommerce-google-analytics.php CHANGED
@@ -67,8 +67,8 @@ class Enhanced_Ecommerce_Google_Analytics {
67
  * @since 1.0.0
68
  */
69
  public function __construct() {
70
- if ( defined( 'PLUGIN_NAME_VERSION' ) ) {
71
- $this->version = PLUGIN_NAME_VERSION;
72
  } else {
73
  $this->version = '2.0';
74
  }
@@ -110,17 +110,10 @@ class Enhanced_Ecommerce_Google_Analytics {
110
  * of the plugin.
111
  */
112
  require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-enhanced-ecommerce-google-analytics-i18n.php';
113
- require_once plugin_dir_path( dirname( __FILE__ ) ) . 'admin/class-tvc-admin-db-helper.php';
114
- // Feed Manager Files
115
- require_once plugin_dir_path(dirname(__FILE__)) . 'includes/data/class-tvc-queries.php';
116
- require_once plugin_dir_path(dirname(__FILE__)) . 'includes/data/class-tvc-file.php';
117
- require_once plugin_dir_path(dirname(__FILE__)) . 'includes/user-interface/tvc-url-functions.php';
118
 
119
  require_once plugin_dir_path(dirname(__FILE__)) . 'includes/data/class-tvc-ajax-calls.php';
120
- require_once plugin_dir_path(dirname(__FILE__)) . 'includes/data/class-tvc-ajax-data.php';
121
  require_once plugin_dir_path(dirname(__FILE__)) . 'includes/data/class-tvc-ajax-file.php';
122
-
123
- require_once plugin_dir_path(dirname(__FILE__)) . 'includes/data/class-tvc-feed-crud-handler.php';
124
  require_once plugin_dir_path(dirname(__FILE__)) . 'includes/data/class-tvc-taxonomies.php';
125
 
126
  require_once plugin_dir_path(dirname(__FILE__)) . 'includes/class-tvc-register-scripts.php';
67
  * @since 1.0.0
68
  */
69
  public function __construct() {
70
+ if ( defined( 'PLUGIN_TVC_VERSION' ) ) {
71
+ $this->version = PLUGIN_TVC_VERSION;
72
  } else {
73
  $this->version = '2.0';
74
  }
110
  * of the plugin.
111
  */
112
  require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-enhanced-ecommerce-google-analytics-i18n.php';
113
+ require_once plugin_dir_path( dirname( __FILE__ ) ) . 'admin/class-tvc-admin-db-helper.php';
 
 
 
 
114
 
115
  require_once plugin_dir_path(dirname(__FILE__)) . 'includes/data/class-tvc-ajax-calls.php';
 
116
  require_once plugin_dir_path(dirname(__FILE__)) . 'includes/data/class-tvc-ajax-file.php';
 
 
117
  require_once plugin_dir_path(dirname(__FILE__)) . 'includes/data/class-tvc-taxonomies.php';
118
 
119
  require_once plugin_dir_path(dirname(__FILE__)) . 'includes/class-tvc-register-scripts.php';
includes/class-tvc-register-scripts.php CHANGED
@@ -14,17 +14,12 @@ if ( ! class_exists( 'TVC_Register_Scripts' ) ) :
14
  class TVC_Register_Scripts {
15
  // @private storage of scripts version
16
  private $_version_stamp;
17
- // @private register minified scripts
18
- private $_js_min;
19
  public function __construct() {
20
- $premium_version_nr = TVC_EDD_SL_ITEM_NAME === 'Google Product Feed Manager' ? 'fr-' : 'pr-'; // prefix for version stamp depending on premium or free version
21
- $action_level = 2; // for future use
22
- $this->_version_stamp = defined( 'WP_DEBUG' ) && WP_DEBUG ? time() : $premium_version_nr . '1.0';
23
- $this->_js_min = defined( 'WP_DEBUG' ) && WP_DEBUG ? '' : '.min';
24
-
25
  add_action( 'admin_enqueue_scripts', array( $this, 'tvc_register_required_nonce' ) );
26
  // only load the next hooks when on the Settings page
27
- if ( tvc_on_plugins_settings_page() ) {
28
  add_action( 'admin_enqueue_scripts', array( $this, 'tvc_register_required_options_page_scripts' ) );
29
  add_action( 'admin_enqueue_scripts', array( $this, 'tvc_register_required_options_page_nonce' ) );
30
  }
@@ -54,7 +49,7 @@ if ( ! class_exists( 'TVC_Register_Scripts' ) ) :
54
  */
55
  public function tvc_register_required_options_page_scripts() {
56
  // enqueue notice handling script
57
- wp_enqueue_script( 'tvc_data-handling-script', ENHANCAD_PLUGIN_URL . '/includes/data/js/tvc_ajaxdatahandling' . $this->_js_min . '.js', array( 'jquery' ), $this->_version_stamp, true );
58
  }
59
  /**
60
  * Generate the nonce's for the Settings page.
14
  class TVC_Register_Scripts {
15
  // @private storage of scripts version
16
  private $_version_stamp;
 
 
17
  public function __construct() {
18
+ $this->_version_stamp = defined( 'WP_DEBUG' ) && WP_DEBUG ? time() : PLUGIN_TVC_VERSION;
19
+
 
 
 
20
  add_action( 'admin_enqueue_scripts', array( $this, 'tvc_register_required_nonce' ) );
21
  // only load the next hooks when on the Settings page
22
+ if ( isset($_GET['page']) && $_GET['page'] == 'enhanced-ecommerce-google-analytics-admin-display' ) {
23
  add_action( 'admin_enqueue_scripts', array( $this, 'tvc_register_required_options_page_scripts' ) );
24
  add_action( 'admin_enqueue_scripts', array( $this, 'tvc_register_required_options_page_nonce' ) );
25
  }
49
  */
50
  public function tvc_register_required_options_page_scripts() {
51
  // enqueue notice handling script
52
+ wp_enqueue_script( 'tvc_data-handling-script', ENHANCAD_PLUGIN_URL . '/includes/data/js/tvc_ajaxdatahandling.js', array( 'jquery' ), $this->_version_stamp, true );
53
  }
54
  /**
55
  * Generate the nonce's for the Settings page.
includes/data/class-tvc-ajax-calls.php CHANGED
@@ -12,15 +12,10 @@ if ( ! defined( 'ABSPATH' ) ) {
12
  }
13
 
14
  if ( ! class_exists( 'TVC_Ajax_Calls' ) ) :
15
-
16
  /**
17
  * Feed Controller Class
18
  */
19
  class TVC_Ajax_Calls {
20
-
21
- public $_queries;
22
- public $_files;
23
-
24
  public function __construct() { }
25
 
26
  protected function safe_ajax_call( $nonce, $registered_nonce_name ) {
@@ -28,7 +23,6 @@ if ( ! class_exists( 'TVC_Ajax_Calls' ) ) :
28
  /*if ( ! wp_verify_nonce( $nonce, $registered_nonce_name ) ) {
29
  die( 'You are not allowed to do this!' );
30
  }*/
31
-
32
  // only return results when the user is an admin with manage options
33
  if ( is_admin() ) {
34
  return true;
@@ -38,4 +32,4 @@ if ( ! class_exists( 'TVC_Ajax_Calls' ) ) :
38
  }
39
  }
40
  // end of TVC_Ajax_Calls class
41
- endif;
12
  }
13
 
14
  if ( ! class_exists( 'TVC_Ajax_Calls' ) ) :
 
15
  /**
16
  * Feed Controller Class
17
  */
18
  class TVC_Ajax_Calls {
 
 
 
 
19
  public function __construct() { }
20
 
21
  protected function safe_ajax_call( $nonce, $registered_nonce_name ) {
23
  /*if ( ! wp_verify_nonce( $nonce, $registered_nonce_name ) ) {
24
  die( 'You are not allowed to do this!' );
25
  }*/
 
26
  // only return results when the user is an admin with manage options
27
  if ( is_admin() ) {
28
  return true;
32
  }
33
  }
34
  // end of TVC_Ajax_Calls class
35
+ endif;
includes/data/class-tvc-ajax-data.php DELETED
@@ -1,448 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * TVC Ajax Data Class.
5
- *
6
- * @package TVC Product Feed Manager/Data/Classes
7
- * @version 1.10.0
8
- */
9
-
10
- if ( ! defined( 'ABSPATH' ) ) {
11
- exit;
12
- }
13
-
14
- if ( ! class_exists( 'TVC_Ajax_Data' ) ) :
15
-
16
- /**
17
- * Ajax Data Class
18
- */
19
- class TVC_Ajax_Data extends TVC_Ajax_Calls {
20
-
21
- public function __construct() {
22
- parent::__construct();
23
-
24
- $this->_queries = new TVC_Queries();
25
- $this->_files = new TVC_File();
26
-
27
- // hooks
28
- add_action( 'wp_ajax_tvcajax-get-list-of-feeds', array( $this, 'tvcajax_get_list_of_feeds' ) );
29
- add_action( 'wp_ajax_tvcajax-get-list-of-backups', array( $this, 'tvcajax_get_list_of_backups' ) );
30
- add_action( 'wp_ajax_tvcajax-get-settings-options', array( $this, 'tvcajax_get_settings_options' ) );
31
- add_action( 'wp_ajax_tvcajax-get-output-fields', array( $this, 'tvcajax_get_output_fields' ) );
32
- add_action( 'wp_ajax_tvcajax-get-input-fields', array( $this, 'tvcajax_get_input_fields' ) );
33
- add_action( 'wp_ajax_tvcajax-get-feed-data', array( $this, 'tvcajax_get_feed_data' ) );
34
- add_action( 'wp_ajax_tvcajax-get-feed-status', array( $this, 'tvcajax_get_feed_status' ) );
35
- add_action( 'wp_ajax_tvcajax-get-main-feed-filters', array( $this, 'tvcajax_get_feed_filters' ) );
36
- add_action( 'wp_ajax_tvcajax-switch-feed-status', array( $this, 'tvcajax_switch_feed_status_between_hold_and_ok' ) );
37
- add_action( 'wp_ajax_tvcajax-duplicate-existing-feed', array( $this, 'tvcajax_duplicate_feed_data' ) );
38
- add_action( 'wp_ajax_tvcajax-update-feed-data', array( $this, 'tvcajax_update_feed_data' ) );
39
- add_action( 'wp_ajax_tvcajax-delete-feed', array( $this, 'tvcajax_delete_feed' ) );
40
- add_action( 'wp_ajax_tvcajax-backup-current-data', array( $this, 'tvcajax_backup_current_data' ) );
41
- add_action( 'wp_ajax_tvcajax-delete-backup-file', array( $this, 'tvcajax_delete_backup_file' ) );
42
- add_action( 'wp_ajax_tvcajax-restore-backup-file', array( $this, 'tvcajax_restore_backup_file' ) );
43
- add_action( 'wp_ajax_tvcajax-duplicate-backup-file', array( $this, 'tvcajax_duplicate_backup_file' ) );
44
- add_action( 'wp_ajax_tvcajax-get-next-feed-in-queue', array( $this, 'tvcajax_get_next_feed_in_queue' ) );
45
- add_action( 'wp_ajax_tvcajax-register-notice-dismission', array( $this, 'tvcajax_register_notice_dismission' ) );
46
- }
47
-
48
- /**
49
- * Returns a list of all active feeds to an ajax caller
50
- */
51
- public function tvcajax_get_list_of_feeds() {
52
- if ( $this->safe_ajax_call( filter_input( INPUT_POST, 'postFeedsListNonce' ), 'tvcajax-post-feeds-list-nonce' ) ) {
53
- $list = $this->_queries->get_feeds_list();
54
-
55
- // the status string entries from the database to identification strings (i.e. OK to ok and On hold in on_hold)
56
- if ( $list && ! ctype_lower( $list[0]->status ) ) {
57
- tvc_correct_old_feeds_list_status( $list );
58
- }
59
-
60
- $this->convert_type_numbers_to_text( $list );
61
-
62
- // add information about the tvc_special_feeds_add_on_active filter to the feed list
63
- $result = array(
64
- 'list' => $list,
65
- 'special_feed_add_ons_active' => apply_filters( 'tvc_special_feeds_add_on_active', false ),
66
- );
67
-
68
- echo json_encode( $result );
69
- }
70
-
71
- // IMPORTANT: don't forget to exit
72
- exit;
73
- }
74
-
75
- /**
76
- * Returns a list of backups the user has made
77
- */
78
- public function tvcajax_get_list_of_backups() {
79
- if ( $this->safe_ajax_call( filter_input( INPUT_POST, 'postBackupListNonce' ), 'tvcajax-backups-list-nonce' ) ) {
80
- echo json_encode( $this->_files->make_list_of_active_backups() );
81
- }
82
-
83
- // IMPORTANT: don't forget to exit
84
- exit;
85
- }
86
-
87
- public function tvcajax_get_settings_options() {
88
- if ( $this->safe_ajax_call( filter_input( INPUT_POST, 'postSetupOptionsNonce' ), 'tvcajax-setting-options-nonce' ) ) {
89
- $options = [
90
- get_option( 'tvc_auto_feed_fix' ),
91
- get_option( 'tvc_third_party_attribute_keywords' ),
92
- get_option( 'tvc_notice_mailaddress' ),
93
- get_option( 'tvc_disabled_background_mode' ),
94
- ];
95
- echo json_encode( $options );
96
- }
97
-
98
- // IMPORTANT: don't forget to exit
99
- exit;
100
- }
101
-
102
- /**
103
- * Retrieves the output fields that are specific for a given merchant and
104
- * also adds stored meta data to the output fields
105
- *
106
- * @access public (ajax triggered)
107
- */
108
- public function tvcajax_get_output_fields() {
109
-
110
- // check: if the call is safe
111
- if ( $this->safe_ajax_call( filter_input( INPUT_POST, 'outputFieldsNonce' ), 'tvcajax-output-fields-nonce' ) ) {
112
- $data_class = new TVC_Data();
113
-
114
- // get the posted inputs
115
- $channel_id = filter_input( INPUT_POST, 'channelId' );
116
- $feed_id = filter_input( INPUT_POST, 'feedId' );
117
- $channel = trim( $this->_queries->get_channel_short_name_from_db( $channel_id ) );
118
- $is_custom = function_exists( 'tvc_channel_is_custom_channel' ) ? tvc_channel_is_custom_channel( $channel_id ) : false;
119
-
120
- if ( ! $is_custom ) {
121
- // read the output fields
122
- $outputs = $this->_files->get_output_fields_for_specific_channel( $channel );
123
-
124
- // if the feed is a stored feed, look for meta data to add (a feed an id of -1 is a new feed that not yet has been saved)
125
- if ( $feed_id >= 0 ) {
126
- // add meta data to the feeds output fields
127
- $outputs = $data_class->fill_output_fields_with_metadata( $feed_id, $outputs );
128
- }
129
- } else {
130
- $data_class = new TVC_Data();
131
- $outputs = $data_class->get_custom_fields_with_metadata( $feed_id );
132
- }
133
-
134
- echo json_encode( $outputs );
135
- }
136
-
137
- // IMPORTANT: don't forget to exit
138
- exit;
139
- }
140
-
141
- /**
142
- * Gets all the different source fields from the custom products and third party sources and combines them into one list
143
- *
144
- * @access public (ajax triggered)
145
- */
146
- public function tvcajax_get_input_fields() {
147
- if ( $this->safe_ajax_call( filter_input( INPUT_POST, 'inputFieldsNonce' ), 'tvcajax-input-fields-nonce' ) ) {
148
- $source_id = filter_input( INPUT_POST, 'sourceId' );
149
-
150
- switch ( $source_id ) {
151
- case '1':
152
- $data_class = new TVC_Data();
153
-
154
- $custom_product_attributes = $this->_queries->get_custom_product_attributes();
155
- $custom_product_fields = $this->_queries->get_custom_product_fields();
156
- $product_attributes = $this->_queries->get_all_product_attributes();
157
- $product_taxonomies = get_taxonomies();
158
- $third_party_custom_fields = $data_class->get_third_party_custom_fields();
159
-
160
- $all_source_fields = $this->combine_custom_attributes_and_feeds(
161
- $custom_product_attributes,
162
- $custom_product_fields,
163
- $product_attributes,
164
- $product_taxonomies,
165
- $third_party_custom_fields
166
- );
167
-
168
- echo json_encode( apply_filters( 'tvc_all_source_fields', $all_source_fields ) );
169
- break;
170
-
171
- default:
172
- if ( 'valid' === get_option( 'tvc_lic_status' ) ) { // error message for paid versions
173
- echo '<div id="error">' . esc_html__(
174
- 'Could not add custom fields because I could not identify the channel.
175
- If not already done add the correct channel in the Manage Channels page.
176
- Also try to deactivate and then activate the plugin.',
177
- 'tvc-product-feed-manager'
178
- ) . '</div>';
179
-
180
- tvc_write_log_file( sprintf( 'Could not define the channel in a valid Premium plugin version. Feed id = %s', $source_id ) );
181
- } else { // error message for free version
182
- echo '<div id="error">' . esc_html__(
183
- 'Could not identify the channel.
184
- Try to deactivate and then activate the plugin.
185
- If that does not work remove the plugin through the WordPress Plugins page and than reinstall and activate it again.',
186
- 'tvc-product-feed-manager'
187
- ) . '</div>';
188
-
189
- tvc_write_log_file( sprintf( 'Could not define the channel in a free plugin version. Feed id = %s', $source_id ) );
190
- }
191
-
192
- break;
193
- }
194
- }
195
-
196
- // IMPORTANT: don't forget to exit
197
- exit;
198
- }
199
-
200
- public function tvcajax_get_feed_filters() {
201
- if ( $this->safe_ajax_call( filter_input( INPUT_POST, 'inputFeedFiltersNonce' ), 'tvcajax-feed-filters-nonce' ) ) {
202
- $feed_id = filter_input( INPUT_POST, 'feedId' );
203
-
204
- $data_class = new TVC_Data();
205
- $filters = $data_class->get_filter_query( $feed_id );
206
-
207
- echo $filters ? json_encode( $filters ) : '0';
208
- }
209
-
210
- // IMPORTANT: don't forget to exit
211
- exit;
212
- }
213
-
214
- public function tvcajax_get_feed_data() {
215
- if ( $this->safe_ajax_call( filter_input( INPUT_POST, 'feedDataNonce' ), 'tvcajax-feed-data-nonce' ) ) {
216
- $feed_id = filter_input( INPUT_POST, 'sourceId' );
217
- $feed_data = $this->_queries->read_feed( $feed_id );
218
-
219
- echo json_encode( $feed_data );
220
- }
221
-
222
- // IMPORTANT: don't forget to exit
223
- exit;
224
- }
225
-
226
- public function tvcajax_get_feed_status() {
227
- if ( $this->safe_ajax_call( filter_input( INPUT_POST, 'feedStatusNonce' ), 'tvcajax-feed-status-nonce' ) ) {
228
- $feed_id = filter_input( INPUT_POST, 'sourceId' );
229
-
230
- $feed_master = new TVC_Feed_Master_Class( $feed_id );
231
- $feed_data = $feed_master->feed_status_check( $feed_id );
232
-
233
- echo json_encode( $feed_data );
234
- }
235
-
236
- // IMPORTANT: don't forget to exit
237
- exit;
238
- }
239
-
240
- public function tvcajax_update_feed_data() {
241
- if ( $this->safe_ajax_call( filter_input( INPUT_POST, 'updateFeedDataNonce' ), 'tvcajax-update-feed-data-nonce' ) ) {
242
- // get the posted feed data
243
- $ajax_feed_data = json_decode( filter_input( INPUT_POST, 'feed' ) );
244
- $feed_filter = filter_input( INPUT_POST, 'feedFilter' );
245
- $m_data = filter_input( INPUT_POST, 'metaData' );
246
-
247
- echo TVC_Feed_CRUD_Handler::create_or_update_feed_data( $ajax_feed_data, $m_data, $feed_filter );
248
- }
249
-
250
- exit;
251
- }
252
-
253
- public function tvcajax_switch_feed_status_between_hold_and_ok() {
254
- if ( $this->safe_ajax_call( filter_input( INPUT_POST, 'switchFeedStatusNonce' ), 'tvcajax-switch-feed-status-nonce' ) ) {
255
- $feed_id = filter_input( INPUT_POST, 'feedId' );
256
-
257
- $feed_status = $this->_queries->get_current_feed_status( $feed_id );
258
- $current_status = $feed_status[0]->status_id;
259
-
260
- $new_status = '1' === $current_status ? '2' : '1'; // only allow status 1 or 2
261
-
262
- $result = $this->_queries->switch_feed_status( $feed_id, $new_status );
263
-
264
- echo ( false === $result ) ? $current_status : $new_status;
265
- }
266
-
267
- // IMPORTANT: don't forget to exit
268
- exit;
269
- }
270
-
271
- public function tvcajax_duplicate_feed_data() {
272
- if ( $this->safe_ajax_call( filter_input( INPUT_POST, 'duplicateFeedNonce' ), 'tvcajax-duplicate-existing-feed-nonce' ) ) {
273
- $feed_id = filter_input( INPUT_POST, 'feedId' );
274
-
275
- echo TVC_Db_Management::duplicate_feed( $feed_id );
276
- }
277
-
278
- // IMPORTANT: don't forget to exit
279
- exit;
280
- }
281
-
282
- public function tvcajax_delete_feed() {
283
- if ( $this->safe_ajax_call( filter_input( INPUT_POST, 'deleteFeedNonce' ), 'tvcajax-delete-feed-nonce' ) ) {
284
- $feed_id = filter_input( INPUT_POST, 'feedId' );
285
-
286
- // only return results when the user is an admin with manage options
287
- if ( is_admin() ) {
288
- TVC_Feed_Controller::remove_id_from_feed_queue( $feed_id );
289
- $this->_queries->delete_meta( $feed_id );
290
- echo $this->_queries->delete_feed( $feed_id );
291
- }
292
- }
293
-
294
- // IMPORTANT: don't forget to exit
295
- exit;
296
- }
297
-
298
- public function tvcajax_backup_current_data() {
299
- if ( $this->safe_ajax_call( filter_input( INPUT_POST, 'backupNonce' ), 'tvcajax-backup-nonce' ) ) {
300
- // only take action when the user is an admin with manage options
301
- if ( is_admin() ) {
302
- $backup_file_name = filter_input( INPUT_POST, 'fileName' );
303
- echo TVC_Db_Management::backup_database_tables( $backup_file_name );
304
- }
305
- }
306
-
307
- // IMPORTANT: don't forget to exit
308
- exit;
309
- }
310
-
311
- public function tvcajax_delete_backup_file() {
312
- if ( $this->safe_ajax_call( filter_input( INPUT_POST, 'deleteBackupNonce' ), 'tvcajax-delete-backup-nonce' ) ) {
313
- // only take action when the user is an admin with manage options
314
- if ( is_admin() ) {
315
- $backup_file_name = filter_input( INPUT_POST, 'fileName' );
316
- TVC_Db_Management::delete_backup_file( $backup_file_name );
317
- }
318
- }
319
-
320
- // IMPORTANT: don't forget to exit
321
- exit;
322
- }
323
-
324
- public function tvcajax_restore_backup_file() {
325
- if ( $this->safe_ajax_call( filter_input( INPUT_POST, 'restoreBackupNonce' ), 'tvcajax-restore-backup-nonce' ) ) {
326
- // only take action when the user is an admin with manage options
327
- if ( is_admin() ) {
328
- $backup_file_name = filter_input( INPUT_POST, 'fileName' );
329
- echo TVC_Db_Management::restore_backup( $backup_file_name );
330
- }
331
- }
332
-
333
- // IMPORTANT: don't forget to exit
334
- exit;
335
- }
336
-
337
- public function tvcajax_duplicate_backup_file() {
338
- if ( $this->safe_ajax_call( filter_input( INPUT_POST, 'duplicateBackupNonce' ), 'tvcajax-duplicate-backup-nonce' ) ) {
339
- // only take action when the user is an admin with manage options
340
- if ( is_admin() ) {
341
- $backup_file_name = filter_input( INPUT_POST, 'fileName' );
342
- TVC_Db_Management::duplicate_backup_file( $backup_file_name );
343
- }
344
- }
345
-
346
- // IMPORTANT: don't forget to exit
347
- exit;
348
- }
349
-
350
- public function tvcajax_get_next_feed_in_queue() {
351
- if ( $this->safe_ajax_call( filter_input( INPUT_POST, 'nextFeedInQueueNonce' ), 'tvcajax-next-feed-in-queue-nonce' ) ) {
352
- $next_feed_id = TVC_Feed_Controller::get_next_id_from_feed_queue();
353
- echo false !== $next_feed_id ? $next_feed_id : 'false';
354
- }
355
-
356
- // IMPORTANT: don't forget to exit
357
- exit;
358
- }
359
-
360
- public function tvcajax_register_notice_dismission() {
361
- if ( $this->safe_ajax_call( filter_input( INPUT_POST, 'noticeDismissionNonce' ), 'tvcajax-duplicate-backup-nonce' ) ) {
362
-
363
- // only take action when the user is an admin with manage options
364
- if ( is_admin() ) {
365
- update_option( 'tvc_license_notice_suppressed', true );
366
- echo 'true';
367
- } else {
368
- echo 'false';
369
- }
370
- }
371
-
372
- // IMPORTANT: don't forget to exit
373
- exit;
374
- }
375
-
376
- private function combine_custom_attributes_and_feeds( $attributes, $feeds, $product_attributes, $product_taxonomies, $third_party_fields ) {
377
- $prev_dup_array = array(); // used to prevent doubles
378
-
379
- foreach ( $feeds as $feed ) {
380
- $obj = new stdClass();
381
-
382
- $obj->attribute_name = $feed;
383
- $obj->attribute_label = $feed;
384
-
385
- array_push( $attributes, $obj );
386
- array_push( $prev_dup_array, $obj->attribute_label );
387
- }
388
-
389
- foreach ( $product_taxonomies as $taxonomy ) {
390
- if ( ! in_array( $taxonomy, $prev_dup_array ) ) {
391
- $obj = new stdClass();
392
- $obj->attribute_name = $taxonomy;
393
- $obj->attribute_label = $taxonomy;
394
-
395
- array_push( $attributes, $obj );
396
- array_push( $prev_dup_array, $taxonomy );
397
- }
398
- }
399
-
400
- foreach ( $product_attributes as $attribute_string ) {
401
- $attribute_object = maybe_unserialize( $attribute_string->meta_value );
402
-
403
- if ( $attribute_object && ( is_object( $attribute_object ) || is_array( $attribute_object ) ) ) {
404
- foreach ( $attribute_object as $attribute ) {
405
- if ( ! in_array( $attribute['name'], $prev_dup_array ) ) {
406
- $obj = new stdClass();
407
- $obj->attribute_name = $attribute['name'];
408
- $obj->attribute_label = $attribute['name'];
409
-
410
- array_push( $attributes, $obj );
411
- array_push( $prev_dup_array, $attribute['name'] );
412
- }
413
- }
414
- } else {
415
- if ( $attribute_object ) {
416
- tvc_write_log_file( $attribute_object, 'debug' );
417
- }
418
- }
419
- }
420
-
421
- foreach ( $third_party_fields as $field_label ) {
422
- if ( ! in_array( $field_label, $prev_dup_array ) ) {
423
- $obj = new stdClass();
424
- $obj->attribute_name = $field_label;
425
- $obj->attribute_label = $field_label;
426
-
427
- array_push( $attributes, $obj );
428
- array_push( $prev_dup_array, $field_label );
429
- }
430
- }
431
-
432
- return $attributes;
433
- }
434
-
435
- private function convert_type_numbers_to_text( &$list ) {
436
- $feed_types = tvc_list_feed_type_text();
437
-
438
- foreach ( $list as $feed ) {
439
- $feed->feed_type_name = $feed_types[ $feed->feed_type_id ];
440
- }
441
- }
442
- }
443
-
444
- // end of TVC_Ajax_Data_Class
445
-
446
- endif;
447
-
448
- $my_ajax_data_class = new TVC_Ajax_Data();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/data/class-tvc-ajax-file.php CHANGED
@@ -24,28 +24,64 @@ class TVC_Ajax_File extends TVC_Ajax_Calls {
24
  add_action('wp_ajax_tvcajax-get-campaign-categories', array($this, 'tvcajax_get_campaign_categories'));
25
  add_action('wp_ajax_tvcajax-update-campaign-status', array($this, 'tvcajax_update_campaign_status'));
26
  add_action('wp_ajax_tvcajax-delete-campaign', array($this, 'tvcajax_delete_campaign'));
27
- add_action('wp_ajax_tvcajax-get-next-categories', array($this, 'tvcajax_read_next_categories'));
28
- add_action('wp_ajax_tvcajax-get-category-lists', array($this, 'tvcajax_read_category_lists'));
29
- add_action('wp_ajax_tvcajax-delete-feed-file', array($this, 'tvcajax_delete_feed_file'));
30
- add_action('wp_ajax_tvcajax-update-feed-file', array($this, 'tvcajax_update_feed_file'));
31
- add_action('wp_ajax_tvcajax-log-message', array($this, 'tvcajax_log_message'));
32
- add_action('wp_ajax_tvcajax-auto-feed-fix-mode-selection', array($this, 'tvcajax_auto_feed_fix_mode_selection'));
33
- add_action('wp_ajax_tvcajax-background-processing-mode-selection', array($this, 'tvcajax_background_processing_mode_selection'));
34
- add_action('wp_ajax_tvcajax-feed-logger-status-selection', array($this, 'tvcajax_feed_logger_status_selection'));
35
- add_action('wp_ajax_tvcajax-show-product-identifiers-selection', array($this, 'tvcajax_show_product_identifiers_selection'));
36
- add_action('wp_ajax_tvcajax-debug-mode-selection', array($this, 'tvcajax_debut_mode_selection'));
37
- add_action('wp_ajax_tvcajax-third-party-attribute-keywords', array($this, 'tvcajax_set_third_party_attribute_keywords'));
38
- add_action('wp_ajax_tvcajax-set-notice-mailaddress', array($this, 'tvcajax_set_notice_mailaddress'));
39
- add_action('wp_ajax_tvcajax-clear-feed-process-data', array($this, 'tvcajax_clear_feed_process_data'));
40
- add_action('wp_ajax_tvcajax-reinitiate-plugin', array($this, 'tvcajax_reinitiate_plugin'));
41
  add_action('wp_ajax_tvcajax-product-syncup', array($this, 'tvcajax_product_syncup'));
42
  add_action('wp_ajax_tvcajax-gmc-category-lists', array($this, 'tvcajax_get_gmc_categories'));
43
  add_action('wp_ajax_tvcajax-custom-metrics-dimension', array($this, 'tvcajax_custom_metrics_dimension'));
44
  add_action('wp_ajax_tvcajax-store-time-taken', array($this, 'tvcajax_store_time_taken'));
 
45
  add_action('wp_ajax_tvc_call_api_sync', array($this, 'tvc_call_api_sync'));
46
  add_action('wp_ajax_tvc_call_domain_claim', array($this, 'tvc_call_domain_claim'));
47
  add_action('wp_ajax_tvc_call_site_verified', array($this, 'tvc_call_site_verified'));
48
  add_action('wp_ajax_tvc_call_notice_dismiss', array($this, 'tvc_call_notice_dismiss'));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
  }
50
  public function tvc_call_notice_dismiss(){
51
  if($this->safe_ajax_call(filter_input(INPUT_POST, 'apiNoticDismissNonce'), 'tvc_call_notice_dismiss-nonce')){
@@ -63,8 +99,12 @@ class TVC_Ajax_File extends TVC_Ajax_Calls {
63
  public function tvc_call_api_sync(){
64
  if($this->safe_ajax_call(filter_input(INPUT_POST, 'apiSyncupNonce'), 'tvc_call_api_sync-nonce')){
65
  $TVC_Admin_Helper = new TVC_Admin_Helper();
66
- $tvc_msg = $TVC_Admin_Helper->set_update_api_to_db();
67
- echo json_encode(array('status' => 'success', 'message' => $tvc_msg));
 
 
 
 
68
  exit;
69
  }
70
  exit;
@@ -309,298 +349,6 @@ class TVC_Ajax_File extends TVC_Ajax_Calls {
309
  exit;
310
  }
311
 
312
- /**
313
- * Returns the sub-categories from a selected category
314
- */
315
- public function tvcajax_read_next_categories(){
316
- // make sure this call is legal
317
- if($this->safe_ajax_call(filter_input(INPUT_POST, 'nextCategoryNonce'), 'tvcajax-next-category-nonce')){
318
- $file_class = new TVC_File();
319
-
320
- $channel_id = filter_input(INPUT_POST, 'channelId');
321
- $requested_level = filter_input(INPUT_POST, 'requestedLevel');
322
- $parent_category = filter_input(INPUT_POST, 'parentCategory');
323
- $file_language = filter_input(INPUT_POST, 'fileLanguage');
324
- $categories = $file_class->get_categories_for_list($channel_id, $requested_level, $parent_category, $file_language);
325
-
326
- if(!is_array($categories)){
327
- if('0' === substr($categories, - 1)){
328
- chop($categories, '0');
329
- }
330
- }
331
-
332
- echo json_encode($categories);
333
- }
334
-
335
- // IMPORTANT: don't forget to exit
336
- exit;
337
- }
338
-
339
- /**
340
- * Read the category list
341
- */
342
- public function tvcajax_read_category_lists(){
343
- // make sure this call is legal
344
- if($this->safe_ajax_call(filter_input(INPUT_POST, 'categoryListsNonce'), 'tvcajax-category-lists-nonce')){
345
- $file_class = new TVC_File();
346
-
347
- $channel_id = filter_input(INPUT_POST, 'channelId');
348
- $main_categories_string = filter_input(INPUT_POST, 'mainCategories');
349
- $file_language = filter_input(INPUT_POST, 'fileLanguage');
350
- $categories_array = explode(' > ', $main_categories_string);
351
- $categories = array();
352
- $required_levels = count($categories_array) > 0 ? ( count($categories_array) + 1 ) : count($categories_array);
353
-
354
- for($i = 0; $i < $required_levels; $i ++){
355
- $parent_category = $i > 0 ? $categories_array[$i - 1] : '';
356
- $c = $file_class->get_categories_for_list($channel_id, $i, $parent_category, $file_language);
357
- if($c){
358
- array_push($categories, $c);
359
- }
360
- }
361
-
362
- echo json_encode($categories);
363
- }
364
-
365
- // IMPORTANT: don't forget to exit
366
- exit;
367
- }
368
-
369
- /**
370
- * Delete a specific feed file
371
- */
372
- public function tvcajax_delete_feed_file(){
373
- // make sure this call is legal
374
- if($this->safe_ajax_call(filter_input(INPUT_POST, 'deleteFeedNonce'), 'tvcajax-delete-feed-nonce')){
375
- $file_name = filter_input(INPUT_POST, 'fileTitle');
376
-
377
- if(file_exists(WP_PLUGIN_DIR . '/tvc-product-feed-manager-support/feeds/' . $file_name)){
378
- $file = WP_PLUGIN_DIR . '/tvc-product-feed-manager-support/feeds/' . $file_name;
379
- }else{
380
- $file = TVC_FEEDS_DIR . '/' . $file_name;
381
- }
382
-
383
- // only return results when the user is an admin with manage options
384
- if(is_admin()){
385
- /* translators: %s: Title of the feed file */
386
- echo file_exists($file) ? unlink($file) : tvc_show_wp_error(sprintf(esc_html__('Could not find file %s.', 'tvc-product-feed-manager'), $file));
387
- }else{
388
- echo tvc_show_wp_error(esc_html__('Error deleting the feed. You do not have the correct authorities to delete the file.', 'tvc-product-feed-manager'));
389
- }
390
- }
391
-
392
- // IMPORTANT: don't forget to exit
393
- exit;
394
- }
395
-
396
- /**
397
- * This function fetches the posted data and triggers the update of the feed file on the server.
398
- */
399
- public function tvcajax_update_feed_file(){
400
- // make sure this call is legal
401
- if($this->safe_ajax_call(filter_input(INPUT_POST, 'updateFeedFileNonce'), 'tvcajax-update-feed-file-nonce')){
402
-
403
- // fetch the data from $_POST
404
- $feed_id = filter_input(INPUT_POST, 'feedId');
405
- $background_mode_disabled = get_option('tvc_disabled_background_mode', 'false');
406
-
407
- TVC_Feed_Controller::add_id_to_feed_queue($feed_id);
408
-
409
- // if there is no feed processing in progress, of background processing is switched off, start updating the current feed
410
- if(!TVC_Feed_Controller::feed_is_processing() || 'true' === $background_mode_disabled){
411
- do_action('tvc_manual_feed_update_activated', $feed_id);
412
-
413
- $feed_master_class = new TVC_Feed_Master_Class($feed_id);
414
- $feed_master_class->update_feed_file(false);
415
- }else{
416
- $data_class = new TVC_Data();
417
- $data_class->update_feed_status($feed_id, 4); // feed status to waiting in queue
418
- echo 'pushed_to_queue';
419
- }
420
- }
421
-
422
- // IMPORTANT: don't forget to exit
423
- exit;
424
- }
425
-
426
- /**
427
- * Logs a message from a javascript call to the server
428
- */
429
- public function tvcajax_log_message(){
430
- // make sure this call is legal
431
- if($this->safe_ajax_call(filter_input(INPUT_POST, 'logMessageNonce'), 'tvcajax-log-message-nonce')){
432
- // fetch the data from $_POST
433
- $message = filter_input(INPUT_POST, 'messageList');
434
- $file_name = filter_input(INPUT_POST, 'fileName');
435
- $text_message = strip_tags($message);
436
-
437
- // only return results when the user is an admin with manage options
438
- if(is_admin()){
439
- //tvc_write_log_file( $text_message, $file_name );
440
- }else{
441
- echo tvc_show_wp_error(esc_html__('Error writing the feed. You do not have the correct authorities to write the file.', 'tvc-product-feed-manager'));
442
- }
443
- }
444
-
445
- // IMPORTANT: don't forget to exit
446
- exit;
447
- }
448
-
449
- /**
450
- * Changes the Auto Feed Fix setting from the Settings page
451
- *
452
- * @since 1.7.0
453
- */
454
- public function tvcajax_auto_feed_fix_mode_selection(){
455
- // make sure this call is legal
456
- if($this->safe_ajax_call(filter_input(INPUT_POST, 'updateAutoFeedFixNonce'), 'tvcajax-auto-feed-fix-nonce')){
457
- $selection = filter_input(INPUT_POST, 'fix_selection');
458
- update_option('tvc_auto_feed_fix', $selection);
459
-
460
- echo get_option('tvc_auto_feed_fix');
461
- }
462
-
463
- // IMPORTANT: don't forget to exit
464
- exit;
465
- }
466
-
467
- /**
468
- * Changes the Disable Background processing setting from the Settings page
469
- *
470
- * @since 2.0.7
471
- */
472
- public function tvcajax_background_processing_mode_selection(){
473
- // make sure this call is legal
474
- if($this->safe_ajax_call(filter_input(INPUT_POST, 'backgroundModeNonce'), 'tvcajax-background-mode-nonce')){
475
- $selection = filter_input(INPUT_POST, 'mode_selection');
476
- update_option('tvc_disabled_background_mode', $selection);
477
-
478
- echo get_option('tvc_disabled_background_mode');
479
- }
480
-
481
- // IMPORTANT: don't forget to exit
482
- exit;
483
- }
484
-
485
- /**
486
- * Changes the Feed Process Logger setting from the Settings page.
487
- *
488
- * @since 2.8.0
489
- */
490
- public function tvcajax_feed_logger_status_selection(){
491
- // make sure this call is legal
492
- if($this->safe_ajax_call(filter_input(INPUT_POST, 'feedLoggerStatusNonce'), 'tvcajax-logger-status-nonce')){
493
- $selection = filter_input(INPUT_POST, 'statusSelection');
494
- update_option('tvc_process_logger_status', $selection);
495
-
496
- echo get_option('tvc_process_logger_status');
497
- }
498
-
499
- // IMPORTANT: don't forget to exit
500
- exit;
501
- }
502
-
503
- /**
504
- * Changes the Show Product Identifiers setting from the Settings page.
505
- *
506
- * @since 2.10.0
507
- */
508
- public function tvcajax_show_product_identifiers_selection(){
509
- // make sure this call is legal
510
- if($this->safe_ajax_call(filter_input(INPUT_POST, 'showPINonce'), 'tvcajax-show-pi-nonce')){
511
- $selection = filter_input(INPUT_POST, 'showPiSelection');
512
- update_option('tvc_show_product_identifiers', $selection);
513
-
514
- echo get_option('tvc_show_product_identifiers');
515
- }
516
-
517
- // IMPORTANT: don't forget to exit
518
- exit;
519
- }
520
-
521
- /**
522
- * Changes the Debug setting from the Settings page
523
- *
524
- * @since 1.9.0
525
- */
526
- public function tvcajax_debug_mode_selection(){
527
- // make sure this call is legal
528
- if($this->safe_ajax_call(filter_input(INPUT_POST, 'debugNonce'), 'tvcajax-debug-nonce')){
529
- $selection = filter_input(INPUT_POST, 'debug_selection');
530
- update_option('tvc_debug_mode', $selection);
531
-
532
- echo get_option('tvc_debug_mode');
533
- }
534
-
535
- // IMPORTANT: don't forget to exit
536
- exit;
537
- }
538
-
539
- public function tvcajax_set_third_party_attribute_keywords(){
540
- // make sure this call is legal
541
- if($this->safe_ajax_call(filter_input(INPUT_POST, 'thirdPartyKeywordsNonce'), 'tvcajax-set-third-party-keywords-nonce')){
542
- $keywords = filter_input(INPUT_POST, 'keywords');
543
- update_option('tvc_third_party_attribute_keywords', $keywords);
544
-
545
- echo get_option('tvc_third_party_attribute_keywords');
546
- }
547
-
548
- // IMPORTANT: don't forget to exit
549
- exit;
550
- }
551
-
552
- public function tvcajax_set_notice_mailaddress(){
553
- // make sure this call is legal
554
- if($this->safe_ajax_call(filter_input(INPUT_POST, 'noticeMailaddressNonce'), 'tvcajax-set-notice-mailaddress-nonce')){
555
- $mailaddress = filter_input(INPUT_POST, 'mailaddress');
556
- update_option('tvc_notice_mailaddress', $mailaddress);
557
-
558
- echo get_option('tvc_notice_mailaddress');
559
- }
560
-
561
- // IMPORTANT: don't forget to exit
562
- exit;
563
- }
564
-
565
- /**
566
- * Re-initiates the plugin, updates the database and loads all cron jobs
567
- *
568
- * @since 1.9.0
569
- */
570
- public function tvcajax_reinitiate_plugin(){
571
- if($this->safe_ajax_call(filter_input(INPUT_POST, 'reInitiateNonce'), 'tvcajax-reinitiate-nonce')){
572
-
573
- if(tvc_reinitiate_plugin()){
574
- echo 'Plugin re-initiated';
575
- }else{
576
- echo 'Re-initiation failed!';
577
- }
578
- }
579
-
580
- // IMPORTANT: don't forget to exit
581
- exit;
582
- }
583
-
584
- /**
585
- * Clears all option data that is related to the feed processing
586
- *
587
- * @since 1.10.0
588
- */
589
- public function tvcajax_clear_feed_process_data(){
590
- if($this->safe_ajax_call(filter_input(INPUT_POST, 'clearFeedNonce'), 'tvcajax-clear-feed-nonce')){
591
-
592
- if(tvc_clear_feed_process_data()){
593
- echo esc_html__('Feed processing data cleared', 'tvc-product-feed-manager');
594
- }else{
595
- /* translators: clearing the feed data failed */
596
- echo esc_html__('Clearing failed!', 'tvc-product-feed-manager');
597
- }
598
- }
599
-
600
- // IMPORTANT: don't forget to exit
601
- exit;
602
- }
603
-
604
  /**
605
  * Returns the campaign categories from a selected country
606
  */
@@ -656,16 +404,6 @@ class TVC_Ajax_File extends TVC_Ajax_Calls {
656
  exit;
657
  }
658
 
659
- public function getPostMetaData($id){
660
- $queries = new TVC_Queries();
661
- $column2 = json_decode(json_encode($queries->getTablePostMeta($id)), true);
662
- $arr = array();
663
- foreach($column2 as $val){
664
- $arr[$val['meta_key']] = $val['meta_value'];
665
- }
666
- return $arr;
667
- }
668
-
669
  /**
670
  * create product batch for product sync up
671
  */
@@ -755,7 +493,6 @@ class TVC_Ajax_File extends TVC_Ajax_Calls {
755
  }
756
 
757
  $entries = [];
758
- //print_r($mappedCats);
759
  if(!empty($mappedCats)){
760
  foreach($mappedCats as $mc_key => $mappedCat){
761
  $all_products = get_posts(array(
@@ -775,7 +512,7 @@ class TVC_Ajax_File extends TVC_Ajax_Calls {
775
  foreach($all_products as $postkey => $postvalue){
776
 
777
  $postmeta = [];
778
- $postmeta = $this->getPostMetaData($postvalue->ID);
779
  $prd = wc_get_product($postvalue->ID);
780
  $postObj = (object) array_merge((array) $postvalue, (array) $postmeta);
781
 
@@ -818,7 +555,7 @@ class TVC_Ajax_File extends TVC_Ajax_Calls {
818
  $p_variations = $prd->get_available_variations();
819
  if(!empty($p_variations)){
820
  foreach ($p_variations as $v_key => $v_value) {
821
- $postmeta_var = (object)$this->getPostMetaData($v_value['variation_id']);
822
  $product['title'] = (isset($postObj->$formArray['title']))?$postObj->$formArray['title']:get_the_title($postvalue->ID);
823
  $tvc_temp_desc_key = $formArray['description'];
824
  $product['description'] = (isset($v_value['variation_description']) && $v_value['variation_description'] != "")?$v_value['variation_description']:$postObj->$tvc_temp_desc_key;
@@ -944,8 +681,6 @@ class TVC_Ajax_File extends TVC_Ajax_Calls {
944
  'method' => 'insert',
945
  'product' => $product
946
  ];
947
- //print_r($entrie);
948
- //exit;
949
  $entries[] = $entrie;
950
  }
951
 
@@ -970,15 +705,13 @@ class TVC_Ajax_File extends TVC_Ajax_Calls {
970
  'body' => wp_json_encode($data)
971
  );
972
 
973
- $request = wp_remote_post($url, $args);
974
- //print_r($request);
975
 
976
  // Retrieve information
977
  $response_code = wp_remote_retrieve_response_code($request);
978
  $response_message = wp_remote_retrieve_response_message($request);
979
  $response_body = json_decode(wp_remote_retrieve_body($request));
980
- //print_r($response_body);
981
- //die;
982
  if((isset($response_body->error) && $response_body->error == '')){
983
  $TVC_Admin_Auto_Product_sync_Helper = new TVC_Admin_Auto_Product_sync_Helper();
984
  $TVC_Admin_Auto_Product_sync_Helper->update_last_sync_in_db();
@@ -1021,7 +754,7 @@ class TVC_Ajax_File extends TVC_Ajax_Calls {
1021
  $subscriptionId = filter_input(INPUT_POST, 'subscriptionId');
1022
  $data = filter_input(INPUT_POST, 'data');
1023
  parse_str($data, $formArray);
1024
- //print_r($formArray); // Only for print array
1025
 
1026
  $customDimension = [];
1027
  $customMetrics = [];
@@ -1084,10 +817,7 @@ class TVC_Ajax_File extends TVC_Ajax_Calls {
1084
  $response_message = wp_remote_retrieve_response_message($request);
1085
  $response_body = json_decode(wp_remote_retrieve_body($request)); */
1086
 
1087
- // print_r($dimenResponse);
1088
- // echo "=======";
1089
- // print_r($metrResponse);
1090
- // exit;
1091
 
1092
 
1093
  if((isset($dimenResponse->error) && $dimenResponse->error == '' && isset($metrResponse->error) && $metrResponse->error == '')){
@@ -1104,12 +834,11 @@ class TVC_Ajax_File extends TVC_Ajax_Calls {
1104
  $dimenError = '';
1105
  $message = NULL;
1106
  if($dimenResponse->errors){
1107
- /* print_r($dimenResponse->errors); */
1108
  $dimenError = $dimenResponse->errors[0];
1109
  $message = str_replace('this entity', 'dimensions ', $dimenError);
1110
  }
1111
  if($metrResponse->errors){
1112
- /* print_r($metrResponse->errors); */
1113
  $metrError = str_replace('this entity', 'metrics ', $metrResponse->errors[0]);
1114
  $message = is_null($message) ? $metrError : $message . ' ' . $metrError;
1115
  }
@@ -1211,18 +940,8 @@ class TVC_Ajax_File extends TVC_Ajax_Calls {
1211
  return $access_token;
1212
  }
1213
  }
1214
- public function woo_country(){
1215
- // The country/state
1216
- $store_raw_country = get_option('woocommerce_default_country');
1217
- // Split the country/state
1218
- $split_country = explode(":", $store_raw_country);
1219
- return $split_country;
1220
- }
1221
 
1222
  }
1223
-
1224
  // End of TVC_Ajax_File_Class
1225
-
1226
  endif;
1227
-
1228
- $tvcajax_file_class = new TVC_Ajax_File();
24
  add_action('wp_ajax_tvcajax-get-campaign-categories', array($this, 'tvcajax_get_campaign_categories'));
25
  add_action('wp_ajax_tvcajax-update-campaign-status', array($this, 'tvcajax_update_campaign_status'));
26
  add_action('wp_ajax_tvcajax-delete-campaign', array($this, 'tvcajax_delete_campaign'));
27
+
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  add_action('wp_ajax_tvcajax-product-syncup', array($this, 'tvcajax_product_syncup'));
29
  add_action('wp_ajax_tvcajax-gmc-category-lists', array($this, 'tvcajax_get_gmc_categories'));
30
  add_action('wp_ajax_tvcajax-custom-metrics-dimension', array($this, 'tvcajax_custom_metrics_dimension'));
31
  add_action('wp_ajax_tvcajax-store-time-taken', array($this, 'tvcajax_store_time_taken'));
32
+
33
  add_action('wp_ajax_tvc_call_api_sync', array($this, 'tvc_call_api_sync'));
34
  add_action('wp_ajax_tvc_call_domain_claim', array($this, 'tvc_call_domain_claim'));
35
  add_action('wp_ajax_tvc_call_site_verified', array($this, 'tvc_call_site_verified'));
36
  add_action('wp_ajax_tvc_call_notice_dismiss', array($this, 'tvc_call_notice_dismiss'));
37
+ add_action('wp_ajax_tvc_call_notification_dismiss', array($this, 'tvc_call_notification_dismiss'));
38
+ add_action('wp_ajax_tvc_call_active_licence', array($this, 'tvc_call_active_licence'));
39
+ }
40
+ //active licence key
41
+ public function tvc_call_active_licence(){
42
+ if ( is_admin() ) {
43
+ $licence_key = isset($_POST['licence_key'])?$_POST['licence_key']:"";
44
+ $TVC_Admin_Helper = new TVC_Admin_Helper();
45
+ $subscription_id = $TVC_Admin_Helper->get_subscriptionId();
46
+ if($subscription_id!="" && $licence_key != ""){
47
+ $response = $TVC_Admin_Helper->active_licence($licence_key, $subscription_id);
48
+
49
+ if($response->error== false){
50
+ //$key, $html, $title = null, $link = null, $link_title = null, $overwrite= false
51
+ $TVC_Admin_Helper->add_ee_msg_nofification("active_licence_key", "Your plan is now successfully activated.", "Congratulations!!", "", "", true);
52
+ $TVC_Admin_Helper->update_subscription_details_api_to_db();
53
+ echo json_encode(array('error' => false, "is_connect"=>true, 'message' => "The licence key has been activated."));
54
+ }else{
55
+ echo json_encode(array('error' => true, "is_connect"=>true, 'message' => $response->message));
56
+ }
57
+ }else if($licence_key != ""){
58
+ $ee_additional_data = $TVC_Admin_Helper->get_ee_additional_data();
59
+ $ee_additional_data['temp_active_licence_key'] = $licence_key;
60
+ $TVC_Admin_Helper->set_ee_additional_data($ee_additional_data);
61
+ echo json_encode(array('error' => true, "is_connect"=>false, 'message' => ""));
62
+ }else{
63
+ echo json_encode(array('error' => true, "is_connect"=>false, 'message' => "Licence key is required."));
64
+ }
65
+ }
66
+ exit;
67
+ }
68
+
69
+ public function tvc_call_notification_dismiss(){
70
+ if($this->safe_ajax_call(filter_input(INPUT_POST, 'TVCNonce'), 'tvc_call_notification_dismiss-nonce')){
71
+ $ee_dismiss_id = isset($_POST['data']['ee_dismiss_id'])?$_POST['data']['ee_dismiss_id']:"";
72
+ if($ee_dismiss_id != ""){
73
+ $TVC_Admin_Helper = new TVC_Admin_Helper();
74
+ $ee_msg_list = $TVC_Admin_Helper->get_ee_msg_nofification_list();
75
+ if( isset($ee_msg_list[$ee_dismiss_id]) ){
76
+ unset($ee_msg_list[$ee_dismiss_id]);
77
+ $ee_msg_list[$ee_dismiss_id]["active"]=0;
78
+ $TVC_Admin_Helper->set_ee_msg_nofification_list($ee_msg_list);
79
+ echo json_encode(array('status' => 'success', 'message' => $ee_additional_data));
80
+ }
81
+
82
+ }
83
+ }
84
+ exit;
85
  }
86
  public function tvc_call_notice_dismiss(){
87
  if($this->safe_ajax_call(filter_input(INPUT_POST, 'apiNoticDismissNonce'), 'tvc_call_notice_dismiss-nonce')){
99
  public function tvc_call_api_sync(){
100
  if($this->safe_ajax_call(filter_input(INPUT_POST, 'apiSyncupNonce'), 'tvc_call_api_sync-nonce')){
101
  $TVC_Admin_Helper = new TVC_Admin_Helper();
102
+ $api_rs = $TVC_Admin_Helper->set_update_api_to_db();
103
+ if(isset($api_rs['error']) && isset($api_rs['message']) && $api_rs['message']){
104
+ echo json_encode($api_rs);
105
+ }else{
106
+ echo json_encode(array('error' => true, 'message' => "Please try after some time."));
107
+ }
108
  exit;
109
  }
110
  exit;
349
  exit;
350
  }
351
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
352
  /**
353
  * Returns the campaign categories from a selected country
354
  */
404
  exit;
405
  }
406
 
 
 
 
 
 
 
 
 
 
 
407
  /**
408
  * create product batch for product sync up
409
  */
493
  }
494
 
495
  $entries = [];
 
496
  if(!empty($mappedCats)){
497
  foreach($mappedCats as $mc_key => $mappedCat){
498
  $all_products = get_posts(array(
512
  foreach($all_products as $postkey => $postvalue){
513
 
514
  $postmeta = [];
515
+ $postmeta = $TVC_Admin_Helper->tvc_get_post_meta($postvalue->ID);
516
  $prd = wc_get_product($postvalue->ID);
517
  $postObj = (object) array_merge((array) $postvalue, (array) $postmeta);
518
 
555
  $p_variations = $prd->get_available_variations();
556
  if(!empty($p_variations)){
557
  foreach ($p_variations as $v_key => $v_value) {
558
+ $postmeta_var = (object)$TVC_Admin_Helper->tvc_get_post_meta($v_value['variation_id']);
559
  $product['title'] = (isset($postObj->$formArray['title']))?$postObj->$formArray['title']:get_the_title($postvalue->ID);
560
  $tvc_temp_desc_key = $formArray['description'];
561
  $product['description'] = (isset($v_value['variation_description']) && $v_value['variation_description'] != "")?$v_value['variation_description']:$postObj->$tvc_temp_desc_key;
681
  'method' => 'insert',
682
  'product' => $product
683
  ];
 
 
684
  $entries[] = $entrie;
685
  }
686
 
705
  'body' => wp_json_encode($data)
706
  );
707
 
708
+ $request = wp_remote_post($url, $args);
 
709
 
710
  // Retrieve information
711
  $response_code = wp_remote_retrieve_response_code($request);
712
  $response_message = wp_remote_retrieve_response_message($request);
713
  $response_body = json_decode(wp_remote_retrieve_body($request));
714
+
 
715
  if((isset($response_body->error) && $response_body->error == '')){
716
  $TVC_Admin_Auto_Product_sync_Helper = new TVC_Admin_Auto_Product_sync_Helper();
717
  $TVC_Admin_Auto_Product_sync_Helper->update_last_sync_in_db();
754
  $subscriptionId = filter_input(INPUT_POST, 'subscriptionId');
755
  $data = filter_input(INPUT_POST, 'data');
756
  parse_str($data, $formArray);
757
+ // Only for print array
758
 
759
  $customDimension = [];
760
  $customMetrics = [];
817
  $response_message = wp_remote_retrieve_response_message($request);
818
  $response_body = json_decode(wp_remote_retrieve_body($request)); */
819
 
820
+
 
 
 
821
 
822
 
823
  if((isset($dimenResponse->error) && $dimenResponse->error == '' && isset($metrResponse->error) && $metrResponse->error == '')){
834
  $dimenError = '';
835
  $message = NULL;
836
  if($dimenResponse->errors){
837
+
838
  $dimenError = $dimenResponse->errors[0];
839
  $message = str_replace('this entity', 'dimensions ', $dimenError);
840
  }
841
  if($metrResponse->errors){
 
842
  $metrError = str_replace('this entity', 'metrics ', $metrResponse->errors[0]);
843
  $message = is_null($message) ? $metrError : $message . ' ' . $metrError;
844
  }
940
  return $access_token;
941
  }
942
  }
 
 
 
 
 
 
 
943
 
944
  }
 
945
  // End of TVC_Ajax_File_Class
 
946
  endif;
947
+ $tvcajax_file_class = new TVC_Ajax_File();
 
includes/data/class-tvc-feed-crud-handler.php DELETED
@@ -1,88 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * TVC Feed CRUD Handler class.
5
- *
6
- * @package TVC Product Feed Manager/Data/Classes
7
- * @version 1.0.0
8
- */
9
-
10
- if ( ! defined( 'ABSPATH' ) ) {
11
- exit;
12
- }
13
-
14
- if ( ! class_exists( 'TVC_Feed_CRUD_Handler' ) ) :
15
-
16
- class TVC_Feed_CRUD_Handler {
17
-
18
- /**
19
- * @param $feed_data
20
- * @param $meta_data_encoded
21
- * @param $feed_filter
22
- * @return int
23
- */
24
- public static function create_or_update_feed_data( $feed_data, $meta_data_encoded, $feed_filter ) {
25
- $data_class = new TVC_Data();
26
- $queries_class = new TVC_Queries();
27
-
28
- $feed_id = self::get_feed_id_from_feed_data( $feed_data );
29
-
30
- // convert the feed data to a database format
31
- $feed_data_to_store = $data_class->convert_ajax_feed_data_to_database_format( $feed_data );
32
- $feed_data_types = $data_class->get_types_from_feed_data( $feed_data_to_store, $feed_data );
33
-
34
- // convert country code to country id
35
- $feed_data_to_store['country_id'] = $data_class->get_country_id_from_short_code( $feed_data_to_store['country_id'] )->country_id;
36
-
37
- self::add_fixed_data_fields( $feed_data_to_store, $feed_data_types, $feed_id );
38
-
39
- // decode the meta data
40
- $meta_data = json_decode( $meta_data_encoded );
41
-
42
- // create or update the feed
43
- if ( $feed_id < 0 ) {
44
- $actual_feed_id = $queries_class->create_feed( $feed_data_to_store, $feed_data_types );
45
- } else {
46
- $update_result = $queries_class->update_feed( $feed_id, $feed_data_to_store, $feed_data_types );
47
- $actual_feed_id = $update_result ? $feed_id : 0;
48
- }
49
-
50
- if ( count( $meta_data ) > 0 ) {
51
- $queries_class->update_meta_data( $actual_feed_id, $meta_data );
52
- }
53
-
54
- $queries_class->store_feed_filter( $actual_feed_id, $feed_filter );
55
-
56
- return $actual_feed_id;
57
- }
58
-
59
- /**
60
- * @param $feed_data
61
- * @return mixed
62
- */
63
- private static function get_feed_id_from_feed_data( $feed_data ) {
64
- // use the array_filter to select the feed data element with product_feed_id as name
65
- $feed_id_item = array_filter(
66
- $feed_data,
67
- function( $element ) {
68
- return 'product_feed_id' === $element->name;
69
- }
70
- );
71
- // return the feed id
72
- return reset( $feed_id_item )->value;
73
- }
74
-
75
- /**
76
- * @param $feed_data
77
- * @param $data_types
78
- * @param $feed_id
79
- */
80
- private static function add_fixed_data_fields( &$feed_data, &$data_types, $feed_id ) {
81
- $feed_data['updated'] = date( 'Y-m-d H:i:s', current_time( 'timestamp' ) );
82
- if ( $feed_id < 0 ) {
83
- $feed_data['products'] = 0; }
84
- array_push( $data_types, '%s', '%d' );
85
- }
86
- }
87
- // end of TVC_Feed_CRUD_Handler class
88
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/data/class-tvc-file.php DELETED
@@ -1,246 +0,0 @@
1
- <?php
2
- /**
3
- * TVC Product Feed File Class.
4
- *
5
- * @package TVC Product Feed Manager/Data/Classes
6
- * @version 1.3.1
7
- */
8
-
9
- if ( ! defined( 'ABSPATH' ) ) {
10
- exit;
11
- }
12
-
13
- if ( ! class_exists( 'TVC_File' ) ) :
14
-
15
- /**
16
- * The File Class
17
- */
18
- class TVC_File {
19
-
20
- private $_queries;
21
-
22
- public function __construct() {
23
- $this->_queries = new TVC_Queries();
24
- }
25
-
26
- /**
27
- * Reads the correct categories from a channel specific taxonomy text file
28
- *
29
- * @param int $channel_id
30
- * @param string $search_level
31
- * @param string $parent_category
32
- * @param string $language_code
33
- *
34
- * @return array|string containing the categories
35
- */
36
- public function get_categories_for_list( $channel_id, $search_level, $parent_category, $language_code ) {
37
- $channel_class = new TVC_Channel();
38
-
39
- $last_cat = '';
40
- $categories = array();
41
- $channel_name = $channel_class->get_channel_short_name( $channel_id );
42
-
43
- $path = TVC_CHANNEL_DATA_DIR . "/$channel_name/taxonomy.$language_code.txt";
44
-
45
- if ( file_exists( $path ) ) {
46
- $file = fopen( $path, 'r' )
47
- or die( esc_html__( 'Unable to open the file containing the categories', 'tvc-product-feed-manager' ) );
48
-
49
- // step over the first lines that do not contain categories
50
- while ( strpos( fgets( $file ), '#' ) ) {
51
- continue;
52
- }
53
-
54
- // step through all the lines in the file
55
- while ( ! feof( $file ) ) {
56
- // get the line
57
- $line = trim( fgets( $file ) );
58
-
59
- // split the line into pieces using the > separator
60
- $category_line_array = explode( '>', $line );
61
-
62
- if ( 0 === $search_level ) {
63
- if ( trim( $category_line_array [ $search_level ] ) !== $last_cat ) {
64
- array_push( $categories, trim( $category_line_array [ $search_level ] ) );
65
- $last_cat = trim( $category_line_array [ $search_level ] );
66
- }
67
- } elseif ( count( $category_line_array ) > $search_level && $search_level > 0 && trim( $category_line_array [ $search_level - 1 ] ) === trim( $parent_category ) ) {
68
- if ( trim( $category_line_array [ $search_level ] ) !== $last_cat ) {
69
- array_push( $categories, trim( $category_line_array [ $search_level ] ) );
70
- $last_cat = trim( $category_line_array [ $search_level ] );
71
- }
72
- }
73
- }
74
-
75
- // don't forget to free the resources
76
- fclose( $file );
77
- }
78
-
79
- return $categories;
80
- }
81
-
82
- public function get_output_fields_for_specific_channel( $channel ) {
83
- $fields = array();
84
-
85
- $path = TVC_CHANNEL_DATA_DIR . "/$channel/$channel.txt";
86
-
87
- if ( file_exists( $path ) ) {
88
- $file = fopen( $path, 'r' )
89
- or die( esc_html__( 'Unable to open the file containing the categories', 'tvc-product-feed-manager' ) );
90
-
91
- // step through all the lines in the file
92
- while ( ! feof( $file ) ) {
93
- $field_object = new stdClass();
94
-
95
- // get the line
96
- $line = fgetcsv( $file, 0, "\t" );
97
-
98
- if ( is_array( $line ) && ! empty( $line[0] ) ) {
99
- $field_object->field_id = $line[0];
100
- $field_object->category_id = $line[1];
101
- $field_object->field_label = $line[2];
102
-
103
- array_push( $fields, $field_object );
104
- }
105
- }
106
- }
107
-
108
- return $fields;
109
- }
110
-
111
- /**
112
- * Check the standard backup folder and return the .sql file names in it
113
- *
114
- * @return array
115
- */
116
- public function make_list_of_active_backups() {
117
- $backups = array();
118
-
119
- $path = TVC_BACKUP_DIR;
120
-
121
- foreach ( glob( $path . '/*.sql' ) as $file ) {
122
- $feed = fopen( $file, 'r' );
123
- $line = fgets( $feed );
124
- fclose( $feed );
125
-
126
- $file_name = str_replace( TVC_BACKUP_DIR . '/', '', $file );
127
- $date_string = strtok( $line, '#' );
128
- $file_date = strlen( $date_string ) < 15 ? date( 'Y-m-d H:i:s', $date_string ) : 'unknown';
129
-
130
- array_push( $backups, $file_name . '&&' . $file_date );
131
- }
132
-
133
- return $backups;
134
- }
135
-
136
- public function write_full_backup_file( $backup_file, $backup_string ) {
137
- if ( is_writable( TVC_BACKUP_DIR ) ) {
138
- $feed = fopen( $backup_file, 'w' );
139
- } else {
140
- /* translators: %s: Folder that holds the backup files */
141
- return sprintf( esc_html__( '1432 - %s is not a writable folder. Make sure you have admin rights to this folder.', 'tvc-product-feed-manager' ), TVC_BACKUP_DIR );
142
- }
143
-
144
- if ( false !== $feed ) {
145
- fwrite( $feed, $backup_string );
146
- fclose( $feed );
147
-
148
- return true;
149
- } else {
150
- /* translators: %s: Selected backup file */
151
- return sprintf( esc_html__( '1433 - Could not write the %s file.', 'tvc-product-feed-manager' ), $backup_file );
152
- }
153
- }
154
-
155
- public function get_installed_channels_from_file() {
156
- $active_channels = array();
157
-
158
- if ( file_exists( TVC_CHANNEL_DATA_DIR ) ) {
159
- $dir_iterator = new RecursiveDirectoryIterator( TVC_CHANNEL_DATA_DIR );
160
- $iterator = new RecursiveIteratorIterator( $dir_iterator, RecursiveIteratorIterator::SELF_FIRST );
161
-
162
- foreach ( $iterator as $folder ) {
163
- if ( $folder->isDir() && $folder->getFilename() !== '.' & $folder->getFilename() !== '..' ) {
164
- array_push( $active_channels, $folder->getBaseName() );
165
- }
166
- }
167
- }
168
-
169
- return $active_channels;
170
- }
171
-
172
- /**
173
- * Takes the installed channel .zip file and unzips it in the channels folder
174
- *
175
- * @param string $channel_name
176
- *
177
- * @return bool false if installing the channel failed
178
- */
179
- public function unzip_channel_file( $channel_name ) {
180
- if ( ! file_exists( TVC_CHANNEL_DATA_DIR ) ) {
181
- TVC_Folders::make_channels_support_folder();
182
- }
183
-
184
- WP_Filesystem();
185
-
186
- $zip_file = TVC_CHANNEL_DATA_DIR . '/' . $channel_name . '.zip';
187
- $destination_path = TVC_CHANNEL_DATA_DIR . '/';
188
-
189
- if ( ! file_exists( $zip_file ) ) {
190
- tvc_write_log_file( sprintf( 'Failed installing the Channel %s. Could not download the .zip file from the server.', $channel_name ) );
191
-
192
- return false;
193
- }
194
-
195
- $unzip_result = unzip_file( $zip_file, $destination_path );
196
-
197
- if ( is_wp_error( $unzip_result ) ) {
198
- tvc_handle_wp_errors_response( $unzip_result, sprintf( 'The installation of channel %s failed. Unable to unpack the channel file in folder %s.', $channel_name, TVC_CHANNEL_DATA_DIR ) );
199
- }
200
-
201
- unlink( $zip_file ); // clean up the zip file
202
-
203
- return true;
204
- }
205
-
206
- /**
207
- * @param $channel_short_name
208
- */
209
- public function delete_channel_source_files( $channel_short_name ) {
210
- $channel_folder = TVC_CHANNEL_DATA_DIR . '/' . $channel_short_name;
211
-
212
- if ( file_exists( $channel_folder ) && is_dir( $channel_folder ) ) {
213
- // remove the channel definition files
214
- TVC_Folders::delete_folder( $channel_folder );
215
- }
216
-
217
- if ( 'google' === $channel_short_name ) {
218
- $free_version_google_folder = ENHANCAD_PLUGIN_DIR . 'includes/application/google';
219
-
220
- if ( file_exists( $free_version_google_folder ) && is_dir( $free_version_google_folder ) ) {
221
- TVC_Folders::delete_folder( $free_version_google_folder );
222
- }
223
- }
224
- }
225
-
226
- /**
227
- * @param $channel_id
228
- */
229
- public function delete_channel_feed_files( $channel_id ) {
230
- $feeds = $this->_queries->get_feeds_from_specific_channel( $channel_id );
231
-
232
- foreach ( $feeds as $feed_id ) {
233
- $file_url = $this->_queries->get_file_url_from_feed( $feed_id['product_feed_id'] );
234
- $file_name = basename( $file_url );
235
- $file_path = TVC_FEEDS_DIR . '/' . $file_name;
236
-
237
- if ( file_exists( $file_path ) ) {
238
- unlink( $file_path );
239
- }
240
- }
241
- }
242
- }
243
-
244
- // end of TVC_File_Class
245
-
246
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/data/class-tvc-queries.php DELETED
@@ -1,972 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * TVC Queries Class.
5
- *
6
- * @package TVC Product Feed Manager/Data/Classes
7
- * @version 4.11.0
8
- */
9
-
10
- if ( ! defined( 'ABSPATH' ) ) {
11
- exit;
12
- }
13
-
14
- if ( ! class_exists( 'TVC_Queries' ) ) :
15
-
16
- /**
17
- * WP Queries Class
18
- */
19
- class TVC_Queries {
20
-
21
- private $_wpdb;
22
-
23
- /**
24
- * @var string placeholder containing the wp table prefix
25
- */
26
- private $_table_prefix;
27
-
28
- /**
29
- * TVC_Queries Constructor
30
- */
31
- public function __construct() {
32
- // get global WordPress database functions
33
- global $wpdb;
34
-
35
- // assign the global wpdb to a variable
36
- $this->_wpdb = &$wpdb;
37
-
38
- // assign the wp table prefix to a variable
39
- $this->_table_prefix = $this->_wpdb->prefix;
40
- }
41
-
42
- public function get_feeds_list() {
43
- // filter out all non product feeds when no special feed add-on plugin is active
44
- $feed_type_filter = ! apply_filters( 'tvc_special_feeds_add_on_active', false ) ? " WHERE p.feed_type_id = '1'" : '';
45
-
46
- return $this->_wpdb->get_results(
47
- "SELECT p.product_feed_id, p.title, p.url, p.updated, p.feed_type_id, p.products, s.status AS status, s.color AS color FROM {$this->_table_prefix}feedmanager_product_feed AS p
48
- INNER JOIN {$this->_table_prefix}feedmanager_feed_status AS s on p.status_id = s.status_id{$feed_type_filter}"
49
- );
50
- }
51
-
52
- public function get_all_feed_names() {
53
- return $this->_wpdb->get_results( "SELECT title FROM {$this->_table_prefix}feedmanager_product_feed" );
54
- }
55
-
56
- public function get_feed_row( $feed_id ) {
57
- return $this->_wpdb->get_row( "SELECT * FROM {$this->_table_prefix}feedmanager_product_feed WHERE product_feed_id = {$feed_id}" );
58
- }
59
-
60
- /**
61
- * Get a list of all existing countries
62
- *
63
- * @return array|object|null of the query
64
- */
65
- public function read_countries() {
66
- return $this->_wpdb->get_results( "SELECT name_short, name FROM {$this->_table_prefix}feedmanager_country ORDER BY name", ARRAY_A );
67
- }
68
-
69
- public function get_feedmanager_channel_table() {
70
- return $this->_wpdb->get_results( "SELECT * FROM {$this->_table_prefix}feedmanager_channel", ARRAY_A );
71
- }
72
-
73
- public function get_feedmanager_product_feed_table() {
74
- return $this->_wpdb->get_results( "SELECT * FROM {$this->_table_prefix}feedmanager_product_feed", ARRAY_A );
75
- }
76
-
77
- public function get_feedmanager_product_feedmeta_table() {
78
- return $this->_wpdb->get_results( "SELECT * FROM {$this->_table_prefix}feedmanager_product_feedmeta", ARRAY_A );
79
- }
80
-
81
- public function get_feed_type_id( $feed_id ) {
82
- return $this->_wpdb->get_var( "SELECT feed_type_id FROM {$this->_table_prefix}feedmanager_product_feed WHERE product_feed_id = '{$feed_id}'" );
83
- }
84
-
85
- public function read_channels() {
86
- $google = array( 'channel_id' => '1', 'name' => 'Google Merchant Centre', 'short' => 'google' );
87
- return array( $google );
88
- }
89
- public function get_set_merchant_id(){
90
- return $this->_wpdb->get_var( "SELECT * FROM {$this->_table_prefix}feedmanager_default_center WHERE status = 1" );
91
- }
92
-
93
- public function get_merchant_info(){
94
- return $this->_wpdb->get_row( "SELECT * FROM {$this->_table_prefix}feedmanager_default_center WHERE status = 1");
95
- }
96
-
97
- public function get_set_ads_account_id($merchantId = ''){
98
- if($merchantId == '') {
99
- return $this->_wpdb->get_var( "SELECT * FROM {$this->_table_prefix}adsmanager_default_center WHERE status = 1" );
100
- } else {
101
- return $this->_wpdb->get_var( "SELECT * FROM {$this->_table_prefix}adsmanager_default_center WHERE status = 1 AND merchant_id = {$merchantId}" );
102
- }
103
-
104
- }
105
-
106
- public function get_merchant_center_linked_flag($adsId = '') {
107
- return $this->_wpdb->get_row( "SELECT * FROM {$this->_table_prefix}adsmanager_default_center WHERE status = 1 AND merchant_center_linked = 1 AND account_id = {$adsId}" );
108
- }
109
-
110
- public function get_claim(){
111
- return $this->_wpdb->get_var( "SELECT * FROM {$this->_table_prefix}feedmanager_default_center WHERE claim = 1" );
112
- }
113
-
114
- /**
115
- * @param $channel_short_name
116
- * @param $channel_id
117
- * @param $channel_name
118
- * @return bool|int
119
- */
120
- public function register_a_channel( $channel_short_name, $channel_id, $channel_name ) {
121
- return $this->_wpdb->query(
122
- $this->_wpdb->prepare(
123
- "INSERT INTO {$this->_table_prefix}feedmanager_channel (channel_id, name, short) VALUES
124
- ( %d, '%s', '%s' )",
125
- $channel_id,
126
- $channel_name,
127
- $channel_short_name
128
- )
129
- );
130
- }
131
-
132
- /**
133
- * @param $channel_short_name
134
- * @return string|null
135
- */
136
- public function get_channel_id( $channel_short_name ) {
137
- return $this->_wpdb->get_var( "SELECT channel_id FROM {$this->_table_prefix}feedmanager_channel WHERE short = '{$channel_short_name}'" );
138
- }
139
-
140
- /**
141
- * @param $channel_id
142
- * @return bool|string|null
143
- */
144
- public function get_channel_short_name_from_db( $channel_id ) {
145
- if ( 'undefined' !== $channel_id ) { // make sure the selected channel is installed
146
- return $this->_wpdb->get_var( "SELECT short FROM {$this->_table_prefix}feedmanager_channel WHERE channel_id = {$channel_id}" );
147
- } else {
148
- return false;
149
- }
150
- }
151
-
152
- /**
153
- * @param $channel_short
154
- * @return false|int
155
- */
156
- public function remove_channel_from_db( $channel_short ) {
157
- $main_table = $this->_table_prefix . 'feedmanager_channel';
158
-
159
- return $this->_wpdb->delete( $main_table, array( 'short' => $channel_short ) );
160
- }
161
-
162
- /**
163
- * @return bool|int
164
- */
165
- public function clean_channel_table() {
166
- return $this->_wpdb->query(
167
- $this->_wpdb->prepare(
168
- "DELETE FROM {$this->_table_prefix}feedmanager_channel WHERE channel_id = %d OR name = %s",
169
- 0,
170
- ''
171
- )
172
- );
173
- }
174
-
175
- public function read_active_schedule_data() {
176
- return $this->_wpdb->get_results( "SELECT product_feed_id, updated, schedule FROM {$this->_table_prefix}feedmanager_product_feed WHERE status_id=1", ARRAY_A );
177
- }
178
-
179
- public function read_failed_feeds() {
180
- return $this->_wpdb->get_results( "SELECT product_feed_id, updated, schedule FROM {$this->_table_prefix}feedmanager_product_feed WHERE status_id=5 OR status_id=6", ARRAY_A );
181
- }
182
-
183
- public function read_sources() {
184
- return $this->_wpdb->get_results( "SELECT source_id, name FROM {$this->_table_prefix}feedmanager_source ORDER BY name", ARRAY_A );
185
- }
186
-
187
- public function get_feeds_from_specific_channel( $channel_id ) {
188
- return $this->_wpdb->get_results( "SELECT product_feed_id FROM {$this->_table_prefix}feedmanager_product_feed WHERE channel_id = {$channel_id}", ARRAY_A );
189
- }
190
-
191
- /**
192
- * @param $feed_id
193
- * @return array|object|null
194
- */
195
- public function get_meta_parents( $feed_id ) {
196
- return $this->_wpdb->get_results( "SELECT ID FROM {$this->_table_prefix}posts WHERE post_parent = {$feed_id}", ARRAY_A );
197
- }
198
-
199
- /**
200
- * @param $feed_id
201
- * @return array|object|null
202
- */
203
- public function read_feed( $feed_id ) {
204
- $result = $this->_wpdb->get_results(
205
- "SELECT p.product_feed_id, p.source_id AS source, p.title, p.feed_title, p.feed_description, p.main_category, "
206
- . "p.url, p.include_variations, p.is_aggregator, p.status_id, p.base_status_id, p.updated, p.products, p.feed_type_id, p.schedule, c.name_short "
207
- . "AS country, m.channel_id AS channel, p.language "
208
- . "FROM {$this->_table_prefix}feedmanager_product_feed AS p "
209
- . "INNER JOIN {$this->_table_prefix}feedmanager_country AS c ON p.country_id = c.country_id "
210
- . "INNER JOIN {$this->_table_prefix}feedmanager_channel AS m ON p.channel_id = m.channel_id "
211
- . "WHERE p.product_feed_id = {$feed_id}",
212
- ARRAY_A
213
- );
214
-
215
- $category_mapping = $this->read_category_mapping( $feed_id );
216
-
217
- if ( isset( $category_mapping[0]['meta_value'] ) && $category_mapping[0]['meta_value'] !== '' ) {
218
- $result[0]['category_mapping'] = $category_mapping[0]['meta_value'];
219
- } else {
220
- $result[0]['category_mapping'] = '';
221
- }
222
-
223
- return $result;
224
- }
225
-
226
- /**
227
- * @param $feed_id
228
- * @return array|object|null
229
- */
230
- public function read_category_mapping( $feed_id ) {
231
- return $this->_wpdb->get_results( "SELECT meta_value FROM {$this->_table_prefix}feedmanager_product_feedmeta WHERE product_feed_id = {$feed_id} AND meta_key = 'category_mapping'", ARRAY_A );
232
- }
233
-
234
- /**
235
- * @param $feed_id
236
- * @return |null
237
- */
238
- public function get_feed_status_data( $feed_id ) {
239
- $status = $this->_wpdb->get_results(
240
- "SELECT product_feed_id, channel_id, title, url, status_id, products, feed_type_id "
241
- . "FROM {$this->_table_prefix}feedmanager_product_feed "
242
- . "WHERE product_feed_id = '{$feed_id}'",
243
- ARRAY_A
244
- );
245
-
246
- return $status ? $status[0] : null;
247
- }
248
-
249
- /**
250
- * Returns the post ids that belong to the selected categories
251
- *
252
- * @param string $category_string A string that contains the selected categories.
253
- * @param bool $with_variation True if product variations should be included in the feed. Default false.
254
- *
255
- * @return array
256
- */
257
- public function get_post_ids( $category_string, $with_variation = false ) {
258
- // If the user has not selected a category, return an empty array.
259
- if ( empty( $category_string ) ) {
260
- return array();
261
- }
262
-
263
- $start_product_id = get_transient( 'tvc_start_product_id' ) ? get_transient( 'tvc_start_product_id' ) : -1;
264
-
265
- // Limit the number of products per query to 1000 to prevent a result that is to large to handle by the server.
266
- // When the limit is reached a next batch will be requested by the fill_the_background_queue function.
267
- // @since 2.11.0
268
- $product_query_limit = apply_filters( 'tvc_product_query_limit', 1000 );
269
-
270
- $products_query = "SELECT DISTINCT {$this->_table_prefix}posts.ID
271
- FROM {$this->_table_prefix}posts
272
- LEFT JOIN {$this->_table_prefix}term_relationships ON ({$this->_table_prefix}posts.ID = {$this->_table_prefix}term_relationships.object_id)
273
- LEFT JOIN {$this->_table_prefix}term_taxonomy ON ({$this->_table_prefix}term_relationships.term_taxonomy_id = {$this->_table_prefix}term_taxonomy.term_taxonomy_id)
274
- WHERE {$this->_table_prefix}posts.post_type = 'product' AND {$this->_table_prefix}posts.post_status = 'publish'
275
- AND {$this->_table_prefix}term_taxonomy.term_id IN ($category_string)
276
- AND {$this->_table_prefix}posts.ID > $start_product_id
277
- ORDER BY ID LIMIT $product_query_limit";
278
-
279
- // Get all main product ids (simple and variable, but not the variations).
280
- $main_products_ids = $this->_wpdb->get_col( $products_query );
281
-
282
- set_transient( 'tvc_start_product_id', end( $main_products_ids ), TVC_TRANSIENT_LIVE );
283
-
284
- // if variations should not be included return the main product ids
285
- if ( ! $with_variation || empty( $main_products_ids ) ) {
286
- return $main_products_ids;
287
- }
288
-
289
- // Put the main ids in a string so it can be attached to a query string.
290
- $main_products_ids_string = implode( ', ', $main_products_ids );
291
-
292
- $variation_products_query = "SELECT DISTINCT post_parent FROM {$this->_table_prefix}posts
293
- WHERE {$this->_table_prefix}posts.post_parent IN ( {$main_products_ids_string} )
294
- AND {$this->_table_prefix}posts.post_type = 'product_variation'
295
- AND {$this->_table_prefix}posts.post_status = 'publish'
296
- ORDER BY ID";
297
-
298
- // Get the ids of the variable products.
299
- $variation_products = $this->_wpdb->get_col( $variation_products_query );
300
-
301
- // If there are no variations, return the main product ids.
302
- if ( count( $variation_products ) < 1 ) {
303
- return $main_products_ids;
304
- }
305
-
306
- $variation_products_ids_string = implode( ', ', $variation_products );
307
-
308
- // Remove the main product ids of products that have a valid variable version from the list to keep only the ids of the simple products.
309
- $simple_products_ids = array_diff( $main_products_ids, $variation_products );
310
-
311
- $product_variations_query = "SELECT DISTINCT ID FROM {$this->_table_prefix}posts
312
- WHERE {$this->_table_prefix}posts.post_parent IN ( {$variation_products_ids_string} )
313
- AND {$this->_table_prefix}posts.post_type = 'product_variation'
314
- AND {$this->_table_prefix}posts.post_status = 'publish'
315
- ORDER BY ID";
316
-
317
- // Now get the variations.
318
- $product_variations_ids = $this->_wpdb->get_col( $product_variations_query );
319
-
320
- // Combine the variable product ids with the remaining simple product ids.
321
- $all_product_ids = array_merge( $simple_products_ids, $product_variations_ids );
322
- asort( $all_product_ids );
323
-
324
- return $all_product_ids;
325
- }
326
-
327
- /**
328
- * Gets the required data from the main
329
- *
330
- * @param string $post_id
331
- * @param string $column_string
332
- *
333
- * @return array|object|null
334
- */
335
- public function read_post_data( $post_id, $column_string ) {
336
- $selecting_columns = $column_string ? ', ' . $column_string : '';
337
-
338
- $result = $this->_wpdb->get_results(
339
- "SELECT DISTINCT ID $selecting_columns
340
- FROM {$this->_table_prefix}posts
341
- WHERE ID = $post_id"
342
- );
343
-
344
- return $result ? $result[0] : null;
345
- }
346
-
347
- /**
348
- * returns the lowest product id belonging to one or more categories
349
- *
350
- * @param string $category_string
351
- *
352
- * @return string
353
- */
354
- public function get_lowest_product_id( $category_string ) {
355
- $main_table = $this->_table_prefix . 'posts';
356
- $term_relationships_table = $this->_table_prefix . 'term_relationships';
357
- $term_taxonomy_table = $this->_table_prefix . 'term_taxonomy';
358
-
359
- $result = $this->_wpdb->get_results(
360
- "SELECT MIN(ID) FROM $main_table
361
- LEFT JOIN $term_relationships_table ON ($main_table.ID = $term_relationships_table.object_id)
362
- LEFT JOIN $term_taxonomy_table ON ($term_relationships_table.term_taxonomy_id = $term_taxonomy_table.term_taxonomy_id)
363
- WHERE $main_table.post_type = 'product' AND $main_table.post_status = 'publish'
364
- AND $term_taxonomy_table.term_id IN ($category_string)",
365
- ARRAY_A
366
- );
367
-
368
- return $result ? $result[0]['MIN(ID)'] : 0;
369
- }
370
-
371
-
372
- /**
373
- * returns the highest product id belonging to one or more categories
374
- *
375
- * @param string $category_string
376
- *
377
- * @return string
378
- */
379
- public function get_highest_product_id( $category_string ) {
380
- $main_table = $this->_table_prefix . 'posts';
381
- $term_relationships_table = $this->_table_prefix . 'term_relationships';
382
- $term_taxonomy_table = $this->_table_prefix . 'term_taxonomy';
383
-
384
- $result = $this->_wpdb->get_results(
385
- "SELECT MAX(ID) FROM $main_table
386
- LEFT JOIN $term_relationships_table ON ($main_table.ID = $term_relationships_table.object_id)
387
- LEFT JOIN $term_taxonomy_table ON ($term_relationships_table.term_taxonomy_id = $term_taxonomy_table.term_taxonomy_id)
388
- WHERE $main_table.post_type = 'product' AND $main_table.post_status = 'publish'
389
- AND $term_taxonomy_table.term_id IN ($category_string)",
390
- ARRAY_A
391
- );
392
-
393
- return $result ? $result[0]['MAX(ID)'] : 0;
394
- }
395
-
396
- /**
397
- * @param $product_id
398
- * @param $parent_product_id
399
- * @param $record_ids
400
- * @param $meta_columns
401
- * @return array
402
- */
403
- public function read_meta_data( $product_id, $parent_product_id, $record_ids, $meta_columns ) {
404
- $data = array();
405
-
406
- foreach ( $meta_columns as $column ) {
407
- $taxonomy = get_taxonomy( $column );
408
-
409
- if ( $taxonomy ) {
410
-
411
- $taxonomy_value = TVC_Taxonomies::make_shop_taxonomies_string( $product_id, $taxonomy->name, ', ' );
412
-
413
- if ( ! $taxonomy_value ) {
414
- $taxonomy_value = TVC_Taxonomies::make_shop_taxonomies_string( $parent_product_id, $taxonomy->name, ', ' );
415
- }
416
-
417
- if ( $taxonomy_value ) {
418
- array_push( $data, $this->make_meta_object( $column, $taxonomy_value, $product_id ) );
419
- }
420
- }
421
-
422
- foreach ( $record_ids as $rec_id ) {
423
- $value = get_post_meta( $rec_id, $column, true );
424
-
425
- if ( $value || '0' === $value ) {
426
- array_push( $data, $this->make_meta_object( $column, $value, $rec_id ) );
427
- break;
428
- } else {
429
- $alt_val = maybe_unserialize( get_post_meta( $rec_id, '_product_attributes', true ) );
430
- $col_name = str_replace( ' ', '-', strtolower( $column ) );
431
- if ( $alt_val && isset( $alt_val[ $col_name ] ) ) {
432
- array_push( $data, $this->make_meta_object( $column, $alt_val[ $col_name ]['value'], $rec_id ) );
433
- } elseif ( $alt_val && is_array( $alt_val ) ) {
434
- foreach ( $alt_val as $v ) {
435
- if ( $v['name'] === $column ) {
436
- array_push( $data, $this->make_meta_object( $column, $v['value'], $rec_id ) );
437
- }
438
- }
439
- }
440
- }
441
- }
442
- }
443
-
444
- $this->polish_data( $data, $product_id );
445
-
446
- return $data;
447
- }
448
-
449
- /**
450
- * @param $key
451
- * @param $value
452
- * @param $id
453
- * @return stdClass
454
- */
455
- private function make_meta_object( $key, $value, $id ) {
456
- $obj = new stdClass();
457
- $obj->meta_key = $key;
458
- $obj->meta_value = $value;
459
- $obj->post_id = $id;
460
-
461
- return $obj;
462
- }
463
-
464
- /**
465
- * @param $data
466
- * @param $main_post_id
467
- */
468
- private function polish_data( &$data, $main_post_id ) {
469
- $site_url = get_option( 'siteurl' );
470
-
471
- foreach ( $data as $row ) {
472
- // make sure the _wp_attached_file data contains a valid url
473
- if ( '_wp_attached_file' === $row->meta_key ) {
474
- $row->meta_value = $this->get_post_thumbnail_url( $main_post_id, 'large' );
475
-
476
- // if the _wp_attached_file data is not a valid url than add the url data
477
- if ( ! filter_var( $row->meta_value, FILTER_VALIDATE_URL ) ) {
478
- $row->meta_value = $site_url . '/wp-content/uploads/' . $row->meta_value;
479
- }
480
- }
481
-
482
- // convert the time stamp format to a usable date time format for the feed
483
- if ( '_sale_price_dates_from' === $row->meta_key || '_sale_price_dates_to' === $row->meta_key ) {
484
- $row->meta_value = tvc_convert_price_date_to_feed_format( $row->meta_value );
485
- }
486
- }
487
- }
488
-
489
- /**
490
- * @param $feed_id
491
- * @return false|int
492
- */
493
- public function delete_feed( $feed_id ) {
494
- $main_table = $this->_table_prefix . 'feedmanager_product_feed';
495
-
496
- return $this->_wpdb->delete( $main_table, array( 'product_feed_id' => $feed_id ) );
497
- }
498
-
499
- /**
500
- * @param $feed_id
501
- * @return false|int
502
- */
503
- public function delete_meta( $feed_id ) {
504
- $main_table = $this->_table_prefix . 'feedmanager_product_feedmeta';
505
-
506
- return $this->_wpdb->delete( $main_table, array( 'product_feed_id' => $feed_id ) );
507
- }
508
-
509
- /**
510
- * Gets the meta data from a specific feed. It does not include the category mapping and feed filter data.
511
- *
512
- * @param string $feed_id
513
- *
514
- * @return array|bool|object|null
515
- */
516
- public function read_metadata( $feed_id ) {
517
- if ( $feed_id ) {
518
- $main_table = $this->_table_prefix . 'feedmanager_product_feedmeta';
519
-
520
- return $this->_wpdb->get_results( "SELECT * FROM $main_table WHERE product_feed_id = $feed_id AND meta_key != 'category_mapping' AND meta_key != 'product_filter_query' ORDER BY meta_id", ARRAY_A );
521
- } else {
522
- return false;
523
- }
524
- }
525
-
526
- /**
527
- * Fetches the Feed Filter data from a specific feed.
528
- *
529
- * @param string $feed_id
530
- *
531
- * @return array|bool|object|null
532
- */
533
- public function get_product_filter_query( $feed_id ) {
534
- if ( $feed_id ) {
535
- $main_table = $this->_table_prefix . 'feedmanager_product_feedmeta';
536
-
537
- return $this->_wpdb->get_results( "SELECT meta_value FROM $main_table WHERE product_feed_id = $feed_id AND meta_key = 'product_filter_query'", ARRAY_A );
538
- } else {
539
- tvc_write_log_file( sprintf( 'Function get_filter_query returned false on feed %s', $feed_id ) );
540
-
541
- return false;
542
- }
543
- }
544
-
545
- public function get_columns_from_post_table() {
546
- return $this->_wpdb->get_results( "SHOW COLUMNS FROM {$this->_table_prefix}posts" );
547
- }
548
-
549
- public function get_custom_product_attributes() {
550
- $main_table = $this->_table_prefix . 'woocommerce_attribute_taxonomies';
551
-
552
- return $this->_wpdb->get_results( "SELECT attribute_name, attribute_label FROM $main_table" );
553
- }
554
-
555
- public function get_custom_product_fields() {
556
- $keywords_array = explode( ',', get_option( 'tvc_third_party_attribute_keywords', '%wpmr%,%cpf%,%unit%,%bto%,%yoast%' ) );
557
- $main_table = $this->_wpdb->postmeta;
558
-
559
- $query_string = "SELECT DISTINCT meta_key FROM $main_table WHERE meta_key NOT BETWEEN '_' AND '_z'";
560
-
561
- foreach ( $keywords_array as $keyword ) {
562
- $query_string .= " OR meta_key LIKE '" . trim( $keyword ) . "'";
563
- }
564
-
565
- $query_string .= ' ORDER BY meta_key';
566
-
567
- return $this->_wpdb->get_col( $query_string );
568
- }
569
-
570
- public function clear_feed_batch_options() {
571
- $this->_wpdb->query( "DELETE FROM {$this->_wpdb->options} WHERE option_name LIKE '%_batch_%'" );
572
- }
573
-
574
- /**
575
- * @since 2.0.11
576
- */
577
- public function clear_feed_batch_sitemeta() {
578
- $this->_wpdb->query( "DELETE FROM {$this->_wpdb->sitemeta} WHERE meta_key LIKE '%_batch_%'" );
579
- }
580
-
581
- public function get_own_variable_product_attributes( $variable_id ) {
582
- $keywords = get_option( 'tvc_third_party_attribute_keywords', '%wpmr%,%cpf%,%unit%,%bto%,%yoast%' );
583
- $wpmr_attributes = array();
584
-
585
- if ( $keywords ) {
586
- $keywords_array = explode( ',', $keywords );
587
- $main_table = $this->_wpdb->postmeta;
588
- $query_where_string = count( $keywords_array ) > 0 ? "WHERE (meta_key LIKE '" . trim( $keywords_array[0] ) . "'" : '';
589
-
590
- for ( $i = 1; $i < count( $keywords_array ); $i ++ ) {
591
- $query_where_string .= " OR meta_key LIKE '" . trim( $keywords_array[ $i ] ) . "'";
592
- }
593
-
594
- $query_where_string .= count( $keywords_array ) > 0 ? ') AND ' : '';
595
-
596
- foreach ( $this->_wpdb->get_results( "SELECT meta_key, meta_value FROM $main_table $query_where_string (post_id = $variable_id)" ) as $key => $row ) {
597
- $wpmr_attributes[ $row->meta_key ] = $row->meta_value;
598
- }
599
- }
600
-
601
- return $wpmr_attributes;
602
- }
603
-
604
- public function get_all_product_attributes() {
605
- $main_table = $this->_wpdb->postmeta;
606
-
607
- return $this->_wpdb->get_results( "SELECT DISTINCT meta_value FROM $main_table WHERE meta_key = '_product_attributes'" );
608
- }
609
-
610
- public function get_current_feed_status( $feed_id ) {
611
- $main_table = $this->_table_prefix . 'feedmanager_product_feed';
612
-
613
- return $this->_wpdb->get_results( "SELECT status_id FROM $main_table WHERE product_feed_id = $feed_id" );
614
- }
615
-
616
- public function get_country_id( $country_code ) {
617
- $main_table = $this->_table_prefix . 'feedmanager_country';
618
-
619
- return $this->_wpdb->get_row( "SELECT country_id FROM $main_table WHERE name_short = '$country_code'" );
620
- }
621
-
622
- public function get_feed_ids_with_specific_status( $status_id ) {
623
- return $this->_wpdb->get_results( "SELECT product_feed_id FROM {$this->_table_prefix}feedmanager_product_feed WHERE status_id = '$status_id'" );
624
- }
625
-
626
- public function switch_feed_status( $feed_id, $new_status ) {
627
- $main_table = $this->_table_prefix . 'feedmanager_product_feed';
628
-
629
- return $this->_wpdb->update(
630
- $main_table,
631
- array(
632
- 'status_id' => $new_status,
633
- 'base_status_id' => $new_status,
634
- ),
635
- array( 'product_feed_id' => $feed_id )
636
- );
637
- }
638
-
639
- public function set_nr_feed_products( $feed_id, $nr_products ) {
640
- $main_table = $this->_table_prefix . 'feedmanager_product_feed';
641
-
642
- return $this->_wpdb->update( $main_table, array( 'products' => $nr_products ), array( 'product_feed_id' => $feed_id ) );
643
- }
644
-
645
- public function get_nr_feed_products( $feed_id ) {
646
- $main_table = $this->_table_prefix . 'feedmanager_product_feed';
647
-
648
- return $this->_wpdb->get_row( "SELECT products FROM $main_table WHERE product_feed_id = '$feed_id'" );
649
- }
650
-
651
- /**
652
- * Updates a new feed in the product_feed table.
653
- *
654
- * @param (string) $feed_id
655
- * @param (array) $feed_data
656
- * @param (array) $data_types
657
- *
658
- * @return (int|false) nr of affected rows
659
- * @since 1.0.0
660
- *
661
- */
662
- public function update_feed( $feed_id, $feed_data, $data_types ) {
663
-
664
- $main_table = $this->_table_prefix . 'feedmanager_product_feed';
665
-
666
- return $this->_wpdb->update(
667
- $main_table,
668
- $feed_data,
669
- array(
670
- 'product_feed_id' => $feed_id,
671
- ),
672
- $data_types,
673
- array(
674
- '%d',
675
- )
676
- );
677
- }
678
-
679
- /**
680
- * Update Feed update Meta Data
681
- * @param $feed_id
682
- * @param $feed_url
683
- * @param $nr_products
684
- * @return false|int
685
- */
686
- public function update_feed_update_data( $feed_id, $feed_url, $nr_products ) {
687
- $main_table = $this->_table_prefix . 'feedmanager_product_feed';
688
-
689
- return $this->_wpdb->update(
690
- $main_table,
691
- array(
692
- 'updated' => date( 'Y-m-d H:i:s', current_time( 'timestamp' ) ),
693
- 'url' => $feed_url,
694
- 'products' => $nr_products,
695
- ),
696
- array( 'product_feed_id' => $feed_id ),
697
- array( '%s', '%s', '%s' ),
698
- array( '%d' )
699
- );
700
- }
701
-
702
- /**
703
- * @param $feed_id
704
- * @return mixed
705
- */
706
- public function get_file_url_from_feed( $feed_id ) {
707
- $main_table = $this->_table_prefix . 'feedmanager_product_feed';
708
- $result = $this->_wpdb->get_row( "SELECT url FROM $main_table WHERE product_feed_id = $feed_id", ARRAY_A );
709
-
710
- return $result['url'];
711
- }
712
-
713
- /**
714
- * Sets the status id of a feed
715
- *
716
- * @param string $feed_id
717
- * @param int $status
718
- *
719
- * @return bool
720
- */
721
- public function update_feed_file_status( $feed_id, $status ) {
722
- $main_table = $this->_table_prefix . 'feedmanager_product_feed';
723
-
724
- return $this->_wpdb->update( $main_table, array( 'status_id' => $status ), array( 'product_feed_id' => $feed_id ), array( '%d' ), array( '%d' ) );
725
- }
726
-
727
- /**
728
- * @param $feed_id
729
- * @param $meta_data
730
- * @return false|int
731
- */
732
- public function update_meta_data( $feed_id, $meta_data ) {
733
- // TODO: Onderstaande proces is nog niet echt efficient. In plaats van het standaard verwijderen
734
- // van elke bestaande regel met het geselecteerde id nummer, zou ik eerst moeten kijken of
735
- // deze regel wel is gewijzigd. Indien een regel niet is gewijzigd zou ik hem ook niet moeten
736
- // verwijderen.
737
-
738
- $main_table = $this->_table_prefix . 'feedmanager_product_feedmeta';
739
-
740
- // first remove all meta data belonging to this feed except the product_filter_query
741
- //$this->_wpdb->delete( $main_data, array( 'product_feed_id' => $feed_id ) ); // could not use it because it can't work with !=
742
- $this->_wpdb->query( "DELETE FROM $main_table WHERE product_feed_id = $feed_id AND meta_key != 'product_filter_query'" );
743
-
744
- $counter = 0;
745
-
746
- for ( $i = 0; $i < count( $meta_data ); $i ++ ) {
747
- if ( ! empty( $meta_data[ $i ]->value ) && '{}' !== $meta_data[ $i ]->value ) {
748
- $result = $this->_wpdb->insert(
749
- $main_table,
750
- array(
751
- 'product_feed_id' => $feed_id,
752
- 'meta_key' => $meta_data[ $i ]->key,
753
- 'meta_value' => $meta_data[ $i ]->value,
754
- ),
755
- array(
756
- '%d',
757
- '%s',
758
- '%s',
759
- )
760
- );
761
-
762
- $counter += $result;
763
- }
764
- }
765
-
766
- return $counter;
767
- }
768
-
769
- /**
770
- * Resets the status_id's of failed feeds.
771
- *
772
- * @since 2.7.0
773
- */
774
- public function reset_all_feed_status() {
775
- $main_table = $this->_table_prefix . 'feedmanager_product_feed';
776
- $failed_ids = $this->_wpdb->get_results( "SELECT product_feed_id FROM $main_table WHERE status_id > '2' OR status_id = '0'", 'ARRAY_A' );
777
-
778
- foreach ( $failed_ids as $feed_id ) {
779
- $id = $feed_id['product_feed_id'];
780
- $base_status = $this->_wpdb->get_var( "SELECT base_status_id FROM $main_table WHERE product_feed_id = '$id'" );
781
- $new_status = '1' === $base_status || '2' === $base_status ? $base_status : '2';
782
-
783
- $this->_wpdb->update(
784
- $main_table,
785
- array(
786
- 'status_id' => $new_status,
787
- 'products' => 0,
788
- ),
789
- array(
790
- 'product_feed_id' => $id,
791
- ),
792
- array(
793
- '%s',
794
- '%d',
795
- )
796
- );
797
- }
798
- }
799
-
800
- public function store_feed_filter( $feed_id, $filter ) {
801
- $main_table = $this->_table_prefix . 'feedmanager_product_feedmeta';
802
-
803
- if ( $filter ) {
804
- $exists = $this->_wpdb->get_results( "SELECT meta_id FROM $main_table WHERE product_feed_id = $feed_id AND meta_key = 'product_filter_query'" );
805
-
806
- if ( $exists ) {
807
- $this->_wpdb->update(
808
- $main_table,
809
- array(
810
- 'meta_value' => $filter,
811
- ),
812
- array(
813
- 'product_feed_id' => $feed_id,
814
- 'meta_key' => 'product_filter_query',
815
- ),
816
- array(
817
- '%s',
818
- ),
819
- array(
820
- '%d',
821
- '%s',
822
- )
823
- );
824
- } else {
825
- $this->_wpdb->insert(
826
- $main_table,
827
- array(
828
- 'product_feed_id' => $feed_id,
829
- 'meta_key' => 'product_filter_query',
830
- 'meta_value' => $filter,
831
- ),
832
- array(
833
- '%d',
834
- '%s',
835
- '%s',
836
- )
837
- );
838
- }
839
- } else {
840
- $this->_wpdb->query( "DELETE FROM $main_table WHERE product_feed_id = $feed_id AND meta_key = 'product_filter_query'" );
841
- }
842
- }
843
-
844
- public function insert_meta_data( $feed_id, $meta_data, $feed_filter_data, $category_mapping ) {
845
- $main_table = $this->_table_prefix . 'feedmanager_product_feedmeta';
846
-
847
- $counter = 0;
848
-
849
- for ( $i = 0; $i < count( $meta_data ); $i ++ ) {
850
- $result = $this->_wpdb->insert(
851
- $main_table,
852
- array(
853
- 'product_feed_id' => $feed_id,
854
- 'meta_key' => $meta_data[ $i ]['meta_key'],
855
- 'meta_value' => $meta_data[ $i ]['meta_value'],
856
- ),
857
- array(
858
- '%d',
859
- '%s',
860
- '%s',
861
- )
862
- );
863
-
864
- $counter += $result;
865
- }
866
-
867
- for ( $i = 0; $i < count( $feed_filter_data ); $i++ ) {
868
- $this->store_feed_filter( $feed_id, $feed_filter_data[ $i ]['meta_value'] );
869
- }
870
-
871
- $counter += $this->_wpdb->insert(
872
- $main_table,
873
- array(
874
- 'product_feed_id' => $feed_id,
875
- 'meta_key' => 'category_mapping',
876
- 'meta_value' => $category_mapping[0]['meta_value'],
877
- ),
878
- array(
879
- '%d',
880
- '%s',
881
- '%s',
882
- )
883
- );
884
-
885
- return $counter;
886
- }
887
-
888
- public function title_exists( $feed_title ) {
889
- $main_table = $this->_table_prefix . 'feedmanager_product_feed';
890
- $count = $this->_wpdb->get_var( "SELECT COUNT(*) FROM $main_table WHERE title = '$feed_title'" );
891
-
892
- return $count > 0 ? true : false;
893
- }
894
-
895
- /**
896
- * Inserts a new feed in the product_feed table and returns its new id.
897
- *
898
- * @param array $feed_data_to_store
899
- * @param array $feed_types
900
- *
901
- * @return integer containing the id of the new feed
902
- * @since 1.0.0
903
- *
904
- */
905
- public function create_feed( $feed_data_to_store, $feed_types ) {
906
-
907
- $main_table = $this->_table_prefix . 'feedmanager_product_feed';
908
-
909
- $this->_wpdb->insert(
910
- $main_table,
911
- $feed_data_to_store,
912
- $feed_types
913
- );
914
-
915
- return $this->_wpdb->insert_id;
916
- }
917
-
918
- public function getCountryID($feed_id){
919
- $countryID = $this->_wpdb->get_results("SELECT country_id FROM {$this->_table_prefix}feedmanager_product_feed WHERE product_feed_id = ".$feed_id);
920
-
921
- return $countryID;
922
- }
923
-
924
- public function getScheduleTime($feed_id){
925
- $scheduleTime = $this->_wpdb->get_results("SELECT schedule FROM {$this->_table_prefix}feedmanager_product_feed WHERE product_feed_id = ".$feed_id);
926
-
927
- return $scheduleTime;
928
- }
929
-
930
- public function getFeedData($feed_id){
931
- $feedData = $this->_wpdb->get_results("SELECT title,feed_description,feed_title FROM {$this->_table_prefix}feedmanager_product_feed WHERE product_feed_id = ".$feed_id);
932
-
933
- return $feedData;
934
- }
935
-
936
- public function getCountryCode($countryID){
937
- $countryCode = $this->_wpdb->get_results("SELECT name_short FROM {$this->_table_prefix}feedmanager_country WHERE country_id =".$countryID[0]->country_id);
938
- return $countryCode;
939
- }
940
-
941
- public function insertGmcFeedId($feedID,$feed_id){
942
- $main_table = $this->_table_prefix . 'feedmanager_product_feed';
943
- return $this->_wpdb->update( $main_table, array( 'gmc_feed_id' => $feedID ), array( 'product_feed_id' => $feed_id ) );
944
- }
945
-
946
- public function getGmcFeedId($feed_id){
947
- $gmcFeedId = $this->_wpdb->get_results("SELECT gmc_feed_id FROM {$this->_table_prefix}feedmanager_product_feed WHERE product_feed_id =". $feed_id);
948
- return $gmcFeedId;
949
- }
950
-
951
- public function getFeedURL($feed_id){
952
- $main_table = $this->_table_prefix . 'feedmanager_product_feed';
953
- return $this->_wpdb->get_results("SELECT url,feed_title,status_id FROM $main_table WHERE product_feed_id =". $feed_id);
954
- }
955
-
956
- public function getTableColumns($table) {
957
- return $this->_wpdb->get_results("SELECT column_name as field FROM information_schema.columns WHERE table_name = '$table'");
958
- }
959
-
960
- public function getTableData($table = 'wp_postmeta', $columns = array()) {
961
- return $this->_wpdb->get_results("SELECT DISTINCT " . implode(',', $columns) . " as field FROM $table");
962
- }
963
-
964
- public function getTablePostMeta($post_id) {
965
- global $wpdb;
966
- $tve_table_prefix = $wpdb->prefix;
967
- return $this->_wpdb->get_results("SELECT meta_key,meta_value FROM ".$tve_table_prefix."postmeta where post_id=" . $post_id);
968
- }
969
- }
970
- // End of TVC_Queries class
971
-
972
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/data/js/tvc_ajaxdatahandling.js CHANGED
@@ -1,718 +1,2 @@
1
  "use strict";
2
- var myAjaxNonces;
3
-
4
- function tvc_getFeedList( callback ) {
5
-
6
- jQuery.post(
7
- myAjaxNonces.ajaxurl,
8
- {
9
- action: 'tvcajax-get-list-of-feeds',
10
- postFeedsListNonce: myAjaxNonces.postFeedsListNonce,
11
-
12
- },
13
- function( response ) {
14
-
15
- callback( tvc_validateResponse( response ) );
16
- }
17
- );
18
- }
19
-
20
- function tvc_getBackupsList( callback ) {
21
- jQuery.post(
22
- myAjaxNonces.ajaxurl,
23
- {
24
- action: 'tvcajax-get-list-of-backups',
25
- postBackupListNonce: myAjaxNonces.postBackupListNonce,
26
-
27
- },
28
- function( response ) {
29
-
30
- callback( tvc_validateResponse( response ) );
31
- }
32
- );
33
- }
34
-
35
- function tvc_getSettingsOptions( callback ) {
36
-
37
- jQuery.post(
38
- myAjaxNonces.ajaxurl,
39
- {
40
- action: 'tvcajax-get-settings-options',
41
- postSetupOptionsNonce: myAjaxNonces.postSetupOptionsNonce,
42
-
43
- },
44
- function( response ) {
45
-
46
- callback( tvc_validateResponse( response ) );
47
- }
48
- );
49
- }
50
-
51
- /**
52
- * Reads and returns all possible output fields from the selected merchant
53
- *
54
- * @param {int} feedId
55
- * @param {int} channelId
56
- * @param callback
57
- * @returns list with output fields
58
- */
59
- function tvc_getOutputFields( feedId, channelId, callback ) {
60
-
61
- jQuery.post(
62
- myAjaxNonces.ajaxurl,
63
- {
64
- action: 'tvcajax-get-output-fields',
65
- feedId: feedId,
66
- channelId: channelId,
67
- outputFieldsNonce: myAjaxNonces.outputFieldsNonce,
68
-
69
- },
70
- function( response ) {
71
-
72
- callback( tvc_validateResponse( response ) );
73
- }
74
- );
75
- }
76
-
77
- /**
78
- * Reads and returns all possible source fields from the selected source
79
- *
80
- * @param {int} sourceId
81
- * @param callback
82
- * @returns list with input fields
83
- */
84
- function tvc_getSourceFields( sourceId, callback ) {
85
-
86
- jQuery.post(
87
- myAjaxNonces.ajaxurl,
88
- {
89
- action: 'tvcajax-get-input-fields',
90
- sourceId: sourceId,
91
- inputFieldsNonce: myAjaxNonces.inputFieldsNonce,
92
-
93
- },
94
- function( response ) {
95
-
96
- callback( tvc_validateResponse( response ) );
97
- }
98
- );
99
- }
100
-
101
- /**
102
- * Get main feed filters
103
- * @param feedId
104
- * @param callback
105
- */
106
- function tvc_getMainFeedFilters( feedId, callback ) {
107
-
108
- jQuery.post(
109
- myAjaxNonces.ajaxurl,
110
- {
111
- action: 'tvcajax-get-main-feed-filters',
112
- feedId: feedId,
113
- inputFeedFiltersNonce: myAjaxNonces.inputFeedFiltersNonce,
114
-
115
- },
116
- function( response ) {
117
-
118
- callback( tvc_validateResponse( response ) );
119
- }
120
- );
121
- }
122
-
123
- /**
124
- * Fetch next category
125
- * @param channelId
126
- * @param requestedLevel
127
- * @param parentCategory
128
- * @param language
129
- * @param callback
130
- */
131
- function tvc_getNextCategories( channelId, requestedLevel, parentCategory, language, callback ) {
132
-
133
- jQuery.post(
134
- myAjaxNonces.ajaxurl,
135
- {
136
- action: 'tvcajax-get-next-categories',
137
- channelId: channelId,
138
- requestedLevel: requestedLevel,
139
- parentCategory: parentCategory,
140
- fileLanguage: language,
141
- nextCategoryNonce: myAjaxNonces.nextCategoryNonce,
142
-
143
- },
144
- function( response ) {
145
-
146
- response = response.trim();
147
-
148
- if ( response.substr( response.length - 1 ) === '0' ) {
149
- response = response.substring( 0, response.length - 1 );
150
- }
151
-
152
- callback( tvc_validateResponse( response ) );
153
- }
154
- );
155
- }
156
-
157
- /**
158
- * Get Category Listing from String
159
- * @param channelId
160
- * @param mainCategoriesString
161
- * @param language
162
- * @param callback
163
- */
164
- function tvc_getCategoryListsFromString( channelId, mainCategoriesString, language, callback ) {
165
- jQuery.post(
166
- myAjaxNonces.ajaxurl,
167
- {
168
- action: 'tvcajax-get-category-lists',
169
- channelId: channelId,
170
- mainCategories: mainCategoriesString,
171
- fileLanguage: language,
172
- categoryListsNonce: myAjaxNonces.categoryListsNonce,
173
-
174
- },
175
- function( response ) {
176
-
177
- callback( tvc_validateResponse( response ) );
178
- }
179
- );
180
- }
181
-
182
- /**
183
- * Ajax Call for update feed to database
184
- * @param feedData
185
- * @param metaData
186
- * @param feedFilter
187
- * @param callback
188
- */
189
- function tvc_updateFeedToDb( feedData, metaData, feedFilter, callback ) {
190
- jQuery.post(
191
- myAjaxNonces.ajaxurl,
192
- {
193
- action: 'tvcajax-update-feed-data',
194
- feed: JSON.stringify( feedData ),
195
- feedFilter: feedFilter ? feedFilter[ 0 ][ 'meta_value' ] : '',
196
- metaData: JSON.stringify( metaData ),
197
- updateFeedDataNonce: myAjaxNonces.updateFeedDataNonce,
198
- },
199
- function( response ) {
200
- console.log(response);
201
- callback( tvc_validateResponse( response ) );
202
- }
203
- );
204
- }
205
-
206
- /**
207
- * Ajax call for update XML feed file
208
- * @param feed_id
209
- * @param callback
210
- */
211
- function tvc_updateFeedFile( feed_id, callback ) {
212
- jQuery.post(
213
- myAjaxNonces.ajaxurl,
214
- {
215
- action: 'tvcajax-update-feed-file',
216
- dataType: 'text',
217
- feedId: feed_id,
218
- updateFeedFileNonce: myAjaxNonces.updateFeedFileNonce,
219
-
220
- },
221
- function( response ) {
222
-
223
- callback( tvc_validateResponse( response ) );
224
- }
225
- );
226
- }
227
-
228
- /**
229
- * Update current/selected feed status
230
- * @param feedId
231
- * @param callback
232
- */
233
- function tvc_getCurrentFeedStatus( feedId, callback ) {
234
-
235
- jQuery.post(
236
- myAjaxNonces.ajaxurl,
237
- {
238
- action: 'tvcajax-get-feed-status',
239
- sourceId: feedId,
240
- feedStatusNonce: myAjaxNonces.feedStatusNonce,
241
-
242
- },
243
- function( response ) {
244
-
245
- callback( tvc_validateResponse( response ) );
246
- }
247
- );
248
- }
249
-
250
- function tvc_getFeedData( feedId, callback ) {
251
-
252
- jQuery.post(
253
- myAjaxNonces.ajaxurl,
254
- {
255
- action: 'tvcajax-get-feed-data',
256
- sourceId: feedId,
257
- feedDataNonce: myAjaxNonces.feedDataNonce,
258
-
259
- },
260
- function( response ) {
261
-
262
- callback( tvc_validateResponse( response ) );
263
- }
264
- );
265
- }
266
-
267
- /**
268
- * Switch feed status auto/manual
269
- * @param feedId
270
- * @param callback
271
- */
272
- function tvc_switchFeedStatus( feedId, callback ) {
273
-
274
- jQuery.post(
275
- myAjaxNonces.ajaxurl,
276
- {
277
- action: 'tvcajax-switch-feed-status',
278
- feedId: feedId,
279
- switchFeedStatusNonce: myAjaxNonces.switchFeedStatusNonce,
280
-
281
- },
282
- function( response ) {
283
-
284
- tvc_switchStatusAction( feedId, response );
285
- callback( tvc_validateResponse( response ) );
286
- }
287
- );
288
- }
289
-
290
- /**
291
- * Duplicate/Clone existing feed
292
- * @param feedId
293
- * @param callback
294
- */
295
- function tvc_duplicateExistingFeed( feedId, callback ) {
296
-
297
- jQuery.post(
298
- myAjaxNonces.ajaxurl,
299
- {
300
- action: 'tvcajax-duplicate-existing-feed',
301
- feedId: feedId,
302
- duplicateFeedNonce: myAjaxNonces.duplicateFeedNonce,
303
-
304
- },
305
- function( response ) {
306
-
307
- if ( response.trim() ) {
308
- tvc_resetFeedList();
309
- }
310
-
311
- callback( tvc_validateResponse( response ) );
312
- }
313
- );
314
- }
315
-
316
- /**
317
- * Log message on server
318
- * @param message
319
- * @param fileName
320
- * @param callback
321
- */
322
- function tvc_logMessageOnServer( message, fileName, callback ) {
323
-
324
- jQuery.post(
325
- myAjaxNonces.ajaxurl,
326
- {
327
- action: 'tvcajax-log-message',
328
- messageList: message,
329
- fileName: fileName,
330
- logMessageNonce: myAjaxNonces.logMessageNonce,
331
-
332
- },
333
- function( result ) {
334
-
335
- callback( result.trim() );
336
- }
337
- );
338
- }
339
-
340
- function tvc_auto_feed_fix_mode( selection, callback ) {
341
-
342
- jQuery.post(
343
- myAjaxNonces.ajaxurl,
344
- {
345
- action: 'tvcajax-auto-feed-fix-mode-selection',
346
- fix_selection: selection,
347
- updateAutoFeedFixNonce: myAjaxNonces.setAutoFeedFixNonce,
348
-
349
- },
350
- function( response ) {
351
-
352
- callback( response.trim() );
353
- }
354
- );
355
- }
356
-
357
- /**
358
- * Ajax for background process of selected feeds
359
- * @param selection
360
- * @param callback
361
- */
362
- function tvc_background_processing_mode( selection, callback ) {
363
-
364
- jQuery.post(
365
- myAjaxNonces.ajaxurl,
366
- {
367
- action: 'tvcajax-background-processing-mode-selection',
368
- mode_selection: selection,
369
- backgroundModeNonce: myAjaxNonces.setBackgroundModeNonce,
370
-
371
- },
372
- function( response ) {
373
-
374
- callback( response.trim() );
375
- }
376
- );
377
- }
378
-
379
- function tvc_feed_logger_status( selection, callback ) {
380
-
381
- jQuery.post(
382
- myAjaxNonces.ajaxurl,
383
- {
384
- action: 'tvcajax-feed-logger-status-selection',
385
- statusSelection: selection,
386
- feedLoggerStatusNonce: myAjaxNonces.setFeedLoggerStatusNonce,
387
-
388
- },
389
- function( response ) {
390
-
391
- callback( response.trim() );
392
- }
393
- );
394
- }
395
-
396
- /**
397
- * Sets the Show Product Identifiers option.
398
- *
399
- * @since 2.10.0.
400
- *
401
- * @param selection
402
- * @param callback
403
- */
404
- function tvc_show_pi_status( selection, callback ) {
405
-
406
- jQuery.post(
407
- myAjaxNonces.ajaxurl,
408
- {
409
- action: 'tvcajax-show-product-identifiers-selection',
410
- showPiSelection: selection,
411
- showPINonce: myAjaxNonces.setShowPINonce,
412
-
413
- },
414
- function( response ) {
415
-
416
- callback( response.trim() );
417
- }
418
- );
419
- }
420
-
421
- function tvc_change_third_party_attribute_keywords( keywords, callback ) {
422
-
423
- jQuery.post(
424
- myAjaxNonces.ajaxurl,
425
- {
426
- action: 'tvcajax-third-party-attribute-keywords',
427
- keywords: keywords,
428
- thirdPartyKeywordsNonce: myAjaxNonces.setThirdPartyKeywordsNonce,
429
-
430
- },
431
- function( response ) {
432
-
433
- callback( response.trim() );
434
- }
435
- );
436
- }
437
-
438
- function tvc_change_notice_mailaddress( mailAddress, callback ) {
439
-
440
- jQuery.post(
441
- myAjaxNonces.ajaxurl,
442
- {
443
- action: 'tvcajax-set-notice-mailaddress',
444
- mailaddress: mailAddress,
445
- noticeMailaddressNonce: myAjaxNonces.setNoticeMailaddressNonce,
446
-
447
- },
448
- function( response ) {
449
-
450
- callback( response.trim() );
451
- }
452
- );
453
- }
454
-
455
- function tvc_change_background_processing_time_limit( limit, callback ) {
456
-
457
- jQuery.post(
458
- myAjaxNonces.ajaxurl,
459
- {
460
- action: 'tvcajax-background-processing-time-limit',
461
- limit: limit,
462
- batchProcessingLimitNonce: myAjaxNonces.setBatchProcessingLimitNonce,
463
-
464
- },
465
- function( response ) {
466
-
467
- callback( response.trim() );
468
- }
469
- );
470
- }
471
-
472
- function tvc_clear_feed_process_data( callback ) {
473
- jQuery.post(
474
- myAjaxNonces.ajaxurl,
475
- {
476
- action: 'tvcajax-clear-feed-process-data',
477
- clearFeedNonce: myAjaxNonces.setClearFeedProcessNonce,
478
-
479
- },
480
- function( response ) {
481
-
482
- callback( response );
483
- }
484
- );
485
- }
486
-
487
- function tvc_reinitiate_plugin( callback ) {
488
- jQuery.post(
489
- myAjaxNonces.ajaxurl,
490
- {
491
- action: 'tvcajax-reinitiate-plugin',
492
- reInitiateNonce: myAjaxNonces.setReInitiateNonce,
493
-
494
- },
495
- function( response ) {
496
-
497
- callback( response );
498
- }
499
- );
500
- }
501
-
502
- /**
503
- * Takes the response of an ajax call and checks if it's ok. When not, it will display the error and return
504
- * an empty list.
505
- *
506
- * @param {String} response
507
- *
508
- * @returns {String}
509
- */
510
- function tvc_validateResponse( response ) {
511
-
512
- response = response.trim(); // remove php ajax response white spaces
513
-
514
- // when the response contains no error message
515
- if ( response.indexOf( '<div id=\'error\'>' ) < 0 && response.indexOf( '<b>Fatal error</b>' ) < 0 && response.indexOf( '<b>Notice</b>' ) < 0 && response.indexOf( '<b>Warning</b>' ) < 0 && response.indexOf( '<b>Catchable fatal error</b>' ) < 0 && response.indexOf( '<div id="error">' ) < 0 ) {
516
-
517
- if ( response.indexOf( '[]' ) < 0 ) {
518
-
519
- if ( response !== '' ) {
520
-
521
- return (
522
- response
523
- );
524
- } else {
525
-
526
- return (
527
- '1'
528
- );
529
- }
530
- } else { // if it has an error message
531
-
532
- // return an empty list
533
- return (
534
- '0'
535
- );
536
- }
537
- } else {
538
-
539
- tvc_show_error_message( response.replace( '[]', '' ) );
540
- tvc_hideFeedSpinner();
541
-
542
- tvc_logMessageOnServer(
543
- response,
544
- 'error',
545
- function( result ) {
546
-
547
- // return an empty list
548
- return (
549
- '0'
550
- );
551
- }
552
- );
553
- }
554
- }
555
-
556
- /**
557
- * Deletes a specific feed file
558
- *
559
- * This function first removes the file from the server and than from the feed database.
560
- * After that it will refresh the Feed List.
561
- *
562
- * @param {int} id
563
- * @param {string} feedTitle
564
- * @returns nothing
565
- */
566
- function tvc_deleteFeed( id, feedTitle ) {
567
- var feedSpinnerElement = jQuery( '#feed-spinner' );
568
- var feedListMessageElement = jQuery( '#feed-list-message' );
569
-
570
- // clear old messages
571
- feedListMessageElement.empty();
572
-
573
- // remove the file
574
- tvc_removeFeedFile(
575
- function() {
576
- feedSpinnerElement.show();
577
-
578
- // delete the file entry in the database
579
- tvc_deleteFeedFromDb(
580
- id,
581
- function( response ) {
582
- feedSpinnerElement.show();
583
-
584
- response = response.trim();
585
-
586
- if ( response === '1' ) {
587
- // reset the feed list
588
- tvc_resetFeedList();
589
- feedSpinnerElement.hide();
590
- } else {
591
- // report the result to the user
592
- feedListMessageElement.append( response );
593
- feedSpinnerElement.hide();
594
- }
595
- },
596
- id
597
- );
598
- },
599
- feedTitle
600
- );
601
- }
602
-
603
- function tvc_removeFeedFile( callback, feedTitle ) {
604
-
605
- jQuery.post(
606
- myAjaxNonces.ajaxurl,
607
- {
608
- action: 'tvcajax-delete-feed-file',
609
- fileTitle: feedTitle,
610
- deleteFeedNonce: myAjaxNonces.deleteFeedNonce,
611
-
612
- },
613
- function( response ) {
614
-
615
- callback( tvc_validateResponse( response ) );
616
- }
617
- );
618
- }
619
-
620
- function tvc_deleteFeedFromDb( feedId, callback ) {
621
-
622
- jQuery.post(
623
- myAjaxNonces.ajaxurl,
624
- {
625
- action: 'tvcajax-delete-feed',
626
- feedId: feedId,
627
- deleteFeedNonce: myAjaxNonces.deleteFeedNonce,
628
-
629
- },
630
- function( response ) {
631
-
632
- callback( tvc_validateResponse( response ) );
633
- }
634
- );
635
- }
636
-
637
- function tvc_checkNextFeedInQueue( callback ) {
638
- jQuery.post(
639
- myAjaxNonces.ajaxurl,
640
- {
641
- action: 'tvcajax-get-next-feed-in-queue',
642
- nextFeedInQueueNonce: myAjaxNonces.nextFeedInQueueNonce,
643
-
644
- },
645
- function( response ) {
646
-
647
- callback( tvc_validateResponse( response ) );
648
- }
649
- );
650
- }
651
-
652
- function tvc_initiateBackup( fileName, callback ) {
653
-
654
- jQuery.post(
655
- myAjaxNonces.ajaxurl,
656
- {
657
- action: 'tvcajax-backup-current-data',
658
- fileName: fileName,
659
- backupNonce: myAjaxNonces.backupNonce,
660
-
661
- },
662
- function( response ) {
663
-
664
- callback( tvc_validateResponse( response ) );
665
- }
666
- );
667
- }
668
-
669
- function tvc_deleteBackup( fileName, callback ) {
670
-
671
- jQuery.post(
672
- myAjaxNonces.ajaxurl,
673
- {
674
- action: 'tvcajax-delete-backup-file',
675
- fileName: fileName,
676
- deleteBackupNonce: myAjaxNonces.deleteBackupNonce,
677
-
678
- },
679
- function( response ) {
680
-
681
- callback( tvc_validateResponse( response ) );
682
- }
683
- );
684
- }
685
-
686
- function tvc_restoreBackup( fileName, callback ) {
687
-
688
- jQuery.post(
689
- myAjaxNonces.ajaxurl,
690
- {
691
- action: 'tvcajax-restore-backup-file',
692
- fileName: fileName,
693
- restoreBackupNonce: myAjaxNonces.restoreBackupNonce,
694
-
695
- },
696
- function( response ) {
697
-
698
- callback( tvc_validateResponse( response ) );
699
- }
700
- );
701
- }
702
-
703
- function tvc_duplicateBackup( fileName, callback ) {
704
-
705
- jQuery.post(
706
- myAjaxNonces.ajaxurl,
707
- {
708
- action: 'tvcajax-duplicate-backup-file',
709
- fileName: fileName,
710
- duplicateBackupNonce: myAjaxNonces.duplicateBackupNonce,
711
-
712
- },
713
- function( response ) {
714
-
715
- callback( tvc_validateResponse( response ) );
716
- }
717
- );
718
- }
1
  "use strict";
2
+ var myAjaxNonces;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/data/js/tvc_ajaxdatahandling.min.js DELETED
@@ -1,364 +0,0 @@
1
- var myAjaxNonces;
2
-
3
- function tvc_getFeedList(a) {
4
- jQuery.post(myAjaxNonces.ajaxurl, {
5
- action: "tvcajax-get-list-of-feeds",
6
- postFeedsListNonce: myAjaxNonces.postFeedsListNonce
7
- }, function (b) {
8
- a(tvc_validateResponse(b))
9
- })
10
- }
11
-
12
- function tvc_getBackupsList(a) {
13
- jQuery.post(myAjaxNonces.ajaxurl, {
14
- action: "tvcajax-get-list-of-backups",
15
- postBackupListNonce: myAjaxNonces.postBackupListNonce
16
- }, function (b) {
17
- a(tvc_validateResponse(b))
18
- })
19
- }
20
-
21
- function tvc_getSettingsOptions(a) {
22
- jQuery.post(myAjaxNonces.ajaxurl, {
23
- action: "tvcajax-get-settings-options",
24
- postSetupOptionsNonce: myAjaxNonces.postSetupOptionsNonce
25
- }, function (b) {
26
- a(tvc_validateResponse(b))
27
- })
28
- }
29
-
30
- function tvc_getOutputFields(a, b, c) {
31
- jQuery.post(myAjaxNonces.ajaxurl, {
32
- action: "tvcajax-get-output-fields",
33
- feedId: a,
34
- channelId: b,
35
- outputFieldsNonce: myAjaxNonces.outputFieldsNonce
36
- }, function (d) {
37
- c(tvc_validateResponse(d))
38
- })
39
- }
40
-
41
- function tvc_getSourceFields(a, b) {
42
- jQuery.post(myAjaxNonces.ajaxurl, {
43
- action: "tvcajax-get-input-fields",
44
- sourceId: a,
45
- inputFieldsNonce: myAjaxNonces.inputFieldsNonce
46
- }, function (c) {
47
- b(tvc_validateResponse(c))
48
- })
49
- }
50
-
51
- function tvc_getMainFeedFilters(a, b) {
52
- jQuery.post(myAjaxNonces.ajaxurl, {
53
- action: "tvcajax-get-main-feed-filters",
54
- feedId: a,
55
- inputFeedFiltersNonce: myAjaxNonces.inputFeedFiltersNonce
56
- }, function (c) {
57
- b(tvc_validateResponse(c))
58
- })
59
- }
60
-
61
- function tvc_getNextCategories(c, b, a, e, d) {
62
- jQuery.post(myAjaxNonces.ajaxurl, {
63
- action: "tvcajax-get-next-categories",
64
- channelId: c,
65
- requestedLevel: b,
66
- parentCategory: a,
67
- fileLanguage: e,
68
- nextCategoryNonce: myAjaxNonces.nextCategoryNonce
69
- }, function (f) {
70
- f = f.trim();
71
- if (f.substr(f.length - 1) === "0") {
72
- f = f.substring(0, f.length - 1)
73
- }
74
- d(tvc_validateResponse(f))
75
- })
76
- }
77
-
78
- function tvc_getCategoryListsFromString(b, a, d, c) {
79
- jQuery.post(myAjaxNonces.ajaxurl, {
80
- action: "tvcajax-get-category-lists",
81
- channelId: b,
82
- mainCategories: a,
83
- fileLanguage: d,
84
- categoryListsNonce: myAjaxNonces.categoryListsNonce
85
- }, function (e) {
86
- c(tvc_validateResponse(e))
87
- })
88
- }
89
-
90
- function tvc_updateFeedToDb(b, a, c, d) {
91
- jQuery.post(myAjaxNonces.ajaxurl, {
92
- action: "tvcajax-update-feed-data",
93
- feed: JSON.stringify(b),
94
- feedFilter: c ? c[0]["meta_value"] : "",
95
- metaData: JSON.stringify(a),
96
- updateFeedDataNonce: myAjaxNonces.updateFeedDataNonce
97
- }, function (e) {
98
- d(tvc_validateResponse(e))
99
- })
100
- }
101
-
102
- function tvc_updateFeedFile(a, b) {
103
- jQuery.post(myAjaxNonces.ajaxurl, {
104
- action: "tvcajax-update-feed-file",
105
- dataType: "text",
106
- feedId: a,
107
- updateFeedFileNonce: myAjaxNonces.updateFeedFileNonce
108
- }, function (c) {
109
- b(tvc_validateResponse(c))
110
- })
111
- }
112
-
113
- function tvc_getCurrentFeedStatus(a, b) {
114
- jQuery.post(myAjaxNonces.ajaxurl, {
115
- action: "tvcajax-get-feed-status",
116
- sourceId: a,
117
- feedStatusNonce: myAjaxNonces.feedStatusNonce
118
- }, function (c) {
119
- b(tvc_validateResponse(c))
120
- })
121
- }
122
-
123
- function tvc_getFeedData(a, b) {
124
- jQuery.post(myAjaxNonces.ajaxurl, {
125
- action: "tvcajax-get-feed-data",
126
- sourceId: a,
127
- feedDataNonce: myAjaxNonces.feedDataNonce
128
- }, function (c) {
129
- b(tvc_validateResponse(c))
130
- })
131
- }
132
-
133
- function tvc_switchFeedStatus(a, b) {
134
- jQuery.post(myAjaxNonces.ajaxurl, {
135
- action: "tvcajax-switch-feed-status",
136
- feedId: a,
137
- switchFeedStatusNonce: myAjaxNonces.switchFeedStatusNonce
138
- }, function (c) {
139
- tvc_switchStatusAction(a, c);
140
- b(tvc_validateResponse(c))
141
- })
142
- }
143
-
144
- function tvc_duplicateExistingFeed(a, b) {
145
- jQuery.post(myAjaxNonces.ajaxurl, {
146
- action: "tvcajax-duplicate-existing-feed",
147
- feedId: a,
148
- duplicateFeedNonce: myAjaxNonces.duplicateFeedNonce
149
- }, function (c) {
150
- if (c.trim()) {
151
- tvc_resetFeedList()
152
- }
153
- b(tvc_validateResponse(c))
154
- })
155
- }
156
-
157
- function tvc_logMessageOnServer(a, c, b) {
158
- jQuery.post(myAjaxNonces.ajaxurl, {
159
- action: "tvcajax-log-message",
160
- messageList: a,
161
- fileName: c,
162
- logMessageNonce: myAjaxNonces.logMessageNonce
163
- }, function (d) {
164
- b(d.trim())
165
- })
166
- }
167
-
168
- function tvc_auto_feed_fix_mode(a, b) {
169
- jQuery.post(myAjaxNonces.ajaxurl, {
170
- action: "tvcajax-auto-feed-fix-mode-selection",
171
- fix_selection: a,
172
- updateAutoFeedFixNonce: myAjaxNonces.setAutoFeedFixNonce
173
- }, function (c) {
174
- b(c.trim())
175
- })
176
- }
177
-
178
- function tvc_background_processing_mode(a, b) {
179
- jQuery.post(myAjaxNonces.ajaxurl, {
180
- action: "tvcajax-background-processing-mode-selection",
181
- mode_selection: a,
182
- backgroundModeNonce: myAjaxNonces.setBackgroundModeNonce
183
- }, function (c) {
184
- b(c.trim())
185
- })
186
- }
187
-
188
- function tvc_feed_logger_status(a, b) {
189
- jQuery.post(myAjaxNonces.ajaxurl, {
190
- action: "tvcajax-feed-logger-status-selection",
191
- statusSelection: a,
192
- feedLoggerStatusNonce: myAjaxNonces.setFeedLoggerStatusNonce
193
- }, function (c) {
194
- b(c.trim())
195
- })
196
- }
197
-
198
- function tvc_show_pi_status(a, b) {
199
- jQuery.post(myAjaxNonces.ajaxurl, {
200
- action: "tvcajax-show-product-identifiers-selection",
201
- showPiSelection: a,
202
- showPINonce: myAjaxNonces.setShowPINonce
203
- }, function (c) {
204
- b(c.trim())
205
- })
206
- }
207
-
208
- function tvc_change_third_party_attribute_keywords(a, b) {
209
- jQuery.post(myAjaxNonces.ajaxurl, {
210
- action: "tvcajax-third-party-attribute-keywords",
211
- keywords: a,
212
- thirdPartyKeywordsNonce: myAjaxNonces.setThirdPartyKeywordsNonce
213
- }, function (c) {
214
- b(c.trim())
215
- })
216
- }
217
-
218
- function tvc_change_notice_mailaddress(a, b) {
219
- jQuery.post(myAjaxNonces.ajaxurl, {
220
- action: "tvcajax-set-notice-mailaddress",
221
- mailaddress: a,
222
- noticeMailaddressNonce: myAjaxNonces.setNoticeMailaddressNonce
223
- }, function (c) {
224
- b(c.trim())
225
- })
226
- }
227
-
228
- function tvc_change_background_processing_time_limit(a, b) {
229
- jQuery.post(myAjaxNonces.ajaxurl, {
230
- action: "tvcajax-background-processing-time-limit",
231
- limit: a,
232
- batchProcessingLimitNonce: myAjaxNonces.setBatchProcessingLimitNonce
233
- }, function (c) {
234
- b(c.trim())
235
- })
236
- }
237
-
238
- function tvc_clear_feed_process_data(a) {
239
- jQuery.post(myAjaxNonces.ajaxurl, {
240
- action: "tvcajax-clear-feed-process-data",
241
- clearFeedNonce: myAjaxNonces.setClearFeedProcessNonce
242
- }, function (b) {
243
- a(b)
244
- })
245
- }
246
-
247
- function tvc_reinitiate_plugin(a) {
248
- jQuery.post(myAjaxNonces.ajaxurl, {
249
- action: "tvcajax-reinitiate-plugin",
250
- reInitiateNonce: myAjaxNonces.setReInitiateNonce
251
- }, function (b) {
252
- a(b)
253
- })
254
- }
255
-
256
- function tvc_validateResponse(a) {
257
- a = a.trim();
258
- if (a.indexOf("<div id='error'>") < 0 && a.indexOf("<b>Fatal error</b>") < 0 && a.indexOf("<b>Notice</b>") < 0 && a.indexOf("<b>Warning</b>") < 0 && a.indexOf("<b>Catchable fatal error</b>") < 0 && a.indexOf('<div id="error">') < 0) {
259
- if (a.indexOf("[]") < 0) {
260
- if (a !== "") {
261
- return (a)
262
- } else {
263
- return ("1")
264
- }
265
- } else {
266
- return ("0")
267
- }
268
- } else {
269
- tvc_show_error_message(a.replace("[]", ""));
270
- tvc_hideFeedSpinner();
271
- tvc_logMessageOnServer(a, "error", function (b) {
272
- return ("0")
273
- })
274
- }
275
- }
276
-
277
- function tvc_deleteFeed(d, b) {
278
- var a = jQuery("#feed-spinner");
279
- var c = jQuery("#feed-list-message");
280
- c.empty();
281
- tvc_removeFeedFile(function () {
282
- a.show();
283
- tvc_deleteFeedFromDb(d, function (e) {
284
- a.show();
285
- e = e.trim();
286
- if (e === "1") {
287
- tvc_resetFeedList();
288
- a.hide()
289
- } else {
290
- c.append(e);
291
- a.hide()
292
- }
293
- }, d)
294
- }, b)
295
- }
296
-
297
- function tvc_removeFeedFile(b, a) {
298
- jQuery.post(myAjaxNonces.ajaxurl, {
299
- action: "tvcajax-delete-feed-file",
300
- fileTitle: a,
301
- deleteFeedNonce: myAjaxNonces.deleteFeedNonce
302
- }, function (c) {
303
- b(tvc_validateResponse(c))
304
- })
305
- }
306
-
307
- function tvc_deleteFeedFromDb(a, b) {
308
- jQuery.post(myAjaxNonces.ajaxurl, {
309
- action: "tvcajax-delete-feed",
310
- feedId: a,
311
- deleteFeedNonce: myAjaxNonces.deleteFeedNonce
312
- }, function (c) {
313
- b(tvc_validateResponse(c))
314
- })
315
- }
316
-
317
- function tvc_checkNextFeedInQueue(a) {
318
- jQuery.post(myAjaxNonces.ajaxurl, {
319
- action: "tvcajax-get-next-feed-in-queue",
320
- nextFeedInQueueNonce: myAjaxNonces.nextFeedInQueueNonce
321
- }, function (b) {
322
- a(tvc_validateResponse(b))
323
- })
324
- }
325
-
326
- function tvc_initiateBackup(b, a) {
327
- jQuery.post(myAjaxNonces.ajaxurl, {
328
- action: "tvcajax-backup-current-data",
329
- fileName: b,
330
- backupNonce: myAjaxNonces.backupNonce
331
- }, function (c) {
332
- a(tvc_validateResponse(c))
333
- })
334
- }
335
-
336
- function tvc_deleteBackup(b, a) {
337
- jQuery.post(myAjaxNonces.ajaxurl, {
338
- action: "tvcajax-delete-backup-file",
339
- fileName: b,
340
- deleteBackupNonce: myAjaxNonces.deleteBackupNonce
341
- }, function (c) {
342
- a(tvc_validateResponse(c))
343
- })
344
- }
345
-
346
- function tvc_restoreBackup(b, a) {
347
- jQuery.post(myAjaxNonces.ajaxurl, {
348
- action: "tvcajax-restore-backup-file",
349
- fileName: b,
350
- restoreBackupNonce: myAjaxNonces.restoreBackupNonce
351
- }, function (c) {
352
- a(tvc_validateResponse(c))
353
- })
354
- }
355
-
356
- function tvc_duplicateBackup(b, a) {
357
- jQuery.post(myAjaxNonces.ajaxurl, {
358
- action: "tvcajax-duplicate-backup-file",
359
- fileName: b,
360
- duplicateBackupNonce: myAjaxNonces.duplicateBackupNonce
361
- }, function (c) {
362
- a(tvc_validateResponse(c))
363
- })
364
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/setup/CustomApi.php CHANGED
@@ -60,8 +60,6 @@ class CustomApi{
60
  // ));
61
  // $this->response = curl_exec($ch);
62
  // $this->response = json_decode($this->response);
63
- // echo "<pre>";
64
- // print_r($this->response);
65
  // die;
66
 
67
  $url = $this->apiDomain . '/plans/feature-list';
@@ -103,6 +101,10 @@ class CustomApi{
103
  public function getGoogleAnalyticDetail() {
104
  try {
105
  $url = $this->apiDomain . '/customer-subscriptions/subscription-detail';
 
 
 
 
106
  $ee_options_data = unserialize(get_option('ee_options'));
107
  if(isset($ee_options_data['subscription_id'])) {
108
  $ee_subscription_id = $ee_options_data['subscription_id'];
@@ -114,22 +116,18 @@ class CustomApi{
114
  'subscription_id' => $ee_subscription_id,
115
  'domain' => $actual_link
116
  ];
117
- $args = array(
118
- 'headers' => array(
119
- 'Authorization' => "Bearer $this->token",
120
- 'Content-Type' => 'application/json',
121
- ),
122
- 'body' => wp_json_encode($data)
123
- );
124
-
125
- $request = wp_remote_post($url, $args);
126
-
127
- // Retrieve information
128
- $response_code = wp_remote_retrieve_response_code($request);
129
- $response_message = wp_remote_retrieve_response_message($request);
130
- $response_body = json_decode(wp_remote_retrieve_body($request));
131
-
132
- if ((isset($response_body->error) && $response_body->error == '')) {
133
  if ($response_body->data) {
134
  $store_raw_country = get_option('woocommerce_default_country');
135
  // Split the country/state
@@ -148,20 +146,31 @@ class CustomApi{
148
  $GLOBALS['tatvicData']['refresh_token'] = $response_body->data->refresh_token;
149
  $_SESSION['access_token'] = $response_body->data->access_token;
150
  $_SESSION['refresh_token'] = $response_body->data->refresh_token;
151
- //exit;
152
-
153
  }
154
-
155
- return new WP_REST_Response(
156
- array(
157
- 'status' => $response_code,
158
- 'message' => $response_message,
159
- 'data' => $response_body->data
160
- )
161
- );
162
- } else {
163
- return new WP_Error($response_code, $response_message, $response_body);
164
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
165
  } catch (Exception $e) {
166
  return $e->getMessage();
167
  }
@@ -204,14 +213,62 @@ class CustomApi{
204
  return $e->getMessage();
205
  }
206
  }
207
-
208
- public function verifyLicenceKey($postData) {
209
  try {
210
- $url = $this->apiDomain . '/licence/verify-key';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
211
 
 
 
 
 
 
 
 
 
 
 
212
  $data = [
213
- 'key' => $postData['licence_key'], //TEST-RHNZL-MT8YR-M555K-NFDE5
214
- 'domain' => $_SERVER['HTTP_HOST'],
215
  ];
216
  $args = array(
217
  'headers' => array(
@@ -221,23 +278,14 @@ class CustomApi{
221
  'method' => 'POST',
222
  'body' => wp_json_encode($data)
223
  );
224
-
225
  // Send remote request
226
  $request = wp_remote_post($url, $args);
227
-
228
  // Retrieve information
229
  $response_code = wp_remote_retrieve_response_code($request);
230
  $response_message = wp_remote_retrieve_response_message($request);
231
  $response_body = json_decode(wp_remote_retrieve_body($request));
232
  if ((isset($response_body->error) && $response_body->error == '')) {
233
-
234
- return new WP_REST_Response(
235
- array(
236
- 'status' => $response_code,
237
- 'message' => $response_message,
238
- 'data' => $response_body->data
239
- )
240
- );
241
  } else {
242
  return new WP_Error($response_code, $response_message, $response_body);
243
  }
@@ -323,7 +371,8 @@ class CustomApi{
323
  }
324
 
325
  public function getSyncProductList($postData) {
326
- try {
 
327
  $header = array(
328
  "Authorization: Bearer MTIzNA==",
329
  "content-type: application/json",
@@ -335,7 +384,7 @@ class CustomApi{
335
  curl_setopt_array($ch, array(
336
  CURLOPT_URL => esc_url($curl_url),
337
  CURLOPT_RETURNTRANSFER => true,
338
- CURLOPT_TIMEOUT => 20,
339
  CURLOPT_HTTPHEADER => $header,
340
  CURLOPT_POSTFIELDS => $postData
341
  ));
@@ -357,32 +406,6 @@ class CustomApi{
357
  }
358
  return $return;
359
  }
360
-
361
- // $url = $this->apiDomain . '/products/list';
362
- // $args = array(
363
- // 'headers' => array(
364
- // 'Authorization' => "Bearer $this->token",
365
- // 'Content-Type' => 'application/json'
366
- // ),
367
- // 'body' => wp_json_encode($postData)
368
- // );
369
- // // Send remote request
370
- // $request = wp_remote_post($url, $args);
371
- // // Retrieve information
372
- // $response_code = wp_remote_retrieve_response_code($request);
373
- // $response_message = wp_remote_retrieve_response_message($request);
374
- // $response_body = json_decode(wp_remote_retrieve_body($request));
375
- // if ((isset($response_body->error) && $response_body->error == '')) {
376
- // return new WP_REST_Response(
377
- // array(
378
- // 'status' => $response_code,
379
- // 'message' => $response_message,
380
- // 'data' => $response_body->data
381
- // )
382
- // );
383
- // } else {
384
- // return new WP_Error($response_code, $response_message, $response_body);
385
- // }
386
  } catch (Exception $e) {
387
  return $e->getMessage();
388
  }
@@ -734,4 +757,4 @@ class CustomApi{
734
  }
735
  }
736
 
737
- }
60
  // ));
61
  // $this->response = curl_exec($ch);
62
  // $this->response = json_decode($this->response);
 
 
63
  // die;
64
 
65
  $url = $this->apiDomain . '/plans/feature-list';
101
  public function getGoogleAnalyticDetail() {
102
  try {
103
  $url = $this->apiDomain . '/customer-subscriptions/subscription-detail';
104
+ $header = array(
105
+ "Authorization: Bearer ".$this->token,
106
+ "content-type: application/json"
107
+ );
108
  $ee_options_data = unserialize(get_option('ee_options'));
109
  if(isset($ee_options_data['subscription_id'])) {
110
  $ee_subscription_id = $ee_options_data['subscription_id'];
116
  'subscription_id' => $ee_subscription_id,
117
  'domain' => $actual_link
118
  ];
119
+ $postData = json_encode($data);
120
+ $ch = curl_init();
121
+ curl_setopt_array($ch, array(
122
+ CURLOPT_URL => $url,
123
+ CURLOPT_RETURNTRANSFER => true,
124
+ CURLOPT_TIMEOUT => 1000,
125
+ CURLOPT_HTTPHEADER => $header,
126
+ CURLOPT_POSTFIELDS => $postData
127
+ ));
128
+ $response = curl_exec($ch);
129
+ $response_body = json_decode($response);
130
+ if((isset($response_body->error) && $response_body->error == '')) {
 
 
 
 
131
  if ($response_body->data) {
132
  $store_raw_country = get_option('woocommerce_default_country');
133
  // Split the country/state
146
  $GLOBALS['tatvicData']['refresh_token'] = $response_body->data->refresh_token;
147
  $_SESSION['access_token'] = $response_body->data->access_token;
148
  $_SESSION['refresh_token'] = $response_body->data->refresh_token;
 
 
149
  }
150
+ $return = new \stdClass();
151
+ if (isset($response_body->error) && $response_body->error == '') {
152
+ $return->error = false;
153
+ $return->data = $response_body->data;
154
+ $return->message = $response_body->message;
155
+ return $return;
156
+ } else {
157
+ if (isset($response_body->data)) {
158
+ $return->error = false;
159
+ $return->data = $response_body->data;
160
+ $return->message = $response_body->message;
161
+ } else {
162
+ $return->error = true;
163
+ $return->data = [];
164
+ if(isset($response_body->errors->key[0])){
165
+ $return->message = $response_body->errors->key[0];
166
+ }else{
167
+ $return->message = "Please try after some time.";
168
+ }
169
+ }
170
+ return $return;
171
+ }
172
+ //return (object) array( 'status' => $response_code, 'message' => $response_message, 'data' => $response_body->data );
173
+ }
174
  } catch (Exception $e) {
175
  return $e->getMessage();
176
  }
213
  return $e->getMessage();
214
  }
215
  }
216
+ public function active_licence_Key($licence_key, $subscription_id) {
 
217
  try {
218
+ $header = array(
219
+ "Authorization: Bearer MTIzNA==",
220
+ "content-type: application/json"
221
+ );
222
+ $curl_url = $this->apiDomain . "/licence/activation";
223
+ $postData = [
224
+ 'key' => $licence_key,
225
+ 'domain' => get_site_url(),
226
+ 'subscription_id'=>$subscription_id
227
+ ];
228
+ $postData = json_encode($postData);
229
+ $ch = curl_init();
230
+ curl_setopt_array($ch, array(
231
+ CURLOPT_URL => esc_url($curl_url),
232
+ CURLOPT_RETURNTRANSFER => true,
233
+ CURLOPT_TIMEOUT => 1000,
234
+ CURLOPT_HTTPHEADER => $header,
235
+ CURLOPT_POSTFIELDS => $postData
236
+ ));
237
+ $response = curl_exec($ch);
238
+ $response = json_decode($response);
239
+ $return = new \stdClass();
240
+ if (isset($response->error) && $response->error == '') {
241
+ $return->error = false;
242
+ $return->data = $response->data;
243
+ $return->message = $response->message;
244
+ return $return;
245
+ } else {
246
+ if (isset($response->data)) {
247
+ $return->error = false;
248
+ $return->data = $response->data;
249
+ $return->message = $response->message;
250
+ } else {
251
+ $return->error = true;
252
+ $return->data = [];
253
+ if(isset($response->errors->key[0])){
254
+ $return->message = $response->errors->key[0];
255
+ }else{
256
+ $return->message = "Check your entered licese key.";
257
+ }
258
 
259
+ }
260
+ return $return;
261
+ }
262
+ } catch (Exception $e) {
263
+ return $e->getMessage();
264
+ }
265
+ }
266
+ public function verifyLicenceKey($licence_key, $subscription_id) {
267
+ try {
268
+ echo $url = $this->apiDomain . '/licence/verify-key';
269
  $data = [
270
+ 'key' => $licence_key,
271
+ 'domain' => get_site_url()
272
  ];
273
  $args = array(
274
  'headers' => array(
278
  'method' => 'POST',
279
  'body' => wp_json_encode($data)
280
  );
 
281
  // Send remote request
282
  $request = wp_remote_post($url, $args);
 
283
  // Retrieve information
284
  $response_code = wp_remote_retrieve_response_code($request);
285
  $response_message = wp_remote_retrieve_response_message($request);
286
  $response_body = json_decode(wp_remote_retrieve_body($request));
287
  if ((isset($response_body->error) && $response_body->error == '')) {
288
+ return new WP_REST_Response(array('status' => $response_code, 'message' => $response_message,'data' => $response_body->data ));
 
 
 
 
 
 
 
289
  } else {
290
  return new WP_Error($response_code, $response_message, $response_body);
291
  }
371
  }
372
 
373
  public function getSyncProductList($postData) {
374
+ try {
375
+ $postData["maxResults"] = 100;
376
  $header = array(
377
  "Authorization: Bearer MTIzNA==",
378
  "content-type: application/json",
384
  curl_setopt_array($ch, array(
385
  CURLOPT_URL => esc_url($curl_url),
386
  CURLOPT_RETURNTRANSFER => true,
387
+ CURLOPT_TIMEOUT => 1000,
388
  CURLOPT_HTTPHEADER => $header,
389
  CURLOPT_POSTFIELDS => $postData
390
  ));
406
  }
407
  return $return;
408
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
409
  } catch (Exception $e) {
410
  return $e->getMessage();
411
  }
757
  }
758
  }
759
 
760
+ }
includes/setup/ShoppingApi.php CHANGED
@@ -11,7 +11,7 @@ class ShoppingApi {
11
  $this->customApiObj = new CustomApi();
12
  $this->customApiObj->getGoogleAnalyticDetail();
13
 
14
- $queries = new TVC_Queries();
15
  $this->apiDomain = TVC_API_CALL_URL;
16
  //$this->apiDomain = 'http://127.0.0.1:8000/api';
17
  $this->token = 'MTIzNA==';
@@ -37,7 +37,6 @@ class ShoppingApi {
37
 
38
  // Send remote request
39
  $request = wp_remote_post($url, $args);
40
- //print_r($request);
41
  // Retrieve information
42
  $response_code = wp_remote_retrieve_response_code($request);
43
  $response_message = wp_remote_retrieve_response_message($request);
@@ -310,11 +309,10 @@ class ShoppingApi {
310
  'body' => wp_json_encode($data)
311
  );
312
 
313
- /* echo "<pre>";
314
- print_r($args); */
315
  // Send remote request
316
  $request = wp_remote_post($url, $args);
317
- /* print_r($request); */
318
 
319
  // Retrieve information
320
  $response_code = wp_remote_retrieve_response_code($request);
@@ -359,20 +357,16 @@ class ShoppingApi {
359
  ),
360
  'body' => wp_json_encode($data)
361
  );
362
- /* echo "<pre>"; */
363
- /* print_r($args); */
364
  // Send remote request
365
  $request = wp_remote_post($url, $args);
366
- /* print_r($request); */
367
-
368
  // Retrieve information
369
  $response_code = wp_remote_retrieve_response_code($request);
370
  $response_message = wp_remote_retrieve_response_message($request);
371
  $response_body = json_decode(wp_remote_retrieve_body($request));
372
- // echo "<pre>";
373
- // print_r($response_message);
374
- // print_r($response_body);
375
- // exit;
376
  if (!is_wp_error($request) && (isset($response_body->error) && $response_body->error == '')) {
377
  // return new WP_REST_Response(
378
  // array(
@@ -418,11 +412,10 @@ class ShoppingApi {
418
  'body' => wp_json_encode($data)
419
  );
420
 
421
- /* echo "<pre>";
422
- print_r($args); */
423
  // Send remote request
424
  $request = wp_remote_request($url, $args);
425
- /* print_r($request); */
426
 
427
  // Retrieve information
428
  $response_code = wp_remote_retrieve_response_code($request);
11
  $this->customApiObj = new CustomApi();
12
  $this->customApiObj->getGoogleAnalyticDetail();
13
 
14
+ //$queries = new TVC_Queries();
15
  $this->apiDomain = TVC_API_CALL_URL;
16
  //$this->apiDomain = 'http://127.0.0.1:8000/api';
17
  $this->token = 'MTIzNA==';
37
 
38
  // Send remote request
39
  $request = wp_remote_post($url, $args);
 
40
  // Retrieve information
41
  $response_code = wp_remote_retrieve_response_code($request);
42
  $response_message = wp_remote_retrieve_response_message($request);
309
  'body' => wp_json_encode($data)
310
  );
311
 
312
+
 
313
  // Send remote request
314
  $request = wp_remote_post($url, $args);
315
+
316
 
317
  // Retrieve information
318
  $response_code = wp_remote_retrieve_response_code($request);
357
  ),
358
  'body' => wp_json_encode($data)
359
  );
360
+
361
+
362
  // Send remote request
363
  $request = wp_remote_post($url, $args);
364
+
 
365
  // Retrieve information
366
  $response_code = wp_remote_retrieve_response_code($request);
367
  $response_message = wp_remote_retrieve_response_message($request);
368
  $response_body = json_decode(wp_remote_retrieve_body($request));
369
+ //
 
 
 
370
  if (!is_wp_error($request) && (isset($response_body->error) && $response_body->error == '')) {
371
  // return new WP_REST_Response(
372
  // array(
412
  'body' => wp_json_encode($data)
413
  );
414
 
415
+
 
416
  // Send remote request
417
  $request = wp_remote_request($url, $args);
418
+
419
 
420
  // Retrieve information
421
  $response_code = wp_remote_retrieve_response_code($request);
includes/setup/SmartShoppingCampaign.php DELETED
@@ -1,431 +0,0 @@
1
- <?php
2
-
3
- //require __DIR__ . '/../../vendor/autoload.php';
4
-
5
- use Google\Ads\GoogleAds\Lib\OAuth2TokenBuilder;
6
- use Google\Ads\GoogleAds\Lib\V4\GoogleAdsClientBuilder;
7
- use Google\Ads\GoogleAds\V4\Resources\CampaignBudget;
8
- use Google\Ads\GoogleAds\V4\Enums\BudgetDeliveryMethodEnum\BudgetDeliveryMethod;
9
- use Google\Ads\GoogleAds\V4\Services\CampaignBudgetOperation;
10
- use Google\Ads\GoogleAds\V4\Resources\Campaign\ShoppingSetting;
11
- use Google\Ads\GoogleAds\V4\Resources\Campaign;
12
- use Google\Ads\GoogleAds\V4\Enums\AdvertisingChannelTypeEnum\AdvertisingChannelType;
13
- use Google\Ads\GoogleAds\V4\Enums\AdvertisingChannelSubTypeEnum\AdvertisingChannelSubType;
14
- use Google\Ads\GoogleAds\V4\Services\CampaignOperation;
15
- use Google\Ads\GoogleAds\V4\Common\MaximizeConversionValue;
16
- use Google\Ads\GoogleAds\V4\Enums\CampaignStatusEnum\CampaignStatus;
17
- use Google\Ads\GoogleAds\V4\Resources\AdGroup;
18
- use Google\Ads\GoogleAds\V4\Enums\AdGroupStatusEnum\AdGroupStatus;
19
- use Google\Ads\GoogleAds\V4\Enums\AdGroupTypeEnum\AdGroupType;
20
- use Google\Ads\GoogleAds\V4\Services\AdGroupOperation;
21
- use Google\Ads\GoogleAds\V4\Resources\AdGroupAd;
22
- use Google\Ads\GoogleAds\V4\Resources\Ad;
23
- use Google\Ads\GoogleAds\V4\Services\AdGroupAdOperation;
24
- use Google\Ads\GoogleAds\V4\Common\ShoppingSmartAdInfo;
25
- use Google\Ads\GoogleAds\V4\Resources\AdGroupCriterion;
26
- use Google\Ads\GoogleAds\V4\Enums\AdGroupAdStatusEnum\AdGroupAdStatus;
27
- use Google\Ads\GoogleAds\V4\Common\ListingGroupInfo;
28
- use Google\Ads\GoogleAds\V4\Services\AdGroupCriterionOperation;
29
- use Google\Ads\GoogleAds\V4\Enums\ListingGroupTypeEnum\ListingGroupType;
30
- use Google\Ads\GoogleAds\Lib\V4\GoogleAdsException;
31
- use Google\ApiCore\ApiException;
32
- use Google\Ads\GoogleAds\V4\Resources\ConversionAction;
33
- use Google\Ads\GoogleAds\V4\Enums\ConversionActionCategoryEnum\ConversionActionCategory;
34
- use Google\Ads\GoogleAds\V4\Enums\ConversionActionTypeEnum\ConversionActionType;
35
- use Google\Ads\GoogleAds\V4\Enums\ConversionActionStatusEnum\ConversionActionStatus;
36
- use Google\Ads\GoogleAds\V4\Services\ConversionActionOperation;
37
- use Google\Ads\GoogleAds\Util\V4\ResourceNames;
38
-
39
- class SmartShoppingCampaign
40
- {
41
- private $customerId;
42
- private $merchantId;
43
- private $credentials;
44
- private $createDefaultListing;
45
- private $oAuth2Credential;
46
- private $googleAdsClient;
47
- private $budgetResourceName;
48
-
49
- public function __construct()
50
- {
51
- $queries = new TVC_Queries();
52
-
53
- $this->customerId = $queries->get_set_ads_account_id();
54
- // $this->customerId = TVC_CUSTOMER;
55
- $this->merchantId = $queries->get_set_merchant_id();
56
- // $this->merchantId = TVC_MERCHANT;
57
- $this->merchantId = (isset($GLOBALS['tatvicData']['tvc_merchant'])) ? $GLOBALS['tatvicData']['tvc_merchant']:"";
58
- $this->customerId = (isset($GLOBALS['tatvicData']['tvc_customer'])) ? $GLOBALS['tatvicData']['tvc_customer']:"";
59
-
60
- $this->createDefualtListing = true;
61
-
62
- $credentials_file = ENHANCAD_PLUGIN_DIR.'includes/setup/json/client-secrets.json';
63
- $str = file_get_contents($credentials_file);
64
- $this->credentials = $str ? json_decode($str, true) : [];
65
-
66
- // Generate a refreshable OAuth2 credential for authentication.
67
- $this->oAuth2Credential = (new OAuth2TokenBuilder())
68
- ->withClientId($this->credentials['web']['client_id'])
69
- ->withClientSecret($this->credentials['web']['client_secret'])
70
- ->withRefreshToken($this->credentials['web']['manager_refresh_token'])
71
- ->build();
72
-
73
- // Construct a Google Ads client configured from a properties file and the
74
- // OAuth2 credentials above.
75
- $this->googleAdsClient = (new GoogleAdsClientBuilder())
76
- ->fromFile(ENHANCAD_PLUGIN_DIR.'/google_ads_php.ini')
77
- ->withOAuth2Credential($this->oAuth2Credential)
78
- ->build();
79
-
80
- }
81
-
82
- public function getCustomerCurrency() {
83
- $customerServiceClient = $this->googleAdsClient->getCustomerServiceClient();
84
- $customer = $customerServiceClient->getCustomer(ResourceNames::forCustomer($this->customerId));
85
- $currencyCode = $customer->getCurrencyCode();
86
- return $currencyCode->getValue();
87
- }
88
- public function createConversionAction() {
89
- // Creates a conversion action.
90
- $conversionAction = new ConversionAction([
91
- 'name' => 'Conversion Action #' . uniqid(),
92
- 'category' => ConversionActionCategory::PBDEFAULT,
93
- 'type' => ConversionActionType::WEBPAGE,
94
- 'status' => ConversionActionStatus::ENABLED,
95
- 'view_through_lookback_window_days' => 15,
96
- // 'value_settings' => new ValueSettings([
97
- // 'default_value' => 23.41,
98
- // 'always_use_default_value' => true
99
- // ])
100
- ]);
101
-
102
- // Creates a conversion action operation.
103
- $conversionActionOperation = new ConversionActionOperation();
104
- $conversionActionOperation->setCreate($conversionAction);
105
-
106
- // Issues a mutate request to add the conversion action.
107
- $conversionActionServiceClient = $this->googleAdsClient->getConversionActionServiceClient();
108
- $response = $conversionActionServiceClient->mutateConversionActions(
109
- $this->customerId,
110
- [$conversionActionOperation]
111
- );
112
-
113
- // printf("Added %d conversion actions:%s", $response->getResults()->count(), PHP_EOL);
114
-
115
- foreach ($response->getResults() as $addedConversionAction) {
116
- return $addedConversionAction->getResourceName();
117
- /** @var ConversionAction $addedConversionAction */
118
- printf(
119
- "New conversion action added with resource name: '%s'%s",
120
- $addedConversionAction->getResourceName(),
121
- PHP_EOL
122
- );
123
- }
124
- }
125
- /**
126
- * Creates a new campaign budget for Smart Shopping ads in the specified client account.
127
- *
128
- * @param GoogleAdsClient $googleAdsClient the Google Ads API client
129
- * @param int $customerId the customer ID
130
- * @return string the resource name of the newly created budget
131
- */
132
- public function addCampaignBudget($campaign_name, $budget) {
133
- // Creates a campaign budget.
134
- $budget = new CampaignBudget([
135
- 'name' => $campaign_name .'Budget #' . uniqid(),
136
- 'delivery_method' => BudgetDeliveryMethod::STANDARD,
137
- // The budget is specified in the local currency of the account.
138
- // The amount should be specified in micros, where one million is equivalent to one
139
- // unit.
140
- 'amount_micros' => $budget * 1000000,
141
- // Budgets for Smart Shopping campaigns cannot be shared.
142
- 'explicitly_shared' => false
143
- ]);
144
-
145
- // Creates a campaign budget operation.
146
- $campaignBudgetOperation = new CampaignBudgetOperation();
147
- $campaignBudgetOperation->setCreate($budget);
148
-
149
- // Issues a mutate request.
150
- $campaignBudgetServiceClient = $this->googleAdsClient->getCampaignBudgetServiceClient();
151
- $response = $campaignBudgetServiceClient->mutateCampaignBudgets(
152
- $this->customerId,
153
- [$campaignBudgetOperation]
154
- );
155
-
156
- /** @var CampaignBudget $addedBudget */
157
- $addedBudget = $response->getResults()[0];
158
- // printf(
159
- // "Added a budget with resource name '%s'.%s",
160
- // $addedBudget->getResourceName(),
161
- // PHP_EOL
162
- // );
163
- $this->budgetResourceName = $addedBudget->getResourceName();
164
- return $addedBudget->getResourceName();
165
- }
166
-
167
- /**
168
- * Creates a new shopping campaign for Smart Shopping ads in the specified client account.
169
- *
170
- * @param GoogleAdsClient $googleAdsClient the Google Ads API client
171
- * @param int $customerId the customer ID
172
- * @param string $budgetResourceName the resource name of budget for a new campaign
173
- * @param int $merchantCenterAccountId the Merchant Center account ID
174
- * @return string the resource name of the newly created campaign
175
- */
176
-
177
- public function addSmartShoppingCampaign($campaign_name, $budgetResource, $salesCountry) {
178
-
179
- if($salesCountry == '') {
180
- $salesCountry = 'US';
181
- }
182
- // Configures the shopping settings for Smart Shopping campaigns.
183
- $shoppingSettings = new ShoppingSetting([
184
- // Sets the sales country of products to include in the campaign.
185
- // Only products from Merchant Center targeting this country will appear in the
186
- // campaign.
187
- 'sales_country' => $salesCountry,
188
- 'merchant_id' => $this->merchantId
189
- ]);
190
-
191
- // Creates the campaign.
192
- $campaign = new Campaign([
193
- 'name' => $campaign_name .'Campaign #' . uniqid(),
194
- // Configures settings related to shopping campaigns including
195
- // advertising channel type, advertising sub-type and shopping setting.
196
- 'advertising_channel_type' => AdvertisingChannelType::SHOPPING,
197
- 'advertising_channel_sub_type' => AdvertisingChannelSubType::SHOPPING_SMART_ADS,
198
- 'shopping_setting' => $shoppingSettings,
199
- // Recommendation: Set the campaign to PAUSED when creating it to prevent
200
- // the ads from immediately serving. Set to ENABLED once you've added
201
- // targeting and the ads are ready to serve.
202
- 'status' => CampaignStatus::PAUSED,
203
- // 'bidding_strategy_type' => BiddingStrategyType::TARGET_CPA,
204
- // Bidding strategy must be set directly on the campaign.
205
- // Setting a portfolio bidding strategy by resource name is not supported.
206
- // Maximize conversion value is the only strategy supported for Smart Shopping
207
- // campaigns.
208
- // An optional ROAS (Return on Advertising Spend) can be set for
209
- // MaximizeConversionValue.
210
- // The ROAS value must be specified as a ratio in the API. It is calculated by dividing
211
- // "total value" by "total spend".
212
- // For more information on maximize conversion value, see the support article:
213
- // http://support.google.com/google-ads/answer/7684216.
214
- 'maximize_conversion_value' => new MaximizeConversionValue(['target_roas' => 3.5]),
215
- // Sets the budget.
216
- 'campaign_budget' => $budgetResource
217
- ]);
218
-
219
- // Creates a campaign operation.
220
- $campaignOperation = new CampaignOperation();
221
- $campaignOperation->setCreate($campaign);
222
-
223
- // Issues a mutate request to add the campaign.
224
- $campaignServiceClient = $this->googleAdsClient->getCampaignServiceClient();
225
- $response = $campaignServiceClient->mutateCampaigns($this->customerId, [$campaignOperation]);
226
-
227
- /** @var Campaign $addedCampaign */
228
- $addedCampaign = $response->getResults()[0];
229
- $addedCampaignResourceName = $addedCampaign->getResourceName();
230
- // printf(
231
- // "Added a Smart Shopping campaign with resource name: '%s'.%s",
232
- // $addedCampaignResourceName,
233
- // PHP_EOL
234
- // );
235
-
236
- return $addedCampaignResourceName;
237
- }
238
-
239
- /**
240
- * Creates a new ad group in the specified Smart Shopping campaign.
241
- *
242
- * @param GoogleAdsClient $googleAdsClient the Google Ads API client
243
- * @param int $customerId the customer ID
244
- * @param string $campaignResourceName the resource name of the campaign that
245
- * the new ad group will belong to
246
- * @return string the resource name of the newly created ad group
247
- */
248
- private function addSmartShoppingAdGroup($campaignResourceName) {
249
- // Creates an ad group.
250
- $adGroup = new AdGroup([
251
- 'name' => $campaignResourceName .'Ad Group #' . uniqid(),
252
- 'campaign' => $campaignResourceName,
253
- // Sets the ad group type to SHOPPING_SMART_ADS. This cannot be set to other types.
254
- 'type' => AdGroupType::SHOPPING_SMART_ADS,
255
- 'status' => AdGroupStatus::ENABLED
256
- ]);
257
-
258
- // Creates an ad group operation.
259
- $adGroupOperation = new AdGroupOperation();
260
- $adGroupOperation->setCreate($adGroup);
261
-
262
- // Issues a mutate request to add the ad group.
263
- $adGroupServiceClient = $this->googleAdsClient->getAdGroupServiceClient();
264
- $response = $adGroupServiceClient->mutateAdGroups($this->customerId, [$adGroupOperation]);
265
-
266
- /** @var AdGroup $addedAdGroup */
267
- $addedAdGroup = $response->getResults()[0];
268
- $addedAdGroupResourceName = $addedAdGroup->getResourceName();
269
- // printf(
270
- // "Added a Smart Shopping ad group with resource name: '%s'.%s",
271
- // $addedAdGroupResourceName,
272
- // PHP_EOL
273
- // );
274
-
275
- return $addedAdGroupResourceName;
276
- }
277
-
278
- /**
279
- * Creates a new ad group ad in the specified Smart Shopping ad group.
280
- *
281
- * @param GoogleAdsClient $googleAdsClient the Google Ads API client
282
- * @param int $customerId the customer ID
283
- * @param string $adGroupResourceName the resource name of the ad group that
284
- * the new ad group ad will belong to
285
- */
286
- private function addSmartShoppingAdGroupAd($adGroupResourceName) {
287
- // Creates a new ad group ad.
288
- $adGroupAd = new AdGroupAd([
289
- // Sets a new Smart Shopping ad.
290
- 'ad' => new Ad(['shopping_smart_ad' => new ShoppingSmartAdInfo()]),
291
- // Sets the ad group.
292
- 'ad_group' => $adGroupResourceName
293
- ]);
294
-
295
- // Creates an ad group ad operation.
296
- $adGroupAdOperation = new AdGroupAdOperation();
297
- $adGroupAdOperation->setCreate($adGroupAd);
298
-
299
- // Issues a mutate request to add the ad group ad.
300
- $adGroupAdServiceClient = $this->googleAdsClient->getAdGroupAdServiceClient();
301
- $response = $adGroupAdServiceClient->mutateAdGroupAds($this->customerId, [$adGroupAdOperation]);
302
-
303
- /** @var AdGroupAd $addedAdGroupAd */
304
- $addedAdGroupAd = $response->getResults()[0];
305
- // printf(
306
- // "Added a Smart Shopping ad group ad with resource name: '%s'.%s",
307
- // $addedAdGroupAd->getResourceName(),
308
- // PHP_EOL
309
- // );
310
- }
311
-
312
- /**
313
- * Creates a new Shopping listing group for the specified ad group. This is known as a "product
314
- * group" in the Google Ads user interface. The listing group will be added to the ad group
315
- * using an "ad group criterion". For more information on listing groups see the Google Ads
316
- * API Shopping guide: https://developers.google.com/google-ads/api/docs/shopping-ads/overview.
317
- *
318
- * @param GoogleAdsClient $googleAdsClient the Google Ads API client
319
- * @param int $customerId the customer ID
320
- * @param string $adGroupResourceName the resource name of the ad group that
321
- * the new listing group will belong to
322
- */
323
- private function addShoppingListingGroup($adGroupResourceName) {
324
- // Creates a new ad group criterion. This will contain a listing group.
325
- // This will be the listing group for 'All products' and will contain a single root node.
326
- $adGroupCriterion = new AdGroupCriterion([
327
- 'ad_group' => $adGroupResourceName,
328
- 'status' => AdGroupAdStatus::ENABLED,
329
- // Creates a new listing group. This will be the top-level "root" node.
330
- // Sets the type of the listing group to be a biddable unit.
331
- 'listing_group' => new ListingGroupInfo(['type' => ListingGroupType::UNIT])
332
- // Note: Listing groups do not require bids for Smart Shopping campaigns.
333
- ]);
334
-
335
- // Creates an ad group criterion operation.
336
- $adGroupCriterionOperation = new AdGroupCriterionOperation();
337
- $adGroupCriterionOperation->setCreate($adGroupCriterion);
338
-
339
- // Issues a mutate request to add the ad group criterion.
340
- $adGroupCriterionServiceClient = $this->googleAdsClient->getAdGroupCriterionServiceClient();
341
- $response = $adGroupCriterionServiceClient->mutateAdGroupCriteria(
342
- $this->customerId,
343
- [$adGroupCriterionOperation]
344
- );
345
-
346
- /** @var AdGroupCriterion $addedAdGroupCriterion */
347
- $addedAdGroupCriterion = $response->getResults()[0];
348
- // printf(
349
- // "Added an ad group criterion containing a listing group with resource name: '%s'.%s",
350
- // $addedAdGroupCriterion->getResourceName(),
351
- // PHP_EOL
352
- // );
353
- }
354
-
355
- /**
356
- * @return array
357
- * Get woocommerce default set country
358
- */
359
- public function woo_country(){
360
- // The country/state
361
- $store_raw_country = get_option( 'woocommerce_default_country' );
362
- // Split the country/state
363
- $split_country = explode( ":", $store_raw_country );
364
- return $split_country;
365
- }
366
-
367
- public function createSmartShoppingCampaign($campaign_name = '', $budget = '', $salesCountry = '') {
368
-
369
- try {
370
- if((isset($_COOKIE['add_conversions']) && $_COOKIE['add_conversions'] == 1) || !isset($_COOKIE['add_conversions'])) {
371
- self::createConversionAction();
372
- }
373
-
374
- // Creates a budget to be used by the campaign that will be created below.
375
- $budgetResourceName = self::addCampaignBudget($campaign_name, $budget);
376
-
377
- // Creates a Smart Shopping campaign.
378
- $campaignResourceName = self::addSmartShoppingCampaign($campaign_name, $budgetResourceName, $salesCountry);
379
-
380
- // Creates a Smart Shopping ad group.
381
- $adGroupResourceName = self::addSmartShoppingAdGroup($campaignResourceName);
382
-
383
- // Creates a Smart Shopping ad group ad.
384
- self::addSmartShoppingAdGroupAd($adGroupResourceName);
385
-
386
- if ($this->createDefaultListing) {
387
- // A product group is a subset of inventory. Listing groups are the equivalent
388
- // of product groups in the API and allow you to bid on the chosen group or
389
- // exclude a group from bidding.
390
- // This method creates an ad group criterion containing a listing group.
391
- self::addShoppingListingGroup($adGroupResourceName);
392
- }
393
-
394
- return $campaignResourceName;
395
-
396
- } catch (GoogleAdsException $googleAdsException) {
397
- printf(
398
- "Request with ID '%s' has failed.%sGoogle Ads failure details:%s",
399
- $googleAdsException->getRequestId(),
400
- PHP_EOL,
401
- PHP_EOL
402
- );
403
- foreach ($googleAdsException->getGoogleAdsFailure()->getErrors() as $error) {
404
- /** @var GoogleAdsError $error */
405
- $response = [];
406
- $response['error'] = $error->getMessage();
407
- return $response;
408
- // printf(
409
- // "\t%s: %s%s",
410
- // $error->getErrorCode()->getErrorCode(),
411
- // $error->getMessage(),
412
- // PHP_EOL
413
- // );
414
- }
415
- exit(1);
416
- } catch (ApiException $apiException) {
417
- $response = [];
418
- $response['error'] = $apiException->getMessage();
419
- return $response;
420
- // printf(
421
- // "ApiException was thrown with message '%s'.%s",
422
- // $apiException->getMessage(),
423
- // PHP_EOL
424
- // );
425
- exit(1);
426
- }
427
-
428
-
429
-
430
- }
431
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/setup/add-campaign.php CHANGED
@@ -1,479 +1,379 @@
1
  <?php
2
-
3
  class AddCampaign {
4
-
5
- public $response;
6
- public $post_data;
7
- //public $access_token;
8
- public $gmail;
9
- public $merchantId;
10
- public $new_campaign;
11
- protected $TVC_Admin_Helper;
12
-
13
- public function __construct() {
14
- global $wpdb;
15
- $this->includes();
16
- $this->TVC_Admin_Helper = new TVC_Admin_Helper();
17
- $this->customApiObj = new CustomApi();
18
- $this->customApiObj->getGoogleAnalyticDetail();
19
-
20
- $this->post_data = $_POST;
21
- //$this->access_token = $_SESSION['access_token'];
22
- $this->gmail = isset($_COOKIE['g_mail']) ? $_COOKIE['g_mail'] : '';
23
-
24
- $this->merchantId = (isset($GLOBALS['tatvicData']['tvc_merchant'])) ? $GLOBALS['tatvicData']['tvc_merchant'] : "";
25
- $this->currentCustomerId = (isset($GLOBALS['tatvicData']['tvc_customer'])) ? $GLOBALS['tatvicData']['tvc_customer'] : "";
26
-
27
-
28
- $this->html_run();
29
-
30
- echo "<script>
31
- $(document).ready(function() {
32
- $('.select2').select2();
33
- });
34
- jQuery('.create-merchant-center').addClass('active');
35
- jQuery('.create-google-ads').addClass('active');
36
- jQuery('.sync-products').addClass('active');
37
- jQuery('.create-smart-shopping').addClass('active');
38
- function changeCategory() {
39
- let dimension = jQuery('#dimension').val();
40
- let level = jQuery('#dimension').find('option[value='+dimension+']'). attr('level');
41
- jQuery('#category_level').val(level);
42
- }
43
- function selectCountry() {
44
- var sales_country = document.getElementById('sales_country').value;
45
- var customer_id = $this->currentCustomerId;
46
- jQuery('#feed-spinner').css('display', 'block');
47
- jQuery.post(
48
- myAjaxNonces.ajaxurl,
49
- {
50
- action: 'tvcajax-get-campaign-categories',
51
- countryCode: sales_country,
52
- customerId: customer_id,
53
- campaignCategoryListsNonce: myAjaxNonces.campaignCategoryListsNonce,
54
-
55
- },
56
- function( response ) {
57
- console.log('==');
58
- let categories = JSON.parse(response);
59
- console.log(categories);
60
- // callback( tvc_validateResponse( response ) );
61
- jQuery('#dimension').html('');
62
- jQuery.each(categories, function(key, category) {
63
- jQuery('#dimension')
64
- .append(jQuery('<option value='+category.id+' level='+category.level+'>'+category.name+'</option>'));
65
- });
66
- jQuery('#feed-spinner').css('display', 'none');
67
- }
68
- );
69
- }
70
- function showLoader() {
71
- if($('#campaign-name').val()!=''&&$('#campaign-budget').val()!=''){
72
- jQuery('#feed-spinner').css('display', 'block');
73
- }
74
- }
75
- </script>";
76
  }
77
-
78
- public function html_run() {
79
- $this->spinner();
80
- $this->create_form();
 
 
 
 
 
 
 
 
 
 
 
81
  }
82
-
83
- public function country_dropdown($selected_code = '', $is_disabled = false) {
84
- $getCountris = file_get_contents(__DIR__ . "/json/countries.json");
85
- $contData = json_decode($getCountris);
86
- $wooCountry = $this->woo_country();
87
- $wooCountry = $selected_code ? $selected_code : $wooCountry[0];
88
- $is_disabled = ($is_disabled) ? "style='max-width:30rem;height:35px;pointer-events:none;background:#f2f2f2;'" : "style='max-width: 30rem;height: 35px;'";
89
- $data = "<select id='sales_country' name='sales_country' class='form-group col-md-6' readonly='true' $is_disabled onchange='selectCountry()'>";
90
- foreach ($contData as $key => $value) {
91
- $selected = ($value->code == $wooCountry) ? "selected='selected'" : "";
92
- $data .= "<option value=" . $value->code . " " . $selected . " >" . $value->name . "</option>";
93
- }
94
- $data .= "</select>";
95
- return $data;
 
 
 
 
 
 
96
  }
97
 
98
- private function woo_country() {
99
- // The country/state
100
- $store_raw_country = get_option('woocommerce_default_country');
101
- // Split the country/state
102
- $split_country = explode(":", $store_raw_country);
103
- return $split_country;
 
 
104
  }
105
 
106
- private function get_currency_symbol() {
107
- //$campaignClsObj = new SmartShoppingCampaign();
108
- //$currency = $campaignClsObj->getCustomerCurrency();
109
- //return get_woocommerce_currency_symbol($currency);
110
- $currency_symbol = $this->customApiObj->getCampaignCurrencySymbol(['customer_id' => $this->currentCustomerId]);
111
- if (isset($currency_symbol->data) && isset($currency_symbol->data['status'])) {
112
- if ($currency_symbol->data['status'] == 200) {
113
- $currency = get_woocommerce_currency_symbol($currency_symbol->data['data']->currency);
114
- }
115
- } else {
116
- $currency = $currency = get_woocommerce_currency_symbol("USD");
117
  }
118
- return $currency;
119
- }
120
-
121
- public function create_form() {
122
- $campaigns_list = [];
123
- $categories = [];
124
- $campaign_performance = [];
125
- $account_performance = [];
126
- $product_performance = [];
127
- $product_partition_performance = [];
128
- $api_obj = new ShoppingApi();
129
-
130
- $campaigns_list_res = $api_obj->getCampaigns();
131
-
132
- if (isset($campaigns_list_res->errors) && !empty($campaigns_list_res->errors)) {
133
-
134
- } else {
135
-
136
- $campaigns_list_res = $campaigns_list_res->data;
137
-
138
- if (isset($campaigns_list_res['status']) && $campaigns_list_res['status'] == 200) {
139
- $campaigns_list = $campaigns_list_res['data'];
140
- }
141
  }
 
 
142
 
143
- $defaultCountry = isset($campaign_details->targetCountry) ? $campaign_details->targetCountry : $this->woo_country()[0];
144
- $category_list = $api_obj->getCategories($defaultCountry);
145
-
146
- if (isset($category_list->errors) && !empty($category_list->errors)) {
147
-
148
- } else {
149
- $category_list = isset($category_list->data) ? $category_list->data : [];
150
- if (isset($category_list['status']) && $category_list['status'] == 200) {
151
- $categories = $category_list['data'];
152
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
153
  }
154
-
155
- $currency = $this->get_currency_symbol();
156
-
157
- if (isset($_GET['edit']) && $_GET['edit'] != '') {
158
-
159
- $campaign_details_res = $api_obj->getCampaignDetails($_GET['edit']);
160
- if (isset($campaign_details_res->errors) && !empty($campaign_details_res->errors)) {
161
- $error_code = array_keys($campaign_details_res->errors)[0];
162
- if ($error_code == 404) {
163
- $error_msg = 'Campaign details not found';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
164
  } else {
165
- if (isset($campaign_details_res->error_data) && !empty($campaign_details_res->error_data)) {
166
- // $error_msg = array_values($campaign_details_res->error_data)[0]->errors[0];
167
- }
168
- }
169
- $class = 'notice notice-error';
170
- $message = esc_html__(isset($error_msg) ? $error_msg : 'There was some error fetching campaign details.', 'sample-text-domain');
171
- printf('<div class="%1$s"><p>%2$s</p></div>', esc_attr($class), esc_html('Error : ' . $message));
172
- } else {
173
- $campaign_details = $campaign_details_res->data;
174
- if ($campaign_details['status'] == 200) {
175
- $campaign_details = $campaign_details['data'];
176
- }
177
- }
178
- }
179
-
180
- if (isset($_POST['create_campaign'])) {
181
-
182
- $campaign_name = $_POST['campaign_name'];
183
- $campaign_budget = $_POST['campaign_budget'];
184
- $sales_country = $_POST['sales_country'];
185
- $all_products = $_POST['all_products'];
186
- $category_id = $_POST['dimension'];
187
- $category_level = $_POST['category_level'];
188
-
189
- $campaign = $api_obj->createCampaign($campaign_name, $campaign_budget, $sales_country, $all_products, $category_id, $category_level);
190
- if (isset($campaign->errors) && !empty($campaign->errors)) {
191
- $class = 'notice notice-error';
192
- $message = esc_html__((isset($campaign->errors) && isset($campaign->errors[0])) ? $campaign->errors[0] : 'Error', 'sample-text-domain');
193
- printf('<div class="%1$s"><p>%2$s</p></div>', esc_attr($class), esc_html('Error : ' . $message));
194
- } else {
195
- // if ($campaign['status'] == 200) {
196
- // echo "<pre>";
197
- // print_r($campaign);
198
- //// print_r($campaign->message);
199
- // print_r($campaign->data);
200
- // exit;
201
- // $campaign = $campaign->data;
202
- $class = 'notice notice-success';
203
- $message = esc_html__('Smart Shopping Campaign Created Successfully with Resource name ' . $campaign->data, 'sample-text-domain');
204
- printf('<div class="%1$s"><p>%2$s</p></div>', esc_attr($class), esc_html($message));
205
- // $url = admin_url('admin.php?page=tvc-configuration-page');
206
- //wp_redirect($url);
207
- // }
208
- }
209
- }
210
- if (isset($_POST['update_campaign'])) {
211
- $campaign_name = $_POST['campaign_name'];
212
- $campaign_budget = $_POST['campaign_budget'];
213
- $campaign_id = $_POST['campaign_id'];
214
- $budget_id = $_POST['budget_id'];
215
- $sales_country = $_POST['sales_country'];
216
- $all_products = $_POST['all_products'];
217
- $ad_group_id = $_POST['ad_group_id'];
218
- $ad_group_resource_name = $_POST['ad_group_resource_name'];
219
- $category_id = isset($_POST['dimension']) ? $_POST['dimension'] : '';
220
- $category_level = $_POST['category_level'];
221
-
222
- $campaign = $api_obj->updateCampaign($campaign_name, $campaign_budget, $campaign_id, $budget_id, $sales_country, $all_products, $category_id, $category_level, $ad_group_id, $ad_group_resource_name);
223
- if (isset($campaign->errors) && !empty($campaign->errors)) {
224
- $class = 'notice notice-error';
225
- $message = esc_html__(isset($campaign->errors) ? $campaign->errors[0] : 'Error', 'sample-text-domain');
226
- printf('<div class="%1$s"><p>%2$s</p></div>', esc_attr($class), esc_html('Error : ' . $message));
227
- } else {
228
- $campaign = $campaign->data;
229
- if ($campaign['status'] == 200) {
230
- $campaign = $campaign['data'];
231
- $class = 'notice notice-success';
232
- $message = esc_html__('Smart Shopping Campaign Updated Successfully with Resource name ' . $campaign, 'sample-text-domain');
233
- printf('<div class="%1$s"><p>%2$s</p></div>', esc_attr($class), esc_html($message));
234
- // $url = admin_url('admin.php?page=tvc-configuration-page');
235
- //wp_redirect($url);
236
- }
237
- }
238
- echo "<script>jQuery('#feed-spinner').css('display', 'none');</script>";
239
- //header("Location:" . admin_url('admin.php?page=actionable-google-analytics-admin-display&tab=add_campaign_page&edit='.$campaign_id), true, 301);
240
- //exit();
241
- /* $url = admin_url('admin.php?page=tvc-configuration-page');
242
- wp_redirect($url); */
243
- }
244
-
245
- echo'<div class="container-fluid">
246
- <div class="row">
247
- <div class= "col col-12">
248
- <div class="card mw-100" style="padding:0;">
249
- <div class="card-body">
250
- <div class="tab-pane show active" id="googleShoppingFeed">
251
- <div class="row">
252
- <div class="col-md-6 col-lg-8 border-right">';
253
- if (!isset($_GET['edit'])) {
254
- echo '<form method="post" id="create-form">
255
- <div class="form-group">
256
- <h2 class="lead">Create a Smart Shopping Campaign to promote your products</h2>
257
- <p style="text-align:left; font-size: 14px;">A Smart Shopping campaign shows your products to potential customers across Google, Google Search Partners, the Google Display Network, YouTube, and Gmail.</p>
258
- <p style="text-align:left">
259
- <a href="https://support.google.com/google-ads/answer/7674739?hl=en" target="_blank">Learn more about Smart Shopping Campaigns.</a>
260
- </p>
261
- </div>
262
- <div class="form-row" style="margin-bottom: 0">
263
- <div class="col-md-12 row">
264
- <label for="campaign-name" class="form-group col-md-4 mt-2 text-left font-weight-bold">Campaign name: </label>
265
- <input type="text" class="form-group col-md-6" name="campaign_name" id="campaign-name" required>
266
- </div>
267
- <div class="col-md-12 row">
268
- <label for="campaign-budget" class="form-group col-md-4 mt-2 mb-0 text-left"><span class="font-weight-bold">Daily Campaign Budget (' . $currency . '):</span> <p style="text-align:left;font-size: 11px;">Only pay if someone clicks your ad. Recommended minimum budget of ' . $currency . ' 5 per day.</p></label>
269
- <input type="number" class="form-group col-md-6" name="campaign_budget" id="campaign-budget" style="height: 35px;" required>
270
- </div>
271
- <div class="col-md-12 row">
272
- <label for="sales-country" class="form-group col-md-4 mt-2 text-left"><span class="font-weight-bold">Target Country:</span> <p style="text-align:left;font-size: 11px;">If you want to target multiple countries, then create multiple campaigns.</p></label>
273
- ' . $this->country_dropdown() . '
274
- </div>
275
- <div class="col-md-12 row">
276
- <label for="campaign-products" class="form-group col-md-4 mt-2 text-left font-weight-bold">Products in campaign: </label>
277
- <label class="mt-2"><input type="radio" id="campaign-products" name="all_products" value="1" checked />Include all Merchant Center products</label>
278
- </div>
279
- <div class="col-md-12 row" style="display:none;">
280
- <div class="col-md-4"></div>
281
- <label class=""><input type="radio" id="campaign-product-partition" value="0" name="all_products" />Select products using product partition filters</label>
282
- </div>
283
- <div class="col-md-12 row" style="display:none;">
284
- <div class="col-md-4"></div>
285
- <label>Product Partition filter dimension:</label><b> Category</b>
286
- </div>
287
- <div class="col-md-12 row" style="display:none;">
288
- <div class="col-md-4"></div>
289
- <label>Dimension Value:</label>
290
- <input type="hidden" name="category_level" id="category_level" value="" />
291
- <select class="col-md-3 ml-2" name="dimension" id="dimension" onchange="changeCategory()">';
292
- for ($i = 0; $i < count($categories); $i++) {
293
- echo '<option value="' . $categories[$i]->id . '" level="' . $categories[$i]->level . '">' . $categories[$i]->name . '</option>';
294
- }
295
- echo '</select>
296
- </div>
297
- <div class="col-md-12 row">
298
- <label class="form-group col-md-12 mt-2 mb-0 text-left font-weight-bold">Campaign duration: </label>
299
- <p class="ml-3" style="text-align:left; font-size: 14px;">Your campaign will run until you pause it. You can pause your campaign at any time, however it can take up to 30 days for google to optimize your products and ads.</p>
300
- </div>
301
- </div>
302
- <div class="col-12 text-center">
303
- <button onclick="showLoader()" type="submit" class="btn btn-primary btn-success" id="create_campaign" name="create_campaign">Create Smart Shopping Campaign</button>
304
- </div>
305
- </form>
306
- <hr>
307
- <form method="post">
308
- <div class="text-left">
309
- <p style="font-size: 14px;">Please note that campaigns will be created with accounts configured in previous steps.</p>
310
- <p style="font-size: 14px;"><span>Google Merchant Center : ' . $this->merchantId . '</span>&nbsp;&nbsp;&nbsp;&nbsp;<span>Google Ads Account Id : ' . $this->currentCustomerId . '</span></p>
311
- </div>
312
- </form>';
313
- } else if (isset($_GET['edit']) && $_GET['edit'] != '') {
314
- echo '<form method="post">
315
- <div class="form-group">
316
- <h2 class="lead">Create/Update a Smart Shopping Campaign to promote your products</h2>
317
- <p style="text-align:left; font-size: 14px;">A Smart Shopping campaign shows your products to potential customers across Google, Google Search Partners, the Google Display Network, YouTube, and Gmail.</p>
318
- <p style="text-align:left">
319
- <a href="https://support.google.com/google-ads/answer/7674739?hl=en" target="_blank">Learn more about Smart Shopping Campaigns.</a>
320
- </p>
321
- </div>
322
- <div class="form-row" style="margin-bottom: 0">
323
- <div class="col-md-12 row">
324
- <label for="campaign-name" class="form-group col-md-4 mt-2 text-left font-weight-bold">Campaign name: </label>
325
- <input type="text" class="form-group col-md-6" name="campaign_name" value="';
326
- if (isset($campaign_details) && $campaign_details != '') {
327
- echo $campaign_details->compaignName;
328
- }
329
- echo '" id="campaign-name" required>
330
- </div>
331
- <div class="col-md-12 row">
332
- <label for="campaign-budget" class="form-group col-md-4 mt-2 mb-0 text-left"><span class="font-weight-bold">Daily Campaign Budget (' . $currency . '):</span> <p style="text-align:left;font-size: 11px;">Only pay if someone clicks your ad. Recommended minimum budget of '.(isset($campaign_details) && $campaign_details != ''?$campaign_details->dailyBudget.' '.$currency:'').' per day.</p></label>
333
- <input type="number" class="form-group col-md-6" name="campaign_budget" id="campaign-budget" value="';
334
- if (isset($campaign_details) && $campaign_details != '') {
335
- echo $campaign_details->dailyBudget;
336
- }
337
- echo '" style="height: 35px;" required>
338
- </div>
339
- <input type="hidden" name="campaign_id" value="';
340
- if (isset($campaign_details) && $campaign_details != '') {
341
- echo $campaign_details->compaignId;
342
- }
343
- echo '" />
344
- <input type="hidden" name="budget_id" value="';
345
- if (isset($campaign_details) && $campaign_details != '') {
346
- echo $campaign_details->budgetId;
347
- }
348
- echo '" />
349
- <input type="hidden" name="ad_group_id" value="';
350
- if (isset($campaign_details) && $campaign_details != '') {
351
- echo $campaign_details->adGroupId;
352
- }
353
- echo '" />
354
- <input type="hidden" name="ad_group_resource_name" value="';
355
- if (isset($campaign_details) && $campaign_details != '') {
356
- echo $campaign_details->adGroupResourceName;
357
- }
358
- echo '" />
359
- <div class="col-md-12 row">
360
- <label for="sales-country" class="form-group col-md-4 mt-2 text-left"><span class="font-weight-bold">Target Country:</span> <p style="text-align:left;font-size: 11px;">If you want to target multiple countries, then create multiple campaigns.</p></label>
361
- ' . $this->country_dropdown($defaultCountry, true) . '
362
- </div>
363
- <div class="col-md-12 row">
364
- <label for="campaign-products" class="form-group col-md-4 mt-2 text-left font-weight-bold">Products in campaign: </label>
365
- <label class="mt-2">';
366
- if (isset($campaign_details) && $campaign_details->category_level > 0 && $campaign_details->category_id > 0) {
367
- echo '<input type="radio" id="campaign-products" name="all_products" value="1" />';
368
- } else {
369
- echo '<input type="radio" id="campaign-products" name="all_products" value="1" checked />';
370
- }
371
- echo 'Include all Merchant Center products</label>
372
- </div>
373
- <div class="col-md-12 row">
374
- <div class="col-md-4"></div>
375
- <label class="">';
376
- if (isset($campaign_details) && $campaign_details->category_level > 0 && $campaign_details->category_id > 0) {
377
- echo '<input type="radio" id="campaign-product-partition" value="0" name="all_products" checked />';
378
- } else {
379
- echo '<input type="radio" id="campaign-product-partition" value="0" name="all_products" />';
380
- }
381
- echo 'Select products using product partition filters</label>
382
- </div>
383
- <div class="col-md-12 row">
384
- <div class="col-md-4"></div>
385
- <label>Product Partition filter dimension:</label><b> Category</b>
386
- </div>
387
- <div class="col-md-12 row">
388
- <div class="col-md-4"></div>
389
- <label>Dimension Value:</label>
390
- <input type="hidden" name="category_level" id="category_level" value="';
391
- if (isset($campaign_details) && $campaign_details != '') {
392
- echo $campaign_details->category_level;
393
- }
394
- echo '" />
395
- <select class="col-md-3 ml-2" name="dimension" id="dimension" onchange="changeCategory()">';
396
- if (isset($campaign_details) && $campaign_details != '') {
397
- for ($i = 0; $i < count($categories); $i++) {
398
- if ($campaign_details->category_id == $categories[$i]->id) {
399
  echo '<option value="' . $categories[$i]->id . '" level="' . $categories[$i]->level . '" selected="selected">' . $categories[$i]->name . '</option>';
400
- } else {
401
  echo '<option value="' . $categories[$i]->id . '" level="' . $categories[$i]->level . '">' . $categories[$i]->name . '</option>';
 
402
  }
403
- }
404
- }
405
- echo '</select>
406
- </div>
407
- <div class="col-md-12 row">
408
- <label class="form-group col-md-12 mt-2 mb-0 text-left font-weight-bold">Campaign duration: </label>
409
- <p class="ml-3" style="text-align:left; font-size: 14px;">Your campaign will run until you pause it. You can pause your campaign at any time, however it can take up to 30 days for google to optimize your products and ads.</p>
410
- </div>
411
- </div>
412
- <div class="col-12 text-center">
413
- <button onclick="showLoader()" type="submit" class="btn btn-primary btn-success" id="update_campaign" name="update_campaign">Update Smart Shopping Campaign</button>
414
- </div>
415
- </form>
416
- <hr>
417
- <form method="post">
418
- <div class="text-left">
419
- <p style="font-size: 14px;">Please note that campaigns will be created with accounts configured in previous steps.</p>
420
- <p style="font-size: 14px;"><span>Google Merchant Center : ' . $this->merchantId . '</span>&nbsp;&nbsp;&nbsp;&nbsp;<span>Google Ads Account Id : ' . $this->currentCustomerId . '</span></p>
421
- </div>
422
- </form>';
423
- }
424
- echo ' </div>
425
- <div class="col-md-6 col-lg-4">
426
- <div class="right-content">
427
- '.get_tvc_help_html().'
428
- </div>
429
- </div>
430
- </div>
431
- </div>
432
- </div>
433
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
434
  </div>
 
435
  </div>
436
- </div>';
437
- }
438
-
439
- public function spinner() {
440
- $spinner_gif = ENHANCAD_PLUGIN_URL . '/admin/images/ajax-loader.gif';
441
- echo '<div class="feed-spinner" id="feed-spinner" style="display:none;">
442
- <img id="img-spinner" src="' . $spinner_gif . '" alt="Loading" />
443
- </div>';
444
- }
445
-
446
- public function includes() {
447
- if (!class_exists('SmartShoppingCampaign')) {
448
- require_once(__DIR__ . '/SmartShoppingCampaign.php');
449
- }
450
- if (!class_exists('ShoppingApi')) {
451
- require_once(__DIR__ . '/ShoppingApi.php');
452
- }
453
- }
454
-
455
- public function success_message($customerId) {
456
- $class = 'notice notice-success';
457
- $message = esc_html__($customerId . ' Set as default Ads Account ID.', 'sample-text-domain');
458
- printf('<div class="%1$s"><p>%2$s</p></div>', esc_attr($class), esc_html($message));
459
- }
460
-
461
- public function success_messageV2($campaign_name, $status) {
462
- $active = ($status == true) ? 'active' : 'inactive';
463
- $class = 'notice notice-success';
464
- //$message = esc_html__($campaign_name . ' Campaign Set as '.$active.'.', 'sample-text-domain');
465
- // return '<div class='.$class.'><p>'.$campaign_name.' Campaign Set as '.$active.'</p></div>';
466
- $message = $campaign_name . ' set as ' . $active;
467
- return $message;
468
- }
469
-
470
- public function success_deleteMessage($campaign_name) {
471
- //$active = ($status == true) ? 'active' : 'inactive';
472
- $class = 'notice notice-success';
473
- //$message = esc_html__($campaign_name . ' Campaign Set as '.$active.'.', 'sample-text-domain');
474
- // return '<div class='.$class.'><p>'.$campaign_name.' Campaign Set as '.$active.'</p></div>';
475
- $message = $campaign_name . ' is deleted successfully';
476
- return $message;
477
- }
478
-
479
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <?php
 
2
  class AddCampaign {
3
+ public $response;
4
+ public $post_data;
5
+ protected $merchantId;
6
+ protected $new_campaign;
7
+ protected $TVC_Admin_Helper;
8
+
9
+ public function __construct() {
10
+ global $wpdb;
11
+ $this->includes();
12
+ $this->TVC_Admin_Helper = new TVC_Admin_Helper();
13
+ $this->post_data = $_POST;
14
+ $this->merchantId = $this->TVC_Admin_Helper->get_merchantId();
15
+ $this->currentCustomerId = $this->TVC_Admin_Helper->get_currentCustomerId();
16
+ $this->html_run();
17
+ }
18
+ public function includes() {
19
+ if (!class_exists('ShoppingApi')) {
20
+ require_once(__DIR__ . '/ShoppingApi.php');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
  }
22
+ }
23
+ public function html_run() {
24
+ $this->TVC_Admin_Helper->add_spinner_html();
25
+ $this->create_form();
26
+ }
27
+
28
+ public function country_dropdown($selected_code = '', $is_disabled = false) {
29
+ $getCountris = file_get_contents(__DIR__ . "/json/countries.json");
30
+ $contData = json_decode($getCountris);
31
+ $wooCountry = $this->TVC_Admin_Helper->get_woo_country();
32
+ $is_disabled = ($is_disabled) ? "style='max-width:30rem;height:35px;pointer-events:none;background:#f2f2f2;'" : "style='max-width: 30rem;height: 35px;'";
33
+ $data = "<select id='sales_country' name='sales_country' class='form-group col-md-6' readonly='true' $is_disabled onchange='selectCountry()'>";
34
+ foreach ($contData as $key => $value) {
35
+ $selected = ($value->code == $wooCountry) ? "selected='selected'" : "";
36
+ $data .= "<option value=" . $value->code . " " . $selected . " >" . $value->name . "</option>";
37
  }
38
+ $data .= "</select>";
39
+ return $data;
40
+ }
41
+
42
+ public function create_form() {
43
+ $campaigns_list = [];
44
+ $categories = [];
45
+ $campaign_performance = [];
46
+ $account_performance = [];
47
+ $product_performance = [];
48
+ $product_partition_performance = [];
49
+ $api_obj = new ShoppingApi();
50
+
51
+ $campaigns_list_res = $api_obj->getCampaigns();
52
+ if(isset($campaigns_list_res->errors) && !empty($campaigns_list_res->errors)){
53
+ }else if( isset($campaigns_list_res->data) ){
54
+ $campaigns_list_res = $campaigns_list_res->data;
55
+ if(isset($campaigns_list_res['status']) && $campaigns_list_res['status'] == 200){
56
+ $campaigns_list = $campaigns_list_res['data'];
57
+ }
58
  }
59
 
60
+ $defaultCountry = $this->TVC_Admin_Helper->get_woo_country();
61
+ $category_list = $api_obj->getCategories($defaultCountry);
62
+ if(isset($category_list->errors) && !empty($category_list->errors)){
63
+ }else{
64
+ $category_list = isset($category_list->data) ? $category_list->data : [];
65
+ if (isset($category_list['status']) && $category_list['status'] == 200) {
66
+ $categories = $category_list['data'];
67
+ }
68
  }
69
 
70
+ $currency = $this->TVC_Admin_Helper->get_user_currency_symbol();
71
+ if (isset($_GET['edit']) && $_GET['edit'] != '') {
72
+ $campaign_details_res = $api_obj->getCampaignDetails($_GET['edit']);
73
+ if (isset($campaign_details_res->errors) && !empty($campaign_details_res->errors)) {
74
+ $error_code = array_keys($campaign_details_res->errors)[0];
75
+ if($error_code == 404){
76
+ $error_msg = 'Campaign details not found';
77
+ }else{
78
+ if (isset($campaign_details_res->error_data) && !empty($campaign_details_res->error_data)) {
79
+ // $error_msg = array_values($campaign_details_res->error_data)[0]->errors[0];
80
+ }
81
  }
82
+ $class = 'notice notice-error';
83
+ $message = esc_html__(isset($error_msg) ? $error_msg : 'There was some error fetching campaign details.', 'sample-text-domain');
84
+ printf('<div class="%1$s"><p>%2$s</p></div>', esc_attr($class), esc_html('Error : ' . $message));
85
+ } else {
86
+ $campaign_details = $campaign_details_res->data;
87
+ if ($campaign_details['status'] == 200) {
88
+ $campaign_details = $campaign_details['data'];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
  }
90
+ }
91
+ }
92
 
93
+ if (isset($_POST['create_campaign'])) {
94
+ $campaign_name = isset($_POST['campaign_name'])?$_POST['campaign_name']:"";
95
+ $campaign_budget = isset($_POST['campaign_budget'])?$_POST['campaign_budget']:"";
96
+ $sales_country = isset($_POST['sales_country'])?$_POST['sales_country']:"";
97
+ $all_products = isset($_POST['all_products'])?$_POST['all_products']:"";
98
+ $category_id = isset($_POST['dimension'])?$_POST['dimension']:"";
99
+ $category_level = isset($_POST['category_level'])?$_POST['category_level']:"";
100
+
101
+ $campaign = $api_obj->createCampaign($campaign_name, $campaign_budget, $sales_country, $all_products, $category_id, $category_level);
102
+ if(isset($campaign->errors) && !empty($campaign->errors)){
103
+ $class = 'notice notice-error';
104
+ $message = esc_html__((isset($campaign->errors) && isset($campaign->errors[0])) ? $campaign->errors[0] : 'Error', 'sample-text-domain');
105
+ printf('<div class="%1$s"><p>%2$s</p></div>', esc_attr($class), esc_html('Error : ' . $message));
106
+ }else{
107
+ $class = 'notice notice-success';
108
+ $campaign_neme = isset($campaign->data)?'with Resource name '.$campaign->data:"";
109
+ $message = esc_html__('Smart Shopping Campaign Created Successfully '.$campaign_neme, 'sample-text-domain');
110
+ printf('<div class="%1$s"><p>%2$s</p></div>', esc_attr($class), esc_html($message));
111
+ }
112
+ }
113
+ if (isset($_POST['update_campaign'])) {
114
+ $campaign_name = isset($_POST['campaign_name'])?$_POST['campaign_name']:"";
115
+ $campaign_budget = isset($_POST['campaign_budget'])?$_POST['campaign_budget']:"";
116
+ $campaign_id = isset($_POST['campaign_id'])?$_POST['campaign_id']:"";
117
+ $budget_id = isset($_POST['budget_id'])?$_POST['budget_id']:"";
118
+ $sales_country = isset($_POST['sales_country'])?$_POST['sales_country']:"";
119
+ $all_products = isset($_POST['all_products'])?$_POST['all_products']:"";
120
+ $ad_group_id = isset($_POST['ad_group_id'])?$_POST['ad_group_id']:"";
121
+ $ad_group_resource_name = isset($_POST['ad_group_resource_name'])?$_POST['ad_group_resource_name']:"";
122
+ $category_id = isset($_POST['dimension']) ? $_POST['dimension']:"";
123
+ $category_level = isset($_POST['category_level'])?$_POST['category_level']:"";
124
+
125
+ $campaign = $api_obj->updateCampaign($campaign_name, $campaign_budget, $campaign_id, $budget_id, $sales_country, $all_products, $category_id, $category_level, $ad_group_id, $ad_group_resource_name);
126
+
127
+ if (isset($campaign->errors) && !empty($campaign->errors)) {
128
+ $class = 'notice notice-error';
129
+ $message = esc_html__(isset($campaign->errors) ? $campaign->errors[0] : 'Error', 'sample-text-domain');
130
+ printf('<div class="%1$s"><p>%2$s</p></div>', esc_attr($class), esc_html('Error : ' . $message));
131
+ } else if(isset($campaign->data)){
132
+ $campaign = $campaign->data;
133
+ if ($campaign['status'] == 200) {
134
+ $campaign_neme = isset($campaign['data'])?'with Resource name '.$campaign['data']:"";
135
+ $class = 'notice notice-success';
136
+ $message = esc_html__('Smart Shopping Campaign Updated Successfully ' . $campaign_neme, 'sample-text-domain');
137
+ printf('<div class="%1$s"><p>%2$s</p></div>', esc_attr($class), esc_html($message));
138
+ // $url = admin_url('admin.php?page=tvc-configuration-page');
139
+ //wp_redirect($url);
140
  }
141
+ }
142
+ echo "<script>jQuery('#feed-spinner').css('display', 'none');</script>";
143
+ } ?>
144
+
145
+ <div class="tab-content">
146
+ <div class="tab-pane show active" id="googleShoppingFeed">
147
+ <div class="tab-card">
148
+ <div class="row">
149
+ <div class="col-md-6 col-lg-8 edit-section">
150
+ <div class="edit-header-section">
151
+ <script>
152
+ var back_img = '<img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/left-angle-arrow.svg'; ?>" alt="back"/>';
153
+ document.write('<a href="' + document.referrer + '" class="back-btn">'+back_img+'<span>Back</span></a>');
154
+ </script>
155
+ </div>
156
+ <?php
157
+ if (!isset($_GET['edit'])) { ?>
158
+ <form method="post" id="create-form">
159
+ <div class="form-group">
160
+ <h2 class="lead">Create a Smart Shopping Campaign to promote your products</h2>
161
+ <p style="text-align:left; font-size: 14px;">A Smart Shopping campaign shows your products to potential customers across Google, Google Search Partners, the Google Display Network, YouTube, and Gmail.</p>
162
+ <p style="text-align:left">
163
+ <a href="https://support.google.com/google-ads/answer/7674739?hl=en" target="_blank">Learn more about Smart Shopping Campaigns.</a>
164
+ </p>
165
+ </div>
166
+ <div class="form-row" style="margin-bottom: 0">
167
+ <div class="col-md-12 row">
168
+ <label for="campaign-name" class="form-group col-md-4 mt-2 text-left font-weight-bold">Campaign name: </label>
169
+ <input type="text" class="form-group col-md-6" name="campaign_name" id="campaign-name" required>
170
+ </div>
171
+ <div class="col-md-12 row">
172
+ <label for="campaign-budget" class="form-group col-md-4 mt-2 mb-0 text-left"><span class="font-weight-bold">Daily Campaign Budget (<?php echo $currency ;?>):</span> <p style="text-align:left;font-size: 11px;">Only pay if someone clicks your ad. Recommended minimum budget of <?php echo $currency ; ?>5 per day.</p></label>
173
+ <input type="number" class="form-group col-md-6" name="campaign_budget" id="campaign-budget" style="height: 35px;" required>
174
+ </div>
175
+ <div class="col-md-12 row">
176
+ <label for="sales-country" class="form-group col-md-4 mt-2 text-left"><span class="font-weight-bold">Target Country:</span> <p style="text-align:left;font-size: 11px;">If you want to target multiple countries, then create multiple campaigns.</p></label><?php echo $this->country_dropdown(); ?>
177
+ </div>
178
+ <div class="col-md-12 row">
179
+ <label for="campaign-products" class="form-group col-md-4 mt-2 text-left font-weight-bold">Products in campaign: </label>
180
+ <label class="mt-2"><input type="radio" id="campaign-products" name="all_products" value="1" checked />Include all Merchant Center products</label>
181
+ </div>
182
+ <div class="col-md-12 row" style="display:none;">
183
+ <div class="col-md-4"></div>
184
+ <label class=""><input type="radio" id="campaign-product-partition" value="0" name="all_products" />Select products using product partition filters</label>
185
+ </div>
186
+ <div class="col-md-12 row" style="display:none;">
187
+ <div class="col-md-4"></div>
188
+ <label>Product Partition filter dimension:</label><b> Category</b>
189
+ </div>
190
+ <div class="col-md-12 row" style="display:none;">
191
+ <div class="col-md-4"></div>
192
+ <label>Dimension Value:</label>
193
+ <input type="hidden" name="category_level" id="category_level" value="" />
194
+ <select class="col-md-3 ml-2" name="dimension" id="dimension" onchange="changeCategory()">
195
+ <?php
196
+ for ($i = 0; $i < count($categories); $i++) {
197
+ echo '<option value="' . $categories[$i]->id . '" level="' . $categories[$i]->level . '">' . $categories[$i]->name . '</option>';
198
+ } ?>
199
+ </select>
200
+ </div>
201
+ <div class="col-md-12 row">
202
+ <label class="form-group col-md-12 mt-2 mb-0 text-left font-weight-bold">Campaign duration: </label>
203
+ <p class="ml-3" style="text-align:left; font-size: 14px;">Your campaign will run until you pause it. You can pause your campaign at any time, however it can take up to 30 days for google to optimize your products and ads.</p>
204
+ </div>
205
+ </div>
206
+ <div class="col-12 row">
207
+ <button onclick="showLoader()" type="submit" class="btn btn-primary" id="create_campaign" name="create_campaign">Create Smart Shopping Campaign</button>
208
+ </div>
209
+ </form>
210
+ <hr>
211
+ <form method="post">
212
+ <div class="text-left">
213
+ <p style="font-size: 14px;">Please note that campaigns will be created with accounts configured in previous steps.</p>
214
+ <p style="font-size: 14px;"><span>Google Merchant Center : <?php echo $this->merchantId; ?></span>&nbsp;&nbsp;&nbsp;&nbsp;<span>Google Ads Account Id : <?php echo $this->currentCustomerId; ?></span></p>
215
+ </div>
216
+ </form>
217
+ <?php
218
+ } else if (isset($_GET['edit']) && $_GET['edit'] != '') { ?>
219
+ <form method="post">
220
+ <div class="form-group">
221
+ <h2 class="lead">Create/Update a Smart Shopping Campaign to promote your products</h2>
222
+ <p style="text-align:left; font-size: 14px;">A Smart Shopping campaign shows your products to potential customers across Google, Google Search Partners, the Google Display Network, YouTube, and Gmail.</p>
223
+ <p style="text-align:left">
224
+ <a href="https://support.google.com/google-ads/answer/7674739?hl=en" target="_blank">Learn more about Smart Shopping Campaigns.</a>
225
+ </p>
226
+ </div>
227
+ <div class="form-row" style="margin-bottom: 0">
228
+ <div class="col-md-12 row">
229
+ <label for="campaign-name" class="form-group col-md-4 mt-2 text-left font-weight-bold">Campaign name: </label>
230
+ <input type="text" class="form-group col-md-6" name="campaign_name" value="<?php echo (isset($campaign_details) && $campaign_details != '')?$campaign_details->compaignName:""; ?>" id="campaign-name" required>
231
+ </div>
232
+ <div class="col-md-12 row">
233
+ <label for="campaign-budget" class="form-group col-md-4 mt-2 mb-0 text-left"><span class="font-weight-bold">Daily Campaign Budget (<?php echo $currency; ?>):</span> <p style="text-align:left;font-size: 11px;">Only pay if someone clicks your ad. Recommended minimum budget of <?php echo $currency; ?>5 per day.</p></label>
234
+ <input type="number" class="form-group col-md-6" name="campaign_budget" id="campaign-budget" value="<?php echo (isset($campaign_details) && $campaign_details != '')?$campaign_details->dailyBudget:""; ?>" style="height: 35px;" required>
235
+ </div>
236
+ <input type="hidden" name="campaign_id" value="<?php echo (isset($campaign_details) && $campaign_details != '')?$campaign_details->compaignId:""; ?>" />
237
+ <input type="hidden" name="budget_id" value="<?php echo (isset($campaign_details) && $campaign_details != '')?$campaign_details->budgetId:""; ?>" />
238
+ <input type="hidden" name="ad_group_id" value="<?php echo (isset($campaign_details) && $campaign_details != '')?$campaign_details->adGroupId:""; ?>" />
239
+ <input type="hidden" name="ad_group_resource_name" value="<?php echo(isset($campaign_details) && $campaign_details != '')? $campaign_details->adGroupResourceName:""; ?>" />
240
+ <div class="col-md-12 row">
241
+ <label for="sales-country" class="form-group col-md-4 mt-2 text-left"><span class="font-weight-bold">Target Country:</span> <p style="text-align:left;font-size: 11px;">If you want to target multiple countries, then create multiple campaigns.</p></label>
242
+ <?php echo $this->country_dropdown($defaultCountry, true); ?>
243
+ </div>
244
+ <div class="col-md-12 row">
245
+ <label for="campaign-products" class="form-group col-md-4 mt-2 text-left font-weight-bold">Products in campaign: </label>
246
+ <label class="mt-2">
247
+ <?php
248
+ if(isset($campaign_details) && $campaign_details->category_level > 0 && $campaign_details->category_id > 0){
249
+ echo '<input type="radio" id="campaign-products" name="all_products" value="1" />';
250
+ }else{
251
+ echo '<input type="radio" id="campaign-products" name="all_products" value="1" checked />';
252
+ } ?> Include all Merchant Center products</label>
253
+ </div>
254
+ <div class="col-md-12 row" style="display: none;">
255
+ <div class="col-md-4"></div>
256
+ <label class="">
257
+ <?php
258
+ if (isset($campaign_details) && $campaign_details->category_level > 0 && $campaign_details->category_id > 0) {
259
+ echo '<input type="radio" id="campaign-product-partition" value="0" name="all_products" checked />';
260
  } else {
261
+ echo '<input type="radio" id="campaign-product-partition" value="0" name="all_products" />';
262
+ } ?> Select products using product partition filters</label>
263
+ </div>
264
+ <div class="col-md-12 row" style="display: none;">
265
+ <div class="col-md-4"></div>
266
+ <label>Product Partition filter dimension:</label><b> Category</b>
267
+ </div>
268
+ <div class="col-md-12 row" style="display: none;">
269
+ <div class="col-md-4"></div>
270
+ <label>Dimension Value:</label>
271
+ <input type="hidden" name="category_level" id="category_level" value=" <?php echo (isset($campaign_details) && $campaign_details != '')?$campaign_details->category_level:""; ?>" />
272
+ <select class="col-md-3 ml-2" name="dimension" id="dimension" onchange="changeCategory()">
273
+ <?php
274
+ if (isset($campaign_details) && $campaign_details != '') {
275
+ for ($i = 0; $i < count($categories); $i++) {
276
+ if ($campaign_details->category_id == $categories[$i]->id) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
277
  echo '<option value="' . $categories[$i]->id . '" level="' . $categories[$i]->level . '" selected="selected">' . $categories[$i]->name . '</option>';
278
+ } else {
279
  echo '<option value="' . $categories[$i]->id . '" level="' . $categories[$i]->level . '">' . $categories[$i]->name . '</option>';
280
+ }
281
  }
282
+ }?>
283
+ </select>
284
+ </div>
285
+ <div class="col-md-12 row">
286
+ <label class="form-group col-md-12 mt-2 mb-0 text-left font-weight-bold">Campaign duration: </label>
287
+ <p class="ml-3" style="text-align:left; font-size: 14px;">Your campaign will run until you pause it. You can pause your campaign at any time, however it can take up to 30 days for google to optimize your products and ads.</p>
288
+ </div>
289
+ </div>
290
+ <div class="col-12 row">
291
+ <button onclick="showLoader()" type="submit" class="btn btn-primary btn-success" id="update_campaign" name="update_campaign">Update Smart Shopping Campaign</button>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
292
  </div>
293
+ </form>
294
+ <hr>
295
+ <form method="post">
296
+ <div class="text-left">
297
+ <p style="font-size: 14px;">Please note that campaigns will be created with accounts configured in previous steps.</p>
298
+ <p style="font-size: 14px;"><span>Google Merchant Center : <?php echo $this->merchantId; ?></span>&nbsp;&nbsp;&nbsp;&nbsp;<span>Google Ads Account Id : <?php echo $this->currentCustomerId; ?></span></p>
299
+ </div>
300
+ </form>
301
+ <?php } ?>
302
+ </div>
303
+ <div class="col-md-6 col-lg-4">
304
+ <?php echo get_tvc_help_html(); ?>
305
  </div>
306
+ </div>
307
  </div>
308
+ </div>
309
+ </div>
310
+
311
+ <script>
312
+ $(document).ready(function() {
313
+ $('.select2').select2();
314
+ });
315
+ jQuery('.create-merchant-center').addClass('active');
316
+ jQuery('.create-google-ads').addClass('active');
317
+ jQuery('.sync-products').addClass('active');
318
+ jQuery('.create-smart-shopping').addClass('active');
319
+ function changeCategory() {
320
+ let dimension = jQuery('#dimension').val();
321
+ let level = jQuery('#dimension').find('option[value='+dimension+']'). attr('level');
322
+ jQuery('#category_level').val(level);
323
+ }
324
+ function selectCountry() {
325
+ var sales_country = document.getElementById('sales_country').value;
326
+ var customer_id = "<?php echo $this->currentCustomerId; ?>";
327
+ jQuery('#feed-spinner').css('display', 'block');
328
+ jQuery.post(
329
+ myAjaxNonces.ajaxurl,
330
+ {
331
+ action: 'tvcajax-get-campaign-categories',
332
+ countryCode: sales_country,
333
+ customerId: customer_id,
334
+ campaignCategoryListsNonce: myAjaxNonces.campaignCategoryListsNonce
335
+ },
336
+ function( response ) {
337
+
338
+ let categories = JSON.parse(response);
339
+ // callback( tvc_validateResponse( response ) );
340
+ jQuery('#dimension').html('');
341
+ jQuery.each(categories, function(key, category) {
342
+ jQuery('#dimension').append(jQuery('<option value='+category.id+' level='+category.level+'>'+category.name+'</option>'));
343
+ });
344
+ jQuery('#feed-spinner').css('display', 'none');
345
+ }
346
+ );
347
+ }
348
+ function showLoader() {
349
+ if($('#campaign-name').val()!=''&&$('#campaign-budget').val()!=''){
350
+ jQuery('#feed-spinner').css('display', 'block');
351
+ }
352
+ }
353
+ </script>
354
+ <?php
355
+ }
356
+ public function success_message($customerId) {
357
+ $class = 'notice notice-success';
358
+ $message = esc_html__($customerId . ' Set as default Ads Account ID.', 'sample-text-domain');
359
+ printf('<div class="%1$s"><p>%2$s</p></div>', esc_attr($class), esc_html($message));
360
+ }
361
+
362
+ public function success_messageV2($campaign_name, $status) {
363
+ $active = ($status == true) ? 'active' : 'inactive';
364
+ $class = 'notice notice-success';
365
+ //$message = esc_html__($campaign_name . ' Campaign Set as '.$active.'.', 'sample-text-domain');
366
+ // return '<div class='.$class.'><p>'.$campaign_name.' Campaign Set as '.$active.'</p></div>';
367
+ $message = $campaign_name . ' set as ' . $active;
368
+ return $message;
369
+ }
370
+
371
+ public function success_deleteMessage($campaign_name) {
372
+ //$active = ($status == true) ? 'active' : 'inactive';
373
+ $class = 'notice notice-success';
374
+ //$message = esc_html__($campaign_name . ' Campaign Set as '.$active.'.', 'sample-text-domain');
375
+ // return '<div class='.$class.'><p>'.$campaign_name.' Campaign Set as '.$active.'</p></div>';
376
+ $message = $campaign_name . ' is deleted successfully';
377
+ return $message;
378
+ }
379
+ }
includes/setup/class-tatvic-category-selector-element.php CHANGED
@@ -28,20 +28,10 @@ if ( ! class_exists( 'Tatvic_Category_Selector_Element' ) ) :
28
 
29
  $category_row_class = 'mapping' === $mode ? 'tvc-category-mapping-selector' : 'tvc-category-selector';
30
  $mode_column = 'mapping' === $mode ? self::category_mapping_selector( 'catmap', $category->term_id, true, $ee_prod_mapped_cats ) : self::category_description_data_item( $category->term_id );
31
- //print_r($ee_prod_mapped_cats);
32
-
33
- // return '<tr id="category-' . $category->term_id . '"><th class="check-column" scope="row" id="shop-category-selector">
34
- // <input class="' . $category_row_class . '" data-children="' . $category_children . '" id="feed-selector-' . $category->term_id . '"
35
- // type="checkbox" value="' . $category->term_id . '" title="Select ' . $category->name . '">
36
- // </th><td id="shop-category" class="col30w">' .
37
- // $level_indicator . $category->name .
38
- // '</td><td class="field-header col55w"><div id="feed-category-' . $category->term_id . '"></div>' .
39
- // $mode_column . '</td>
40
- // <td class="category-count col10w">' . $category->category_count . '</td></tr>';
41
  return '<div class="row">
42
- <div class="col-6 align-self-center">
43
- <div class="form-group" id="shop-category">
44
- <label class="form-label-control">' .$level_indicator . $category->name .'</label>
45
  </div>
46
  </div>
47
  <div class="col-6 align-self-center">
28
 
29
  $category_row_class = 'mapping' === $mode ? 'tvc-category-mapping-selector' : 'tvc-category-selector';
30
  $mode_column = 'mapping' === $mode ? self::category_mapping_selector( 'catmap', $category->term_id, true, $ee_prod_mapped_cats ) : self::category_description_data_item( $category->term_id );
 
 
 
 
 
 
 
 
 
 
31
  return '<div class="row">
32
+ <div class="col-6">
33
+ <div class="form-group shop-category">
34
+ <label class="form-label-control">' . $category->name . ' '.$level_indicator .'</label>
35
  </div>
36
  </div>
37
  <div class="col-6 align-self-center">
includes/setup/google-ads.php CHANGED
@@ -4,8 +4,10 @@ class GoogleAds {
4
  protected $url = "";
5
  protected $subscriptionId = "";
6
  protected $google_detail;
 
7
  public function __construct($theURL = '') {
8
  $this->TVC_Admin_Helper = new TVC_Admin_Helper();
 
9
  $this->url = $this->TVC_Admin_Helper->get_connect_url();
10
  $this->subscriptionId = $this->TVC_Admin_Helper->get_subscriptionId();
11
  $this->google_detail = $this->TVC_Admin_Helper->get_ee_options_data();
@@ -13,7 +15,9 @@ class GoogleAds {
13
  }
14
 
15
  public function create_form() {
 
16
  if (isset($_POST['google-add'])) {
 
17
  $googleDetail = $this->google_detail;
18
  $googleDetail_setting = $this->google_detail['setting'];
19
  if(isset($_POST['remarketing_tags'])){
@@ -36,10 +40,9 @@ class GoogleAds {
36
  $googleDetail_setting->link_google_analytics_with_google_ads = 0;
37
  }
38
  $googleDetail['setting'] =$googleDetail_setting;
39
- $this->TVC_Admin_Helper->set_ee_options_data($googleDetail);
40
- $class = 'notice notice-success';
41
- $message = esc_html__('The tracking options added successfully.');
42
- printf('<div class="%1$s"><p>%2$s</p></div>', esc_attr($class), esc_html($message));
43
  }
44
 
45
  $googleDetail = [];
@@ -47,138 +50,130 @@ class GoogleAds {
47
  if ($this->google_detail['setting']) {
48
  $googleDetail = $this->google_detail['setting'];
49
  }
50
- }?>
51
- <div class="container-fluid">
52
- <div class="row">
53
- <div class= "col col-12">
54
- <div class="card mw-100" style="padding: 0px;">
55
- <div class="card-body">
56
- <div class="tab-pane show active" id="googleAds">
57
- <div class="row">
58
- <div class="col-md-6 col-lg-8 border-right">
59
- <div class="licence">
60
- <p>You are using our free plugin, no licence needed ! Happy analyzing..!! :)</p>
61
- <p>To unlock more features of google products, consider our <a href="https://codecanyon.net/item/actionable-google-analytics-for-woocommerce/9899552?utm_source=TatvicEE&utm_medium=DashboardBuyBottom&utm_campaign=WPlisting" target="_blank" class="text-underline">pro version.</a></p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
  </div>
63
- <form method="post" name="google-analytic" class="tvc_ee_plugin_form">
64
- <input type="hidden" name="subscription_id" value="<?php echo (($this->subscriptionId)?$this->subscriptionId:"");?>">
65
- <div class="google-account-analytics">
66
- <div class="row mb-3">
67
- <div class="col-6 col-md-6">
68
- <h2 class="ga-title">Connected Google Ads account:</h2>
69
- </div>
70
- <div class="col-6 col-md-3">
71
- <p class="ga-text">
72
- <?php echo ((isset($googleDetail->google_ads_id) && $googleDetail->google_ads_id != '') ? $googleDetail->google_ads_id : '--'); ?>
73
- </p>
74
- </div>
75
- <div class="col-6 col-md-3">
76
- <?php
77
- if (isset($googleDetail->google_ads_id) && $googleDetail->google_ads_id != '') {
78
- echo '<p class="ga-text text-right">Click here to <a target="_blank" href="' . $this->url . '" class="text-underline">update</a></p>';
79
- } else {
80
- echo '<p class="ga-text text-right">Click here to <a href="#" class="text-underline" data-toggle="modal" data-target="#tvc_google_connect">connect</a></p>';
81
- }?>
82
- </div>
83
- </div>
84
- <div class="row mb-3">
85
- <div class="col-6 col-md-6">
86
- <h2 class="ga-title">Linked Google Analytics Account:</h2>
87
- </div>
88
- <div class="col-6 col-md-3">
89
- <p class="ga-text">
90
- <?php echo (isset($googleDetail->property_id) && $googleDetail->property_id != '' ? $googleDetail->property_id : '--');?>
91
- </p>
92
- </div>
93
- <div class="col-6 col-md-3">
94
- <?php
95
- if (isset($googleDetail->property_id) && $googleDetail->property_id != '') {
96
- echo '<p class="ga-text text-right">Click here to <a target="_blank" href="' . $this->url . '" class="text-underline">update</a></p>';
97
- } else {
98
- echo '<p class="ga-text text-right">Click here to <a href="#" class="text-underline" data-toggle="modal" data-target="#tvc_google_connect">connect</a></p>';
99
- } ?>
100
- </div>
101
- </div>
102
- <div class="row mb-3">
103
- <div class="col-6 col-md-6">
104
- <h2 class="ga-title">Linked Google Merchant Center Account:</h2>
105
- </div>
106
- <div class="col-6 col-md-3">
107
- <p class="ga-text"><?php echo (isset($googleDetail->google_merchant_center_id) && $googleDetail->google_merchant_center_id != '' ? $googleDetail->google_merchant_center_id : '--'); ?>
108
- </p>
109
- </div>
110
- <div class="col-6 col-md-3">
111
- <?php
112
- if (isset($googleDetail->google_merchant_center_id) && $googleDetail->google_merchant_center_id != '') {
113
- echo '<p class="ga-text text-right">Click here to <a target="_blank" href="' . $this->url . '" class="text-underline">update</a></p>';
114
- } else {
115
- echo '<p class="ga-text text-right">Click here to <a href="#" class="text-underline" data-toggle="modal" data-target="#tvc_google_connect">connect</a></p>';
116
- } ?>
117
- </div>
118
- </div>
119
- <?php
120
- if (isset($googleDetail->google_ads_id) && $googleDetail->google_ads_id != '') { ?>
121
- <div class="row">
122
- <div class="col-md-12">
123
- <div class="form-group">
124
- <div class="tvc-custom-control tvc-custom-checkbox">
125
- <input type="checkbox" class="tvc-custom-control-input" id="customCheck1" name="remarketing_tags" value="1" <?php echo ($googleDetail->remarketing_tags == 1) ? 'checked="checked"' : ''; ?> >
126
- <label class="tvc-custom-control-input" for="customCheck1">Enable remarketing tags</label>
127
- </div>
128
- </div>
129
- </div>
130
- <div class="col-md-12">
131
- <div class="form-group">
132
- <div class="tvc-custom-control tvc-custom-checkbox">
133
- <input type="checkbox" class="tvc-custom-control-input" id="customCheck2" name="dynamic_remarketing_tags" value="1" <?php echo ($googleDetail->dynamic_remarketing_tags == 1) ? 'checked="checked"' : ''; ?>>
134
- <label class="tvc-custom-control-input" for="customCheck2">Enable dynamic remarketing tags</label>
135
- </div>
136
- </div>
137
- </div>
138
- <div class="col-md-12">
139
- <div class="form-group">
140
- <div class="tvc-custom-control tvc-custom-checkbox">
141
- <input type="checkbox" class="tvc-custom-control-input" id="customCheck3" name="link_google_analytics_with_google_ads" value="1" <?php echo ($googleDetail->link_google_analytics_with_google_ads == 1) ? 'checked="checked"' : ''; ?> >
142
- <label class="tvc-custom-control-input" for="customCheck3">Link Google analytics with google ads</label>
143
- </div>
144
- </div>
145
- </div>
146
- </div>
147
- <?php
148
- }else{
149
- $icon_img ='<img src="'.ENHANCAD_PLUGIN_URL.'/admin/images/config-success.svg" alt="configuration success" class="config-success">';
150
- ?>
151
- <h2 class="ga-title">Connect Google Ads account to enable below features.</h2>
152
- <br>
153
- <ul>
154
- <li><?php echo $icon_img;?>Enable remarketing tags</li>
155
- <li><?php echo $icon_img;?>Enable dynamic remarketing tags</li>
156
- <li><?php echo $icon_img;?>Link Google analytics with google ads</li>
157
-
158
- </ul>
159
  <?php
 
 
 
 
160
  } ?>
161
  </div>
162
- <?php
163
- if (isset($googleDetail->google_ads_id) && $googleDetail->google_ads_id != '') { ?>
164
- <div class="text-left">
165
- <button type="submit" class="btn btn-primary btn-success" name="google-add">Save</button>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
166
  </div>
167
- <?php } ?>
168
- </form>
169
- </div>
170
- <div class="col-md-6 col-lg-4">
171
- <div class="right-content">
172
- <?php echo get_tvc_google_ads_help_html(); ?>
173
  </div>
174
  </div>
175
- </div>
176
- </div>
177
- </div>
178
- </div>
179
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
180
  </div>
181
- </div>
182
  <?php echo get_connect_google_popup_html();
183
  }
184
  }
4
  protected $url = "";
5
  protected $subscriptionId = "";
6
  protected $google_detail;
7
+ protected $customApiObj;
8
  public function __construct($theURL = '') {
9
  $this->TVC_Admin_Helper = new TVC_Admin_Helper();
10
+ $this->customApiObj = new CustomApi();
11
  $this->url = $this->TVC_Admin_Helper->get_connect_url();
12
  $this->subscriptionId = $this->TVC_Admin_Helper->get_subscriptionId();
13
  $this->google_detail = $this->TVC_Admin_Helper->get_ee_options_data();
15
  }
16
 
17
  public function create_form() {
18
+ $message = ""; $class="";
19
  if (isset($_POST['google-add'])) {
20
+ $response = $this->customApiObj->updateTrackingOption($_POST);
21
  $googleDetail = $this->google_detail;
22
  $googleDetail_setting = $this->google_detail['setting'];
23
  if(isset($_POST['remarketing_tags'])){
40
  $googleDetail_setting->link_google_analytics_with_google_ads = 0;
41
  }
42
  $googleDetail['setting'] =$googleDetail_setting;
43
+ $this->TVC_Admin_Helper->set_ee_options_data($googleDetail);
44
+ $class = 'alert-message tvc-alert-success';
45
+ $message = esc_html__('Your tracking options have been saved.');
 
46
  }
47
 
48
  $googleDetail = [];
50
  if ($this->google_detail['setting']) {
51
  $googleDetail = $this->google_detail['setting'];
52
  }
53
+ }
54
+ ?>
55
+ <div class="tab-content">
56
+ <?php if($message){
57
+ printf('<div class="%1$s"><div class="alert">%2$s</div></div>', esc_attr($class), esc_html($message));
58
+ }?>
59
+ <div class="tab-pane show active" id="googleAds">
60
+ <div class="tab-card" >
61
+ <div class="row">
62
+ <div class="col-md-6 col-lg-8 border-right">
63
+ <form method="post" name="google-analytic" class="tvc_ee_plugin_form">
64
+ <input type="hidden" name="subscription_id" value="<?php echo (($this->subscriptionId)?$this->subscriptionId:"");?>">
65
+ <div class="google-account-analytics">
66
+ <div class="row mb-3">
67
+ <div class="col-6 col-md-6 col-lg-6">
68
+ <h2 class="ga-title">Connected Google Ads account:</h2>
69
+ </div>
70
+ <div class="col-6 col-md-6 col-lg-6 text-right">
71
+ <div class="acc-num">
72
+ <p class="ga-text">
73
+ <?php echo ((isset($googleDetail->google_ads_id) && $googleDetail->google_ads_id != '') ? $googleDetail->google_ads_id : '<span>Get started</span>'); ?>
74
+ </p>
75
+ <?php
76
+ if (isset($googleDetail->google_ads_id) && $googleDetail->google_ads_id != '') {
77
+ echo '<p class="ga-text text-right"><a target="_blank" href="' . $this->url . '" class="text-underline"><img src="'. ENHANCAD_PLUGIN_URL.'/admin/images/icon/refresh.svg" alt="refresh"/></a></p>';
78
+ } else {
79
+ echo '<p class="ga-text text-right"><a href="#" class="text-underline" data-toggle="modal" data-target="#tvc_google_connect"><img src="'. ENHANCAD_PLUGIN_URL.'/admin/images/icon/add.svg" alt="connect account"/></a></p>';
80
+ }?>
81
+ </div>
82
+ </div>
83
+
84
  </div>
85
+ <div class="row mb-3">
86
+ <div class="col-6 col-md-6 col-lg-6">
87
+ <h2 class="ga-title">Linked Google Analytics Account:</h2>
88
+ </div>
89
+ <div class="col-6 col-md-6 col-lg-6 text-right">
90
+ <div class="acc-num">
91
+ <p class="ga-text">
92
+ <?php echo (isset($googleDetail->property_id) && $googleDetail->property_id != '' ? $googleDetail->property_id : '<span>Get started</span>');?>
93
+ </p>
94
+ <?php
95
+ if(isset($googleDetail->property_id) && $googleDetail->property_id != ''){
96
+ echo '<p class="ga-text text-right"><a target="_blank" href="' . $this->url . '" class="text-underline"><img src="'. ENHANCAD_PLUGIN_URL.'/admin/images/icon/refresh.svg" alt="refresh"/></a></p>';
97
+ }else{
98
+ echo '<p class="ga-text text-right"><a href="#" class="text-underline" data-toggle="modal" data-target="#tvc_google_connect"><img src="'. ENHANCAD_PLUGIN_URL.'/admin/images/icon/add.svg" alt="connect account"/></a></p>';
99
+ } ?>
100
+ </div>
101
+ </div>
102
+ </div>
103
+ <div class="row mb-3">
104
+ <div class="col-6 col-md-6 col-lg-6">
105
+ <h2 class="ga-title">Linked Google Merchant Center Account:</h2>
106
+ </div>
107
+ <div class="col-6 col-md-6 col-lg-6 text-right">
108
+ <div class="acc-num">
109
+ <p class="ga-text"><?php echo (isset($googleDetail->google_merchant_center_id) && $googleDetail->google_merchant_center_id != '' ? $googleDetail->google_merchant_center_id : '<span>Get started</span>'); ?>
110
+ </p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
  <?php
112
+ if (isset($googleDetail->google_merchant_center_id) && $googleDetail->google_merchant_center_id != '') {
113
+ echo '<p class="ga-text text-right"><a target="_blank" href="' . $this->url . '" class="text-underline"><img src="'. ENHANCAD_PLUGIN_URL.'/admin/images/icon/refresh.svg" alt="refresh"/></a></p>';
114
+ } else {
115
+ echo '<p class="ga-text text-right"><a href="#" class="text-underline" data-toggle="modal" data-target="#tvc_google_connect"><img src="'. ENHANCAD_PLUGIN_URL.'/admin/images/icon/add.svg" alt="connect account"/></a></p>';
116
  } ?>
117
  </div>
118
+ </div>
119
+ </div>
120
+ <?php
121
+ if (isset($googleDetail->google_ads_id) && $googleDetail->google_ads_id != '') { ?>
122
+ <div class="row">
123
+ <div class="col-md-12">
124
+ <div class="form-group">
125
+ <div class="tvc-custom-control tvc-custom-checkbox">
126
+ <input type="checkbox" class="tvc-custom-control-input" id="customCheck1" name="remarketing_tags" value="1" <?php echo ($googleDetail->remarketing_tags == 1) ? 'checked="checked"' : ''; ?> >
127
+ <label class="custom-control-label" for="customCheck1">Enable remarketing tags</label>
128
+ </div>
129
+ </div>
130
+ </div>
131
+ <div class="col-md-12">
132
+ <div class="form-group">
133
+ <div class="tvc-custom-control tvc-custom-checkbox">
134
+ <input type="checkbox" class="tvc-custom-control-input" id="customCheck2" name="dynamic_remarketing_tags" value="1" <?php echo ($googleDetail->dynamic_remarketing_tags == 1) ? 'checked="checked"' : ''; ?>>
135
+ <label class="custom-control-label" for="customCheck2">Enable dynamic remarketing tags</label>
136
+ </div>
137
+ </div>
138
+ </div>
139
+ <div class="col-md-12">
140
+ <div class="form-group">
141
+ <div class="tvc-custom-control tvc-custom-checkbox">
142
+ <input type="checkbox" class="tvc-custom-control-input" id="customCheck3" name="link_google_analytics_with_google_ads" value="1" <?php echo ($googleDetail->link_google_analytics_with_google_ads == 1) ? 'checked="checked"' : ''; ?> >
143
+ <label class="custom-control-label" for="customCheck3">Link Google analytics with google ads</label>
144
+ </div>
145
  </div>
 
 
 
 
 
 
146
  </div>
147
  </div>
148
+ <?php
149
+ }else{
150
+ $icon_img ='<img src="'.ENHANCAD_PLUGIN_URL.'/admin/images/config-success.svg" alt="configuration success" class="config-success">';
151
+ ?>
152
+ <h2 class="ga-title">Connect Google Ads account to enable below features.</h2>
153
+ <br>
154
+ <ul>
155
+ <li><?php echo $icon_img;?>Enable remarketing tags</li>
156
+ <li><?php echo $icon_img;?>Enable dynamic remarketing tags</li>
157
+ <li><?php echo $icon_img;?>Link Google analytics with google ads</li>
158
+ </ul>
159
+ <?php
160
+ } ?>
161
+ </div>
162
+ <?php
163
+ if (isset($googleDetail->google_ads_id) && $googleDetail->google_ads_id != '') { ?>
164
+ <div class="text-left">
165
+ <button type="submit" id="google-add" class="btn btn-primary btn-success" name="google-add">Save</button>
166
+ </div>
167
+ <?php } ?>
168
+ </form>
169
+ </div>
170
+ <div class="col-md-6 col-lg-4">
171
+ <?php echo get_tvc_google_ads_help_html(); ?>
172
+ </div>
173
+ </div>
174
+ </div>
175
  </div>
176
+ </div>
177
  <?php echo get_connect_google_popup_html();
178
  }
179
  }
includes/setup/google-shopping-feed-gaa-config.php CHANGED
@@ -16,7 +16,7 @@ class GAAConfiguration {
16
  $this->subscriptionId = $this->TVC_Admin_Helper->get_subscriptionId();
17
  $this->country = $this->TVC_Admin_Helper->get_woo_country();
18
  $this->site_url = "admin.php?page=enhanced-ecommerce-google-analytics-admin-display&tab=";
19
- $this->url = $this->TVC_Admin_Helper->get_connect_url();
20
  $this->html_run();
21
  }
22
  public function includes() {
@@ -31,11 +31,10 @@ class GAAConfiguration {
31
  }
32
 
33
  public function wooCommerceAttributes() {
34
- $queries = new TVC_Queries();
35
  global $wpdb;
36
  $tve_table_prefix = $wpdb->prefix;
37
- $column1 = json_decode(json_encode($queries->getTableColumns($tve_table_prefix.'posts')), true);
38
- $column2 = json_decode(json_encode($queries->getTableData($tve_table_prefix.'postmeta', ['meta_key'])), true);
39
  return array_merge($column1, $column2);
40
  }
41
 
@@ -62,104 +61,102 @@ class GAAConfiguration {
62
  $googleDetail = $google_detail['setting'];
63
  }
64
  }?>
65
- <div class="container-fluid">
66
- <div class="row">
67
- <div class= "col col-12">
68
- <div class="card mw-100" style="padding:0;">
69
- <div class="card-body">
70
- <div class="tab-pane show active" id="googleShoppingFeed">
71
- <div class="row">
72
- <div class="col-md-6 col-lg-8 border-right">
73
- <div class="configuration-section" id="config-pt1">
74
- <?php echo get_google_shopping_tabs_html($this->site_url,(isset($googleDetail->google_merchant_center_id))?$googleDetail->google_merchant_center_id:""); ?>
75
- </div>
76
- <div class="mt-3" id="config-pt2">
77
- <div class="google-account-analytics" id="gaa-config">
78
- <div class="licence">
79
- <p>You are using our free plugin, no licence needed ! Happy analyzing..!! :)</p>
80
- <p>To unlock more features of google products, consider our <a href="https://codecanyon.net/item/actionable-google-analytics-for-woocommerce/9899552?utm_source=TatvicEE&utm_medium=DashboardBuyBottom&utm_campaign=WPlisting" target="_blank" class="text-underline">pro version.</a></p>
81
- </div>
82
- <div class="row mb-3">
83
- <div class="col-6 col-md-6">
84
- <h2 class="ga-title">Connected Google Merchant center account:</h2>
85
- </div>
86
- <div class="col-6 col-md-3">
87
- <p class="ga-text"><?php echo (isset($googleDetail->google_merchant_center_id) && $googleDetail->google_merchant_center_id != '' ? $googleDetail->google_merchant_center_id : 'N/A'); ?></p>
88
- </div>
89
- <div class="col-6 col-md-3">
90
- <?php
91
  if(isset($googleDetail->google_merchant_center_id) && $googleDetail->google_merchant_center_id != ''){
92
- echo '<p class="ga-text text-right">Click here to <a target="_blank" href="' . $this->url . '" class="text-underline">update</a></p>';
93
  }else{
94
- echo '<p class="ga-text text-right">Click here to <a href="#" class="text-underline" data-toggle="modal" data-target="#tvc_google_connect">connect</a></p>';
95
  }?>
96
- </div>
97
- </div>
98
- <div class="row mb-3">
99
- <div class="col-6 col-md-6">
100
- <h2 class="ga-title">Linked Google Ads Account:</h2>
101
- </div>
102
- <div class="col-6 col-md-3">
103
- <p class="ga-text"><?php echo (isset($googleDetail->google_ads_id) && $googleDetail->google_ads_id != '' ? $googleDetail->google_ads_id : 'N/A');?></p>
104
- </div>
105
- <div class="col-6 col-md-3">
106
- <?php
107
- if (isset($googleDetail->google_ads_id) && $googleDetail->google_ads_id != '') {
108
- echo '<p class="ga-text text-right">Click here to <a target="_blank" href="' . $this->url . '" class="text-underline">update</a></p>';
109
- } else {
110
- echo '<p class="ga-text text-right">Click here to <a href="#" data-toggle="modal" data-target="#tvc_google_connect" class="text-underline">connect</a></p>';
111
- } ?>
112
- </div>
113
- </div>
114
  <?php
115
- if (isset($googleDetail->google_merchant_center_id) && $googleDetail->google_merchant_center_id != '') {?>
116
- <div class="row mb-3">
117
- <div class="col-6 col-md-6">
118
- <h2 class="ga-title">Sync Products:</h2>
119
- </div>
120
- <div class="col-6 col-md-6">
121
- <button id="tvc_btn_product_sync" type="button" class="btn btn-primary btn-success" data-toggle="modal" data-target="#syncProduct">Sync New Products</button>
122
- </div>
123
- </div>
124
- <div class="row mb-3">
125
- <div class="col-6 col-md-6">
126
- <h2 class="ga-title">Smart Shopping Campaigns:</h2>
127
- </div>
128
- <div class="col-6 col-md-6">
129
- <a href="admin.php?page=enhanced-ecommerce-google-analytics-admin-display&tab=add_campaign_page" class="btn btn-primary btn-success">Create Smart Shopping Campaign</a>
130
- </div>
131
- </div>
132
- <?php }else{ ?>
133
- <div class="row mb-3">
134
- <div class="col-6 col-md-6">
135
- <h2 class="ga-title">Sync Products:</h2>
136
- </div>
137
- <div class="col-6 col-md-6">
138
- <button type="button" class="btn btn-primary btn-success" data-toggle="modal" data-target="#tvc_google_connect">Sync New Products</button>
139
- </div>
140
- </div>
141
- <div class="row mb-3">
142
- <div class="col-6 col-md-6">
143
- <h2 class="ga-title">Smart Shopping Campaigns:</h2>
144
- </div>
145
- <div class="col-6 col-md-6">
146
- <a href="#" class="btn btn-primary btn-success" data-toggle="modal" data-target="#tvc_google_connect">Create Smart Shopping Campaign</a>
147
- </div>
148
- </div>
149
- <?php } ?>
150
- </div>
151
  </div>
152
  </div>
153
- <div class="col-md-6 col-lg-4">
154
- <div class="right-content"> <?php echo get_tvc_help_html(); ?></div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
155
  </div>
156
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
157
  </div>
158
- </div>
159
- </div>
160
- </div>
 
 
 
161
  </div>
162
  </div>
 
163
  <div class="modal fade popup-modal create-campa overlay" id="syncProduct" data-backdrop="false">
164
  <div class="modal-dialog modal-dialog-centered">
165
  <div class="modal-content">
@@ -205,8 +202,12 @@ class GAAConfiguration {
205
  echo '<div class="row">
206
  <div class="col-6 align-self-center">
207
  <div class="form-group">
208
- <span class="td-head">' . $attribute["field"] . " " . (isset($attribute["required"]) && $attribute["required"] == 1 ? '<span style="color: red;"> *</span>' : "") . '</span>
209
- <small class="form-label-control">' . (isset($attribute["desc"])? $attribute["desc"]:"") . '</small>
 
 
 
 
210
  </div>
211
  </div>
212
  <div class="col-6 align-self-center">
@@ -359,7 +360,7 @@ function submitProductSyncUp() {
359
  window.location.replace("<?php echo $this->site_url.'sync_product_page'; ?>");
360
  }, 7000);
361
  } else {
362
- vc_helper.tvc_alert("error","",rsp.message);
363
  }
364
  }
365
  );
16
  $this->subscriptionId = $this->TVC_Admin_Helper->get_subscriptionId();
17
  $this->country = $this->TVC_Admin_Helper->get_woo_country();
18
  $this->site_url = "admin.php?page=enhanced-ecommerce-google-analytics-admin-display&tab=";
19
+ $this->url = $this->TVC_Admin_Helper->get_connect_url();
20
  $this->html_run();
21
  }
22
  public function includes() {
31
  }
32
 
33
  public function wooCommerceAttributes() {
 
34
  global $wpdb;
35
  $tve_table_prefix = $wpdb->prefix;
36
+ $column1 = json_decode(json_encode($this->TVC_Admin_Helper->getTableColumns($tve_table_prefix.'posts')), true);
37
+ $column2 = json_decode(json_encode($this->TVC_Admin_Helper->getTableData($tve_table_prefix.'postmeta', ['meta_key'])), true);
38
  return array_merge($column1, $column2);
39
  }
40
 
61
  $googleDetail = $google_detail['setting'];
62
  }
63
  }?>
64
+ <div class="tab-content">
65
+ <div class="tab-pane show active" id="googleShoppingFeed">
66
+ <div class="tab-card">
67
+ <div class="row">
68
+ <div class="col-md-6 col-lg-8 edit-section">
69
+ <div class="edit-header-section">
70
+ <script>
71
+ var back_img = '<img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/left-angle-arrow.svg'; ?>" alt="back"/>';
72
+ document.write('<a href="' + document.referrer + '" class="back-btn">'+back_img+'<span>Back</span></a>');
73
+ </script>
74
+ </div>
75
+ <div class="configuration-section" id="config-pt1">
76
+ <?php echo get_google_shopping_tabs_html($this->site_url,(isset($googleDetail->google_merchant_center_id))?$googleDetail->google_merchant_center_id:""); ?>
77
+ </div>
78
+ <div class="mt-3" id="config-pt2">
79
+ <div class="google-account-analytics" id="gaa-config">
80
+ <div class="row mb-3">
81
+ <div class="col-6 col-md-6 col-lg-6">
82
+ <h2 class="ga-title">Connected Google Merchant center account:</h2>
83
+ </div>
84
+ <div class="col-6 col-md-6 col-lg-6 text-right">
85
+ <div class="acc-num">
86
+ <p class="ga-text"><?php echo ((isset($googleDetail->google_merchant_center_id) && $googleDetail->google_merchant_center_id != '') ? $googleDetail->google_merchant_center_id : '<span>Get started</span>'); ?></p>
87
+ <?php
 
 
88
  if(isset($googleDetail->google_merchant_center_id) && $googleDetail->google_merchant_center_id != ''){
89
+ echo '<p class="ga-text text-right"><a target="_blank" href="' . $this->url . '" class="text-underline"><img src="'. ENHANCAD_PLUGIN_URL.'/admin/images/icon/refresh.svg" alt="refresh"/></a></p>';
90
  }else{
91
+ echo '<p class="ga-text text-right"><a href="#" class="text-underline" data-toggle="modal" data-target="#tvc_google_connect"><img src="'. ENHANCAD_PLUGIN_URL.'/admin/images/icon/add.svg" alt="connect account"/></a></p>';
92
  }?>
93
+ </div>
94
+ </div>
95
+
96
+ </div>
97
+ <div class="row mb-3">
98
+ <div class="col-6 col-md-6 col-lg-6">
99
+ <h2 class="ga-title">Linked Google Ads Account:</h2>
100
+ </div>
101
+ <div class="col-6 col-md-6 col-lg-6 text-right">
102
+ <div class="acc-num">
103
+ <p class="ga-text"><?php echo (isset($googleDetail->google_ads_id) && $googleDetail->google_ads_id != '' ? $googleDetail->google_ads_id : '<span>Get started</span>');?></p>
 
 
 
 
 
 
 
104
  <?php
105
+ if (isset($googleDetail->google_ads_id) && $googleDetail->google_ads_id != '') {
106
+ echo '<p class="ga-text text-right"><a target="_blank" href="' . $this->url . '" class="text-underline"><img src="'. ENHANCAD_PLUGIN_URL.'/admin/images/icon/refresh.svg" alt="refresh"/></a></p>';
107
+ } else {
108
+ echo '<p class="ga-text text-right"><a href="#" data-toggle="modal" data-target="#tvc_google_connect" class="text-underline"><img src="'. ENHANCAD_PLUGIN_URL.'/admin/images/icon/add.svg" alt="connect account"/></a></p>';
109
+ } ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
110
  </div>
111
  </div>
112
+ </div>
113
+ <?php
114
+ if (isset($googleDetail->google_merchant_center_id) && $googleDetail->google_merchant_center_id != '') {?>
115
+ <div class="row mb-3">
116
+ <div class="col-6 col-md-4">
117
+ <h2 class="ga-title">Sync Products:</h2>
118
+ </div>
119
+ <div class="col-6 col-md-4">
120
+ <button id="tvc_btn_product_sync" type="button" class="btn btn-primary btn-success" data-toggle="modal" data-target="#syncProduct">Sync New Products</button>
121
+ </div>
122
+ </div>
123
+ <div class="row mb-3">
124
+ <div class="col-6 col-md-4">
125
+ <h2 class="ga-title">Smart Shopping Campaigns:</h2>
126
+ </div>
127
+ <div class="col-6 col-md-6">
128
+ <a href="admin.php?page=enhanced-ecommerce-google-analytics-admin-display&tab=add_campaign_page" class="btn btn-primary btn-success">Create Smart Shopping Campaign</a>
129
  </div>
130
  </div>
131
+ <?php }else{ ?>
132
+ <div class="row mb-3">
133
+ <div class="col-6 col-md-4">
134
+ <h2 class="ga-title">Sync Products:</h2>
135
+ </div>
136
+ <div class="col-6 col-md-4">
137
+ <button type="button" class="btn btn-primary btn-success" data-toggle="modal" data-target="#tvc_google_connect">Sync New Products</button>
138
+ </div>
139
+ </div>
140
+ <div class="row mb-3">
141
+ <div class="col-6 col-md-4">
142
+ <h2 class="ga-title">Smart Shopping Campaigns:</h2>
143
+ </div>
144
+ <div class="col-6 col-md-6">
145
+ <a href="#" class="btn btn-primary btn-success" data-toggle="modal" data-target="#tvc_google_connect">Create Smart Shopping Campaign</a>
146
+ </div>
147
+ </div>
148
+ <?php } ?>
149
+ </div>
150
  </div>
151
+ </div>
152
+ <div class="col-md-6 col-lg-4">
153
+ <?php echo get_tvc_help_html(); ?>
154
+ </div>
155
+ </div>
156
+ </div>
157
  </div>
158
  </div>
159
+
160
  <div class="modal fade popup-modal create-campa overlay" id="syncProduct" data-backdrop="false">
161
  <div class="modal-dialog modal-dialog-centered">
162
  <div class="modal-content">
202
  echo '<div class="row">
203
  <div class="col-6 align-self-center">
204
  <div class="form-group">
205
+ <span class="td-head">' . $attribute["field"] . " " . (isset($attribute["required"]) && $attribute["required"] == 1 ? '<span style="color: red;"> *</span>' : "") . '
206
+ <div class="tvc-tooltip">
207
+ <span class="tvc-tooltiptext tvc-tooltip-right">'.(isset($attribute["desc"])? $attribute["desc"]:"") .'</span>
208
+ <img src="'. ENHANCAD_PLUGIN_URL.'/admin/images/icon/informationI.svg" alt=""/>
209
+ </div>
210
+ </span>
211
  </div>
212
  </div>
213
  <div class="col-6 align-self-center">
360
  window.location.replace("<?php echo $this->site_url.'sync_product_page'; ?>");
361
  }, 7000);
362
  } else {
363
+ tvc_helper.tvc_alert("error","",rsp.message);
364
  }
365
  }
366
  );
includes/setup/google-shopping-feed-shopping-campaigns.php CHANGED
@@ -2,156 +2,141 @@
2
 
3
  class CampaignsConfiguration
4
  {
5
- public $merchantId;
6
-
7
- public $customApiObj;
8
-
9
- public function __construct()
10
- {
11
- $this->includes();
12
- $this->returnUrl = $_SERVER['REQUEST_URI'];
13
- $this->url = "https://".TVC_AUTH_CONNECT_URL."/config/ga_rdr_gmc.php?return_url=" . $_SERVER['HTTP_HOST'] . $this->returnUrl;
14
-
15
- $this->customApiObj = new CustomApi();
16
- //$this->customApiObj->getGoogleAnalyticDetail();
17
-
18
- $this->merchantId = (isset($GLOBALS['tatvicData']['tvc_merchant'])) ? $GLOBALS['tatvicData']['tvc_merchant']:"";
19
- $this->currentCustomerId = (isset($GLOBALS['tatvicData']['tvc_customer'])) ? $GLOBALS['tatvicData']['tvc_customer']:"";
20
-
21
- $this->subscriptionId = (isset($GLOBALS['tatvicData']['tvc_subscription'])) ? $GLOBALS['tatvicData']['tvc_subscription']:"";
22
- $this->new_campaign = true;
23
- $this->date_range_type = isset($_POST['customRadio']) ? $_POST['customRadio'] : 1;
24
- $this->days = (isset($_POST['days']) && $_POST['days'] != '') ? $_POST['days'] : 7;
25
- $this->from_date = (isset($_POST['from_date']) && $_POST['from_date'] != '') ? $_POST['from_date'] : "";
26
- $this->to_date = (isset($_POST['to_date']) && $_POST['to_date'] != '') ? $_POST['to_date'] : "";
27
- $this->country = (isset($GLOBALS['tatvicData']['tvc_country'])) ? $GLOBALS['tatvicData']['tvc_country']:"";
28
- $this->site_url = "admin.php?page=enhanced-ecommerce-google-analytics-admin-display&tab=";
29
-
30
-
31
- $this->html_run();
 
 
 
 
32
  }
33
-
34
- public function includes()
35
- {
36
- if (!class_exists('CustomApi.php')) {
37
- require_once(__DIR__ . '/CustomApi.php');
38
- }
39
- if (!class_exists('ShoppingApi')) {
40
- require_once(__DIR__ . '/ShoppingApi.php');
41
- }
42
- if (!class_exists('Tatvic_Category_Wrapper')) {
43
- require_once(__DIR__ . '/tatvic-category-wrapper.php');
44
- }
45
  }
46
-
47
- public function html_run()
48
- {
49
- $this->spinner();
50
- $this->create_form();
51
  }
52
-
53
- public function spinner()
54
- {
55
- $spinner_gif = ENHANCAD_PLUGIN_URL . '/admin/images/ajax-loader.gif';
56
- echo '<div class="feed-spinner" id="feed-spinner" style="display:none;">
57
- <img id="img-spinner" src="' . $spinner_gif . '" alt="Loading" />
58
- </div>';
 
 
 
 
 
 
 
59
  }
60
 
61
- public function create_form()
62
- {
63
-
64
- $date_range_type = isset($_POST['customRadio']) ? $_POST['customRadio'] : 1;
65
  $days = (isset($_POST['days']) && $_POST['days'] != '') ? $_POST['days'] : 7;
66
  $from_date = (isset($_POST['from_date']) && $_POST['from_date'] != '') ? $_POST['from_date'] : "";
67
  $to_date = (isset($_POST['to_date']) && $_POST['to_date'] != '') ? $_POST['to_date'] : "";
68
-
69
- $campaigns_list = [];
70
- $categories = [];
71
- $campaign_performance = [];
72
- $account_performance = [];
73
- $product_performance = [];
74
- $product_partition_performance = [];
75
  $api_old_obj = new ShoppingApi();
76
 
77
- $campaigns_list_res = $api_old_obj->getCampaigns();
78
-
79
- if (isset($campaigns_list_res->errors) && !empty($campaigns_list_res->errors)) {
80
- $class = 'notice notice-error';
81
- $message = esc_html__('Not any campaigns found.');
82
- printf('<div class="%1$s"><p>%2$s</p></div>', esc_attr($class), esc_html($message));
83
- } else {
84
-
85
- $campaigns_list_res = $campaigns_list_res->data;
86
-
87
- if ($campaigns_list_res['status'] == 200) {
88
- $campaigns_list = $campaigns_list_res['data'];
89
- }
90
- }
91
-
 
92
  if(count($campaigns_list) > 0) {
93
- //Account Performance
94
- $account_performance_res = $api_old_obj->accountPerformance($this->date_range_type, $this->days, $this->from_date, $this->to_date);
95
- if (isset($account_performance_res->errors) && !empty($account_performance_res->errors)) {
96
-
97
- } else {
98
- $account_performance_res = $account_performance_res->data;
99
- if ($account_performance_res['status'] == 200) {
100
- $account_performance = $account_performance_res['data'];
101
- }
102
- }
103
-
104
- // Count account performance
105
- $totalConversion = 0;
106
- if (!empty($account_performance->dailyConversions)) {
107
- foreach ($account_performance->dailyConversions as $key => $dailyConversion) {
108
- $totalConversion = $totalConversion + $dailyConversion->conversions;
109
- }
110
- }
111
-
112
- $totalSale = 0;
113
- if (!empty($account_performance->dailySales)) {
114
- foreach ($account_performance->dailySales as $key => $dailySale) {
115
- $totalSale = $totalSale + $dailySale->sales;
116
- }
117
- }
118
-
119
- $totalCost = 0;
120
- if (!empty($account_performance->dailyCost)) {
121
- foreach ($account_performance->dailyCost as $key => $dailyCostData) {
122
- $totalCost = $totalCost + $dailyCostData->costs;
123
- }
124
- }
125
-
126
- $totalClick = 0;
127
- if (!empty($account_performance->dailyClicks)) {
128
- foreach ($account_performance->dailyClicks as $key => $dailyClick) {
129
- $totalClick = $totalClick + $dailyClick->clicks;
130
- }
131
- }
132
-
133
- //Campaign Performance
134
- $campaign_performance_res = $api_old_obj->campaignPerformance($this->date_range_type, $this->days, $this->from_date, $this->to_date);
135
-
136
- if (isset($campaign_performance_res->errors) && !empty($campaign_performance_res->errors)) {
137
-
138
- } else {
139
- $campaign_performance_res = $campaign_performance_res->data;
140
- if ($campaign_performance_res['status'] == 200) {
141
- $campaign_performance = $campaign_performance_res['data'];
142
- }
143
- }
144
  }else if(isset($_GET['id']) && $_GET['id'] != '') {
145
  //Product Performance
146
  $product_performance_res = $api_old_obj->productPerformance($_GET['id'], $this->date_range_type, $this->days, $this->from_date, $this->to_date);
147
 
148
  if (isset($product_performance_res->errors) && !empty($product_performance_res->errors)) {
149
 
150
- } else {
151
- $product_performance_res = $product_performance_res->data;
152
- if ($product_performance_res['status'] == 200) {
153
- $product_performance = $product_performance_res['data'];
154
- }
155
  }
156
 
157
  //Product Partition Performance
@@ -159,578 +144,554 @@ class CampaignsConfiguration
159
 
160
  if (isset($product_partition_performance_res->errors) && !empty($product_partition_performance_res->errors)) {
161
 
162
- } else {
163
- $product_partition_performance_res = $product_partition_performance_res->data;
164
- if ($product_partition_performance_res['status'] == 200) {
165
- $product_partition_performance = $product_partition_performance_res['data'];
166
- }
167
  }
168
  }
169
-
170
- $google_detail = $this->customApiObj->getGoogleAnalyticDetail();
171
- if (isset($google_detail->data['status']) && $google_detail->data['status'] == 200) {
172
- if (isset($google_detail->data['data'])) {
173
- $googleDetail = $google_detail->data['data'];
174
- }
175
- } else {
176
- $googleDetail = [];
177
- $class = 'notice notice-error';
178
- $message = esc_html__('Google analytic detail is empty.');
179
- printf('<div class="%1$s"><p>%2$s</p></div>', esc_attr($class), esc_html($message));
180
- }
181
-
182
- echo '<div class="container-fluid">
183
- <div class="row">
184
- <div class= "col col-12">
185
- <div class="card mw-100" style="padding:0;">
186
- <div class="card-body">
187
- <div class="tab-pane show active" id="googleShoppingFeed">
188
- <div class="row">
189
- <div class="col-md-6 col-lg-8 border-right">
190
- <div class="configuration-section" id="config-pt1">
191
- '.get_google_shopping_tabs_html($this->site_url,(isset($googleDetail->google_merchant_center_id))?$googleDetail->google_merchant_center_id:"").'
192
- </div>
193
- <div class="mt-3" id="config-pt2">
194
- <form method="post" id="date_range_form">
195
- <div class="campaigns" id="camp">
196
- <div class="row">
197
- <div class="col-md-5">
198
- <h3 class="title">Smart Shopping Campaigns</h3>
199
- </div>
200
- <div class="col-md-7">
201
- <div class="campaign-date">
202
- <h4 class="sub-title">Date Range:</h4>
203
- <div class="radio-buttons">
204
- <div class="custom-control custom-radio form-group">
205
- <input type="radio" id="customRange1" name="customRadio" value="1" class="custom-control-input"'; echo $this->date_range_type == 1 ? "checked" : ""; echo ' >
206
- <label class="custom-control-label" for="customRange1">
207
- <select name="days" class="form-control select2" onchange="date_range_select()">
208
- <option value="7" '; echo $this->days == 7 ? "selected" : "active"; echo '>Last 7 Days</option>
209
- <option value="14" '; echo $this->days == 14 ? "selected" : "active"; echo '>Last 14 days</option>
210
- <option value="30" '; echo $this->days == 30 ? "selected" : "active"; echo '>Last 30 days</option>
211
- <option value="last_month" '; echo $this->days == "last_month" ? "selected" : "active"; echo '>Last month</option>
212
- <option value="this_month" '; echo $this->days == "this_month" ? "selected" : "active"; echo '>This month</option>
213
- </select>
214
- </label>
215
- </div>
216
- <div class="custom-control custom-radio form-group mb-0">
217
- <input type="radio" id="customRange2" name="customRadio" value="2" class="custom-control-input"'; echo $this->date_range_type == 2 ? "checked" : ""; echo ' >
218
- <label class="custom-control-label" for="customRange2">
219
- <div class="input-group input-daterange">
220
- <div class="input-group-addon pr-3 text">From</div>
221
- <input type="text" class="form-control" id="from_date" name="from_date" value="'.$this->from_date.'">
222
- <div class="input-group-addon text px-3">to</div>
223
- <input type="text" class="form-control" id="to_date" name="to_date" value="'.$this->to_date.'">
224
- </div>
225
- </label>
226
- </div>
227
- </div>
228
- <label class="mt-2 mb-2 error-msg float-left hidden" id="errorMessage">Please select both from and to date</label>
229
- <button type="button" class="btn btn-primary btn-success btn-sm" onclick="validateAll()" id="select_range" name="select_range">Submit</button>
230
- </div>
231
- </div>
232
- </div>
233
- </div>
234
- </form>';
235
- if(!isset($_GET['id'])) {
236
- echo '<div class="account-performance">
237
- <div class="row">
238
- <div class="col-md-12">
239
- <h3 class="title">Account Performance</h3>
240
- </div>
241
- <div class="col-md-6">
242
- <div class="chart">
243
- <h4 class="sub-title">Daily Clicks</h4>
244
- <canvas id="dailyClick" width="400" height="400"></canvas>
245
- </div>
246
- </div>
247
- <div class="col-md-6">
248
- <div class="chart">
249
- <h4 class="sub-title">Daily Cost</h4>
250
- <canvas id="dailyCost" width="400" height="400"></canvas>
251
- </div>
252
- </div>
253
- <div class="col-md-6">
254
- <div class="chart">
255
- <h4 class="sub-title">Daily Conversions</h4>
256
- <canvas id="dailyConversions" width="400" height="400"></canvas>
257
- </div>
258
- </div>
259
- <div class="col-md-6">
260
- <div class="chart">
261
- <h4 class="sub-title">Daily Sales</h4>
262
- <canvas id="dailySales" width="400" height="400"></canvas>
263
- </div>
264
- </div>
265
- </div>
266
- </div>
267
- <div class="account-performance">
268
- <div class="row">
269
- <div class="col-md-12">
270
- <h3 class="title">Campaign Performance</h3>
271
- </div>
272
- <div class="col-md-12">
273
- <div class="table-section">
274
- <table id="campaingPerformance" class="table dt-responsive nowrap" style="width:100%">
275
- <thead>
276
- <tr>
277
- <th>Campaign</th>
278
- <th width="100">Daily Budget</th>
279
- <th class="text-center">Active</th>
280
- <th class="text-center">Clicks</th>
281
- <th class="text-center">Cost</th>
282
- <th class="text-center">Conversions</th>
283
- <th class="text-center">Sales</th>
284
- <th class="text-center">Action</th>
285
- </tr>
286
- </thead>
287
- <tbody>';
288
- $total_campaigns = count($campaign_performance);
289
- for ($i = 0; $i < $total_campaigns; $i++) {
290
- $checked = $campaign_performance[$i]->active == 0 ? '' : 'checked';
291
- if ($campaign_performance[$i]->active != 2) {
292
-
293
- echo '<tr>
294
- <td><a href="' . admin_url('admin.php?page=enhanced-ecommerce-google-analytics-admin-display&tab=shopping_campaigns_page&id=' . $campaign_performance[$i]->compaignId) . '" class="text-underline">'. $campaign_performance[$i]->compaignName .'</a></td>
295
- <td><input type="text" class="form-control" value="$' . $campaign_performance[$i]->dailyBudget . '"></td>
296
- <td class="text-center">
297
- <div class="custom-control custom-switch">
298
- <input type="checkbox" class="custom-control-input" id="customSwitch'.$i.'" '.$checked.' onchange="updateCampaignStatus('.$this->merchantId.','.$this->currentCustomerId.','.$campaign_performance[$i]->compaignId.','.$campaign_performance[$i]->dailyBudget.','.$campaign_performance[$i]->budgetId.','.$i.')">
299
- <label class="custom-control-label" for="customSwitch'.$i.'"></label>
300
- </div>
301
- </td>
302
- <td class="text-center">' . $campaign_performance[$i]->clicks . '</td>
303
- <td class="text-center">' . $campaign_performance[$i]->cost . '</td>
304
- <td class="text-center">' . $campaign_performance[$i]->conversions . '</td>
305
- <td class="text-center">' . $campaign_performance[$i]->sales . '</td>
306
- <input type="hidden" value="'.$campaign_performance[$i]->compaignName.'" id="campaign_name_'.$i.'" />
307
- <td><a href="' . admin_url('admin.php?page=enhanced-ecommerce-google-analytics-admin-display&tab=add_campaign_page&edit=' . $campaign_performance[$i]->compaignId) . '">Edit</a> <a href="#" onclick="deleteCampaign('.$this->merchantId.','.$this->currentCustomerId.','.$campaign_performance[$i]->compaignId.','.$i.')">Delete</a></td>
308
- </tr>';
309
- }
310
- }
311
-
312
- echo '</tbody>
313
- </table>
314
- </div>
315
- </div>
316
- </div>
317
- </div>';
318
- }
319
- if(isset($_GET['id']) && $_GET['id'] != '') {
320
- echo '<div class="account-performance">
321
- <div class="row">
322
- <div class="col-md-12">
323
- <h3 class="title">Product Performance</h3>
324
- </div>
325
- <div class="col-md-12">
326
- <div class="table-section">
327
- <table id="productPerformance" class="table dt-responsive nowrap" style="width:100%">
328
- <thead>
329
- <tr>
330
- <th></th>
331
- <th>Product</th>
332
- <th class="text-center">Clicks</th>
333
- <th class="text-center">Cost</th>
334
- <th class="text-center">Conversions</th>
335
- <th class="text-center">Sales</th>
336
- </tr>
337
- </thead>
338
- <tbody>';
339
-
340
- for ($i = 0; $i < count($product_performance); $i++) {
341
- echo '<tr>
342
- <td class="product-image">
343
- <img src="'.plugins_url('img/sneaker.jpg', __FILE__ ).'" alt=""/></td>
344
- <td>' . $product_performance[$i]->product . '</td>
345
- <td class="text-center">' . $product_performance[$i]->clicks . '</td>
346
- <td class="text-center">' . $product_performance[$i]->cost . '</td>
347
- <td class="text-center">' . $product_performance[$i]->conversions . '</td>
348
- <td class="text-center">' . $product_performance[$i]->sales . '</td>
349
- </tr>';
350
- }
351
- echo '</tbody>
352
- </table>
353
- </div>
354
- </div>
355
- </div>
356
- </div>
357
- <div class="account-performance">
358
- <div class="row">
359
- <div class="col-md-12">
360
- <h3 class="title">Product Partition Performance</h3>
361
- </div>
362
- <div class="col-md-12">
363
- <div class="table-section">
364
- <table id="partitionPerformance" class="table dt-responsive nowrap" style="width:100%">
365
- <thead>
366
- <tr>
367
- <th>Campaign</th>
368
- <th class="text-center">Product Dimension</th>
369
- <th class="text-center">Product Dimension Value</th>
370
- <th class="text-center">Clicks</th>
371
- <th class="text-center">Cost</th>
372
- <th class="text-center">Conversions</th>
373
- <th class="text-center">Sales</th>
374
- </tr>
375
- </thead>
376
- <tbody>';
377
- for ($i = 0; $i < count($product_partition_performance); $i++) {
378
- echo '<tr>
379
- <td><a href="" class="text-underline">' . $product_partition_performance[$i]->compaignName . '</a></td>
380
- <td class="text-center">' . $product_partition_performance[$i]->productDimention . '</td>
381
- <td class="text-center">' . $product_partition_performance[$i]->productDimentionValue . '</td>
382
- <td class="text-center">' . $product_partition_performance[$i]->clicks . '</td>
383
- <td class="text-center">' . $product_partition_performance[$i]->cost . '</td>
384
- <td class="text-center">' . $product_partition_performance[$i]->conversions . '</td>
385
- <td class="text-center">' . $product_partition_performance[$i]->sales . '</td>
386
- </tr>';
387
- }
388
- echo'</tbody>
389
- </table>
390
- </div>
391
- </div>
392
- </div>
393
- </div>';
394
- }
395
-
396
- echo'<div class="text-left">
397
- <a href="admin.php?page=enhanced-ecommerce-google-analytics-admin-display&tab=add_campaign_page" class="btn btn-primary btn-success">Create Smart Shopping Campaignn</a>
398
- </div>
399
- </div>
400
- </div>
401
-
402
- <div class="col-md-6 col-lg-4">
403
- <div class="right-content">
404
- '.get_tvc_help_html().'
405
- </div>
406
- </div>
407
- </div>
408
- </div>
409
- </div>
410
- </div>
411
- </div>
412
- </div>
413
- </div>
414
  </div>
415
  <script type="text/javascript">
416
  $(document).ready(function() {
417
  $(".select2").select2();
418
- });
419
-
420
- var ctx = document.getElementById(\'dailyClick\').getContext(\'2d\');
421
-
422
- var dailyClicksData = '. (isset($account_performance->dailyClicks)?json_encode($account_performance->dailyClicks):0) .' ;
423
-
424
- var labels = [];
425
- var values = [];
426
-
427
- dailyClicksData.forEach(clickData => {
428
- labels.push(clickData.date);
429
- values.push(clickData.clicks);
430
- })
431
-
432
- var dailyClick = new Chart(ctx, {
433
- type: \'line\',
434
- data: {
435
- labels: labels,
436
- datasets: [{
437
- label: \'Clicks\',
438
- data: values,
439
- backgroundColor: [
440
- \'rgba(255, 99, 132, 0.2)\',
441
- \'rgba(54, 162, 235, 0.2)\',
442
- \'rgba(255, 206, 86, 0.2)\',
443
- \'rgba(75, 192, 192, 0.2)\',
444
- \'rgba(153, 102, 255, 0.2)\',
445
- \'rgba(255, 159, 64, 0.2)\'
446
- ],
447
- borderColor: [
448
- \'rgba(255, 99, 132, 1)\',
449
- \'rgba(54, 162, 235, 1)\',
450
- \'rgba(255, 206, 86, 1)\',
451
- \'rgba(75, 192, 192, 1)\',
452
- \'rgba(153, 102, 255, 1)\',
453
- \'rgba(255, 159, 64, 1)\'
454
- ],
455
- borderWidth: 1
456
- }]
457
- },
458
- options: {
459
- scales: {
460
- yAxes: [{
461
- ticks: {
462
- beginAtZero: true
463
- }
464
- }]
465
- }
466
- }
467
- });
468
-
469
-
470
- var ctx = document.getElementById(\'dailyCost\').getContext(\'2d\');
471
- var dailyCostData = '. (isset($account_performance->dailyCost)?json_encode($account_performance->dailyCost):0) .' ;
472
-
473
- var labels = [];
474
- var values = [];
475
 
 
 
 
 
 
476
  dailyCostData.forEach(costData => {
477
  labels.push(costData.date);
478
  values.push(costData.costs);
479
  })
480
- var dailyClick = new Chart(ctx, {
481
- type: \'line\',
482
- data: {
483
- labels: labels,
484
- datasets: [{
485
- label: \'Cost\',
486
- data: values,
487
- backgroundColor: [
488
- \'rgba(255, 99, 132, 0.2)\',
489
- \'rgba(54, 162, 235, 0.2)\',
490
- \'rgba(255, 206, 86, 0.2)\',
491
- \'rgba(75, 192, 192, 0.2)\',
492
- \'rgba(153, 102, 255, 0.2)\',
493
- \'rgba(255, 159, 64, 0.2)\'
494
- ],
495
- borderColor: [
496
- \'rgba(255, 99, 132, 1)\',
497
- \'rgba(54, 162, 235, 1)\',
498
- \'rgba(255, 206, 86, 1)\',
499
- \'rgba(75, 192, 192, 1)\',
500
- \'rgba(153, 102, 255, 1)\',
501
- \'rgba(255, 159, 64, 1)\'
502
- ],
503
- borderWidth: 1
504
- }]
505
- },
506
- options: {
507
- scales: {
508
- yAxes: [{
509
- ticks: {
510
- beginAtZero: true
511
- }
512
- }]
513
- }
514
- }
515
- });
516
-
517
-
518
- var ctx = document.getElementById(\'dailyConversions\').getContext(\'2d\');
519
- var dailyConversionsData = '. (isset($account_performance->dailyConversions)?json_encode($account_performance->dailyConversions):0) .' ;
520
 
521
- var labels = [];
522
- var values = [];
523
 
 
 
 
524
  dailyConversionsData.forEach(conversionsData => {
525
  labels.push(conversionsData.date);
526
  values.push(conversionsData.conversions);
527
  })
528
-
529
- var dailyClick = new Chart(ctx, {
530
- type: \'line\',
531
- data: {
532
- labels: labels,
533
- datasets: [{
534
- label: \'Conversions\',
535
- data: values,
536
- backgroundColor: [
537
- \'rgba(255, 99, 132, 0.2)\',
538
- \'rgba(54, 162, 235, 0.2)\',
539
- \'rgba(255, 206, 86, 0.2)\',
540
- \'rgba(75, 192, 192, 0.2)\',
541
- \'rgba(153, 102, 255, 0.2)\',
542
- \'rgba(255, 159, 64, 0.2)\'
543
- ],
544
- borderColor: [
545
- \'rgba(255, 99, 132, 1)\',
546
- \'rgba(54, 162, 235, 1)\',
547
- \'rgba(255, 206, 86, 1)\',
548
- \'rgba(75, 192, 192, 1)\',
549
- \'rgba(153, 102, 255, 1)\',
550
- \'rgba(255, 159, 64, 1)\'
551
- ],
552
- borderWidth: 1
553
- }]
554
- },
555
- options: {
556
- scales: {
557
- yAxes: [{
558
- ticks: {
559
- beginAtZero: true
560
- }
561
- }]
562
- }
563
- }
564
- });
565
-
566
 
567
- var ctx = document.getElementById(\'dailySales\').getContext(\'2d\');
568
- var dailySalesData = '. (isset($account_performance->dailySales)?json_encode($account_performance->dailySales):0) .' ;
569
-
570
- var labels = [];
571
- var values = [];
572
 
 
 
 
573
  dailySalesData.forEach(salesData => {
574
- labels.push(salesData.date);
575
- values.push(salesData.sales);
576
  })
577
- var dailyClick = new Chart(ctx, {
578
- type: \'line\',
579
- data: {
580
- labels: labels,
581
- datasets: [{
582
- label: \'Sales\',
583
- data: values,
584
- backgroundColor: [
585
- \'rgba(255, 99, 132, 0.2)\',
586
- \'rgba(54, 162, 235, 0.2)\',
587
- \'rgba(255, 206, 86, 0.2)\',
588
- \'rgba(75, 192, 192, 0.2)\',
589
- \'rgba(153, 102, 255, 0.2)\',
590
- \'rgba(255, 159, 64, 0.2)\'
591
- ],
592
- borderColor: [
593
- \'rgba(255, 99, 132, 1)\',
594
- \'rgba(54, 162, 235, 1)\',
595
- \'rgba(255, 206, 86, 1)\',
596
- \'rgba(75, 192, 192, 1)\',
597
- \'rgba(153, 102, 255, 1)\',
598
- \'rgba(255, 159, 64, 1)\'
599
- ],
600
- borderWidth: 1
601
- }]
602
- },
603
- options: {
604
- scales: {
605
- yAxes: [{
606
- ticks: {
607
- beginAtZero: true
608
- }
609
- }]
610
- }
611
- }
612
- });
 
613
 
614
  function validateAll() {
615
-
616
  if ($("#customRange1").prop("checked")==true) {
617
  jQuery("#date_range_form").submit();
618
  }
619
 
620
  if ($("#customRange2").prop("checked")==true) {
621
- if(document.getElementById("from_date").value == "" || document.getElementById("to_date").value == "") {
622
- document.getElementById("errorMessage").classList.remove("hidden");
623
- } else {
624
- document.getElementById("errorMessage").classList.add("hidden");
625
- jQuery("#date_range_form").submit();
626
- }
627
  }
628
- }
629
-
630
- jQuery(".input-daterange input").each(function() {
631
- jQuery(this).datepicker({
632
- todayHighlight: true,
633
- autoclose: true,
634
- defaultViewDate: new Date(),
635
- endDate: new Date(),
636
- format: "yyyy-mm-dd"
637
- }).on("changeDate", changeStartDate);
638
- });
639
 
640
  function changeStartDate() {
641
- var from_date = "";
642
- var to_date = "";
643
-
644
- from_date = jQuery("#from_date").val();
645
- to_date = jQuery("#to_date").val();
646
-
647
- jQuery("#from_date").datepicker("destroy").datepicker({
648
- todayHighlight: true,
649
- autoclose: true,
650
- defaultViewDate: new Date(),
651
- endDate: to_date == "" ? new Date() : to_date,
652
- format: "yyyy-mm-dd"
653
- });
654
-
655
- jQuery("#to_date").datepicker("destroy").datepicker({
656
- todayHighlight: true,
657
- autoclose: true,
658
- defaultViewDate: new Date(),
659
- endDate: new Date(),
660
- startDate: from_date == "" ? "" : from_date,
661
- format: "yyyy-mm-dd"
662
- });
663
  }
664
 
665
- function date_range_select() {
666
- document.getElementById("customRange1").checked = true;
667
- }
668
 
669
- function deleteCampaign(merchantId, customerId, campaignId, currentRow) {
670
  var confirm = window.confirm("Are you sure you want to delete campaign?");
671
  var campaign_name = jQuery("#campaign_name_"+currentRow).val();
672
  if(confirm) {
673
  jQuery("#feed-spinner").css("display", "block");
674
- jQuery.post(
675
- myAjaxNonces.ajaxurl,
676
- {
677
- action: "tvcajax-delete-campaign",
678
- merchantId: merchantId,
679
- customerId: customerId,
680
- campaignId: campaignId,
681
- campaignDeleteNonce: myAjaxNonces.campaignDeleteNonce,
682
- },
683
- function( response ) {
684
- jQuery("#feed-spinner").css("display", "none");
685
- console.log(response);
686
- var rsp = JSON.parse(response)
687
- if (rsp.status == "success") {
688
- var message = campaign_name + " is deleted successfully";
689
- alert(message);
690
- window.location.href = "admin.php?page=enhanced-ecommerce-google-analytics-admin-display&tab=shopping_campaigns_page";
691
- } else {
692
- var message = rsp.message;
693
- alert(message);
694
- }
695
- }
696
- );
697
  }
698
  }
699
 
700
  function updateCampaignStatus(merchantId, customerId, campaignId, budget, budgetId, currentRow) {
701
- var campaign_status = jQuery("#customSwitch"+currentRow).prop("checked");
702
- var campaign_name = jQuery("#campaign_name_"+currentRow).val();
703
- jQuery("#feed-spinner").css("display", "block");
704
- jQuery.post(
705
- myAjaxNonces.ajaxurl,
706
- {
707
- action: "tvcajax-update-campaign-status",
708
- merchantId: merchantId,
709
- customerId: customerId,
710
- campaignId: campaignId,
711
- campaignName: campaign_name,
712
- budget: budget,
713
- budgetId: budgetId,
714
- status: campaign_status == true ? 2 : 3,
715
- campaignStatusNonce: myAjaxNonces.campaignStatusNonce,
716
-
717
- },
718
- function( response ) {
719
- jQuery("#feed-spinner").css("display", "none");
720
- console.log(response);
721
- var rsp = JSON.parse(response)
722
- if (rsp.status == "success") {
723
- var message = campaign_name + " status updated successfully";
724
- alert(message);
725
- window.location.href = "admin.php?page=enhanced-ecommerce-google-analytics-admin-display&tab=shopping_campaigns_page";
726
- } else {
727
- var message = rsp.message;
728
- alert(message);
729
- }
730
- }
731
- );
732
  }
733
- </script>';
734
- }
 
735
  }
736
  ?>
2
 
3
  class CampaignsConfiguration
4
  {
5
+ protected $merchantId;
6
+ protected $currentCustomerId;
7
+ protected $subscriptionId;
8
+
9
+ protected $customApiObj;
10
+ protected $currency_symbol;
11
+ public function __construct(){
12
+ $this->includes();
13
+ $this->TVC_Admin_Helper = new TVC_Admin_Helper();
14
+ $this->returnUrl = $_SERVER['REQUEST_URI'];
15
+
16
+ $this->customApiObj = new CustomApi();
17
+
18
+ $this->merchantId = $this->TVC_Admin_Helper->get_merchantId();
19
+ $this->currentCustomerId = $this->TVC_Admin_Helper->get_currentCustomerId();
20
+ $this->subscriptionId = $this->TVC_Admin_Helper->get_subscriptionId();;
21
+ $this->new_campaign = true;
22
+
23
+ $this->date_range_type = (isset($_POST['customRadio'])) ? $_POST['customRadio'] : 1;
24
+ $this->days = (isset($_POST['days']) && $_POST['days'] != '') ? $_POST['days'] : 7;
25
+ $this->from_date = (isset($_POST['from_date']) && $_POST['from_date'] != '') ? $_POST['from_date'] : "";
26
+ $this->to_date = (isset($_POST['to_date']) && $_POST['to_date'] != '') ? $_POST['to_date'] : "";
27
+ $this->country = $this->TVC_Admin_Helper->get_woo_country();
28
+ $this->currency_symbol = $this->TVC_Admin_Helper->get_user_currency_symbol();
29
+ $this->site_url = "admin.php?page=enhanced-ecommerce-google-analytics-admin-display&tab=";
30
+ $this->html_run();
31
+ }
32
+
33
+ public function includes(){
34
+ if (!class_exists('CustomApi.php')) {
35
+ require_once(__DIR__ . '/CustomApi.php');
36
  }
37
+ if (!class_exists('ShoppingApi')) {
38
+ require_once(__DIR__ . '/ShoppingApi.php');
 
 
 
 
 
 
 
 
 
 
39
  }
40
+ if (!class_exists('Tatvic_Category_Wrapper')) {
41
+ require_once(__DIR__ . '/tatvic-category-wrapper.php');
 
 
 
42
  }
43
+ }
44
+
45
+ public function html_run(){
46
+ $this->TVC_Admin_Helper->add_spinner_html();
47
+ $this->create_form();
48
+ }
49
+
50
+ public function create_form(){
51
+ $googleDetail = [];
52
+ $google_detail = $this->TVC_Admin_Helper->get_ee_options_data();
53
+ if(isset($google_detail['setting'])){
54
+ if ($google_detail['setting']) {
55
+ $googleDetail = $google_detail['setting'];
56
+ }
57
  }
58
 
59
+ $date_range_type = isset($_POST['customRadio']) ? $_POST['customRadio'] : 1;
 
 
 
60
  $days = (isset($_POST['days']) && $_POST['days'] != '') ? $_POST['days'] : 7;
61
  $from_date = (isset($_POST['from_date']) && $_POST['from_date'] != '') ? $_POST['from_date'] : "";
62
  $to_date = (isset($_POST['to_date']) && $_POST['to_date'] != '') ? $_POST['to_date'] : "";
63
+ $campaigns_list = [];
64
+ $categories = [];
65
+ $campaign_performance = [];
66
+ $account_performance = [];
67
+ $product_performance = [];
68
+ $product_partition_performance = [];
 
69
  $api_old_obj = new ShoppingApi();
70
 
71
+ $campaigns_list_res = $api_old_obj->getCampaigns();
72
+
73
+ if (isset($campaigns_list_res->errors) && !empty($campaigns_list_res->errors)) {
74
+ $class = 'error';
75
+ $message = esc_html__('Not any campaigns found.');
76
+ printf('<div class="alert-message"><div class="%1$s" role="alert"><img src="'. plugins_url('img/missing-warning.svg', __FILE__) . '" alt="" class="mr-2"/>%2$s</div></div>', esc_attr($class), esc_html($message));
77
+ } else if(isset($campaigns_list_res->data)){
78
+ $campaigns_list_res = $campaigns_list_res->data;
79
+ if ($campaigns_list_res['status'] == 200) {
80
+ $campaigns_list = $campaigns_list_res['data'];
81
+ }
82
+ }
83
+ $totalConversion = 0;
84
+ $totalSale = 0;
85
+ $totalCost = 0;
86
+ $totalClick = 0;
87
  if(count($campaigns_list) > 0) {
88
+ //Account Performance
89
+ $account_performance_res = $api_old_obj->accountPerformance($this->date_range_type, $this->days, $this->from_date, $this->to_date);
90
+ if (isset($account_performance_res->errors) && !empty($account_performance_res->errors)) {
91
+ } else {
92
+ $account_performance_res = $account_performance_res->data;
93
+ if ($account_performance_res['status'] == 200) {
94
+ $account_performance = $account_performance_res['data'];
95
+ }
96
+ }
97
+ // Count account performance
98
+ if (!empty($account_performance->dailyConversions)) {
99
+ foreach($account_performance->dailyConversions as $key => $dailyConversion){
100
+ $totalConversion = $totalConversion + $dailyConversion->conversions;
101
+ }
102
+ }
103
+ if (!empty($account_performance->dailySales)) {
104
+ foreach ($account_performance->dailySales as $key => $dailySale) {
105
+ $totalSale = $totalSale + $dailySale->sales;
106
+ }
107
+ }
108
+ if (!empty($account_performance->dailyCost)) {
109
+ foreach ($account_performance->dailyCost as $key => $dailyCostData) {
110
+ $totalCost = $totalCost + $dailyCostData->costs;
111
+ }
112
+ }
113
+
114
+ if (!empty($account_performance->dailyClicks)) {
115
+ foreach ($account_performance->dailyClicks as $key => $dailyClick) {
116
+ $totalClick = $totalClick + $dailyClick->clicks;
117
+ }
118
+ }
119
+ //Campaign Performance
120
+ $campaign_performance_res = $api_old_obj->campaignPerformance($this->date_range_type, $this->days, $this->from_date, $this->to_date);
121
+ if (isset($campaign_performance_res->errors) && !empty($campaign_performance_res->errors)) {
122
+
123
+ } else if(isset($campaign_performance_res->data)){
124
+ $campaign_performance_res = $campaign_performance_res->data;
125
+ if ($campaign_performance_res['status'] == 200) {
126
+ $campaign_performance = $campaign_performance_res['data'];
127
+ }
128
+ }
 
 
 
 
 
 
 
 
 
 
129
  }else if(isset($_GET['id']) && $_GET['id'] != '') {
130
  //Product Performance
131
  $product_performance_res = $api_old_obj->productPerformance($_GET['id'], $this->date_range_type, $this->days, $this->from_date, $this->to_date);
132
 
133
  if (isset($product_performance_res->errors) && !empty($product_performance_res->errors)) {
134
 
135
+ } else if(isset($product_performance_res->data)){
136
+ $product_performance_res = $product_performance_res->data;
137
+ if ($product_performance_res['status'] == 200) {
138
+ $product_performance = $product_performance_res['data'];
139
+ }
140
  }
141
 
142
  //Product Partition Performance
144
 
145
  if (isset($product_partition_performance_res->errors) && !empty($product_partition_performance_res->errors)) {
146
 
147
+ } else if(isset($product_partition_performance_res->data)){
148
+ $product_partition_performance_res = $product_partition_performance_res->data;
149
+ if ($product_partition_performance_res['status'] == 200) {
150
+ $product_partition_performance = $product_partition_performance_res['data'];
151
+ }
152
  }
153
  }
154
+ $plan_id = 1;
155
+ if(isset($googleDetail->plan_id) && !in_array($googleDetail->plan_id, array("1"))){
156
+ $plan_id = $googleDetail->plan_id;
157
+ }
158
+ ?>
159
+ <div class="tab-content">
160
+ <div class="tab-pane show active" id="googleShoppingFeed">
161
+ <div class="tab-card">
162
+ <div class="row">
163
+ <div class="col-md-12">
164
+ <div class="edit-section">
165
+ <div class="edit-header-section">
166
+ <script>
167
+ var back_img = '<img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/left-angle-arrow.svg'; ?>" alt="back"/>';
168
+ document.write('<a href="' + document.referrer + '" class="back-btn">'+back_img+'<span>Back</span></a>');
169
+ </script>
170
+ </div>
171
+ <div class="row">
172
+ <div class="configuration-section col-md-6 col-lg-8">
173
+ <?php echo get_google_shopping_tabs_html($this->site_url, (isset($googleDetail->google_merchant_center_id))?$googleDetail->google_merchant_center_id:""); ?>
174
+ </div>
175
+ </div>
176
+ <div class="tab-content" id="myTabContent">
177
+ <div class="tab-pane fade show active" id="smartShopping">
178
+ <div class="smart-shopping-section">
179
+ <form method="post" id="date_range_form">
180
+ <input type="hidden" id="customRange2" name="customRadio" value="2" class="custom-control-input" checked="checked">
181
+ <div class="campaigns">
182
+ <div class="d-flex justify-content-between align-items-center">
183
+ <h3 class="title mb-0">Smart Shopping Campaigns</h3>
184
+ <div class="campaing-date">
185
+ <div class="input-group input-daterange">
186
+ <input type="text" class="form-control" id="from_date" name="from_date" value="<?php echo $this->from_date; ?>">
187
+ <div class="input-group-addon text px-3">to</div>
188
+ <input type="text" class="form-control" id="to_date" name="to_date" value="<?php echo $this->to_date; ?>">
189
+ <label class="mt-2 mb-2 error-msg float-left hidden" id="errorMessage">Please select both from and to date</label>
190
+ </div>
191
+ </div>
192
+ <div class="create-campaign-btn">
193
+ <button type="button" class="btn btn-outline-primary" onclick="validateAll()" id="select_range" name="select_range">Submit</button>
194
+ <a href="<?php echo $this->site_url.'add_campaign_page';?>" class="btn btn-outline-primary">Create a New Campaign</a>
195
+ </div>
196
+ </div>
197
+ </div>
198
+ </form>
199
+ <div class="account-performance">
200
+ <div class="row">
201
+ <div class="col-md-12">
202
+ <h3 class="title">Account Performance</h3>
203
+ </div>
204
+ <div class="col-md-6 col-lg-3">
205
+ <div class="chart">
206
+ <h4 class="sub-title">Daily Clicks</h4>
207
+ <canvas id="dailyClick" width="240" height="180"></canvas>
208
+ </div>
209
+ </div>
210
+ <div class="col-md-6 col-lg-3">
211
+ <div class="chart">
212
+ <h4 class="sub-title">Daily Cost</h4>
213
+ <canvas id="dailyCost" width="240" height="180"></canvas>
214
+ </div>
215
+ </div>
216
+ <div class="col-md-6 col-lg-3">
217
+ <div class="chart">
218
+ <h4 class="sub-title">Daily Conversions</h4>
219
+ <canvas id="dailyConversions" width="240" height="180"></canvas>
220
+ </div>
221
+ </div>
222
+ <div class="col-md-6 col-lg-3">
223
+ <div class="chart">
224
+ <h4 class="sub-title">Daily Sales</h4>
225
+ <canvas id="dailySales" width="240" height="180"></canvas>
226
+ </div>
227
+ </div>
228
+ </div>
229
+ </div>
230
+ </div>
231
+ <div class="account-performance">
232
+ <div class="row">
233
+ <div class="col-lg-8">
234
+ <h3 class="title">Compaign Performance</h3>
235
+ <div class="table-section">
236
+ <table id="campaingPerformance" class="table dt-responsive nowrap" style="width:100%">
237
+ <thead>
238
+ <tr>
239
+ <th>Campaign</th>
240
+ <th width="100">Daily Budget</th>
241
+ <th class="text-center">Active</th>
242
+ <th class="text-center">Clicks</th>
243
+ <th class="text-center">Cost</th>
244
+ <th class="text-center">Conversions</th>
245
+ <th class="text-center">Sales</th>
246
+ <th class="text-center">Action</th>
247
+ </tr>
248
+ </thead>
249
+ <tbody>
250
+ <?php
251
+ $total_campaigns = count($campaign_performance);
252
+ for ($i = 0; $i < $total_campaigns; $i++) {
253
+ $checked = $campaign_performance[$i]->active == 0 ? '' : 'checked';
254
+ if ($campaign_performance[$i]->active != 2) {?>
255
+ <tr>
256
+ <td><a href="<?php echo $this->site_url.'shopping_campaigns_page&id='.$campaign_performance[$i]->compaignId; ?>" class="text-underline"><?php echo $campaign_performance[$i]->compaignName; ?></a></td>
257
+ <td><?php echo $this->currency_symbol.$campaign_performance[$i]->dailyBudget; ?></td>
258
+ <td class="text-center">
259
+ <div class="custom-control custom-switch">
260
+ <input type="checkbox" class="custom-control-input" id="customSwitch<?php echo $i; ?>" <?php echo $checked; ?> onchange="updateCampaignStatus('<?php echo $this->merchantId; ?>','<?php echo $this->currentCustomerId; ?>','<?php echo $campaign_performance[$i]->compaignId; ?>','<?php echo $campaign_performance[$i]->dailyBudget; ?>','<?php echo $campaign_performance[$i]->budgetId; ?>','<?php echo$i; ?>')">
261
+ <label class="custom-control-label" for="customSwitch<?php echo $i; ?>"></label>
262
+ </div>
263
+ </td>
264
+ <td class="text-center"><?php echo $campaign_performance[$i]->clicks; ?></td>
265
+ <td class="text-center"><?php echo $campaign_performance[$i]->cost; ?></td>
266
+ <td class="text-center"><?php echo $campaign_performance[$i]->conversions; ?></td>
267
+ <td class="text-center"><?php echo $campaign_performance[$i]->sales; ?></td>
268
+ <input type="hidden" value="<?php echo $campaign_performance[$i]->compaignName; ?>" id="campaign_name_<?php echo $i; ?>" />
269
+ <td><a href="<?php echo $this->site_url.'add_campaign_page&edit='.$campaign_performance[$i]->compaignId; ?>">Edit</a> | <a href="#" onclick="deleteCampaign('<?php echo $this->merchantId; ?>','<?php echo $this->currentCustomerId; ?>','<?php echo $campaign_performance[$i]->compaignId; ?>','<?php echo $i; ?>')">Delete</a></td>
270
+ </tr>
271
+ <?php
272
+ }
273
+ }?>
274
+ </tbody>
275
+ </table>
276
+ </div>
277
+ </div>
278
+ <?php if($plan_id == 1){?>
279
+ <div class="col-lg-4">
280
+ <div class="pro-account ml-lg-auto">
281
+ <div class="card">
282
+ <div class="card-body">
283
+ <div class="account-img">
284
+ <img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/undraw_update_uxn2.svg'; ?>" alt=""/>
285
+ </div>
286
+ <div class="pro-content">
287
+ <h3 class="userName">Hello <?php echo get_bloginfo(); ?>!</h3>
288
+ <p>Explore <a target="_blank" href="<?php echo $this->TVC_Admin_Helper->get_pro_plan_site(); ?>" class="font-weight-bold">Pro account</a> with Premium features.</p>
289
+ </div>
290
+ </div>
291
+ <div class="card-footer">
292
+ <a target="_blank" href="<?php echo $this->TVC_Admin_Helper->get_pro_plan_site().'pricings'; ?>"><button class="btn btn-primary">Learn more</button></a>
293
+ </div>
294
+ </div>
295
+ </div>
296
+ </div>
297
+ <?php } ?>
298
+ </div>
299
+ </div><!-- account-performance-->
300
+ <?php
301
+ if(isset($_GET['id']) && $_GET['id'] != '') { ?>
302
+ <div class="account-performance">
303
+ <div class="row">
304
+ <div class="col-lg-6">
305
+ <h3 class="title">Product Performance :</h3>
306
+ <div class="table-section">
307
+ <table id="productPerformance" class="table dt-responsive nowrap" style="width:100%">
308
+ <thead>
309
+ <tr>
310
+ <th></th>
311
+ <th>Product</th>
312
+ <th class="text-center">Clicks</th>
313
+ <th class="text-center">Cost</th>
314
+ <th class="text-center">Conversions</th>
315
+ <th class="text-center">Sales</th>
316
+ </tr>
317
+ </thead>
318
+ <tbody>
319
+ <?php for ($i = 0; $i < count($product_performance); $i++) { ?>
320
+ <tr>
321
+ <td class="product-image"><img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/sneaker.jpg'; ?>" alt=""/></td>
322
+ <td><?php echo $product_performance[$i]->product; ?></td>
323
+ <td class="text-center"><?php echo $product_performance[$i]->clicks; ?></td>
324
+ <td class="text-center"><?php echo $product_performance[$i]->cost; ?></td>
325
+ <td class="text-center"><?php echo $product_performance[$i]->conversions; ?></td>
326
+ <td class="text-center"><?php echo $product_performance[$i]->sales; ?></td>
327
+ </tr>
328
+ <?php } ?>
329
+ </tbody>
330
+ </table>
331
+ </div>
332
+ </div>
333
+ </div>
334
+ </div><!-- account-performance-->
335
+ <div class="account-performance">
336
+ <div class="row">
337
+ <div class="col-lg-6">
338
+ <h3 class="title">Product Partition Performance</h3>
339
+ <div class="table-section">
340
+ <table id="productPerformance" class="table dt-responsive nowrap" style="width:100%">
341
+ <thead>
342
+ <tr>
343
+ <th>Campaign</th>
344
+ <th class="text-center">Product Dimension</th>
345
+ <th class="text-center">Product Dimension Value</th>
346
+ <th class="text-center">Clicks</th>
347
+ <th class="text-center">Cost</th>
348
+ <th class="text-center">Conversions</th>
349
+ <th class="text-center">Sales</th>
350
+ </tr>
351
+ </thead>
352
+ <tbody>
353
+ <?php for ($i = 0; $i < count($product_partition_performance); $i++) { ?>
354
+ <tr>
355
+ <td><a href="" class="text-underline"><?php echo $product_partition_performance[$i]->compaignName; ?></a></td>
356
+ <td class="text-center"><?php echo $product_partition_performance[$i]->productDimention; ?></td>
357
+ <td class="text-center"><?php echo $product_partition_performance[$i]->productDimentionValue; ?></td>
358
+ <td class="text-center"><?php echo $product_partition_performance[$i]->clicks; ?></td>
359
+ <td class="text-center"><?php echo $product_partition_performance[$i]->cost; ?></td>
360
+ <td class="text-center"><?php echo $product_partition_performance[$i]->conversions; ?></td>
361
+ <td class="text-center"><?php echo $product_partition_performance[$i]->sales; ?></td>
362
+ </tr>
363
+ <?php } ?>
364
+ </tbody>
365
+ </table>
366
+ </div>
367
+ </div>
368
+ </div>
369
+ </div><!-- account-performance -->
370
+ <?php } ?>
371
+ </div>
372
+ </div>
373
+ </div>
374
+ </div>
375
+ </div>
376
+ </div>
377
+ </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
378
  </div>
379
  <script type="text/javascript">
380
  $(document).ready(function() {
381
  $(".select2").select2();
382
+ });
383
+
384
+ var ctx = document.getElementById('dailyClick').getContext('2d');
385
+ var dailyClicksData = jQuery.parseJSON('<?php echo (isset($account_performance->dailyClicks)?json_encode($account_performance->dailyClicks):''); ?>');
386
+
387
+ var labels = [];
388
+ var values = [];
389
+ if(dailyClicksData.length > 0 ){
390
+ dailyClicksData.forEach(clickData => {
391
+ labels.push(clickData.date);
392
+ values.push(clickData.clicks);
393
+ })
394
+ }
395
+ var dailyClick = new Chart(ctx, {
396
+ type: 'line',
397
+ data: {
398
+ labels: labels,
399
+ datasets: [{
400
+ label: 'Clicks',
401
+ data: values,
402
+ backgroundColor: [
403
+ 'rgba(255, 99, 132, 0.2)',
404
+ 'rgba(54, 162, 235, 0.2)',
405
+ 'rgba(255, 206, 86, 0.2)',
406
+ 'rgba(75, 192, 192, 0.2)',
407
+ 'rgba(153, 102, 255, 0.2)',
408
+ 'rgba(255, 159, 64, 0.2)'
409
+ ],
410
+ borderColor: [
411
+ 'rgba(255, 99, 132, 1)',
412
+ 'rgba(54, 162, 235, 1)',
413
+ 'rgba(255, 206, 86, 1)',
414
+ 'rgba(75, 192, 192, 1)',
415
+ 'rgba(153, 102, 255, 1)',
416
+ 'rgba(255, 159, 64, 1)'
417
+ ],
418
+ borderWidth: 1
419
+ }]
420
+ },
421
+ options: {
422
+ scales: {
423
+ yAxes: [{
424
+ ticks: {
425
+ beginAtZero: true
426
+ }
427
+ }]
428
+ }
429
+ }
430
+ });
 
 
 
 
 
 
 
 
431
 
432
+ var ctx = document.getElementById('dailyCost').getContext('2d');
433
+ var dailyCostData = jQuery.parseJSON('<?php echo (isset($account_performance->dailyCost)?json_encode($account_performance->dailyCost):0); ?>');
434
+ var labels = [];
435
+ var values = [];
436
+ if(dailyClicksData.length > 0 ){
437
  dailyCostData.forEach(costData => {
438
  labels.push(costData.date);
439
  values.push(costData.costs);
440
  })
441
+ }
442
+ var dailyClick = new Chart(ctx, {
443
+ type: 'line',
444
+ data: {
445
+ labels: labels,
446
+ datasets: [{
447
+ label: 'Cost',
448
+ data: values,
449
+ backgroundColor: [
450
+ 'rgba(255, 99, 132, 0.2)',
451
+ 'rgba(54, 162, 235, 0.2)',
452
+ 'rgba(255, 206, 86, 0.2)',
453
+ 'rgba(75, 192, 192, 0.2)',
454
+ 'rgba(153, 102, 255, 0.2)',
455
+ 'rgba(255, 159, 64, 0.2)'
456
+ ],
457
+ borderColor: [
458
+ 'rgba(255, 99, 132, 0.2)',
459
+ 'rgba(54, 162, 235, 0.2)',
460
+ 'rgba(255, 206, 86, 0.2)',
461
+ 'rgba(75, 192, 192, 0.2)',
462
+ 'rgba(153, 102, 255, 0.2)',
463
+ 'rgba(255, 159, 64, 0.2)'
464
+ ],
465
+ borderWidth: 1
466
+ }]
467
+ },
468
+ options: {
469
+ scales: {
470
+ yAxes: [{
471
+ ticks: {
472
+ beginAtZero: true
473
+ }
474
+ }]
475
+ }
476
+ }
477
+ });
 
 
 
478
 
479
+ var ctx = document.getElementById('dailyConversions').getContext('2d');
480
+ var dailyConversionsData = jQuery.parseJSON('<?php echo (isset($account_performance->dailyConversions)?json_encode($account_performance->dailyConversions):0); ?>');
481
 
482
+ var labels = [];
483
+ var values = [];
484
+ if(dailyClicksData.length > 0 ){
485
  dailyConversionsData.forEach(conversionsData => {
486
  labels.push(conversionsData.date);
487
  values.push(conversionsData.conversions);
488
  })
489
+ }
490
+
491
+ var dailyClick = new Chart(ctx, {
492
+ type: 'line',
493
+ data: {
494
+ labels: labels,
495
+ datasets: [{
496
+ label: 'Conversions',
497
+ data: values,
498
+ backgroundColor: [
499
+ 'rgba(255, 99, 132, 0.2)',
500
+ 'rgba(54, 162, 235, 0.2)',
501
+ 'rgba(255, 206, 86, 0.2)',
502
+ 'rgba(75, 192, 192, 0.2)',
503
+ 'rgba(153, 102, 255, 0.2)',
504
+ 'rgba(255, 159, 64, 0.2)'
505
+ ],
506
+ borderColor: [
507
+ 'rgba(255, 99, 132, 0.2)',
508
+ 'rgba(54, 162, 235, 0.2)',
509
+ 'rgba(255, 206, 86, 0.2)',
510
+ 'rgba(75, 192, 192, 0.2)',
511
+ 'rgba(153, 102, 255, 0.2)',
512
+ 'rgba(255, 159, 64, 0.2)'
513
+ ],
514
+ borderWidth: 1
515
+ }]
516
+ },
517
+ options: {
518
+ scales: {
519
+ yAxes: [{
520
+ ticks: {
521
+ beginAtZero: true
522
+ }
523
+ }]
524
+ }
525
+ }
526
+ });
527
 
528
+ var ctx = document.getElementById('dailySales').getContext('2d');
529
+ var dailySalesData = jQuery.parseJSON('<?php echo (isset($account_performance->dailySales)?json_encode($account_performance->dailySales):0); ?>');
 
 
 
530
 
531
+ var labels = [];
532
+ var values = [];
533
+ if(dailyClicksData.length > 0 ){
534
  dailySalesData.forEach(salesData => {
535
+ labels.push(salesData.date);
536
+ values.push(salesData.sales);
537
  })
538
+ }
539
+ var dailyClick = new Chart(ctx, {
540
+ type: 'line',
541
+ data: {
542
+ labels: labels,
543
+ datasets: [{
544
+ label: 'Sales',
545
+ data: values,
546
+ backgroundColor: [
547
+ 'rgba(255, 99, 132, 0.2)',
548
+ 'rgba(54, 162, 235, 0.2)',
549
+ 'rgba(255, 206, 86, 0.2)',
550
+ 'rgba(75, 192, 192, 0.2)',
551
+ 'rgba(153, 102, 255, 0.2)',
552
+ 'rgba(255, 159, 64, 0.2)'
553
+ ],
554
+ borderColor: [
555
+ 'rgba(255, 99, 132, 0.2)',
556
+ 'rgba(54, 162, 235, 0.2)',
557
+ 'rgba(255, 206, 86, 0.2)',
558
+ 'rgba(75, 192, 192, 0.2)',
559
+ 'rgba(153, 102, 255, 0.2)',
560
+ 'rgba(255, 159, 64, 0.2)'
561
+ ],
562
+ borderWidth: 1
563
+ }]
564
+ },
565
+ options: {
566
+ scales: {
567
+ yAxes: [{
568
+ ticks: {
569
+ beginAtZero: true
570
+ }
571
+ }]
572
+ }
573
+ }
574
+ });
575
 
576
  function validateAll() {
 
577
  if ($("#customRange1").prop("checked")==true) {
578
  jQuery("#date_range_form").submit();
579
  }
580
 
581
  if ($("#customRange2").prop("checked")==true) {
582
+ if(document.getElementById("from_date").value == "" || document.getElementById("to_date").value == "") {
583
+ document.getElementById("errorMessage").classList.remove("hidden");
584
+ } else {
585
+ document.getElementById("errorMessage").classList.add("hidden");
586
+ jQuery("#date_range_form").submit();
587
+ }
588
  }
589
+ }
590
+
591
+ jQuery(".input-daterange input").each(function() {
592
+ jQuery(this).datepicker({
593
+ todayHighlight: true,
594
+ autoclose: true,
595
+ defaultViewDate: new Date(),
596
+ endDate: new Date(),
597
+ format: "yyyy-mm-dd"
598
+ }).on("changeDate", changeStartDate);
599
+ });
600
 
601
  function changeStartDate() {
602
+ var from_date = "";
603
+ var to_date = "";
604
+
605
+ from_date = jQuery("#from_date").val();
606
+ to_date = jQuery("#to_date").val();
607
+
608
+ jQuery("#from_date").datepicker("destroy").datepicker({
609
+ todayHighlight: true,
610
+ autoclose: true,
611
+ defaultViewDate: new Date(),
612
+ endDate: to_date == "" ? new Date() : to_date,
613
+ format: "yyyy-mm-dd"
614
+ });
615
+
616
+ jQuery("#to_date").datepicker("destroy").datepicker({
617
+ todayHighlight: true,
618
+ autoclose: true,
619
+ defaultViewDate: new Date(),
620
+ endDate: new Date(),
621
+ startDate: from_date == "" ? "" : from_date,
622
+ format: "yyyy-mm-dd"
623
+ });
624
  }
625
 
626
+ function date_range_select() {
627
+ document.getElementById("customRange1").checked = true;
628
+ }
629
 
630
+ function deleteCampaign(merchantId, customerId, campaignId, currentRow) {
631
  var confirm = window.confirm("Are you sure you want to delete campaign?");
632
  var campaign_name = jQuery("#campaign_name_"+currentRow).val();
633
  if(confirm) {
634
  jQuery("#feed-spinner").css("display", "block");
635
+ jQuery.post(
636
+ myAjaxNonces.ajaxurl,
637
+ {
638
+ action: "tvcajax-delete-campaign",
639
+ merchantId: merchantId,
640
+ customerId: customerId,
641
+ campaignId: campaignId,
642
+ campaignDeleteNonce: myAjaxNonces.campaignDeleteNonce
643
+ },
644
+ function( response ) {
645
+ jQuery("#feed-spinner").css("display", "none");
646
+ console.log(response);
647
+ var rsp = JSON.parse(response)
648
+ if (rsp.status == "success") {
649
+ var message = campaign_name + " is deleted successfully";
650
+ alert(message);
651
+ window.location.href = "<?php echo $this->site_url.'shopping_campaigns_page';?>";
652
+ } else {
653
+ var message = rsp.message;
654
+ alert(message);
655
+ }
656
+ }
657
+ );
658
  }
659
  }
660
 
661
  function updateCampaignStatus(merchantId, customerId, campaignId, budget, budgetId, currentRow) {
662
+ var campaign_status = jQuery("#customSwitch"+currentRow).prop("checked");
663
+ var campaign_name = jQuery("#campaign_name_"+currentRow).val();
664
+ jQuery("#feed-spinner").css("display", "block");
665
+ jQuery.post(
666
+ myAjaxNonces.ajaxurl,
667
+ {
668
+ action: "tvcajax-update-campaign-status",
669
+ merchantId: merchantId,
670
+ customerId: customerId,
671
+ campaignId: campaignId,
672
+ campaignName: campaign_name,
673
+ budget: budget,
674
+ budgetId: budgetId,
675
+ status: campaign_status == true ? 2 : 3,
676
+ campaignStatusNonce: myAjaxNonces.campaignStatusNonce
677
+ },
678
+ function( response ) {
679
+ jQuery("#feed-spinner").css("display", "none");
680
+ console.log(response);
681
+ var rsp = JSON.parse(response)
682
+ if(rsp.status == "success"){
683
+ var message = campaign_name + " status updated successfully";
684
+ alert(message);
685
+ window.location.href = "<?php echo $this->site_url.'shopping_campaigns_page'; ?>";
686
+ }else{
687
+ var message = rsp.message;
688
+ alert(message);
689
+ }
690
+ }
691
+ );
 
692
  }
693
+ </script>
694
+ <?php
695
+ }
696
  }
697
  ?>
includes/setup/google-shopping-feed-sync-product.php CHANGED
@@ -6,15 +6,18 @@ protected $TVC_Admin_Helper;
6
  protected $currentCustomerId;
7
  protected $subscriptionId;
8
  protected $country;
 
9
  public function __construct(){
10
  $this->includes();
11
  $this->TVC_Admin_Helper = new TVC_Admin_Helper();
 
12
  $this->merchantId = $this->TVC_Admin_Helper->get_merchantId();
13
  $this->accountId = $this->TVC_Admin_Helper->get_main_merchantId();
14
  $this->currentCustomerId = $this->TVC_Admin_Helper->get_currentCustomerId();
15
  $this->subscriptionId = $this->TVC_Admin_Helper->get_subscriptionId();
16
  $this->country = $this->TVC_Admin_Helper->get_woo_country();
17
- $this->site_url = "admin.php?page=enhanced-ecommerce-google-analytics-admin-display&tab=";
 
18
  $this->html_run();
19
  }
20
 
@@ -30,12 +33,11 @@ public function html_run(){
30
  }
31
 
32
  public function wooCommerceAttributes() {
33
- $queries = new TVC_Queries();
34
- global $wpdb;
35
- $tve_table_prefix = $wpdb->prefix;
36
- $column1 = json_decode(json_encode($queries->getTableColumns($tve_table_prefix.'posts')), true);
37
- $column2 = json_decode(json_encode($queries->getTableData($tve_table_prefix.'postmeta', ['meta_key'])), true);
38
- return array_merge($column1, $column2);
39
  }
40
 
41
  public function create_form(){
@@ -64,11 +66,12 @@ public function create_form(){
64
  $syncProductStat = $google_detail['prod_sync_status'];
65
  }
66
  }
67
- if(isset($google_detail['prod_sync_list'])){
68
  if ($google_detail['prod_sync_list']) {
69
  $syncProductList = $google_detail['prod_sync_list'];
70
  }
71
- }
 
72
  if(isset($google_detail['setting'])){
73
  if ($google_detail['setting']) {
74
  $googleDetail = $google_detail['setting'];
@@ -83,130 +86,146 @@ public function create_form(){
83
  $last_api_sync_up = date( $date_formate, $google_detail['sync_time']);
84
  }
85
  $is_need_to_update = $this->TVC_Admin_Helper->is_need_to_update_api_to_db();
 
 
 
86
  ?>
87
- <div class="container-fluid">
88
- <div class="row">
89
- <div class= "col col-12">
90
- <div class="card mw-100" style="padding:0;">
91
- <div class="card-body">
92
- <div class="tab-pane show active" id="googleShoppingFeed">
93
- <div class="row">
94
- <div class="col-md-6 col-lg-8 border-right">
95
- <div class="configuration-section" id="config-pt1">
96
- <?php if($this->subscriptionId != ""){?>
97
- <div class="tvc-api-sunc">
98
- <span>
99
- <?php if($last_api_sync_up){
100
- echo "Details last synced at ".$last_api_sync_up;
101
- }else{
102
- echo "Refresh sync up";
103
- }?></span><img id="refresh_api" onclick="call_tvc_api_sync_up();" src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/refresh.png'; ?>">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
  </div>
105
- <?php } ?>
106
- <?php echo get_google_shopping_tabs_html($this->site_url,(isset($googleDetail->google_merchant_center_id))?$googleDetail->google_merchant_center_id:""); ?>
107
  </div>
108
- <div class="mt-3" id="config-pt2">
109
- <div class="sync-new-product" id="sync-product">
110
- <div class="row">
111
- <div class="col-12">
112
- <div class="d-flex justify-content-between ">
113
- <p class="mb-0 align-self-center">Products in your Merchant Center account</p>
114
- <button id="tvc_btn_product_sync" class="btn btn-primary btn-success align-self-center" data-toggle="modal" data-target="#syncProduct">Sync New Products</button>
115
- <a href="admin.php?page=enhanced-ecommerce-google-analytics-admin-display&amp;tab=add_campaign_page" class="btn btn-primary btn-success">Create Smart Shopping Campaign</a>
116
- </div>
 
 
 
 
117
  </div>
118
- </div>
119
- <div class="product-card">
120
- <div class="row">
121
- <div class="col-sm-6 col-lg-3">
122
- <div class="card">
123
- <h3 class="pro-title">Total Products</h3>
124
- <p class="pro-count"><?php
125
- echo ((!empty($syncProductStat)) ? $syncProductStat->total : "0"); ?></p>
126
- </div>
127
- </div>
128
- <div class="col-sm-6 col-lg-3">
129
- <div class="card pending">
130
- <h3 class="pro-title">Pending Review</h3>
131
- <p class="pro-count">
132
- <?php echo (!empty($syncProductStat)) ? $syncProductStat->pending : "0";?></p>
133
- </div>
134
- </div>
135
- <div class="col-sm-6 col-lg-3">
136
- <div class="card approved">
137
- <h3 class="pro-title">Approved</h3>
138
- <p class="pro-count"><?php echo (!empty($syncProductStat)) ? $syncProductStat->approved : "0";?></p>
139
- </div>
140
- </div>
141
- <div class="col-sm-6 col-lg-3">
142
- <div class="card disapproved">
143
- <h3 class="pro-title">Disapproved</h3>
144
- <p class="pro-count"><?php
145
- echo (!empty($syncProductStat)) ? $syncProductStat->disapproved : "0"; ?></p>
146
- </div>
147
- </div>
148
  </div>
149
- </div>
150
- <div class="row">
151
- <div class="col-12">
152
- <div class="account-performance">
153
- <div class="table-section">
154
- <div class="table-responsive">
155
- <table class="table" style="width:100%">
156
- <thead>
157
- <tr>
158
- <th></th>
159
- <th style="vertical-align: top;">Product</th>
160
- <th style="vertical-align: top;">Google status</th>
161
- <th style="vertical-align: top;">Issues</th>
162
- </tr>
163
- </thead>
164
- <tbody>
165
- <?php
166
- if (isset($syncProductList) && count($syncProductList) > 0) {
167
- foreach ($syncProductList as $skey => $sValue) {
168
- echo '<tr><td class="product-image">
169
- <img src="'.$sValue->imageLink.'" alt=""/></td>
170
- <td>'.$sValue->name.'</td>
171
- <td>'.$sValue->googleStatus.'</td>
172
- <td>';
173
- if (count($sValue->issues) > 0) {
174
- $str = '';
175
- foreach ($sValue->issues as $key => $issue) {
176
- if ($key <= 2) {
177
- ($key <= 1) ? $str .= $issue.", <br>" : "";
178
- }
179
- ($key == 3) ? $str .= "..." : "";
180
- }
181
- echo $str;
182
- } else {
183
- echo "---";
184
- }
185
- echo '</td></tr>';
186
- }
187
- }else{
188
- echo '<tr><td colspan="4">Record not found</td></tr>';
189
- } ?>
190
- </tbody>
191
- </table>
192
- </div>
193
- </div>
194
- </div>
195
- </div>
196
- </div>
197
- </div>
198
- </div>
199
- </div>
200
- <div class="col-md-6 col-lg-4">
201
- <div class="right-content"> <?php echo get_tvc_help_html(); ?></div>
202
- </div>
203
- </div>
204
- </div>
205
- </div>
206
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
207
  </div>
208
  </div>
209
  </div>
 
210
  <div class="modal fade popup-modal create-campa overlay" id="syncProduct" data-backdrop="false">
211
  <div class="modal-dialog modal-dialog-centered">
212
  <div class="modal-content">
@@ -252,8 +271,12 @@ public function create_form(){
252
  echo '<div class="row">
253
  <div class="col-6 align-self-center">
254
  <div class="form-group">
255
- <span class="td-head">' . $attribute["field"] . " " . (isset($attribute["required"]) && $attribute["required"] == 1 ? '<span style="color: red;"> *</span>' : "") . '</span>
256
- <small class="form-label-control">' . (isset($attribute["desc"])? $attribute["desc"]:"") . '</small>
 
 
 
 
257
  </div>
258
  </div>
259
  <div class="col-6 align-self-center">
@@ -272,10 +295,10 @@ public function create_form(){
272
  $sel_val = (isset($ee_mapped_attrs[$attribute["field"]]))?$ee_mapped_attrs[$attribute["field"]]:$sel_val_def;
273
  echo $this->TVC_Admin_Helper->tvc_text($attribute["field"], 'number', '', 'Add TAX flat (%)', $sel_val, $require);
274
  }else if($attribute["field"]=='content_language'){
275
- echo $this->TVC_Admin_Helper->tvc_language_select($attribute["field"], '', 'Please Select Attribute', 'en',$require);
276
  }else if($attribute["field"]=='target_country'){
277
  //$name, $class_id, bool $require = false
278
- echo $this->TVC_Admin_Helper->tvc_countries_select($attribute["field"], '', 'Please Select Attribute', $require);
279
  }else{
280
  if(isset($attribute['fixed_options']) && $attribute['fixed_options'] !=""){
281
  $tvc_select_option_t = explode(",", $attribute['fixed_options']);
@@ -284,13 +307,12 @@ public function create_form(){
284
  $tvc_select_option[]['field'] = $o_val;
285
  }
286
  $sel_val = $sel_val_def;
287
- $this->TVC_Admin_Helper->tvc_select($attribute["field"],'','Please Select Attribute', $sel_val, $require, $tvc_select_option);
288
  }else{
289
  $sel_val = (isset($ee_mapped_attrs[$attribute["field"]]))?$ee_mapped_attrs[$attribute["field"]]:$sel_val_def;
290
  //$name, $class_id, $label="Please Select", $sel_val, $require, $option_list
291
- $this->TVC_Admin_Helper->tvc_select($attribute["field"],'','Please Select Attribute', $sel_val, $require, $tvc_select_option);
292
- }
293
-
294
  }
295
  echo '</div>
296
  </div>
@@ -312,12 +334,19 @@ if(isset($googleDetail->google_merchant_center_id) && $googleDetail->google_merc
312
  }?>
313
  <script type="text/javascript">
314
  $(document).ready(function() {
315
- var is_need_to_update = "<?php echo $is_need_to_update; ?>";
 
 
 
 
 
 
 
316
  if(is_need_to_update == 1 || is_need_to_update == true){
317
- tvc_helper.tvc_alert("error","Attention !","Auto-sync up is in the process do not refresh the page.");
318
  call_tvc_api_sync_up();
319
  }
320
-
321
  $(document).on("click", "#tvc_btn_product_sync", function(event){
322
  var is_need_to_domain_claim = "<?php echo $is_need_to_domain_claim; ?>";
323
  if(is_need_to_domain_claim == 1 || is_need_to_domain_claim == true){
@@ -329,23 +358,27 @@ $(document).ready(function() {
329
 
330
  });
331
  }
332
- });
333
  });
 
334
  function call_tvc_api_sync_up(){
335
  var tvs_this = $("#refresh_api");
336
  $("#tvc_msg").remove();
337
  $("#refresh_api").css("visibility","hidden");
338
  $(tvs_this).after('<div class="tvc-nb-spinner" id="tvc-nb-spinner"></div>');
 
339
  jQuery.post(myAjaxNonces.ajaxurl,{
340
  action: "tvc_call_api_sync",
341
  apiSyncupNonce: myAjaxNonces.apiSyncupNonce
342
  },function( response ){
343
  var rsp = JSON.parse(response);
344
- if(rsp.status == "success"){
345
  $("#tvc-nb-spinner").remove();
346
- tvc_helper.tvc_alert("success","",rsp.message,true);
347
- setTimeout(function(){ location.reload();}, 5000);
348
- }
 
 
349
  });
350
  }
351
 
@@ -431,7 +464,7 @@ function submitProductSyncUp() {
431
  window.location.replace("<?php echo $this->site_url.'sync_product_page'; ?>");
432
  }, 7000);
433
  } else {
434
- vc_helper.tvc_alert("error","",rsp.message);
435
  }
436
  }
437
  );
6
  protected $currentCustomerId;
7
  protected $subscriptionId;
8
  protected $country;
9
+ protected $TVC_Admin_DB_Helper;
10
  public function __construct(){
11
  $this->includes();
12
  $this->TVC_Admin_Helper = new TVC_Admin_Helper();
13
+ $this->TVC_Admin_DB_Helper = new TVC_Admin_DB_Helper();
14
  $this->merchantId = $this->TVC_Admin_Helper->get_merchantId();
15
  $this->accountId = $this->TVC_Admin_Helper->get_main_merchantId();
16
  $this->currentCustomerId = $this->TVC_Admin_Helper->get_currentCustomerId();
17
  $this->subscriptionId = $this->TVC_Admin_Helper->get_subscriptionId();
18
  $this->country = $this->TVC_Admin_Helper->get_woo_country();
19
+ $this->site_url = "admin.php?page=enhanced-ecommerce-google-analytics-admin-display&tab=";
20
+ $this->TVC_Admin_Helper->need_auto_update_db();
21
  $this->html_run();
22
  }
23
 
33
  }
34
 
35
  public function wooCommerceAttributes() {
36
+ global $wpdb;
37
+ $tve_table_prefix = $wpdb->prefix;
38
+ $column1 = json_decode(json_encode($this->TVC_Admin_Helper->getTableColumns($tve_table_prefix.'posts')), true);
39
+ $column2 = json_decode(json_encode($this->TVC_Admin_Helper->getTableData($tve_table_prefix.'postmeta', ['meta_key'])), true);
40
+ return array_merge($column1, $column2);
 
41
  }
42
 
43
  public function create_form(){
66
  $syncProductStat = $google_detail['prod_sync_status'];
67
  }
68
  }
69
+ /*if(isset($google_detail['prod_sync_list'])){
70
  if ($google_detail['prod_sync_list']) {
71
  $syncProductList = $google_detail['prod_sync_list'];
72
  }
73
+ }*/
74
+ $syncProductList = $this->TVC_Admin_DB_Helper->tvc_get_results("ee_products_sync_list");
75
  if(isset($google_detail['setting'])){
76
  if ($google_detail['setting']) {
77
  $googleDetail = $google_detail['setting'];
86
  $last_api_sync_up = date( $date_formate, $google_detail['sync_time']);
87
  }
88
  $is_need_to_update = $this->TVC_Admin_Helper->is_need_to_update_api_to_db();
89
+ $args = array('post_type' => 'product', 'post_status' => 'publish', 'posts_per_page' => -1);
90
+ $products = new WP_Query($args);
91
+ $woo_product = $products->found_posts;
92
  ?>
93
+
94
+ <div class="tab-content">
95
+ <div class="tab-pane show active" id="googleShoppingFeed">
96
+ <div class="tab-card">
97
+ <div class="row">
98
+ <div class="col-md-6 col-lg-8 edit-section">
99
+ <div class="edit-header-section">
100
+ <script>
101
+ var back_img = '<img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/left-angle-arrow.svg'; ?>" alt="back"/>';
102
+ document.write('<a href="' + document.referrer + '" class="back-btn">'+back_img+'<span>Back</span></a>');
103
+ </script>
104
+ </div>
105
+ <div class="configuration-section" id="config-pt1">
106
+ <?php if($this->subscriptionId != ""){?>
107
+ <div class="tvc-api-sunc">
108
+ <span>
109
+ <?php if($last_api_sync_up){
110
+ echo "Details last synced at ".$last_api_sync_up;
111
+ }else{
112
+ echo "Refresh sync up";
113
+ }?></span><img id="refresh_api" onclick="call_tvc_api_sync_up();" src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/refresh.png'; ?>">
114
+ </div>
115
+ <?php } ?>
116
+ <?php echo get_google_shopping_tabs_html($this->site_url,(isset($googleDetail->google_merchant_center_id))?$googleDetail->google_merchant_center_id:""); ?>
117
+ </div>
118
+ <div class="mt-3" id="config-pt2">
119
+ <div class="sync-new-product" id="sync-product">
120
+ <div class="row">
121
+ <div class="col-12">
122
+ <div class="d-flex justify-content-between ">
123
+ <p class="mb-0 align-self-center product-title">Products in your Merchant Center account</p>
124
+ <button id="tvc_btn_product_sync" class="btn btn-outline-primary align-self-center" data-toggle="modal" data-target="#syncProduct">Sync New Products</button>
125
  </div>
 
 
126
  </div>
127
+ </div>
128
+ <?php
129
+ $sync_product_total = (property_exists($syncProductStat,"total")) ? $syncProductStat->total : "0";
130
+ $sync_product_approved = (property_exists($syncProductStat,"approved")) ? $syncProductStat->approved : "0";
131
+ $sync_product_disapproved = (property_exists($syncProductStat,"disapproved")) ? $syncProductStat->disapproved : "0";
132
+ $sync_product_pending = (property_exists($syncProductStat,"pending")) ? $syncProductStat->pending : "0"; ?>
133
+ <div class="product-card">
134
+ <div class="row row-cols-5">
135
+ <div class="col">
136
+ <div class="card">
137
+ <h3 class="pro-count"><?php
138
+ echo (($woo_product) ? $woo_product : "0"); ?></h3>
139
+ <p class="pro-title">Total Products</p>
140
  </div>
141
+ </div>
142
+ <div class="col">
143
+ <div class="card">
144
+ <h3 class="pro-count"><?php
145
+ echo $sync_product_total ; ?></h3>
146
+ <p class="pro-title">Sync Products</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
147
  </div>
148
+ </div>
149
+ <div class="col">
150
+ <div class="card pending">
151
+ <h3 class="pro-count">
152
+ <?php echo $sync_product_pending;?></h3>
153
+ <p class="pro-title">Pending Review</p>
154
+ </div>
155
+ </div>
156
+ <div class="col">
157
+ <div class="card approved">
158
+ <h3 class="pro-count"><?php echo $sync_product_approved;?></h3>
159
+ <p class="pro-title">Approved</p>
160
+ </div>
161
+ </div>
162
+ <div class="col">
163
+ <div class="card disapproved">
164
+ <h3 class="pro-count"><?php
165
+ echo $sync_product_disapproved; ?></h3>
166
+ <p class="pro-title">Disapproved</p>
167
+ </div>
168
+ </div>
169
+ </div>
170
+ </div>
171
+ <div class="total-products">
172
+ <div class="account-performance tvc-sync-product-list-wapper">
173
+ <div class="table-section">
174
+ <div class="table-responsive">
175
+ <table id="tvc-sync-product-list" class="table table-striped" style="width:100%">
176
+ <thead>
177
+ <tr>
178
+ <th></th>
179
+ <th style="vertical-align: top;">Product</th>
180
+ <th style="vertical-align: top;">Google status</th>
181
+ <th style="vertical-align: top;">Issues</th>
182
+ </tr>
183
+ </thead>
184
+ <tbody>
185
+ <?php
186
+ if (isset($syncProductList) && count($syncProductList) > 0) {
187
+ foreach ($syncProductList as $skey => $sValue) {
188
+ echo '<tr><td class="product-image">
189
+ <img src="'.$sValue->image_link.'" alt=""/></td>
190
+ <td>'.$sValue->name.'</td>
191
+ <td>'.$sValue->google_status.'</td>
192
+ <td>';
193
+ $p_issues = json_decode($sValue->issues);
194
+ if (count($p_issues) > 0) {
195
+ $str = '';
196
+ foreach ($p_issues as $key => $issue) {
197
+ if ($key <= 2) {
198
+ ($key <= 1) ? $str .= $issue.", <br>" : "";
199
+ }
200
+ ($key == 3) ? $str .= "..." : "";
201
+ }
202
+ echo $str;
203
+ } else {
204
+ echo "---";
205
+ }
206
+ echo '</td></tr>';
207
+ }
208
+ }else{
209
+ echo '<tr><td colspan="4">Record not found</td></tr>';
210
+ } ?>
211
+ </tbody>
212
+ </table>
213
+ </div>
214
+ </div>
215
+ </div>
216
+
217
+ </div>
218
+ </div>
219
+ </div>
220
+ </div>
221
+ <div class="col-md-6 col-lg-4">
222
+ <?php echo get_tvc_help_html(); ?>
223
+ </div>
224
+ </div>
225
  </div>
226
  </div>
227
  </div>
228
+
229
  <div class="modal fade popup-modal create-campa overlay" id="syncProduct" data-backdrop="false">
230
  <div class="modal-dialog modal-dialog-centered">
231
  <div class="modal-content">
271
  echo '<div class="row">
272
  <div class="col-6 align-self-center">
273
  <div class="form-group">
274
+ <span class="td-head">' . $attribute["field"] . " " . (isset($attribute["required"]) && $attribute["required"] == 1 ? '<span style="color: red;"> *</span>' : "") . '
275
+ <div class="tvc-tooltip">
276
+ <span class="tvc-tooltiptext tvc-tooltip-right">'.(isset($attribute["desc"])? $attribute["desc"]:"") .'</span>
277
+ <img src="'. ENHANCAD_PLUGIN_URL.'/admin/images/icon/informationI.svg" alt=""/>
278
+ </div>
279
+ </span>
280
  </div>
281
  </div>
282
  <div class="col-6 align-self-center">
295
  $sel_val = (isset($ee_mapped_attrs[$attribute["field"]]))?$ee_mapped_attrs[$attribute["field"]]:$sel_val_def;
296
  echo $this->TVC_Admin_Helper->tvc_text($attribute["field"], 'number', '', 'Add TAX flat (%)', $sel_val, $require);
297
  }else if($attribute["field"]=='content_language'){
298
+ echo $this->TVC_Admin_Helper->tvc_language_select($attribute["field"], 'content_language', 'Please Select Attribute', 'en',$require);
299
  }else if($attribute["field"]=='target_country'){
300
  //$name, $class_id, bool $require = false
301
+ echo $this->TVC_Admin_Helper->tvc_countries_select($attribute["field"], 'target_country', 'Please Select Attribute', $require);
302
  }else{
303
  if(isset($attribute['fixed_options']) && $attribute['fixed_options'] !=""){
304
  $tvc_select_option_t = explode(",", $attribute['fixed_options']);
307
  $tvc_select_option[]['field'] = $o_val;
308
  }
309
  $sel_val = $sel_val_def;
310
+ $this->TVC_Admin_Helper->tvc_select($attribute["field"],$attribute["field"],'Please Select Attribute', $sel_val, $require, $tvc_select_option);
311
  }else{
312
  $sel_val = (isset($ee_mapped_attrs[$attribute["field"]]))?$ee_mapped_attrs[$attribute["field"]]:$sel_val_def;
313
  //$name, $class_id, $label="Please Select", $sel_val, $require, $option_list
314
+ $this->TVC_Admin_Helper->tvc_select($attribute["field"],$attribute["field"],'Please Select Attribute', $sel_val, $require, $tvc_select_option);
315
+ }
 
316
  }
317
  echo '</div>
318
  </div>
334
  }?>
335
  <script type="text/javascript">
336
  $(document).ready(function() {
337
+ //data table js
338
+ $('#tvc-sync-product-list').DataTable({
339
+ "ordering": false,
340
+ "scrollY": "600px",
341
+ "lengthMenu": [ 10, 20, 50, 100, 200 ]
342
+ });
343
+ //auto syncup call
344
+ var is_need_to_update = "<?php echo $is_need_to_update; ?>";
345
  if(is_need_to_update == 1 || is_need_to_update == true){
346
+ //tvc_helper.tvc_alert("error","Attention !","Auto-sync up is in the process do not refresh the page.");
347
  call_tvc_api_sync_up();
348
  }
349
+ //custom call for domain clain while product sync call
350
  $(document).on("click", "#tvc_btn_product_sync", function(event){
351
  var is_need_to_domain_claim = "<?php echo $is_need_to_domain_claim; ?>";
352
  if(is_need_to_domain_claim == 1 || is_need_to_domain_claim == true){
358
 
359
  });
360
  }
361
+ });
362
  });
363
+ //Update syncup detail by ajax call
364
  function call_tvc_api_sync_up(){
365
  var tvs_this = $("#refresh_api");
366
  $("#tvc_msg").remove();
367
  $("#refresh_api").css("visibility","hidden");
368
  $(tvs_this).after('<div class="tvc-nb-spinner" id="tvc-nb-spinner"></div>');
369
+ tvc_helper.tvc_alert("error","Attention !","Sync up is in the process do not refresh the page. it may take few minutes, if GMC product sync count is large.");
370
  jQuery.post(myAjaxNonces.ajaxurl,{
371
  action: "tvc_call_api_sync",
372
  apiSyncupNonce: myAjaxNonces.apiSyncupNonce
373
  },function( response ){
374
  var rsp = JSON.parse(response);
375
+ if(rsp.error == false){
376
  $("#tvc-nb-spinner").remove();
377
+ tvc_helper.tvc_alert("success","",rsp.message,true,2000);
378
+ }else{
379
+ tvc_helper.tvc_alert("error","",rsp.message,true,2000);
380
+ }
381
+ setTimeout(function(){ location.reload();}, 2000);
382
  });
383
  }
384
 
464
  window.location.replace("<?php echo $this->site_url.'sync_product_page'; ?>");
465
  }, 7000);
466
  } else {
467
+ tvc_helper.tvc_alert("error","",rsp.message);
468
  }
469
  }
470
  );
includes/setup/google-shopping-feed.php CHANGED
@@ -6,7 +6,8 @@ class GoogleShoppingFeed {
6
  public function __construct() {
7
  $this->TVC_Admin_Helper = new TVC_Admin_Helper();
8
  $this->subscriptionId = $this->TVC_Admin_Helper->get_subscriptionId();
9
- $this->site_url = "admin.php?page=enhanced-ecommerce-google-analytics-admin-display&tab=";
 
10
  $this->create_form();
11
  }
12
  public function add_list_html($title, $val){
@@ -77,11 +78,13 @@ class GoogleShoppingFeed {
77
  $syncProductStat = $google_detail['prod_sync_status'];
78
  }
79
  }
80
- $sync_product_total = (!empty($syncProductStat)) ? $syncProductStat->total : "0";
81
- $sync_product_approved = (!empty($syncProductStat)) ? $syncProductStat->approved : "0";
82
- $sync_product_disapproved = (!empty($syncProductStat)) ? $syncProductStat->disapproved : "0";
83
- $sync_product_pending = (!empty($syncProductStat)) ? $syncProductStat->pending : "0";
84
-
 
 
85
  $totalCampaigns = 0;$campaignActive = 0; $campaignClicks = 0;
86
  $campaignCost = 0; $campaignConversions = 0; $campaignSales = 0;
87
  // Get currency
@@ -110,149 +113,146 @@ class GoogleShoppingFeed {
110
  $campaignSales = (isset($googleDetail->google_ads_id) && $googleDetail->google_ads_id != "" ? $currency . $campaignSales : '0');
111
  }
112
  $last_api_sync_up = "";
113
- if(isset($google_detail['sync_time']) && $google_detail['sync_time']){
114
- $date_formate=get_option('date_format')." ".get_option('time_format');
115
- if($date_formate ==""){
116
- $date_formate = 'M-d-Y H:i';
117
- }
118
  $last_api_sync_up = date( $date_formate, $google_detail['sync_time']);
119
  }
120
  $is_need_to_update = $this->TVC_Admin_Helper->is_need_to_update_api_to_db();
121
  ?>
122
- <div class="container-fluid">
123
- <div class="row">
124
- <div class= "col col-12">
125
- <div class="card mw-100" style="padding:0;">
126
- <div class="card-body">
127
- <div class="tab-pane show active" id="googleShoppingFeed">
128
- <div class="row">
129
- <div class="col-md-6 col-lg-8 border-right">
130
- <?php if($this->subscriptionId != ""){?>
131
- <div class="tvc-api-sunc">
132
- <span>
133
- <?php if($last_api_sync_up){
134
- echo "Details last synced at ".$last_api_sync_up;
135
- }else{
136
- echo "Refresh sync up";
137
- }?></span><img id="refresh_api" onclick="call_tvc_api_sync_up();" src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/refresh.png'; ?>">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
138
  </div>
139
- <?php } ?>
140
- <?php
141
- $last_auto_sync = $this->TVC_Admin_Helper->get_last_auto_sync_product_info();
142
- if(!empty($last_auto_sync)){
143
- $status = isset($last_auto_sync['status'])?$last_auto_sync['status']:0;
144
- $status_text = array("0"=>"Failed","1"=>"Completed");
145
- $create_sync = (isset($last_auto_sync['create_sync']))?$last_auto_sync['create_sync']:"";
146
- $create_sync = date($date_formate,strtotime($create_sync));
147
- $next_sync = (isset($last_auto_sync['next_sync']))?$last_auto_sync['next_sync']:"";
148
- $next_sync = date($date_formate,strtotime($next_sync));
149
- ?>
150
- <div class="product-auto-sync-details">
151
- <strong>Last auto product sync details</strong>
152
- <table>
153
- <tr><th>Last sync</th><th width="10">Sync product</th><th width="10px">Status</th><th>Upcoming sync</th></tr>
154
- <tr>
155
- <td><?php echo $create_sync;?></td>
156
- <td width="10"><?php echo (isset($last_auto_sync['total_sync_product']))?$last_auto_sync['total_sync_product']:"";?></td>
157
- <td><?php echo $status_text[$status]; ?></td>
158
- <td><?php echo $next_sync;?></td>
159
- </tr>
160
- </table>
161
- </div>
162
- <?php
163
- }
164
- ?>
165
- <div class="configuration-section" id="config-pt1">
166
- <div class="row confg-card gsf-sec">
167
- <div class="col-md-12 col-lg-4 mb-3 mb-lg-0">
168
- <div class="card configure-card">
169
- <div class="card-header">
170
- <h4 class="confg-title">Configuration</h4>
171
- </div>
172
- <div class="card-body">
173
- <ul class="list-unstyled"><?php
174
- $is_domain_claim = (isset($googleDetail->is_domain_claim))?$googleDetail->is_domain_claim:"";
175
- $is_site_verified = (isset($googleDetail->is_site_verified))?$googleDetail->is_site_verified:"";
176
- echo $this->configuration_list_html("Google merchant center",(isset($googleDetail->google_merchant_center_id))?$googleDetail->google_merchant_center_id:"");
177
- if($is_site_verified ==1){
178
- echo $this->configuration_list_html("Site Verified",$is_site_verified);
179
- }else{
180
- echo $this->configuration_error_list_html("Site Verified",$is_site_verified,"call_site_verified", $googleDetail);
181
- }
182
- if($is_domain_claim ==1){
183
- echo $this->configuration_list_html("Domain claim",$is_domain_claim);
184
- }else{
185
- echo $this->configuration_error_list_html("Domain claim",$is_domain_claim, 'call_domain_claim', $googleDetail);
186
- }
187
- echo $this->configuration_list_html("Google Ads linking",((isset($googleDetail->google_ads_id)))?$googleDetail->google_ads_id:"");
188
- ?>
189
- </ul>
190
- </div>
191
- <div class="card-footer">
192
- <a href="<?php echo $this->site_url.'gaa_config_page'; ?>" class="btn btn-primary btn-success w-100" id="configuration">Edit</a>
193
- </div>
194
- </div>
195
- </div>
196
- <div class="col-md-12 col-lg-4 mb-3 mb-lg-0">
197
- <div class="card">
198
- <div class="card-header">
199
- <h4 class="confg-title">Product Sync</h4>
200
- </div>
201
- <div class="card-body">
202
- <ul class="list-unstyled">
203
- <?php
204
- echo $this->add_list_html("Active products in WooCommerce",$totalActiveWooProduct)
205
- .$this->add_list_html("Total synced products in Merchant center", $sync_product_total)
206
- .$this->add_list_html("Approved", $sync_product_approved)
207
- .$this->add_list_html("Disapproved", $sync_product_disapproved)
208
- .$this->add_list_html("Pending", $sync_product_pending);
209
- ?>
210
- </ul>
211
- </div>
212
- <?php
213
- if (isset($googleDetail->google_merchant_center_id) && $googleDetail->google_merchant_center_id != "") {?>
214
- <div class="card-footer">
215
- <a href="<?php echo $this->site_url.'sync_product_page'; ?>" class="btn btn-primary btn-success w-100" id="product-sync">Edit</a>
216
- </div>
217
- <?php } ?>
218
- </div>
219
- </div>
220
- <div class="col-md-12 col-lg-4 mb-3 mb-lg-0">
221
- <div class="card">
222
- <div class="card-header">
223
- <h4 class="confg-title">Smart Shopping Campaigns</h4>
224
- </div>
225
- <div class="card-body">
226
- <ul class="list-unstyled">
227
- <?php
228
- echo $this->add_list_html("Total campaign",$totalCampaigns)
229
- .$this->add_list_html("Active campaigns",$campaignActive)
230
- .$this->add_list_html("Cost",$campaignCost)
231
- .$this->add_list_html("Click",$campaignClicks)
232
- .$this->add_list_html("Conversion%",$campaignConversions)
233
- .$this->add_list_html("Sales",$campaignSales); ?>
234
- </ul>
235
- </div>
236
- <?php if (isset($googleDetail->google_ads_id) && $googleDetail->google_ads_id != "") { ?>
237
- <div class="card-footer">
238
- <a href="<?php echo $this->site_url.'shopping_campaigns_page'; ?>" id="smart-shopping-campaigns" class="btn btn-primary btn-success w-100">Edit</a>
239
- </div>
240
- <?php }?>
241
- </div>
242
- </div>
243
  </div>
244
  </div>
245
  </div>
246
- <div class="col-md-6 col-lg-4">
247
- <div class="right-content"><?php echo get_tvc_help_html(); ?></div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
248
  </div>
249
  </div>
250
  </div>
251
- </div>
252
- </div>
253
- </div>
 
 
 
254
  </div>
255
  </div>
 
256
  <script type="text/javascript">
257
  function call_site_verified(){
258
  var tvs_this = event.target;
@@ -294,7 +294,6 @@ class GoogleShoppingFeed {
294
  $(document).ready(function() {
295
  var is_need_to_update = "<?php echo $is_need_to_update; ?>";
296
  if(is_need_to_update == 1 || is_need_to_update == true){
297
- tvc_helper.tvc_alert("error","Attention !","Auto-sync up is in the process do not refresh the page.");
298
  call_tvc_api_sync_up();
299
  }
300
  });
@@ -303,16 +302,19 @@ class GoogleShoppingFeed {
303
  $("#tvc_msg").remove();
304
  $("#refresh_api").css("visibility","hidden");
305
  $(tvs_this).after('<div class="tvc-nb-spinner" id="tvc-nb-spinner"></div>');
 
306
  jQuery.post(myAjaxNonces.ajaxurl,{
307
  action: "tvc_call_api_sync",
308
  apiSyncupNonce: myAjaxNonces.apiSyncupNonce
309
  },function( response ){
310
  var rsp = JSON.parse(response);
311
- if(rsp.status == "success"){
312
  $("#tvc-nb-spinner").remove();
313
- tvc_helper.tvc_alert("success","",rsp.message,true);
314
- setTimeout(function(){ location.reload();}, 5000);
315
- }
 
 
316
  });
317
  }
318
  </script>
6
  public function __construct() {
7
  $this->TVC_Admin_Helper = new TVC_Admin_Helper();
8
  $this->subscriptionId = $this->TVC_Admin_Helper->get_subscriptionId();
9
+ $this->site_url = "admin.php?page=enhanced-ecommerce-google-analytics-admin-display&tab=";
10
+ $this->TVC_Admin_Helper->need_auto_update_db();
11
  $this->create_form();
12
  }
13
  public function add_list_html($title, $val){
78
  $syncProductStat = $google_detail['prod_sync_status'];
79
  }
80
  }
81
+ $sync_product_total = 0; $sync_product_approved = 0; $sync_product_disapproved = 0; $sync_product_pending = 0;
82
+ if($syncProductStat){
83
+ $sync_product_total = (property_exists($syncProductStat,"total")) ? $syncProductStat->total : "0";
84
+ $sync_product_approved = (property_exists($syncProductStat,"approved")) ? $syncProductStat->approved : "0";
85
+ $sync_product_disapproved = (property_exists($syncProductStat,"disapproved")) ? $syncProductStat->disapproved : "0";
86
+ $sync_product_pending = (property_exists($syncProductStat,"pending")) ? $syncProductStat->pending : "0";
87
+ }
88
  $totalCampaigns = 0;$campaignActive = 0; $campaignClicks = 0;
89
  $campaignCost = 0; $campaignConversions = 0; $campaignSales = 0;
90
  // Get currency
113
  $campaignSales = (isset($googleDetail->google_ads_id) && $googleDetail->google_ads_id != "" ? $currency . $campaignSales : '0');
114
  }
115
  $last_api_sync_up = "";
116
+ $date_formate=get_option('date_format')." ".get_option('time_format');
117
+ if($date_formate ==""){
118
+ $date_formate = 'M-d-Y H:i';
119
+ }
120
+ if(isset($google_detail['sync_time']) && $google_detail['sync_time']){
121
  $last_api_sync_up = date( $date_formate, $google_detail['sync_time']);
122
  }
123
  $is_need_to_update = $this->TVC_Admin_Helper->is_need_to_update_api_to_db();
124
  ?>
125
+
126
+
127
+ <div class="tab-content">
128
+ <div class="tab-pane show active" id="googleShoppingFeed">
129
+ <div class="tab-card">
130
+ <div class="row">
131
+ <div class="col-md-6 col-lg-8 border-right">
132
+ <?php if($this->subscriptionId != ""){?>
133
+ <div class="tvc-api-sunc">
134
+ <span>
135
+ <?php if($last_api_sync_up){
136
+ echo "Details last synced at ".$last_api_sync_up;
137
+ }else{
138
+ echo "Refresh sync up";
139
+ }?></span><img id="refresh_api" onclick="call_tvc_api_sync_up();" src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/refresh.png'; ?>">
140
+ </div>
141
+ <?php } ?>
142
+ <?php
143
+ $last_auto_sync = $this->TVC_Admin_Helper->get_last_auto_sync_product_info();
144
+ if(!empty($last_auto_sync) && isset($googleDetail->google_merchant_center_id) && $googleDetail->google_merchant_center_id && $this->subscriptionId != ""){
145
+ $status = isset($last_auto_sync['status'])?$last_auto_sync['status']:0;
146
+ $status_text = array("0"=>"Failed","1"=>"Completed");
147
+ $create_sync = (isset($last_auto_sync['create_sync']))?$last_auto_sync['create_sync']:"";
148
+ $create_sync = date($date_formate,strtotime($create_sync));
149
+ $next_sync = (isset($last_auto_sync['next_sync']))?$last_auto_sync['next_sync']:"";
150
+ $next_sync = date($date_formate,strtotime($next_sync));
151
+ ?>
152
+ <div class="product-auto-sync-details">
153
+ <strong>Last auto product sync details</strong>
154
+ <table>
155
+ <tr><th>Last sync</th><th>Sync product</th><th>Status</th><th>Upcoming sync</th></tr>
156
+ <tr>
157
+ <td><?php echo $create_sync;?></td>
158
+ <td><?php echo (isset($last_auto_sync['total_sync_product']))?$last_auto_sync['total_sync_product']:"";?></td>
159
+ <td><?php echo $status_text[$status]; ?></td>
160
+ <td><?php echo $next_sync;?></td>
161
+ </tr>
162
+ </table>
163
+ </div>
164
+ <?php
165
+ }
166
+ ?>
167
+ <div class="configuration-section" id="config-pt1">
168
+ <div class="row confg-card gsf-sec">
169
+ <div class="col-md-12 col-lg-4 mb-3 mb-lg-0">
170
+ <div class="card configure-card">
171
+ <div class="card-header">
172
+ <h4 class="confg-title">Configuration</h4>
173
+ </div>
174
+ <div class="card-body">
175
+ <ul class="list-unstyled"><?php
176
+ $is_domain_claim = (isset($googleDetail->is_domain_claim))?$googleDetail->is_domain_claim:"";
177
+ $is_site_verified = (isset($googleDetail->is_site_verified))?$googleDetail->is_site_verified:"";
178
+ echo $this->configuration_list_html("Google merchant center",(isset($googleDetail->google_merchant_center_id))?$googleDetail->google_merchant_center_id:"");
179
+ if($is_site_verified ==1){
180
+ echo $this->configuration_list_html("Site Verified",$is_site_verified);
181
+ }else{
182
+ echo $this->configuration_error_list_html("Site Verified",$is_site_verified,"call_site_verified", $googleDetail);
183
+ }
184
+ if($is_domain_claim ==1){
185
+ echo $this->configuration_list_html("Domain claim",$is_domain_claim);
186
+ }else{
187
+ echo $this->configuration_error_list_html("Domain claim",$is_domain_claim, 'call_domain_claim', $googleDetail);
188
+ }
189
+ echo $this->configuration_list_html("Google Ads linking",((isset($googleDetail->google_ads_id)))?$googleDetail->google_ads_id:"");
190
+ ?>
191
+ </ul>
192
  </div>
193
+ <div class="card-footer">
194
+ <a href="<?php echo $this->site_url.'gaa_config_page'; ?>" class="btn btn-primary" id="configuration">Edit</a>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
195
  </div>
196
  </div>
197
  </div>
198
+ <div class="col-md-12 col-lg-4 mb-3 mb-lg-0">
199
+ <div class="card">
200
+ <div class="card-header">
201
+ <h4 class="confg-title">Product Sync</h4>
202
+ </div>
203
+ <div class="card-body">
204
+ <ul class="list-unstyled">
205
+ <?php
206
+ echo $this->add_list_html("Active products in WooCommerce",$totalActiveWooProduct)
207
+ .$this->add_list_html("Total synced products in Merchant center", $sync_product_total)
208
+ .$this->add_list_html("Approved", $sync_product_approved)
209
+ .$this->add_list_html("Disapproved", $sync_product_disapproved)
210
+ .$this->add_list_html("Pending", $sync_product_pending);
211
+ ?>
212
+ </ul>
213
+ </div>
214
+ <?php
215
+ if (isset($googleDetail->google_merchant_center_id) && $googleDetail->google_merchant_center_id != "") {?>
216
+ <div class="card-footer">
217
+ <a href="<?php echo $this->site_url.'sync_product_page'; ?>" class="btn btn-primary" id="product-sync">Edit</a>
218
+ </div>
219
+ <?php } ?>
220
+ </div>
221
+ </div>
222
+ <div class="col-md-12 col-lg-4 mb-3 mb-lg-0">
223
+ <div class="card">
224
+ <div class="card-header">
225
+ <h4 class="confg-title">Smart Shopping Campaigns</h4>
226
+ </div>
227
+ <div class="card-body">
228
+ <ul class="list-unstyled">
229
+ <?php
230
+ echo $this->add_list_html("Total campaign",$totalCampaigns)
231
+ .$this->add_list_html("Active campaigns",$campaignActive)
232
+ .$this->add_list_html("Cost",$campaignCost)
233
+ .$this->add_list_html("Click",$campaignClicks)
234
+ .$this->add_list_html("Conversion%",$campaignConversions)
235
+ .$this->add_list_html("Sales",$campaignSales); ?>
236
+ </ul>
237
+ </div>
238
+ <?php if (isset($googleDetail->google_ads_id) && $googleDetail->google_ads_id != "") { ?>
239
+ <div class="card-footer">
240
+ <a href="<?php echo $this->site_url.'shopping_campaigns_page'; ?>" id="smart-shopping-campaigns" class="btn btn-primary">Edit</a>
241
+ </div>
242
+ <?php }?>
243
+ </div>
244
  </div>
245
  </div>
246
  </div>
247
+ </div>
248
+ <div class="col-md-6 col-lg-4">
249
+ <?php echo get_tvc_help_html(); ?>
250
+ </div>
251
+ </div>
252
+ </div>
253
  </div>
254
  </div>
255
+
256
  <script type="text/javascript">
257
  function call_site_verified(){
258
  var tvs_this = event.target;
294
  $(document).ready(function() {
295
  var is_need_to_update = "<?php echo $is_need_to_update; ?>";
296
  if(is_need_to_update == 1 || is_need_to_update == true){
 
297
  call_tvc_api_sync_up();
298
  }
299
  });
302
  $("#tvc_msg").remove();
303
  $("#refresh_api").css("visibility","hidden");
304
  $(tvs_this).after('<div class="tvc-nb-spinner" id="tvc-nb-spinner"></div>');
305
+ tvc_helper.tvc_alert("error","Attention !","Sync up is in the process do not refresh the page. it may take few minutes, if GMC product sync count is large.");
306
  jQuery.post(myAjaxNonces.ajaxurl,{
307
  action: "tvc_call_api_sync",
308
  apiSyncupNonce: myAjaxNonces.apiSyncupNonce
309
  },function( response ){
310
  var rsp = JSON.parse(response);
311
+ if(rsp.error == false){
312
  $("#tvc-nb-spinner").remove();
313
+ tvc_helper.tvc_alert("success","",rsp.message,true,2000);
314
+ }else{
315
+ tvc_helper.tvc_alert("error","",rsp.message,true,2000);
316
+ }
317
+ setTimeout(function(){ location.reload();}, 2000);
318
  });
319
  }
320
  </script>
includes/setup/help-html.php CHANGED
@@ -1,39 +1,57 @@
1
  <?php
2
  function get_connect_google_popup_html(){
3
- $TVC_Admin_Helper = new TVC_Admin_Helper();
4
- return '<div class="modal fade" id="tvc_google_connect" data-backdrop="static" data-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
5
- <div class="modal-dialog modal-dialog-centered">
6
- <div class="modal-content">
7
- <div class="modal-header">
8
- <h5 class="modal-title" id="staticBackdropLabel">Connect Tatvic with your website</h5>
9
- <button type="button" class="close" data-dismiss="modal" aria-label="Close">
10
- <span aria-hidden="true">&times;</span>
11
- </button>
12
- </div>
13
- <div class="modal-body">
14
- By continuing from here, you will be redirected to Tatvic’s website to configure your google analytics, google ads and google merchant center accounts.
15
- <br>
16
- <br>
17
- Make sure you sign in with the google account that has all privileges to access google analytics, google ads and google merchant center account.
18
- </div>
19
- <div class="modal-footer">
20
- <a target="_blank" class="ee-oauth-container btn darken-4 white black-text" href="'. $TVC_Admin_Helper->get_connect_url().'" style="text-transform:none; margin: 0 auto;">
21
-
22
- <p style="font-size: inherit; margin-top:5px;"><img width="20px" style="margin-right:8px" alt="Google sign-in"
23
- 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>
24
- </a>
25
- <!--sigin with google end-->
26
- </div>
27
- </div>
 
 
 
 
 
 
 
 
 
 
 
28
  </div>
29
- </div>';
 
 
 
 
 
 
 
30
  }
31
  function info_htnml($validation){
32
- if($validation == true){
33
- return '<img src="'.ENHANCAD_PLUGIN_URL.'/admin/images/config-success.svg" alt="configuration success" class="config-success">';
34
- }else{
35
- return '<img src="'.ENHANCAD_PLUGIN_URL.'/admin/images/exclaimation.png" alt="configuration success" class="config-fail">';
36
- }
37
  }
38
  function get_google_shopping_tabs_html($site_url, $google_merchant_center_id){
39
  $site_url_p = (isset($google_merchant_center_id) && $google_merchant_center_id != '')?$site_url:"javascript:void(0);";
@@ -44,7 +62,6 @@ function get_google_shopping_tabs_html($site_url, $google_merchant_center_id){
44
  $tab = (isset($_GET['tab']) && $_GET['tab'])?$_GET['tab']:"";
45
  $TVC_Admin_Helper = new TVC_Admin_Helper();
46
  $setting_status = $TVC_Admin_Helper->check_setting_status_sub_tabs();
47
- //print_r($setting_status);
48
  $google_shopping_conf_msg ="";
49
  if(isset($setting_status['google_shopping_conf'] ) && $setting_status['google_shopping_conf'] == false && isset($setting_status["google_shopping_conf_msg"]) && $setting_status["google_shopping_conf_msg"]){
50
  $google_shopping_conf_msg = '<span class="tvc-tooltiptext tvc-tooltip-right">'.((isset($setting_status["google_shopping_conf_msg"]))?$setting_status["google_shopping_conf_msg"]:"").'</span>';
@@ -59,75 +76,305 @@ function get_google_shopping_tabs_html($site_url, $google_merchant_center_id){
59
  $google_shopping_p_campaigns_msg = '<span class="tvc-tooltiptext tvc-tooltip-right">'.((isset($setting_status["google_shopping_p_campaigns_msg"]))?$setting_status["google_shopping_p_campaigns_msg"]:"").'</span>';
60
  }
61
 
62
- return '<div class="row confg-card gsf-sec">
63
- <div class="col-md-12 col-lg-4 mb-3 mb-lg-0">
64
- <div class="config-head-nav">
65
- <div class="tvc-tooltip btn w-100 '.(($tab=="gaa_config_page")?"config-head-active":"").'">
66
- <a href="' . $site_url . 'gaa_config_page" id="smart-shopping-campaigns">Configuration</a>'.$google_shopping_conf_msg
67
- .((isset($setting_status['google_shopping_conf']) )?info_htnml($setting_status['google_shopping_conf']):"").'
68
- </div>
69
- </div>
70
- </div>
71
- <div class="col-md-12 col-lg-4 mb-3 mb-lg-0">
72
- <div class="config-head-nav">
73
- <div class="tvc-tooltip btn w-100 '.(($tab=="sync_product_page")?"config-head-active":"").'" '.$site_url_p_target.'>
74
- <a href="'.$site_url_p.'sync_product_page" id="smart-shopping-campaigns">Product Sync</a>'. $google_shopping_p_sync_msg
75
- .((isset($setting_status['google_shopping_p_sync']) )?info_htnml($setting_status['google_shopping_p_sync']):"").'
76
- </div>
77
- </div>
78
- </div>
79
- <div class="col-md-12 col-lg-4 mb-3 mb-lg-0">
80
- <div class="config-head-nav">
81
- <div class="tvc-tooltip btn w-100 '.(($tab=="shopping_campaigns_page")?"config-head-active":"").'" '.$site_url_p_target.'>
82
- <a href="' . $site_url_p . 'shopping_campaigns_page" id="smart-shopping-campaigns">Smart Shopping Campaigns</a>'. $google_shopping_p_campaigns_msg
83
- .((isset($setting_status['google_shopping_p_campaigns']) )?info_htnml($setting_status['google_shopping_p_campaigns']):"").'
84
- </div>
85
- </div>
86
- </div>
87
- </div>';
88
  }
89
  function get_tvc_google_ads_help_html(){
90
- return '<h5 class="content-heading">Help Center:</h5>
91
- <p>Once you select or create a new google ads account, your account will be enabled for the following:</p>
92
- <ol>
93
- <li>Remarketing and dynamic remarketing tags for all the major eCommerce events on your website (Optional)</li>
94
- <li>Your google ads account will be linked with the previously selected google analytics account (Optional)</li>
95
- <li>Your google ads account will be linked with google merchant center account in the next step so that you can start running google shopping campaigns(Optional)</li>
96
- </ol>
97
-
98
- <p>
99
- <a target="_blank" href="http://plugins.tatvic.com/help-center/Installation-Manual.pdf">Installation manual</a> |
100
- <a target="_blank" href="http://plugins.tatvic.com/help-center/Google-shopping-Guide.pdf">Google shopping guide</a> |
101
- <a target="_blank" href="https://wordpress.org/plugins/enhanced-e-commerce-for-woocommerce-store/faq/
102
- ">FAQ</a>
103
- </p>
104
- <h5 class="content-heading">Business Value:</h5>
105
- <ol>
106
- <li>With dynamic remarketing tags, you will be able to show ads to your past site visitors with specific product information that is tailored to your customer’s previous site visits.</li>
107
- <li>This plugin enables dynamic remarketing tags for crucial eCommerce events like product list views, product detail page views, add to cart and final purchase event.</li>
108
- <li>Dynamic remarketing along with the product feeds in your merchant center account will enable you for smart shopping campaigns which is very essential for any eCommerce business globally. <a target="_blank" href="https://support.google.com/google-ads/answer/3124536?hl=en">Learn More</a></li>
109
- </ol>
110
- ';
111
- }
112
- function get_tvc_help_html(){
113
- return '<h5 class="content-heading">Help Center:</h5>
114
  <ol>
115
- <li>Set up your Google Merchant Center Account and make your WooCommerce shop and products available to millions of shoppers across Google.
116
- </li>
117
- <li>Our plugin will help you automate everything you need to make your products available to interested customers across Google.</li>
118
- <li>Follow <a target="_blank" href="https://support.google.com/merchants/answer/6363310?hl=en&ref_topic=3163841">merchant center guidelines for site requirements</a> in order to avoid account suspension issues. </li>
119
  </ol>
120
- <p>
121
- <a target="_blank" href="http://plugins.tatvic.com/help-center/Installation-Manual.pdf">Installation manual</a> |
122
- <a target="_blank" href="http://plugins.tatvic.com/help-center/Google-shopping-Guide.pdf">Google shopping guide</a> |
123
- <a target="_blank" href="https://wordpress.org/plugins/enhanced-e-commerce-for-woocommerce-store/faq/
124
- ">FAQ</a>
125
- </p>
126
- <h5 class="content-heading">Business Value:</h5>
127
- <ol>
128
- <li>Opt your product data into programmes, like surfaces across Google, Shopping ads, local inventory ads and Shopping Actions, to highlight your products to shoppers across Google.</li>
129
- <li>Your store’s products will be eligible to get featured under the shopping tab when anyone searches for products that match your store’s product attributes.</li>
130
- <li>Reach out to customers leaving your store by running smart shopping campaigns based on their past site behavior. <a target="_blank" href="https://www.google.com/intl/en_in/retail/?fmp=1&utm_id=bkws&mcsubid=in-en-ha-g-mc-bkws">Learn More</a></li>
131
- </ol>';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
132
  }
133
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <?php
2
  function get_connect_google_popup_html(){
3
+ $TVC_Admin_Helper = new TVC_Admin_Helper();
4
+ return '<div class="modal fade popup-modal overlay" id="tvc_google_connect" data-backdrop="static" data-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
5
+ <div class="modal-dialog modal-dialog-centered">
6
+ <div class="modal-content">
7
+ <div class="modal-body">
8
+ <h5 class="modal-title" id="staticBackdropLabel">Connect Tatvic with your website</h5>
9
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close">
10
+ <span aria-hidden="true">&times;</span>
11
+ </button>
12
+ <br>
13
+ <p> By continuing from here, you will be redirected to Tatvic’s website to configure your google analytics, google ads and google merchant center accounts.</p>
14
+
15
+ <p>Make sure you sign in with the google account that has all privileges to access google analytics, google ads and google merchant center account.</p>
16
+ </div>
17
+ <div class="modal-footer">
18
+ <a target="_blank" class="ee-oauth-container btn darken-4 white black-text" href="'. $TVC_Admin_Helper->get_connect_url().'" style="text-transform:none; margin: 0 auto;">
19
+ <p style="font-size: inherit; margin-top:5px;"><img width="20px" style="margin-right:8px" alt="Google sign-in" 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>
20
+ </a>
21
+ </div>
22
+ </div>
23
+ </div>
24
+ </div>';
25
+ }
26
+ function get_connect_google_popup_html_to_active_licence(){
27
+ $TVC_Admin_Helper = new TVC_Admin_Helper();
28
+ return '<div class="modal fade popup-modal overlay" id="tvc_google_connect_active_licence">
29
+ <div class="modal-dialog modal-dialog-centered">
30
+ <div class="modal-content">
31
+ <div class="modal-body">
32
+ <h5 class="modal-title" id="staticBackdropLabel">Connect Tatvic with your website to active licence key</h5>
33
+ <button type="button" id="tvc_google_connect_active_licence_close" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span>
34
+ </button>
35
+ <br>
36
+ <p> By continuing from here, you will be redirected to Tatvic’s website to configure your google analytics, google ads and google merchant center accounts.</p>
37
+
38
+ <p>Make sure you sign in with the google account that has all privileges to access google analytics, google ads and google merchant center account.</p>
39
  </div>
40
+ <div class="modal-footer">
41
+ <a target="_blank" class="ee-oauth-container btn darken-4 white black-text" href="'. $TVC_Admin_Helper->get_connect_url().'" style="text-transform:none; margin: 0 auto;">
42
+ <p style="font-size: inherit; margin-top:5px;"><img width="20px" style="margin-right:8px" alt="Google sign-in" 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>
43
+ </a>
44
+ </div>
45
+ </div>
46
+ </div>
47
+ </div>';
48
  }
49
  function info_htnml($validation){
50
+ if($validation == true){
51
+ return '<img src="'.ENHANCAD_PLUGIN_URL.'/admin/images/config-success.svg" alt="configuration success" class="config-success">';
52
+ }else{
53
+ return '<img src="'.ENHANCAD_PLUGIN_URL.'/admin/images/exclaimation.png" alt="configuration success" class="config-fail">';
54
+ }
55
  }
56
  function get_google_shopping_tabs_html($site_url, $google_merchant_center_id){
57
  $site_url_p = (isset($google_merchant_center_id) && $google_merchant_center_id != '')?$site_url:"javascript:void(0);";
62
  $tab = (isset($_GET['tab']) && $_GET['tab'])?$_GET['tab']:"";
63
  $TVC_Admin_Helper = new TVC_Admin_Helper();
64
  $setting_status = $TVC_Admin_Helper->check_setting_status_sub_tabs();
 
65
  $google_shopping_conf_msg ="";
66
  if(isset($setting_status['google_shopping_conf'] ) && $setting_status['google_shopping_conf'] == false && isset($setting_status["google_shopping_conf_msg"]) && $setting_status["google_shopping_conf_msg"]){
67
  $google_shopping_conf_msg = '<span class="tvc-tooltiptext tvc-tooltip-right">'.((isset($setting_status["google_shopping_conf_msg"]))?$setting_status["google_shopping_conf_msg"]:"").'</span>';
76
  $google_shopping_p_campaigns_msg = '<span class="tvc-tooltiptext tvc-tooltip-right">'.((isset($setting_status["google_shopping_p_campaigns_msg"]))?$setting_status["google_shopping_p_campaigns_msg"]:"").'</span>';
77
  }
78
 
79
+ return '<ul class="nav nav-tabs nav-justified edit-tabs" id="myTab" role="tablist">
80
+ <li class="nav-item" role="presentation">
81
+ <div class="tvc-tooltip nav-link '.(($tab=="gaa_config_page")?"active":"").'">
82
+ <a href="' . $site_url . 'gaa_config_page" id="smart-shopping-campaigns">Configuration</a>'.$google_shopping_conf_msg
83
+ .((isset($setting_status['google_shopping_conf']) )?info_htnml($setting_status['google_shopping_conf']):"").'
84
+ </div>
85
+ </li>
86
+ <li class="nav-item" role="presentation">
87
+ <div class="tvc-tooltip nav-link '.(($tab=="sync_product_page")?"active":"").'" '.$site_url_p_target.'>
88
+ <a href="'.$site_url_p.'sync_product_page" id="smart-shopping-campaigns">Product Sync</a>'. $google_shopping_p_sync_msg
89
+ .((isset($setting_status['google_shopping_p_sync']) )?info_htnml($setting_status['google_shopping_p_sync']):"").'
90
+ </div>
91
+ </li>
92
+ <li class="nav-item" role="presentation">
93
+ <div class="tvc-tooltip nav-link '.(($tab=="shopping_campaigns_page")?"active":"").'" '.$site_url_p_target.'>
94
+ <a href="' . $site_url_p . 'shopping_campaigns_page" id="smart-shopping-campaigns">Smart Shopping Campaigns</a>'. $google_shopping_p_campaigns_msg
95
+ .((isset($setting_status['google_shopping_p_campaigns']) )?info_htnml($setting_status['google_shopping_p_campaigns']):"").'
96
+ </div>
97
+ </li>
98
+ </ul>';
 
 
 
 
 
 
99
  }
100
  function get_tvc_google_ads_help_html(){
101
+ $TVC_Admin_Helper = new TVC_Admin_Helper();
102
+ ob_start(); ?>
103
+ <div class="right-content">
104
+ <div class="content-section">
105
+ <div class="content-icon">
106
+ <img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/information.svg'; ?>" alt="information"/>
107
+ </div>
108
+ <h4 class="content-heading">Help Center:</h4>
109
+ <section class="tvc-help-slider">
110
+ <?php if($TVC_Admin_Helper->is_ga_property() == false){?>
111
+ <div>
112
+ In order to configure your Google Ads account, you need to sign in with the associated Google account. Click on "Get started" <img src="<?php echo ENHANCAD_PLUGIN_URL."/admin/images/icon/add.svg"; ?>" alt="connect account"/> icon to set up the plugin.
113
+ </div>
114
+ <div>
115
+ Once you select or create a new google ads account, your account will be enabled for the following:
 
 
 
 
 
 
 
 
 
116
  <ol>
117
+ <li>Remarketing and dynamic remarketing tags for all the major eCommerce events on your website (Optional)</li>
118
+ <li>Your google ads account will be linked with the previously selected google analytics account (Optional)</li>
119
+ <li>Your google ads account will be linked with google merchant center account in the next step so that you can start running google shopping campaigns(Optional)</li>
 
120
  </ol>
121
+ </div>
122
+ <?php }else{ ?>
123
+ <div>
124
+ You can update or change the google ads account anytime by clicking on <img src="<?php echo ENHANCAD_PLUGIN_URL."/admin/images/icon/refresh.svg"; ?>" alt="refresh"/> icon.
125
+ </div>
126
+ <?php }?>
127
+
128
+ </section>
129
+ </div>
130
+ <nav>
131
+ <ul class="pagination justify-content-center">
132
+ <li class="page-item page-prev h-page-prev">
133
+ <span class="page-link"><img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/arrow-down-sign-to-navigate.svg'; ?>" alt=""/></span>
134
+ </li>
135
+ <li class="page-item"><span class="paging_info" id="paging_info">1</span></li>
136
+ <li class="page-item page-next h-page-next">
137
+ <span class="page-link"><img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/arrow-down-sign-to-navigate.svg'; ?>" alt=""/></span>
138
+ </li>
139
+ </ul>
140
+ </nav>
141
+ </div>
142
+ <script>
143
+ let rtl= <?php echo (is_rtl())?"true":"false"; ?>;
144
+ $(".tvc-help-slider").slick({
145
+ autoplay: false,
146
+ dots: false,
147
+ prevArrow:$('.h-page-prev'),
148
+ nextArrow:$('.h-page-next'),
149
+ rtl:rtl
150
+ });
151
+ $(".tvc-help-slider").on("beforeChange", function(event, slick, currentSlide, nextSlide){
152
+ $("#paging_info").html(nextSlide+1);
153
+ });
154
+ </script>
155
+ <div class="right-content">
156
+ <div class="content-section">
157
+ <div class="content-icon">
158
+ <img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/lamp.svg'; ?>" alt="information"/>
159
+ </div>
160
+ <h4 class="content-heading">Business Value:</h4>
161
+ <section class="tvc-b-value-slider">
162
+ <div>With dynamic remarketing tags, you will be able to show ads to your past site visitors with specific product information that is tailored to your customer’s previous site visits.</div>
163
+ <div>This plugin enables dynamic remarketing tags for crucial eCommerce events like product list views, product detail page views, add to cart and final purchase event.</div>
164
+ <div>Dynamic remarketing along with the product feeds in your merchant center account will enable you for smart shopping campaigns which is very essential for any eCommerce business globally. <a target="_blank" href="https://support.google.com/google-ads/answer/3124536?hl=en">Learn More</a>
165
+ </div>
166
+ </section>
167
+ </div>
168
+ <nav>
169
+ <ul class="pagination justify-content-center">
170
+ <li class="page-item page-prev b-page-prev">
171
+ <span class="page-link"><img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/arrow-down-sign-to-navigate.svg'; ?>" alt=""/></span>
172
+ </li>
173
+ <li class="page-item"><span class="paging_info" id="b-paging-info">1</span></li>
174
+ <li class="page-item page-next b-page-next">
175
+ <span class="page-link"><img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/arrow-down-sign-to-navigate.svg'; ?>" alt=""/></span>
176
+ </li>
177
+ </ul>
178
+ </nav>
179
+ </div>
180
+ <div class="tvc-footer-links">
181
+ <a target="_blank" href="http://plugins.tatvic.com/help-center/Installation-Manual.pdf" tabindex="0">Installation manual</a> | <a target="_blank" href="http://plugins.tatvic.com/help-center/Google-shopping-Guide.pdf" tabindex="0">Google shopping guide</a> | <a target="_blank" href="https://wordpress.org/plugins/enhanced-e-commerce-for-woocommerce-store/faq/" tabindex="0">FAQ</a>
182
+ </div>
183
+ <script>
184
+ //let rtl= "<?php echo (is_rtl())?"true":"false"; ?>";
185
+ $(".tvc-b-value-slider").slick({
186
+ autoplay: false,
187
+ dots: false,
188
+ prevArrow:$('.b-page-prev'),
189
+ nextArrow:$('.b-page-next'),
190
+ rtl:rtl
191
+ });
192
+ $(".tvc-b-value-slider").on("beforeChange", function(event, slick, currentSlide, nextSlide){
193
+ $("#b-paging-info").html(nextSlide+1);
194
+ });
195
+ </script>
196
+ <?php
197
+ return ob_get_clean();
198
  }
199
+ function get_tvc_help_html(){
200
+ ob_start(); ?>
201
+ <div class="right-content">
202
+ <div class="content-section">
203
+ <div class="content-icon">
204
+ <img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/information.svg'; ?>" alt="information"/>
205
+ </div>
206
+ <h4 class="content-heading">Help Center:</h4>
207
+ <section class="tvc-help-slider">
208
+ <div>Set up your Google Merchant Center Account and make your WooCommerce shop and products available to millions of shoppers across Google.</div>
209
+ <div>Our plugin will help you automate everything you need to make your products available to interested customers across Google.</div>
210
+ <div>Follow <a target="_blank" href="https://support.google.com/merchants/answer/6363310?hl=en&ref_topic=3163841">merchant center guidelines for site requirements</a> in order to avoid account suspension issues.
211
+ </div>
212
+ </section>
213
+ </div>
214
+ <nav>
215
+ <ul class="pagination justify-content-center">
216
+ <li class="page-item page-prev h-page-prev">
217
+ <span class="page-link"><img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/arrow-down-sign-to-navigate.svg'; ?>" alt=""/></span>
218
+ </li>
219
+ <li class="page-item"><span class="paging_info" id="paging_info">1</span></li>
220
+ <li class="page-item page-next h-page-next">
221
+ <span class="page-link"><img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/arrow-down-sign-to-navigate.svg'; ?>" alt=""/></span>
222
+ </li>
223
+ </ul>
224
+ </nav>
225
+ </div>
226
+ <script>
227
+ let rtl= <?php echo (is_rtl())?"true":"false"; ?>;
228
+ $(".tvc-help-slider").slick({
229
+ autoplay: false,
230
+ dots: false,
231
+ prevArrow:$('.h-page-prev'),
232
+ nextArrow:$('.h-page-next'),
233
+ rtl:rtl
234
+ });
235
+ $(".tvc-help-slider").on("beforeChange", function(event, slick, currentSlide, nextSlide){
236
+ $("#paging_info").html(nextSlide+1);
237
+ });
238
+ </script>
239
+ <div class="right-content">
240
+ <div class="content-section">
241
+ <div class="content-icon">
242
+ <img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/lamp.svg'; ?>" alt="information"/>
243
+ </div>
244
+ <h4 class="content-heading">Business Value:</h4>
245
+ <section class="tvc-b-value-slider">
246
+ <div>Opt your product data into programmes, like surfaces across Google, Shopping ads, local inventory ads and Shopping Actions, to highlight your products to shoppers across Google.</div>
247
+ <div>Your store’s products will be eligible to get featured under the shopping tab when anyone searches for products that match your store’s product attributes.</div>
248
+ <div>Reach out to customers leaving your store by running smart shopping campaigns based on their past site behavior. <a target="_blank" href="https://www.google.com/intl/en_in/retail/?fmp=1&utm_id=bkws&mcsubid=in-en-ha-g-mc-bkws">Learn More</a></div>
249
+ </section>
250
+ </div>
251
+ <nav>
252
+ <ul class="pagination justify-content-center">
253
+ <li class="page-item page-prev b-page-prev">
254
+ <span class="page-link"><img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/arrow-down-sign-to-navigate.svg'; ?>" alt=""/></span>
255
+ </li>
256
+ <li class="page-item"><span class="paging_info" id="b-paging-info">1</span></li>
257
+ <li class="page-item page-next b-page-next">
258
+ <span class="page-link"><img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/arrow-down-sign-to-navigate.svg'; ?>" alt=""/></span>
259
+ </li>
260
+ </ul>
261
+ </nav>
262
+ </div>
263
+ <div class="tvc-footer-links">
264
+ <a target="_blank" href="http://plugins.tatvic.com/help-center/Installation-Manual.pdf" tabindex="0">Installation manual</a> | <a target="_blank" href="http://plugins.tatvic.com/help-center/Google-shopping-Guide.pdf" tabindex="0">Google shopping guide</a> | <a target="_blank" href="https://wordpress.org/plugins/enhanced-e-commerce-for-woocommerce-store/faq/" tabindex="0">FAQ</a>
265
+ </div>
266
+ <script>
267
+ //let rtl= "<?php echo (is_rtl())?"true":"false"; ?>";
268
+ $(".tvc-b-value-slider").slick({
269
+ autoplay: false,
270
+ dots: false,
271
+ prevArrow:$('.b-page-prev'),
272
+ nextArrow:$('.b-page-next'),
273
+ rtl:rtl
274
+ });
275
+ $(".tvc-b-value-slider").on("beforeChange", function(event, slick, currentSlide, nextSlide){
276
+ $("#b-paging-info").html(nextSlide+1);
277
+ });
278
+ </script>
279
+ <?php
280
+ return ob_get_clean();
281
+ }
282
+ function get_tvc_google_ga_sidebar(){
283
+ $TVC_Admin_Helper = new TVC_Admin_Helper();
284
+ ob_start(); ?>
285
+ <div class="right-content">
286
+ <div class="content-section">
287
+ <div class="content-icon">
288
+ <img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/information.svg'; ?>" alt="information"/>
289
+ </div>
290
+ <h4 class="content-heading">Help Center:</h4>
291
+ <section class="tvc-help-slider">
292
+ <?php if($TVC_Admin_Helper->is_ga_property() == false){?>
293
+ <div>
294
+ In order to configure your Google Analytics account, you need to sign in with the associated Google account. Click on "Get started" <img src="<?php echo ENHANCAD_PLUGIN_URL."/admin/images/icon/add.svg"; ?>" alt="connect account"/> icon to set up the plugin.
295
+ </div>
296
+ <div>
297
+ Once you sign in with an associated google account, you will be asked to select a google analytics account from the drop down.
298
+ </div>
299
+ <div>
300
+ If you have already added the gtag.js snippet manually, YOU MUST uncheck the “add gtag.js”.
301
+ </div>
302
+ <?php
303
+ }else{
304
+ ?>
305
+ <div>
306
+ You can update or change the google analytics account anytime by clicking on <img src="<?php echo ENHANCAD_PLUGIN_URL."/admin/images/icon/refresh.svg"; ?>" alt="refresh"/> icon.
307
+ </div>
308
+ <?php
309
+ }?>
310
+ </section>
311
+ </div>
312
+ <nav>
313
+ <ul class="pagination justify-content-center">
314
+ <li class="page-item page-prev h-page-prev help-ga-prev">
315
+ <span class="page-link"><img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/arrow-down-sign-to-navigate.svg'; ?>" alt=""/></span>
316
+ </li>
317
+ <li class="page-item"><span class="paging_info" id="help_ga_paging_info">1</span></li>
318
+ <li class="page-item page-next h-page-next help-ga-next">
319
+ <span class="page-link"><img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/arrow-down-sign-to-navigate.svg'; ?>" alt=""/></span>
320
+ </li>
321
+ </ul>
322
+ </nav>
323
+ </div>
324
+ <script>
325
+ $(".tvc-help-slider").slick({
326
+ autoplay: false,
327
+ dots: false,
328
+ prevArrow:$('.help-ga-prev'),
329
+ nextArrow:$('.help-ga-next')
330
+ });
331
+ $(".tvc-help-slider").on("beforeChange", function(event, slick, currentSlide, nextSlide){
332
+ $("#help_ga_paging_info").html(nextSlide+1);
333
+ });
334
+ </script>
335
+ <div class="right-content">
336
+ <div class="content-section">
337
+ <div class="content-icon">
338
+ <img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/lamp.svg'; ?>" alt="information"/>
339
+ </div>
340
+ <h4 class="content-heading">Business Value:</h4>
341
+ <section class="tvc-b-value-slider">
342
+ <div>
343
+ <p>Once you set up google analytics account, your website will be tagged for all the important eCommerce events in google analytics and you will be able to start taking data driven decisions in order to scale your eCommerce business faster. Some of the important data points are:</p>
344
+ <ol>
345
+ <li>What exactly is your site’s conversion rate?</li>
346
+ <li>What is the exact drop at each stage in your eCommerce funnel? For example, 100 people are coming to your website, how many users are seeing any product detail page, how many are adding products to cart, how many are abandoning cart etc.</li>
347
+ </ol>
348
+ </div>
349
+ <div>What all are your star products and what all are just consuming the space in your website?</div>
350
+ </section>
351
+ </div>
352
+ <nav>
353
+ <ul class="pagination justify-content-center">
354
+ <li class="page-item page-prev b-page-prev value-ga-prev">
355
+ <span class="page-link"><img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/arrow-down-sign-to-navigate.svg'; ?>" alt=""/></span>
356
+ </li>
357
+ <li class="page-item"><span class="paging_info" id="value_ga_paging_info">1</span></li>
358
+ <li class="page-item page-next b-page-next value-ga-next">
359
+ <span class="page-link"><img src="<?php echo ENHANCAD_PLUGIN_URL.'/admin/images/icon/arrow-down-sign-to-navigate.svg'; ?>" alt=""/></span>
360
+ </li>
361
+ </ul>
362
+ </nav>
363
+ </div>
364
+ <div class="tvc-footer-links">
365
+ <a target="_blank" href="http://plugins.tatvic.com/help-center/Installation-Manual.pdf" tabindex="0">Installation manual</a> | <a target="_blank" href="http://plugins.tatvic.com/help-center/Google-shopping-Guide.pdf" tabindex="0">Google shopping guide</a> | <a target="_blank" href="https://wordpress.org/plugins/enhanced-e-commerce-for-woocommerce-store/faq/" tabindex="0">FAQ</a>
366
+ </div>
367
+ <script>
368
+ $(".tvc-b-value-slider").slick({
369
+ autoplay: false,
370
+ dots: false,
371
+ prevArrow:$('.value-ga-prev'),
372
+ nextArrow:$('.value-ga-next')
373
+ });
374
+ $(".tvc-b-value-slider").on("beforeChange", function(event, slick, currentSlide, nextSlide){
375
+ $("#value_ga_paging_info").html(nextSlide+1);
376
+ });
377
+ </script>
378
+ <?php
379
+ return ob_get_clean();
380
+ }
includes/setup/json/client-secrets.json CHANGED
@@ -1,19 +1,6 @@
1
  {
2
  "web": {
3
  "client_id": "854883711805-4bm7ik0lq2jcdvdk0qu8sgtd4jdc1k7o.apps.googleusercontent.com",
4
- "project_id": "tatvic-analytics-293106",
5
- "auth_uri": "https://accounts.google.com/o/oauth2/auth",
6
- "token_uri": "https://oauth2.googleapis.com/token",
7
- "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
8
- "client_secret": "mwgFJ25-FMPEyeNtI-TIMJIZ",
9
- "manager_customer_id": "9704619790",
10
- "manager_refresh_token": "1//0glkEtsa8PNuwCgYIARAAGBASNwF-L9IrBZQjIINEw2MMO_M_mRdKwoNCBwJtHXtahh5Bj4oQR01ErmhaBB2TqE68rkP8JaELISU",
11
- "developer_token": "R0IEth5fQ1Ac59qB2Wf8Aw",
12
- "redirect_uris": [
13
- "https://preprodestore.tatvic.com/config/ga_rdr_gmc.php"
14
- ],
15
- "javascript_origins": [
16
- "https://plugins.tatvic.com"
17
- ]
18
  }
19
  }
1
  {
2
  "web": {
3
  "client_id": "854883711805-4bm7ik0lq2jcdvdk0qu8sgtd4jdc1k7o.apps.googleusercontent.com",
4
+ "client_secret": "mwgFJ25-FMPEyeNtI-TIMJIZ"
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  }
6
  }
includes/setup/tatvic-category-wrapper.php CHANGED
@@ -15,7 +15,6 @@ if ( ! class_exists( 'Tatvic_Category_Wrapper' ) ) :
15
  */
16
  public function category_table_content( $mode = 'normal' ) {
17
  $shop_categories = TVC_Taxonomies::get_shop_categories_list();
18
-
19
  return $this->category_rows( $shop_categories, 0, $mode );
20
  }
21
 
@@ -42,8 +41,8 @@ if ( ! class_exists( 'Tatvic_Category_Wrapper' ) ) :
42
  for ( $i = 0; $i < $category_depth_level; $i ++ ) {
43
  $level_indicator .= '— ';
44
  }
45
-
46
- if ( $shop_categories ) {
47
  foreach ( $shop_categories as $category ) {
48
 
49
  $category_children = $this->get_sub_categories( $category );
@@ -57,7 +56,6 @@ if ( ! class_exists( 'Tatvic_Category_Wrapper' ) ) :
57
  } else {
58
  $html_code .= esc_html__( 'No shop categories found.', 'tvc-product-feed-manager' );
59
  }
60
-
61
  return $html_code;
62
  }
63
 
15
  */
16
  public function category_table_content( $mode = 'normal' ) {
17
  $shop_categories = TVC_Taxonomies::get_shop_categories_list();
 
18
  return $this->category_rows( $shop_categories, 0, $mode );
19
  }
20
 
41
  for ( $i = 0; $i < $category_depth_level; $i ++ ) {
42
  $level_indicator .= '— ';
43
  }
44
+
45
+ if (!empty((array)$shop_categories ) ) {
46
  foreach ( $shop_categories as $category ) {
47
 
48
  $category_children = $this->get_sub_categories( $category );
56
  } else {
57
  $html_code .= esc_html__( 'No shop categories found.', 'tvc-product-feed-manager' );
58
  }
 
59
  return $html_code;
60
  }
61
 
includes/user-interface/tvc-url-functions.php DELETED
@@ -1,85 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Checks if the user is on one of the plugin pages or not.
5
- * Also returns true when current page can not be defined
6
- *
7
- * @since 2.3.4
8
- *
9
- * @param string $url default $_SERVER[ 'REQUEST_URI' ]
10
- *
11
- * @return boolean
12
- */
13
- function tvc_on_any_own_plugin_page( $url = null ) {
14
- $ref_url = null === $url ? tvc_get_current_page_url() : $url;
15
-
16
- // return true if the current page url has not been identified
17
- if ( empty( $ref_url ) ) {
18
- return true;
19
- }
20
-
21
- if ( false === stripos( $ref_url, '/wp-admin/admin.php?page=' . ENHANCAD_PLUGIN_NAME ) && false === stripos( $ref_url, '/wp-admin/admin.php?page=tvc-' ) ) {
22
- return false;
23
- } else {
24
- return true;
25
- }
26
- }
27
-
28
- /**
29
- * Checks if the user is on the options page
30
- * Also returns true when current page can not be defined
31
- *
32
- * @since 2.3.4
33
- *
34
- * @param string $url default $_SERVER[ 'REQUEST_URI' ]
35
- *
36
- * @return boolean
37
- */
38
- function tvc_on_plugins_settings_page( $url = null ) {
39
- $ref_url = null === $url ? tvc_get_current_page_url() : $url;
40
- // return true if the current page url has not been identified
41
- if ( empty( $ref_url ) ) {
42
- return true;
43
- }
44
- if ( true === stripos( $ref_url, '/wp-admin/admin.php?page=tvc-' ) ) {
45
- return false;
46
- } else {
47
- return true;
48
- }
49
- }
50
-
51
- /**
52
- * Checks if the user is on one of the plugins pages but not on the options page
53
- * Also returns true when current page can not be defined
54
- *
55
- * @since 2.3.4
56
- *
57
- * @param string $url default $_SERVER[ 'REQUEST_URI' ]
58
- *
59
- * @return boolean
60
- */
61
- function tvc_on_own_main_plugin_page( $url = null ) {
62
- $ref_url = null === $url ? tvc_get_current_page_url() : $url;
63
-
64
- // return true if the current page url has not been identified
65
- if ( empty( $ref_url ) ) {
66
- return true;
67
- }
68
-
69
- // return true if the url contains the plugin name under the page attribute or if it's an ajax call
70
- if ( false === stripos( $ref_url, '/wp-admin/admin.php?page=' . ENHANCAD_PLUGIN_NAME ) && false === stripos( $ref_url, '/wp-admin/admin-ajax.php' ) ) {
71
- return false;
72
- } else {
73
- return true;
74
- }
75
- }
76
-
77
- /**
78
- * Get the $_SERVER[ 'REQUEST_URI' ] variable
79
- *
80
- * @since 2.3.4
81
- * @return string $_SERVER[ 'REQUEST_URI' ] or empty
82
- */
83
- function tvc_get_current_page_url() {
84
- return isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : '';
85
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
public/class-enhanced-ecommerce-google-analytics-public.php CHANGED
@@ -28,7 +28,7 @@ class Enhanced_Ecommerce_Google_Analytics_Public {
28
  * @return void
29
  */
30
  //set plugin version
31
- public $tvc_eeVer = PLUGIN_NAME_VERSION;
32
  /**
33
  * @var mixed $tvc_aga
34
  */
@@ -177,7 +177,29 @@ class Enhanced_Ecommerce_Google_Analytics_Public {
177
  function tvc_store_meta_data() {
178
  //only on home page
179
  global $woocommerce;
180
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
181
  $tvc_sMetaData = array(
182
  'tvc_wcv' => $woocommerce->version,
183
  'tvc_wpv' => get_bloginfo('version'),
@@ -190,8 +212,9 @@ class Enhanced_Ecommerce_Google_Analytics_Public {
190
  't_thr' => $this->ga_imTh,
191
  't_IPA' => $this->ga_IPA,
192
  't_OptOut' => $this->ga_OPTOUT,
193
- 't_PrivacyPolicy' => $this->ga_PrivacyPolicy,
194
- )
 
195
  );
196
  $this->wc_version_compare("tvc_smd=" . json_encode($tvc_sMetaData) . ";");
197
  }
28
  * @return void
29
  */
30
  //set plugin version
31
+ public $tvc_eeVer = PLUGIN_TVC_VERSION;
32
  /**
33
  * @var mixed $tvc_aga
34
  */
177
  function tvc_store_meta_data() {
178
  //only on home page
179
  global $woocommerce;
180
+ $TVC_Admin_Helper = new TVC_Admin_Helper();
181
+ $google_detail = $TVC_Admin_Helper->get_ee_options_data();
182
+ $sub_data = array();
183
+ if(isset($google_detail['setting'])){
184
+ $googleDetail = $google_detail['setting'];
185
+ $sub_data['sub_id'] = $googleDetail->id;
186
+ $sub_data['cu_id']=$googleDetail->customer_id;
187
+ $sub_data['pl_id']=$googleDetail->plan_id;
188
+ $sub_data['ga_tra_option']=$googleDetail->tracking_option;
189
+ $sub_data['ga_property_id']=$googleDetail->google_ads_id;
190
+ $sub_data['ga_measurement_id']=$googleDetail->measurement_id;
191
+ $sub_data['ga_ads_id']=$googleDetail->google_ads_id;
192
+ $sub_data['ga_gmc_id']=$googleDetail->google_merchant_center_id;
193
+ $sub_data['op_gtag_js']=$googleDetail->add_gtag_snippet;
194
+ $sub_data['op_en_e_t']=$googleDetail->enhanced_e_commerce_tracking;
195
+ $sub_data['op_rm_t_t']=$googleDetail->remarketing_tags;
196
+ $sub_data['op_dy_rm_t_t']=$googleDetail->dynamic_remarketing_tags;
197
+ $sub_data['op_li_ga_wi_ads']=$googleDetail->link_google_analytics_with_google_ads;
198
+ $sub_data['gmc_is_product_sync']=$googleDetail->is_product_sync;
199
+ $sub_data['gmc_is_site_verified']=$googleDetail->is_site_verified;
200
+ $sub_data['gmc_is_domain_claim']=$googleDetail->is_domain_claim;
201
+ $sub_data['gmc_product_count']=$googleDetail->product_count;
202
+ }
203
  $tvc_sMetaData = array(
204
  'tvc_wcv' => $woocommerce->version,
205
  'tvc_wpv' => get_bloginfo('version'),
212
  't_thr' => $this->ga_imTh,
213
  't_IPA' => $this->ga_IPA,
214
  't_OptOut' => $this->ga_OPTOUT,
215
+ 't_PrivacyPolicy' => $this->ga_PrivacyPolicy
216
+ ),
217
+ 'tvc_sub_data'=> $sub_data
218
  );
219
  $this->wc_version_compare("tvc_smd=" . json_encode($tvc_sMetaData) . ";");
220
  }
public/partials/class-enhanced-ecommerce-google-analytics-public-display.php DELETED
@@ -1,16 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Provide a public-facing view for the plugin
5
- *
6
- * This file is used to markup the public-facing aspects of the plugin.
7
- *
8
- * @link tatvic.com
9
- * @since 1.0.0
10
- *
11
- * @package Enhanced_Ecommerce_Google_Analytics
12
- * @subpackage Enhanced_Ecommerce_Google_Analytics/public/partials
13
- */
14
- ?>
15
-
16
- <!-- This file should primarily consist of HTML with a little bit of PHP. -->
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
readme.txt CHANGED
@@ -8,8 +8,8 @@ Author: Tatvic
8
  Requires at least: 1.4.1
9
  Tested up to: 5.7
10
  Requires PHP: 5.6 or Higher
11
- Stable tag: 3.0.5
12
- Version: 3.0.5
13
  License: GPLv3
14
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
15
 
@@ -356,6 +356,13 @@ You can resolve the duplication of data by removing the manually implemented GA
356
 
357
  == Changelog ==
358
 
 
 
 
 
 
 
 
359
  = 3.0.5 - 12/04/2021 =
360
  * Add auto product sync feature enhancement - In the background, every month runs a process to sync the product, Run only those products who are completed the manual product sync.
361
 
8
  Requires at least: 1.4.1
9
  Tested up to: 5.7
10
  Requires PHP: 5.6 or Higher
11
+ Stable tag: 3.1.0
12
+ Version: 3.1.0
13
  License: GPLv3
14
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
15
 
356
 
357
  == Changelog ==
358
 
359
+ = 3.1.0 - 15/06/2021 =
360
+ * Enhanced user experience with new UI
361
+ * Earlier some users were able to see 25 products only on product sync dashboard, the issue is fixed now
362
+ * Added customized notifications to track the activty and functioning of plugin
363
+ * Added customer support number to quickly reach out to us for any query
364
+ * API performance enhancements
365
+
366
  = 3.0.5 - 12/04/2021 =
367
  * Add auto product sync feature enhancement - In the background, every month runs a process to sync the product, Run only those products who are completed the manual product sync.
368