<?php

class userpro_api
{

    var $twitter;
    var $twitter_url;
    var $google, $googleplus, $googleoauth2, $_google_user_cache;
    var $upload_base_dir, $upload_base_url;

    public $temp_id;

    public $badges_url;

    public $fields;

    public $groups;

    public $get_cached_results;

    public $upload_dir;

    public $upload_path_wp;

    public $upload_path;


    public function __construct()
    {

        $this->temp_id = null;

        $this->badges_url = userpro_url . 'img/badges/';

        $this->fields = get_option('userpro_fields');
        $this->groups = get_option('userpro_fields_groups');
        $this->get_cached_results = (array)get_option('userpro_cached_results');

        add_action('init', [&$this, 'setUploadDirectory'], 8);

        add_action('init', [&$this, 'trial_version'], 9);

        add_action('init', [&$this, 'process_email_approve'], 9);

        add_action('init', [&$this, 'process_verification_invites'], 9);

        add_action('wp', [&$this, 'update_online_users'], 9);

        add_filter('user_row_actions', [&$this, 'userpro_view_link'], 10, 2);

        /* Export settings */
        add_action('template_redirect', [&$this, 'admin_redirect_download_files']);
        add_filter('init', [&$this, 'add_query_var_vars']);

        add_filter('get_avatar', [&$this, 'avatarFix'], 999, 5);
    }

    public function avatarFix($avatar, $id_or_email, $size, $default, $alt)
    {
        if (strpos($avatar, 'wp-content') === false) {
            $avatar = str_replace('uploads', 'wp-content/uploads', $avatar);
        }

        return $avatar;
    }

    /**
     * @param $actions
     * @param $user_object
     * @since 4.9.26
     * @return mixed
     * Add view profile button in admin dashboard.
     */
    public function userpro_view_link($actions, $user_object)
    {
        global $userpro;
        $actions['view_userpro_profile'] = "<a href='" . get_site_url() . '/' . userpro_get_option('slug') . '/' . $this->id_to_member($user_object->ID) . "'>" . __('View user profile',
                'userpro') . "</a>";

        return $actions;
    }

    public function setUploadDirectory()
    {

        $this->upload_dir = wp_upload_dir();

        $this->upload_base_dir = $this->upload_dir['basedir'];
        if (strstr($this->upload_base_dir, 'wp-content/uploads/sites')) {
            $this->upload_base_dir = $this->str_before($this->upload_base_dir, '/wp-content/uploads/sites');
            $this->upload_base_dir = $this->upload_base_dir . '/wp-content/uploads/userpro/';
        } else {
            $this->upload_base_dir = $this->upload_base_dir . '/userpro/';
        }

        $this->upload_base_url = $this->upload_dir['baseurl'];
        if (strstr($this->upload_base_url, 'wp-content/uploads/sites')) {
            $this->upload_base_url = $this->str_before($this->upload_base_url, '/wp-content/uploads/sites');
            $this->upload_base_url = $this->upload_base_url . '/wp-content/uploads/userpro/';
        } else {
            $this->upload_base_url = $this->upload_base_url . '/userpro/';
        }

        $this->upload_path_wp = trailingslashit($this->upload_dir['path']);
        $this->upload_path = $this->upload_dir['basedir'] . '/userpro/';
    }

    /******************************************
     * Delete a File Permanently
     ******************************************/
    function delete_file($user_id, $key)
    {

        if (userpro_profile_data($key, $user_id)) {
            $file = $this->get_uploads_dir($user_id) . basename(userpro_profile_data($key, $user_id));
            if (file_exists($file)) {
                unlink($file);
            }
        }
    }

    /******************************************
     * Parse a single memberlist table column
     ******************************************/
    function parse_column($col, $user_id, $user, $args)
    {

        global $userpro_msg;
        $output = null;

        $show_on_mobile = [''];
        if (isset($args['show_on_mobile'])) {
            $show_on_mobile = explode(',', $args['show_on_mobile']);
        }

        switch ($col) {
            case 'user_id':
                if (in_array($col, $show_on_mobile)) {
                    $mobile = 'show-on-mobile';
                } else {
                    $mobile = 'hide-on-mobile';
                }
                $output .= '<td class="small ' . $col . ' ' . $mobile . '">' . $user_id . '</td>';
                break;
            case 'picture':
                if (in_array($col, $show_on_mobile)) {
                    $mobile = 'show-on-mobile';
                } else {
                    $mobile = 'hide-on-mobile';
                }
                $output .= '<td class="thumb ' . $col . ' ' . $mobile . '"><div class="userpro-table-img"><a href="' . $this->permalink($user_id) . '">' . get_avatar($user_id,
                        36) . '</a></div></td>';
                break;
            case 'name' :
                if (in_array($col, $show_on_mobile)) {
                    $mobile = 'show-on-mobile';
                } else {
                    $mobile = 'hide-on-mobile';
                }
                $output .= '<td class="name ' . $col . ' ' . $mobile . '"><a href="' . $this->permalink($user_id) . '">' . userpro_profile_data('user_login',
                        $user_id) . '</a> ';
                if (userpro_is_verified($user_id)) {
                    $output .= userpro_get_badge('verified');
                }
                $output .= '<br /><span class="nickname">(' . userpro_profile_data('display_name',
                        $user_id) . ')</span></td>';
                break;
            case 'country':
                if (in_array($col, $show_on_mobile)) {
                    $mobile = 'show-on-mobile';
                } else {
                    $mobile = 'hide-on-mobile';
                }
                $output .= '<td class="' . $col . ' ' . $mobile . '">' . userpro_get_badge('country_big',
                        $user_id) . '</td>';
                break;
            case 'gender':
                if (in_array($col, $show_on_mobile)) {
                    $mobile = 'show-on-mobile';
                } else {
                    $mobile = 'hide-on-mobile';
                }
                $output .= '<td class="' . $col . ' ' . $mobile . '">' . $this->cap_gender($user_id) . '</td>';
                break;
            case 'role':
                if (in_array($col, $show_on_mobile)) {
                    $mobile = 'show-on-mobile';
                } else {
                    $mobile = 'hide-on-mobile';
                }
                $output .= '<td class="' . $col . ' ' . $mobile . '">' . $this->get_role_nice($user) . '</td>';
                break;
            case 'email_user':
                if (in_array($col, $show_on_mobile)) {
                    $mobile = 'show-on-mobile';
                } else {
                    $mobile = 'hide-on-mobile';
                }
                $output .= '<td class="' . $col . ' ' . $mobile . '">';
                if (userpro_field_is_viewable('user_email', $user_id, $args)) {
                    $output .= '<a href="mailto:' . userpro_profile_data('user_email',
                            $user_id) . '" class="userpro-flat-btn"><i class="userpro-icon-envelope"></i><span>' . __('Contact',
                            'userpro') . '</span></a>';
                }
                $output .= '</td>';
                break;
            case 'message_user':
                if (in_array($col, $show_on_mobile)) {
                    $mobile = 'show-on-mobile';
                } else {
                    $mobile = 'hide-on-mobile';
                }
                if (class_exists('userpro_msg_api')) {
                    if ($userpro_msg->can_chat_with($user_id)) {
                        $output .= '<td class="' . $col . ' ' . $mobile . '"><a href="#" class="userpro-flat-btn chat userpro-init-chat" data-chat_with="' . $user_id . '" data-chat_from="' . get_current_user_id() . '"><i class="userpro-icon-comment"></i><span>' . __('Send Message',
                                'userpro-msg') . '</span>';
                        $output .= '</a></td>';
                    }
                }
                break;
            default:

                $value = get_user_meta($user_id, $col, true);

                if (is_array($value)) {
                    $value = implode(',', $value);
                }

                if (in_array($col, $show_on_mobile)) {
                    $mobile = 'show-on-mobile';
                } else {
                    $mobile = 'hide-on-mobile';
                }
                $output .= '<td class="' . $col . ' ' . $mobile . '">' . $value . '</td>';

                break;
        }

        return $output;
    }

    /******************************************
     * Parse memberlist table columns
     ******************************************/
    function parse_columns($type, $cols, $args)
    {

        $output = null;
        $col_content = null;
        if ($type == 'thead') {
            $output .= '<thead><tr>{columns}</tr></thead>';
        } else {
            $output .= '<tfoot><tr>{columns}</tr></tfoot>';
        }

        $show_on_mobile = [''];
        if (isset($args['show_on_mobile'])) {
            $show_on_mobile = explode(',', $args['show_on_mobile']);
        }

        $cols = explode(',', $cols);
        foreach ($cols as $col) {
            switch ($col) {
                case 'user_id' :
                    if (in_array($col, $show_on_mobile)) {
                        $mobile = 'show-on-mobile';
                    } else {
                        $mobile = 'hide-on-mobile';
                    }
                    $col_content .= '<th class="small ' . $mobile . '">' . __('ID', 'userpro') . '</th>';
                    break;
                case 'picture' :
                    if (in_array($col, $show_on_mobile)) {
                        $mobile = 'show-on-mobile';
                    } else {
                        $mobile = 'hide-on-mobile';
                    }
                    $col_content .= '<th class="thumb ' . $mobile . '">' . __('Photo', 'userpro') . '</th>';
                    break;
                case 'name' :
                    if (in_array($col, $show_on_mobile)) {
                        $mobile = 'show-on-mobile';
                    } else {
                        $mobile = 'hide-on-mobile';
                    }
                    $col_content .= '<th class="name ' . $mobile . '">' . __('Username', 'userpro') . '</th>';
                    break;
                case 'country' :
                    if (in_array($col, $show_on_mobile)) {
                        $mobile = 'show-on-mobile';
                    } else {
                        $mobile = 'hide-on-mobile';
                    }
                    $col_content .= '<th class="' . $mobile . '">' . __('Location', 'userpro') . '</th>';
                    break;
                case 'gender' :
                    if (in_array($col, $show_on_mobile)) {
                        $mobile = 'show-on-mobile';
                    } else {
                        $mobile = 'hide-on-mobile';
                    }
                    $col_content .= '<th class="' . $mobile . '">' . __('Sex', 'userpro') . '</th>';
                    break;
                case 'role' :
                    if (in_array($col, $show_on_mobile)) {
                        $mobile = 'show-on-mobile';
                    } else {
                        $mobile = 'hide-on-mobile';
                    }
                    $col_content .= '<th class="' . $mobile . '">' . __('Role', 'userpro') . '</th>';
                    break;
                case 'email_user' :
                    if (in_array($col, $show_on_mobile)) {
                        $mobile = 'show-on-mobile';
                    } else {
                        $mobile = 'hide-on-mobile';
                    }
                    $col_content .= '<th class="' . $mobile . '">' . __('Contact', 'userpro') . '</th>';
                    break;
                case 'message_user' :
                    if (in_array($col, $show_on_mobile)) {
                        $mobile = 'show-on-mobile';
                    } else {
                        $mobile = 'hide-on-mobile';
                    }
                    $col_content .= '<th class="' . $mobile . '">' . __('Send Message', 'userpro') . '</th>';
                    break;
                default:
                    if (in_array($col, $show_on_mobile)) {
                        $mobile = 'show-on-mobile';
                    } else {
                        $mobile = 'hide-on-mobile';
                    }
                    $col_content .= '<th class="' . $mobile . '">' . $this->field_label($col) . '</th>';
                    break;
            }
        }
        $output = str_replace('{columns}', $col_content, $output);

        return $output;
    }

