PluginProbe
WP Directory Kit / 1.5.7
WP Directory Kit v1.5.7
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.7, at application/controllers/Wdk_frontendajax.php

1,816 lines 85.5 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
38 /* protect check */
39 if (
40 !wdk_field_value('is_activated', $listing, false) || !wdk_field_value('is_approved', $listing,false)
41 ) {
42 $data['popup_content'] = __( 'Listing is not public', 'wpdirectorykit' );
43 $this->output($data);
44 }
45
46 $popup_layout = 'result_item_card';
47 if(!empty($_POST['custom_layout_id'])) {
48 $popup_layout = (int) sanitize_text_field($_POST['custom_layout_id']);
49 }
50
51 if(!empty($listing)) {
52 $data['popup_content'] = wdk_listing_card($listing, array('infobox' => true), false, '<div class="infobox map-box">%1$s<div>', $popup_layout);
53 } else {
54 $data['popup_content'] = __( 'Listing is missing', 'wpdirectorykit' );
55 }
56
57 $data['success'] = true;
58
59 $this->output($data);
60 }
61
62 public function map_infowindow_dash() {
63 $this->load->load_helper('listing');
64 $this->load->model('listing_m');
65 $this->load->model('listingfield_m');
66
67 $data = array();
68 $data['message'] = '';
69 $listing_post_id = NULL;
70 if(isset($_POST['listing_post_id']))
71 $listing_post_id = sanitize_text_field($_POST['listing_post_id']);
72
73 $listing = $this->load->listing_m->get($listing_post_id, TRUE);
74
75 /* protect check */
76 if (
77 !wdk_field_value('is_activated', $listing, false) || !wdk_field_value('is_approved', $listing,false)
78 ) {
79 $data['popup_content'] = __( 'Listing is not public', 'wpdirectorykit' );
80 $this->output($data);
81 }
82
83 if(!empty($listing)) {
84 $data['popup_content'] = wdk_listing_card($listing, [], false, '<div class="infobox map-box">%1$s<div>', 'result_item_card_dash_edit');
85 } else {
86 $data['popup_content'] = __( 'Listing is missing', 'wpdirectorykit' );
87 }
88
89 $data['success'] = true;
90
91 $this->output($data);
92 }
93
94 public function treefieldid($output="", $atts=array(), $instance=NULL)
95 {
96
97 check_ajax_referer('wdk_secure_treefieldid', 'wdk_secure');
98
99 $this->load->load_helper('listing');
100 $this->load->model('listing_m');
101 $this->load->model('listingfield_m');
102
103 $data = array();
104 $data['message'] = __('No message returned!', 'wpdirectorykit');
105 $results = array();
106
107 $parameters = array();
108
109 foreach ($_POST as $key => $value) {
110 $parameters[$key] = sanitize_text_field($value);
111 }
112
113 $table_name = $table = $parameters['table'];
114
115 if(empty($parameters['empty_value']))
116 $parameters['empty_value'] = ' - ';
117
118 if(empty($parameters['limit']))
119 $parameters['limit'] = 10;
120
121 if(empty($parameters['attribute_id']))
122 $parameters['attribute_id'] = 'id';
123
124 if(empty($parameters['attribute_value']))
125 $parameters['attribute_value'] = 'address';
126
127 if(empty($parameters['offset']))
128 $parameters['offset'] = 0;
129
130 if(empty($parameters['sql_where']))
131 $parameters['sql_where'] = '';
132
133 if(empty($parameters['hide_fields']))
134 $parameters['hide_fields'] = '';
135
136 $start_id = '';
137 if(isset($parameters['start_id']))
138 $start_id = $parameters['start_id'];
139
140 if($parameters['offset'] == 0) // currently don't have load_more functionality'
141
142 if(!empty($parameters['empty_value']))
143 {
144 $results[0]['key'] = '';
145 $results[0]['value'] = sanitize_text_field($parameters['empty_value']);
146 }
147
148 // it's model
149
150 if($table == 'calendar_listing_m')
151 $table = 'listing_m';
152
153 $post_table = $this->db->prefix.'posts';
154
155 $table_name = substr($table,0, -2);
156
157 $attr_id = preg_replace("/[^0-9a-zA-Z_\-]/", "",sanitize_text_field($parameters['attribute_id']));
158 $attr_val = preg_replace("/[^0-9a-zA-Z_\-]/", "",sanitize_text_field($parameters['attribute_value']));
159
160
161 $attr_search = wdk_esc_sql(sanitize_text_field($parameters['search_term'] ?? ''));
162 $skip_id = intval($parameters['skip_id'] ?? 0);
163 $language_id = intval($parameters['language_id'] ?? 0);
164
165 if(empty($language_id))
166 $language_id = NULL;
167
168 $id_part="";
169 if(is_numeric($attr_search))
170 $id_part = "$attr_id=$attr_search OR ";
171
172 if($table == 'icons_list') {
173 $icons = $this->get_fa_icons();
174
175 $tree_results = array();
176
177 if(empty($attr_search)) {
178 $tree_results = $icons;
179 } else {
180 foreach ($icons as $c){
181 if (stripos($c, $attr_search) !== FALSE){
182 //if $c starts with $input, add to matches list
183 $tree_results[] = $c;
184 } else if (strcmp($attr_search, $c) < 0){
185 //$input comes after $c in alpha order
186 //since $colors is sorted, we know that we won't find any more matches
187 continue;
188 }
189 }
190 }
191 $tree_results = array_slice($tree_results,intval($parameters['offset']), intval($parameters['limit']));
192 // limit
193
194 } else {
195 $this->load->model($table);
196
197 $where = array();
198 if(!empty($attr_search)) {
199 $attr_val_sql = $attr_val;
200 if($attr_val == 'location_title') {
201 $this->load->model($table);
202 $attr_val_sql = $this->$table->_table_name.'.location_title';
203 } elseif($attr_val == 'category_title'){
204 $this->load->model($table);
205 $attr_val_sql = $this->$table->_table_name.'.category_title';
206 }
207
208 /* if category/locations search also in translated field */
209 if($attr_val == 'location_title' || $attr_val == 'category_title') {
210 $where["($id_part $attr_val_sql LIKE '%$attr_search%' OR ".$this->$table->_table_name.".titles_for_search LIKE '%$attr_search%')"] = NULL;
211 } else {
212 $where["($id_part $attr_val_sql LIKE '%$attr_search%')"] = NULL;
213 }
214 }
215
216 if(!empty($parameters['sql_where'] )) {
217 $sql_where = '';
218 if($parameters['sql_where'] == 'only_nochilds') {
219 $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` = '') )";
220 } else {
221
222 }
223 if(!empty($sql_where))
224 $where[$sql_where] = NULL;
225 }
226
227 if(!empty($parameters['hide_fields'])) {
228 $parameters['hide_fields'] = preg_replace('/[^0-9,]/', '', $parameters['hide_fields']);
229 if($table == 'location_m') {
230 $sql_where = esc_sql($this->$table->_table_name.'.idlocation').' NOT IN ('.esc_sql(sanitize_text_field($parameters['hide_fields'])).')';
231 foreach (explode(',', $parameters['hide_fields']) as $key => $id) {
232 $sql_where .= ' AND CONCAT(",", '.$this->$table->_table_name.'.parent_path, ",") NOT LIKE CONCAT("%,", '.intval($id).', ",%")';
233 }
234
235 $where[$sql_where] = NULL;
236 }
237
238 if($table == 'category_m') {
239 $sql_where = esc_sql($this->$table->_table_name.'.idcategory').' NOT IN ('.esc_sql(sanitize_text_field($parameters['hide_fields'])).')';
240 foreach (explode(',', $parameters['hide_fields']) as $key => $id) {
241 $sql_where .= ' AND CONCAT(",", '.$this->$table->_table_name.'.parent_path, ",") NOT LIKE CONCAT("%,", '.intval($id).', ",%")';
242 }
243 $where[$sql_where] = NULL;
244 }
245 }
246
247 if(isset($parameters['user_check']) && ($parameters['user_check'] == 'true' || $parameters['user_check'] == '1')) {
248 if($table == 'listing_m') {
249 if($parameters['table'] == 'calendar_listing_m') {
250 global $Winter_MVC_wdk_bookings;
251 $Winter_MVC_wdk_bookings->model('calendar_m');
252 $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');
253 }
254
255 $tree_results = $this->$table->get_pagination(intval($parameters['limit']),intval($parameters['offset']), $where, TRUE, get_current_user_id());
256 } else {
257
258 if(!empty($parameters['filter_ids'])){
259 $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));
260 }
261
262 $tree_results = $this->$table->get_pagination(intval($parameters['limit']),intval($parameters['offset']), $where );
263 }
264 } else {
265 if($parameters['table'] == 'calendar_listing_m') {
266 global $Winter_MVC_wdk_bookings;
267 $Winter_MVC_wdk_bookings->model('calendar_m');
268 $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');
269 }
270
271 if(!empty($parameters['filter_ids'])){
272 $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));
273 }
274
275 if($table == 'user_m') {
276 $like = "(meta_value LIKE '%wdk_%' )";
277 $tree_results = $this->$table->get_pagination(intval($parameters['limit']),intval($parameters['offset']), $where, NULL, $like);
278
279 } else {
280
281 if(method_exists($this->$table, 'get_pagination_simple')) {
282 if($table == 'location_m') {
283 $this->db->select('location_title, idlocation, level');
284 } else if($table == 'category_m') {
285 $this->db->select('category_title, idcategory, level');
286 }
287 $tree_results = $this->$table->get_pagination_simple(intval($parameters['limit']),intval($parameters['offset']), $where);
288 } else {
289 $tree_results = $this->$table->get_pagination(intval($parameters['limit']),intval($parameters['offset']), $where);
290 }
291
292 }
293 }
294
295 }
296
297 $ind_order=1;
298 foreach ($tree_results as $key=>$row)
299 {
300 $level_gen='';
301 if(empty($attr_search) && isset($row->level))
302 $level_gen = str_pad('', $row->level*12, '&nbsp;').'';
303
304 $results[$ind_order]['key'] = wmvc_show_data($attr_id, $row);
305 if($table == 'listing_m') {
306 $results[$ind_order]['value'] = $level_gen
307 .'#'.wmvc_show_data($attr_id, $row).', '.wmvc_show_data($attr_val, $row);
308 } elseif($table == 'user_m') {
309 $results[$ind_order]['value'] = $level_gen
310 .'#'.wmvc_show_data($attr_id, $row).', '.wmvc_show_data('display_name', $row);
311
312 //if(current_user_can('wdk_listings_manage'))
313 // $results[$ind_order]['value'] .= ' ('.wmvc_show_data('user_email', $row).')';
314 } elseif($table == 'icons_list') {
315 $results[$ind_order]['key'] = $row;
316 if(defined('ELEMENTOR_ASSETS_URL')){
317 $results[$ind_order]['value'] = '<i class="'. $row.'"></i>&nbsp;&nbsp;'.$row;
318 } else {
319 $results[$ind_order]['value'] = $row;
320 }
321 } else {
322 $results[$ind_order]['value'] = $level_gen
323 .esc_html__(wmvc_show_data($attr_val, $row), 'wpdirectorykit');
324 }
325 $ind_order++;
326 }
327
328
329 // get current value by ID
330 $row=NULL;
331 if($table == 'icons_list') {
332 if(!empty($parameters['curr_id'])) {
333 $row = '<i class="'. $parameters['curr_id'].'"></i>&nbsp;&nbsp;'.$parameters['curr_id'];
334 }
335 } else {
336 if(!empty($parameters['curr_id']))
337 $row = $this->$table->get(intval($parameters['curr_id']), TRUE);
338 }
339
340 if($table == 'icons_list') {
341 $data['curr_val'] = $row;
342 }elseif(is_object($row))
343 {
344 $level_gen='';
345 if(isset($row->level))
346 $level_gen = str_pad('', $row->level*12, '&nbsp;').'';
347
348 if($table == 'user_m') {
349 $data['curr_val'] = $level_gen
350 .wmvc_show_data('display_name', $row);
351
352 } else {
353 $data['curr_val'] = $level_gen
354 .esc_html__(wmvc_show_data(wmvc_show_data('attribute_value', $parameters), $row), 'wpdirectorykit');
355 }
356
357
358 //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);
359 //elseif(!empty($start_id) && $start_id == $parameters['curr_id']) $this->data['curr_val'] = $parameters['empty_value'];
360 }
361 else
362 {
363 $data['curr_val'] = $parameters['empty_value'];
364 }
365
366 $this->data['success'] = true;
367
368 $data['results'] = $results;
369 $data['sql'] = $this->db->last_query();
370 $this->output($data);
371 }
372
373 public function treefieldid_checkboxes($output="", $atts=array(), $instance=NULL)
374 {
375 check_ajax_referer('wdk_secure_treefieldid_checkboxes', 'wdk_secure');
376
377 $this->load->load_helper('listing');
378 $this->load->model('listing_m');
379 $this->load->model('listingfield_m');
380
381 $data = array();
382 $data['message'] = __('No message returned!', 'wpdirectorykit');
383 $results = array();
384
385 $parameters = array();
386
387 foreach ($_POST as $key => $value) {
388 $parameters[$key] = sanitize_text_field($value);
389 }
390
391 $table_name = $table = $parameters['table'];
392
393 if(empty($parameters['empty_value']))
394 $parameters['empty_value'] = ' - ';
395
396 if(empty($parameters['limit']))
397 $parameters['limit'] = 10;
398
399 if(empty($parameters['attribute_id']))
400 $parameters['attribute_id'] = 'id';
401
402 if(empty($parameters['attribute_value']))
403 $parameters['attribute_value'] = 'address';
404
405 if(empty($parameters['offset']))
406 $parameters['offset'] = 0;
407
408 if(empty($parameters['sql_where']))
409 $parameters['sql_where'] = '';
410
411 if(empty($parameters['hide_fields']))
412 $parameters['hide_fields'] = '';
413
414 $start_id = '';
415 if(isset($parameters['start_id']))
416 $start_id = $parameters['start_id'];
417
418 if($parameters['offset'] == 0) // currently don't have load_more functionality'
419
420 if(!empty($parameters['empty_value']))
421 {
422 $results[0]['key'] = '';
423 $results[0]['value'] = sanitize_text_field($parameters['empty_value']);
424 }
425
426 // it's model
427
428 if($table == 'calendar_listing_m')
429 $table = 'listing_m';
430
431 $table_name = substr($table,0, -2);
432 $attr_id = preg_replace("/[^0-9a-zA-Z_\-]/", "",sanitize_text_field($parameters['attribute_id']));
433 $attr_val = preg_replace("/[^0-9a-zA-Z_\-]/", "",sanitize_text_field($parameters['attribute_value']));
434
435 $attr_search = wdk_esc_sql(sanitize_text_field($parameters['search_term']));
436 $skip_id = intval($parameters['skip_id']);
437 $language_id = intval($parameters['language_id']);
438
439 if(empty($language_id))
440 $language_id = NULL;
441
442 $id_part="";
443 if(is_numeric($attr_search))
444 $id_part = "$attr_id=$attr_search OR ";
445
446 $this->load->model($table);
447
448 $where = array();
449 if(!empty($attr_search))
450 $attr_val_sql = $attr_val;
451 if($attr_val == 'location_title') {
452 $this->load->model($table);
453 $attr_val_sql = $this->$table->_table_name.'.location_title';
454 } elseif($attr_val == 'category_title'){
455 $this->load->model($table);
456 $attr_val_sql = $this->$table->_table_name.'.category_title';
457 }
458
459 /* if category/locations search also in translated field */
460 if($attr_val == 'location_title' || $attr_val == 'category_title') {
461 $where["($id_part $attr_val_sql LIKE '%$attr_search%' OR ".$this->$table->_table_name.".titles_for_search LIKE '%$attr_search%')"] = NULL;
462 } else {
463 $where["($id_part $attr_val_sql LIKE '%$attr_search%')"] = NULL;
464 }
465
466 if(isset($parameters['selected']) && !empty($parameters['selected'])) {
467
468 if(is_string($parameters['selected']) && strpos($parameters['selected'], ',') !== FALSE){
469 $selected = explode(',', $parameters['selected']);
470 } elseif(is_string($parameters['selected'])){
471 $selected = array($parameters['selected']);
472 }
473
474 $ids = array();
475 foreach($selected as $selected_item) {
476 if(!empty($selected_item) && is_intval($selected_item)) {
477 $ids [] = $selected_item;
478 }
479 }
480
481 /* where in */
482 if(!empty($ids)){
483 $this->db->order_by('FIELD('.$this->$table->_table_name.'.'.$this->$table->_primary_key.', '. implode(',', array_reverse($ids)) . ') DESC');
484 if(intval($parameters['limit']) < count($ids)) {
485 $parameters['limit'] = count($ids);
486 }
487 }
488 }
489
490 if(!empty($parameters['filter_ids'])){
491 $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));
492 }
493
494 if(!empty($parameters['hide_fields'])) {
495 $parameters['hide_fields'] = preg_replace('/[^0-9,]/', '', $parameters['hide_fields']);
496 if($table == 'location_m') {
497 $sql_where = esc_sql($this->$table->_table_name.'.idlocation').' NOT IN ('.esc_sql(sanitize_text_field($parameters['hide_fields'])).')';
498 foreach (explode(',', $parameters['hide_fields']) as $key => $id) {
499 $sql_where .= ' AND CONCAT(",", '.$this->$table->_table_name.'.parent_path, ",") NOT LIKE CONCAT("%,", '.intval($id).', ",%")';
500 }
501
502 $where[$sql_where] = NULL;
503 }
504
505 if($table == 'category_m') {
506 $sql_where = esc_sql($this->$table->_table_name.'.idcategory').' NOT IN ('.esc_sql(sanitize_text_field($parameters['hide_fields'])).')';
507 foreach (explode(',', $parameters['hide_fields']) as $key => $id) {
508 $sql_where .= ' AND CONCAT(",", '.$this->$table->_table_name.'.parent_path, ",") NOT LIKE CONCAT("%,", '.intval($id).', ",%")';
509 }
510 $where[$sql_where] = NULL;
511 }
512 }
513
514 $tree_results = $this->$table->get_pagination(intval($parameters['limit']),intval($parameters['offset']), $where);
515
516 $ind_order=1;
517 foreach ($tree_results as $key=>$row)
518 {
519 $level_gen='';
520 if(empty($attr_search) && isset($row->level))
521 $level_gen = str_pad('', $row->level*12, '&nbsp;').'';
522
523 $results[$ind_order]['key'] = wmvc_show_data($attr_id, $row);
524 $results[$ind_order]['value'] = $level_gen
525 .esc_html__(wmvc_show_data($attr_val, $row), 'wpdirectorykit');
526 $ind_order++;
527 }
528
529 // get current value by ID
530 $row=NULL;
531 if(!empty($parameters['curr_id']))
532 $row = $this->$table->get(intval($parameters['curr_id']), TRUE);
533
534 if(is_object($row))
535 {
536 $level_gen='';
537 if(isset($row->level))
538 $level_gen = str_pad('', $row->level*12, '&nbsp;').'';
539
540 $data['curr_val'] = $level_gen
541 .esc_html__(wmvc_show_data(wmvc_show_data('attribute_value', $parameters), $row), 'wpdirectorykit');
542
543 }
544 else
545 {
546 $data['curr_val'] = $parameters['empty_value'];
547 }
548
549 $this->data['success'] = true;
550
551 $data['results'] = $results;
552 //$data['sql'] = $this->db->last_query();
553 $this->output($data);
554 }
555
556 private function output($data, $print = TRUE) {
557 if($print) {
558 header('Pragma: no-cache');
559 header('Cache-Control: no-store, no-cache');
560 header('Content-Type: application/json; charset=utf8');
561 //header('Content-Length: '.$length); // special characters causing troubles
562 echo (wp_json_encode($data));
563 exit();
564 } else {
565 return $data;
566 }
567 }
568
569
570 public function select_2_ajax($output="", $atts=array(), $instance=NULL)
571 {
572
573 check_ajax_referer('wdk_secure_ajax', 'wdk_secure');
574
575 $this->load->load_helper('listing');
576 $this->load->model('listing_m');
577 $this->load->model('listingfield_m');
578
579 $data = array();
580 $data['message'] = __('No message returned!', 'wpdirectorykit');
581 $results = array();
582 $data['pagination'] = true;
583 $parameters = array();
584
585 foreach ($_POST as $key => $value) {
586 $parameters[$key] = sanitize_text_field($value);
587 }
588
589 if(empty($parameters['table'])) return false;
590
591 $model_name = $parameters['table'];
592
593 // allow only 'listing_m', 'category_m', or 'location_m' for security
594 $allowed_models = array('listing_m', 'category_m', 'location_m');
595 if (!in_array($model_name, $allowed_models)) {
596 return false;
597 }
598
599 $key_column = '';
600 $print_column = '';
601
602 $search_column = '';
603 if(empty($parameters['columns_search'])) {
604 switch ($model_name) {
605 case 'category_m':
606 $this->load->model($model_name);
607 $search_column = $this->$model_name->_table_name.'.idcategory,'.$this->$model_name->_table_name.'.category_title, '.$this->$model_name->_table_name.'.titles_for_search';
608 break;
609 case 'location_m':
610 $this->load->model($model_name);
611 $search_column = $this->$model_name->_table_name.'.idlocation,'.$this->$model_name->_table_name.'.location_title, '.$this->$model_name->_table_name.'.titles_for_search';
612 break;
613
614 default:
615 # code...
616 break;
617 }
618
619 } else {
620 $search_column = esc_sql(preg_replace('/[^a-z0-9_,]/i', '', $parameters['columns_search']));
621 }
622
623 if(empty($parameters['key_column'])) {
624 switch ($model_name) {
625 case 'category_m':
626 $key_column = 'idcategory';
627 break;
628 case 'location_m':
629 $key_column = 'idlocation';
630 break;
631
632 default:
633 # code...
634 break;
635 }
636 } else {
637 $key_column = $parameters['key_column'];
638 }
639
640 if(empty($parameters['print_column'])) {
641 switch ($model_name) {
642 case 'category_m':
643 $print_column = 'category_title';
644 break;
645 case 'location_m':
646 $print_column = 'location_title';
647 break;
648
649 default:
650 # code...
651 break;
652 }
653 } else {
654 $print_column = $parameters['print_column'];
655 }
656
657 $limit = 20;
658 if(!empty($parameters['limit'])) {
659 $limit = intval($parameters['limit']);
660 }
661
662 $offset = NULL;
663 if(!empty($parameters['page_result']) && $parameters['page_result'] > 1) {
664 $offset = (intval($parameters['page_result']) - 1) * $limit;
665 }
666
667 $this->load->model($model_name);
668
669 $where = array();
670 if(!empty($_POST['q']['term']) && !empty($search_column)) {
671 $sql_search = '';
672 foreach (explode(',', $search_column) as $column) {
673 if(empty($column)) continue;
674
675 if(!empty($sql_search))
676 $sql_search .= " OR ";
677
678 $sql_search .= " ".esc_sql($column)." LIKE '%".esc_sql($_POST['q']['term'])."%'";
679 }
680
681 $where ["($sql_search)"] = NULL;
682 }
683
684 $db_results_total = $this->$model_name->total($where);
685 $db_results = $this->$model_name->get_pagination($limit,$offset, $where);
686
687 if (!$db_results) {
688 $data['errors'] = '';
689 } else {
690 foreach($db_results as $row) {
691
692 $level_gen='';
693 if(empty($attr_search) && isset($row->level))
694 $level_gen = str_pad('', $row->level*12, '&nbsp;').'';
695
696 $results[] = [
697 'id'=> wmvc_show_data($key_column, $row),
698 'text'=> $level_gen.esc_html__(trim(wmvc_show_data($print_column, $row)), 'wpdirectorykit'),
699 ];
700 }
701
702 }
703
704 $data['success'] = true;
705
706 $data['results'] = $results;
707
708
709 if($db_results_total >= $limit + $offset) {
710 $data['pagination'] =[
711 "more"=> true
712 ];
713 }
714
715 //$data['sql'] = $this->db->last_query();
716 $this->output($data);
717 }
718
719 public function select_2_ajax_user($output="", $atts=array(), $instance=NULL)
720 {
721 $this->load->load_helper('listing');
722
723 $data = array();
724 $data['message'] = __('No message returned!', 'wpdirectorykit');
725 $results = array();
726 $data['pagination'] = true;
727 $parameters = array();
728
729 foreach ($_POST as $key => $value) {
730 $parameters[$key] = sanitize_text_field($value);
731 }
732
733 $model_name = 'user_m';
734
735 $key_column = '';
736 $print_column = '';
737
738 $limit = 20;
739 if(!empty($parameters['limit'])) {
740 $limit = intval($parameters['limit']);
741 }
742
743 $offset = NULL;
744 if(!empty($parameters['page_result']) && $parameters['page_result'] > 1) {
745 $offset = (intval($parameters['page_result']) - 1) * $limit;
746 }
747
748 $this->load->model($model_name);
749 $search_column = 'display_name,user_login,ID';
750 if(current_user_can('administrator')) {
751 $search_column = 'display_name,user_email,user_login,ID';
752 }
753
754 $where = array();
755 if(!empty($_POST['q']['term']) && !empty($search_column)) {
756 $sql_search = '';
757 foreach (explode(',', $search_column) as $column) {
758 if(empty($column)) continue;
759
760 if(!empty($sql_search))
761 $sql_search .= " OR ";
762
763 $sql_search .= " ".esc_sql($column)." LIKE '%".esc_sql($_POST['q']['term'])."%'";
764 }
765
766 $where ["($sql_search)"] = NULL;
767 }
768
769 $like = "(meta_value LIKE '%wdk_%' )";
770 $db_results_total = $this->$model_name->total($where, NULL, $like);
771
772 $db_results = $this->$model_name->get_pagination($limit,$offset, $where, NULL, $like);
773
774 if (!$db_results) {
775 $data['errors'] = '';
776 } else {
777 foreach($db_results as $row) {
778
779 $level_gen='';
780 //if(empty($attr_search) && isset($row->level))
781 // $level_gen = str_pad('', $row->level*12, '&nbsp;').'';
782
783 $results[] = [
784 'id'=> wmvc_show_data('ID', $row),
785 'text'=> $level_gen.trim(wmvc_show_data('display_name', $row)),
786 ];
787 }
788
789 }
790
791 $data['success'] = true;
792
793 $data['results'] = $results;
794 if($db_results_total >= $limit + $offset) {
795 $data['pagination'] =[
796 "more"=> true
797 ];
798 }
799
800 //$data['sql'] = $this->db->last_query();
801 $this->output($data);
802 }
803
804 public function wdk_tree_dropdowns($output="", $atts=array(), $instance=NULL)
805 {
806 $this->load->load_helper('listing');
807
808 $data = array();
809 $data['message'] = __('No message returned!', 'wpdirectorykit');
810 $results = array();
811 $parameters = array();
812
813 foreach ($_POST as $key => $value) {
814 $parameters[$key] = sanitize_text_field($value);
815 }
816
817 if(empty($parameters['table'])) return false;
818
819 switch ($parameters['table']) {
820 case 'category_id':
821 case 'search_category':
822 $model_name = 'category_m';
823 break;
824 case 'location_id':
825 case 'search_location':
826 $model_name = 'location_m';
827 break;
828 default:
829 # code...
830 break;
831 }
832
833 $key_column = '';
834 $print_column = '';
835 $current_id = '0';
836
837 if(!empty($parameters['id'])) {
838 $current_id = intval($parameters['id']);
839 }
840
841 if(empty($parameters['key_column'])) {
842 switch ($model_name) {
843 case 'category_m':
844 $key_column = 'idcategory';
845 break;
846 case 'location_m':
847 $key_column = 'idlocation';
848 break;
849
850 default:
851 # code...
852 break;
853 }
854 } else {
855 $key_column = $parameters['key_column'];
856 }
857
858 if(empty($parameters['print_column'])) {
859 switch ($model_name) {
860 case 'category_m':
861 $print_column = 'category_title';
862 break;
863 case 'location_m':
864 $print_column = 'location_title';
865 break;
866
867 default:
868 # code...
869 break;
870 }
871 } else {
872 $print_column = $parameters['print_column'];
873 }
874
875 $this->load->model($model_name);
876
877 $db_results = $this->$model_name->get_by(array('parent_id = '.$current_id => NULL));
878 $level = 5;
879
880 if(isset($db_results[0]->level)) {
881 $level = $db_results[0]->level;
882 }
883
884 $data['output'] = $db_results;
885
886 if (!$db_results) {
887 $data['errors'] = '';
888 } else {
889
890 if($model_name == 'category_m') {
891 $placeholder_texts = [
892 0 => esc_html__('Select Categories','wpdirectorykit'),
893 1 => esc_html__('Select Sub Categories','wpdirectorykit'),
894 2 => esc_html__('Select Sub Categories','wpdirectorykit'),
895 3 => esc_html__('Select Sub Categories','wpdirectorykit'),
896 4 => esc_html__('Select Sub Categories','wpdirectorykit'),
897 5 => esc_html__('Select Sub Categories','wpdirectorykit'),
898 ];
899 } else {
900 $placeholder_texts = [
901 0 => esc_html__('Select Country','wpdirectorykit'),
902 1 => esc_html__('Select City','wpdirectorykit'),
903 2 => esc_html__('Select Neighborhood','wpdirectorykit'),
904 3 => esc_html__('Select Sub Area','wpdirectorykit'),
905 4 => esc_html__('Select Sub Area','wpdirectorykit'),
906 5 => esc_html__('Select Sub Area','wpdirectorykit'),
907 ];
908 }
909
910 if(isset($placeholder_texts[$level])) {
911 $placeholder = $placeholder_texts[$level];
912 } else {
913 $placeholder = esc_html__('Select Sub Categories','wpdirectorykit');
914 }
915
916 $results[] = [
917 'id'=> '',
918 'text'=> $placeholder
919 ];
920
921 foreach($db_results as $row) {
922 $results[] = [
923 'id'=> wmvc_show_data($key_column, $row),
924 'text'=> esc_html__(trim(wmvc_show_data($print_column, $row)),'wpdirectorykit'),
925 ];
926 }
927
928 }
929
930 $data['success'] = true;
931 $data['results'] = $results;
932
933 //$data['sql'] = $this->db->last_query();
934 $this->output($data);
935 }
936
937
938 public function search_suggestion($output="", $atts=array(), $instance=NULL)
939 {
940 $this->load->load_helper('listing');
941 $this->load->model('category_m');
942 $this->load->model('location_m');
943 $this->load->model('listing_m');
944
945 $data = array();
946 $categories_limit = 5;
947 $categories_search_column = array('idcategory','category_title');
948 $locations_limit = 5;
949 $locations_search_column = array('idlocation','location_title');
950
951 $results = array();
952 /*
953 [
954 'field_key' => 'string',
955 'value' => 'string',
956 'print' => [
957 'html' => 'string',
958 'parsed_html' => [
959 'left_column' => 'string',
960 'middle_column' => 'string',
961 'right_column' => 'string',
962 ],
963 'parsed_content' => [
964 'icon_class' => 'string',
965 'title' => 'string',
966 'sub_title' => 'string',
967 'right_text' => 'string',
968 ]
969 ]
970 ]
971
972 */
973
974 $data['message'] = __('No message returned!', 'wpdirectorykit');
975
976 $parameters = array();
977 foreach ($_POST as $key => $value) {
978 $parameters[$key] = sanitize_text_field($value);
979 }
980
981 $search_text = '';
982 if(!empty($parameters['search']))
983 $search_text = trim($parameters['search']);
984
985 /* Categories */
986 $where = array();
987 if($search_text) {
988 $sql_search = '';
989 foreach ($categories_search_column as $column) {
990 if(!empty($sql_search))
991 $sql_search .= " OR ";
992
993 $sql_search .= " ".$this->category_m->_table_name.'.'.esc_sql($column)." LIKE '%".esc_sql($search_text)."%'";
994 }
995 $where ["($sql_search)"] = NULL;
996 $db_results = $this->category_m->get_pagination($categories_limit, NULL, $where);
997 } else {
998 $db_results = $this->category_m->get_pagination($categories_limit, NULL, array('parent_id = 0' => NULL));
999 }
1000
1001 if($db_results) foreach($db_results as $row) {
1002 $results[] = [
1003 'field_key' => 'search_category',
1004 'value' => $row->category_title,
1005 'print' => [
1006 'parsed_content' => [
1007 'icon_class' => (!empty(wmvc_show_data('font_icon_code', $row, false))) ? wmvc_show_data('font_icon_code', $row) : 'fa fa-tag',
1008 'title' => esc_html__($row->category_title, 'wpdirectorykit'),
1009 'sub_title' => '',
1010 'right_text' => __('Category', 'wpdirectorykit')
1011 ]
1012 ]
1013 ];
1014 }
1015
1016 /* END Categories */
1017
1018 /* Locations */
1019 $where = array();
1020 if($search_text) {
1021 $sql_search = '';
1022 foreach ($locations_search_column as $column) {
1023 if(!empty($sql_search))
1024 $sql_search .= " OR ";
1025
1026 $sql_search .= " ".$this->db->prefix."wdk_locations.".esc_sql($column)." LIKE '%".esc_sql($search_text)."%'";
1027 }
1028 $where ["($sql_search)"] = NULL;
1029
1030 $select = $this->db->prefix.'wdk_locations.idlocation, '.$this->db->prefix.'wdk_locations.location_title';
1031 $select .= ',location_1.location_title AS location_title_1';
1032
1033 $this->db->join($this->db->prefix.'wdk_locations AS location_1 ON '.$this->db->prefix.'wdk_locations.parent_id = location_1.idlocation', NULL, 'LEFT');
1034 for($i = 2 ; $i <= 2; $i++) {
1035 $select .= ',location_'.$i.'.location_title AS location_title_'.$i.'';
1036 $this->db->join($this->db->prefix.'wdk_locations AS location_'.$i.' ON location_'.($i-1).'.parent_id = location_'.$i.'.idlocation', NULL, 'LEFT');
1037 }
1038 $this->db->select($select);
1039 $db_results = $this->location_m->get_pagination($locations_limit, NULL, $where);
1040 } else {
1041 $db_results = $this->location_m->get_pagination($locations_limit, NULL, array('parent_id = 0' => NULL));
1042 }
1043
1044 if($db_results) foreach($db_results as $row) {
1045 $subtitle = '';
1046
1047 for($i = 1 ; $i <= 2; $i++) {
1048 if(wmvc_show_data('location_title_'.$i, $row, false)){
1049 $subtitle .= wmvc_show_data('location_title_'.$i, $row, false).', ';
1050 }
1051 }
1052
1053 $subtitle = substr($subtitle,0,-2);
1054
1055 $results[] = [
1056 'field_key' => 'search_location',
1057 'value' => $row->location_title,
1058 'print' => [
1059 'parsed_content' => [
1060 'icon_class' => (!empty(wmvc_show_data('font_icon_code', $row, false))) ? wmvc_show_data('font_icon_code', $row) : 'fa fa-map-marker',
1061 'title' => esc_html__($row->location_title, 'wpdirectorykit'),
1062 'sub_title' => esc_html__($subtitle, 'wpdirectorykit'),
1063 'right_text' => __('Location', 'wpdirectorykit')
1064 ]
1065 ]
1066 ];
1067 }
1068
1069 /* END Locations */
1070
1071 /* address suggestion if empty other */
1072 $limit = apply_filters('wdk/search_suggestion/address_limit', 5);
1073 if(count($results)<10) {
1074 $this->db->select('address');
1075 $db_results = $this->db->where(array("address LIKE '%".esc_sql($search_text)."%'" => NULL));
1076 $this->db->from($this->listing_m->_table_name);
1077 $this->db->group_by('address');
1078 $this->db->limit($limit);
1079
1080 $query = $this->db->get();
1081 if ($this->db->num_rows() > 0) {
1082 $db_results = $this->db->results();
1083 } else {
1084 $db_results = array();
1085 }
1086
1087 if($db_results) foreach($db_results as $row) {
1088 $results[] = [
1089 'field_key' => 'address',
1090 'value' => $row->address,
1091 'print' => [
1092 'parsed_content' => [
1093 'icon_class' => 'fa fa-map-marker',
1094 'title' => $row->address,
1095 'sub_title' => '',
1096 'right_text' => __('Address', 'wpdirectorykit')
1097 ]
1098 ]
1099 ];
1100 }
1101 }
1102
1103 /* listings by title suggestion */
1104 // Example of how to use add_filter for 'wdk/search_suggestion/listings_limit'
1105 // In your theme's functions.php or a custom plugin, you can add:
1106 // add_filter('wdk/search_suggestion/listings_limit', function($limit) { return 10; });
1107
1108 $limit = apply_filters('wdk/search_suggestion/listings_limit', 5);
1109 $this->db->where(array("post_title LIKE '%".esc_sql($search_text)."%'" => NULL));
1110 $db_results = $this->listing_m->get_pagination($limit, NULL, array('is_activated' => 1,'is_approved'=>1));
1111
1112 if($db_results) foreach($db_results as $row) {
1113 $results[] = [
1114 'field_key' => 'link',
1115 'value' => get_permalink($row),
1116 'print' => [
1117 'parsed_content' => [
1118 'icon_class' => 'fa fa-circle',
1119 'title' => $row->post_title,
1120 'sub_title' => '',
1121 'right_text' => __('Listing', 'wpdirectorykit')
1122 ]
1123 ]
1124 ];
1125 }
1126
1127 if(count($results)<10) {
1128
1129 $name_part = str_replace(' ','+',$search_text);
1130
1131 //$url = 'http://photon.komoot.de/api/?q='.$name_part;
1132 $url = 'https://api.teleport.org/api/cities/?limit=1&search='.$name_part;
1133
1134 $request = wp_remote_get( $url );
1135 $response = '';
1136
1137 // request failed
1138 if ( is_wp_error( $request ) ) {
1139 $response = $request;
1140 }
1141 $code = (int) wp_remote_retrieve_response_code( $request );
1142
1143 // make sure the fetch was successful
1144 if (empty($response) && $code == 200 ) {
1145 $response = wp_remote_retrieve_body( $request );
1146
1147 // Decode the json
1148 $resp = json_decode( $response,true );
1149 if(!empty($resp) && isset($resp['_embedded']) && isset($resp["_embedded"]["city:search-results"]) && !empty($resp["_embedded"]["city:search-results"])) {
1150 foreach($resp["_embedded"]["city:search-results"] as $prediction)
1151 {
1152 if(isset($prediction["matching_full_name"])){
1153 $results[] = [
1154 'field_key' => 'search_location',
1155 'value' => $prediction["matching_full_name"],
1156 'print' => [
1157 'parsed_content' => [
1158 'icon_class' => 'fa fa-map-marker',
1159 'title' => $prediction["matching_full_name"],
1160 'sub_title' => '',
1161 'right_text' => ''
1162 ]
1163 ]
1164 ];
1165
1166 }
1167 break;
1168 }
1169 }
1170 }
1171 }
1172
1173 $data['success'] = true;
1174 $data['results'] = $results;
1175
1176 //$data['sql'] = $this->db->last_query();
1177 $this->output($data);
1178 }
1179
1180 public function booking_price_calculate() {
1181 $data = array();
1182 $data['success'] = false;
1183
1184 $this->load->load_helper('listing');
1185 global $Winter_MVC_wdk_bookings;
1186
1187 $Winter_MVC_wdk_bookings->model('reservation_m');
1188 $Winter_MVC_wdk_bookings->model('calendar_m');
1189
1190 $results = array();
1191 $parameters = array();
1192 foreach ($_POST as $key => $value) {
1193 $parameters[sanitize_text_field($key)] = sanitize_text_field($value);
1194 }
1195
1196 $post_id = NULL;
1197 $date_from = NULL;
1198 $date_to = NULL;
1199
1200 if(isset($parameters['post_id'])) {
1201 $post_id = $parameters['post_id'];
1202 }
1203
1204 $calendar = $Winter_MVC_wdk_bookings->calendar_m->get_by(array('post_id'=>$post_id), TRUE);
1205 $time_format = "00:00:00";
1206 if($calendar && $calendar->is_hour_enabled == 1)
1207 $time_format = "H:i:s";
1208
1209
1210 if(isset($parameters['date_from'])) {
1211 $date_from = wdk_normalize_date_db($parameters['date_from'], 'Y-m-d H:i:s', 'Y-m-d '.$time_format);
1212 }
1213
1214 if(isset($parameters['date_to'])) {
1215 $date_to = wdk_normalize_date_db($parameters['date_to'], 'Y-m-d H:i:s', 'Y-m-d '.$time_format);
1216 }
1217
1218
1219 if($post_id && $date_from && $date_to) {
1220 $price = $Winter_MVC_wdk_bookings->reservation_m->calculate_price($post_id, $date_from, $date_to);
1221
1222
1223 $calendar_fees = array();
1224 if($calendar && !empty($calendar->json_data_fees))
1225 $calendar_fees = json_decode($calendar->json_data_fees );
1226
1227 $results['symbol'] = '';
1228 if(function_exists('wdk_booking_currency_symbol'))
1229 $results['symbol'] = wdk_booking_currency_symbol();
1230
1231 if($price) {
1232 $results['price'] = $price['price'];
1233 $results['total'] = $price['price'];
1234 $results['fees_data'] = array();
1235 $results['fees'] = array();
1236 foreach ($calendar_fees as $key => $fee) {
1237 if(!wmvc_show_data('is_activated', $fee, false,TRUE,TRUE)) continue;
1238 if(is_intval(wmvc_show_data('value', $fee,'',TRUE,TRUE))) {
1239 $field = wdk_generate_slug(strtolower(esc_html(wmvc_show_data('title', $fee,'-',TRUE,TRUE))));
1240 if(!wmvc_show_data('is_required', $fee, false,TRUE,TRUE) && isset($parameters['fee_'.$field]) && $parameters['fee_'.$field] == 0) {
1241 } else {
1242 $price = 0;
1243 if(wmvc_show_data('calculation_base', $fee,'',TRUE,TRUE) == 'per_night') {
1244 $nights = (int)abs(strtotime($date_from) - strtotime($date_to))/(60*60*24);
1245 $price += intval(wmvc_show_data('value', $fee,'',TRUE,TRUE)) * $nights;
1246 } else if(wmvc_show_data('calculation_base', $fee,'',TRUE,TRUE) == 'per_person') {
1247 $price += intval(wmvc_show_data('value', $fee,'',TRUE,TRUE)) * intval(wmvc_show_data('guests', $_POST, 0,TRUE,TRUE));
1248 } else {
1249 $price += intval(wmvc_show_data('value', $fee,'',TRUE,TRUE));
1250 }
1251 $results['fees'][wmvc_show_data('title', $fee,'',TRUE,TRUE)] = $price;
1252 $results['total'] += $price;
1253 }
1254 }
1255
1256 $results['fees_data'][$key] = $fee;
1257 $results['fees_data'][$key]->field_id = wdk_generate_slug(strtolower(esc_html(wmvc_show_data('title', $fee,'-',TRUE,TRUE))));
1258 $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';
1259 }
1260 $data['success'] = true;
1261 } else {
1262 $data['popup_text_error'] = __('Those dates are not available', 'wpdirectorykit');
1263 }
1264 }
1265
1266 $data['results'] = $results;
1267
1268 //$data['sql'] = $this->db->last_query();
1269 $this->output($data);
1270 }
1271
1272 public function loading_listings() {
1273 $this->load->load_helper('listing');
1274 $this->load->load_helper('get_element_settings');
1275 $this->load->model('listing_m');
1276 $this->load->model('listingfield_m');
1277 $this->load->model('category_m');
1278
1279 $data = array();
1280 $data['message'] = '';
1281 $data['popup_text_success'] = '';
1282 $data['popup_text_error'] = '';
1283 $data['output'] = [
1284 'map_results'=>null,
1285 'listings_result'=>null,
1286 'listings_result_message'=>null,
1287 'pagination_html'=>null,
1288 'listings_count'=>null,
1289 'listings_count_html'=>null,
1290 ];
1291 $data['success'] = false;
1292
1293 $parameters = array();
1294 foreach ($_POST as $key => $value) {
1295 $parameters[$key] = sanitize_text_field($value);
1296 }
1297
1298 $options = [
1299 'offset' => 0,
1300 'limit' => 6,
1301 'current_page' => 1,
1302 'limit_pagination' => 5,
1303 'layout_type' => 'grid',
1304 ];
1305
1306 $custom_parameters = array();
1307 $parameters['url'] = strstr($parameters['url'], "#", true);
1308 $parameters['url'] = strstr($parameters['url'], "?");
1309 if(!empty($parameters['url'])) {
1310 $qr_string = trim($parameters['url'],'?');
1311 $string_par = array();
1312 parse_str($qr_string, $string_par);
1313 $custom_parameters += $string_par;
1314 }
1315
1316 $controller = 'listing';
1317 $columns = array('ID', 'location_id', 'category_id', 'post_title', 'post_date', 'search', 'order_by','is_featured', 'address');
1318 $external_columns = array('location_id', 'category_id', 'post_title');
1319
1320 if(isset($parameters['el_results_id'])) {
1321 wdk_prepare_search_query_GET($columns, $controller.'_m', $external_columns, $custom_parameters);
1322 $data['output']['listings_count'] = $this->listing_m->total(array('is_activated' => 1,'is_approved'=>1));
1323 $data['output']['listings_count_html'] = $data['output']['listings_count'].' '.esc_html__('Listings', 'wpdirectorykit');
1324
1325 if(defined( 'WP_DEBUG' ) && WP_DEBUG)
1326 $data['listings_count_sql'] = $this->db->last_query();
1327
1328 if(isset($custom_parameters['wmvc_paged']))
1329 $options['current_page'] = intval(wmvc_xss_clean($custom_parameters['wmvc_paged']));
1330
1331 $get_settings_el_results = new WdkGetElementSettings($parameters['el_results_page_id'],$parameters['el_results_id'],$parameters['el_results_type']);
1332 $settings_el_results = $get_settings_el_results->get_settings();
1333 $settings_el_results = $settings_el_results['settings'] ?? [];
1334
1335 if(wmvc_show_data('per_page', $settings_el_results, false)) {
1336 $options['limit'] = wmvc_show_data('per_page', $settings_el_results, false);
1337 }
1338
1339 if(wmvc_show_data('layout_type', $settings_el_results, false)) {
1340 $options['layout_type'] = wmvc_show_data('layout_type', $settings_el_results, false);
1341 }
1342
1343 $offset = $options['limit']*( $options['current_page']-1);
1344
1345 global $_GET;
1346 $temp_get = $_GET;
1347 $_GET = $custom_parameters;
1348 do_action('wpdirectorykit/ajax/loading_listings');
1349 $REQUEST_URI = $_SERVER["REQUEST_URI"];
1350
1351 $_SERVER["REQUEST_URI"] = $_SERVER['HTTP_REFERER'];
1352
1353 $data['output']['pagination_html'] = wdk_wp_frontend_paginate($data['output']['listings_count'], $options['limit'], 'wmvc_paged', array(), TRUE,
1354 FALSE, FALSE, $options['limit_pagination']);
1355
1356 $_SERVER["REQUEST_URI"] = $REQUEST_URI;
1357 $_GET = $temp_get;
1358
1359 wdk_prepare_search_query_GET($columns, $controller.'_m', $external_columns, $custom_parameters);
1360 $listings_result = $this->listing_m->get_pagination($options['limit'], $offset, array('is_activated' => 1,'is_approved'=>1));
1361
1362 if(defined( 'WP_DEBUG' ) && WP_DEBUG)
1363 $data['listings_result_sql'] = $this->db->last_query();
1364
1365 if(wmvc_show_data('layout_type', $settings_el_results, false)) {
1366 $settings_el_results['content_button_icon'] = $get_settings_el_results->generate_icon(wmvc_show_data('layout_type', $settings_el_results, false));
1367 } else {
1368 $settings_el_results['content_button_icon'] = '';
1369 }
1370
1371 if($listings_result) {
1372 foreach ($listings_result as $key => $listing) {
1373 $listing->card_view = '';
1374
1375 if (
1376 wdk_get_option('wdk_experimental_features') && wdk_get_option('wdk_experimental_listing_card_elementor_layout') &&
1377 wmvc_show_data('is_custom_layout_enable', $settings_el_results) == 'yes'
1378 ) {
1379 if ($options['layout_type'] == 'list' && wmvc_show_data('custom_layout_id_list', $settings_el_results, false)) {
1380 $content = '';
1381 $post_data = get_post(wmvc_show_data('custom_layout_id_list', $settings_el_results, false));
1382
1383 global $wdk_listing_id;
1384 $wdk_listing_id = wmvc_show_data('post_id', $listing);
1385 if ($post_data) {
1386 if ($post_data->post_type == 'page' || $post_data->post_type == 'elementor_library') {
1387 $elementor_instance = \Elementor\Plugin::instance();
1388 $content = $elementor_instance->frontend->get_builder_content_for_display(wmvc_show_data('custom_layout_id_list', $settings_el_results, false));
1389 if (empty($content))
1390 $content = $post_data->post_content;
1391 } else {
1392 $content = $post_data->post_content;
1393 }
1394 }
1395 $listing->card_view = ($content);
1396 } elseif ($options['layout_type'] == 'grid' && wmvc_show_data('custom_layout_id_grid', $settings_el_results, false)) {
1397 $content = '';
1398 $post_data = get_post( wmvc_show_data('custom_layout_id_grid', $settings_el_results, false));
1399
1400 global $wdk_listing_id;
1401 $wdk_listing_id = wmvc_show_data('post_id', $listing);
1402 if ($post_data) {
1403 if ($post_data->post_type == 'page' || $post_data->post_type == 'elementor_library') {
1404 $elementor_instance = \Elementor\Plugin::instance();
1405 $content = $elementor_instance->frontend->get_builder_content_for_display(wmvc_show_data('custom_layout_id_grid', $settings_el_results, false));
1406 if (empty($content))
1407 $content = $post_data->post_content;
1408 } else {
1409 $content = $post_data->post_content;
1410 }
1411 }
1412 $listing->card_view = ($content);
1413 } else {
1414 $listing->card_view = wdk_listing_card($listing, $settings_el_results);
1415 }
1416 } else {
1417 $listing->card_view = wdk_listing_card($listing, $settings_el_results);
1418 }
1419
1420 $data['output']['listings_result'][] = $listing;
1421 }
1422 } else {
1423 $data['output']['listings_result_message'] = '<p class="wdk_alert wdk_alert-danger">'.esc_html__('Results not found', 'wpdirectorykit').'</p>';
1424 }
1425
1426 }
1427
1428 /* map results */
1429 if(isset($parameters['el_map_id'])) {
1430 wdk_prepare_search_query_GET($columns, $controller.'_m', $external_columns, $custom_parameters);
1431 $map_results = $this->listing_m->get_pagination(NULL, NULL, array('is_activated' => 1,'is_approved'=>1));
1432 if(defined( 'WP_DEBUG' ) && WP_DEBUG)
1433 $data['map_results_sql'] = $this->db->last_query();
1434
1435 $get_settings_el_map = new WdkGetElementSettings($parameters['el_map_page_id'],$parameters['el_map_id'],$parameters['el_map_type']);
1436 $settings_el_map = $get_settings_el_map->get_settings();
1437 $settings_el_map = $settings_el_map['settings'];
1438
1439 foreach ($map_results as $key => $listing) {
1440 $listing->inner_marker = '';
1441
1442 $pin_icon = "";
1443 $font_class = "";
1444 $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>';
1445 $pin_icon = (isset( $settings_el_map['conf_custom_map_pin'])) ? esc_url($settings_el_map['conf_custom_map_pin']['url']) : '';
1446
1447 if(wmvc_show_data('conf_hide_real_location', $category) == 'yes') {
1448 $listing->listing_lat = wdk_move_gps($listing->listing_lat);
1449 $listing->listing_lng = wdk_move_gps($listing->listing_lng);
1450 }
1451
1452 if(!empty(wmvc_show_data('category_id', $listing))){
1453 $category = $this->category_m->get_data(wmvc_show_data('category_id', $listing));
1454 if(wmvc_show_data('marker_image_id', $category, false, TRUE, TRUE)){
1455 $pin_icon = wdk_image_src($category, 'full', NULL,'marker_image_id');
1456 } else if(!empty(wmvc_show_data('font_icon_code', $category))) {
1457 $font_class = wmvc_show_data('font_icon_code', $category);
1458 }
1459 } else {
1460 $font_class = "";
1461 }
1462
1463 if($pin_icon){
1464 $listing->inner_marker = '<div class="wdk_marker-container wdk_marker-container-image"><img src='.$pin_icon.'></img></div>';
1465 }elseif($font_icon && empty($font_class)){
1466 $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>';
1467 }else{
1468 $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>';
1469 }
1470
1471 $data['output']['map_results'][] = $listing;
1472 }
1473 }
1474
1475 $data['success'] = true;
1476 $this->output($data);
1477
1478 }
1479
1480
1481 public function suggestion_locations (&$output=NULL, $atts=array())
1482 {
1483
1484 $this->load->load_helper('listing');
1485 $this->load->model('category_m');
1486 $this->load->model('location_m');
1487 $this->load->model('listing_m');
1488
1489 $data = array();
1490 $data['message'] = __('No message returned!', 'wpdirectorykit');
1491
1492 $data['results'] = array();
1493 $parameters = array();
1494 foreach ($_POST as $key => $value) {
1495 $parameters[$key] = sanitize_text_field($value);
1496 }
1497
1498 $search_text = '';
1499 if(!empty($parameters['search']))
1500 $search_text = trim($parameters['search']);
1501
1502 if(!empty($search_text)) {
1503 $this->db->select("location_title as value");
1504 $this->db->from($this->location_m->_table_name);
1505 $this->db->where(array("location_title LIKE '%".esc_sql($search_text)."%'" => NULL));
1506
1507 $query = $this->db->get();
1508 if($this->db->num_rows() > 0) foreach($this->db->results() as $row) {
1509 $data['results'][] = $row->value;
1510 }
1511 }
1512
1513 $data['success'] = true;
1514 $this->output($data);
1515 }
1516
1517 public function suggestion_categories (&$output=NULL, $atts=array())
1518 {
1519
1520 $this->load->load_helper('listing');
1521 $this->load->model('category_m');
1522
1523 $data = array();
1524 $data['message'] = __('No message returned!', 'wpdirectorykit');
1525
1526 $data['results'] = array();
1527 $parameters = array();
1528 foreach ($_POST as $key => $value) {
1529 $parameters[$key] = sanitize_text_field($value);
1530 }
1531
1532 $search_text = '';
1533 if(!empty($parameters['search']))
1534 $search_text = trim($parameters['search']);
1535
1536 if(!empty($search_text)) {
1537 $this->db->select("category_title as value");
1538 $this->db->from($this->category_m->_table_name);
1539 $this->db->where(array("category_title LIKE '%".esc_sql($search_text)."%'" => NULL));
1540
1541 $query = $this->db->get();
1542 if($this->db->num_rows() > 0) foreach($this->db->results() as $row) {
1543 $data['results'][] = $row->value;
1544 }
1545 }
1546
1547 $data['success'] = true;
1548 $this->output($data);
1549 }
1550
1551 public function suggestion_db_field (&$output=NULL, $atts=array())
1552 {
1553 $this->load->load_helper('listing');
1554 $this->load->model('category_m');
1555 $this->load->model('location_m');
1556 $this->load->model('listing_m');
1557
1558 $data = array();
1559 $data['message'] = __('No message returned!', 'wpdirectorykit');
1560
1561 $data['results'] = array();
1562 $parameters = array();
1563 foreach ($_POST as $key => $value) {
1564 $parameters[$key] = sanitize_text_field($value);
1565 }
1566
1567 $search_text = '';
1568 if(!empty($parameters['search']))
1569 $search_text = trim($parameters['search']);
1570
1571 $search_field_id = '';
1572 if(!empty($parameters['field_id']))
1573 $search_field_id = (int) trim($parameters['field_id']);
1574
1575 if(!empty($search_field_id) && wdk_field_option($search_field_id, 'field_type', false)) {
1576
1577 /* listings by title suggestion */
1578 $this->db->select("DISTINCT field_".$search_field_id."_".wdk_field_option($search_field_id, 'field_type', false)." as value");
1579 $this->db->from($this->db->prefix.'wdk_listings_fields');
1580 $this->db->where(array("field_".$search_field_id."_".wdk_field_option($search_field_id, 'field_type', false)." LIKE '%".esc_sql($search_text)."%'" => NULL));
1581
1582 $query = $this->db->get();
1583 if($this->db->num_rows() > 0) foreach($this->db->results() as $row) {
1584 $data['results'][] = $row->value;
1585 }
1586
1587 $field_values = wdk_field_option($search_field_id, 'values', '');
1588 $field_values = explode(',', $field_values);
1589 if(!empty($field_values)) {
1590 foreach($field_values as $value) {
1591 if(empty($value)) continue;
1592 $data['results'][] = $value;
1593 }
1594 }
1595
1596 }
1597
1598 $data['success'] = true;
1599 $this->output($data);
1600
1601 }
1602
1603 function select_2_ajax_field_db_suggestion($output="", $atts=array(), $instance=NULL)
1604 {
1605 global $Winter_MVC_WDK;
1606 $Winter_MVC_WDK->load_helper('listing');
1607 $Winter_MVC_WDK->model('location_m');
1608
1609 $data = array();
1610 $data['message'] = __('No message returned!', 'wpdirectorykit');
1611 $data['pagination'] = true;
1612 $results = array();
1613
1614 $parameters = array();
1615 foreach ($_POST as $key => $value) {
1616 $parameters[$key] = sanitize_text_field($value);
1617 }
1618
1619 $limit = 10;
1620 if(!empty($parameters['limit'])) {
1621 $limit = intval($parameters['limit']);
1622 }
1623
1624 $offset = 0;
1625 if(!empty($parameters['page_result']) && $parameters['page_result'] > 1) {
1626 $offset = (intval($parameters['page_result']) - 1) * $limit;
1627 }
1628
1629 $search_text = '';
1630 if(!empty($_POST['q']['term']))
1631 $search_text = sanitize_text_field($_POST['q']['term']);
1632
1633 $search_field_id = '';
1634 if(!empty($parameters['field_id']))
1635 $search_field_id = (int) trim($parameters['field_id']);
1636
1637 if(!empty($search_field_id) && wdk_field_option($search_field_id, 'field_type', false)) {
1638
1639 /* listings by title suggestion */
1640 $Winter_MVC_WDK->db->select("DISTINCT field_".$search_field_id."_".wdk_field_option($search_field_id, 'field_type', false)." as value");
1641 $Winter_MVC_WDK->db->from($Winter_MVC_WDK->db->prefix.'wdk_listings_fields');
1642 $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));
1643
1644 $query = $Winter_MVC_WDK->db->get();
1645 if($Winter_MVC_WDK->db->num_rows() > 0) foreach($Winter_MVC_WDK->db->results() as $row) {
1646
1647 $results[] = [
1648 'id'=> $row->value,
1649 'text'=> $row->value,
1650 ];
1651 }
1652
1653 $field_values = wdk_field_option($search_field_id, 'values', '');
1654 $field_values = explode(',', $field_values);
1655 if(!empty($field_values)) {
1656 foreach($field_values as $value) {
1657 if(empty($value)) continue;
1658
1659 $results[] = [
1660 'id'=> $value,
1661 'text'=> $value,
1662 ];
1663 }
1664 }
1665
1666 }
1667
1668 $data['success'] = true;
1669
1670 $data['results'] = array_slice($results, $offset, $limit);
1671 if(count($results) >= $limit + $offset) {
1672 $data['pagination'] =[
1673 "more"=> true
1674 ];
1675 }
1676
1677 $data['success'] = true;
1678 $this->output($data);
1679 }
1680
1681 private function get_fa_icons() {
1682
1683 /* icons font Awesome 5 */
1684
1685 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",
1686 "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",
1687 "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",
1688 "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",
1689 "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",
1690 "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",
1691 "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",
1692 "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",
1693 "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",
1694 "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",
1695 "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",
1696 "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",
1697 "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",
1698 "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",
1699 "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",
1700 "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",
1701 "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",
1702 "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",
1703 "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",
1704 "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",
1705 "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",
1706 "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",
1707 "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",
1708 "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",
1709 "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",
1710 "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",
1711 "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",
1712 "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",
1713 "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",
1714 "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",
1715 "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",
1716 "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",
1717 "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",
1718 "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",
1719 "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",
1720 "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",
1721 "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",
1722 "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",
1723 "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",
1724 "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",
1725 "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",
1726 "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",
1727 "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",
1728 "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",
1729 "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",
1730 "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",
1731 "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",
1732 "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",
1733 "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",
1734 "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",
1735 "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",
1736 "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",
1737 "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",
1738 "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",
1739 "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",
1740 "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",
1741 "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",
1742 "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",
1743 "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",
1744 "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",
1745 "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",
1746 "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",
1747 "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",
1748 "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",
1749 "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",
1750 "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",
1751 "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",
1752 "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",
1753 "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",
1754 "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",
1755 "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");
1756
1757
1758 /* icons font Awesome 4 */
1759 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",
1760 "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",
1761 "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",
1762 "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",
1763 "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",
1764 "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",
1765 "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",
1766 "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",
1767 "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",
1768 "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",
1769 "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",
1770 "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",
1771 "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",
1772 "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",
1773 "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",
1774 "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",
1775 "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",
1776 "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",
1777 "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",
1778 "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",
1779 "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",
1780 "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",
1781 "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",
1782 "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",
1783 "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",
1784 "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",
1785 "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",
1786 "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",
1787 "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",
1788 "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",
1789 "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",
1790 "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",
1791 "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",
1792 "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",
1793 "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",
1794 "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",
1795 "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",
1796 "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",
1797 "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",
1798 "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",
1799 "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",
1800 "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",
1801 "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",
1802 "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",
1803 "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",
1804 "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",
1805 "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",
1806 "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",
1807 "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",
1808 "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",
1809 "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",
1810 "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",
1811 "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");
1812 }
1813
1814 }
1815
1816