/**
     * output_resumes function.
     *
     * @access public
     * @param mixed $args
     * @return void
     */
    public function output_resumes($atts)
    {
        global $resume_manager;
        ob_start();
        if (!resume_manager_user_can_browse_resumes()) {
            get_job_manager_template_part('access-denied', 'browse-resumes', 'wp-job-manager-resumes', RESUME_MANAGER_PLUGIN_DIR . '/templates/');
            return ob_get_clean();
        }
        extract($atts = shortcode_atts(apply_filters('resume_manager_output_resumes_defaults', array('per_page' => get_option('resume_manager_per_page'), 'order' => 'DESC', 'orderby' => 'featured', 'show_filters' => true, 'show_categories' => get_option('resume_manager_enable_categories'), 'categories' => '', 'featured' => null, 'show_category_multiselect' => get_option('resume_manager_enable_default_category_multiselect', false), 'selected_category' => '', 'show_pagination' => false, 'show_more' => true)), $atts));
        $categories = array_filter(array_map('trim', explode(',', $categories)));
        $keywords = '';
        $location = '';
        // String and bool handling
        $show_filters = $this->string_to_bool($show_filters);
        $show_categories = $this->string_to_bool($show_categories);
        $show_category_multiselect = $this->string_to_bool($show_category_multiselect);
        $show_more = $this->string_to_bool($show_more);
        $show_pagination = $this->string_to_bool($show_pagination);
        if (!is_null($featured)) {
            $featured = is_bool($featured) && $featured || in_array($featured, array('1', 'true', 'yes')) ? true : false;
        }
        if (!empty($_GET['search_keywords'])) {
            $keywords = sanitize_text_field($_GET['search_keywords']);
        }
        if (!empty($_GET['search_location'])) {
            $location = sanitize_text_field($_GET['search_location']);
        }
        if (!empty($_GET['search_category'])) {
            $selected_category = sanitize_text_field($_GET['search_category']);
        }
        if ($show_filters) {
            get_job_manager_template('resume-filters.php', array('per_page' => $per_page, 'orderby' => $orderby, 'order' => $order, 'show_categories' => $show_categories, 'categories' => $categories, 'selected_category' => $selected_category, 'atts' => $atts, 'location' => $location, 'keywords' => $keywords, 'show_category_multiselect' => $show_category_multiselect), 'wp-job-manager-resumes', RESUME_MANAGER_PLUGIN_DIR . '/templates/');
            get_job_manager_template('resumes-start.php', array(), 'wp-job-manager-resumes', RESUME_MANAGER_PLUGIN_DIR . '/templates/');
            get_job_manager_template('resumes-end.php', array(), 'wp-job-manager-resumes', RESUME_MANAGER_PLUGIN_DIR . '/templates/');
            if (!$show_pagination && $show_more) {
                echo '<a class="load_more_resumes" href="#" style="display:none;"><strong>' . __('Load more resumes', 'wp-job-manager-resumes') . '</strong></a>';
            }
        } else {
            $resumes = get_resumes(apply_filters('resume_manager_output_resumes_args', array('search_categories' => $categories, 'orderby' => $orderby, 'order' => $order, 'posts_per_page' => $per_page, 'featured' => $featured)));
            if ($resumes->have_posts()) {
                ?>

				<?php 
                get_job_manager_template('resumes-start.php', array(), 'wp-job-manager-resumes', RESUME_MANAGER_PLUGIN_DIR . '/templates/');
                ?>

				<?php 
                while ($resumes->have_posts()) {
                    $resumes->the_post();
                    ?>
					<?php 
                    get_job_manager_template_part('content', 'resume', 'wp-job-manager-resumes', RESUME_MANAGER_PLUGIN_DIR . '/templates/');
                    ?>
				<?php 
                }
                ?>

				<?php 
                get_job_manager_template('resumes-end.php', array(), 'wp-job-manager-resumes', RESUME_MANAGER_PLUGIN_DIR . '/templates/');
                ?>

				<?php 
                if ($resumes->found_posts > $per_page && $show_more) {
                    ?>

					<?php 
                    wp_enqueue_script('wp-resume-manager-ajax-filters');
                    ?>

					<?php 
                    if ($show_pagination) {
                        ?>
						<?php 
                        echo get_job_listing_pagination($resumes->max_num_pages);
                        ?>
					<?php 
                    } else {
                        ?>
						<a class="load_more_resumes" href="#"><strong><?php 
                        _e('Load more resumes', 'wp-job-manager-resumes');
                        ?>
</strong></a>
					<?php 
                    }
                    ?>

				<?php 
                }
                ?>

			<?php 
            }
            wp_reset_postdata();
        }
        $data_attributes_string = '';
        $data_attributes = array('location' => $location, 'keywords' => $keywords, 'show_filters' => $show_filters ? 'true' : 'false', 'show_pagination' => $show_pagination ? 'true' : 'false', 'per_page' => $per_page, 'orderby' => $orderby, 'order' => $order, 'categories' => implode(',', $categories));
        if (!is_null($featured)) {
            $data_attributes['featured'] = $featured ? 'true' : 'false';
        }
        foreach ($data_attributes as $key => $value) {
            $data_attributes_string .= 'data-' . esc_attr($key) . '="' . esc_attr($value) . '" ';
        }
        return '<div class="resumes" ' . $data_attributes_string . '>' . ob_get_clean() . '</div>';
    }
    /**
     * Get resumes via ajax
     */
    public function get_resumes()
    {
        global $wpdb;
        ob_start();
        $search_location = sanitize_text_field(stripslashes($_POST['search_location']));
        $search_keywords = sanitize_text_field(stripslashes($_POST['search_keywords']));
        $search_categories = isset($_POST['search_categories']) ? $_POST['search_categories'] : '';
        if (is_array($search_categories)) {
            $search_categories = array_map('sanitize_text_field', array_map('stripslashes', $search_categories));
        } else {
            $search_categories = array(sanitize_text_field(stripslashes($search_categories)), 0);
        }
        $search_categories = array_filter($search_categories);
        $args = array('search_location' => $search_location, 'search_keywords' => $search_keywords, 'search_categories' => $search_categories, 'orderby' => sanitize_text_field($_POST['orderby']), 'order' => sanitize_text_field($_POST['order']), 'offset' => (absint($_POST['page']) - 1) * absint($_POST['per_page']), 'posts_per_page' => absint($_POST['per_page']));
        if (isset($_POST['featured']) && ($_POST['featured'] === 'true' || $_POST['featured'] === 'false')) {
            $args['featured'] = $_POST['featured'] === 'true' ? true : false;
        }
        $resumes = get_resumes(apply_filters('resume_manager_get_resumes_args', $args));
        $result = array();
        $result['found_resumes'] = false;
        if ($resumes->have_posts()) {
            $result['found_resumes'] = true;
            ?>

			<?php 
            while ($resumes->have_posts()) {
                $resumes->the_post();
                ?>

				<?php 
                get_job_manager_template_part('content', 'resume', 'wp-job-manager-resumes', RESUME_MANAGER_PLUGIN_DIR . '/templates/');
                ?>

			<?php 
            }
            ?>

		<?php 
        } else {
            ?>

			<li class="no_resumes_found"><?php 
            _e('No resumes found matching your selection.', 'wp-job-manager-resumes');
            ?>
</li>

		<?php 
        }
        $result['html'] = ob_get_clean();
        // Generate 'showing' text
        if ($search_keywords || $search_location || $search_categories || apply_filters('resume_manager_get_resumes_custom_filter', false)) {
            $showing_categories = array();
            if ($search_categories) {
                foreach ($search_categories as $category) {
                    if (!is_numeric($category)) {
                        $category_object = get_term_by('slug', $category, 'resume_category');
                    }
                    if (is_numeric($category) || is_wp_error($category_object) || !$category_object) {
                        $category_object = get_term_by('id', $category, 'resume_category');
                    }
                    if (!is_wp_error($category_object)) {
                        $showing_categories[] = $category_object->name;
                    }
                }
            }
            if ($search_keywords) {
                $showing_resumes = sprintf(__('Showing &ldquo;%s&rdquo; %sresumes', 'wp-job-manager-resumes'), $search_keywords, implode(', ', $showing_categories));
            } else {
                $showing_resumes = sprintf(__('Showing all %sresumes', 'wp-job-manager-resumes'), implode(', ', $showing_categories) . ' ');
            }
            $showing_location = $search_location ? sprintf(' ' . __('located in &ldquo;%s&rdquo;', 'wp-job-manager-resumes'), $search_location) : '';
            $result['showing'] = apply_filters('resume_manager_get_resumes_custom_filter_text', $showing_resumes . $showing_location);
        } else {
            $result['showing'] = '';
        }
        // Generate RSS link
        $result['showing_links'] = resume_manager_get_filtered_links(array('search_location' => $search_location, 'search_categories' => $search_categories, 'search_keywords' => $search_keywords));
        // Generate pagination
        if (isset($_POST['show_pagination']) && $_POST['show_pagination'] === 'true') {
            $result['pagination'] = get_job_listing_pagination($resumes->max_num_pages, absint($_POST['page']));
        }
        $result['max_num_pages'] = $resumes->max_num_pages;
        echo '<!--WPJM-->';
        echo json_encode($result);
        echo '<!--WPJM_END-->';
        die;
    }
    /**
     * widget function.
     *
     * @see WP_Widget
     * @access public
     * @param array $args
     * @param array $instance
     */
    public function widget($args, $instance)
    {
        if (!resume_manager_user_can_browse_resumes()) {
            return;
        }
        if ($this->get_cached_widget($args)) {
            return;
        }
        ob_start();
        extract($args);
        $title = apply_filters('widget_title', $instance['title'], $instance, $this->id_base);
        $number = absint($instance['number']);
        $resumes = get_resumes(array('posts_per_page' => $number, 'orderby' => 'date', 'order' => 'DESC', 'featured' => true));
        if ($resumes->have_posts()) {
            ?>

			<?php 
            echo $before_widget;
            ?>

			<?php 
            if ($title) {
                echo $before_title . $title . $after_title;
            }
            ?>

			<ul class="resumes">

				<?php 
            while ($resumes->have_posts()) {
                $resumes->the_post();
                ?>

					<?php 
                get_job_manager_template_part('content-widget', 'resume', 'wp-job-manager-resumes', RESUME_MANAGER_PLUGIN_DIR . '/templates/');
                ?>

				<?php 
            }
            ?>

			</ul>

			<?php 
            echo $after_widget;
            ?>

		<?php 
        } else {
            ?>

			<?php 
            get_job_manager_template_part('content-widget', 'no-resumes-found', 'wp-job-manager-resumes', RESUME_MANAGER_PLUGIN_DIR . '/templates/');
            ?>

		<?php 
        }
        wp_reset_postdata();
        $content = ob_get_clean();
        echo $content;
        $this->cache_widget($args, $content);
    }