    /******************************************
     * Gender capital
     ******************************************/
    function cap_gender($user_id)
    {

        $gender = get_user_meta($user_id, 'gender', true);
        if ($gender) {
            return ucfirst($gender);
        }
    }

    /******************************************
     * Get need before in string
     ******************************************/
    function str_before($subject, $needle)
    {

        $p = strpos($subject, $needle);

        return substr($subject, 0, $p);
    }

    /******************************************
     * Profile photo label
     ******************************************/
    function profile_photo_title($user_id)
    {

        if ($user_id && userpro_profile_data('profilepicture', $user_id)) {
            $title = sprintf(__('%s\'s profile photo', 'userpro'), userpro_profile_data('display_name', $user_id));
        } else {
            if (userpro_get_option('use_default_avatars') == 1) {
                $title = sprintf(__('%s\'s profile photo', 'userpro'), userpro_profile_data('display_name', $user_id));
            } else {
                $title = sprintf(__('%s did not upload a photo yet.', 'userpro'),
                    userpro_profile_data('display_name', $user_id));
            }
        }

        return $title;
    }

    /******************************************
     * Get Image URL
     ******************************************/
    function get_image_url_by_html($get_avatar)
    {

        preg_match("/src='(.*?)'/i", $get_avatar, $matches);

        return $matches[1];
    }

    /******************************************
     * Full profile photo url
     ******************************************/
    function profile_photo_url($user_id)
    {

        if ($user_id && userpro_profile_data('profilepicture', $user_id)) {
            $url = userpro_profile_data('profilepicture', $user_id);
        } else {
            if (userpro_get_option('use_default_avatars') == 1) {
                $url = $this->get_image_url_by_html(get_avatar($user_id, 150));
            } else {
                if ($user_id && userpro_profile_data('gender', $user_id)) {
                    $gender = strtolower(userpro_profile_data('gender', $user_id));
                } else {
                    $gender = 'male'; // default gender
                }
                $url = userpro_url . 'img/default_avatar_' . $gender . '.jpg';
            }
        }

        return $url;
    }

    /******************************************
     * Time elapsed format
     ******************************************/
    function time_elapsed($ptime)
    {

        $etime = current_time('timestamp') - $ptime;

        if ($etime < 1) {
            return __('now!', 'userpro');
        }

        $a = [
            12 * 30 * 24 * 60 * 60 => __('year', 'userpro'),
            30 * 24 * 60 * 60 => __('month', 'userpro'),
            24 * 60 * 60 => __('day', 'userpro'),
            60 * 60 => __('hour', 'userpro'),
            60 => __('minute', 'userpro'),
            1 => __('second', 'userpro'),
        ];

        foreach ($a as $secs => $str) {
            $d = $etime / $secs;
            if ($d >= 1) {
                $r = round($d);

                return $r . ' ' . $str . ($r > 1 ? 's' : '') . __(' ago', 'userpro');
            }
        }
    }

    /******************************************
     * Set default options (accepts array)
     ******************************************/
    function set_defaults($array, $extension = false)
    {

        $defaults = userpro_default_options();
        if ($extension == 'social') {
            $defaults = userpro_sc_default_options();
        }
        foreach ($array as $key) {
            userpro_set_option($key, $defaults[$key]);
        }
    }

    /******************************************
     * friendly username
     ******************************************/
    function clean_user($string)
    {

        $string = strtolower($string);
        $string = preg_replace("/[^a-z0-9_\s-]/", "", $string);
        $string = preg_replace("/[\s-]+/", " ", $string);
        $string = preg_replace("/[\s_]/", "_", $string);

        return $string;
    }

    /******************************************
     * Make display_name unique
     ******************************************/
    function unique_display_name($display_name)
    {

        $r = str_shuffle("0123456789");
        $r1 = (int)$r[0];
        $r2 = (int)$r[1];
        $display_name = $display_name . $r1 . $r2;

        return $display_name;
    }

    /******************************************
     * Google auth url
     ******************************************/
    function getGoogleAuthUrl()
    {

        $googleLogin = new GoogleAuth();

        $authUrl = $googleLogin->authUrl();

        return $authUrl;
    }

    /******************************************
     * Twitter auth url
     ******************************************/
    function gettwitterAuthUrl()
    {
        if (!class_exists('TwitterAuth')) {
            require_once(userpro_path . 'functions/socials/TwitterAuth.php');
        }

        try {

            $twitterLogin = new TwitterAuth();
            $authUrl = $twitterLogin->authUrl();

            return $authUrl;
        } catch (Exception $e) {

            up_error('UserPro error , twitter url error : ', $e->getMessage());
        }

        return null;
    }

    function getLinkedinAuthUrl()
    {

        if (userpro_get_option('linkedin_connect') == 1 && userpro_get_option('linkedin_app_key') && userpro_get_option('linkedin_Secret_Key')) {

            if (!class_exists('LinkedinAuth')) {
                require_once(userpro_path . 'functions/socials/LinkedinAuth.php');
            }

            $linkedin = new LinkedinAuth();

            try {
                $url = $linkedin->authUrl();

                return $url;
            } catch (Exception $e) {

                up_error('Linkedin authorize : ', $e);
            }
        }

        return null;
    }

    function getInstagramAuthUrl()
    {

        if (userpro_get_option('instagram_connect') == 1 && userpro_get_option('instagram_app_key') && userpro_get_option('instagram_Secret_Key')) {
            if (!class_exists('instagramUrl')) {
                require_once(userpro_path . 'functions/socials/InstagramAuth.php');
            }
            $instagram = new InstagramAuth();

            try {

                $url = $instagram->authUrl();

                return $url;
            } catch (Exception $e) {

                up_error('Linkedin authorize : ', $e);
            }
        }

        return null;
    }

    /******************************************
     * Get current page URL
     ******************************************/
    function get_current_page_url()
    {

        global $post;
        if (is_front_page()) :
            $page_url = home_url();
        else :
            $page_url = 'http';
            if (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") {
                $page_url .= "s";
            }
            $page_url .= "://";
            if ($_SERVER["SERVER_PORT"] != "80") {
                $page_url .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
            } else {
                $page_url .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
            }
        endif;

        return apply_filters('userpro_get_current_page_url', esc_url($page_url));
    }

    public function wplRedirectHomepage()
    {

        global $userpro;
        //Added by Niranjan for custom redirect.
        $rules = get_option('userpro_redirects_login');
        $redirect_uri = $userpro->permalink();

        if (userpro_get_option('after_login') == 'no_redirect') {
            $redirect_uri = $_SESSION['current_page_uri'];
        }

        if (isset($rules)) {
            $redirect_uri = apply_filters('userpro_login_redirect', $userpro->permalink());
        }
        echo "<script type='text/javascript'>
					window.location.href ='" . $redirect_uri . "'
				  </script>";
    }

    public function wpinRedirectHomepage()
    {

        global $userpro;
        //Added by Niranjan for custom redirect.
        $rules = get_option('userpro_redirects_login');
        $redirect_uri = $userpro->permalink();

        if (userpro_get_option('after_login') == 'no_redirect') {
            $redirect_uri = $_SESSION['current_page_uri'];
        }

        if (isset($rules)) {
            $redirect_uri = apply_filters('userpro_login_redirect', $userpro->permalink());
        }
        echo "<script type='text/javascript'>
					window.location.href ='" . $redirect_uri . "'
				  </script>";
    }

    /******************************************
     * Users allowed to publish automatically
     ******************************************/
    function instant_publish_roles()
    {

        $instant_publish_roles = userpro_get_option('instant_publish_roles');
        if ($instant_publish_roles) {
            $instant_publish_roles = explode(',', $instant_publish_roles);
        } else {
            $instant_publish_roles = [];
        }

        return $instant_publish_roles;
    }

    /******************************************
     * Find if a user role exists in array of roles
     ******************************************/
    function user_role_in_array($user_id, $array)
    {

        if (isset($user_id)) {
            $user = get_userdata($user_id);
            if (!empty($user)) {
                $user_roles = $user->roles;
                if (isset($user_roles) && is_array($user_roles)) {
                    foreach ($user_roles as $k => $v) {
                        if (in_array($v, $array)) {
                            return true;
                        }
                    }
                }
            }
        }

        return false;
    }

    /******************************************
     * Multiple Registration Forms Support
     ******************************************/
    function multi_type_exists($type)
    {

        $multi = userpro_mu_get_option('multi_forms');
        if (isset($multi[$type])) {
            return true;
        }

        return false;
    }

    function multi_type_get_array($type)
    {

        $multi = userpro_mu_get_option('multi_forms');

        return $multi[$type];
    }

    /******************************************
     * Add query var
     ******************************************/
    public function add_query_var_vars()
    {

        global $wp;
        $wp->add_query_var('userpro_export_options');
        $wp->add_query_var('userpro_export_fields');
        $wp->add_query_var('userpro_export_groups');
    }

    /******************************************
     * Redirect to download file
     ******************************************/
    public function admin_redirect_download_files()
    {

        global $wp;
        global $wp_query;
        //download export
        if (array_key_exists('userpro_export_options',
                $wp->query_vars) && $wp->query_vars['userpro_export_options'] == 'safe_download') {
            $this->download_file('userpro_export_options');
            die();
        }
        if (array_key_exists('userpro_export_fields',
                $wp->query_vars) && $wp->query_vars['userpro_export_fields'] == 'safe_download') {
            $this->download_file('userpro_export_fields');
            die();
        }
        if (array_key_exists('userpro_export_groups',
                $wp->query_vars) && $wp->query_vars['userpro_export_groups'] == 'safe_download') {
            $this->download_file('userpro_export_groups');
            die();
        }
    }

    /******************************************
     * Download file to browser
     ******************************************/
    public function download_file($setting, $content = null, $file_name = null)
    {

        if (!wp_verify_nonce($_REQUEST['nonce'], $setting)) {
            die();
        }

        //here you get the options to export and set it as content, ex:
        if ($setting == 'userpro_export_options') {
            $obj = get_option('userpro');
        }
        if ($setting == 'userpro_export_fields') {
            $obj = get_option('userpro_fields');
        }
        if ($setting == 'userpro_export_groups') {
            $obj = get_option('userpro_fields_groups');
        }

//        $content = base64_encode(serialize($obj));
//        $file_name = 'userpro_' . current_time('timestamp') . '.txt';

        $content = base64_encode(json_encode($obj));
        $file_name = 'userpro_' . current_time('timestamp') . '.json';

        header('HTTP/1.1 200 OK');

        if (!current_user_can('manage_options')) {
            die();
        }
        if ($content === null || $file_name === null) {
            die();
        }

        $fsize = strlen($content);
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header('Content-Description: File Transfer');
        header("Content-Disposition: attachment; filename=" . $file_name);
        header("Content-Length: " . $fsize);
        header("Expires: 0");
        header("Pragma: public");
        echo $content;
        exit;
    }

