HEX
Server: nginx/1.27.1
System: Linux in-4 5.15.0-131-generic #141-Ubuntu SMP Fri Jan 10 21:18:28 UTC 2025 x86_64
User: ilikadirect (1186)
PHP: 7.4.33
Disabled: exec,passthru,shell_exec,system,proc_open,popen,parse_ini_file,show_source
Upload Files
File: /storage/v6964/testingff/public_html/fdfctr/wp-content/plugins/listdom/app/includes/form.php
<?php
// no direct access
defined('ABSPATH') or die();

if(!class_exists('LSD_Form')):

/**
 * Listdom Form Class.
 *
 * @class LSD_Form
 * @version	1.0.0
 */
class LSD_Form extends LSD_Base
{
    /**
	 * Constructor method
	 */
	public function __construct()
    {
        parent::__construct();
	}

    public static function label($args = [])
    {
        if(!count($args)) return false;

        $required = (isset($args['required']) and $args['required']);
        return '<label for="'.(isset($args['for']) ? esc_attr($args['for']) : '').'" class="'.(isset($args['class']) ? esc_attr($args['class']) : '').'">'.esc_html($args['title']).($required ? ' '.LSD_Base::REQ_HTML : '').'</label>';
    }

    public static function text($args = [])
    {
        if(!count($args)) return false;
        return self::input($args, 'text');
    }

    public static function number($args = [])
    {
        if(!count($args)) return false;
        return self::input($args, 'number');
    }

    public static function url($args = [])
    {
        if(!count($args)) return false;
        return self::input($args, 'url');
    }

    public static function tel($args = [])
    {
        if(!count($args)) return false;
        return self::input($args, 'tel');
    }

    public static function email($args = [])
    {
        if(!count($args)) return false;
        return self::input($args, 'email');
    }

    public static function datepicker($args = [])
    {
        if(!count($args)) return false;
        return self::input($args, 'date');
    }

    public static function checkbox($args = [])
    {
        if(!count($args)) return false;
        return self::input($args, 'checkbox');
    }

    public static function separator($args = [])
    {
        if(!count($args)) return false;
        return '<div class="lsd-separator">'.(isset($args['label']) ? esc_html($args['label']) : '').'</div>';
    }

    public static function input($args = [], $type = 'text')
    {
        if(!count($args)) return false;

        $attributes = '';
        if(isset($args['attributes']) and is_array($args['attributes']) and count($args['attributes']))
        {
            foreach($args['attributes'] as $key=>$value) $attributes .= $key.'="'.esc_attr($value).'" ';
        }

        $required = (isset($args['required']) and $args['required']);
        return '<input type="'.esc_attr($type).'" name="'.(isset($args['name']) ? esc_attr($args['name']) : '').'" id="'.(isset($args['id']) ? esc_attr($args['id']) : '').'" class="'.(isset($args['class']) ? esc_attr($args['class']) : '').'" value="'.(isset($args['value']) ? esc_attr($args['value']) : '').'" placeholder="'.(isset($args['placeholder']) ? esc_attr($args['placeholder']) : '').'" '.trim($attributes).' '.($required ? 'required' : '').'>';
    }

    public static function select($args = [])
    {
        if(!count($args)) return false;

        $options = '';

        // Show Empty Option
        if(isset($args['show_empty']) and $args['show_empty'])
        {
            $options .= '<option value="" '.((isset($args['value']) and !is_array($args['value']) and $args['value'] == '') ? 'selected="selected"' : '').'>'.((isset($args['empty_label']) and trim($args['empty_label'])) ? esc_html($args['empty_label']) : '-----').'</option>';
        }

        foreach($args['options'] as $value=>$label) $options .= '<option value="'.esc_attr($value).'" '.((isset($args['value']) and ((!is_array($args['value']) and trim($args['value']) != '' and $args['value'] == $value) or (is_array($args['value']) and in_array($value, $args['value'])))) ? 'selected="selected"' : '').'>'.esc_html($label).'</option>';

        $attributes = '';
        if(isset($args['attributes']) and is_array($args['attributes']) and count($args['attributes']))
        {
            foreach($args['attributes'] as $key=>$value) $attributes .= $key.'="'.esc_attr($value).'" ';
        }

        // Required
        $required = (isset($args['required']) and $args['required']) ? true : false;

        return '<select name="'.(isset($args['name']) ? esc_attr($args['name']) : '').'" id="'.(isset($args['id']) ? esc_attr($args['id']) : '').'" class="'.(isset($args['class']) ? esc_attr($args['class']) : '').'" '.trim($attributes).' '.($required ? 'required' : '').'>
            '.$options.'                       
        </select>';
    }

