function merge_fields($user)
 {
     global $wpdb;
     // create
     if (!is_object($user)) {
         $user = new stdClass();
     }
     // merge defaults
     foreach ($this->_default_fields() as $field => $value) {
         // if not set
         if (!isset($user->{$field})) {
             // set
             $user->{$field} = $this->{$field};
         }
     }
     // merge custom fields
     // take acive fields, this will eradicate possibility of different set of custom fields active at different times
     // default
     $custom_fields = mgm_get_class('member_custom_fields')->get_fields_where(array('display' => array('on_register' => true, 'on_profile' => true)));
     // loop
     foreach ($custom_fields as $field) {
         // if not set in main object
         if (!isset($user->{$field}['name'])) {
             // if set in object
             if (isset($this->custom_fields->{$field}['name'])) {
                 $user->{$field}['name'] = $this->custom_fields->{$field}['name'];
             } else {
                 // default
                 $user->{$field}['name'] = 'N/A';
             }
         }
     }
     // from meta
     $profile_fields = mgm_get_config('default_profile_fields', array());
     //mgm_log('default_profile_fields : '.mgm_array_dump($profile_fields,true));
     // loop rest
     foreach (get_object_vars($this) as $field => $value) {
         // skip some
         if (in_array($field, array('id', 'code', 'name', 'description', 'saving'))) {
             continue;
         }
         // loop
         foreach ($profile_fields as $p_field => $p_field_options) {
             if (method_exists($user, 'exists')) {
                 if (!$user->exists()) {
                     continue;
                 }
                 if ($user->has_prop($wpdb->prefix . $p_field)) {
                     // Blog specific
                     $result = $user->get($wpdb->prefix . $p_field);
                 } elseif ($user->has_prop($p_field)) {
                     // User specific and cross-blog
                     $result = $user->get($p_field);
                 } else {
                     $result = false;
                 }
                 if ($result) {
                     $user->{$p_field} = $result;
                 }
             }
             // option
             //if($p_field_value = get_user_option($p_field, $user->ID)){
             //$user->$p_field = $p_field_value;
             //}
         }
         // if not set
         if (!isset($user->{$field}) && $field != 'custom_fields') {
             // string value
             if (is_string($value)) {
                 // strip _mgm
                 $value = str_replace('mgm_', '', $value);
                 // set
                 $user->{$field} = $value;
             } else {
                 if (is_object($value)) {
                     // object value
                     // loop
                     foreach (get_object_vars($value) as $field2 => $value2) {
                         // only take first level
                         if (is_string($value2)) {
                             // strip _mgm
                             $value2 = str_replace('mgm_', '', $value2);
                             $field2 = $field . '_' . $field2;
                             // set
                             $user->{$field2} = $value2;
                         }
                     }
                 }
             }
         }
     }
     // return
     return $user;
 }
/**
 * validate and save profile data
 *
 * @param int user id
 * @return int user id
 */