    /******************************************
     * Demo
     ******************************************/
    function trial_version()
    {

        if (get_option('userpro_activated') == 0) {
            update_option('userpro_trial', 1);
        }
    }

    /******************************************
     * validate license
     ******************************************/
    function validate_license($code, $token)
    {

        update_option('userpro_trial', 0);
        update_option('userpro_activated', 1);
        userpro_set_option('userpro_code', $code);
        userpro_set_option('envato_token', $token);
    }

    /******************************************
     * invalidate license
     ******************************************/
    function invalidate_license($code, $token)
    {

        update_option('userpro_trial', 1);
        delete_option('userpro_activated');
        userpro_set_option('userpro_code', 'CodeXinh');
        userpro_set_option('envato_token', $token);
    }

    /******************************************
     * Update facebook ID
     ******************************************/
    function update_fb_id($user_id, $id)
    {

        // only for connected users - after login
        if (userpro_is_logged_in() && (get_current_user_id() == $user_id)) {
            update_user_meta($user_id, 'userpro_facebook_id', $id);
        }
    }

    /******************************************
     * Update twitter ID
     ******************************************/
    function update_twitter_id($user_id, $id)
    {

        update_user_meta($user_id, 'twitter_oauth_id', $id);
    }

    /******************************************
     * Update google ID
     ******************************************/
    function update_google_id($user_id, $id)
    {

        update_user_meta($user_id, 'userpro_google_id', $id);
    }

    /******************************************
     * Strip weird chars from value
     ******************************************/
    function remove_denied_chars($val, $field = null)
    {

        $val = preg_replace('/(?=\P{Nd})\P{L} /u', '', $val);
        if ($field == 'display_name') {

            if (!userpro_get_option('allow_dash_display_name')) {
                $val = str_replace('-', '', $val);
            }
        } else {
            $val = str_replace('-', '', $val);
        }
        $val = str_replace('&', '', $val);
        $val = str_replace('+', '', $val);

        //$val = str_replace("'",'',$val);
        return $val;
    }

    /******************************************
     * User ID is admin
     ******************************************/
    function is_admin($user_id)
    {

        $user = get_userdata($user_id);
        if ($user != false) {
            if ($user->user_level >= 10) {
                return true;
            }
        }

        return false;
    }

    /******************************************
     * User exists by ID
     ******************************************/
    function user_exists($user_id)
    {

        $aux = get_userdata($user_id);
        if ($aux == false) {
            return false;
        }

        return true;
    }

    /******************************************
     * Manual attachment from uploads
     ******************************************/
    function new_attachment($post_id, $filename)
    {
        $wp_upload_dir = wp_upload_dir();
        rename($this->upload_path . get_current_user_id() . '/' . basename($filename),
            $this->upload_path_wp . basename($filename));
        $filename = $this->upload_path_wp . basename($filename);
        $wp_filetype = wp_check_filetype(basename($filename), null);
        $attachment = [
            'guid' => $wp_upload_dir['url'] . '/' . basename($filename),
            'post_mime_type' => $wp_filetype['type'],
            'post_title' => preg_replace('/\.[^.]+$/', '', basename($filename)),
            'post_content' => '',
            'post_status' => 'inherit',
        ];
        set_post_thumbnail_size('', '');
        $attach_id = wp_insert_attachment($attachment, $filename, $post_id);
        $imagesize = getimagesize($filename);
        // you must first include the image.php file
        // for the function wp_generate_attachment_metadata() to work
        require_once(ABSPATH . 'wp-admin/includes/image.php');
        $attach_data = wp_generate_attachment_metadata($attach_id, $filename);

        wp_update_attachment_metadata($attach_id, $attach_data);

        return $attach_id;
    }

    function set_thumbnail($post_id, $attach_id)
    {

        set_post_thumbnail($post_id, $attach_id);
    }

    /******************************************
     * Get skin URL
     ******************************************/
    function skin_url()
    {

        $skin = userpro_get_option('skin');
        if (class_exists('userpro_sk_api') && is_dir(userpro_sk_path . 'skins/' . $skin)) {
            $skin_url = userpro_sk_url . 'skins/' . $skin . '/img/';
        } else {
            $skin_url = userpro_url . 'skins/' . $skin . '/img/';
        }

        if (locate_template('userpro/skins/' . $skin . '/style.css')) {
            $skin_url = get_template_directory_uri() . '/userpro/skins/' . $skin . '/img/';
        }

        return $skin_url;
    }

    /******************************************
     * First choice? translation compatibility
     ******************************************/
    function is_first_option($args, $key, $user_id)
    {

        if (isset($this->groups[$args['template']]['default'][$key]['options'])) {
            $opts = $this->groups[$args['template']]['default'][$key]['options'];
            $value = userpro_profile_data($key, $user_id);
            $search = array_search($value, $opts);
            if ($search == 1) {
                return true;
            }
        }

        return false;
    }

    /******************************************
     * Deletes an entire folder easily (uses path)
     ******************************************/
    function delete_folder($dir)
    {

        if (!file_exists($dir)) {
            return true;
        }
        if (!is_dir($dir)) {
            return unlink($dir);
        }
        foreach (scandir($dir) as $item) {
            if ($item == '.' || $item == '..') {
                continue;
            }
            if (!$this->delete_folder($dir . DIRECTORY_SEPARATOR . $item)) {
                return false;
            }
        }

        return rmdir($dir);
    }

    public function makeAweberSubscribeEntry($user_id)
    {

        include(userpro_path . 'lib/aweber_api/aweber_api.php');
        $email = userpro_profile_data('user_email', $user_id);
        $fname = userpro_profile_data('first_name', $user_id);
        $credentials = [];
        if (get_option('userpro_aweber_credentials') === false) {
            $credentials = AWeberAPI::getDataFromAweberID(userpro_get_option('aweber_api'));
            if (!$credentials) {
                echo 'Incorrect aweber authorization code';
            } else {
                update_option('userpro_aweber_credentials', $credentials);
            }
        } else {
            $credentials = get_option('userpro_aweber_credentials');
        }
        list($consumerKey, $consumerSecret, $accessKey, $accessSecret) = $credentials;

        $aweber = new AWeberAPI($consumerKey, $consumerSecret);
        $account = $aweber->getAccount($accessKey, $accessSecret);
        $account_id = $account->id;
        $mylists = $account->lists;
        $list_name_found = false;

        foreach ($mylists as $list) {
            if ($list->id == userpro_get_option('aweber_listname')) {
                $list_name_found = true;
                try {//Create a subscriber
                    $params = [
                        'email' => $email,
                        'name' => $fname,
                    ];
                    $subscribers = $list->subscribers;
                    $new_subscriber = $subscribers->create($params);
                } catch (Exception $exc) {

                }
            }
        }
    }

    /******************************************
     * Find status of follower
     ******************************************/
    function followere_email_subscriber($user_id)
    {

        $followers = get_user_meta($user_id, 'followers_email');

        if ($followers[0] == "unsubscribed") {

            return true;
        }

        return false;
    }

    /******************************************
     * Subscribe to MailChimp
     ******************************************/
    function mailchimp_subscribe($user_id, $list_id = null)
    {

        $email = userpro_profile_data('user_email', $user_id);
        $fname = userpro_profile_data('first_name', $user_id);
        $lname = userpro_profile_data('last_name', $user_id);

        $objMailChimp = new UserProMailChimp();
        $test = $objMailChimp->subscribe($list_id, [
            'email_address' => $email,
            'merge_fields' => ['FNAME' => $fname, 'LNAME' => $lname]
        ]);
    }

    /******************************************
     * Campaignmonitor integration
     ******************************************/

    public function makeCampaignmonitorEntry($user_id)
    {

        $email = userpro_profile_data('user_email', $user_id);
        include(userpro_path . 'lib/campaignmonitor/csrest_subscribers.php');

        $list_id = userpro_get_option('Campaignmonitor_listname');

        $auth_details = ['api_key' => userpro_get_option('Campaignmonitor_api')];

        $api = new CS_REST_Subscribers($list_id, $auth_details);

        $subscriber = ['EmailAddress' => $email];
        $api->add($subscriber);
    }

    /******************************************
     * Unubscribe from MailChimp
     ******************************************/
    function mailchimp_unsubscribe($user_id, $list_id = null)
    {
        $email = userpro_profile_data('user_email', $user_id);

        $MailChimp = new UserProMailChimp();
        $test = $MailChimp->unsubscribe($list_id, [
            'email_address' => $email
        ]);
    }

    /******************************************
     * Find status of subscriber
     ******************************************/
    function mailchimp_is_subscriber($user_id, $list_id = null)
    {

        if (userpro_get_option('mailchimp_api') != '') {
            $email = userpro_profile_data('user_email', $user_id);
            $MailChimp = new UserProMailChimp();

            return $MailChimp->is_subscribed($list_id, $email);
        }

        if (userpro_get_option('mailster_activate') != '') {

            if ($user_id != '') {
                global $wpdb;
                require_once MAILSTER_DIR_USERPRO . '/mailster.php';
                $mailster_subscribers = new MailsterSubscribers();
                $subscriber = $mailster_subscribers->get_status();
                $table = $wpdb->prefix . 'mailster_subscribers';
                $userdata = $wpdb->get_results($wpdb->prepare("SELECT * FROM $table where wp_id = %s", $user_id));
                if (!empty($userdata)) {
                    foreach ($userdata as $ud) {
                        $status = $ud->status;
                    }
                    if ($status == 0 || $status == 1) {
                        return true;
                    }
                }
            }
        }

        return false;
    }

    /******************************************
     * Verify purchase codes @ Envato
     ******************************************/
    function verify_purchase($code, $api_key = null, $username = null, $item_id = null)
    {return true;//NULLED BY CODEXINH

        if (!$api_key) {
            $api_key = userpro_get_option('envato_api');
        }
        if (!$username) {
            $username = userpro_get_option('envato_username');
        }
        require_once userpro_path . '/lib/envato/Envato_marketplaces.php';
        $Envato = new Envato_marketplaces();
        $Envato->set_api_key($api_key);
        $verify = $Envato->verify_purchase($username, $code);
        if ($item_id != '') {
            if (isset($verify->item) && $verify->item->id == $item_id) {
                return true;
            }
            if($verify == 403 || strpos($verify, 'purchase:verify')){
                 echo '<div class="error"><p><strong>'.__('Permission: "Verify purchases the user has made" is not applied, if token was edited, then it will take around 15 minutes for edit to apply, if it wasn`t edited, then re-create personal token and double check Your applied permissions','userpro').'</strong></p></div>';
            }
            else{
                echo '<div class="error"><p><strong>'.__('You have entered an invalid purchase code or the Envato API could be down at the moment.','userpro').'</strong></p></div>';
            }
           

            return false;
        } else {
            if (isset($verify->item->id)) {
                return true;
            }

            return false;
        }
    }

    /******************************************
     * Make envato verified
     ******************************************/
    function do_envato($user_id)
    {

        update_user_meta($user_id, '_envato_verified', 1);
    }

    /******************************************
     * Undo envato verified
     ******************************************/
    function undo_envato($user_id)
    {

        update_user_meta($user_id, '_envato_verified', 0);
    }