    public static function checkboxes($args = [])
    {
        if(!count($args)) return false;

        $attributes = '';
        if(isset($args['attributes']) and is_array($args['attributes']) and count($args['attributes']))
        {
            foreach($args['attributes'] as $key=>$value) $attributes .= $key.'="'.esc_attr($value).'" ';
        }

        // Required
        $required = (isset($args['required']) and $args['required']) ? true : false;

        $checkboxes = '';
        foreach($args['options'] as $value=>$label) $checkboxes .= '<li><label><input name="'.(isset($args['name']) ? esc_attr($args['name']) : '').'" type="checkbox" value="'.esc_attr($value).'" '.((isset($args['value']) and is_array($args['value']) and in_array($value, $args['value'])) ? 'checked="checked"' : '').' '.trim($attributes).' '.($required ? 'required' : '').'> '.esc_html($label).'</label></li>';

        return '<ul class="'.(isset($args['class']) ? esc_attr($args['class']) : '').'">'.$checkboxes.'</ul>';
    }

    public static function switcher($args = [])
    {
        if(!count($args)) return false;

        $toggle = isset($args['toggle']) ? true : false;
        $toggle2 = isset($args['toggle2']) ? true : false;

        return '<label class="lsd-switch">
            <input type="hidden" name="'.esc_attr($args['name']).'" value="0">
            <input type="checkbox" id="'.esc_attr($args['id']).'" name="'.esc_attr($args['name']).'" value="1" '.((isset($args['value']) and trim($args['value']) != '' and $args['value'] == 1) ? 'checked="checked"' : '').'>
            <span class="lsd-slider '.($toggle ? 'lsd-toggle' : '').'" '.($toggle ? 'data-for="'.esc_attr($args['toggle']).'"' : '').' '.($toggle2 ? 'data-for2="'.esc_attr($args['toggle2']).'"' : '').'></span>
        </label>';
    }

    public static function textarea($args = [])
    {
        if(!count($args)) return false;

        $required = (isset($args['required']) and $args['required']) ? true : false;
        return '<textarea name="'.esc_attr($args['name']).'" id="'.(isset($args['id']) ? esc_attr($args['id']) : '').'" placeholder="'.(isset($args['placeholder']) ? esc_attr($args['placeholder']) : '').'" rows="'.(isset($args['rows']) ? esc_attr($args['rows']) : '').'" '.($required ? 'required' : '').'>'.(isset($args['value']) ? esc_textarea(stripslashes($args['value'])) : '').'</textarea>';
    }

    public static function editor($args = [])
    {
        if(!count($args)) return false;

        $value = (isset($args['value']) ? stripslashes($args['value']) : '');
        $id = (isset($args['id']) ? esc_attr($args['id']) : '');

        $name = (isset($args['name']) ? esc_attr($args['name']) : '');
        $args['textarea_name'] = $name;

        $args['textarea_rows'] = (isset($args['rows']) ? (int) $args['rows'] : 10);

        ob_start();
        wp_editor($value, $id, $args);
        return ob_get_clean();
    }

    public static function iconpicker($args = [])
    {
        if(!count($args)) return false;

        // Include icon picker assets
        $assets = new LSD_Assets();
        $assets->iconpicker();

        $options = '';
        $fonts = LSD_Base::get_font_icons();
        
        foreach($fonts as $font=>$code) $options .= '<option value="'.esc_attr($font).'" '.((isset($args['value']) and $args['value'] == $font) ? 'selected="selected"' : '').'>'.esc_html($font).'</option>';

        return '<select name="'.esc_attr($args['name']).'" id="'.(isset($args['id']) ? esc_attr($args['id']) : '').'" class="'.(isset($args['class']) ? esc_attr($args['class']) : 'lsd-iconpicker').'">
            '.$options.'                       
        </select>';
    }