function mgm_user_profile_update($user_id)
{
    global $wpdb;
    // get user
    if ($user_id > 0) {
        $user_data = get_userdata($user_id);
    }
    // error
    if (!$user_data->ID) {
        return $user_id;
    }
    // flag to control callback re calling via hooks clash, iss#705
    define('MGM_DOING_USERS_PROFILE_UPDATE', TRUE);
    // set aside member object
    $member = mgm_get_member($user_id);
    // create empty user
    $user = new stdClass();
    // set id
    $user->ID = $user_data->ID;
    // sanitize user login
    if (isset($_POST['user_login'])) {
        $user->user_login = sanitize_user($_POST['user_login'], true);
    }
    // asnitize email and copy
    if (isset($_POST['user_email'])) {
        $user->user_email = sanitize_text_field($_POST['user_email']);
    }
    // urls
    if (isset($_POST['mgm_profile_field']['url'])) {
        if (empty($_POST['mgm_profile_field']['url']) || $_POST['mgm_profile_field']['url'] == 'http://') {
            $user->user_url = '';
        } else {
            $user->user_url = esc_url_raw($_POST['mgm_profile_field']['url']);
            $user->user_url = preg_match('/^(https?|ftps?|mailto|news|irc|gopher|nntp|feed|telnet):/is', $user->user_url) ? $user->user_url : 'http://' . $user->user_url;
        }
    }
    if (isset($_POST['mgm_profile_field']['first_name'])) {
        $user->first_name = sanitize_text_field($_POST['mgm_profile_field']['first_name']);
    }
    if (isset($_POST['mgm_profile_field']['last_name'])) {
        $user->last_name = sanitize_text_field($_POST['mgm_profile_field']['last_name']);
    }
    if (isset($_POST['mgm_profile_field']['nickname'])) {
        $user->nickname = sanitize_text_field($_POST['mgm_profile_field']['nickname']);
    }
    if (isset($_POST['mgm_profile_field']['display_name'])) {
        $user->display_name = sanitize_text_field($_POST['mgm_profile_field']['display_name']);
    }
    if (isset($_POST['mgm_profile_field']['description'])) {
        $user->description = trim($_POST['mgm_profile_field']['description']);
    }
    // init errors
    $errors = new WP_Error();
    // check user login
    if (isset($_POST['user_login']) && !validate_username($_POST['user_login'])) {
        $errors->add('user_login', __('<strong>ERROR</strong>: This username is invalid because it uses illegal characters. Please enter a valid username.', 'mgm'));
    }
    // user login duplicate
    if (($owner_id = username_exists($user->user_login)) && $owner_id != $user->ID) {
        $errors->add('user_login', __('<strong>ERROR</strong>: This username is already registered. Please choose another one.', 'mgm'));
    }
    // nickname
    //!isset( $_POST['mgm_profile_field']['nickname'] ) || - issue #1207
    if (isset($_POST['mgm_profile_field']['nickname']) && empty($_POST['mgm_profile_field']['nickname'])) {
        $errors->add('nickname', __('<strong>ERROR</strong>: You must provide a Nick Name.', 'mgm'));
    }
    // email - issue #1207
    if (isset($_POST['user_email']) && empty($user->user_email)) {
        $errors->add('empty_email', __('<strong>ERROR</strong>: Please enter an e-mail address.', 'mgm'), array('form-field' => 'email'));
    } elseif (isset($_POST['user_email']) && !is_email($user->user_email)) {
        $errors->add('invalid_email', __('<strong>ERROR</strong>: The e-mail address isn&#8217;t correct.', 'mgm'), array('form-field' => 'email'));
    } elseif (isset($_POST['user_email']) && ($owner_id = email_exists($user->user_email)) && $owner_id != $user->ID) {
        $errors->add('email_exists', __('<strong>ERROR</strong>: This email is already registered, please choose another one.', 'mgm'), array('form-field' => 'email'));
    }
    // password:
    $pass1 = $pass2 = '';
    if (isset($_POST['user_password'])) {
        $pass1 = sanitize_text_field($_POST['user_password']);
    }
    if (isset($_POST['user_password_conf'])) {
        $pass2 = sanitize_text_field($_POST['user_password_conf']);
    }
    /* checking the password has been typed twice */
    do_action_ref_array('check_passwords', array($user->user_login, &$pass1, &$pass2));
    //issue #1207
    if (isset($_POST['user_password']) && isset($_POST['user_password_conf'])) {
        if (empty($pass1) && !empty($pass2)) {
            $errors->add('pass', __('<strong>ERROR</strong>: You entered your new password only once.', 'mgm'), array('form-field' => 'pass1'));
        } elseif (!empty($pass1) && empty($pass2)) {
            $errors->add('pass', __('<strong>ERROR</strong>: You entered your new password only once.', 'mgm'), array('form-field' => 'pass2'));
        }
    }
    /* Check for "\" in password */
    //issue #1207
    if (isset($_POST['user_password']) && isset($_POST['user_password_conf'])) {
        if (false !== strpos(stripslashes($pass1), "\\")) {
            $errors->add('pass', __('<strong>ERROR</strong>: Passwords may not contain the character "\\".', 'mgm'), array('form-field' => 'pass1'));
        }
    }
    // get default fields
    $profile_fields = mgm_get_config('default_profile_fields', array());
    // get active custom fields on profile page
    $cf_profile_page = mgm_get_class('member_custom_fields')->get_fields_where(array('display' => array('on_profile' => true)));
    //init - issue #1573
    $show_membership_fields_arr = array();
    if (isset($_REQUEST['membership']) && !empty($_REQUEST['membership'])) {
        // membership
        $membership = $_REQUEST['membership'];
        // get active custom fields on register
        $cf_profile_by_membership_types = mgm_get_class('member_custom_fields')->get_fields_where(array('attributes' => array('profile_by_membership_types' => true)));
        //mgm_pr($cf_profile_by_membership_types);
        //check
        if (!empty($cf_profile_by_membership_types)) {
            //loop
            foreach ($cf_profile_by_membership_types as $cf_profile_by_membership_type) {
                //membership_type
                $membership_types_string = $cf_profile_by_membership_type['attributes']['profile_membership_types_field_alias'];
                //check
                if (preg_match('/\\b' . $membership . '\\b/', $membership_types_string)) {
                    $show_fields_arr[] = $cf_profile_by_membership_type['name'];
                    $show_membership_fields_arr[] = $cf_profile_by_membership_type;
                    if ($cf_profile_by_membership_type['name'] == 'password') {
                        foreach ($cf_profile_by_membership_types as $cf_profile_by_membership) {
                            if ($cf_profile_by_membership['name'] == 'password_conf') {
                                $show_membership_fields_arr[] = $cf_profile_by_membership;
                            }
                        }
                    }
                }
            }
        }
    }
    //merge - issue #1573
    if (isset($show_membership_fields_arr) && is_array($show_membership_fields_arr) && !empty($show_membership_fields_arr)) {
        $cf_profile_page = array_merge($cf_profile_page, $show_membership_fields_arr);
    }
    //Profile page password filed is default .#issue 799
    $falg = 0;
    $pass_field = '';
    foreach ($cf_profile_page as $field) {
        if ($field['name'] == 'password') {
            $falg = 1;
            //issue #973
            $pass_field = $field;
        }
    }
    if ($falg == 0) {
        $cf_profile_page[] = array('name' => 'password', 'label' => 'Password', 'type' => 'password', 'system' => 1);
    }
    //issue #973 & issue #1207
    if (isset($_POST['user_password']) && isset($_POST['user_password_conf']) && !empty($pass1) && !empty($pass2) && (isset($pass_field['attributes']['password_min_length']) && $pass_field['attributes']['password_min_length'] == true) || isset($pass_field['attributes']['password_max_length']) && $pass_field['attributes']['password_max_length'] == true) {
        if (strlen($pass1) < $pass_field['attributes']['password_min_length_field_alias'] || strlen($pass2) < $pass_field['attributes']['password_min_length_field_alias']) {
            $errors->add('pass', sprintf(__('<strong>ERROR</strong>:Password is too short, minimum %d characters.', 'mgm'), $pass_field['attributes']['password_min_length_field_alias']), array('form-field' => 'pass1'));
        } elseif (strlen($pass1) > $pass_field['attributes']['password_max_length_field_alias'] || strlen($pass2) > $pass_field['attributes']['password_max_length_field_alias']) {
            $errors->add('pass', sprintf(__('<strong>ERROR</strong>:Password is too long, minimum %d characters.', 'mgm'), $pass_field['attributes']['password_max_length_field_alias']), array('form-field' => 'pass1'));
        } elseif ($pass1 != $pass2) {
            $errors->add('pass', __('<strong>ERROR</strong>: Please enter the same password in the two password fields.', 'mgm'), array('form-field' => 'pass1'));
        }
    } elseif (isset($_POST['user_password']) && isset($_POST['user_password_conf']) && $pass1 != $pass2) {
        $errors->add('pass', __('<strong>ERROR</strong>: Please enter the same password in the two password fields.', 'mgm'), array('form-field' => 'pass1'));
    }
    // confirm email - issue #1315
    if (isset($_POST['user_email_conf']) && empty($_POST['user_email_conf'])) {
        $errors->add($field['name'], __('<strong>ERROR</strong>: Please type your confirm e-mail address.', 'mgm'));
    } elseif (isset($_POST['user_email_conf']) && !is_email($_POST['user_email_conf'])) {
        $errors->add('invalid_email_conf', __('<strong>ERROR</strong>: The confirm email address isn&#8217;t correct.', 'mgm'));
    } elseif (isset($_POST['user_email_conf']) && is_email($_POST['user_email']) && $_POST['user_email_conf'] != $_POST['user_email']) {
        $errors->add($field['name'], __('<strong>ERROR</strong>: E-mail does not match. Please re-type.', 'mgm'));
    }
    //issue #1207
    $m_pass = '';
    // set
    if (!empty($pass1) || !empty($pass2)) {
        if (!empty($pass1) && !empty($pass2)) {
            $user->user_pass = wp_hash_password($pass1);
            $m_pass = $pass1;
        } elseif (!empty($pass1)) {
            $user->user_pass = wp_hash_password($pass1);
            $m_pass = $pass1;
        } else {
            $user->user_pass = wp_hash_password($pass2);
            $m_pass = $pass2;
        }
        //issue #703
        //$user->user_pass = $pass1;
        $member->user_password = mgm_encrypt_password($m_pass, $user->ID);
    }
    // loop
    foreach ($cf_profile_page as $field) {
        // skip default fields, validated already
        if (in_array($field['name'], array('username', 'email', 'password', 'password_conf', 'email_conf'))) {
            continue;
        }
        // skip html
        if ($field['type'] == 'html' || $field['type'] == 'label') {
            continue;
        }
        // check register and required
        if ((bool) $field['attributes']['required'] === true) {
            // error
            $error_codes = $errors->get_error_codes();
            // validate other
            if (!isset($_POST['mgm_profile_field'][$field['name']]) || empty($_POST['mgm_profile_field'][$field['name']])) {
                //issue #703
                $errors->add($field['name'], __('<strong>ERROR</strong>: You must provide a ', 'mgm') . mgm_stripslashes_deep($field['label']) . '.');
            }
        }
    }
    // Allow plugins to return their own errors.
    do_action_ref_array('user_profile_update_errors', array(&$errors, $update, &$user));
    // error
    if ($errors->get_error_codes()) {
        return $errors;
    }
    // init pass
    $user_password = '';
    // system - issue #1237
    $system_obj = mgm_get_class('system');
    $short_format = !empty($system_obj->setting['date_format_short']) ? $system_obj->setting['date_format_short'] : MGM_DATE_FORMAT_SHORT;
    // update custom fields values:
    if (isset($_POST['mgm_profile_field'])) {
        // loop fields
        foreach ($cf_profile_page as $field) {
            // skip html
            if ($field['type'] == 'html' || $field['type'] == 'label' || $field['name'] == 'password_conf') {
                continue;
            }
            // set
            if (isset($_POST['mgm_profile_field'][$field['name']])) {
                // value
                $value = $_POST['mgm_profile_field'][$field['name']];
                // birthdate
                if ($field['name'] == 'birthdate') {
                    //convert to mysql date format(to standardise the date format) -issue #1237
                    $value = mgm_format_inputdate_to_mysql($value, $short_format);
                } elseif ($field['name'] == 'password') {
                    // pass iss#705
                    $user_password = $value;
                    // issue#: 672
                    $value = mgm_encrypt_password($value, $user_id);
                } elseif ($field['type'] == 'checkbox' && is_array($value)) {
                    //$value = implode(" ", $value);
                    //issue #1070
                    $value = serialize($value);
                }
                // set
                $member->custom_fields->{$field}['name'] = $value;
            } elseif (isset($_POST[$field['name']])) {
                // value
                $value = $_POST[$field['name']];
                // birthdate
                if ($field['name'] == 'birthdate') {
                    // convert to mysql date format(to standardise the date format) - issue #1237
                    $value = mgm_format_inputdate_to_mysql($value, $short_format);
                } elseif ($field['name'] == 'password') {
                    // pass iss#705
                    $user_password = $value;
                    //issue#: 672
                    $value = mgm_encrypt_password($value, $user_id);
                } elseif ($field['type'] == 'checkbox' && is_array($value)) {
                    //issue #1070
                    $value = serialize($value);
                    //$value = implode(" ", $value);
                }
                // set
                $member->custom_fields->{$field}['name'] = $value;
            } elseif ($field['name'] == 'password' && !empty($pass1)) {
                // pass iss#705
                $user_password = $pass1;
                // value
                $value = mgm_encrypt_password($pass1, $user_id);
                // set
                $member->custom_fields->{$field}['name'] = $value;
            } elseif ($field['type'] == 'checkbox' && isset($member->custom_fields->{$field}['name'])) {
                // If no value selected
                $member->custom_fields->{$field}['name'] = '';
            }
        }
    }
    // update
    $member->save();
    //issue #1207
    if (!empty($m_pass)) {
        // pass iss#705
        $user_password = $m_pass;
    }
    // iss#705
    // userdata to update, leave password here
    $userdata = get_object_vars($user);
    // unset encoded password from userdata
    unset($userdata['user_pass']);
    // update password
    if (!empty($user_password)) {
        // set
        $userdata['user_pass'] = $user_password;
    }
    // save main user data & return user id
    return $user_id = wp_update_user($userdata);
}
/**
 * update default userdate, copy form mgm custom fields to wordpress fields
 *
 */