    /******************************************
     * Is Envato customer
     ******************************************/
    function is_envato_customer($user_id)
    {

        $envato = get_user_meta($user_id, '_envato_verified', true);
        if ($envato == 1) {
            return true;
        }

        return false;
    }

    /******************************************
     * Unique display names
     ******************************************/
    function display_name_exists($display_name)
    {
        if (empty($display_name)) {
            return false;
        }

        $users = get_users([
            'meta_key' => 'display_name',
            'meta_value' => $display_name,
            'meta_compare' => '=',
        ]);
        if (isset($users[0]->ID) && ($users[0]->ID == get_current_user_id())) {
            return false;
        } elseif ((isset($users[0]->ID) && current_user_can('manage_options')) || userpro_get_edit_userrole()) {
            return false;
        } elseif (isset($users[0]->ID) && userpro_get_edit_userrole()) {
            return false;
        } elseif (isset($users[0]->ID)) {
            return true;
        }

        return false;
    }

    /******************************************
     * Get valid file URI
     ******************************************/
    function file_uri($url, $user_id = false)
    {

        // external - needs no editing
        $method = userpro_get_option('picture_save_method');
        if ($method == 'external' && substr($url, 0, 4) === "http" && strstr($url, 'fb')) {
            return $url;
        }

        $url = $this->get_uploads_url($user_id) . basename($url);

        if (userpro_get_option('use_relative') == 'relative') {
            if (strstr($url, 'wp-content')) {
                $url = explode('wp-content', $url);
                $url = $url[1];

                if (userpro_get_option('ppfix') == 'b') {
                    $url = '' . $url;
                } else {
                    $url = '/wp-content' . $url;
                }
            }
        }

        return $url;
    }

    /******************************************
     * Space in url correction
     ******************************************/
    function correct_space_in_url($url)
    {

        $url = str_replace(' ', '%20', $url);

        return $url;
    }

    /******************************************
     * Quickly update a field
     ******************************************/
    function update_field($field, $form)
    {

        $fields = $this->fields;
        $groups = $this->groups;
        foreach ($form as $key => $value) {
            if ($key != 'options') {
                $fields[$field][$key] = $value;
                foreach ($groups as $group => $array) {
                    if (isset($groups[$group]['default'][$field])) {
                        $groups[$group]['default'][$field][$key] = $value;
                    }
                }
            } else {
                $encoding = mb_detect_encoding($value, 'auto');
                if ($encoding != 'ASCII' && $encoding != 'UTF-8') {
                    $value = mb_convert_encoding($value, 'UTF-8', 'auto');
                }
                $fields[$field][$key] = preg_split('/[\r\n]+/', $value, -1, PREG_SPLIT_NO_EMPTY);
                foreach ($groups as $group => $array) {
                    if (isset($groups[$group]['default'][$field])) {
                        $groups[$group]['default'][$field][$key] = preg_split('/[\r\n]+/', $value, -1,
                            PREG_SPLIT_NO_EMPTY);
                    }
                }
            }
        }
        update_option('userpro_fields', $fields);
        update_option('userpro_fields_groups', $groups);
    }

    /******************************************
     * Create new group
     ******************************************/
    function create_group($group)
    {

        $groups = $this->groups;
        $groups[$group]['default'] = '';
        update_option('userpro_fields_groups', $groups);
    }

    /******************************************
     * hidden fields from profile view
     ******************************************/
    function fields_to_hide_from_view()
    {

        $option = userpro_get_option('hidden_from_view');
        $arr = explode(',', $option);

        return $arr;
    }

    /******************************************
     * Posts by user
     ******************************************/
    function posts_by_user($user_id, $opts)
    {

        if (strstr($opts['postsbyuser_types'], ',')) {
            $post_types = explode(',', $opts['postsbyuser_types']);
        } else {
            $post_types = $opts['postsbyuser_types'];
        }

        if (!isset($opts['all_users'])) {

            $args['author'] = $user_id;
        }
        $args['posts_per_page'] = $opts['postsbyuser_num'];
        $offset = (isset($_GET['postp'])) ? ($_GET['postp'] - 1) * $args['posts_per_page'] : 0;
        $args['offset'] = $offset;
        $args['post_type'] = $post_types;

        /* Show posts from specific category */
        if (isset($opts['postsbyuser_category']) && !empty($opts['postsbyuser_category'])) {
            $args['tax_query'] = [
                [
                    'taxonomy' => $opts['postsbyuser_taxonomy'],
                    'field' => 'term_id',
                    'terms' => explode(',', $opts['postsbyuser_category']),
                ],
            ];
        }

        $post_query = new WP_Query($args);

        return $post_query;
    }

    /******************************************
     * Get first image in a post
     ******************************************/
    function get_first_image($postid)
    {

        $post = get_post($postid);
        setup_postdata($post);
        $first_img = '';
        ob_start();
        ob_end_clean();
        $output = [];
        $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
        if (isset($matches[1][0])) {
            $first_img = $matches[1][0];
        }
        if (isset($first_img) && !empty($first_img)) {
            return $first_img;
        }
    }

    /******************************************
     * Get thumbnail URL based on post ID
     ******************************************/
    function post_thumb_url($postid)
    {

        $encoded = '';
        if (get_post_thumbnail_id($postid) != '') {
            $image = wp_get_attachment_image_src(get_post_thumbnail_id($postid), 'large');
            $encoded = urlencode($image[0]);
        } elseif ($this->get_first_image($postid) != '') {
            $encoded = urlencode($this->get_first_image($postid));
        } else {
            $encoded = urlencode(userpro_url . 'img/placeholder.jpg');
        }

        return $encoded;
    }

    /******************************************
     * Get post thumbnail image (size wise)
     ******************************************/
    function post_thumb($postid, $width = 400 ,$height = 400, $quality = 100)
    {

        require_once(userpro_path . 'lib/BFI_Thumb.php');
        $post_thumb_url = $this->post_thumb_url($postid);
        if (isset($post_thumb_url)) {
            $params = ['width' => $width, 'height' => $height, 'quality' => $quality];
            $cropped_thumb = bfi_thumb(urldecode($post_thumb_url), $params);
            $img = '<img style="height:'.$height.'px; width:'.$width.'px" src="' . $cropped_thumb . '" alt="" />';

            return $img;
        }
    }

    /******************************************
     * Count found results
     ******************************************/
    function found_members($count)
    {

        if ($count == 1) {
            return __('Found <span>1</span> Member', 'userpro');
        } else {
            return sprintf(__('Found <span>%s</span> Members', 'userpro'), $count);
        }
    }

    /******************************************
     * Get online users
     ******************************************/
    function onlineusers()
    {

        $online = get_transient('userpro_users_online');
        $include = [];
        if (is_array($online)) {

            foreach ($online as $k => $t) {
                $include[] = $k;
            }
            if (!empty($include)) {
                $query['include'] = $include;

                $wp_user_query = $this->get_cached_query($query);
                if (!empty($wp_user_query->results)) {
                    return $wp_user_query->results;
                }
            }
        }
    }

    /******************************************
     * Is user online
     ******************************************/
    function is_user_online($user_id)
    {

        $online = get_transient('userpro_users_online');
        if (isset($online) && is_array($online) && isset($online[$user_id])) {
            return true;
        }

        return false;
    }

    /******************************************
     * Update online users
     ******************************************/
    function update_online_users()
    {

        if (is_user_logged_in()) {

            if (userpro_get_option('hide_online_admin') && userpro_is_admin(get_current_user_id())) {
                return;
            }

            if (($logged_in_users = get_transient('userpro_users_online')) === false) {
                $logged_in_users = [];
            }

            $current_user = wp_get_current_user();
            $current_user = $current_user->ID;
            $current_time = current_time('timestamp');

            if (!isset($logged_in_users[$current_user]) || ($logged_in_users[$current_user] < ($current_time - (15 * 60)))) {
                $logged_in_users[$current_user] = $current_time;
                set_transient('userpro_users_online', $logged_in_users, (30 * 60));
            }
        }
    }

    /******************************************
     * Create special class for online user
     ******************************************/
    function online_user_special($user_id)
    {

        if (userpro_is_admin($user_id)) {
            return 'admin';
        }
    }

    /******************************************
     * Prepares a user for pending email verify
     ******************************************/
    function process_email_approve()
    {

        if (isset($_GET['act']) && isset($_GET['user_id']) && isset($_GET['user_verification_key'])) {
            if ($_GET['act'] == 'verify_account' && (int)$_GET['user_id'] && strlen($_GET['user_verification_key']) == 20) {

                // valid request, try to validate user
                if ($this->is_pending($_GET['user_id'])) {
                    $salt_check = get_user_meta($_GET['user_id'], '_account_verify', true);
                    if ($salt_check == $_GET['user_verification_key']) {
                        $this->activate($_GET['user_id']);
                        wp_safe_redirect(add_query_arg('accountconfirmed', 'true', esc_url($this->permalink())));
                        exit;
                    }
                }
            }
        }

        if (isset($_GET['accountconfirmed']) && $_GET['accountconfirmed'] == 'true') {
            add_action('userpro_pre_form_message', 'userpro_msg_account_validated', 999);
        }
    }

    /******************************************
     * Process verification invite
     ******************************************/
    function process_verification_invites()
    {

        if (isset($_GET['act']) && isset($_GET['user_id']) && isset($_GET['hash_secret'])) {
            if ($_GET['act'] == 'verified_invitation' && (int)$_GET['user_id'] && strlen($_GET['hash_secret']) == 20) {

                // valid request, verify user
                $hash = get_user_meta($_GET['user_id'], '_invite_verify', true);
                if ($hash == $_GET['hash_secret']) {
                    $this->verify($_GET['user_id']);
                    add_action('wp_footer', 'userpro_check_status_verified');
                } else {
                    // invalid expired
                    add_action('wp_footer', 'userpro_failed_status_verified');
                }
            }
        }
    }

    /******************************************
     * Create a validation URL automatically
     ******************************************/
    function create_validate_url($user_id)
    {

        $salt = get_user_meta($user_id, '_account_verify', true);
        if ($salt && strlen($salt) == 20) {
            $url = home_url() . '/';
            $url = add_query_arg('act', 'verify_account', $url);
            $url = add_query_arg('user_id', $user_id, $url);
            $url = add_query_arg('user_verification_key', $salt, $url);

            return $url;
        }
    }

    /******************************************
     * Prepares a user for pending email verify
     ******************************************/
    function pending_email_approve($user_id, $user_pass, $form)
    {

        $new_account_salt = wp_generate_password($length = 20, $include_standard_special_chars = false);
        update_user_meta($user_id, '_account_verify', $new_account_salt);
        update_user_meta($user_id, '_account_status', 'pending');
        update_user_meta($user_id, '_pending_pass', $user_pass);
        update_user_meta($user_id, '_pending_form', $form);
        userpro_mail($user_id, 'verifyemail', null, $form);
        if (userpro_get_option('notify_admin_email_approve')) {
            userpro_mail($user_id, 'verifyemailadmin', null, $form);
        }
    }

