PluginProbe
WP Directory Kit / 1.5.9
WP Directory Kit v1.5.9
1.5.9 1.5.7 1.5.6 1.5.5 1.5.4 1.5.3 trunk 1.1.0 1.1.6 1.1.8 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.8 All 37 releases
wpdirectorykit / application / controllers / Wdk_frontendajax.php

Wdk_frontendajax.php in WP Directory Kit 1.5.9, at application/controllers/Wdk_frontendajax.php

1,841 lines 87.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly;
3
4 class Wdk_frontendajax extends Winter_MVC_Controller {
5
6 public function __construct(){
7 if(defined( 'WP_DEBUG' ) && WP_DEBUG) {
8 ini_set('display_errors',1);
9 ini_set('display_startup_errors',1);
10 error_reporting(-1);
11 }
12
13 parent::__construct();
14
15 $this->data['is_ajax'] = true;
16
17 }
18
19 public function index(&$output=NULL, $atts=array())
20 {
21
22 }
23
24 public function map_infowindow() {
25 $this->load->load_helper('listing');
26 $this->load->model('listing_m');
27 $this->load->model('listingfield_m');
28
29 $data = array();
30 $data['message'] = '';
31 $listing_post_id = NULL;
32 if(isset($_POST['listing_post_id']))
33 $listing_post_id = sanitize_text_field($_POST['listing_post_id']);
34
35 $listing = $this->load->listing_m->get($listing_post_id, TRUE);
36
37 if (!$listing || $listing->post_status != 'publish' || !empty($listing->post_password)) {
38 return false;
39 }
40
41 /* protect check */
42 if (
43 !wdk_field_value('is_activated', $listing, false) || !wdk_field_value('is_approved', $listing,false)
44 ) {
45 $data['popup_content'] = __( 'Listing is not public', 'wpdirectorykit' );
46 $this->output($data);
47 }
48
49 $popup_layout = 'result_item_card';
50 if(!empty($_POST['custom_layout_id'])) {
51 $popup_layout = (int) sanitize_text_field($_POST['custom_layout_id']);
52 }
53
54 if(!empty($listing)) {
55 $data['popup_content'] = wdk_listing_card($listing, array('infobox' => true), false, '<div class="infobox map-box">%1$s<div>', $popup_layout);
56 } else {
57 $data['popup_content'] = __( 'Listing is missing', 'wpdirectorykit' );
58 }
59
60 $data['success'] = true;
61
62 $this->output($data);
63 }
64
65 public function map_infowindow_dash() {
66 $this->load->load_helper('listing');
67 $this->load->model('listing_m');
68 $this->load->model('listingfield_m');
69
70 $data = array();
71 $data['message'] = '';
72 $listing_post_id = NULL;
73 if(isset($_POST['listing_post_id']))
74 $listing_post_id = sanitize_text_field($_POST['listing_post_id']);
75
76 $listing = $this->load->listing_m->get($listing_post_id, TRUE);
77
78
79 if (!$listing || $listing->post_status != 'publish' || !empty($listing->post_password)) {
80 return false;
81 }
82
83 /* protect check */
84 if (
85 !wdk_field_value('is_activated', $listing, false) || !wdk_field_value('is_approved', $listing,false)
86 ) {
87 $data['popup_content'] = __( 'Listing is not public', 'wpdirectorykit' );
88 $this->output($data);
89 }
90
91 if(!empty($listing)) {
92 $data['popup_content'] = wdk_listing_card($listing, [], false, '<div class="infobox map-box">%1$s<div>', 'result_item_card_dash_edit');
93 } else {
94 $data['popup_content'] = __( 'Listing is missing', 'wpdirectorykit' );
95 }
96
97 $data['success'] = true;
98
99 $this->output($data);
100 }
101
102 public function treefieldid($output="", $atts=array(), $instance=NULL)
103 {
104
105 check_ajax_referer('wdk_secure_treefieldid', 'wdk_secure');
106
107 $this->load->load_helper('listing');
108 $this->load->model('listing_m');
109 $this->load->model('listingfield_m');
110
111 $data = array();
112 $data['message'] = __('No message returned!', 'wpdirectorykit');
113 $results = array();
114
115 $parameters = array();
116
117 foreach ($_POST as $key => $value) {
118 $parameters[$key] = sanitize_text_field($value);
119 }
120
121 $table_name = $table = $parameters['table'];
122
123 if(empty($parameters['empty_value']))
124 $parameters['empty_value'] = ' - ';
125
126 if(empty($parameters['limit']))
127 $parameters['limit'] = 10;
128
129 if(empty($parameters['attribute_id']))
130 $parameters['attribute_id'] = 'id';
131
132 if(empty($parameters['attribute_value']))
133 $parameters['attribute_value'] = 'address';
134
135 if(empty($parameters['offset']))
136 $parameters['offset'] = 0;
137
138 if(empty($parameters['sql_where']))
139 $parameters['sql_where'] = '';
140
141 if(empty($parameters['hide_fields']))
142 $parameters['hide_fields'] = '';
143
144 $start_id = '';
145 if(isset($parameters['start_id']))
146 $start_id = $parameters['start_id'];
147
148 if($parameters['offset'] == 0) // currently don't have load_more functionality'
149
150 if(!empty($parameters['empty_value']))
151 {
152 $results[0]['key'] = '';
153 $results[0]['value'] = sanitize_text_field($parameters['empty_value']);
154 }
155
156 // it's model
157
158 if($table == 'calendar_listing_m')
159 $table = 'listing_m';
160
161 $post_table = $this->db->prefix.'posts';
162
163 $table_name = substr($table,0, -2);
164
165 $attr_id = preg_replace("/[^0-9a-zA-Z_\-]/", "",sanitize_text_field($parameters['attribute_id']));
166 $attr_val = preg_replace("/[^0-9a-zA-Z_\-]/", "",sanitize_text_field($parameters['attribute_value']));
167
168
169 $attr_search = wdk_esc_sql(sanitize_text_field($parameters['search_term'] ?? ''));
170 $skip_id = intval($parameters['skip_id'] ?? 0);
171 $language_id = intval($parameters['language_id'] ?? 0);
172
173 if(empty($language_id))
174 $language_id = NULL;
175
176 $id_part="";
177 if(is_numeric($attr_search))
178 $id_part = "$attr_id=$attr_search OR ";
179
180 if($table == 'icons_list') {
181 $icons = $this->get_fa_icons();
182
183 $tree_results = array();
184
185 if(empty($attr_search)) {
186 $tree_results = $icons;
187 } else {
188 foreach ($icons as $c){
189 if (stripos($c, $attr_search) !== FALSE){
190 //if $c starts with $input, add to matches list
191 $tree_results[] = $c;
192 } else if (strcmp($attr_search, $c) < 0){
193 //$input comes after $c in alpha order
194 //since $colors is sorted, we know that we won't find any more matches
195 continue;
196 }
197 }
198 }
199 $tree_results = array_slice($tree_results,intval($parameters['offset']), intval($parameters['limit']));
200 // limit
201
202 } else {
203 $this->load->model($table);
204
205 $where = array();
206 if(!empty($attr_search)) {
207 $attr_val_sql = $attr_val;
208 if($attr_val == 'location_title') {
209 $this->load->model($table);
210 $attr_val_sql = $this->$table->_table_name.'.location_title';
211 } elseif($attr_val == 'category_title'){
212 $this->load->model($table);
213 $attr_val_sql = $this->$table->_table_name.'.category_title';
214 }
215
216 /* if category/locations search also in translated field */
217 if($attr_val == 'location_title' || $attr_val == 'category_title') {
218 $where["($id_part $attr_val_sql LIKE '%$attr_search%' OR ".$this->$table->_table_name.".titles_for_search LIKE '%$attr_search%')"] = NULL;
219 } else {
220 $where["($id_part $attr_val_sql LIKE '%$attr_search%')"] = NULL;
221 }
222 }
223
224 if(!empty($parameters['sql_where'] )) {
225 $sql_where = '';
226 if($parameters['sql_where'] == 'only_nochilds') {
227 $sql_where = "((".$this->listing_m->_table_name.".listing_parent_post_id IS NULL OR ".$this->listing_m->_table_name.".listing_parent_post_id = 0) AND (".$this->listing_m->_table_name.".`listing_related_ids` IS NULL OR ".$this->listing_m->_table_name.".`listing_related_ids` = '') )";
228 } else {
229
230 }
231 if(!empty($sql_where))
232 $where[$sql_where] = NULL;
233 }
234
235 if(!empty($parameters['hide_fields'])) {
236 $parameters['hide_fields'] = preg_replace('/[^0-9,]/', '', $parameters['hide_fields']);
237 if($table == 'location_m') {
238 $sql_where = esc_sql($this->$table->_table_name.'.idlocation').' NOT IN ('.esc_sql(sanitize_text_field($parameters['hide_fields'])).')';
239 foreach (explode(',', $parameters['hide_fields']) as $key => $id) {
240 $sql_where .= ' AND CONCAT(",", '.$this->$table->_table_name.'.parent_path, ",") NOT LIKE CONCAT("%,", '.intval($id).', ",%")';
241 }
242
243 $where[$sql_where] = NULL;
244 }
245
246 if($table == 'category_m') {
247 $sql_where = esc_sql($this->$table->_table_name.'.idcategory').' NOT IN ('.esc_sql(sanitize_text_field($parameters['hide_fields'])).')';
248 foreach (explode(',', $parameters['hide_fields']) as $key => $id) {
249 $sql_where .= ' AND CONCAT(",", '.$this->$table->_table_name.'.parent_path, ",") NOT LIKE CONCAT("%,", '.intval($id).', ",%")';
250 }
251 $where[$sql_where] = NULL;
252 }
253 }
254
255 if(isset($parameters['user_check']) && ($parameters['user_check'] == 'true' || $parameters['user_check'] == '1')) {
256 if($table == 'listing_m') {
257 if($parameters['table'] == 'calendar_listing_m') {
258 global $Winter_MVC_wdk_bookings;
259 $Winter_MVC_wdk_bookings->model('calendar_m');
260 $this->db->join($Winter_MVC_wdk_bookings->calendar_m->_table_name.' ON '.$post_table.'.ID = '.$Winter_MVC_wdk_bookings->calendar_m->_table_name.'.post_id');
261 }
262
263 $tree_results = $this->$table->get_pagination(intval($parameters['limit']),intval($parameters['offset']), $where, TRUE, get_current_user_id());
264 } else {
265
266 if(!empty($parameters['filter_ids'])){
267 $this->db->where(array( esc_sql($this->$table->_table_name.'.'.$this->$table->_primary_key).' IN ('.esc_sql(preg_replace('/[^0-9,]/', '', $parameters['filter_ids'])).')' => NULL));
268 }
269
270 $tree_results = $this->$table->get_pagination(intval($parameters['limit']),intval($parameters['offset']), $where );
271 }
272 } else {
273 if($parameters['table'] == 'calendar_listing_m') {
274 global $Winter_MVC_wdk_bookings;
275 $Winter_MVC_wdk_bookings->model('calendar_m');
276 $this->db->join($Winter_MVC_wdk_bookings->calendar_m->_table_name.' ON '.$post_table.'.ID = '.$Winter_MVC_wdk_bookings->calendar_m->_table_name.'.post_id');
277 }
278
279 if(!empty($parameters['filter_ids'])){
280 $this->db->where(array( esc_sql($this->$table->_table_name.'.'.$this->$table->_primary_key).' IN ('.esc_sql(preg_replace('/[^0-9,]/', '', $parameters['filter_ids'])).')' => NULL));
281 }
282
283 if($table == 'user_m') {
284 $like = "(meta_value LIKE '%wdk_%' )";
285 $tree_results = $this->$table->get_pagination(intval($parameters['limit']),intval($parameters['offset']), $where, NULL, $like);
286
287 } else {
288
289 if(method_exists($this->$table, 'get_pagination_simple')) {
290 if($table == 'location_m') {
291 $this->db->select('location_title, idlocation, level');
292 } else if($table == 'category_m') {
293 $this->db->select('category_title, idcategory, level');
294 }
295 $tree_results = $this->$table->get_pagination_simple(intval($parameters['limit']),intval($parameters['offset']), $where);
296 } else {
297 $tree_results = $this->$table->get_pagination(intval($parameters['limit']),intval($parameters['offset']), $where);
298 }
299
300 }
301 }
302
303 }
304
305 $ind_order=1;
306 foreach ($tree_results as $key=>$row)
307 {
308 $level_gen='';
309 if(empty($attr_search) && isset($row->level))
310 $level_gen = str_pad('', $row->level*12, '&nbsp;').'';
311
312 $results[$ind_order]['key'] = wmvc_show_data($attr_id, $row);
313 if($table == 'listing_m') {
314 $results[$ind_order]['value'] = $level_gen
315 .'#'.wmvc_show_data($attr_id, $row).', '.wmvc_show_data($attr_val, $row);
316 } elseif($table == 'user_m') {
317 $results[$ind_order]['value'] = $level_gen
318 .'#'.wmvc_show_data($attr_id, $row).', '.wmvc_show_data('display_name', $row);
319
320 //if(current_user_can('wdk_listings_manage'))
321 // $results[$ind_order]['value'] .= ' ('.wmvc_show_data('user_email', $row).')';
322 } elseif($table == 'icons_list') {
323 $results[$ind_order]['key'] = $row;
324 if(defined('ELEMENTOR_ASSETS_URL')){
325 $results[$ind_order]['value'] = '<i class="'. $row.'"></i>&nbsp;&nbsp;'.$row;
326 } else {
327 $results[$ind_order]['value'] = $row;
328 }
329 } else {
330 $results[$ind_order]['value'] = $level_gen
331 // Dynamic field values are registered in the translation catalog separately.
332 // phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralText
333 .esc_html__(wmvc_show_data($attr_val, $row), 'wpdirectorykit');
334 }
335 $ind_order++;
336 }
337
338
339 // get current value by ID
340 $row=NULL;
341 if($table == 'icons_list') {
342 if(!empty($parameters['curr_id'])) {
343 $row = '<i class="'. $parameters['curr_id'].'"></i>&nbsp;&nbsp;'.$parameters['curr_id'];
344 }
345 } else {
346 if(!empty($parameters['curr_id']))
347 $row = $this->$table->get(intval($parameters['curr_id']), TRUE);
348 }
349
350 if($table == 'icons_list') {
351 $data['curr_val'] = $row;
352 }elseif(is_object($row))
353 {
354 $level_gen='';
355 if(isset($row->level))
356 $level_gen = str_pad('', $row->level*12, '&nbsp;').'';
357
358 if($table == 'user_m') {
359 $data['curr_val'] = $level_gen
360 .wmvc_show_data('display_name', $row);
361
362 } else {
363 $data['curr_val'] = $level_gen
364 // Dynamic field values are registered in the translation catalog separately.
365 // phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralText
366 .esc_html__(wmvc_show_data(wmvc_show_data('attribute_value', $parameters), $row), 'wpdirectorykit');
367 }
368
369
370 //if(!empty($start_id) && $start_id == $parameters['curr_id'] && isset($parameters['sub_empty_value']) && !empty($parameters['sub_empty_value'])) $this->data['curr_val'] = wmvc_show_data('sub_empty_value', $parameters);
371 //elseif(!empty($start_id) && $start_id == $parameters['curr_id']) $this->data['curr_val'] = $parameters['empty_value'];
372 }
373 else
374 {
375 $data['curr_val'] = $parameters['empty_value'];
376 }
377
378 $this->data['success'] = true;
379
380 $data['results'] = $results;
381 $data['sql'] = $this->db->last_query();
382 $this->output($data);
383 }
384
385 public function treefieldid_checkboxes($output="", $atts=array(), $instance=NULL)
386 {
387 check_ajax_referer('wdk_secure_treefieldid_checkboxes', 'wdk_secure');
388
389 $this->load->load_helper('listing');
390 $this->load->model('listing_m');
391 $this->load->model('listingfield_m');
392
393 $data = array();
394 $data['message'] = __('No message returned!', 'wpdirectorykit');
395 $results = array();
396
397 $parameters = array();
398
399 foreach ($_POST as $key => $value) {
400 $parameters[$key] = sanitize_text_field($value);
401 }
402
403 $table_name = $table = $parameters['table'];
404
405 if(empty($parameters['empty_value']))
406 $parameters['empty_value'] = ' - ';
407
408 if(empty($parameters['limit']))
409 $parameters['limit'] = 10;
410
411 if(empty($parameters['attribute_id']))
412 $parameters['attribute_id'] = 'id';
413
414 if(empty($parameters['attribute_value']))
415 $parameters['attribute_value'] = 'address';
416
417 if(empty($parameters['offset']))
418 $parameters['offset'] = 0;
419
420 if(empty($parameters['sql_where']))
421 $parameters['sql_where'] = '';
422
423 if(empty($parameters['hide_fields']))
424 $parameters['hide_fields'] = '';
425
426 $start_id = '';
427 if(isset($parameters['start_id']))
428 $start_id = $parameters['start_id'];
429
430 if($parameters['offset'] == 0) // currently don't have load_more functionality'
431
432 if(!empty($parameters['empty_value']))
433 {
434 $results[0]['key'] = '';
435 $results[0]['value'] = sanitize_text_field($parameters['empty_value']);
436 }
437
438 // it's model
439
440 if($table == 'calendar_listing_m')
441 $table = 'listing_m';
442
443 $table_name = substr($table,0, -2);
444 $attr_id = preg_replace("/[^0-9a-zA-Z_\-]/", "",sanitize_text_field($parameters['attribute_id']));
445 $attr_val = preg_replace("/[^0-9a-zA-Z_\-]/", "",sanitize_text_field($parameters['attribute_value']));
446
447 $attr_search = wdk_esc_sql(sanitize_text_field($parameters['search_term']));
448 $skip_id = intval($parameters['skip_id']);
449 $language_id = intval($parameters['language_id']);
450
451 if(empty($language_id))
452 $language_id = NULL;
453
454 $id_part="";
455 if(is_numeric($attr_search))
456 $id_part = "$attr_id=$attr_search OR ";
457
458 $this->load->model($table);
459
460 $where = array();
461 if(!empty($attr_search))
462 $attr_val_sql = $attr_val;
463 if($attr_val == 'location_title') {
464 $this->load->model($table);
465 $attr_val_sql = $this->$table->_table_name.'.location_title';
466 } elseif($attr_val == 'category_title'){
467 $this->load->model($table);
468 $attr_val_sql = $this->$table->_table_name.'.category_title';
469 }
470
471 /* if category/locations search also in translated field */
472 if($attr_val == 'location_title' || $attr_val == 'category_title') {
473 $where["($id_part $attr_val_sql LIKE '%$attr_search%' OR ".$this->$table->_table_name.".titles_for_search LIKE '%$attr_search%')"] = NULL;
474 } else {
475 $where["($id_part $attr_val_sql LIKE '%$attr_search%')"] = NULL;
476 }
477
478 if(isset($parameters['selected']) && !empty($parameters['selected'])) {
479
480 if(is_string($parameters['selected']) && strpos($parameters['selected'], ',') !== FALSE){
481 $selected = explode(',', $parameters['selected']);
482 } elseif(is_string($parameters['selected'])){
483 $selected = array($parameters['selected']);
484 }
485
486 $ids = array();
487 foreach($selected as $selected_item) {
488 if(!empty($selected_item) && is_intval($selected_item)) {
489 $ids [] = $selected_item;
490 }
491 }
492
493 /* where in */
494 if(!empty($ids)){
495 $this->db->order_by('FIELD('.$this->$table->_table_name.'.'.$this->$table->_primary_key.', '. implode(',', array_reverse($ids)) . ') DESC');
496 if(intval($parameters['limit']) < count($ids)) {
497 $parameters['limit'] = count($ids);
498 }
499 }
500 }
501
502 if(!empty($parameters['filter_ids'])){
503 $this->db->where(array( esc_sql($this->$table->_table_name.'.'.$this->$table->_primary_key).' IN ('.esc_sql(preg_replace('/[^0-9,]/', '', $parameters['filter_ids'])).')' => NULL));
504 }
505
506 if(!empty($parameters['hide_fields'])) {
507 $parameters['hide_fields'] = preg_replace('/[^0-9,]/', '', $parameters['hide_fields']);
508 if($table == 'location_m') {
509 $sql_where = esc_sql($this->$table->_table_name.'.idlocation').' NOT IN ('.esc_sql(sanitize_text_field($parameters['hide_fields'])).')';
510 foreach (explode(',', $parameters['hide_fields']) as $key => $id) {
511 $sql_where .= ' AND CONCAT(",", '.$this->$table->_table_name.'.parent_path, ",") NOT LIKE CONCAT("%,", '.intval($id).', ",%")';
512 }
513
514 $where[$sql_where] = NULL;
515 }
516
517 if($table == 'category_m') {
518 $sql_where = esc_sql($this->$table->_table_name.'.idcategory').' NOT IN ('.esc_sql(sanitize_text_field($parameters['hide_fields'])).')';
519 foreach (explode(',', $parameters['hide_fields']) as $key => $id) {
520 $sql_where .= ' AND CONCAT(",", '.$this->$table->_table_name.'.parent_path, ",") NOT LIKE CONCAT("%,", '.intval($id).', ",%")';
521 }
522 $where[$sql_where] = NULL;
523 }
524 }
525
526 $tree_results = $this->$table->get_pagination(intval($parameters['limit']),intval($parameters['offset']), $where);
527
528 $ind_order=1;
529 foreach ($tree_results as $key=>$row)
530 {
531 $level_gen='';
532 if(empty($attr_search) && isset($row->level))
533 $level_gen = str_pad('', $row->level*12, '&nbsp;').'';
534
535 $results[$ind_order]['key'] = wmvc_show_data($attr_id, $row);
536 $results[$ind_order]['value'] = $level_gen
537 // Dynamic field values are registered in the translation catalog separately.
538 // phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralText
539 .esc_html__(wmvc_show_data($attr_val, $row), 'wpdirectorykit');
540 $ind_order++;
541 }
542
543 // get current value by ID
544 $row=NULL;
545 if(!empty($parameters['curr_id']))
546 $row = $this->$table->get(intval($parameters['curr_id']), TRUE);
547
548 if(is_object($row))
549 {
550 $level_gen='';
551 if(isset($row->level))
552 $level_gen = str_pad('', $row->level*12, '&nbsp;').'';
553 $data['curr_val'] = $level_gen
554 // Dynamic field values are registered in the translation catalog separately.
555 // phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralText
556 .esc_html__(wmvc_show_data(wmvc_show_data('attribute_value', $parameters), $row), 'wpdirectorykit');
557
558 }
559 else
560 {
561 $data['curr_val'] = $parameters['empty_value'];
562 }
563
564 $this->data['success'] = true;
565
566 $data['results'] = $results;
567 //$data['sql'] = $this->db->last_query();
568 $this->output($data);
569 }
570
571 private function output($data, $print = TRUE) {
572 if($print) {
573 header('Pragma: no-cache');
574 header('Cache-Control: no-store, no-cache');
575 header('Content-Type: application/json; charset=utf8');
576 //header('Content-Length: '.$length); // special characters causing troubles
577 echo (wp_json_encode($data));
578 exit();
579 } else {
580 return $data;
581 }
582 }
583
584
585 public function select_2_ajax($output="", $atts=array(), $instance=NULL)
586 {
587
588 check_ajax_referer('wdk_secure_ajax', 'wdk_secure');
589
590 $this->load->load_helper('listing');
591 $this->load->model('listing_m');
592 $this->load->model('listingfield_m');
593
594 $data = array();
595 $data['message'] = __('No message returned!', 'wpdirectorykit');
596 $results = array();
597 $data['pagination'] = true;
598 $parameters = array();
599
600 foreach ($_POST as $key => $value) {
601 $parameters[$key] = sanitize_text_field($value);
602 }
603
604 if(empty($parameters['table'])) return false;
605
606 $model_name = $parameters['table'];
607
608 // allow only 'listing_m', 'category_m', or 'location_m' for security
609 $allowed_models = array('listing_m', 'category_m', 'location_m');
610 if (!in_array($model_name, $allowed_models)) {
611 return false;
612 }
613
614 $key_column = '';
615 $print_column = '';
616
617 $search_column = '';
618 if(empty($parameters['columns_search'])) {
619 switch ($model_name) {
620 case 'category_m':
621 $this->load->model($model_name);
622 $search_column = $this->$model_name->_table_name.'.idcategory,'.$this->$model_name->_table_name.'.category_title, '.$this->$model_name->_table_name.'.titles_for_search';
623 break;
624 case 'location_m':
625 $this->load->model($model_name);
626 $search_column = $this->$model_name->_table_name.'.idlocation,'.$this->$model_name->_table_name.'.location_title, '.$this->$model_name->_table_name.'.titles_for_search';
627 break;
628
629 default:
630 # code...
631 break;
632 }
633
634 } else {
635 $search_column = esc_sql(preg_replace('/[^a-z0-9_,]/i', '', $parameters['columns_search']));
636 }
637
638 if(empty($parameters['key_column'])) {
639 switch ($model_name) {
640 case 'category_m':
641 $key_column = 'idcategory';
642 break;
643 case 'location_m':
644 $key_column = 'idlocation';
645 break;
646
647 default:
648 # code...
649 break;
650 }
651 } else {
652 $key_column = $parameters['key_column'];
653 }
654
655 if(empty($parameters['print_column'])) {
656 switch ($model_name) {
657 case 'category_m':
658 $print_column = 'category_title';
659 break;
660 case 'location_m':
661 $print_column = 'location_title';
662 break;
663
664 default:
665 # code...
666 break;
667 }
668 } else {
669 $print_column = $parameters['print_column'];
670 }
671
672 $limit = 20;
673 if(!empty($parameters['limit'])) {
674 $limit = intval($parameters['limit']);
675 }
676
677 $offset = NULL;
678 if(!empty($parameters['page_result']) && $parameters['page_result'] > 1) {
679 $offset = (intval($parameters['page_result']) - 1) * $limit;
680 }
681
682 $this->load->model($model_name);
683
684 $where = array();
685 if(!empty($_POST['q']['term']) && !empty($search_column)) {
686 $sql_search = '';
687 foreach (explode(',', $search_column) as $column) {
688 if(empty($column)) continue;
689
690 if(!empty($sql_search))
691 $sql_search .= " OR ";
692
693 $sql_search .= " ".esc_sql($column)." LIKE '%".esc_sql($_POST['q']['term'])."%'";
694 }
695
696 $where ["($sql_search)"] = NULL;
697 }
698
699 $db_results_total = $this->$model_name->total($where);
700 $db_results = $this->$model_name->get_pagination($limit,$offset, $where);
701
702 if (!$db_results) {
703 $data['errors'] = '';
704 } else {
705 foreach($db_results as $row) {
706
707 $level_gen='';
708 if(empty($attr_search) && isset($row->level))
709 $level_gen = str_pad('', $row->level*12, '&nbsp;').'';
710
711 $results[] = [
712 'id'=> wmvc_show_data($key_column, $row),
713 // Dynamic field values are registered in the translation catalog separately.
714 // phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralText
715 'text'=> $level_gen.esc_html__(trim(wmvc_show_data($print_column, $row)), 'wpdirectorykit'),
716 ];
717 }
718
719 }
720
721 $data['success'] = true;
722
723 $data['results'] = $results;
724
725
726 if($db_results_total >= $limit + $offset) {
727 $data['pagination'] =[
728 "more"=> true
729 ];
730 }
731
732 //$data['sql'] = $this->db->last_query();
733 $this->output($data);
734 }
735
736 public function select_2_ajax_user($output="", $atts=array(), $instance=NULL)
737 {
738 $this->load->load_helper('listing');
739
740 $data = array();
741 $data['message'] = __('No message returned!', 'wpdirectorykit');
742 $results = array();
743 $data['pagination'] = true;
744 $parameters = array();
745
746 foreach ($_POST as $key => $value) {
747 $parameters[$key] = sanitize_text_field($value);
748 }
749
750 $model_name = 'user_m';
751
752 $key_column = '';
753 $print_column = '';
754
755 $limit = 20;
756 if(!empty($parameters['limit'])) {
757 $limit = intval($parameters['limit']);
758 }
759
760 $offset = NULL;
761 if(!empty($parameters['page_result']) && $parameters['page_result'] > 1) {
762 $offset = (intval($parameters['page_result']) - 1) * $limit;
763 }
764
765 $this->load->model($model_name);
766 $search_column = 'display_name,user_login,ID';
767 if(current_user_can('administrator')) {
768 $search_column = 'display_name,user_email,user_login,ID';
769 }
770
771 $where = array();
772 if(!empty($_POST['q']['term']) && !empty($search_column)) {
773 $sql_search = '';
774 foreach (explode(',', $search_column) as $column) {
775 if(empty($column)) continue;
776
777 if(!empty($sql_search))
778 $sql_search .= " OR ";
779
780 $sql_search .= " ".esc_sql($column)." LIKE '%".esc_sql($_POST['q']['term'])."%'";
781 }
782
783 $where ["($sql_search)"] = NULL;
784 }
785
786 $like = "(meta_value LIKE '%wdk_%' )";
787 $db_results_total = $this->$model_name->total($where, NULL, $like);
788
789 $db_results = $this->$model_name->get_pagination($limit,$offset, $where, NULL, $like);
790
791 if (!$db_results) {
792 $data['errors'] = '';
793 } else {
794 foreach($db_results as $row) {
795
796 $level_gen='';
797 //if(empty($attr_search) && isset($row->level))
798 // $level_gen = str_pad('', $row->level*12, '&nbsp;').'';
799
800 $results[] = [
801 'id'=> wmvc_show_data('ID', $row),
802 'text'=> $level_gen.trim(wmvc_show_data('display_name', $row)),
803 ];
804 }
805
806 }
807
808 $data['success'] = true;
809
810 $data['results'] = $results;
811 if($db_results_total >= $limit + $offset) {
812 $data['pagination'] =[
813 "more"=> true
814 ];
815 }
816
817 //$data['sql'] = $this->db->last_query();
818 $this->output($data);
819 }
820
821 public function wdk_tree_dropdowns($output="", $atts=array(), $instance=NULL)
822 {
823 $this->load->load_helper('listing');
824
825 $data = array();
826 $data['message'] = __('No message returned!', 'wpdirectorykit');
827 $results = array();
828 $parameters = array();
829
830 foreach ($_POST as $key => $value) {
831 $parameters[$key] = sanitize_text_field($value);
832 }
833
834 if(empty($parameters['table'])) return false;
835
836 switch ($parameters['table']) {
837 case 'category_id':
838 case 'search_category':
839 $model_name = 'category_m';
840 break;
841 case 'location_id':
842 case 'search_location':
843 $model_name = 'location_m';
844 break;
845 default:
846 # code...
847 break;
848 }
849
850 $key_column = '';
851 $print_column = '';
852 $current_id = '0';
853
854 if(!empty($parameters['id'])) {
855 $current_id = intval($parameters['id']);
856 }
857
858 if(empty($parameters['key_column'])) {
859 switch ($model_name) {
860 case 'category_m':
861 $key_column = 'idcategory';
862 break;
863 case 'location_m':
864 $key_column = 'idlocation';
865 break;
866
867 default:
868 # code...
869 break;
870 }
871 } else {
872 $key_column = $parameters['key_column'];
873 }
874
875 if(empty($parameters['print_column'])) {
876 switch ($model_name) {
877 case 'category_m':
878 $print_column = 'category_title';
879 break;
880 case 'location_m':
881 $print_column = 'location_title';
882 break;
883
884 default:
885 # code...
886 break;
887 }
888 } else {
889 $print_column = $parameters['print_column'];
890 }
891
892 $this->load->model($model_name);
893
894 $db_results = $this->$model_name->get_by(array('parent_id = '.$current_id => NULL));
895 $level = 5;
896
897 if(isset($db_results[0]->level)) {
898 $level = $db_results[0]->level;
899 }
900
901 $data['output'] = $db_results;
902
903 if (!$db_results) {
904 $data['errors'] = '';
905 } else {
906
907 if($model_name == 'category_m') {
908 $placeholder_texts = [
909 0 => esc_html__('Select Categories','wpdirectorykit'),
910 1 => esc_html__('Select Sub Categories','wpdirectorykit'),
911 2 => esc_html__('Select Sub Categories','wpdirectorykit'),
912 3 => esc_html__('Select Sub Categories','wpdirectorykit'),
913 4 => esc_html__('Select Sub Categories','wpdirectorykit'),
914 5 => esc_html__('Select Sub Categories','wpdirectorykit'),
915 ];
916 } else {
917 $placeholder_texts = [
918 0 => esc_html__('Select Country','wpdirectorykit'),
919 1 => esc_html__('Select City','wpdirectorykit'),
920 2 => esc_html__('Select Neighborhood','wpdirectorykit'),
921 3 => esc_html__('Select Sub Area','wpdirectorykit'),
922 4 => esc_html__('Select Sub Area','wpdirectorykit'),
923 5 => esc_html__('Select Sub Area','wpdirectorykit'),
924 ];
925 }
926
927 if(isset($placeholder_texts[$level])) {
928 $placeholder = $placeholder_texts[$level];
929 } else {
930 $placeholder = esc_html__('Select Sub Categories','wpdirectorykit');
931 }
932
933 $results[] = [
934 'id'=> '',
935 'text'=> $placeholder
936 ];
937
938 foreach($db_results as $row) {
939 $results[] = [
940 'id'=> wmvc_show_data($key_column, $row),
941 // Dynamic field values are registered in the translation catalog separately.
942 // phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralText
943 'text'=> esc_html__(trim(wmvc_show_data($print_column, $row)),'wpdirectorykit'),
944 ];
945 }
946
947 }
948
949 $data['success'] = true;
950 $data['results'] = $results;
951
952 //$data['sql'] = $this->db->last_query();
953 $this->output($data);
954 }
955
956
957 public function search_suggestion($output="", $atts=array(), $instance=NULL)
958 {
959 $this->load->load_helper('listing');
960 $this->load->model('category_m');
961 $this->load->model('location_m');
962 $this->load->model('listing_m');
963
964 $data = array();
965 $categories_limit = 5;
966 $categories_search_column = array('idcategory','category_title');
967 $locations_limit = 5;
968 $locations_search_column = array('idlocation','location_title');
969
970 $results = array();
971 /*
972 [
973 'field_key' => 'string',
974 'value' => 'string',
975 'print' => [
976 'html' => 'string',
977 'parsed_html' => [
978 'left_column' => 'string',
979 'middle_column' => 'string',
980 'right_column' => 'string',
981 ],
982 'parsed_content' => [
983 'icon_class' => 'string',
984 'title' => 'string',
985 'sub_title' => 'string',
986 'right_text' => 'string',
987 ]
988 ]
989 ]
990
991 */
992
993 $data['message'] = __('No message returned!', 'wpdirectorykit');
994
995 $parameters = array();
996 foreach ($_POST as $key => $value) {
997 $parameters[$key] = sanitize_text_field($value);
998 }
999
1000 $search_text = '';
1001 if(!empty($parameters['search']))
1002 $search_text = trim($parameters['search']);
1003
1004 /* Categories */
1005 $where = array();
1006 if($search_text) {
1007 $sql_search = '';
1008 foreach ($categories_search_column as $column) {
1009 if(!empty($sql_search))
1010 $sql_search .= " OR ";
1011
1012 $sql_search .= " ".$this->category_m->_table_name.'.'.esc_sql($column)." LIKE '%".esc_sql($search_text)."%'";
1013 }
1014 $where ["($sql_search)"] = NULL;
1015 $db_results = $this->category_m->get_pagination($categories_limit, NULL, $where);
1016 } else {
1017 $db_results = $this->category_m->get_pagination($categories_limit, NULL, array('parent_id = 0' => NULL));
1018 }
1019
1020 if($db_results) foreach($db_results as $row) {
1021 $results[] = [
1022 'field_key' => 'search_category',
1023 'value' => $row->category_title,
1024 'print' => [
1025 'parsed_content' => [
1026 'icon_class' => (!empty(wmvc_show_data('font_icon_code', $row, false))) ? esc_attr(wmvc_show_data('font_icon_code', $row)): 'fa fa-tag',
1027 // Dynamic field values are registered in the translation catalog separately.
1028 // phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralText
1029 'title' => esc_html__($row->category_title, 'wpdirectorykit'),
1030 'sub_title' => '',
1031 'right_text' => __('Category', 'wpdirectorykit')
1032 ]
1033 ]
1034 ];
1035 }
1036
1037 /* END Categories */
1038
1039 /* Locations */
1040 $where = array();
1041 if($search_text) {
1042 $sql_search = '';
1043 foreach ($locations_search_column as $column) {
1044 if(!empty($sql_search))
1045 $sql_search .= " OR ";
1046
1047 $sql_search .= " ".$this->db->prefix."wdk_locations.".esc_sql($column)." LIKE '%".esc_sql($search_text)."%'";
1048 }
1049 $where ["($sql_search)"] = NULL;
1050
1051 $select = $this->db->prefix.'wdk_locations.idlocation, '.$this->db->prefix.'wdk_locations.location_title';
1052 $select .= ',location_1.location_title AS location_title_1';
1053
1054 $this->db->join($this->db->prefix.'wdk_locations AS location_1 ON '.$this->db->prefix.'wdk_locations.parent_id = location_1.idlocation', NULL, 'LEFT');
1055 for($i = 2 ; $i <= 2; $i++) {
1056 $select .= ',location_'.$i.'.location_title AS location_title_'.$i.'';
1057 $this->db->join($this->db->prefix.'wdk_locations AS location_'.$i.' ON location_'.($i-1).'.parent_id = location_'.$i.'.idlocation', NULL, 'LEFT');
1058 }
1059 $this->db->select($select);
1060 $db_results = $this->location_m->get_pagination($locations_limit, NULL, $where);
1061 } else {
1062 $db_results = $this->location_m->get_pagination($locations_limit, NULL, array('parent_id = 0' => NULL));
1063 }
1064
1065 if($db_results) foreach($db_results as $row) {
1066 $subtitle = '';
1067
1068 for($i = 1 ; $i <= 2; $i++) {
1069 if(wmvc_show_data('location_title_'.$i, $row, false)){
1070 $subtitle .= wmvc_show_data('location_title_'.$i, $row, false).', ';
1071 }
1072 }
1073
1074 $subtitle = substr($subtitle,0,-2);
1075
1076 $results[] = [
1077 'field_key' => 'search_location',
1078 'value' => $row->location_title,
1079 'print' => [
1080 'parsed_content' => [
1081 'icon_class' => (!empty(wmvc_show_data('font_icon_code', $row, false))) ? esc_attr(wmvc_show_data('font_icon_code', $row)) : 'fa fa-map-marker',
1082 // Dynamic field values are registered in the translation catalog separately.
1083 // phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralText
1084 'title' => esc_html__($row->location_title, 'wpdirectorykit'),
1085 // Dynamic field values are registered in the translation catalog separately.
1086 // phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralText
1087 'sub_title' => esc_html__($subtitle, 'wpdirectorykit'),
1088 'right_text' => __('Location', 'wpdirectorykit')
1089 ]
1090 ]
1091 ];
1092 }
1093
1094 /* END Locations */
1095
1096 /* address suggestion if empty other */
1097 $limit = apply_filters('wdk/search_suggestion/address_limit', 5);
1098 if(count($results)<10) {
1099 $this->db->select('address');
1100 $db_results = $this->db->where(array("address LIKE '%".esc_sql($search_text)."%'" => NULL));
1101 $this->db->from($this->listing_m->_table_name);
1102 $this->db->group_by('address');
1103 $this->db->limit($limit);
1104
1105 $query = $this->db->get();
1106 if ($this->db->num_rows() > 0) {
1107 $db_results = $this->db->results();
1108 } else {
1109 $db_results = array();
1110 }
1111
1112 if($db_results) foreach($db_results as $row) {
1113 $results[] = [
1114 'field_key' => 'address',
1115 'value' => $row->address,
1116 'print' => [
1117 'parsed_content' => [
1118 'icon_class' => 'fa fa-map-marker',
1119 'title' => $row->address,
1120 'sub_title' => '',
1121 'right_text' => __('Address', 'wpdirectorykit')
1122 ]
1123 ]
1124 ];
1125 }
1126 }
1127
1128 /* listings by title suggestion */
1129 // Example of how to use add_filter for 'wdk/search_suggestion/listings_limit'
1130 // In your theme's functions.php or a custom plugin, you can add:
1131 // add_filter('wdk/search_suggestion/listings_limit', function($limit) { return 10; });
1132
1133 $limit = apply_filters('wdk/search_suggestion/listings_limit', 5);
1134 $this->db->where(array("post_title LIKE '%".esc_sql($search_text)."%'" => NULL));
1135 $db_results = $this->listing_m->get_pagination($limit, NULL, array('is_activated' => 1,'is_approved'=>1));
1136
1137 if($db_results) foreach($db_results as $row) {
1138 $results[] = [
1139 'field_key' => 'link',
1140 'value' => get_permalink($row),
1141 'print' => [
1142 'parsed_content' => [
1143 'icon_class' => 'fa fa-circle',
1144 'title' => $row->post_title,
1145 'sub_title' => '',
1146 'right_text' => __('Listing', 'wpdirectorykit')
1147 ]
1148 ]
1149 ];
1150 }
1151
1152 if(count($results)<10) {
1153
1154 $name_part = str_replace(' ','+',$search_text);
1155
1156 //$url = 'http://photon.komoot.de/api/?q='.$name_part;
1157 $url = 'https://api.teleport.org/api/cities/?limit=1&search='.$name_part;
1158
1159 $request = wp_remote_get( $url );
1160 $response = '';
1161
1162 // request failed
1163 if ( is_wp_error( $request ) ) {
1164 $response = $request;
1165 }
1166 $code = (int) wp_remote_retrieve_response_code( $request );
1167
1168 // make sure the fetch was successful
1169 if (empty($response) && $code == 200 ) {
1170 $response = wp_remote_retrieve_body( $request );
1171
1172 // Decode the json
1173 $resp = json_decode( $response,true );
1174 if(!empty($resp) && isset($resp['_embedded']) && isset($resp["_embedded"]["city:search-results"]) && !empty($resp["_embedded"]["city:search-results"])) {
1175 foreach($resp["_embedded"]["city:search-results"] as $prediction)
1176 {
1177 if(isset($prediction["matching_full_name"])){
1178 $results[] = [
1179 'field_key' => 'search_location',
1180 'value' => $prediction["matching_full_name"],
1181 'print' => [
1182 'parsed_content' => [
1183 'icon_class' => 'fa fa-map-marker',
1184 'title' => $prediction["matching_full_name"],
1185 'sub_title' => '',
1186 'right_text' => ''
1187 ]
1188 ]
1189 ];
1190
1191 }
1192 break;
1193 }
1194 }
1195 }
1196 }
1197
1198 $data['success'] = true;
1199 $data['results'] = $results;
1200
1201 //$data['sql'] = $this->db->last_query();
1202 $this->output($data);
1203 }
1204
1205 public function booking_price_calculate() {
1206 $data = array();
1207 $data['success'] = false;
1208
1209 $this->load->load_helper('listing');
1210 global $Winter_MVC_wdk_bookings;
1211
1212 $Winter_MVC_wdk_bookings->model('reservation_m');
1213 $Winter_MVC_wdk_bookings->model('calendar_m');
1214
1215 $results = array();
1216 $parameters = array();
1217 foreach ($_POST as $key => $value) {
1218 $parameters[sanitize_text_field($key)] = sanitize_text_field($value);
1219 }
1220
1221 $post_id = NULL;
1222 $date_from = NULL;
1223 $date_to = NULL;
1224
1225 if(isset($parameters['post_id'])) {
1226 $post_id = $parameters['post_id'];
1227 }
1228
1229 $calendar = $Winter_MVC_wdk_bookings->calendar_m->get_by(array('post_id'=>$post_id), TRUE);
1230 $time_format = "00:00:00";
1231 if($calendar && $calendar->is_hour_enabled == 1)
1232 $time_format = "H:i:s";
1233
1234
1235 if(isset($parameters['date_from'])) {
1236 $date_from = wdk_normalize_date_db($parameters['date_from'], 'Y-m-d H:i:s', 'Y-m-d '.$time_format);
1237 }
1238
1239 if(isset($parameters['date_to'])) {
1240 $date_to = wdk_normalize_date_db($parameters['date_to'], 'Y-m-d H:i:s', 'Y-m-d '.$time_format);
1241 }
1242
1243
1244 if($post_id && $date_from && $date_to) {
1245 $price = $Winter_MVC_wdk_bookings->reservation_m->calculate_price($post_id, $date_from, $date_to);
1246
1247
1248 $calendar_fees = array();
1249 if($calendar && !empty($calendar->json_data_fees))
1250 $calendar_fees = json_decode($calendar->json_data_fees );
1251
1252 $results['symbol'] = '';
1253 if(function_exists('wdk_booking_currency_symbol'))
1254 $results['symbol'] = wdk_booking_currency_symbol();
1255
1256 if($price) {
1257 $results['price'] = $price['price'];
1258 $results['total'] = $price['price'];
1259 $results['fees_data'] = array();
1260 $results['fees'] = array();
1261 foreach ($calendar_fees as $key => $fee) {
1262 if(!wmvc_show_data('is_activated', $fee, false,TRUE,TRUE)) continue;
1263 if(is_intval(wmvc_show_data('value', $fee,'',TRUE,TRUE))) {
1264 $field = wdk_generate_slug(strtolower(esc_html(wmvc_show_data('title', $fee,'-',TRUE,TRUE))));
1265 if(!wmvc_show_data('is_required', $fee, false,TRUE,TRUE) && isset($parameters['fee_'.$field]) && $parameters['fee_'.$field] == 0) {
1266 } else {
1267 $price = 0;
1268 if(wmvc_show_data('calculation_base', $fee,'',TRUE,TRUE) == 'per_night') {
1269 $nights = (int)abs(strtotime($date_from) - strtotime($date_to))/(60*60*24);
1270 $price += intval(wmvc_show_data('value', $fee,'',TRUE,TRUE)) * $nights;
1271 } else if(wmvc_show_data('calculation_base', $fee,'',TRUE,TRUE) == 'per_person') {
1272 $price += intval(wmvc_show_data('value', $fee,'',TRUE,TRUE)) * intval(wmvc_show_data('guests', $_POST, 0,TRUE,TRUE));
1273 } else {
1274 $price += intval(wmvc_show_data('value', $fee,'',TRUE,TRUE));
1275 }
1276 $results['fees'][wmvc_show_data('title', $fee,'',TRUE,TRUE)] = $price;
1277 $results['total'] += $price;
1278 }
1279 }
1280
1281 $results['fees_data'][$key] = $fee;
1282 $results['fees_data'][$key]->field_id = wdk_generate_slug(strtolower(esc_html(wmvc_show_data('title', $fee,'-',TRUE,TRUE))));
1283 $results['fees_data'][$key]->calculation_base_text = (isset($Winter_MVC_wdk_bookings->calendar_m->calculation_base[wmvc_show_data('calculation_base', $fee,'-',TRUE,TRUE)])) ? $Winter_MVC_wdk_bookings->calendar_m->calculation_base[wmvc_show_data('calculation_base', $fee,'-',TRUE,TRUE)] : 'per stay';
1284 }
1285 $data['success'] = true;
1286 } else {
1287 $data['popup_text_error'] = __('Those dates are not available', 'wpdirectorykit');
1288 }
1289 }
1290
1291 $data['results'] = $results;
1292
1293 //$data['sql'] = $this->db->last_query();
1294 $this->output($data);
1295 }
1296
1297 public function loading_listings() {
1298 $this->load->load_helper('listing');
1299 $this->load->load_helper('get_element_settings');
1300 $this->load->model('listing_m');
1301 $this->load->model('listingfield_m');
1302 $this->load->model('category_m');
1303
1304 $data = array();
1305 $data['message'] = '';
1306 $data['popup_text_success'] = '';
1307 $data['popup_text_error'] = '';
1308 $data['output'] = [
1309 'map_results'=>null,
1310 'listings_result'=>null,
1311 'listings_result_message'=>null,
1312 'pagination_html'=>null,
1313 'listings_count'=>null,
1314 'listings_count_html'=>null,
1315 ];
1316 $data['success'] = false;
1317
1318 $parameters = array();
1319 foreach ($_POST as $key => $value) {
1320 $parameters[$key] = sanitize_text_field($value);
1321 }
1322
1323 $options = [
1324 'offset' => 0,
1325 'limit' => 6,
1326 'current_page' => 1,
1327 'limit_pagination' => 5,
1328 'layout_type' => 'grid',
1329 ];
1330
1331 $custom_parameters = array();
1332 $parameters['url'] = strstr($parameters['url'], "#", true);
1333 $parameters['url'] = strstr($parameters['url'], "?");
1334 if(!empty($parameters['url'])) {
1335 $qr_string = trim($parameters['url'],'?');
1336 $string_par = array();
1337 parse_str($qr_string, $string_par);
1338 $custom_parameters += $string_par;
1339 }
1340
1341 $controller = 'listing';
1342 $columns = array('ID', 'location_id', 'category_id', 'post_title', 'post_date', 'search', 'order_by','is_featured', 'address');
1343 $external_columns = array('location_id', 'category_id', 'post_title');
1344
1345 if(isset($parameters['el_results_id'])) {
1346 wdk_prepare_search_query_GET($columns, $controller.'_m', $external_columns, $custom_parameters);
1347 $data['output']['listings_count'] = $this->listing_m->total(array('is_activated' => 1,'is_approved'=>1));
1348 $data['output']['listings_count_html'] = $data['output']['listings_count'].' '.esc_html__('Listings', 'wpdirectorykit');
1349
1350 if(defined( 'WP_DEBUG' ) && WP_DEBUG)
1351 $data['listings_count_sql'] = $this->db->last_query();
1352
1353 if(isset($custom_parameters['wmvc_paged']))
1354 $options['current_page'] = intval(wmvc_xss_clean($custom_parameters['wmvc_paged']));
1355
1356 $get_settings_el_results = new WdkGetElementSettings($parameters['el_results_page_id'],$parameters['el_results_id'],$parameters['el_results_type']);
1357 $settings_el_results = $get_settings_el_results->get_settings();
1358 $settings_el_results = $settings_el_results['settings'] ?? [];
1359
1360 if(wmvc_show_data('per_page', $settings_el_results, false)) {
1361 $options['limit'] = wmvc_show_data('per_page', $settings_el_results, false);
1362 }
1363
1364 if(wmvc_show_data('layout_type', $settings_el_results, false)) {
1365 $options['layout_type'] = wmvc_show_data('layout_type', $settings_el_results, false);
1366 }
1367
1368 $offset = $options['limit']*( $options['current_page']-1);
1369
1370 global $_GET;
1371 $temp_get = $_GET;
1372 $_GET = $custom_parameters;
1373 do_action('wpdirectorykit/ajax/loading_listings');
1374 $REQUEST_URI = $_SERVER["REQUEST_URI"];
1375
1376 $_SERVER["REQUEST_URI"] = $_SERVER['HTTP_REFERER'];
1377
1378 $data['output']['pagination_html'] = wdk_wp_frontend_paginate($data['output']['listings_count'], $options['limit'], 'wmvc_paged', array(), TRUE,
1379 FALSE, FALSE, $options['limit_pagination']);
1380
1381 $_SERVER["REQUEST_URI"] = $REQUEST_URI;
1382 $_GET = $temp_get;
1383
1384 wdk_prepare_search_query_GET($columns, $controller.'_m', $external_columns, $custom_parameters);
1385 $listings_result = $this->listing_m->get_pagination($options['limit'], $offset, array('is_activated' => 1,'is_approved'=>1));
1386
1387 if(defined( 'WP_DEBUG' ) && WP_DEBUG)
1388 $data['listings_result_sql'] = $this->db->last_query();
1389
1390 if(wmvc_show_data('layout_type', $settings_el_results, false)) {
1391 $settings_el_results['content_button_icon'] = $get_settings_el_results->generate_icon(wmvc_show_data('layout_type', $settings_el_results, false));
1392 } else {
1393 $settings_el_results['content_button_icon'] = '';
1394 }
1395
1396 if($listings_result) {
1397 foreach ($listings_result as $key => $listing) {
1398 $listing->card_view = '';
1399
1400 if (
1401 wdk_get_option('wdk_experimental_features') && wdk_get_option('wdk_experimental_listing_card_elementor_layout') &&
1402 wmvc_show_data('is_custom_layout_enable', $settings_el_results) == 'yes'
1403 ) {
1404 if ($options['layout_type'] == 'list' && wmvc_show_data('custom_layout_id_list', $settings_el_results, false)) {
1405 $content = '';
1406 $post_data = get_post(wmvc_show_data('custom_layout_id_list', $settings_el_results, false));
1407
1408 global $wdk_listing_id;
1409 $wdk_listing_id = wmvc_show_data('post_id', $listing);
1410 if ($post_data) {
1411 if ($post_data->post_type == 'page' || $post_data->post_type == 'elementor_library') {
1412 $elementor_instance = \Elementor\Plugin::instance();
1413 $content = $elementor_instance->frontend->get_builder_content_for_display(wmvc_show_data('custom_layout_id_list', $settings_el_results, false));
1414 if (empty($content))
1415 $content = $post_data->post_content;
1416 } else {
1417 $content = $post_data->post_content;
1418 }
1419 }
1420 $listing->card_view = ($content);
1421 } elseif ($options['layout_type'] == 'grid' && wmvc_show_data('custom_layout_id_grid', $settings_el_results, false)) {
1422 $content = '';
1423 $post_data = get_post( wmvc_show_data('custom_layout_id_grid', $settings_el_results, false));
1424
1425 global $wdk_listing_id;
1426 $wdk_listing_id = wmvc_show_data('post_id', $listing);
1427 if ($post_data) {
1428 if ($post_data->post_type == 'page' || $post_data->post_type == 'elementor_library') {
1429 $elementor_instance = \Elementor\Plugin::instance();
1430 $content = $elementor_instance->frontend->get_builder_content_for_display(wmvc_show_data('custom_layout_id_grid', $settings_el_results, false));
1431 if (empty($content))
1432 $content = $post_data->post_content;
1433 } else {
1434 $content = $post_data->post_content;
1435 }
1436 }
1437 $listing->card_view = ($content);
1438 } else {
1439 $listing->card_view = wdk_listing_card($listing, $settings_el_results);
1440 }
1441 } else {
1442 $listing->card_view = wdk_listing_card($listing, $settings_el_results);
1443 }
1444
1445 $data['output']['listings_result'][] = $listing;
1446 }
1447 } else {
1448 $data['output']['listings_result_message'] = '<p class="wdk_alert wdk_alert-danger">'.esc_html__('Results not found', 'wpdirectorykit').'</p>';
1449 }
1450
1451 }
1452
1453 /* map results */
1454 if(isset($parameters['el_map_id'])) {
1455 wdk_prepare_search_query_GET($columns, $controller.'_m', $external_columns, $custom_parameters);
1456 $map_results = $this->listing_m->get_pagination(NULL, NULL, array('is_activated' => 1,'is_approved'=>1));
1457 if(defined( 'WP_DEBUG' ) && WP_DEBUG)
1458 $data['map_results_sql'] = $this->db->last_query();
1459
1460 $get_settings_el_map = new WdkGetElementSettings($parameters['el_map_page_id'],$parameters['el_map_id'],$parameters['el_map_type']);
1461 $settings_el_map = $get_settings_el_map->get_settings();
1462 $settings_el_map = $settings_el_map['settings'];
1463
1464 foreach ($map_results as $key => $listing) {
1465 $listing->inner_marker = '';
1466
1467 $pin_icon = "";
1468 $font_class = "";
1469 $font_icon = (wmvc_show_data('conf_custom_map_pin_icon', $settings_el_map)) ? esc_url($get_settings_el_map->generate_icon($settings_el_map['conf_custom_map_pin_icon'])) : '<i class="fa fa-home"></i>';
1470 $pin_icon = (isset( $settings_el_map['conf_custom_map_pin'])) ? esc_url($settings_el_map['conf_custom_map_pin']['url']) : '';
1471
1472 if(wmvc_show_data('conf_hide_real_location', $category) == 'yes') {
1473 $listing->listing_lat = wdk_move_gps($listing->listing_lat);
1474 $listing->listing_lng = wdk_move_gps($listing->listing_lng);
1475 }
1476
1477 if(!empty(wmvc_show_data('category_id', $listing))){
1478 $category = $this->category_m->get_data(wmvc_show_data('category_id', $listing));
1479 if(wmvc_show_data('marker_image_id', $category, false, TRUE, TRUE)){
1480 $pin_icon = wdk_image_src($category, 'full', NULL,'marker_image_id');
1481 } else if(!empty(wmvc_show_data('font_icon_code', $category))) {
1482 $font_class = wmvc_show_data('font_icon_code', $category);
1483 }
1484 } else {
1485 $font_class = "";
1486 }
1487
1488 if($pin_icon){
1489 $listing->inner_marker = '<div class="wdk_marker-container wdk_marker-container-image"><img src='.$pin_icon.'></img></div>';
1490 }elseif($font_icon && empty($font_class)){
1491 $listing->inner_marker = '<div class="wdk_marker-container category_id_'.esc_js(wmvc_show_data('category_id', $listing)).'"><div class="front wdk_face">'.$font_icon.'</div><div class="wdk_marker-card"><div class="wdk_marker-arrow"></div></div></div>';
1492 }else{
1493 $listing->inner_marker = '<div class="wdk_marker-container category_id_'.esc_js(wmvc_show_data('category_id', $listing)).'"><div class="front wdk_face"><i class="'.esc_html($font_class).'"></i></div><div class="wdk_marker-card"><div class="wdk_marker-arrow"></div></div></div>';
1494 }
1495
1496 $data['output']['map_results'][] = $listing;
1497 }
1498 }
1499
1500 $data['success'] = true;
1501 $this->output($data);
1502
1503 }
1504
1505
1506 public function suggestion_locations (&$output=NULL, $atts=array())
1507 {
1508
1509 $this->load->load_helper('listing');
1510 $this->load->model('category_m');
1511 $this->load->model('location_m');
1512 $this->load->model('listing_m');
1513
1514 $data = array();
1515 $data['message'] = __('No message returned!', 'wpdirectorykit');
1516
1517 $data['results'] = array();
1518 $parameters = array();
1519 foreach ($_POST as $key => $value) {
1520 $parameters[$key] = sanitize_text_field($value);
1521 }
1522
1523 $search_text = '';
1524 if(!empty($parameters['search']))
1525 $search_text = trim($parameters['search']);
1526
1527 if(!empty($search_text)) {
1528 $this->db->select("location_title as value");
1529 $this->db->from($this->location_m->_table_name);
1530 $this->db->where(array("location_title LIKE '%".esc_sql($search_text)."%'" => NULL));
1531
1532 $query = $this->db->get();
1533 if($this->db->num_rows() > 0) foreach($this->db->results() as $row) {
1534 $data['results'][] = $row->value;
1535 }
1536 }
1537
1538 $data['success'] = true;
1539 $this->output($data);
1540 }
1541
1542 public function suggestion_categories (&$output=NULL, $atts=array())
1543 {
1544
1545 $this->load->load_helper('listing');
1546 $this->load->model('category_m');
1547
1548 $data = array();
1549 $data['message'] = __('No message returned!', 'wpdirectorykit');
1550
1551 $data['results'] = array();
1552 $parameters = array();
1553 foreach ($_POST as $key => $value) {
1554 $parameters[$key] = sanitize_text_field($value);
1555 }
1556
1557 $search_text = '';
1558 if(!empty($parameters['search']))
1559 $search_text = trim($parameters['search']);
1560
1561 if(!empty($search_text)) {
1562 $this->db->select("category_title as value");
1563 $this->db->from($this->category_m->_table_name);
1564 $this->db->where(array("category_title LIKE '%".esc_sql($search_text)."%'" => NULL));
1565
1566 $query = $this->db->get();
1567 if($this->db->num_rows() > 0) foreach($this->db->results() as $row) {
1568 $data['results'][] = $row->value;
1569 }
1570 }
1571
1572 $data['success'] = true;
1573 $this->output($data);
1574 }
1575
1576 public function suggestion_db_field (&$output=NULL, $atts=array())
1577 {
1578 $this->load->load_helper('listing');
1579 $this->load->model('category_m');
1580 $this->load->model('location_m');
1581 $this->load->model('listing_m');
1582
1583 $data = array();
1584 $data['message'] = __('No message returned!', 'wpdirectorykit');
1585
1586 $data['results'] = array();
1587 $parameters = array();
1588 foreach ($_POST as $key => $value) {
1589 $parameters[$key] = sanitize_text_field($value);
1590 }
1591
1592 $search_text = '';
1593 if(!empty($parameters['search']))
1594 $search_text = trim($parameters['search']);
1595
1596 $search_field_id = '';
1597 if(!empty($parameters['field_id']))
1598 $search_field_id = (int) trim($parameters['field_id']);
1599
1600 if(!empty($search_field_id) && wdk_field_option($search_field_id, 'field_type', false)) {
1601
1602 /* listings by title suggestion */
1603 $this->db->select("DISTINCT field_".$search_field_id."_".wdk_field_option($search_field_id, 'field_type', false)." as value");
1604 $this->db->from($this->db->prefix.'wdk_listings_fields');
1605 $this->db->where(array("field_".$search_field_id."_".wdk_field_option($search_field_id, 'field_type', false)." LIKE '%".esc_sql($search_text)."%'" => NULL));
1606
1607 $query = $this->db->get();
1608 if($this->db->num_rows() > 0) foreach($this->db->results() as $row) {
1609 $data['results'][] = $row->value;
1610 }
1611
1612 $field_values = wdk_field_option($search_field_id, 'values', '');
1613 $field_values = explode(',', $field_values);
1614 if(!empty($field_values)) {
1615 foreach($field_values as $value) {
1616 if(empty($value)) continue;
1617 $data['results'][] = $value;
1618 }
1619 }
1620
1621 }
1622
1623 $data['success'] = true;
1624 $this->output($data);
1625
1626 }
1627
1628 function select_2_ajax_field_db_suggestion($output="", $atts=array(), $instance=NULL)
1629 {
1630 global $Winter_MVC_WDK;
1631 $Winter_MVC_WDK->load_helper('listing');
1632 $Winter_MVC_WDK->model('location_m');
1633
1634 $data = array();
1635 $data['message'] = __('No message returned!', 'wpdirectorykit');
1636 $data['pagination'] = true;
1637 $results = array();
1638
1639 $parameters = array();
1640 foreach ($_POST as $key => $value) {
1641 $parameters[$key] = sanitize_text_field($value);
1642 }
1643
1644 $limit = 10;
1645 if(!empty($parameters['limit'])) {
1646 $limit = intval($parameters['limit']);
1647 }
1648
1649 $offset = 0;
1650 if(!empty($parameters['page_result']) && $parameters['page_result'] > 1) {
1651 $offset = (intval($parameters['page_result']) - 1) * $limit;
1652 }
1653
1654 $search_text = '';
1655 if(!empty($_POST['q']['term']))
1656 $search_text = sanitize_text_field($_POST['q']['term']);
1657
1658 $search_field_id = '';
1659 if(!empty($parameters['field_id']))
1660 $search_field_id = (int) trim($parameters['field_id']);
1661
1662 if(!empty($search_field_id) && wdk_field_option($search_field_id, 'field_type', false)) {
1663
1664 /* listings by title suggestion */
1665 $Winter_MVC_WDK->db->select("DISTINCT field_".$search_field_id."_".wdk_field_option($search_field_id, 'field_type', false)." as value");
1666 $Winter_MVC_WDK->db->from($Winter_MVC_WDK->db->prefix.'wdk_listings_fields');
1667 $Winter_MVC_WDK->db->where(array("field_".$search_field_id."_".wdk_field_option($search_field_id, 'field_type', false)." LIKE '%".esc_sql($search_text)."%'" => NULL));
1668
1669 $query = $Winter_MVC_WDK->db->get();
1670 if($Winter_MVC_WDK->db->num_rows() > 0) foreach($Winter_MVC_WDK->db->results() as $row) {
1671
1672 $results[] = [
1673 'id'=> $row->value,
1674 'text'=> $row->value,
1675 ];
1676 }
1677
1678 $field_values = wdk_field_option($search_field_id, 'values', '');
1679 $field_values = explode(',', $field_values);
1680 if(!empty($field_values)) {
1681 foreach($field_values as $value) {
1682 if(empty($value)) continue;
1683
1684 $results[] = [
1685 'id'=> $value,
1686 'text'=> $value,
1687 ];
1688 }
1689 }
1690
1691 }
1692
1693 $data['success'] = true;
1694
1695 $data['results'] = array_slice($results, $offset, $limit);
1696 if(count($results) >= $limit + $offset) {
1697 $data['pagination'] =[
1698 "more"=> true
1699 ];
1700 }
1701
1702 $data['success'] = true;
1703 $this->output($data);
1704 }
1705
1706 private function get_fa_icons() {
1707
1708 /* icons font Awesome 5 */
1709
1710 return array("fab fa-500px","fab fa-accessible-icon","fab fa-accusoft","fas fa-address-book","far fa-address-book","fas fa-address-card","far fa-address-card","fas fa-adjust","fab fa-adn","fab fa-adversal","fab fa-affiliatetheme","fab fa-algolia",
1711 "fas fa-align-center","fas fa-align-justify","fas fa-align-left","fas fa-align-right","fab fa-amazon","fas fa-ambulance","fas fa-american-sign-language-interpreting","fab fa-amilia","fas fa-anchor","fab fa-android","fab fa-angellist",
1712 "fas fa-angle-double-down","fas fa-angle-double-left","fas fa-angle-double-right","fas fa-angle-double-up","fas fa-angle-down","fas fa-angle-left","fas fa-angle-right","fas fa-angle-up","fab fa-angrycreative","fab fa-angular","fab fa-app-store",
1713 "fab fa-app-store-ios","fab fa-apper","fab fa-apple","fab fa-apple-pay","fas fa-archive","fas fa-arrow-alt-circle-down","far fa-arrow-alt-circle-down","fas fa-arrow-alt-circle-left","far fa-arrow-alt-circle-left","fas fa-arrow-alt-circle-right",
1714 "far fa-arrow-alt-circle-right","fas fa-arrow-alt-circle-up","far fa-arrow-alt-circle-up","fas fa-arrow-circle-down","fas fa-arrow-circle-left","fas fa-arrow-circle-right","fas fa-arrow-circle-up","fas fa-arrow-down","fas fa-arrow-left",
1715 "fas fa-arrow-right","fas fa-arrow-up","fas fa-arrows-alt","fas fa-arrows-alt-h","fas fa-arrows-alt-v","fas fa-assistive-listening-systems","fas fa-asterisk","fab fa-asymmetrik","fas fa-at","fab fa-audible","fas fa-audio-description",
1716 "fab fa-autoprefixer","fab fa-avianex","fab fa-aviato","fab fa-aws","fas fa-backward","fas fa-balance-scale","fas fa-ban","fab fa-bandcamp","fas fa-barcode","fas fa-bars","fas fa-bath","fas fa-battery-empty","fas fa-battery-full",
1717 "fas fa-battery-half","fas fa-battery-quarter","fas fa-battery-three-quarters","fas fa-bed","fas fa-beer","fab fa-behance","fab fa-behance-square","fas fa-bell","far fa-bell","fas fa-bell-slash","far fa-bell-slash","fas fa-bicycle","fab fa-bimobject",
1718 "fas fa-binoculars","fas fa-birthday-cake","fab fa-bitbucket","fab fa-bitcoin","fab fa-bity","fab fa-black-tie","fab fa-blackberry","fas fa-blind","fab fa-blogger","fab fa-blogger-b","fab fa-bluetooth","fab fa-bluetooth-b","fas fa-bold","fas fa-bolt",
1719 "fas fa-bomb","fas fa-book","fas fa-bookmark","far fa-bookmark","fas fa-braille","fas fa-briefcase","fab fa-btc","fas fa-bug","fas fa-building","far fa-building","fas fa-bullhorn","fas fa-bullseye","fab fa-buromobelexperte","fas fa-bus","fab fa-buysellads",
1720 "fas fa-calculator","fas fa-calendar","far fa-calendar","fas fa-calendar-alt","far fa-calendar-alt","fas fa-calendar-check","far fa-calendar-check","fas fa-calendar-minus","far fa-calendar-minus","fas fa-calendar-plus","far fa-calendar-plus","fas fa-calendar-times",
1721 "far fa-calendar-times","fas fa-camera","fas fa-camera-retro","fas fa-car","fas fa-caret-down","fas fa-caret-left","fas fa-caret-right","fas fa-caret-square-down","far fa-caret-square-down","fas fa-caret-square-left","far fa-caret-square-left","fas fa-caret-square-right",
1722 "far fa-caret-square-right","fas fa-caret-square-up","far fa-caret-square-up","fas fa-caret-up","fas fa-cart-arrow-down","fas fa-cart-plus","fab fa-cc-amex","fab fa-cc-apple-pay","fab fa-cc-diners-club","fab fa-cc-discover","fab fa-cc-jcb","fab fa-cc-mastercard",
1723 "fab fa-cc-paypal","fab fa-cc-stripe","fab fa-cc-visa","fab fa-centercode","fas fa-certificate","fas fa-chart-area","fas fa-chart-bar","far fa-chart-bar","fas fa-chart-line","fas fa-chart-pie","fas fa-check","fas fa-check-circle","far fa-check-circle",
1724 "fas fa-check-square","far fa-check-square","fas fa-chevron-circle-down","fas fa-chevron-circle-left","fas fa-chevron-circle-right","fas fa-chevron-circle-up","fas fa-chevron-down","fas fa-chevron-left","fas fa-chevron-right","fas fa-chevron-up",
1725 "fas fa-child","fab fa-chrome","fas fa-circle","far fa-circle","fas fa-circle-notch","fas fa-clipboard","far fa-clipboard","fas fa-clock","far fa-clock","fas fa-clone","far fa-clone","fas fa-closed-captioning","far fa-closed-captioning",
1726 "fas fa-cloud","fas fa-cloud-download-alt","fas fa-cloud-upload-alt","fab fa-cloudscale","fab fa-cloudsmith","fab fa-cloudversify","fas fa-code","fas fa-code-branch","fab fa-codepen","fab fa-codiepie","fas fa-coffee","fas fa-cog",
1727 "fas fa-cogs","fas fa-columns","fas fa-comment","far fa-comment","fas fa-comment-alt","far fa-comment-alt","fas fa-comments","far fa-comments","fas fa-compass","far fa-compass","fas fa-compress","fab fa-connectdevelop","fab fa-contao",
1728 "fas fa-copy","far fa-copy","fas fa-copyright","far fa-copyright","fab fa-cpanel","fab fa-creative-commons","fas fa-credit-card","far fa-credit-card","fas fa-crop","fas fa-crosshairs","fab fa-css3","fab fa-css3-alt","fas fa-cube","fas fa-cubes",
1729 "fas fa-cut","fab fa-cuttlefish","fab fa-d-and-d","fab fa-dashcube","fas fa-database","fas fa-deaf","fab fa-delicious","fab fa-deploydog","fab fa-deskpro","fas fa-desktop","fab fa-deviantart","fab fa-digg","fab fa-digital-ocean",
1730 "fab fa-discord","fab fa-discourse","fab fa-dochub","fab fa-docker","fas fa-dollar-sign","fas fa-dot-circle","far fa-dot-circle","fas fa-download","fab fa-draft2digital","fab fa-dribbble","fab fa-dribbble-square","fab fa-dropbox","fab fa-drupal",
1731 "fab fa-dyalog","fab fa-earlybirds","fab fa-edge","fas fa-edit","far fa-edit","fas fa-eject","fas fa-ellipsis-h","fas fa-ellipsis-v","fab fa-ember","fab fa-empire","fas fa-envelope","far fa-envelope","fas fa-envelope-open","far fa-envelope-open",
1732 "fas fa-envelope-square","fab fa-envira","fas fa-eraser","fab fa-erlang","fab fa-etsy","fas fa-euro-sign","fas fa-exchange-alt","fas fa-exclamation","fas fa-exclamation-circle","fas fa-exclamation-triangle","fas fa-expand","fas fa-expand-arrows-alt",
1733 "fab fa-expeditedssl","fas fa-external-link-alt","fas fa-external-link-square-alt","fas fa-eye","fas fa-eye-dropper","fas fa-eye-slash","far fa-eye-slash","fab fa-facebook","fab fa-facebook-f","fab fa-facebook-messenger","fab fa-facebook-square",
1734 "fas fa-fast-backward","fas fa-fast-forward","fas fa-fax","fas fa-female","fas fa-fighter-jet","fas fa-file","far fa-file","fas fa-file-alt","far fa-file-alt","fas fa-file-archive","far fa-file-archive","fas fa-file-audio","far fa-file-audio",
1735 "fas fa-file-code","far fa-file-code","fas fa-file-excel","far fa-file-excel","fas fa-file-image","far fa-file-image","fas fa-file-pdf","far fa-file-pdf","fas fa-file-powerpoint","far fa-file-powerpoint","fas fa-file-video","far fa-file-video",
1736 "fas fa-file-word","far fa-file-word","fas fa-film","fas fa-filter","fas fa-fire","fas fa-fire-extinguisher","fab fa-firefox","fab fa-first-order","fab fa-firstdraft","fas fa-flag","far fa-flag","fas fa-flag-checkered","fas fa-flask","fab fa-flickr",
1737 "fab fa-fly","fas fa-folder","far fa-folder","fas fa-folder-open","far fa-folder-open","fas fa-font","fab fa-font-awesome","fab fa-font-awesome-alt","fab fa-font-awesome-flag","fab fa-fonticons","fab fa-fonticons-fi","fab fa-fort-awesome",
1738 "fab fa-fort-awesome-alt","fab fa-forumbee","fas fa-forward","fab fa-foursquare","fab fa-free-code-camp","fab fa-freebsd","fas fa-frown","far fa-frown","fas fa-futbol","far fa-futbol","fas fa-gamepad","fas fa-gavel","fas fa-gem","far fa-gem",
1739 "fas fa-genderless","fab fa-get-pocket","fab fa-gg","fab fa-gg-circle","fas fa-gift","fab fa-git","fab fa-git-square","fab fa-github","fab fa-github-alt","fab fa-github-square","fab fa-gitkraken","fab fa-gitlab","fab fa-gitter",
1740 "fas fa-glass-martini","fab fa-glide","fab fa-glide-g","fas fa-globe","fab fa-gofore","fab fa-goodreads","fab fa-goodreads-g","fab fa-google","fab fa-google-drive","fab fa-google-play","fab fa-google-plus","fab fa-google-plus-g",
1741 "fab fa-google-plus-square","fab fa-google-wallet","fas fa-graduation-cap","fab fa-gratipay","fab fa-grav","fab fa-gripfire","fab fa-grunt","fab fa-gulp","fas fa-h-square","fab fa-hacker-news","fab fa-hacker-news-square","fas fa-hand-lizard",
1742 "far fa-hand-lizard","fas fa-hand-paper","far fa-hand-paper","fas fa-hand-peace","far fa-hand-peace","fas fa-hand-point-down","far fa-hand-point-down","fas fa-hand-point-left","far fa-hand-point-left","fas fa-hand-point-right","far fa-hand-point-right","fas fa-hand-point-up",
1743 "far fa-hand-point-up","fas fa-hand-pointer","far fa-hand-pointer","fas fa-hand-rock","far fa-hand-rock","fas fa-hand-scissors","far fa-hand-scissors","fas fa-hand-spock","far fa-hand-spock","fas fa-handshake","far fa-handshake","fas fa-hashtag","fas fa-hdd",
1744 "far fa-hdd","fas fa-heading","fas fa-headphones","fas fa-heart","far fa-heart","fas fa-heartbeat","fab fa-hire-a-helper","fas fa-history","fas fa-home","fab fa-hooli","fas fa-hospital","far fa-hospital","fab fa-hotjar","fas fa-hourglass","far fa-hourglass",
1745 "fas fa-hourglass-end","fas fa-hourglass-half","fas fa-hourglass-start","fab fa-houzz","fab fa-html5","fab fa-hubspot","fas fa-i-cursor","fas fa-id-badge","far fa-id-badge","fas fa-id-card","far fa-id-card","fas fa-image","far fa-image","fas fa-images",
1746 "far fa-images","fab fa-imdb","fas fa-inbox","fas fa-indent","fas fa-industry","fas fa-info","fas fa-info-circle","fab fa-instagram","fab fa-internet-explorer","fab fa-ioxhost","fas fa-italic","fab fa-itunes","fab fa-itunes-note","fab fa-jenkins",
1747 "fab fa-joget","fab fa-joomla","fab fa-js","fab fa-js-square","fab fa-jsfiddle","fas fa-key","fas fa-keyboard","far fa-keyboard","fab fa-keycdn","fab fa-kickstarter","fab fa-kickstarter-k","fas fa-language","fas fa-laptop","fab fa-laravel",
1748 "fab fa-lastfm","fab fa-lastfm-square","fas fa-leaf","fab fa-leanpub","fas fa-lemon","far fa-lemon","fab fa-less","fas fa-level-down-alt","fas fa-level-up-alt","fas fa-life-ring","far fa-life-ring","fas fa-lightbulb","far fa-lightbulb",
1749 "fab fa-line","fas fa-link","fab fa-linkedin","fab fa-linkedin-in","fab fa-linode","fab fa-linux","fas fa-lira-sign","fas fa-list","fas fa-list-alt","far fa-list-alt","fas fa-list-ol","fas fa-list-ul","fas fa-location-arrow",
1750 "fas fa-lock","fas fa-lock-open","fas fa-long-arrow-alt-down","fas fa-long-arrow-alt-left","fas fa-long-arrow-alt-right","fas fa-long-arrow-alt-up","fas fa-low-vision","fab fa-lyft","fab fa-magento","fas fa-magic","fas fa-magnet",
1751 "fas fa-male","fas fa-map","far fa-map","fas fa-map-marker","fas fa-map-marker-alt","fas fa-map-pin","fas fa-map-signs","fas fa-mars","fas fa-mars-double","fas fa-mars-stroke","fas fa-mars-stroke-h","fas fa-mars-stroke-v","fab fa-maxcdn",
1752 "fab fa-medapps","fab fa-medium","fab fa-medium-m","fas fa-medkit","fab fa-medrt","fab fa-meetup","fas fa-meh","far fa-meh","fas fa-mercury","fas fa-microchip","fas fa-microphone","fas fa-microphone-slash","fab fa-microsoft","fas fa-minus",
1753 "fas fa-minus-circle","fas fa-minus-square","far fa-minus-square","fab fa-mix","fab fa-mixcloud","fab fa-mizuni","fas fa-mobile","fas fa-mobile-alt","fab fa-modx","fab fa-monero","fas fa-money-bill-alt","far fa-money-bill-alt",
1754 "fas fa-moon","far fa-moon","fas fa-motorcycle","fas fa-mouse-pointer","fas fa-music","fab fa-napster","fas fa-neuter","fas fa-newspaper","far fa-newspaper","fab fa-nintendo-switch","fab fa-node","fab fa-node-js","fab fa-npm","fab fa-ns8",
1755 "fab fa-nutritionix","fas fa-object-group","far fa-object-group","fas fa-object-ungroup","far fa-object-ungroup","fab fa-odnoklassniki","fab fa-odnoklassniki-square","fab fa-opencart","fab fa-openid","fab fa-opera","fab fa-optin-monster","fab fa-osi",
1756 "fas fa-outdent","fab fa-page4","fab fa-pagelines","fas fa-paint-brush","fab fa-palfed","fas fa-paper-plane","far fa-paper-plane","fas fa-paperclip","fas fa-paragraph","fas fa-paste","fab fa-patreon","fas fa-pause","fas fa-pause-circle",
1757 "far fa-pause-circle","fas fa-paw","fab fa-paypal","fas fa-pen-square","fas fa-pencil-alt","fas fa-percent","fab fa-periscope","fab fa-phabricator","fab fa-phoenix-framework","fas fa-phone","fas fa-phone-square","fas fa-phone-volume",
1758 "fab fa-pied-piper","fab fa-pied-piper-alt","fab fa-pied-piper-pp","fab fa-pinterest","fab fa-pinterest-p","fab fa-pinterest-square","fas fa-plane","fas fa-play","fas fa-play-circle","far fa-play-circle","fab fa-playstation","fas fa-plug","fas fa-plus",
1759 "fas fa-plus-circle","fas fa-plus-square","far fa-plus-square","fas fa-podcast","fas fa-pound-sign","fas fa-power-off","fas fa-print","fab fa-product-hunt","fab fa-pushed","fas fa-puzzle-piece","fab fa-python","fab fa-qq","fas fa-qrcode","fas fa-question",
1760 "fas fa-question-circle","far fa-question-circle","fab fa-quora","fas fa-quote-left","fas fa-quote-right","fas fa-random","fab fa-ravelry","fab fa-react","fab fa-rebel","fas fa-recycle","fab fa-red-river","fab fa-reddit","fab fa-reddit-alien",
1761 "fab fa-reddit-square","fas fa-redo","fas fa-redo-alt","fas fa-registered","far fa-registered","fab fa-rendact","fab fa-renren","fas fa-reply","fas fa-reply-all","fab fa-replyd","fab fa-resolving","fas fa-retweet","fas fa-road","fas fa-rocket","fab fa-rocketchat",
1762 "fab fa-rockrms","fas fa-rss","fas fa-rss-square","fas fa-ruble-sign","fas fa-rupee-sign","fab fa-safari","fab fa-sass","fas fa-save","far fa-save","fab fa-schlix","fab fa-scribd","fas fa-search","fas fa-search-minus","fas fa-search-plus",
1763 "fab fa-searchengin","fab fa-sellcast","fab fa-sellsy","fas fa-server","fab fa-servicestack","fas fa-share","fas fa-share-alt","fas fa-share-alt-square","fas fa-share-square","far fa-share-square","fas fa-shekel-sign","fas fa-shield-alt",
1764 "fas fa-ship","fab fa-shirtsinbulk","fas fa-shopping-bag","fas fa-shopping-basket","fas fa-shopping-cart","fas fa-shower","fas fa-sign-in-alt","fas fa-sign-language","fas fa-sign-out-alt","fas fa-signal","fab fa-simplybuilt","fab fa-sistrix",
1765 "fas fa-sitemap","fab fa-skyatlas","fab fa-skype","fab fa-slack","fab fa-slack-hash","fas fa-sliders-h","fab fa-slideshare","fas fa-smile","far fa-smile","fab fa-snapchat","fab fa-snapchat-ghost","fab fa-snapchat-square","fas fa-snowflake",
1766 "far fa-snowflake","fas fa-sort","fas fa-sort-alpha-down","fas fa-sort-alpha-up","fas fa-sort-amount-down","fas fa-sort-amount-up","fas fa-sort-down","fas fa-sort-numeric-down","fas fa-sort-numeric-up","fas fa-sort-up","fab fa-soundcloud",
1767 "fas fa-space-shuttle","fab fa-speakap","fas fa-spinner","fab fa-spotify","fas fa-square","far fa-square","fab fa-stack-exchange","fab fa-stack-overflow","fas fa-star","far fa-star","fas fa-star-half","far fa-star-half","fab fa-staylinked",
1768 "fab fa-steam","fab fa-steam-square","fab fa-steam-symbol","fas fa-step-backward","fas fa-step-forward","fas fa-stethoscope","fab fa-sticker-mule","fas fa-sticky-note","far fa-sticky-note","fas fa-stop","fas fa-stop-circle","far fa-stop-circle",
1769 "fab fa-strava","fas fa-street-view","fas fa-strikethrough","fab fa-stripe","fab fa-stripe-s","fab fa-studiovinari","fab fa-stumbleupon","fab fa-stumbleupon-circle","fas fa-subscript","fas fa-subway","fas fa-suitcase","fas fa-sun","far fa-sun",
1770 "fab fa-superpowers","fas fa-superscript","fab fa-supple","fas fa-sync","fas fa-sync-alt","fas fa-table","fas fa-tablet","fas fa-tablet-alt","fas fa-tachometer-alt","fas fa-tag","fas fa-tags","fas fa-tasks","fas fa-taxi","fab fa-telegram",
1771 "fab fa-telegram-plane","fab fa-tencent-weibo","fas fa-terminal","fas fa-text-height","fas fa-text-width","fas fa-th","fas fa-th-large","fas fa-th-list","fab fa-themeisle","fas fa-thermometer-empty","fas fa-thermometer-full","fas fa-thermometer-half",
1772 "fas fa-thermometer-quarter","fas fa-thermometer-three-quarters","fas fa-thumbs-down","far fa-thumbs-down","fas fa-thumbs-up","far fa-thumbs-up","fas fa-thumbtack","fas fa-ticket-alt","fas fa-times","fas fa-times-circle","far fa-times-circle",
1773 "fas fa-tint","fas fa-toggle-off","fas fa-toggle-on","fas fa-trademark","fas fa-train","fas fa-transgender","fas fa-transgender-alt","fas fa-trash","fas fa-trash-alt","far fa-trash-alt","fas fa-tree","fab fa-trello","fab fa-tripadvisor",
1774 "fas fa-trophy","fas fa-truck","fas fa-tty","fab fa-tumblr","fab fa-tumblr-square","fas fa-tv","fab fa-twitch","fab fa-twitter","fab fa-twitter-square","fab fa-typo3","fab fa-uber","fab fa-uikit","fas fa-umbrella","fas fa-underline",
1775 "fas fa-undo","fas fa-undo-alt","fab fa-uniregistry","fas fa-universal-access","fas fa-university","fas fa-unlink","fas fa-unlock","fas fa-unlock-alt","fab fa-untappd","fas fa-upload","fab fa-usb","fas fa-user","far fa-user",
1776 "fas fa-user-circle","far fa-user-circle","fas fa-user-md","fas fa-user-plus","fas fa-user-secret","fas fa-user-times","fas fa-users","fab fa-ussunnah","fas fa-utensil-spoon","fas fa-utensils","fab fa-vaadin","fas fa-venus",
1777 "fas fa-venus-double","fas fa-venus-mars","fab fa-viacoin","fab fa-viadeo","fab fa-viadeo-square","fab fa-viber","fas fa-video","fab fa-vimeo","fab fa-vimeo-square","fab fa-vimeo-v","fab fa-vine","fab fa-vk","fab fa-vnv",
1778 "fas fa-volume-down","fas fa-volume-off","fas fa-volume-up","fab fa-vuejs","fab fa-weibo","fab fa-weixin","fab fa-whatsapp","fab fa-whatsapp-square","fas fa-wheelchair","fab fa-whmcs","fas fa-wifi","fab fa-wikipedia-w","fas fa-window-close",
1779 "far fa-window-close","fas fa-window-maximize","far fa-window-maximize","fas fa-window-minimize","fas fa-window-restore","far fa-window-restore","fab fa-windows","fas fa-won-sign","fab fa-wordpress","fab fa-wordpress-simple",
1780 "fab fa-wpbeginner","fab fa-wpexplorer","fab fa-wpforms","fas fa-wrench","fab fa-xbox","fab fa-xing","fab fa-xing-square","fab fa-y-combinator","fab fa-yahoo","fab fa-yandex","fab fa-yandex-international","fab fa-yelp","fas fa-yen-sign","fab fa-yoast","fab fa-youtube","fas fa-school");
1781
1782
1783 /* icons font Awesome 4 */
1784 return array("fa fa-500px","fa fa-address-book","fa fa-address-book-o","fa fa-address-card","fa fa-address-card-o","fa fa-adjust","fa fa-adn","fa fa-align-center","fa fa-align-justify","fa fa-align-left","fa fa-align-right",
1785 "fa fa-amazon","fa fa-ambulance","fa fa-american-sign-language-interpreting","fa fa-anchor","fa fa-android","fa fa-angellist","fa fa-angle-double-down","fa fa-angle-double-left","fa fa-angle-double-right","fa fa-angle-double-up",
1786 "fa fa-angle-down","fa fa-angle-left","fa fa-angle-right","fa fa-angle-up","fa fa-apple","fa fa-archive","fa fa-area-chart","fa fa-arrow-circle-down","fa fa-arrow-circle-left","fa fa-arrow-circle-o-down","fa fa-arrow-circle-o-left",
1787 "fa fa-arrow-circle-o-right","fa fa-arrow-circle-o-up","fa fa-arrow-circle-right","fa fa-arrow-circle-up","fa fa-arrow-down","fa fa-arrow-left","fa fa-arrow-right","fa fa-arrow-up","fa fa-arrows","fa fa-arrows-alt","fa fa-arrows-h",
1788 "fa fa-arrows-v","fa fa-assistive-listening-systems","fa fa-asterisk","fa fa-at","fa fa-audio-description","fa fa-backward","fa fa-balance-scale","fa fa-ban","fa fa-bandcamp","fa fa-bar-chart","fa fa-barcode","fa fa-bars","fa fa-bath",
1789 "fa fa-battery-empty","fa fa-battery-full","fa fa-battery-half","fa fa-battery-quarter","fa fa-battery-three-quarters","fa fa-bed","fa fa-beer","fa fa-behance","fa fa-behance-square","fa fa-bell","fa fa-bell-o","fa fa-bell-slash",
1790 "fa fa-bell-slash-o","fa fa-bicycle","fa fa-binoculars","fa fa-birthday-cake","fa fa-bitbucket","fa fa-bitbucket-square","fa fa-black-tie","fa fa-blind","fa fa-bluetooth","fa fa-bluetooth-b","fa fa-bold","fa fa-bolt","fa fa-bomb","fa fa-book",
1791 "fa fa-bookmark","fa fa-bookmark-o","fa fa-braille","fa fa-briefcase","fa fa-btc","fa fa-bug","fa fa-building","fa fa-building-o","fa fa-bullhorn","fa fa-bullseye","fa fa-bus","fa fa-buysellads","fa fa-calculator","fa fa-calendar",
1792 "fa fa-calendar-check-o","fa fa-calendar-minus-o","fa fa-calendar-o","fa fa-calendar-plus-o","fa fa-calendar-times-o","fa fa-camera","fa fa-camera-retro","fa fa-car","fa fa-caret-down","fa fa-caret-left","fa fa-caret-right",
1793 "fa fa-caret-square-o-down","fa fa-caret-square-o-left","fa fa-caret-square-o-right","fa fa-caret-square-o-up","fa fa-caret-up","fa fa-cart-arrow-down","fa fa-cart-plus","fa fa-cc","fa fa-cc-amex","fa fa-cc-diners-club",
1794 "fa fa-cc-discover","fa fa-cc-jcb","fa fa-cc-mastercard","fa fa-cc-paypal","fa fa-cc-stripe","fa fa-cc-visa","fa fa-certificate","fa fa-chain-broken","fa fa-check","fa fa-check-circle","fa fa-check-circle-o","fa fa-check-square",
1795 "fa fa-check-square-o","fa fa-chevron-circle-down","fa fa-chevron-circle-left","fa fa-chevron-circle-right","fa fa-chevron-circle-up","fa fa-chevron-down","fa fa-chevron-left","fa fa-chevron-right","fa fa-chevron-up","fa fa-child",
1796 "fa fa-chrome","fa fa-circle","fa fa-circle-o","fa fa-circle-o-notch","fa fa-circle-thin","fa fa-clipboard","fa fa-clock-o","fa fa-clone","fa fa-cloud","fa fa-cloud-download","fa fa-cloud-upload","fa fa-code","fa fa-code-fork","fa fa-codepen",
1797 "fa fa-codiepie","fa fa-coffee","fa fa-cog","fa fa-cogs","fa fa-columns","fa fa-comment","fa fa-comment-o","fa fa-commenting","fa fa-commenting-o","fa fa-comments","fa fa-comments-o","fa fa-compass","fa fa-compress","fa fa-connectdevelop",
1798 "fa fa-contao","fa fa-copyright","fa fa-creative-commons","fa fa-credit-card","fa fa-credit-card-alt","fa fa-crop","fa fa-crosshairs","fa fa-css3","fa fa-cube","fa fa-cubes","fa fa-cutlery","fa fa-dashcube","fa fa-database","fa fa-deaf",
1799 "fa fa-delicious","fa fa-desktop","fa fa-deviantart","fa fa-diamond","fa fa-digg","fa fa-dot-circle-o","fa fa-download","fa fa-dribbble","fa fa-dropbox","fa fa-drupal","fa fa-edge","fa fa-eercast","fa fa-eject","fa fa-ellipsis-h","fa fa-ellipsis-v",
1800 "fa fa-empire","fa fa-envelope","fa fa-envelope-o","fa fa-envelope-open","fa fa-envelope-open-o","fa fa-envelope-square","fa fa-envira","fa fa-eraser","fa fa-etsy","fa fa-eur","fa fa-exchange","fa fa-exclamation","fa fa-exclamation-circle",
1801 "fa fa-exclamation-triangle","fa fa-expand","fa fa-expeditedssl","fa fa-external-link","fa fa-external-link-square","fa fa-eye","fa fa-eye-slash","fa fa-eyedropper","fa fa-facebook","fa fa-facebook-official","fa fa-facebook-square",
1802 "fa fa-fast-backward","fa fa-fast-forward","fa fa-fax","fa fa-female","fa fa-fighter-jet","fa fa-file","fa fa-file-archive-o","fa fa-file-audio-o","fa fa-file-code-o","fa fa-file-excel-o","fa fa-file-image-o","fa fa-file-o","fa fa-file-pdf-o",
1803 "fa fa-file-powerpoint-o","fa fa-file-text","fa fa-file-text-o","fa fa-file-video-o","fa fa-file-word-o","fa fa-files-o","fa fa-film","fa fa-filter","fa fa-fire","fa fa-fire-extinguisher","fa fa-firefox","fa fa-first-order","fa fa-flag",
1804 "fa fa-flag-checkered","fa fa-flag-o","fa fa-flask","fa fa-flickr","fa fa-floppy-o","fa fa-folder","fa fa-folder-o","fa fa-folder-open","fa fa-folder-open-o","fa fa-font","fa fa-font-awesome","fa fa-fonticons","fa fa-fort-awesome","fa fa-forumbee",
1805 "fa fa-forward","fa fa-foursquare","fa fa-free-code-camp","fa fa-frown-o","fa fa-futbol-o","fa fa-gamepad","fa fa-gavel","fa fa-gbp","fa fa-genderless","fa fa-get-pocket","fa fa-gg","fa fa-gg-circle","fa fa-gift","fa fa-git","fa fa-git-square",
1806 "fa fa-github","fa fa-github-alt","fa fa-github-square","fa fa-gitlab","fa fa-glass","fa fa-glide","fa fa-glide-g","fa fa-globe","fa fa-google","fa fa-google-plus","fa fa-google-plus-official","fa fa-google-plus-square","fa fa-google-wallet",
1807 "fa fa-graduation-cap","fa fa-gratipay","fa fa-grav","fa fa-h-square","fa fa-hacker-news","fa fa-hand-lizard-o","fa fa-hand-o-down","fa fa-hand-o-left","fa fa-hand-o-right","fa fa-hand-o-up","fa fa-hand-paper-o","fa fa-hand-peace-o",
1808 "fa fa-hand-pointer-o","fa fa-hand-rock-o","fa fa-hand-scissors-o","fa fa-hand-spock-o","fa fa-handshake-o","fa fa-hashtag","fa fa-hdd-o","fa fa-header","fa fa-headphones","fa fa-heart","fa fa-heart-o","fa fa-heartbeat","fa fa-history",
1809 "fa fa-home","fa fa-hospital-o","fa fa-hourglass","fa fa-hourglass-end","fa fa-hourglass-half","fa fa-hourglass-o","fa fa-hourglass-start","fa fa-houzz","fa fa-html5","fa fa-i-cursor","fa fa-id-badge","fa fa-id-card","fa fa-id-card-o",
1810 "fa fa-ils","fa fa-imdb","fa fa-inbox","fa fa-indent","fa fa-industry","fa fa-info","fa fa-info-circle","fa fa-inr","fa fa-instagram","fa fa-internet-explorer","fa fa-ioxhost","fa fa-italic","fa fa-joomla","fa fa-jpy","fa fa-jsfiddle","fa fa-key",
1811 "fa fa-keyboard-o","fa fa-krw","fa fa-language","fa fa-laptop","fa fa-lastfm","fa fa-lastfm-square","fa fa-leaf","fa fa-leanpub","fa fa-lemon-o","fa fa-level-down","fa fa-level-up","fa fa-life-ring","fa fa-lightbulb-o","fa fa-line-chart",
1812 "fa fa-link","fa fa-linkedin","fa fa-linkedin-square","fa fa-linode","fa fa-linux","fa fa-list","fa fa-list-alt","fa fa-list-ol","fa fa-list-ul","fa fa-location-arrow","fa fa-lock","fa fa-long-arrow-down","fa fa-long-arrow-left",
1813 "fa fa-long-arrow-right","fa fa-long-arrow-up","fa fa-low-vision","fa fa-magic","fa fa-magnet","fa fa-male","fa fa-map","fa fa-map-marker","fa fa-map-o","fa fa-map-pin","fa fa-map-signs","fa fa-mars","fa fa-mars-double","fa fa-mars-stroke",
1814 "fa fa-mars-stroke-h","fa fa-mars-stroke-v","fa fa-maxcdn","fa fa-meanpath","fa fa-medium","fa fa-medkit","fa fa-meetup","fa fa-meh-o","fa fa-mercury","fa fa-microchip","fa fa-microphone","fa fa-microphone-slash","fa fa-minus",
1815 "fa fa-minus-circle","fa fa-minus-square","fa fa-minus-square-o","fa fa-mixcloud","fa fa-mobile","fa fa-modx","fa fa-money","fa fa-moon-o","fa fa-motorcycle","fa fa-mouse-pointer","fa fa-music","fa fa-neuter","fa fa-newspaper-o",
1816 "fa fa-object-group","fa fa-object-ungroup","fa fa-odnoklassniki","fa fa-odnoklassniki-square","fa fa-opencart","fa fa-openid","fa fa-opera","fa fa-optin-monster","fa fa-outdent","fa fa-pagelines","fa fa-paint-brush","fa fa-paper-plane",
1817 "fa fa-paper-plane-o","fa fa-paperclip","fa fa-paragraph","fa fa-pause","fa fa-pause-circle","fa fa-pause-circle-o","fa fa-paw","fa fa-paypal","fa fa-pencil","fa fa-pencil-square","fa fa-pencil-square-o","fa fa-percent","fa fa-phone",
1818 "fa fa-phone-square","fa fa-picture-o","fa fa-pie-chart","fa fa-pied-piper","fa fa-pied-piper-alt","fa fa-pied-piper-pp","fa fa-pinterest","fa fa-pinterest-p","fa fa-pinterest-square","fa fa-plane","fa fa-play","fa fa-play-circle",
1819 "fa fa-play-circle-o","fa fa-plug","fa fa-plus","fa fa-plus-circle","fa fa-plus-square","fa fa-plus-square-o","fa fa-podcast","fa fa-power-off","fa fa-print","fa fa-product-hunt","fa fa-puzzle-piece","fa fa-qq","fa fa-qrcode","fa fa-question",
1820 "fa fa-question-circle","fa fa-question-circle-o","fa fa-quora","fa fa-quote-left","fa fa-quote-right","fa fa-random","fa fa-ravelry","fa fa-rebel","fa fa-recycle","fa fa-reddit","fa fa-reddit-alien","fa fa-reddit-square","fa fa-refresh",
1821 "fa fa-registered","fa fa-renren","fa fa-repeat","fa fa-reply","fa fa-reply-all","fa fa-retweet","fa fa-road","fa fa-rocket","fa fa-rss","fa fa-rss-square","fa fa-rub","fa fa-safari","fa fa-scissors","fa fa-scribd","fa fa-search","fa fa-search-minus",
1822 "fa fa-search-plus","fa fa-sellsy","fa fa-server","fa fa-share","fa fa-share-alt","fa fa-share-alt-square","fa fa-share-square","fa fa-share-square-o","fa fa-shield","fa fa-ship","fa fa-shirtsinbulk","fa fa-shopping-bag","fa fa-shopping-basket",
1823 "fa fa-shopping-cart","fa fa-shower","fa fa-sign-in","fa fa-sign-language","fa fa-sign-out","fa fa-signal","fa fa-simplybuilt","fa fa-sitemap","fa fa-skyatlas","fa fa-skype","fa fa-slack","fa fa-sliders","fa fa-slideshare","fa fa-smile-o",
1824 "fa fa-snapchat","fa fa-snapchat-ghost","fa fa-snapchat-square","fa fa-snowflake-o","fa fa-sort","fa fa-sort-alpha-asc","fa fa-sort-alpha-desc","fa fa-sort-amount-asc","fa fa-sort-amount-desc","fa fa-sort-asc","fa fa-sort-desc",
1825 "fa fa-sort-numeric-asc","fa fa-sort-numeric-desc","fa fa-soundcloud","fa fa-space-shuttle","fa fa-spinner","fa fa-spoon","fa fa-spotify","fa fa-square","fa fa-square-o","fa fa-stack-exchange","fa fa-stack-overflow","fa fa-star",
1826 "fa fa-star-half","fa fa-star-half-o","fa fa-star-o","fa fa-steam","fa fa-steam-square","fa fa-step-backward","fa fa-step-forward","fa fa-stethoscope","fa fa-sticky-note","fa fa-sticky-note-o","fa fa-stop","fa fa-stop-circle",
1827 "fa fa-stop-circle-o","fa fa-street-view","fa fa-strikethrough","fa fa-stumbleupon","fa fa-stumbleupon-circle","fa fa-subscript","fa fa-subway","fa fa-suitcase","fa fa-sun-o","fa fa-superpowers","fa fa-superscript","fa fa-table",
1828 "fa fa-tablet","fa fa-tachometer","fa fa-tag","fa fa-tags","fa fa-tasks","fa fa-taxi","fa fa-telegram","fa fa-television","fa fa-tencent-weibo","fa fa-terminal","fa fa-text-height","fa fa-text-width","fa fa-th","fa fa-th-large","fa fa-th-list",
1829 "fa fa-themeisle","fa fa-thermometer-empty","fa fa-thermometer-full","fa fa-thermometer-half","fa fa-thermometer-quarter","fa fa-thermometer-three-quarters","fa fa-thumb-tack","fa fa-thumbs-down","fa fa-thumbs-o-down",
1830 "fa fa-thumbs-o-up","fa fa-thumbs-up","fa fa-ticket","fa fa-times","fa fa-times-circle","fa fa-times-circle-o","fa fa-tint","fa fa-toggle-off","fa fa-toggle-on","fa fa-trademark","fa fa-train","fa fa-transgender","fa fa-transgender-alt",
1831 "fa fa-trash","fa fa-trash-o","fa fa-tree","fa fa-trello","fa fa-tripadvisor","fa fa-trophy","fa fa-truck","fa fa-try","fa fa-tty","fa fa-tumblr","fa fa-tumblr-square","fa fa-twitch","fab fa-x-twitter","fab fa-x-twitter-square","fa fa-umbrella",
1832 "fa fa-underline","fa fa-undo","fa fa-universal-access","fa fa-university","fa fa-unlock","fa fa-unlock-alt","fa fa-upload","fa fa-usb","fa fa-usd","fa fa-user","fa fa-user-circle","fa fa-user-circle-o","fa fa-user-md","fa fa-user-o",
1833 "fa fa-user-plus","fa fa-user-secret","fa fa-user-times","fa fa-users","fa fa-venus","fa fa-venus-double","fa fa-venus-mars","fa fa-viacoin","fa fa-viadeo","fa fa-viadeo-square","fa fa-video-camera","fa fa-vimeo","fa fa-vimeo-square","fa fa-vine",
1834 "fa fa-vk","fa fa-volume-control-phone","fa fa-volume-down","fa fa-volume-off","fa fa-volume-up","fa fa-weibo","fa fa-weixin","fa fa-whatsapp","fa fa-wheelchair","fa fa-wheelchair-alt","fa fa-wifi","fa fa-wikipedia-w","fa fa-window-close",
1835 "fa fa-window-close-o","fa fa-window-maximize","fa fa-window-minimize","fa fa-window-restore","fa fa-windows","fa fa-wordpress","fa fa-wpbeginner","fa fa-wpexplorer","fa fa-wpforms","fa fa-wrench","fa fa-xing","fa fa-xing-square",
1836 "fa fa-y-combinator","fa fa-yahoo","fa fa-yelp","fa fa-yoast","fa fa-youtube","fa fa-youtube-play","fa fa-youtube-square","fa-solid fa-school");
1837 }
1838
1839 }
1840
1841