function mgm_update_default_userdata($user_id)
{
    // db
    global $wpdb;
    // user
    $user = get_userdata($user_id);
    // set aside member object
    $member = mgm_get_member($user_id);
    // default
    $profile_fields = mgm_get_config('default_profile_fields', array());
    // loop
    foreach ($profile_fields as $name => $field) {
        // do not update pasword/login here !!!
        if (in_array($name, array('username', 'email', 'password', 'password_conf'))) {
            continue;
        }
        // check if empty
        if (empty($user->{$field}['name'])) {
            // check custom
            if (isset($member->custom_fields->{$name}) && !empty($member->custom_fields->{$name})) {
                // value
                $value = $member->custom_fields->{$name};
                // check diff
                if ($name == 'url' || $name == 'display_name') {
                    // users table update
                    $wpdb->query($wpdb->prepare("UPDATE `{$wpdb->users}` SET `{$field['name']}` = %s WHERE ID = %d", $value, $user_id));
                } else {
                    // meta update
                    update_user_option($user_id, $field['name'], $value, true);
                }
            }
        }
    }
    // return
    return $user_id;
}
/**
 * account recover
 */
function mgm_get_complete_registration_url($key = 'email', $key_value)
{
    // get user
    if ($user = get_user_by($key, $key_value)) {
        // member
        $member = mgm_get_member($user->ID);
        // return
        if ($member->status == MGM_STATUS_NULL && empty($member->last_pay_date)) {
            $args = array('action' => 'complete_payment');
            if (bool_from_yn(mgm_get_config('enable_email_as_username'))) {
                $args = array_merge($args, array('user_id' => $user->ID));
            } else {
                $args = array_merge($args, array('username' => $user->user_login));
            }
            // return
            return add_query_arg($args, mgm_get_custom_url('transactions'));
        }
    }
    // false
    return false;
}
/**
 * Custom user profile form
 */