    public static function colorpalette($args)
    {
        if(!count($args)) return false;
        $palette = LSD_Base::get_colors();

        $output = '<div class="lsd-color-palette" data-for="'.(isset($args['for']) ? esc_attr($args['for']) : '').'">';
        foreach($palette as $color)
        {
            $output .= '<div class="lsd-color-box '.((isset($args['value']) and $args['value'] == $color) ? 'lsd-color-box-active' : '').'" data-color="'.esc_attr($color).'" style="background-color: '.esc_attr($color).'"></div>';
        }

        $output .= '</div>';
        return $output;
    }

    public static function colorpicker($args)
    {
        if(!count($args)) return false;

        return '<input type="text" name="'.esc_attr($args['name']).'" id="'.(isset($args['id']) ? esc_attr($args['id']) : '').'" class="'.(isset($args['class']) ? esc_attr($args['class']) : 'lsd-colorpicker').'" value="'.(isset($args['value']) ? esc_attr($args['value']) : '').'" data-default-color="'.(isset($args['default']) ? esc_attr($args['default']) : '').'" />';
    }

    public static function imagepicker($args)
    {
        if(!count($args)) return false;

        $image_id = isset($args['value']) ? $args['value'] : '';
        $image = $image_id ? wp_get_attachment_image($image_id, array('400', '266')) : '';

        return '<div id="'.esc_attr($args['id']).'_img" class="lsd-imagepicker-image-placeholder lsd-mb-2">'.(trim($image) ? $image : '').'</div>
        <input type="hidden" name="'.esc_attr($args['name']).'" id="'.(isset($args['id']) ? esc_attr($args['id']) : '').'" value="'.esc_attr($image_id).'">
        <button type="button" class="lsd-select-image-button button '.($image_id ? 'lsd-util-hide' : '').'" id="'.esc_attr($args['id']).'_button" data-for="#'.esc_attr($args['id']).'">'.esc_html__('Upload/Select image', 'listdom').'</button>
        <button type="button" class="lsd-remove-image-button button '.($image_id ? '' : 'lsd-util-hide').'" data-for="#'.esc_attr($args['id']).'">'.esc_html__('Remove image', 'listdom').'</button>';
    }

    public static function filepicker($args)
    {
        if(!count($args)) return false;

        $file_id = isset($args['value']) ? $args['value'] : '';
        $url = $file_id ? wp_get_attachment_url($file_id) : '';

        return '<div id="'.esc_attr($args['id']).'_file" class="lsd-filepicker-preview">'.(trim($url) ? '<a href="'.esc_url($url).'" target="_blank">'.$url.'</a>' : '').'</div>
        <input type="hidden" name="'.esc_attr($args['name']).'" id="'.(isset($args['id']) ? esc_attr($args['id']) : '').'" value="'.esc_attr($file_id).'">
        <button type="button" class="lsd-select-file-button button '.($file_id ? 'lsd-util-hide' : '').'" id="'.esc_attr($args['id']).'_button" data-for="#'.esc_attr($args['id']).'">'.esc_html__('Upload/Select file', 'listdom').'</button>
        <button type="button" class="lsd-remove-file-button button '.($file_id ? '' : 'lsd-util-hide').'" data-for="#'.esc_attr($args['id']).'">'.esc_html__('Remove file', 'listdom').'</button>';
    }

    public static function mapstyle($args)
    {
        if(!count($args)) return false;

        $options = '';
        $styles = LSD_Base::get_map_styles();

        foreach($styles as $code=>$label) $options .= '<option value="'.esc_attr($code).'" '.((isset($args['value']) and $args['value'] == $code) ? 'selected="selected"' : '').'>'.esc_html($label).'</option>';

        return '<select name="'.esc_attr($args['name']).'" id="'.(isset($args['id']) ? esc_attr($args['id']) : '').'" class="'.(isset($args['class']) ? esc_attr($args['class']) : 'lsd-mapstyle').'">
            '.$options.'                       
        </select>';
    }