    /******************************************
     * Prepares a user for pending admin verify
     ******************************************/
    function pending_admin_approve($user_id, $user_pass, $form)
    {

        $new_account_salt = wp_generate_password($length = 20, $include_standard_special_chars = false);
        update_user_meta($user_id, '_account_status', 'pending_admin');
        update_user_meta($user_id, '_pending_pass', $user_pass);
        update_user_meta($user_id, '_pending_form', $form);
        userpro_mail($user_id, 'pendingapprove', null, $form);
    }

    /******************************************
     * Simply ensures a user is activated before
     * allowing him to login, etc.
     ******************************************/
    function is_active($user_id)
    {

        $checkuser = get_user_meta($user_id, '_account_status', true);
        if ($checkuser == 'active') {
            return true;
        }

        return false;
    }

    /******************************************
     * Check for a pending user
     ******************************************/
    function is_pending($user_id)
    {

        $checkuser = get_user_meta($user_id, '_account_status', true);
        if ($checkuser == 'pending' || $checkuser == 'pending_admin' || $checkuser == 'expired_subscription') {
            return true;
        }

        return false;
    }

    /******************************************
     * Activate a user
     ******************************************/
    function activate($user_id, $user_login = null)
    {

        if ($user_login != '') {
            $user = get_user_by('login', $user_login);
            $user_id = $user->ID;
        }

        $result = get_user_meta($user_id, "userpayment");
        $uppayment = get_option('userpro_payment');
        if ($uppayment['userpro_payment_option'] == 'y') {
            if (isset($result[0]) && $result[0] == "recive" || is_super_admin(get_current_user_id())) {

                delete_user_meta($user_id, '_account_verify');
                update_user_meta($user_id, '_account_status', 'active');

                $password = get_user_meta($user_id, '_pending_pass', true);
                $form = get_user_meta($user_id, '_pending_form', true);
                userpro_mail($user_id, 'newaccount', $password, $form);
                do_action('userpro_after_new_registration', $user_id);

                delete_user_meta($user_id, '_pending_pass');
                delete_user_meta($user_id, '_pending_form');
            }
        } else {

            delete_user_meta($user_id, '_account_verify');
            update_user_meta($user_id, '_account_status', 'active');

            $password = get_user_meta($user_id, '_pending_pass', true);
            $form = get_user_meta($user_id, '_pending_form', true);
            userpro_mail($user_id, 'newaccount', $password, $form);
            do_action('userpro_after_new_registration', $user_id);

            delete_user_meta($user_id, '_pending_pass');
            delete_user_meta($user_id, '_pending_form');
        }
    }

    /******************************************
     * Get a cached query
     ******************************************/
    function get_cached_query($query)
    {

        $cached = $this->get_cached_results;
        $testcache = serialize($query);
        if (!isset($cached["$testcache"])) {
            $cached["$testcache"] = new WP_User_Query(unserialize($testcache));
            update_option('userpro_cached_results', $cached);
            $query = $cached["$testcache"];
        } else {
            $query = $cached["$testcache"];
        }

        return $query;
    }

    /******************************************
     * Clear previous cache
     ******************************************/
    function clear_cache()
    {

        delete_option('userpro_cached_results');
    }

    /******************************************
     * Extract user id/data of profile
     ******************************************/
    function try_user_id($args)
    {

        if ($args['user'] == 'url' && get_query_var('up_username')) {
            $user_id = $this->get_member_by_queryvar_from_id();
        } elseif ($args['user'] != '') {
            $user = get_user_by('login', $args['user']);
            $user_id = $user->ID;
        } else {
            $user_id = get_current_user_id();
        }

        return $user_id;
    }

    /******************************************
     * Content to fields
     ******************************************/
    function content_to_fields($content, $id = 0)
    {

        $user_id = $this->get_member_by_queryvar_from_id();
        if ($id) {
            $user_id = $id;
        }
        $user = get_userdata($user_id);

        foreach ($this->fields as $key => $v) {
            $merged_keys[] = $key;
        }

        $merged_keys = array_merge($merged_keys, ['username', 'role']);

        foreach ($merged_keys as $key) {
            switch ($key) {
                case 'user_login':
                    $fields['[' . $key . ']'] = '<span class="up-' . $key . '">' . $user->user_login . '</span>';
                    break;
                case 'role':
                    $fields['[' . $key . ']'] = '<span class="up-' . $key . '">' . $this->get_role_nice($user) . '</span>';
                    break;
                default:
                    $fields['[' . $key . ']'] = '<span class="up-' . $key . '">' . get_user_meta($user_id, $key,
                            true) . '</span>';
                    break;
            }

            if (strstr($key, 'profilepicture')) {
                $fields['[' . $key . ']'] = '<span class="up-' . $key . '">' . get_avatar($user_id, 64) . '</span>';
                $fields['[' . $key . ' round]'] = '<span class="up-' . $key . ' up-round">' . get_avatar($user_id,
                        64) . '</span>';
            }
        }

        $search = array_keys($fields);
        $replace = array_values($fields);
        $content = str_replace($search, $replace, $content);

        return apply_filters('userpro_content_from_field_filter', $content, $user_id);
    }

    /******************************************
     * If a field exists in builtin+custom fields
     ******************************************/
    function field_exists($key)
    {

        if (isset($this->fields[$key])) {
            return true;
        }

        return false;
    }

    /******************************************
     * Gets a field label
     ******************************************/
    function field_label($key)
    {

        if (isset($this->fields[$key]) && isset($this->fields[$key]['label'])) {
            return $this->fields[$key]['label'];
        } else {
            return null;
        }
    }

    /******************************************
     * Gets a field type
     ******************************************/
    function field_type($key)
    {

        if (isset($this->fields[$key]) && isset($this->fields[$key]['type'])) {
            return $this->fields[$key]['type'];
        }

        return false;
    }

    /******************************************
     * Gets a field icon
     ******************************************/
    function field_icon($key)
    {

        if (isset($this->fields[$key]) && isset($this->fields[$key]['icon'])) {
            return $this->fields[$key]['icon'];
        }
    }

    /******************************************
     * Update field icons
     ******************************************/
    function update_field_icons()
    {

        $fields = $this->fields;
        if (isset($fields) && is_array($fields) && get_option('userpro_fields')) {
            foreach ($fields as $field => $arr) {
                switch ($field) {

                    default:
                        $fields[$field]['icon'] = '';
                        break;
                    case 'country':
                        $fields['country']['icon'] = 'map-marker';
                        break;
                    case 'user_email':
                        $fields['user_email']['icon'] = 'envelope-alt';
                        break;
                    case 'user_login':
                        $fields['user_login']['icon'] = 'user';
                        break;
                    case 'username_or_email':
                        $fields['username_or_email']['icon'] = 'user';
                        break;
                    case 'user_pass':
                        $fields['user_pass']['icon'] = 'lock';
                        break;
                    case 'facebook':
                        $fields['facebook']['icon'] = 'facebook';
                        break;
                    case 'twitter':
                        $fields['twitter']['icon'] = 'twitter';
                        break;
                    case 'google_plus':
                        $fields['google_plus']['icon'] = 'google-plus';
                        break;
                    case 'profilepicture':
                        $fields['profilepicture']['icon'] = 'camera';
                        break;
                    case 'user_url':
                        $fields['user_url']['icon'] = 'home';
                        break;
                    case 'linkedin':
                        $fields['linkedin']['icon'] = 'linkedin';
                        break;
                    case 'instagram':
                        $fields['instagram']['icon'] = 'instagram';
                        break;
                    case 'youtube':
                        $fields['youtube']['icon'] = 'youtube';
                        break;
                }
            }
            update_option('userpro_fields', $fields);
            update_option('userpro_pre_icons_setup', 1);
        }
    }

    /******************************************
     * If admin is checking notices
     ******************************************/
    function admin_user_notice($user_id)
    {

        if (userpro_get_option('admin_user_notices') && current_user_can('manage_options')) {
            return true;
        }

        return false;
    }

    /******************************************
     * Show user notices
     ******************************************/
    function user_notice_viewable($user_id)
    {

        if (userpro_get_option('show_user_notices') || ($user_id == get_current_user_id())) {
            return true;
        }
    }

    /******************************************
     * Has usermeta
     ******************************************/
    function has($field, $user_id)
    {

        $meta = get_user_meta($user_id, $field, true);
        if ($meta != '') {
            return true;
        }

        return false;
    }

    /******************************************
     * Get usermeta
     ******************************************/
    function get($field, $user_id)
    {

        return get_user_meta($user_id, $field, true);
    }

    /******************************************
     * Set usermeta
     ******************************************/
    function set($field, $value, $user_id)
    {

        if ($user_id != get_current_user_id() && !current_user_can('manage_options')) {
            die();
        }
        update_user_meta($user_id, $field, esc_attr($value));
    }

    /******************************************
     * Create uploads dir if does not exist
     ******************************************/
    function do_uploads_dir($user_id = 0)
    {

        if (empty($this->upload_base_dir)) {
            $this->setUploadDirectory();
        }

        if (!file_exists($this->upload_base_dir . '.htaccess')) {

            $data = <<<EOF
<Files ~ "\.txt$">
Order allow,deny
Deny from all
</Files>
EOF;

            file_put_contents($this->upload_base_dir . '.htaccess', $data);
        }

        if (!file_exists($this->upload_base_dir)) {
            @mkdir($this->upload_base_dir, 0777, true);
        }

        if ($user_id > 0) {// upload dir for a user
            if (!file_exists($this->upload_base_dir . $user_id . '/')) {
                @mkdir($this->upload_base_dir . $user_id . '/', 0777, true);
            }
        }
    }

    /******************************************
     * Get the proper uploads dir
     ******************************************/
    function get_uploads_dir($user_id = 0)
    {
        if ($user_id > 0) {
            return $this->upload_base_dir . $user_id . '/';
        }

        return $this->upload_base_dir;
    }

    /******************************************
     * Return the uploads URL
     ******************************************/
    function get_uploads_url($user_id = 0)
    {
        if ($user_id > 0) {
            return $this->upload_base_url . $user_id . '/';
        }

        return $this->upload_base_url;
    }

    /******************************************
     * Show social bar icons
     ******************************************/
    function show_social_bar($args, $user_id, $wrapper = null)
    {

        if ($args['show_social'] == 1) {
            userpro_profile_icons($args, $user_id, $wrapper);
        }
    }

    /******************************************
     * Integrate social bar without args
     ******************************************/
    function show_social_bar_clean($user_id, $wrapper = null)
    {

        userpro_profile_icons_noargs($user_id, $wrapper);
    }

    /******************************************
     * Can reset admin password or not
     ******************************************/
    function can_reset_pass($username)
    {

        if (userpro_is_admin(username_exists($username)) && userpro_get_option('reset_admin_pass') == 0) {
            return false;
        }

        return true;
    }

    /******************************************
     * from ID to member arg
     ******************************************/
    function id_to_member($user_id)
    {

        $res = '';
        $nice_url = userpro_get_option('permalink_type');
        $user = get_userdata($user_id);
        if ($nice_url == 'ID') {
            $res = $user_id;
        }
        if ($nice_url == 'username') {
            $res = $user->user_login;
        }
        if ($nice_url == 'name') {
            $res = $this->get_fullname_by_userid($user_id);
        }
        if ($nice_url == 'display_name') {
            $res = userpro_profile_data('display_name', $user_id);
        }
        if ($res != '') {
            return $res;
        }
    }