function mgm_user_profile_form($user_id = NULL, $temp_edit = false, $args = array())
{
    global $wpdb;
    // get mgm_system
    $system_obj = mgm_get_class('system');
    // current user
    $current_user = $user_id ? get_userdata($user_id) : wp_get_current_user();
    // current or voew
    if ($current_user->ID) {
        // current
        $user = mgm_get_userdata($current_user->ID);
    } else {
        // query string
        $user = mgm_get_user_from_querystring();
    }
    // if no user
    if (!isset($user) || !$user->ID || is_super_admin($user->ID)) {
        return mgm_user_login_form();
        exit;
    }
    // mgm member
    $member = mgm_get_member($user->ID);
    // edit mode, on for current user
    $edit_mode = $current_user->ID == $user->ID ? true : false;
    $temp = 0;
    // form action
    $form_action = get_permalink();
    // reset
    if ($form_action == null) {
        $form_action = mgm_get_current_url();
        $form_action = str_replace(array('&updated=true', '?updated=true'), '', $form_action);
    }
    //init - issue #1573
    $show_membership_fields_arr = array();
    if (isset($args['membership']) && !empty($args['membership'])) {
        // membership
        $membership = $args['membership'];
        // get active custom fields on register
        $cf_profile_by_membership_types = mgm_get_class('member_custom_fields')->get_fields_where(array('attributes' => array('profile_by_membership_types' => true)));
        //check
        if (!empty($cf_profile_by_membership_types)) {
            //loop
            foreach ($cf_profile_by_membership_types as $cf_profile_by_membership_type) {
                //membership_type
                $membership_types_string = isset($cf_profile_by_membership_type['attributes']['profile_membership_types_field_alias']) ? $cf_profile_by_membership_type['attributes']['profile_membership_types_field_alias'] : null;
                //check
                if (preg_match('/\\b' . $membership . '\\b/', $membership_types_string) && $membership_types_string != null) {
                    $show_fields_arr[] = $cf_profile_by_membership_type['name'];
                    $show_membership_fields_arr[] = $cf_profile_by_membership_type;
                    if ($cf_profile_by_membership_type['name'] == 'password') {
                        foreach ($cf_profile_by_membership_types as $cf_profile_by_membership) {
                            if ($cf_profile_by_membership['name'] == 'password_conf') {
                                $show_membership_fields_arr[] = $cf_profile_by_membership;
                            }
                        }
                    }
                }
            }
        }
    }
    // get default fields
    $profile_fields = mgm_get_config('default_profile_fields', array());
    // get active custom fields on profile page
    $cf_profile_page = mgm_get_class('member_custom_fields')->get_fields_where(array('display' => array('on_profile' => true)));
    $cf_noton_profile = mgm_get_class('member_custom_fields')->get_fields_where(array('display' => array('on_profile' => false)));
    //merge - issue #1573
    if (isset($show_membership_fields_arr) && is_array($show_membership_fields_arr) && !empty($show_membership_fields_arr)) {
        $cf_profile_page = array_merge($cf_profile_page, $show_membership_fields_arr);
        $cf_noton_profile = array_merge($cf_noton_profile, $show_membership_fields_arr);
    }
    $error_html = '';
    //issue #867
    $css_group = mgm_get_css_group();
    if ($css_group != 'none') {
        // error_html
        $error_html .= '<link rel="stylesheet" href="' . MGM_ASSETS_URL . 'css/' . $css_group . '/mgm.messages.css' . '" type="text/css" media="all" />';
    }
    // update
    if ($edit_mode) {
        // updated
        if (isset($_POST['method']) && $_POST['method'] == 'update_user') {
            // check security before processing form
            if (!wp_verify_nonce(mgm_post_var('_mgmnonce_user_profile'), 'user_profile')) {
                mgm_security_error('user_profile');
            }
            // user lib
            if (mgm_compare_wp_version('3.1', '<')) {
                // only before 3.1
                require_once ABSPATH . WPINC . '/registration.php';
            }
            // callback
            do_action('personal_options_update', $current_user->ID);
            // not multisite, duplicate email allowed ?
            if (!is_multisite()) {
                // save
                $errors = mgm_user_profile_update($current_user->ID);
            } else {
                // multi site
                // get user
                $user = get_userdata($current_user->ID);
                // update here:
                // Update the email address, if present. duplicate check
                if ($user->user_login && isset($_POST['user_email']) && is_email($_POST['user_email']) && $wpdb->get_var($wpdb->prepare("SELECT user_login FROM {$wpdb->signups} WHERE user_login = %s", $user->user_login))) {
                    $wpdb->query($wpdb->prepare("UPDATE {$wpdb->signups} SET user_email = %s WHERE user_login = %s", $_POST['user_email'], $user->user_login));
                }
                // edit
                if (!isset($errors) || isset($errors) && is_object($errors) && false == $errors->get_error_codes()) {
                    $errors = mgm_user_profile_update($current_user->ID);
                }
            }
            // trap erros
            if (!is_wp_error($errors)) {
                // redirect
                mgm_redirect(add_query_arg(array('updated' => 'true'), $form_action));
            }
            // errors
            if (isset($errors) && !is_numeric($errors)) {
                // get error
                $error_html .= mgm_set_errors($errors, true);
            }
        }
    }
    // updated
    if ($edit_mode && isset($_GET['updated'])) {
        $error_html .= '<div class="mgm_message_success">';
        $message = apply_filters('mgm_profile_edit_message', __('User updated.', 'mgm'));
        $error_html .= '<div><strong>' . $message . '</strong></div></div>';
    }
    // 	get row row template
    $form_row_template = $system_obj->get_template('profile_form_row_template');
    // get template row filter, mgm_profile_form_row_template for edit, mgm_profile_form_row_template_view for public view
    $form_row_template = apply_filters('mgm_profile_form_row_template' . (!$edit_mode ? '_view' : ''), $form_row_template);
    $cf_order = array();
    foreach ($cf_profile_page as $fld) {
        $cf_order[] = array('field' => $fld['name']);
    }
    // auto generate form template
    // form_template
    $form_template = '';
    // captured
    $fields_captured = array();
    // get field_groups
    $field_groups = mgm_get_config('profile_field_groups', array());
    // loop groups
    foreach ($field_groups as $group => $group_fields) {
        if ($group == 'Photo') {
            $photo_exists = false;
            foreach ($cf_profile_page as $photo) {
                if ($photo['name'] == 'photo') {
                    $photo_exists = true;
                    break;
                }
            }
            if (!$photo_exists) {
                continue;
            }
        }
        $fields_with_order = array();
        //issue #1197
        $css_title = function_exists('mb_strtolower') ? @mb_strtolower($group) : strtolower($group);
        $css_title = str_replace(' ', '_', $css_title);
        // group
        // PREV CODE
        $form_template .= sprintf('<span class="profile_group_%s">%s</span>', $css_title, $group);
        // loop to create form template
        foreach ($group_fields as $group_field) {
            // skip password
            //if(!$edit_mode && $group_field == 'password') continue;
            if (!$edit_mode && in_array($group_field, array('password', 'password_conf'))) {
                continue;
            }
            // set not found
            $captured = false;
            // first check if in custom fields
            foreach ($cf_profile_page as $field) {
                // skip password in non edit mode
                if ($field['name'] == $group_field) {
                    // set found
                    $captured = true;
                    // skip password
                    //if(!$edit_mode && $field['name'] == 'password') continue;
                    if (!$edit_mode && in_array($field['name'], array('password', 'password_conf'))) {
                        continue;
                    }
                    // store for no repeat
                    $fields_captured[] = $field['name'];
                    // field wrapper
                    $wrapper_ph = sprintf('[user_field_wrapper_%s]', $field['name']);
                    // field label
                    $label_ph = sprintf('[user_field_label_%s]', $field['name']);
                    // field/html element
                    $element_ph = sprintf('[user_field_element_%s]', $field['name']);
                    // set element name
                    // PREV CODE
                    //$form_template .= str_replace(array('[user_field_wrapper]','[user_field_label]','[user_field_element]'),array($wrapper_ph,$label_ph,$element_ph),$form_row_template);
                    // Issue #1149
                    foreach ($cf_order as $index => $cfo) {
                        if ($cfo['field'] == $field['name']) {
                            $fields_with_order[$index] = str_replace(array('[user_field_wrapper]', '[user_field_label]', '[user_field_element]'), array($wrapper_ph, $label_ph, $element_ph), $form_row_template);
                            break;
                        }
                    }
                    // break;
                    break;
                }
            }
            // if not captured
            if (!$captured) {
                $continue = false;
                foreach ($cf_noton_profile as $cffield) {
                    if ($cffield['name'] == $group_field) {
                        $continue = true;
                        break;
                    }
                }
                // break;
                if ($continue) {
                    continue;
                }
                // check set
                if (!isset($profile_fields[$group_field]['name'])) {
                    continue;
                }
                // field wrapper
                $wrapper_ph = sprintf('[user_field_wrapper_%s]', $profile_fields[$group_field]['name']);
                // field label
                $label_ph = sprintf('[user_field_label_%s]', $profile_fields[$group_field]['name']);
                // field/html element
                $element_ph = sprintf('[user_field_element_%s]', $profile_fields[$group_field]['name']);
                // set element name
                // PREV CODE
                // $form_template .= str_replace(array('[user_field_wrapper]','[user_field_label]','[user_field_element]'),array($wrapper_ph,$label_ph,$element_ph),$form_row_template);
                // Issue #1149
                $field_added = false;
                foreach ($cf_order as $index => $cfo) {
                    if ($cfo['field'] == $group_field) {
                        $fields_with_order[$index] = str_replace(array('[user_field_wrapper]', '[user_field_label]', '[user_field_element]'), array($wrapper_ph, $label_ph, $element_ph), $form_row_template);
                        $field_added = true;
                        break;
                    }
                }
                if (!$field_added) {
                    /*$fields_with_order[$index+1] = str_replace(array('[user_field_wrapper]','[user_field_label]','[user_field_element]'),array($wrapper_ph,$label_ph,$element_ph),$form_row_template);*/
                    // default profile instalation fields - issue #1207
                    if (in_array($group_field, array('username', 'email', 'password', 'password', 'password_conf'))) {
                        $fields_with_order[$temp++] = str_replace(array('[user_field_wrapper]', '[user_field_label]', '[user_field_element]'), array($wrapper_ph, $label_ph, $element_ph), $form_row_template);
                    }
                }
            }
        }
        // Issue #1149
        // Process custom field form_template with order
        if (!empty($fields_with_order)) {
            // Sort by key
            ksort($fields_with_order);
            // Loop through fields and attach html
            foreach ($fields_with_order as $fworder) {
                $form_template .= $fworder;
            }
        }
    }
    // other
    $other_header = false;
    // loop to create form template
    foreach ($cf_profile_page as $field) {
        // skip password in non edit mode
        //if(!$edit_mode && $field['name'] == 'password') continue;
        if (!$edit_mode && in_array($field['name'], array('password', 'password_conf'))) {
            continue;
        }
        // skip captured
        if (in_array($field['name'], $fields_captured)) {
            continue;
        }
        // header
        if (!$other_header) {
            // rest
            $form_template .= sprintf('<span class="profile_group_others">%s</span>', __('Others', 'mgm'));
            $other_header = true;
        }
        // field wrapper
        $wrapper_ph = sprintf('[user_field_wrapper_%s]', $field['name']);
        // field label
        $label_ph = sprintf('[user_field_label_%s]', $field['name']);
        // field/html element
        $element_ph = sprintf('[user_field_element_%s]', $field['name']);
        // template for show_public_profile
        if ($field['name'] == 'show_public_profile') {
            // template
            $form_row_template_pf = $system_obj->get_template('register_form_row_autoresponder_template');
            // set element place holders
            $form_template .= str_replace(array('[user_field_wrapper]', '[user_field_label]', '[user_field_element]'), array($wrapper_ph, $label_ph, $element_ph), $form_row_template_pf);
        } else {
            // set element name
            $form_template .= str_replace(array('[user_field_wrapper]', '[user_field_label]', '[user_field_element]'), array($wrapper_ph, $label_ph, $element_ph), $form_row_template);
        }
    }
    // get template filter, mgm_profile_form_template for edit, mgm_profile_form_template_view for public view
    $form_template = apply_filters('mgm_profile_form_template' . (!$edit_mode ? '_view' : ''), $form_template);
    // now replace and create the fields
    $form_html = $form_template;
    // get mgm_form_fields generator
    $form_fields = new mgm_form_fields(array('wordpres_form' => false));
    $arr_images = array();
    // loop custom fields to replace form labels/elements
    foreach ($cf_profile_page as $field) {
        // skip password in non edit mode
        //if(!$edit_mode && $field['name'] == 'password') continue;
        if (!$edit_mode && in_array($field['name'], array('password', 'password_conf'))) {
            continue;
        }
        if ($edit_mode && $field['type'] == 'image') {
            if (!in_array($field['name'], $arr_images)) {
                $arr_images[] = $field['name'];
            }
        }
        // field wrapper
        $wrapper_ph = sprintf('[user_field_wrapper_%s]', $field['name']);
        // field label
        $label_ph = sprintf('[user_field_label_%s]', $field['name']);
        // field/html element
        $element_ph = sprintf('[user_field_element_%s]', $field['name']);
        // edit mode
        if ($edit_mode) {
            // for username
            if ($field['name'] == 'username') {
                //localazing the label  issue# 617
                $label_lcz = mgm_stripslashes_deep($field['label']);
                $label_lcz = __($label_lcz, 'mgm');
                $field['label'] = sprintf('%s (<em>%s</em>)', $label_lcz, __('Username not changeable', 'mgm'));
            } elseif ($field['name'] == 'password') {
                //localazing the label  issue# 617
                $label_lcz = mgm_stripslashes_deep($field['label']);
                $label_lcz = __($label_lcz, 'mgm');
                $field['label'] = sprintf('%s (<em>%s</em>)', $label_lcz, __('Leave blank if don\'t wish to update', 'mgm'));
            }
        } else {
            // for display_name
            if ($field['name'] == 'display_name') {
                $field['label'] = __('Display Name', 'mgm');
            }
        }
        // replace wrapper
        $form_html = str_replace($wrapper_ph, $field['name'] . '_box', $form_html);
        //localazing the label  issue# 617
        $label_lcz = mgm_stripslashes_deep($field['label']);
        $label_lcz = __($label_lcz, 'mgm');
        // replace label(hidden) - issue #1050
        $form_html = str_replace($label_ph, $field['attributes']['hide_label'] ? '' : mgm_stripslashes_deep($field['label']), $form_html);
        // replace label
        $form_html = str_replace($label_ph, $label_lcz, $form_html);
        // selected value
        if (isset($profile_fields[$field['name']]) && isset($user->{$profile_fields}[$field['name']]['name'])) {
            // wp alias'
            // value
            $value = $user->{$profile_fields}[$field['name']]['name'];
            // birthdate
            if ($field['name'] == 'birthdate') {
                // convert saved date to input field format
                $value = mgm_get_datepicker_format('date', $value);
            } elseif ($field['type'] == 'checkbox') {
                //$options = preg_split('/[;,]/', $field['options']);
                //$value  = preg_split('/[;,\s]/', $value);
                //issue #1070
                $value = @unserialize($value);
                // pass " " as value to prevent the default value getting selected, if no option is selected
                $value = empty($value) ? " " : $value;
            }
        } else {
            if (isset($member->custom_fields->{$field}['name'])) {
                // custom field
                // value
                $value = $member->custom_fields->{$field}['name'];
                // birthdate
                if ($field['name'] == 'birthdate') {
                    // convert saved date to input field format
                    $value = mgm_get_datepicker_format('date', $value);
                } elseif ($field['type'] == 'checkbox') {
                    //$options = preg_split('/[;,]/', $field['options']);
                    //$value  = preg_split('/[;,\s]/', $value);
                    //issue #1070
                    $value = @unserialize($value);
                    // pass " " as value to prevent the default value getting selected, if no option is selected
                    $value = empty($value) ? " " : $value;
                }
                //issue #1484
                if ($field['name'] == 'show_public_profile' && $field['type'] == 'checkbox') {
                    $value = $member->custom_fields->{$field}['name'];
                }
            } else {
                if (isset($user->{$field}['name'])) {
                    // object var
                    // value
                    $value = $user->{$field}['name'];
                } else {
                    // none
                    // default
                    $value = '';
                }
            }
        }
        // dont set value for password
        if (in_array($field['name'], array('password', 'password_conf'))) {
            $value = '';
        }
        // disable username
        if ($field['name'] == 'username') {
            $field['attributes']['readonly'] = true;
        }
        // nickname
        if ($field['name'] == 'nickname') {
            $field['attributes']['required'] = true;
        }
        // edit mode
        if ($edit_mode) {
            if ($field['name'] == 'show_public_profile') {
                //echo "xxx".$form_fields->get_field_element($field,'mgm_profile_field',$value);
            }
            // replace element
            $form_html = str_replace($element_ph, $form_fields->get_field_element($field, 'mgm_profile_field', $value), $form_html);
        } else {
            // view
            // country
            if ($field['name'] == 'country') {
                $value = mgm_country_from_code($value);
            } elseif ($field['name'] == 'photo' && !empty($value)) {
                $value = sprintf('<img src="%s" alt="%s" >', $value, basename($value));
            }
            // replace element
            $form_html = str_replace($element_ph, $value, $form_html);
        }
    }
    // loop default fields to replace form elements
    foreach ($profile_fields as $field_key => $field) {
        // skip password in non edit mode
        //if(!$edit_mode && $field['name'] == 'user_password') continue;
        if (!$edit_mode && in_array($field['name'], array('user_password', 'user_password_conf'))) {
            continue;
        }
        $continue = false;
        foreach ($cf_noton_profile as $cffield) {
            if ($cffield['name'] == $field['name']) {
                $continue = true;
                break;
            }
        }
        if ($continue) {
            continue;
        }
        // field wrapper
        $wrapper_ph = sprintf('[user_field_wrapper_%s]', $field['name']);
        // field label
        $label_ph = sprintf('[user_field_label_%s]', $field['name']);
        // field/html element
        $element_ph = sprintf('[user_field_element_%s]', $field['name']);
        // edit mode
        if ($edit_mode) {
            // for username
            if ($field['name'] == 'user_login') {
                //localazing the label  issue# 617
                $label_lcz = mgm_stripslashes_deep($field['label']);
                $label_lcz = __($label_lcz, 'mgm');
                $field['label'] = sprintf('%s (<em>%s</em>)', $label_lcz, __('Username not changeable', 'mgm'));
            } elseif ($field['name'] == 'user_password') {
                //localazing the label  issue# 617
                $label_lcz = mgm_stripslashes_deep($field['label']);
                $label_lcz = __($label_lcz, 'mgm');
                $field['label'] = sprintf('%s (<em>%s</em>)', $label_lcz, __('Leave blank if don\'t wish to update', 'mgm'));
            }
        } else {
            // for display_name
            if ($field['name'] == 'display_name') {
                $field['label'] = __('Display Name', 'mgm');
            }
        }
        // replace wrapper
        $form_html = str_replace($wrapper_ph, $field['name'] . '_box', $form_html);
        //localazing the label  issue# 617
        $label_lcz = mgm_stripslashes_deep($field['label']);
        $label_lcz = __($label_lcz, 'mgm');
        // replace label
        $form_html = str_replace($label_ph, $label_lcz, $form_html);
        // selected value
        if (isset($user->{$field}['name'])) {
            // wp alias
            $value = $user->{$field}['name'];
        } else {
            if (isset($member->custom_fields->{$field_key})) {
                // custom field
                $value = $member->custom_fields->{$field_key};
            } else {
                // none
                $value = '';
            }
        }
        // dont set value for password
        //if($field['name'] == 'user_password') $value = '';
        if (in_array($field['name'], array('user_password', 'user_password_conf'))) {
            $value = '';
        }
        // edit mode
        if ($edit_mode) {
            // replace element
            $form_html = str_replace($element_ph, $form_fields->get_field_element($field, 'mgm_profile_field', $value), $form_html);
        } else {
            // country
            if ($field_key == 'country') {
                $value = mgm_country_from_code($value);
            }
            // set
            $form_html = str_replace($element_ph, $value, $form_html);
        }
    }
    // attach scripts
    $form_html .= mgm_attach_scripts(true, array());
    // range
    $yearRange = mgm_get_calendar_year_range();
    // append script
    $form_html .= '<script language="javascript">jQuery(document).ready(function(){try{mgm_date_picker(".mgm_date",false,{yearRange:"' . $yearRange . '", dateFormat: "' . mgm_get_datepicker_format() . '"});}catch(x){}});</script>';
    //include scripts for image upload:
    if (!empty($arr_images)) {
        $form_html .= mgm_upload_script_js('profileform', $arr_images);
    }
    // buttun
    $button_html = '';
    // button on edit
    if ($edit_mode && !$temp_edit) {
        // default
        $button_html = '<div><input class="button mgm-profile-button" type="submit" name="wp-submit" id="wp-submit" value="' . __('Update', 'mgm') . '" /></div>';
        // apply button filter
        $button_html = apply_filters('mgm_profile_form_button', $button_html);
    }
    //profile by membership - issue #1573
    if (isset($args['membership']) && !empty($args['membership'])) {
        // hidden
        $button_html .= sprintf('<input type="hidden" name="membership" value="%s">', $args['membership']);
    }
    // hidden
    $button_html .= '<input type="hidden" name="method" value="update_user">';
    // nonce
    $button_html .= wp_nonce_field('user_profile', '_mgmnonce_user_profile', true, false);
    // temp
    if (!$temp_edit) {
        // open
        $form_open = sprintf('<form class="mgm_form" name="profileform" id="profileform" action="%s" method="post">', $form_action);
        $form_close = '</form>';
    } else {
        $form_open = $form_close = '';
    }
    // output form
    $html = sprintf('<div class="mgm_prifile_form">%s %s %s %s %s</div>', $error_html, $form_open, $form_html, $button_html, $form_close);
    //issue #1113
    $html = mgm_stripslashes_deep($html);
    // filter
    $html = apply_filters('mgm_user_profile_form_html', $html, $current_user);
    //issue #1635
    $user_profile_html = '<div class="mgm_user_profile_container">' . $html . '</div>';
    // return
    return $user_profile_html;
}