    public static function fontpicker($args)
    {
        if(!count($args)) return false;

        $options = '';
        $fonts = LSD_Base::get_fonts();

        foreach($fonts as $code=>$font) $options .= '<option value="'.esc_attr($code).'" '.((isset($args['value']) and $args['value'] == $code) ? 'selected="selected"' : '').'>'.esc_html($font['label']).'</option>';

        return '<select name="'.esc_attr($args['name']).'" id="'.(isset($args['id']) ? esc_attr($args['id']) : '').'" class="'.(isset($args['class']) ? esc_attr($args['class']) : 'lsd-font-picker').'">
            '.$options.'                       
        </select>';
    }

    public static function shortcodes($args)
    {
        if(!count($args)) return false;

        $options = '';
        $query = array('post_type'=>LSD_Base::PTYPE_SHORTCODE, 'posts_per_page'=>'-1');

        // Show Only Archive Skins
        if(isset($args['only_archive_skins']) and $args['only_archive_skins'])
        {
            $query['meta_query'] = array(
                array(
                    'key'     => 'lsd_skin',
                    'value'   => array('list', 'grid', 'halfmap', 'listgrid', 'masonry', 'singlemap', 'table'),
                    'compare' => 'IN',
                ),
            );
        }

        $shortcodes = get_posts($query);

        // Show Empty Option
        if(isset($args['show_empty']) and $args['show_empty'])
        {
            $options .= '<option value="" '.((isset($args['value']) and esc_attr($args['value']) == '') ? 'selected="selected"' : '').'>'.((isset($args['empty_label']) and trim($args['empty_label'])) ? esc_html($args['empty_label']) : '-----').'</option>';
        }

        foreach($shortcodes as $shortcode) $options .= '<option value="'.esc_attr($shortcode->ID).'" '.((isset($args['value']) and $args['value'] == $shortcode->ID) ? 'selected="selected"' : '').'>'.esc_html($shortcode->post_title).'</option>';

        return '<select name="'.esc_attr($args['name']).'" id="'.(isset($args['id']) ? esc_attr($args['id']) : '').'" class="'.(isset($args['class']) ? esc_attr($args['class']) : 'lsd-shortcode').'">
            '.$options.'                       
        </select>';
    }

    public static function listings($args)
    {
        if(!count($args)) return false;

        $options = '';
        $q = ['post_type' => LSD_Base::PTYPE_LISTING, 'posts_per_page' => '-1'];

        // Only Posts with Featured Image
        if(isset($args['has_post_thumbnail']) and $args['has_post_thumbnail'])
        {
            $q['meta_query'] = [[
                'key' => '_thumbnail_id',
                'compare' => 'EXISTS'
            ]];
        }

        // Get Listings
        $listings = get_posts($q);

        // Show Empty Option
        if(isset($args['show_empty']) and $args['show_empty'])
        {
            $options .= '<option value="" '.((isset($args['value']) and $args['value'] == '') ? 'selected="selected"' : '').'>'.((isset($args['empty_label']) and trim($args['empty_label'])) ? esc_html($args['empty_label']) : '-----').'</option>';
        }

        foreach($listings as $listing) $options .= '<option value="'.esc_attr($listing->ID).'" '.((isset($args['value']) and $args['value'] == $listing->ID) ? 'selected="selected"' : '').'>'.esc_html($listing->post_title).'</option>';

        return '<select name="'.esc_attr($args['name']).'" id="'.(isset($args['id']) ? esc_attr($args['id']) : '').'" class="'.(isset($args['class']) ? esc_attr($args['class']) : 'lsd-listing').'">
            '.$options.'                       
        </select>';
    }

    public static function providers($args = [])
    {
        // Get Available Map Providers
        $args['options'] = LSD_Map_Provider::get_providers();

        // Add Disabled Option
        if(isset($args['disabled']) and $args['disabled'])
        {
            $args['options'] = array('0' => esc_html__('Disabled', 'listdom')) + $args['options'];
        }

        // Dropdown Field
        return self::select($args);
    }