    /******************************************
     * Get full name of user by ID
     ******************************************/
    function get_fullname_by_userid($user_id)
    {

        $first_name = get_user_meta($user_id, 'first_name', true);
        $last_name = get_user_meta($user_id, 'last_name', true);
        $first_name = str_replace(' ', '_', $first_name);
        $last_name = str_replace(' ', '_', $last_name);
        $name = $first_name . '-' . $last_name;

        return $name;
    }

    /******************************************
     * Get full name (user friendly)
     ******************************************/
    function get_full_name($user_id)
    {

        $first_name = get_user_meta($user_id, 'first_name', true);
        $last_name = get_user_meta($user_id, 'last_name', true);
        $name = $first_name . ' ' . $last_name;

        return $name;
    }

    /******************************************
     * Get user ID only by query var
     ******************************************/
    function get_member_by_queryvar_from_id()
    {

        $arg = get_query_var('up_username');
        if ($arg) {
            $user = $this->get_member_by($arg);

            return $user->ID;
        }
    }

    /******************************************
     * Check that page exists
     ******************************************/
    function page_exists($id)
    {

        $page_data = get_page($id);
        if (isset($page_data->post_status)) {
            if ($page_data->post_status == 'publish') {
                return true;
            }
        }

        return false;
    }

    /******************************************
     * Get permalink for user
     ******************************************/
    function permalink($user_id = 0, $request = 'profile', $option = 'userpro_pages')
    {

        $pages = get_option($option);

        if (isset($pages[$request]) && $this->page_exists($pages[$request])) {
            $page_id = $pages[$request];
        } else {
            $default = get_option('userpro_pages');
            $page_id = $default['profile'];
        }
        if ($user_id > 0) {

            $user = get_userdata($user_id);
            $nice_url = userpro_get_option('permalink_type');
            if ($nice_url == 'ID') {
                $clean_user_login = $user_id;
            }
            if ($nice_url == 'username') {
                $clean_user_login = $user->user_login;

                $clean_user_login = str_replace(' ', '-', $clean_user_login);
            }
            if ($nice_url == 'name') {
                $clean_user_login = $this->get_fullname_by_userid($user_id);
            }
            if ($nice_url == 'display_name') {
                $clean_user_login = userpro_profile_data('display_name', $user_id);
                $clean_user_login = str_replace(' ', '-', $clean_user_login);
                $clean_user_login = urlencode($clean_user_login);
            }

            /* append permalink */
            if (get_option('permalink_structure') == '') {
                $link = add_query_arg('up_username', $clean_user_login, esc_url(get_page_link($page_id)));
            } else {
                $link = trailingslashit(trailingslashit(get_page_link($page_id)) . $clean_user_login);
            }
        } else {
            $link = get_page_link($page_id);
        }

        if ($request == 'view' || $request == 'profile') {
            $link = apply_filters('userpro_user_profile_url', $link, $user_id);
        }
        if ( class_exists('sitepress') ) {
            global $sitepress;
            if($sitepress->get_default_language() != $sitepress->get_current_language()){
                if(strpos($link, '?lang') !== false){
                    $link = str_replace('/?lang='.$sitepress->get_current_language(), '',$link);
                    return $link . '?lang='. $sitepress->get_current_language();
                }
                
            }
        }
        return $link;
    }

    /******************************************
     * Display name by arg
     ******************************************/
    function display_name_by_arg($arg)
    {

        $user = $this->get_member_by($arg);

        return userpro_profile_data('display_name', $user->ID);
    }

    /******************************************
     * Get clean member user from arg
     ******************************************/
    function get_member_by($arg, $force = 0)
    {

        if ($force) {

            $user = get_user_by('login', $arg);
        } elseif ($arg) {

            $nice_url = userpro_get_option('permalink_type');
            if ($nice_url == 'ID') {
                $user = get_userdata($arg);
            }

            if ($nice_url == 'username') {
                $arg = str_replace('-', ' ', $arg);
                $user = get_user_by('login', $arg);
                if (!$user) {
                    $arg = str_replace(' ', '-', $arg);
                    $user = get_user_by('login', $arg);
                }
                $user = get_user_by('login', $arg);
            }

            if ($nice_url == 'display_name') {

                $arg = str_replace('-', ' ', $arg);
                $arg = urldecode($arg);
                $args['meta_query'][] = [
                    'key' => 'display_name',
                    'value' => $arg,
                    'compare' => '=',
                ];
                $getUser = new WP_User_Query($args);
                if (isset($getUser->results) && isset($getUser->results[0])) {
                    $user = $getUser->results[0];
                } else {
                    $user = get_user_by('login', $arg);
                }
            }

            if ($nice_url == 'name') {
                $name = explode('-', $arg);

                $first_name = $name[0];
                $last_name = $name[1];

                $first_name = urldecode($first_name);
                $last_name = urldecode($last_name);

                $first_name = str_replace('_', ' ', $first_name);
                $last_name = str_replace('_', ' ', $last_name);

                $args['meta_query'][] = [
                    'key' => 'first_name',
                    'value' => $first_name,
                    'compare' => '=',
                ];
                $args['meta_query'][] = [
                    'key' => 'last_name',
                    'value' => $last_name,
                    'compare' => '=',
                ];
                $getUser = new WP_User_Query($args);
                if (isset($getUser->results) && isset($getUser->results[0])) {
                    $user = $getUser->results[0];
                }
            }
        }

        if (isset($user)) {
            return $user;
        }
    }

    /******************************************
     * Get nice username from url (user query var)
     ******************************************/
    function try_query_user($user_id)
    {

        $user = $this->get_member_by(get_query_var('up_username'));
        if ($user) {
            $user_id = $user->ID;
        }

        return $user_id;
    }

    /******************************************
     * Display short user bio
     ******************************************/
    function shortbio($userid, $length = 100, $fallback = null)
    {

        $desc = get_user_meta($userid, 'description', true);
        $desc = wp_strip_all_tags($desc);
        if (strlen($desc) > $length) {
            $desc = mb_substr($desc, 0, $length, "utf-8");
            $res = $desc . '...';
        } else {
            $res = $desc;
        }
        if (!$res && $fallback) {
            $res = $fallback;
        }

        return $res;
    }

    /******************************************
     * Show meta fields in member directory
     ******************************************/
    function meta_fields($fields, $user_id)
    {

        $res = '';
        $arr = explode(',', $fields);

        $excluded_fields = array('userpro_secret_key');

        foreach ($arr as $k) {
            if (in_array($k, $excluded_fields)) {
                continue;
            }

            if (!userpro_field_is_viewable_noargs($k, $user_id)) {
                continue;
            }
            if (get_user_meta($user_id, $k, true) != '') {
                $values[] = $k;
            }
        }

        if (isset($values) && is_array($values)) {
            $n = 1;
            foreach ($values as $n => $k) {

                $n++;
                if ($n == count($values)) {
                    $res .= userpro_profile_data_nicename($k, userpro_profile_data($k, $user_id));
                } else {
                    $res .= userpro_profile_data_nicename($k,
                            userpro_profile_data($k, $user_id)) . "&nbsp;&nbsp;/&nbsp;&nbsp;";
                }
            }
        }

        if (!$res) {
            $res = __('No available information', 'userpro');
        }

        return $res;
    }

    /******************************************
     * Can view other members
     ******************************************/
    function can_view_profile($arg = null)
    {
        $user_id = 0;
        $array = (array)userpro_get_option('roles_can_view_profiles');
        $array = array_merge($array, ['administrator']);

        if (userpro_is_logged_in()) {
            if ($arg) {
                $user = $this->get_member_by($arg);

                if ($user !== false && isset($user->ID)) {
                    $user_id = $user->ID;

                    if (get_current_user_id() == $user_id) {
                        return true;
                    }
                }
            }
        }

        if (userpro_get_option('allow_users_view_profiles') == 0 && userpro_is_logged_in() && $this->user_role_in_array(get_current_user_id(), $array)) {
            return true;
        }

        if (userpro_get_option('allow_users_view_profiles') == 0 && !current_user_can('manage_options')) {
            return false;
        }

        return true;
    }

    /******************************************
     * Check if requested user is the logged in user
     ******************************************/
    function is_user_logged_user($user_id)
    {

        if ($user_id == get_current_user_id()) {
            return true;
        }

        return false;
    }

    /******************************************
     * Viewing his own profile or not
     ******************************************/
    function viewing_his_profile()
    {

        $id = get_current_user_id();
        $logged_id = get_current_user_id();
        if (get_query_var('up_username')) {
            $id = $this->get_member_by_queryvar_from_id();
        }
        if ($logged_id && $id && ($logged_id == $id)) {
            return true;
        }

        return false;
    }

    /******************************************
     * Delete user
     ******************************************/
    function delete_user($user_id)
    {

        if (is_multisite()) {
            wpmu_delete_user($user_id);
        } else {
            wp_delete_user($user_id);
        }
    }

    /******************************************
     * Get verified account status for user
     ******************************************/
    function get_verified_status($user_id)
    {

        $field = get_user_meta($user_id, 'userpro_verified', true);
        if (userpro_is_admin($user_id)) {
            //return 1;
            return $field;
        } else {
            return $field;
        }
    }

    /******************************************
     * Check if user is blocked by admin or not
     ******************************************/
    function get_account_status($user_id)
    {

        $status = get_user_meta($user_id, 'userpro_account_status', true);
        if (userpro_is_admin($user_id)) {
            //return 1;
            return $status;
        } else {
            return $status;
        }
    }

    /******************************************
     * Make the link that user has to click to
     * become verified
     ******************************************/
    function accept_invite_to_verify($user_id)
    {

        $salt = get_user_meta($user_id, '_invite_verify', true);
        if ($salt != '' && strlen($salt) == 20 && $this->user_exists($user_id)) {
            $url = home_url() . '/';
            $url = add_query_arg('act', 'verified_invitation', $url);
            $url = add_query_arg('user_id', $user_id, $url);
            $url = add_query_arg('hash_secret', $salt, $url);

            return $url;
        }
    }

    /******************************************
     * Setup invitation verification
     ******************************************/
    function new_invitation_verify($user_id)
    {

        $hash = wp_generate_password($length = 20, $include_standard_special_chars = false);
        update_user_meta($user_id, '_invite_verify', $hash);
        userpro_mail($user_id, 'verifyinvite');
    }

    /******************************************
     * User already invited
     ******************************************/
    function invited_to_verify($user_id)
    {

        return get_user_meta($user_id, '_invite_verify', true);
    }

    /******************************************
     * Make a user verified
     ******************************************/
    function verify($user_id)
    {
        if (!current_user_can('manage_options')) {
            return;
        }

        $user_id = intval($user_id);

        // verify him
        update_user_meta($user_id, 'userpro_verified', 1);
        update_user_meta($user_id, 'userpro_verified_date', current_time('Y-m-d'));
        delete_user_meta($user_id, 'userpro_verification');
        delete_user_meta($user_id, '_invite_verify');

        // send him a notification
        if (userpro_get_option('notify_user_verified')) {
            userpro_mail($user_id, 'accountverified');
        }

        $role = userpro_get_option('upgrade_role_after_verfied');
        if (isset($role) && $role != 'none') {
            if (!is_super_admin($user_id)) {
                $user = new WP_User($user_id);
                $user->role = $role;
                wp_update_user($user);
            }
        }
        do_action('userpro_after_user_verify', $user_id);
    }