    public static function taxonomy($taxonomy, $args = [])
    {
        // Get Terms
        $terms = get_terms(array(
            'taxonomy' => $taxonomy,
            'orderby' => (isset($args['orderby']) ? $args['orderby'] : 'name'),
            'order' => (isset($args['order']) ? $args['order'] : 'ASC'),
            'hide_empty' => (isset($args['hide_empty']) ? $args['hide_empty'] : false),
        ));

        $options = [];
        foreach($terms as $term) $options[$term->term_id] = $term->name;

        // Options
        $args['options'] = $options;

        // Dropdown Field
        return self::select($args);
    }

    public static function hidden($args = [])
    {
        if(!count($args)) return false;
        return self::input($args, 'hidden');
    }

    public static function pages($args = [])
    {
        if(!count($args)) return false;

        // Get WordPress Pages
        $pages = get_pages();

        $options = [];
        foreach($pages as $page) $options[$page->ID] = $page->post_title;

        $args['options'] = $options;

        // Dropdown Field
        return self::select($args);
    }

    public static function wc($args = [])
    {
        if(!count($args)) return false;

        // Get Products
        $products = wc_get_products(array(
            'posts_per_page' => -1,
            'orderby' => 'title',
            'order' => 'ASC',
        ));

        $options = [];
        foreach($products as $product) $options[$product->get_id()] = $product->get_title();

        $args['options'] = $options;

        $checkbox = (isset($args['checkboxes']) and $args['checkboxes']);

        // Dropdown Field
        return ($checkbox ? self::checkboxes($args) : self::select($args));
    }

    public static function searches($args)
    {
        if(!count($args)) return false;

        $options = '';

        $query = array('post_type'=>LSD_Base::PTYPE_SEARCH, 'posts_per_page'=>'-1');
        $searches = get_posts($query);

        // Show Empty Option
        if(isset($args['show_empty']) and $args['show_empty'])
        {
            $options .= '<option value="" '.((isset($args['value']) and esc_attr($args['value']) == '') ? 'selected="selected"' : '').'>'.((isset($args['empty_label']) and trim($args['empty_label'])) ? esc_html($args['empty_label']) : '-----').'</option>';
        }

        foreach($searches as $search) $options .= '<option value="'.esc_attr($search->ID).'" '.((isset($args['value']) and $args['value'] == $search->ID) ? 'selected="selected"' : '').'>'.esc_html($search->post_title).'</option>';

        return '<select name="'.esc_attr($args['name']).'" id="'.(isset($args['id']) ? esc_attr($args['id']) : '').'" class="'.(isset($args['class']) ? esc_attr($args['class']) : 'lsd-search').'">
            '.$options.'                       
        </select>';
    }

    public static function file($args = [])
    {
        if(!count($args)) return false;
        return LSD_Form::input($args, 'file');
    }

    public static function currency($args)
    {
        if(!count($args)) return false;

        $options = '';
        $currencies = LSD_Base::get_currencies();

        // Show Empty Option
        if(isset($args['show_empty']) and $args['show_empty'])
        {
            $options .= '<option value="" '.((isset($args['value']) and esc_attr($args['value']) == '') ? 'selected="selected"' : '').'>'.((isset($args['empty_label']) and trim($args['empty_label'])) ? esc_html($args['empty_label']) : '-----').'</option>';
        }

        // Database
        $db = new LSD_db();

        $hide_empty = (isset($args['hide_empty']) and $args['hide_empty']);
        foreach($currencies as $symbol=>$currency)
        {
            if($hide_empty and !$db->select("SELECT COUNT(`meta_id`) FROM `#__postmeta` WHERE `meta_key`='lsd_currency' AND `meta_value`='".$currency."'", 'loadResult')) continue;

            $options .= '<option value="'.esc_attr($currency).'" '.((isset($args['value']) and $args['value'] == $currency) ? 'selected="selected"' : '').'>'.esc_html($symbol).'</option>';
        }

        return '<select name="'.esc_attr($args['name']).'" id="'.(isset($args['id']) ? esc_attr($args['id']) : '').'" class="'.(isset($args['class']) ? esc_attr($args['class']) : 'lsd-currency').'">
            '.$options.'                       
        </select>';
    }

    public static function packages($args)
    {
        if(!count($args)) return false;
        if(!class_exists('LSDADDSUB_Base')) return false;

        $options = '';
        $query = array('post_type'=>LSDADDSUB_Base::PTYPE_PACKAGE, 'posts_per_page'=>'-1');
        $packages = get_posts($query);

        // Show Empty Option
        if(isset($args['show_empty']) and $args['show_empty'])
        {
            $options .= '<option value="" '.((isset($args['value']) and esc_attr($args['value']) == '') ? 'selected="selected"' : '').'>'.((isset($args['empty_label']) and trim($args['empty_label'])) ? $args['empty_label'] : '-----').'</option>';
        }

        foreach($packages as $package) $options .= '<option value="'.esc_attr($package->ID).'" '.((isset($args['value']) and $args['value'] == $package->ID) ? 'selected="selected"' : '').'>'.esc_html($package->post_title).'</option>';

        return '<select name="'.esc_attr($args['name']).'" id="'.(isset($args['id']) ? esc_attr($args['id']) : '').'" class="'.(isset($args['class']) ? esc_attr($args['class']) : 'lsd-package').'">
            '.$options.'                       
        </select>';
    }

    public static function users($args)
    {
        if(!count($args)) return false;

        $args['echo'] = 0;

        return wp_dropdown_users($args);
    }

    public static function rate($args)
    {
        if(!count($args)) return false;

        $stars = ((isset($args['stars']) and is_numeric($args['stars'])) ? $args['stars'] : 5);
        $value = ((isset($args['value']) and is_numeric($args['value'])) ? $args['value'] : 1);

        $output = '<div class="lsd-rate">';

        $output .= '<div class="lsd-rate-stars">';
        for($i = 1; $i <= $stars; $i++) $output .= '<a href="#" data-rating-value="'.esc_attr($i).'" data-rating-text="'.esc_attr($i).'" class="'.($value >= $i ? 'lsd-rate-selected' : '').'"><i class="lsd-icon '.($value >= $i ? 'fas fa-star' : 'far fa-star').'"></i></a>';
        $output .= '</div>';

        $output .= '<input type="hidden" name="'.esc_attr($args['name']).'" value="'.esc_attr($value).'" id="'.(isset($args['id']) ? esc_attr($args['id']) : '').'" class="lsd-rate-input '.(isset($args['class']) ? esc_attr($args['class']) : '').'">';
        $output .= '</div>';

        return $output;
    }