    /******************************************
     * Make a user unverified
     ******************************************/
    function unverify($user_id)
    {

        // verified (unverify him)
        if (userpro_get_option('notify_user_unverified') && $this->get_verified_status($user_id) == 1) {
            userpro_mail($user_id, 'accountunverified');
        }

        // make user unverified and delete his request
        update_user_meta($user_id, 'userpro_verified', 0);
        delete_user_meta($user_id, 'userpro_verification');

        // remove his verify request
        $requests = get_option('userpro_verify_requests');
        if (isset($requests) && is_array($requests)) {
            foreach ($requests as $k => $id) {
                if ($id == $user_id) {
                    unset($requests[$k]);
                }
            }
            update_option('userpro_verify_requests', $requests);
        }

        do_action('userpro_after_user_unverify', $user_id);
    }

    /******************************************
     * Make an account blocked
     ******************************************/
    function block_account($user_id)
    {

        // Block user
        update_user_meta($user_id, 'userpro_account_status', 1);
        $this->clear_cache();
        userpro_mail($user_id, 'accountblocked');
        do_action('userpro_after_account_blocked', $user_id);
    }

    /******************************************
     * Make an account unblocked
     ******************************************/
    function unblock_account($user_id)
    {

        // Unblock user
        update_user_meta($user_id, 'userpro_account_status', 0);
        $this->clear_cache();
        userpro_mail($user_id, 'accountunblocked');
        do_action('userpro_after_account_unblocked', $user_id);
    }

    /******************************************
     * Checks if user can request verification
     ******************************************/
    function request_verification($user_id)
    {

        if (userpro_get_option('allow_users_verify_request') && $this->get_verified_status($user_id) != 1 && !$this->request_verification_pending($user_id) && $user_id == get_current_user_id()) {
            return true;
        }

        return false;
    }

    /******************************************
     * Checks if the verification is pending
     ******************************************/
    function request_verification_pending($user_id)
    {

        $status = get_user_meta($user_id, 'userpro_verification', true);
        if ($status == 'pending') {
            return true;
        }

        return false;
    }

    /******************************************
     * Make a verification request for user
     ******************************************/
    function new_verification_request($username)
    {

        $user = $this->get_member_by($username);
        update_user_meta($user->ID, 'userpro_verification', 'pending');
        $requests = get_option('userpro_verify_requests');
        $requests[] = $user->ID;
        update_option('userpro_verify_requests', $requests);
        userpro_mail($user->ID, 'verifyuser');
    }

    /******************************************
     * Set user's role based on ID, role
     ******************************************/
    function set_role($user_id, $role)
    {

        $wp_user_object = new WP_User($user_id);

        $wp_user_object->set_role($role);
    }

    /******************************************
     * Get user's role based on ID, role
     ******************************************/
    function get_role_nice($user)
    {

        $user_roles = $user->roles;
        if (isset($user_roles) && is_array($user_roles)) {
            $user_role = array_shift($user_roles);

            return userpro_user_role($user_role);
        }

        return '';
    }

    /******************************************
     * Assign default role after registration
     ******************************************/
    function default_role($user_id, $form = null)
    {

        $default_role = userpro_get_option('default_role');

        $form['role'] = empty($form['role']) ? $default_role : $form['role'];

        $form['form_role'] = empty($form['form_role']) ? $default_role : $form['form_role'];

        if ($form['form_role'] == 'administrator') {

            $form['form_role'] = $default_role;
        }
        if ($form['role'] == 'administrator') {

            $form['role'] = $default_role;
        }
        if (isset($form['form_role'])) {

            $this->set_role($user_id, $form['form_role']);
        } else {
            if (!empty($_SESSION['form_role']) && $_SESSION['form_role'] != 'administrator') {
                $this->set_role($user_id, $_SESSION['form_role']);
            } else {

                if ($default_role && !isset($form['role'])) {

                    $this->set_role($user_id, $default_role);
                }
            }
        }
    }

    /******************************************
     * Returns 1/0 for new_user connected profiles
     ******************************************/
    function is_facebook_user($user_id)
    {

        $fbid = get_user_meta($user_id, 'userpro_facebook_id', true);
        if ($fbid) {
            return true;
        }

        return false;
    }

    /******************************************
     * Returns 1/0 for Twitter connected profiles
     ******************************************/
    function is_twitter_user($user_id)
    {

        $twitter_id = get_user_meta($user_id, 'twitter_oauth_id', true);
        if ($twitter_id) {
            return true;
        }

        return false;
    }

    /******************************************
     * Returns 1/0 for Google connected profiles
     ******************************************/
    function is_google_user($user_id)
    {

        $google_id = get_user_meta($user_id, 'userpro_google_id', true);
        if ($google_id) {
            return true;
        }

        return false;
    }

    /******************************************
     * Returns 1/0 for Linkedin connected profiles
     ******************************************/
    function is_linkedin_user($user_id)
    {
        $linkedin_id = get_user_meta($user_id, 'userpro_linkedin_id', true);
        if ($linkedin_id) {
            return true;
        }

        return false;
    }

    function is_instagram_user($user_id)
    {
        $instagram_id = get_user_meta($user_id, 'userpro_instagram_id', true);
        if ($instagram_id) {
            return true;
        }

        return false;
    }

    /******************************************
     * Default display name
     ******************************************/
    function set_default_display_name($user_id, $username)
    {

        $display_name = $username;
        if ($this->display_name_exists($display_name)) {
            $display_name = $this->unique_display_name($display_name);
        }

        wp_update_user(['ID' => $user_id, 'display_name' => $display_name]);
        update_user_meta($user_id, 'display_name', $display_name);
    }

// update user profile from instagram

    function userpro_update_profile_via_instagram($user_id, $array)
    {

        global $userpro;

        $id = (isset($array['id'])) ? $array['id'] : 0;
        $name = (isset($array['full_name'])) ? $array['full_name'] : '';

        if (userpro_is_logged_in() && ($user_id != get_current_user_id()) && !current_user_can('manage_options')) {
            die();
        }

        if ($id) {
            update_user_meta($user_id, 'userpro_instagram_id', $id);
        }

        if (isset($name)) {
            update_user_meta($user_id, 'first_name', $name);
        }
    }

    /* Update user profile from twitter */
    function userpro_update_profile_via_linkedin($user_id, $array)
    {

        global $userpro;
        $id = (isset($array['id'])) ? $array['id'] : 0;
        $firstName = (isset($array['firstName']['localized']['en_US'])) ? $array['firstName']['localized']['en_US'] : '';
        $lastName = (isset($array['lastName']['localized']['en_US'])) ? $array['lastName']['localized']['en_US'] : '';
        $location = (isset($array['location']['name'])) ? $array['location']['name'] : '';
        $profile_picture = (isset($array['pictureUrls']['values'][0])) ? $array['pictureUrls']['values'][0] : '';

        if (userpro_is_logged_in() && ($user_id != get_current_user_id()) && !current_user_can('manage_options')) {
            die();
        }

        if ($id) {
            update_user_meta($user_id, 'userpro_linkedin_id', $id);
        }

        if (isset($firstName)) {
            update_user_meta($user_id, 'first_name', $firstName);
        }

        if (isset($lastName)) {
            update_user_meta($user_id, 'last_name', $lastName);
        }

        if (isset($location)) {
            update_user_meta($user_id, 'country', $location);
        }

        do_action('userpro_after_profile_updated_linkedin');
    }

    /* Update user profile from twitter */
    function userpro_update_profile_via_twitter($user_id, $array)
    {

        global $userpro;

        $image = [];

        $id = (isset($array['id'])) ? $array['id'] : 0;
        $screen_name = (isset($array['screen_name'])) ? $array['screen_name'] : 0;
        $location = (isset($array['location'])) ? $array['location'] : 0;
        $email = (isset($array['email'])) ? $array['email'] : 0;
        $url = (isset($array['url'])) ? $array['url'] : 0;
        $description = (isset($array['description'])) ? $array['description'] : 0;

        if (userpro_is_logged_in() && ($user_id != get_current_user_id()) && !current_user_can('manage_options')) {
            die();
        }

        if ($id) {
            update_user_meta($user_id, 'twitter_oauth_id', $id);
        }

        if ($screen_name) {
            update_user_meta($user_id, 'twitter', 'http://twitter.com/' . $screen_name);
        }

        /* begin display name */
        if ($screen_name) {
            $display_name = $screen_name;
        }

        if ($display_name) {
//			if ($userpro->display_name_exists($display_name)) {
//				$display_name = $userpro->unique_display_name($display_name);
//			}
            $display_name = $userpro->remove_denied_chars($display_name);
            wp_update_user(['ID' => $user_id, 'display_name' => $display_name]);
            update_user_meta($user_id, 'display_name', $display_name);
        }
        /* end display name */

        if ($location) {
            update_user_meta($user_id, 'country', $location);
        }

        if ($url) {
            wp_update_user(['ID' => $user_id, 'user_url' => $url]);
            update_user_meta($user_id, 'user_url', $url);
        }

        if ($description) {
            update_user_meta($user_id, 'description', $description);
        }

        do_action('userpro_after_profile_updated_twitter');
    }

    /******************************************
     * Create a new user
     ******************************************/
    function new_user($user_login, $user_password, $user_email, $form, $type, $approved = 1)
    {

        global $wpdb;

        $errors = new WP_Error();

        $user_id = wp_insert_user([
            'user_login' => sanitize_user($user_login, true),
            'user_pass' => $user_password,
            'display_name' => sanitize_user($user_login, true),
            'user_email' => $user_email,
        ]);
        add_filter('send_password_change_email', '__return_false');
        if (is_wp_error($user_id) || empty($user_id)) {
            /* @todo: Manage error conditions */
            $errors->add('registerfail',
                sprintf(__('<strong>ERROR</strong>: Couldn&#8217;t register you. Please contact the webmaster.',
                    'userpro')));

            return $errors;
        }

        $this->default_role($user_id, $form);

        if ($type == 'standard') {

            $this->set_default_display_name($user_id, $user_login);
        }
        if ($type == 'facebook') {
            userpro_update_profile_via_facebook($user_id, $form);
            $this->facebook_save_profile_pic($user_id, $form['profilepicture']);
        } elseif ($type == 'twitter') {
            $this->userpro_update_profile_via_twitter($user_id, $form);
            $this->twitter_save_profile_pic($user_id, $form);
        } elseif ($type == 'linkedin') {
            $this->userpro_update_profile_via_linkedin($user_id, $form);

            if(!empty($form['pictureUrls']['values'][0]))
            $this->linkedin_save_profile_pic($user_id, $form);

        } elseif ($type == 'instagram') {
            $this->instagram_save_profile_pic($user_id, $form);
            $this->userpro_update_profile_via_instagram($user_id, $form);
        } elseif ($type == 'google') {
            userpro_update_profile_via_google($user_id, $form);
            $this->google_save_profile_pic($user_id, $form);
        } else {
            userpro_update_user_profile($user_id, $form, $action = 'new_user');
        }
        if ($approved == 1) {
            userpro_mail($user_id, 'newaccount', $user_password, $form);
            do_action('userpro_after_new_registration', $user_id);
        }

        return $user_id;
    }