    public static function autosuggest($args)
    {
        if(!count($args)) return false;

        $placeholder = (isset($args['placeholder']) and trim($args['placeholder'])) ? $args['placeholder'] : '';
        $description = (isset($args['description']) and trim($args['description'])) ? $args['description'] : '';
        $name = (isset($args['name']) and trim($args['name'])) ? $args['name'] : 'lsd[team]';
        $id = (isset($args['id']) and trim($args['id'])) ? $args['id'] : 'lsd_autosuggest_append';
        $input_id = (isset($args['input_id']) and trim($args['input_id'])) ? $args['input_id'] : '';
        $suggestions = (isset($args['suggestions']) and trim($args['suggestions'])) ? $args['suggestions'] : 'lsd_autosuggest_sugestions';
        $min = (isset($args['min-characters']) and is_numeric($args['min-characters'])) ? (int) $args['min-characters'] : 3;
        $max_items = (isset($args['max_items']) and is_numeric($args['max_items']) and $args['max_items'] > 0) ? (int) $args['max_items'] : null;
        $nonce = wp_create_nonce('lsd_autosuggest');

        $source = (isset($args['source']) and trim($args['source'])) ? $args['source'] : '';
        $values = (isset($args['values']) and is_array($args['values'])) ? $args['values'] : [];

        $current = '';
        foreach($values as $value)
        {
            if($source === 'users')
            {
                $user = get_user_by('id', $value);
                $current .= '<span class="lsd-autosuggest-items-'.$user->ID.'">'.$user->user_email.' <i class="lsd-icon far fa-trash-alt" data-value="'.esc_attr($user->ID).'" data-confirm="0"></i><input type="hidden" name="'.$name.'[]" value="'.$user->ID.'"></span>';
            }
            else
            {
                $post = get_post($value);
                $current .= '<span class="lsd-autosuggest-items-'.$post->ID.'">'.$post->post_title.' <i class="lsd-icon far fa-trash-alt" data-value="'.esc_attr($post->ID).'" data-confirm="0"></i><input type="hidden" name="'.$name.'[]" value="'.$post->ID.'"></span>';
            }
        }

        // Start Wrapper
        $output = '<div class="lsd-autosuggest-wrapper">';

        // Input
        $output .= '<input type="text" id="'.esc_attr($input_id).'" class="lsd-autosuggest" data-source="'.esc_attr($source).'" data-name="'.esc_attr($name).'" data-append="#'.esc_attr($id).'" data-suggestions="#'.esc_attr($suggestions).'" data-min-characters="'.esc_attr($min).'" data-max-items="'.esc_attr($max_items).'" data-nonce="'.esc_attr($nonce).'" placeholder="'.esc_attr($placeholder).'">';

        // Suggestions Placeholder
        $output .= '<div class="lsd-autosuggest-suggestions" id="'.esc_attr($suggestions).'"></div>';

        // Current Items
        $output .= '<div class="lsd-autosuggest-current" id="'.esc_attr($id).'">'.$current.'</div>';

        // Show Help
        if(trim($description)) $output .= '<p class="description">'.esc_html($description).'</p>';

        // Close Wrapper
        $output .= '</div>';

        return $output;
    }

    public static function timepicker($args, $method = null)
    {
        if(!count($args)) return false;

        // Time Picker Method
        if(is_null($method))
        {
            $settings = LSD_Options::settings();
            $method = isset($settings['timepicker_format']) ? (int) $settings['timepicker_format'] : 24;
        }

        // Current Value
        $value = isset($args['value']) ? $args['value'] : [];
        $hour = isset($value['hour']) ? $value['hour'] : 8;
        $minute = isset($value['minute']) ? $value['minute'] : 0;

        $output = '<div class="lsd-row lsd-timepicker">';

        // Hour
        $output .= '<div class="lsd-col-6"><select name="'.esc_attr($args['name']).'[hour]" title="'.esc_attr__('Hour', 'listdom').'">';

        for($h = 0; $h <= 23; $h++)
        {
            $label = sprintf("%02d", $h);
            if($method === 12)
            {
                if($h === 0) $label = sprintf(__('%d AM', 'listdom'), 12);
                elseif($h >= 1 and $h <= 11) $label = sprintf(__('%d AM', 'listdom'), $h);
                elseif($h === 12) $label = sprintf(__('%d PM', 'listdom'), 12);
                elseif($h >= 13 and $h <= 23) $label = sprintf(__('%d PM', 'listdom'), ($h - 12));
            }

            $output .= '<option value="'.esc_attr($h).'" '.($hour == $h ? 'selected="selected"' : '').'>'.$label.'</option>';
        }

        $output .= '</select></div>';

        // Minute
        $output .= '<div class="lsd-col-6"><select name="'.esc_attr($args['name']).'[minute]" title="'.esc_attr__('Minute', 'listdom').'" class="lsd-col-6">';

        for($m = 0; $m <= 11; $m++)
        {
            $label = sprintf("%02d", ($m * 5));
            $output .= '<option value="'.esc_attr(($m * 5)).'" '.($minute == ($m * 5) ? 'selected="selected"' : '').'>'.$label.'</option>';
        }

        $output .= '</select></div>';

        // Close Wrapper
        $output .= '</div>';

        return $output;
    }

    public static function uploader($args)
    {
        if(!count($args)) return false;
        if(!current_user_can('upload_files')) return false;

        $name = isset($args['name']) ? $args['name'] : '';
        if(!trim($name)) return false;

        $value = isset($args['value']) ? trim($args['value'], ', ') : '';
        $values = explode(', ', $value);

        $preview_html = '';
        foreach($values as $attach_id)
        {
            if(!trim($attach_id)) continue;

            $attachment = wp_get_attachment_url($attach_id);
            $preview_html .= '<a href="'.esc_url($attachment).'" target="_blank">'.$attachment.'</a><br>';
        }

        $unique = isset($args['unique']) ? $args['unique'] : LSD_id::code(10);
        $multiple = (isset($args['multiple']) and $args['multiple']) ? true : false;
        $preview = (isset($args['preview']) and $args['preview']) ? true : false;

        return '<div class="lsd-uploader" id="lsd_uploader_'.esc_attr($unique).'_wrapper">
            <div class="lsd-form-row">
                <div class="lsd-col-12">
                    <input type="file" id="lsd_uploader_'.esc_attr($unique).'" '.($multiple ? 'multiple' : '').' data-key="'.esc_attr($unique).'" data-nonce="'.esc_attr(wp_create_nonce('lsd_uploader_'.$unique)).'">
                    <div id="lsd_uploader_'.esc_attr($unique).'_message"></div>
                </div>
            </div>
            <div class="lsd-form-row">
                <div class="lsd-col-12">
                    <input type="hidden" class="lsd-uploader-value" name="'.esc_attr($name).'" value="'.esc_attr($value).'">
                    '.($preview ? '<div class="lsd-uploader-preview">'.(trim($preview_html) ? $preview_html : '').'</div>' : '').'
                </div>
            </div>
        </div>';
    }

    public static function apis($args = [])
    {
        if(!count($args)) return false;

        // Get API Token
        $APIs = LSD_Options::api();

        $options = [];
        foreach($APIs['tokens'] as $token) $options[$token['key']] = $token['name'];

        $args['options'] = $options;

        // Dropdown Field
        return self::select($args);
    }

    public static function franchise($args)
    {
        if(!count($args)) return false;

        return '<select name="'.esc_attr($args['name']).'" id="'.(isset($args['id']) ? esc_attr($args['id']) : '').'" class="'.(isset($args['class']) ? esc_attr($args['class']) : 'lsd-franchise-dropdown').'">
            <option value="0" '.((isset($args['value']) and $args['value'] == '') ? 'selected="selected"' : '').'>'.((isset($args['empty_label']) and trim($args['empty_label'])) ? esc_html($args['empty_label']) : '-----').'</option>
            '.self::franchiseOptions($args, 0).'                    
        </select>';
    }

    protected static function franchiseOptions($args, $parent = 0, $prefix = '')
    {
        $tax_query = [];
        if(isset($args['category']) and trim($args['category']))
        {
            $tax_query[] = array(
                'taxonomy' => LSD_Base::TAX_CATEGORY,
                'terms' => (int) $args['category'],
            );
        }

        // Get Listings
        $listings = get_posts([
            'post_type' => LSD_Base::PTYPE_LISTING,
            'posts_per_page' => -1,
            'exclude' => (isset($args['exclude']) ? $args['exclude'] : []),
            'meta_query' => [[
                'key' => 'lsd_parent',
                'value' => $parent
            ]],
            'tax_query' => $tax_query
        ]);

        $options = '';
        foreach($listings as $listing)
        {
            $options .= '<option value="'.esc_attr($listing->ID).'" '.((isset($args['value']) and $args['value'] == $listing->ID) ? 'selected="selected"' : '').'>'.esc_html((trim($prefix) ? $prefix.' ' : '')).esc_html($listing->post_title).'</option>';

            // Children
            if((new LSD_Entity_Listing($listing))->has_child()) $options .= self::franchiseOptions($args, $listing->ID, $prefix.'-');
        }

        return $options;
    }

    public static function submit($args = [])
    {
        return '<button type="submit" id="'.(isset($args['id']) ? esc_attr($args['id']) : '').'" class="'.(isset($args['class']) ? esc_attr($args['class']) : 'button button-primary').'">'.esc_html($args['label']).'</button>';
    }

    public static function nonce($action, $name = '_wpnonce')
    {
        wp_nonce_field($action, $name);
    }
}

endif;