    /******************************************
     * Get the user profile data
     ******************************************/
    function extract_profile_for_mail($user_id, $form)
    {

        $output = '';
        $customfieldarray = [];
        foreach ($form as $k => $v) {
            if ($this->field_label($k) != '' && !strstr($k, 'pass')) {
                $val = userpro_profile_data($k, $user_id);
                if ($k == 'gender') {
                    $val = userpro_profile_data_nicename($k, userpro_profile_data($k, $user_id));
                }
                if (is_array($val)) {
                    $val = implode(', ', $val);
                }
                $output .= $this->field_label($k) . ': ' . $val . "\r\n";
                $customfieldarray['{USERPRO_' . $k . '}'] = $val;
            }
        }

        return ['output' => $output, 'custom_fields' => $customfieldarray];
    }

    /******************************************
     * Return true or false if user can view the
     * private content or not
     ******************************************/
    function can_view_private_content($restrict_to_verified = null, $restrict_to_roles = null)
    {
        if (!userpro_is_logged_in()) {
            return '-1';
        } else {
            if (userpro_get_option('restricted_page_verified') == "1" && $this->get_verified_status(get_current_user_id())) {
                $user = get_userdata(get_current_user_id());
                $user_role = array_shift($user->roles);

                if (($restrict_to_verified == 1 && $this->get_verified_status(get_current_user_id())) ||
                    ($restrict_to_roles != '' && in_array($user_role, explode(',', $restrict_to_roles))) ||
                    (!$restrict_to_verified && !$restrict_to_roles)
                ) {
                    return '1';
                } else {
                    return '-2';
                }
            } else {
                if (userpro_get_option('restricted_page_verified') == "0") {
                    $user = get_userdata(get_current_user_id());
                    $user_role = array_shift($user->roles);

                    if (($restrict_to_verified == 1 && $this->get_verified_status(get_current_user_id())) ||
                        ($restrict_to_roles != '' && in_array($user_role, explode(',', $restrict_to_roles))) ||
                        (!$restrict_to_verified && !$restrict_to_roles)
                    ) {
                        return '1';
                    } else {
                        return '-2';
                    }
                }
            }
        }
    }

    /******************************************
     * Manual display for facebook login button
     ******************************************/
    function facebook_login($args = [])
    {

        return userpro_facebook_connect_manual($args);
    }

    /******************************************
     * Move file to user directory
     ******************************************/
    function move_file($user_id, $file, $destination)
    {

        file_put_contents($this->get_uploads_dir($user_id) . $destination, file_get_contents($file));
    }

    /******************************************
     * Save a photo from google to profile
     ******************************************/
    function google_save_profile_pic($user_id, $form)
    {

        $this->do_uploads_dir($user_id);

        if ($form['image']['url']) {
            $form['image']['url'] = str_replace('?sz=50', '', $form['image']['url']);
            $unique_id = uniqid();
            $this->move_file($user_id, $form['image']['url'], $unique_id . '.jpg');
            update_user_meta($user_id, 'profilepicture', $this->get_uploads_url($user_id) . $unique_id . '.jpg');
        }
    }

    /******************************************
     * Save a photo from twitter to profile
     ******************************************/
    function twitter_save_profile_pic($user_id, $form)
    {

        $this->do_uploads_dir($user_id);

        if ($form['profile_image_url']) {

            $form['profile_image_url'] = str_replace('_normal', '', $form['profile_image_url']);
            $unique_id = uniqid();
            $this->move_file($user_id, $form['profile_image_url'], $unique_id . '.jpg');
            update_user_meta($user_id, 'profilepicture', $this->get_uploads_url($user_id) . $unique_id . '.jpg');
        }
    }

    /******************************************
     * Save user profile picture from facebook
     ******************************************/
    function facebook_save_profile_pic($user_id, $profilepicture, $method = null)
    {

        $method = userpro_get_option('picture_save_method');
        $unique_id = uniqid();

        update_user_meta($user_id, 'facebook_pic_url', $profilepicture);
        if ($method == 'internal') {

            $this->do_uploads_dir($user_id);
            $this->move_file($user_id, $profilepicture, $unique_id . '.jpg');
            update_user_meta($user_id, 'profilepicture', $this->get_uploads_url($user_id) . $unique_id . '.jpg');
        } else {

            update_user_meta($user_id, 'profilepicture', $profilepicture);
        }
    }

    /******************************************
     * Save user profile picture from Instagram
     ******************************************/
    function instagram_save_profile_pic($user_id, $profilepicture, $method = null)
    {

        $profile_picture = $profilepicture['profile_picture'];
        $method = userpro_get_option('picture_save_method');
        $unique_id = uniqid();
        update_user_meta($user_id, 'instagram_pic_url', $profile_picture);
        if ($method == 'internal') {

            $this->do_uploads_dir($user_id);
            $this->move_file($user_id, $profile_picture, $unique_id . '.jpg');
            update_user_meta($user_id, 'profilepicture', $this->get_uploads_url($user_id) . $unique_id . '.jpg');
        } else {

            update_user_meta($user_id, 'profilepicture', $profile_picture);
        }
    }

    function linkedin_save_profile_pic($user_id, $profilepicture, $method = null)
    {

        $profile_picture = $profilepicture['pictureUrls']['values'][0];

        $method = userpro_get_option('picture_save_method');
        $unique_id = uniqid();
        update_user_meta($user_id, 'linkedin_pic_url', $profile_picture);
        if ($method == 'internal') {

            $this->do_uploads_dir($user_id);
            $this->move_file($user_id, $profile_picture, $unique_id . '.jpg');
            update_user_meta($user_id, 'profilepicture', $this->get_uploads_url($user_id) . $unique_id . '.jpg');
        } else {

            update_user_meta($user_id, 'profilepicture', $profile_picture);
        }
    }

    /******************************************
     * Initial search results
     ******************************************/
    function memberlist_in_search_mode($args)
    {

        if (isset($args['turn_off_initial_results']) && (!isset($_GET['searchuser']) && !isset($_GET['emd-search']))) {
            return false;
        }

        return true;
    }

    /******************************************
     * Online users count
     ******************************************/
    function online_users_count($count)
    {

        if ($count == 1) {
            return sprintf(__('There are %s user online on the site.', 'userpro'), $count);
        } else {
            return sprintf(__('There are %s users online on the site.', 'userpro'), $count);
        }
    }

    function connection($user_id)
    {

        $userids = get_user_meta($user_id, '_userpro_users_request', true);

        return $userids;
    }

    function connetions_count($user_id)
    {

        $arr = get_user_meta($user_id, '_userpro_connected_userlist', true);
        if (is_array($arr) && !empty($arr)) {
            $count = count($arr);
        } else {
            $count = 0;
        }
        $count = number_format_i18n($count);
        if ($count == 1) {
            return sprintf(__('<span>%s</span> Connection', 'userpro'), $count);
        } else {
            return sprintf(__('<span>%s</span> Connections', 'userpro'), $count);
        }
    }

    function up_enqueue_scripts_styles()
    {
        /* CSS */
        /* lightview */
        if (userpro_get_option('lightbox')) {
            wp_register_style('userpro_lightview', userpro_url . 'css/lightview/lightview.css');
            wp_enqueue_style('userpro_lightview');
        }

        if (!userpro_get_option('rtl')) {
            $css = 'css/userpro.min.css';
        } else {
            $css = 'css/userpro-rtl.min.css';
        }
        wp_register_style('userpro_min', userpro_url . $css);
        wp_enqueue_style('userpro_min');

        wp_enqueue_style('userpro_jquery_ui_style', userpro_url . 'css/userpro-jquery-ui.css');

        if (userpro_get_option('lightbox')) {
            wp_register_script('userpro_swf', userpro_url . 'scripts/swfobject.js', '', '', true);
            wp_enqueue_script('userpro_swf');

            wp_register_script('userpro_spinners', userpro_url . 'scripts/spinners/spinners.min.js', '', '', true);
            wp_enqueue_script('userpro_spinners');

            wp_register_script('userpro_lightview', userpro_url . 'scripts/lightview/lightview.js', '', '', true);
            wp_enqueue_script('userpro_lightview');
        }

        wp_register_script('userpro_min', userpro_url . 'scripts/scripts.min.js', '', '', true);

        wp_localize_script( 'userpro_min', 'USER_PRO_DATA', array(
            'ajaxurl' => admin_url( 'admin-ajax.php' ),
            'nonce' => wp_create_nonce( 'user_pro_nonce' )
        ) );

        wp_enqueue_script('userpro_min');

        wp_localize_script( 'ajax-userpro_min', 'userpro_scripts',
            array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );

        $userpro_limit_categories = userpro_get_option('limit_categories');

        wp_localize_script('userpro_min', 'userpro_frontend_publisher_data', [
            'userpro_limit_categories' => $userpro_limit_categories,
            'correction_text' => __('Please correct fields', 'userpro'),
        ]);

        wp_register_script('performance', userpro_url . 'scripts/performance.js', '', '', true);
        wp_enqueue_script('performance');
        if (userpro_get_option('userpro_enable_webcam')) {
            wp_enqueue_script('up-webcam-js', userpro_url . 'scripts/webcam.min.js', '', '', true);

        }

//		wp_enqueue_script('userpro_encrypt_js', userpro_url . 'scripts/userpro.encrypt.js', '', '', TRUE);
        ///////////////

    }

    /******************** Get connection count *****************/

    function get_connection_count($user_id = 0)
    {

        $connections = get_user_meta($user_id, '_userpro_connected_userlist', true);
        if (!empty($connections)) {
            return count($connections);
        }

        return 0;
    }

    /******************************************
     * Make username unique
     ******************************************/
    function unique_user($service = null, $form = null)
    {

        if ($service) {
            if ($service == 'google') {
                if (isset($form['name']) && is_array($form['name'])) {
                    $name = $form['name']['givenName'] . ' ' . $form['name']['familyName'];
                    $username = $this->clean_user($name);
                } elseif (isset($form['displayName']) && !empty($form['displayName'])) {
                    $username = $this->clean_user($form['displayName']);
                } else {
                    $username = $form['id'];
                }
            }
            if ($service == 'twitter') {
                if (isset($form['screen_name']) && !empty($form['screen_name'])) {
                    $username = $form['screen_name'];
                }
            }
            if ($service == 'vk') {
                if (isset($form['screen_name']) && !empty($form['screen_name'])) {
                    $username = $form['screen_name'];
                } else {
                    $username = $form['uid'];
                }
            }
        }

        // make sure username is unique
        if (username_exists($username)) {
            $r = str_shuffle("0123456789");
            $r1 = (int)$r[0];
            $r2 = (int)$r[1];
            $username = $username . $r1 . $r2;
        }
        if (username_exists($username)) {
            $r = str_shuffle("0123456789");
            $r1 = (int)$r[0];
            $r2 = (int)$r[1];
            $username = $username . $r1 . $r2;
        }

        return $username;
    }

}
