/**
  * Wrapper function for validate_cc_fields
  *
  * @param unknown_type $calling_fun
  */
 function validate_cc_fields_process($calling_func = 'process_html_redirect', $return = true)
 {
     $error_string = '';
     //Only if submitted from credit card form
     if (isset($_POST['submit_from']) && $_POST['submit_from'] == $calling_func) {
         $errors = $this->validate_cc_fields($calling_func);
         if (is_wp_error($errors)) {
             $error_string = mgm_set_errors($errors, true);
             /*if($return)
             			return $error_string;
             		else 
             			echo $error_string;	*/
         } else {
             //call process_credit_card:
             $errors = $this->process_credit_card();
             if (is_wp_error($errors) && $errors->get_error_code()) {
                 $error_string = mgm_set_errors($errors, true);
                 /*if($return)
                 			return $error_string;
                 		else 
                 			echo $error_string;	*/
             }
         }
     }
     // apply filter
     $error_string = apply_filters('mgm_validated_cc_fields_process', $error_string);
     // return
     if ($return) {
         return $error_string;
     }
     // print
     echo $error_string;
 }
/**
 * show buttons of modules available for upgrade/downgrade/complete payment
 *
 * @param array args
 * @return string html
 */
function mgm_get_upgrade_buttons($args = array())
{
    global $wpdb;
    // current user
    $user = wp_get_current_user();
    // get user
    if (!$user->ID) {
        // get user from query string
        $user = mgm_get_user_from_querystring();
    }
    // validate
    if (!$user->ID) {
        return __('No such user', 'mgm');
    }
    // userdata
    $username = $user->user_login;
    $mgm_home = get_option('siteurl');
    // upgrdae multiple
    $multiple_upgrade = false;
    //issue #1511
    $prev_pack_id = mgm_get_var('prev_pack_id', '', true);
    $prev_membership_type = mgm_get_var('membership_type', '', true);
    // get member
    // issue#: 843 (3)
    if (isset($prev_pack_id) && (int) $prev_pack_id > 0 && isset($prev_membership_type) && !empty($prev_membership_type)) {
        // only for multiple membership upgrade
        $multiple_upgrade = true;
        // get member
        $member = mgm_get_member_another_purchase($user->ID, $prev_membership_type, $prev_pack_id);
        // mark status as inactive
        $member->status = MGM_STATUS_NULL;
    } else {
        $member = mgm_get_member($user->ID);
        //this is a fix for issue#: 589, see the notes for details:
        //This is to read saved coupons as array in order to fix the fatal error on some servers.
        //This will change the object on each users profile view.
        //Also this will avoid using patch for batch update,
        $old_coupons_found = 0;
        // loop
        foreach (array('upgrade', 'extend') as $coupon_type) {
            // check
            if (isset($member->{$coupon_type}['coupon']) && is_object($member->{$coupon_type}['coupon'])) {
                // convert
                $member->{$coupon_type}['coupon'] = (array) $member->{$coupon_type}['coupon'];
                // mark
                $old_coupons_found++;
            }
        }
        // save if old coupons found
        if ($old_coupons_found) {
            $member->save();
        }
    }
    // other objects
    $system_obj = mgm_get_class('system');
    $packs_obj = mgm_get_class('subscription_packs');
    // membership_type
    $membership_type = isset($prev_membership_type) && !empty($prev_membership_type) ? $prev_membership_type : mgm_get_user_membership_type($user->ID, 'code');
    // captured above
    // duration
    $duration_str = $packs_obj->duration_str;
    $trial_taken = $member->trial_taken;
    // pack_id if main mgm_member / multiple membership
    $pack_id = isset($prev_pack_id) && (int) $prev_pack_id > 0 ? $prev_pack_id : (int) $member->pack_id;
    // got pack
    if ($pack_id) {
        $pack_details = $packs_obj->get_pack($pack_id);
        $pack_membership_type = $pack_details['membership_type'];
        $preference = $pack_details['preference'];
    } else {
        $preference = 0;
    }
    // action - issue #1275
    $action = mgm_get_var('action', '', true);
    if ($action == 'complete_payment') {
        // get active packs on complete payment page
        $active_packs = $packs_obj->get_packs('register');
    } else {
        // get active packs on upgrade page
        $active_packs = $packs_obj->get_packs('upgrade');
        //issue #1368
        // loop and preference
        foreach ($active_packs as $_pack) {
            // set preference order for later sort
            $pack_preferences[] = $_pack['preference'];
        }
        // preference sort packs
        if (count($pack_preferences) > 0) {
            // preference sort
            sort($pack_preferences);
            //preference sorted
            $preferences_sorted = array();
            // loop by preference
            foreach ($pack_preferences as $pack_preference) {
                //issue #1710
                if ($pack_preference >= $preference) {
                    // loop packs
                    foreach ($active_packs as $_pack) {
                        // preference order match
                        if ($_pack['preference'] == $pack_preference) {
                            // duplicate check
                            if (!in_array($_pack['id'], $preferences_sorted)) {
                                // set pack
                                $preference_packs[] = mgm_stripslashes_deep($_pack);
                                // mark as preference sorted
                                $preferences_sorted[] = $_pack['id'];
                            }
                        }
                    }
                }
            }
        }
        $active_packs = $preference_packs;
    }
    // issue#: 664
    // action : upgrade/complete_payment. Allow complete payment only if there is an associated $pack_id and the current subscription is not free/trial
    $action = !empty($action) && (int) $pack_id > 0 ? $action : 'upgrade';
    // upgrade or complete_payment
    // show current
    $show_current_pack = false;
    // switch
    if ($action == 'complete_payment' && isset($pack_membership_type) && in_array($pack_membership_type, array('free', 'trial'))) {
        // upgrade
        $action = 'upgrade';
        // show current
        $show_current_pack = true;
    }
    // form action
    // carry forward get params
    $url_parms = array('action' => $action, 'user_id' => $user->ID);
    // 'username'=> $username,
    // prev_membership_type
    if (isset($prev_membership_type)) {
        $url_parms['membership_type'] = $prev_membership_type;
    }
    // prev_pack_id
    if (isset($prev_pack_id)) {
        $url_parms['prev_pack_id'] = $prev_pack_id;
    }
    // form action
    $form_action = mgm_get_custom_url('transactions', false, $url_parms);
    // issue 1009
    if (!($membership_details_url = $system_obj->get_setting('membership_details_url'))) {
        $membership_details_url = get_admin_url() . 'profile.php?page=mgm/profile';
    }
    // cancel
    $cancel_url = $action == 'upgrade' && $user->ID > 0 ? $membership_details_url : mgm_get_custom_url('login');
    // active modules
    $a_payment_modules = $system_obj->get_active_modules('payment');
    // bug from liquid-dynamiks.com theme #779
    if (isset($_POST['wpsb_email'])) {
        unset($_POST['wpsb_email']);
    }
    // posted form-----------------------------------------------------------------------
    if (!empty($_POST) || isset($_GET['edit_userinfo'])) {
        // update user data
        if (isset($_POST['method']) && $_POST['method'] == 'update_user') {
            // 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', $user->ID);
            // not multisite, duplicate email allowed ?
            if (!is_multisite()) {
                // save
                $errors = mgm_user_profile_update($user->ID);
            } else {
                // multi site
                // get user
                $user = get_userdata($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($user->ID);
                }
            }
            // errors
            if (isset($errors) && !is_numeric($errors)) {
                // get error
                $error_html = mgm_set_errors($errors, true);
                // edit flag
                $_GET['edit_userinfo'] = 1;
            }
        }
        // second step for complete payment, userdata edit
        if (isset($_GET['edit_userinfo'])) {
            // error
            if (isset($error_html)) {
                $html .= $error_html;
            }
            // form
            $html .= sprintf('<form action="%s" method="post" class="mgm_form">', $form_action);
            $html .= sprintf('<p>%s</p>', __('Edit Your Personal Information', 'mgm'));
            // get custom fields
            $html .= mgm_user_profile_form($user->ID, true);
            // html
            $html .= '<input type="hidden" name="ref" value="' . md5($member->amount . '_' . $member->duration . '_' . $member->duration_type . '_' . $member->membership_type) . '" />';
            $html .= '<input type="hidden" name="form_action" value="' . $form_action . '" />';
            $html .= '<input type="hidden" name="subs_opt" value="' . $_POST['subs_opt'] . '" rel="mgm_subscription_options"/>';
            // carry forward mgm_payment_gateways field value: issue#: 919
            if (isset($_POST['mgm_payment_gateways'])) {
                $html .= '<input type="hidden" name="mgm_payment_gateways" value="' . $_POST['mgm_payment_gateways'] . '" />';
            }
            //issue #1236
            if (isset($_POST['mgm_upgrade_field']['coupon']) && !empty($_POST['mgm_upgrade_field']['coupon'])) {
                //issue #1250 - Coupon validation
                if (!empty($_POST['form_action'])) {
                    //issue #1591
                    $coupon_err_redirect_url = $_POST['form_action'];
                    if (preg_match('/complete_payment/', $coupon_err_redirect_url)) {
                        $coupon_err_redirect_url = str_replace('&edit_userinfo=1', '', $coupon_err_redirect_url);
                    }
                    // check if its a valid coupon
                    if (!($coupon = mgm_get_coupon_data($_POST['mgm_upgrade_field']['coupon']))) {
                        //redirect back to the form
                        $q_arg = array('error_field' => 'Coupon', 'error_type' => 'invalid', 'error_field_value' => $_POST['mgm_upgrade_field']['coupon']);
                        $redirect = add_query_arg($q_arg, $coupon_err_redirect_url);
                        mgm_redirect($redirect);
                        exit;
                    } else {
                        // get subs
                        if ($subs_pack = mgm_decode_package(mgm_post_var('subs_opt'))) {
                            // values
                            $coupon_values = mgm_get_coupon_values(NULL, $coupon['value'], true);
                            // check
                            if (isset($coupon_values['new_membership_type']) && $coupon_values['new_membership_type'] != $subs_pack['membership_type']) {
                                $new_membership_type = mgm_get_membership_type_name($coupon_values['new_membership_type']);
                                $q_arg = array('error_field' => 'Coupon', 'error_type' => 'invalid', 'membership_type' => $coupon_values['new_membership_type'], 'error_field_value' => $_POST['mgm_upgrade_field']['coupon']);
                                $redirect = add_query_arg($q_arg, $coupon_err_redirect_url);
                                mgm_redirect($redirect);
                                exit;
                            }
                        }
                    }
                }
                $html .= '<input type="hidden" name="mgm_upgrade_field[coupon]" value="' . $_POST['mgm_upgrade_field']['coupon'] . '" class="mgm_upgrade_field">';
            }
            // set
            $html .= sprintf('<p>
								 <input class="button button-primary" type="button" name="back" onclick="window.location=\'%s\'" value="%s" />						
							 	 <input class="button button-primary" type="submit" name="submit" value="%s" />&nbsp;&nbsp;
						      	 <input class="button button-primary" type="button" name="cancel" onclick="window.location=\'%s\'" value="%s" />&nbsp;					
					          </p>', $form_action, __('Back', 'mgm'), __('Save & Next', 'mgm'), $cancel_url, __('Cancel', 'mgm'));
            // html
            $html .= '</form>';
            // final step, show payment buttons
        } elseif (isset($_POST['submit'])) {
            // verify selected
            if (!isset($_POST['subs_opt'])) {
                // die
                return sprintf(__('Package not selected, <a href="%s">go back</a>.', 'mgm'), $_POST['form_action']);
                exit;
            }
            // check and validate passed data
            if ($_POST['ref'] != md5($member->amount . '_' . $member->duration . '_' . $member->duration_type . '_' . $member->membership_type)) {
                // die
                return __('Package data tampered. Cheatin!', 'mgm');
                exit;
            }
            // get selected pack
            $selected_pack = mgm_decode_package($_POST['subs_opt']);
            // check selected pack is a valid pack
            $valid = false;
            // loop packs
            foreach ($active_packs as $pack) {
                // check
                if ($pack['cost'] == $selected_pack['cost'] && $pack['duration'] == $selected_pack['duration'] && $pack['duration_type'] == $selected_pack['duration_type'] && $pack['membership_type'] == $selected_pack['membership_type'] && $pack['id'] == $selected_pack['pack_id']) {
                    // valid
                    $valid = true;
                    break;
                }
            }
            // error
            if (!$valid) {
                return __('Invalid package data. Cheatin!', 'mgm');
                exit;
            }
            //update description if not set
            if (!isset($selected_pack['description'])) {
                $selected_pack['description'] = $pack['description'];
            }
            //update pack currency - issue #1602
            if (isset($pack['currency']) && !empty($pack['currency'])) {
                $selected_pack['currency'] = $pack['currency'];
            }
            // num cycle
            if (!isset($selected_pack['num_cycles'])) {
                //Note the above break in for loop:
                $selected_pack['num_cycles'] = $pack['num_cycles'];
            }
            //issue#: 658
            if (isset($pack['role'])) {
                $selected_pack['role'] = $pack['role'];
            }
            //applicable modules:
            $selected_pack['modules'] = $pack['modules'];
            $selected_pack['product'] = $pack['product'];
            // trial
            if ($pack['trial_on']) {
                $selected_pack['trial_on'] = $pack['trial_on'];
                $selected_pack['trial_duration'] = $pack['trial_duration'];
                $selected_pack['trial_duration_type'] = $pack['trial_duration_type'];
                $selected_pack['trial_cost'] = $pack['trial_cost'];
                $selected_pack['trial_num_cycles'] = $pack['trial_num_cycles'];
            }
            // save member data including coupon etc, MUST save after all validation passed, we dont want any
            // unwanted value in member object unless its a valid upgrade
            // save
            if ($multiple_upgrade) {
                $member = mgm_save_partial_fields(array('on_upgrade' => true), 'mgm_upgrade_field', $selected_pack['cost'], true, strip_tags($_GET['action']), $member);
            } else {
                $member = mgm_save_partial_fields(array('on_upgrade' => true), 'mgm_upgrade_field', $selected_pack['cost'], true, strip_tags($_GET['action']));
            }
            //save custom fields issue #1285
            if (isset($_POST['mgm_upgrade_field']) && !empty($_POST['mgm_upgrade_field'])) {
                //upgrade custom fileds
                $cfu_fileds = mgm_get_class('member_custom_fields')->get_fields_where(array('display' => array('on_upgrade' => true)));
                //loop fields
                foreach ($cfu_fileds as $cf_filed) {
                    //skip coupon and autoresponder
                    if (in_array($cf_filed['name'], array('coupon', 'autoresponder'))) {
                        continue;
                    }
                    //check
                    if (isset($_POST['mgm_upgrade_field'][$cf_filed['name']])) {
                        // check upgrae and required
                        if ((bool) $cf_filed['attributes']['required'] === true) {
                            if (empty($_POST['mgm_upgrade_field'][$cf_filed['name']])) {
                                //redirect back to the form
                                $q_arg = array('error_field' => $cf_filed['label'], 'error_type' => 'empty', 'error_field_value' => $_POST['mgm_upgrade_field'][$cf_filed['name']]);
                                $redirect = add_query_arg($q_arg, $_POST['form_action']);
                                mgm_redirect($redirect);
                                exit;
                            }
                        }
                        //appending custom fields
                        if (isset($member->custom_fields->{$cf_filed}['name'])) {
                            $member->custom_fields->{$cf_filed}['name'] = $_POST['mgm_upgrade_field'][$cf_filed['name']];
                        } else {
                            $member->custom_fields->{$cf_filed}['name'] = $_POST['mgm_upgrade_field'][$cf_filed['name']];
                        }
                    }
                }
                $member->save();
            }
            //issue #860
            if (isset($_POST['mgm_upgrade_field']['autoresponder']) && bool_from_yn($_POST['mgm_upgrade_field']['autoresponder'])) {
                $member->subscribed = 'Y';
                $member->autoresponder = $system_obj->active_modules['autoresponder'];
                //issue #1511
                if ($multiple_upgrade) {
                    mgm_save_another_membership_fields($member, $user->ID);
                } else {
                    $member->save();
                }
                //issue #1276
            } else {
                $member->subscribed = '';
                $member->autoresponder = '';
                //issue #1511
                if ($multiple_upgrade) {
                    mgm_save_another_membership_fields($member, $user->ID);
                } else {
                    $member->save();
                }
            }
            //issue #1236
            if (isset($_POST['mgm_upgrade_field']['coupon']) && !empty($_POST['mgm_upgrade_field']['coupon'])) {
                //issue #1250 - Coupon validation
                if (!empty($_POST['form_action'])) {
                    // check if its a valid coupon
                    if (!($coupon = mgm_get_coupon_data($_POST['mgm_upgrade_field']['coupon']))) {
                        //redirect back to the form
                        $q_arg = array('error_field' => 'Coupon', 'error_type' => 'invalid', 'error_field_value' => $_POST['mgm_upgrade_field']['coupon']);
                        $redirect = add_query_arg($q_arg, $_POST['form_action']);
                        mgm_redirect($redirect);
                        exit;
                    } else {
                        // get subs
                        if ($subs_pack = mgm_decode_package(mgm_post_var('subs_opt'))) {
                            // values
                            $coupon_values = mgm_get_coupon_values(NULL, $coupon['value'], true);
                            // check
                            if (isset($coupon_values['new_membership_type']) && $coupon_values['new_membership_type'] != $subs_pack['membership_type']) {
                                $new_membership_type = mgm_get_membership_type_name($coupon_values['new_membership_type']);
                                $q_arg = array('error_field' => 'Coupon', 'error_type' => 'invalid', 'membership_type' => $coupon_values['new_membership_type'], 'error_field_value' => $_POST['mgm_upgrade_field']['coupon']);
                                $redirect = add_query_arg($q_arg, $_POST['form_action']);
                                mgm_redirect($redirect);
                                exit;
                            }
                        }
                    }
                }
            }
            // payment_gateways if set: Eg: $_POST['mgm_payment_gateways'] = mgm_paypal
            $cf_payment_gateways = isset($_POST['mgm_payment_gateways']) && !empty($_POST['mgm_payment_gateways']) ? $_POST['mgm_payment_gateways'] : null;
            // bypass step2 if payment gateway is submitted: issue #: 469
            // removed complete_payment checking here in order to enable coupon for complete_payment. issue#: 802
            if (!is_null($cf_payment_gateways)) {
                // get pack
                mgm_get_upgrade_coupon_pack($member, $selected_pack, strip_tags($_GET['action']));
                // cost
                if ((double) $selected_pack['cost'] > 0) {
                    //get an object of the payment gateway:
                    $mod_obj = mgm_get_module($cf_payment_gateways, 'payment');
                    // tran options
                    $tran_options = array('user_id' => $user->ID);
                    // is register & purchase
                    if (isset($_POST['post_id'])) {
                        $tran_options['post_id'] = (int) $_POST['post_id'];
                    }
                    // if multiple membership
                    if ($multiple_upgrade) {
                        $tran_options['is_another_membership_purchase'] = true;
                        // This is to replace current mgm_member object with new mgm_member object of the upgrade pack
                        $tran_options['multiple_upgrade_prev_packid'] = mgm_get_var('prev_pack_id', '', true);
                    }
                    // upgrade flag
                    if ($action == 'upgrade') {
                        $tran_options['subscription_option'] = 'upgrade';
                    }
                    // create transaction
                    // $tran_id = $mod_obj->_create_transaction($selected_pack, $tran_options);
                    $tran_id = mgm_add_transaction($selected_pack, $tran_options);
                    //bypass directly to process return if manual payment:
                    if ($cf_payment_gateways == 'mgm_manualpay') {
                        // set
                        $_POST['custom'] = $tran_id;
                        // direct call to module return function:
                        $mod_obj->process_return();
                        // exit
                        exit;
                    }
                    // set redirect
                    $redirect = add_query_arg(array('tran_id' => mgm_encode_id($tran_id)), $mod_obj->_get_endpoint('html_redirect', true));
                    // redirect
                    mgm_redirect($redirect);
                    // this goes to subscribe, mgm_functions.php/mgm_get_subscription_buttons
                    // exit
                    exit;
                }
            }
            // end gateway
            // get coupon pack
            mgm_get_upgrade_coupon_pack($member, $selected_pack, strip_tags($_GET['action']));
            // start html
            $html = '<div>';
            // free package
            if (($selected_pack['cost'] == 0 || $selected_pack['membership_type'] == 'free') && in_array('mgm_free', $a_payment_modules) && mgm_get_module('mgm_free')->enabled == 'Y') {
                // html
                $html .= sprintf('<div>%s - %s</div>', __('Create a free account ', 'mgm'), ucwords($selected_pack['membership_type']));
                // module
                $module = 'mgm_free';
                // payments url
                $payments_url = mgm_get_custom_url('transactions');
                // if tril module selected and cost is 0 and free moduleis not active
                if ($selected_pack['membership_type'] == 'trial') {
                    // check
                    if (in_array('mgm_trial', $a_payment_modules)) {
                        // module
                        $module = 'mgm_trial';
                    }
                }
                // query_args -issue #1005
                $query_args = array('method' => 'payment_return', 'module' => $module, 'custom' => implode('_', array($user->ID, $selected_pack['duration'], $selected_pack['duration_type'], $selected_pack['pack_id'], 'N', $selected_pack['membership_type'])));
                // redirector
                if (isset($_REQUEST['redirector'])) {
                    // set
                    $query_args['redirector'] = $_REQUEST['redirector'];
                }
                // redirect to module to mark the payment as complete
                $redirect = add_query_arg($query_args, $payments_url);
                // redirect
                if (!headers_sent()) {
                    @header('location: ' . $redirect);
                } else {
                    // js redirect
                    $html .= sprintf('<script type="text/javascript">window.location = "%s";</script><div>%s</div>', $redirect, $packs_obj->get_pack_desc($pack));
                }
            } else {
                // paid package, generate buy buttons
                // set html
                $html .= sprintf('<div class="mgm_get_subs_btn">%s</div>', $packs_obj->get_pack_desc($selected_pack));
                // coupon
                if (isset($member->upgrade) && is_array($member->upgrade) && isset($member->upgrade['coupon']['id'])) {
                    // set html
                    $html .= sprintf('<div class="mgm_get_subs_btn">%s</div>', sprintf(__('Using Coupon "%s" - %s', 'mgm'), $member->upgrade['coupon']['name'], $member->upgrade['coupon']['description']));
                }
                // set html
                $html .= sprintf('<div class="mgm_get_subs_btn">%s</div>', __('Please Select from Available Payment Gateways', 'mgm'));
            }
            // init
            $payment_modules = array();
            // active
            if (count($a_payment_modules) > 0) {
                // loop
                foreach ($a_payment_modules as $payment_module) {
                    // not trial
                    if (in_array($payment_module, array('mgm_free', 'mgm_trial'))) {
                        continue;
                    }
                    // consider only the modules assigned to pack
                    if (isset($selected_pack['modules']) && !in_array($payment_module, (array) $selected_pack['modules'])) {
                        continue;
                    }
                    // store
                    $payment_modules[] = $payment_module;
                }
            }
            // loop payment module if not free
            if (count($payment_modules) && $selected_pack['cost']) {
                // transaction
                $tran_id = false;
                $tran_options = array('user_id' => $user->ID);
                // if multiple membership
                if ($multiple_upgrade) {
                    // another
                    $tran_options['is_another_membership_purchase'] = true;
                    // This is to replace current mgm_member object with new mgm_member object of the upgrade pack
                    $tran_options['multiple_upgrade_prev_packid'] = mgm_get_var('prev_pack_id', '', true);
                }
                // upgrade
                if ($action == 'upgrade') {
                    $tran_options['subscription_option'] = 'upgrade';
                }
                // loop
                foreach ($payment_modules as $module) {
                    // module
                    $mod_obj = mgm_get_module($module, 'payment');
                    // create transaction
                    // if(!$tran_id) $tran_id = $mod_obj->_create_transaction($selected_pack, $extra_options);
                    if (!$tran_id) {
                        $tran_id = mgm_add_transaction($selected_pack, $tran_options);
                    }
                    // set html
                    $html .= sprintf('<div>%s</div>', $mod_obj->get_button_subscribe(array('pack' => $selected_pack, 'tran_id' => $tran_id)));
                }
                // mgm_pr($_REQUEST);
                // profile edit #698
                if ($_GET['action'] == 'complete_payment') {
                    // update $form_action for user data edit
                    if (isset($_COOKIE['wp_tempuser_login']) && $_COOKIE['wp_tempuser_login'] == $user->ID && !isset($_GET['edit_userinfo'])) {
                        // form action
                        $form_action = add_query_arg(array('edit_userinfo' => 1), $form_action);
                        // action
                        $html .= sprintf('<form action="%s" method="post" class="mgm_form">', $form_action);
                        $html .= '<input type="hidden" name="ref" value="' . md5($member->amount . '_' . $member->duration . '_' . $member->duration_type . '_' . $member->membership_type) . '" />';
                        $html .= '<input type="hidden" name="form_action" value="' . $form_action . '" />';
                        $html .= '<input type="hidden" name="subs_opt" value="' . $_POST['subs_opt'] . '" rel="mgm_subscription_options"/>';
                        // set
                        $html .= sprintf('<p><input type="button" name="back" onclick="window.location=\'%s\'" value="%s" class="button-primary" />	
											 <input type="button" name="cancel" onclick="window.location=\'%s\'" value="%s" class="button-primary" />&nbsp;					
										  </p>', $form_action, __('Edit Personal Information', 'mgm'), $cancel_url, __('Cancel', 'mgm'));
                        // html
                        $html .= '</form>';
                    }
                }
            } else {
                // no module error
                if ($selected_pack['cost']) {
                    // set html
                    $html .= sprintf('<div>%s</div>', __('Error, no payment gateways active on upgrade page, notify administrator.', 'mgm'));
                }
            }
            // html
            $html .= '</div>';
        }
        // end final step post
    } else {
        // generate upgrade/complete payment form ----------------------------------------------------------
        // selected subscription, from args (shortcode) or get url
        $selected_pack = mgm_get_selected_subscription($args);
        $css_group = mgm_get_css_group();
        // upgrade_packages
        $upgrade_packages = '';
        // pack count
        $pack_count = 0;
        // pack to modules
        $pack_modules = array();
        //mgm_pr($active_packs);
        //issue #1553
        if (!empty($active_packs)) {
            // loop	packs
            foreach ($active_packs as $pack) {
                // mgm_pr($pack);
                // default
                $checked = '';
                // for complete payment only show purchased pack
                if ($action == 'complete_payment') {
                    // pack selected
                    if (isset($pack_id)) {
                        // leave other pack, if not show other packs
                        if ($pack['id'] != $pack_id && !isset($_GET['show_other_packs'])) {
                            continue;
                        }
                        // select
                        if ($pack['id'] == $pack_id) {
                            $checked = 'checked="checked"';
                        }
                    }
                } else {
                    //  'upgrade':
                    // upgrade
                    // echo '<br>pack#' . $pack['id'] . ' step1';
                    // leave current pack, it will goto extend
                    if (isset($pack_id)) {
                        if (!$show_current_pack && $pack['id'] == $pack_id) {
                            continue;
                        }
                    }
                    // echo '<br>pack#' . $pack['id'] . ' step2';
                    // skip trial or free packs
                    if (in_array($pack['membership_type'], array('trial', 'free'))) {
                        continue;
                    }
                    // echo '<br>pack#' . $pack['id'] . ' step3';
                    // skip if not allowed
                    if (!mgm_pack_upgrade_allowed($pack)) {
                        continue;
                    }
                    // echo '<br>pack#' . $pack['id'] . ' step4';
                    // selected pack
                    if ($selected_pack !== false) {
                        // checked
                        $checked = mgm_select_subscription($pack, $selected_pack);
                        // skip other when a package sent as selected
                        if (empty($checked)) {
                            continue;
                        }
                    }
                    // echo '<br>pack#' . $pack['id'] . ' step5';
                }
                // checked
                if (!$checked) {
                    $checked = (int) $pack['default'] == 1 ? ' checked="checked"' : '';
                }
                // duration
                if ($pack['duration'] == 1) {
                    $dur_str = rtrim($duration_str[$pack['duration_type']], 's');
                } else {
                    $dur_str = $duration_str[$pack['duration_type']];
                }
                // encode pack
                $subs_opt_enc = mgm_encode_package($pack);
                // set
                $pack_modules[$subs_opt_enc] = $pack['modules'];
                // free
                if (($pack['cost'] == 0 || strtolower($pack['membership_type']) == 'free') && in_array('mgm_free', $a_payment_modules) && mgm_get_module('mgm_free')->is_enabled()) {
                    // input
                    $input = sprintf('<input type="radio" %s class="checkbox" name="subs_opt" value="%s" rel="mgm_subscription_options"/>', $checked, $subs_opt_enc);
                    // html
                    $upgrade_packages .= '  
						<div class="mgm_subs_wrapper ' . $pack['membership_type'] . '">
							<div class="mgm_subs_option ' . $pack['membership_type'] . '">
								' . $input . '
							</div>
							<div class="mgm_subs_pack_desc ' . $pack['membership_type'] . '">							
								' . $packs_obj->get_pack_desc($pack) . '
							</div>
							<div class="clearfix"></div>
							<div class="mgm_subs_desc ' . $pack['membership_type'] . '">
								' . mgm_stripslashes_deep($pack['description']) . '
							</div>
						</div>';
                } else {
                    // input
                    $input = sprintf('<input type="radio" %s class="checkbox" name="subs_opt" value="%s" rel="mgm_subscription_options"/>', $checked, $subs_opt_enc);
                    // html
                    $upgrade_packages .= '  
						<div class="mgm_subs_wrapper ' . $pack['membership_type'] . '">
							<div class="mgm_subs_option ' . $pack['membership_type'] . '">
								' . $input . '
							</div>
							<div class="mgm_subs_pack_desc ' . $pack['membership_type'] . '">
								' . $packs_obj->get_pack_desc($pack) . '
							</div>
							<div class="clearfix"></div>
							<div class="mgm_subs_desc ' . $pack['membership_type'] . '">
								' . mgm_stripslashes_deep($pack['description']) . '
							</div>
						</div>';
                }
                // count
                $pack_count++;
            }
        }
        // start
        $html = '';
        // html
        if ($pack_count > 1) {
            $html .= sprintf('<p class="message register">%s</p>', __('Please Select from Available Membership Packages', 'mgm'));
        }
        // add pack_modules as json data, may consider jquery data later
        if (!empty($pack_modules)) {
            $html .= sprintf('<script language="javascript">var mgm_pack_modules = %s</script>', json_encode($pack_modules));
        }
        //issue #867
        if ($css_group != 'none') {
            // set css
            $html .= sprintf('<link rel="stylesheet" href="%s/css/%s/mgm.form.fields.css" type="text/css" media="all" />', untrailingslashit(MGM_ASSETS_URL), $css_group);
        }
        // show error when no upgrde
        if (!$upgrade_packages) {
            // html
            $html .= '<div class="mgm_subs_wrapper">
						<div  class="mgm_subs_pack_desc">
							' . __('Sorry, no upgrades available.', 'mgm') . '
						</div>
					  </div>
					  <p>						
					  	  <input type="button" name="cancel" onclick="window.location=\'' . $cancel_url . '\'" value="' . __('Cancel', 'mgm') . '" class="button-primary" />&nbsp;					
					  </p>';
        } else {
            // edit/other pack link
            $edit_button = $other_packs_button = '';
            // issue #: 675, issue #1279
            if ($action == 'complete_payment' || isset($_REQUEST['action']) && $_REQUEST['action'] == 'complete_payment') {
                // issue#: 416
                // mgm_pr($_GET);
                if (isset($_GET['show_other_packs'])) {
                    // other packs url - issue #1279, #1215 update, other packs url missed username
                    $other_packs_url = add_query_arg(array('action' => 'complete_payment', 'username' => $username), mgm_get_custom_url('transactions'));
                    // mgm_get_current_url()
                    //$other_packs_url   = str_replace('&show_other_packs=1', '', $other_packs_url);
                    $other_packs_label = __('Show subscribed package', 'mgm') . '';
                } else {
                    // other packs url - issue #1279, #1215 update, other packs url missed username
                    $other_packs_url = add_query_arg(array('action' => 'complete_payment', 'show_other_packs' => 1, 'username' => $username), mgm_get_custom_url('transactions'));
                    // mgm_get_current_url()
                    $other_packs_label = __('Show other packages', 'mgm');
                }
                // issue#: 710
                if (count($active_packs) > 1) {
                    // button
                    $other_packs_button = sprintf('<input type="button" value="%s" class="button-primary" onclick="window.location=\'%s\'">', $other_packs_label, $other_packs_url);
                }
                // update $form_action for user data edit
                if (isset($_COOKIE['wp_tempuser_login']) && $_COOKIE['wp_tempuser_login'] == $user->ID && !isset($_GET['edit_userinfo'])) {
                    $form_action = add_query_arg(array('edit_userinfo' => 1), $form_action);
                } else {
                    //issue #1279
                    $form_action = add_query_arg(array('action' => 'complete_payment', 'username' => $username, 'edit_userinfo' => 1), mgm_get_current_url());
                }
            }
            // echo $form_action;
            // check errors if any:
            $html .= mgm_subscription_purchase_errors();
            // form
            $html .= sprintf('<form action="%s" method="post" class="mgm_form">', $form_action);
            $html .= sprintf('<div class="mgm_get_pack_form_container">%s', $upgrade_packages);
            //issue #1285
            $html .= mgm_get_custom_fields($user->ID, array('on_upgrade' => true), 'mgm_upgrade_field');
            $html .= '<input type="hidden" name="ref" value="' . md5($member->amount . '_' . $member->duration . '_' . $member->duration_type . '_' . $member->membership_type) . '" />';
            $html .= '<input type="hidden" name="form_action" value="' . $form_action . '" />';
            // set
            $html .= sprintf('<p>%s						
							 	 <input class="button button-primary" type="submit" name="submit" value="%s" />&nbsp;&nbsp;
						      	 <input class="button button-primary" type="button" name="cancel" onclick="window.location=\'%s\'" value="%s" />&nbsp;					
					          </p>', $other_packs_button, __('Next', 'mgm'), $cancel_url, __('Cancel', 'mgm'));
            // html
            $html .= '</div></form>';
        }
        // end generate form
    }
    // end
    // return
    return $html;
}
/**
 *  Admin user edit screen unsubscribe option process	 
 */
function mgm_admin_user_unsubscribe_process($user_ID = false, $return = false)
{
    // get user
    if (!$user_ID) {
        $user_ID = mgm_get_user_id();
    }
    // get form object
    if (is_object($user_ID)) {
        $user_ID = $user_ID->ID;
    }
    // member
    $member = mgm_get_member($user_ID);
    // init
    $user = new stdClass();
    $user->ID = $user_ID;
    $html = '';
    // error
    if (isset($_GET['unsubscribe_errors']) && !empty($_GET['unsubscribe_errors'])) {
        $errors = new WP_Error();
        $errors->add('unsubscribe_errors', urldecode(strip_tags($_GET['unsubscribe_errors'])), isset($_GET['unsubscribed']) ? 'message' : 'error');
        $html .= mgm_set_errors($errors, true);
        unset($errors);
    }
    $html .= mgm_get_admin_user_unsubscribe_status_button($member, $user);
    if (isset($member->other_membership_types) && is_array($member->other_membership_types) && count($member->other_membership_types) > 0) {
        foreach ($member->other_membership_types as $key => $memtypes) {
            $memtypes = mgm_convert_array_to_memberobj($memtypes, $user_ID);
            $html .= mgm_get_admin_user_unsubscribe_status_button($memtypes, $user);
        }
    }
    echo $html;
}
function mgm_pre_process_facebook_registration()
{
    // system
    $system_obj = mgm_get_class('system');
    $user_login = $user_email = '';
    if (isset($_GET['connect']) && $_GET['connect'] == 'facebook_registration') {
        if (isset($_REQUEST['signed_request'])) {
            $response = parse_signed_request($_REQUEST['signed_request'], $system_obj->setting['facebook_key']);
            if (isset($response['registration']['user_login'])) {
                $user_login = $response['registration']['user_login'];
            }
            if (isset($response['registration']['email'])) {
                $user_email = $response['registration']['email'];
            }
            if (isset($response['registration']['email'])) {
                $_POST['mgm_subscription'] = $response['registration']['mgm_subscription'];
            }
            // get error
            $errors = mgm_register_new_user($user_login, $user_email, null);
            // no error
            if (!is_wp_error($errors)) {
                // get redirect
                $redirect = mgm_get_custom_url('login', $use_default_links, array('checkemail' => 'registered'));
                // check default
                $redirect_to = !empty($_POST['redirect_to']) ? $_POST['redirect_to'] : $redirect;
                // redirect
                wp_safe_redirect($redirect_to);
                // exit
                exit;
            }
            // errors
            $error_html = mgm_set_errors($errors, true);
        }
    }
}
/**
 * get errors
 */
function mgm_subscription_purchase_errors()
{
    // error
    $error_field = mgm_request_var('error_field', '', true);
    //issue #1250
    $error_field_value = mgm_request_var('error_field_value', '', true);
    // check
    if (!empty($error_field)) {
        // obj
        $errors = new WP_Error();
        // type
        switch (mgm_request_var('error_type', '', true)) {
            case 'empty':
                $error_string = 'You must provide a ';
                //issue #1250
                if ($error_field == 'Coupon') {
                    $errors->add($error_field, __('<strong>ERROR</strong>: ' . $error_string, 'mgm') . $error_field);
                }
                break;
            case 'invalid':
                $error_string = 'Invalid ';
                //issue #1250
                if ($error_field == 'Coupon' && !mgm_request_var('membership_type', '', true)) {
                    $errors->add($error_field, sprintf(__('<strong>ERROR</strong>: Coupon Code "%s" is not valid, use a valid coupon only.', 'mgm'), $error_field_value));
                }
                if ($error_field == 'Coupon' && ($membership_type = mgm_request_var('membership_type', '', true))) {
                    $errors->add($error_field, sprintf(__('<strong>ERROR</strong>: Coupon Code "%s" is only available with Membership Type "%s".', 'mgm'), $error_field_value, $membership_type));
                }
                break;
        }
        // add - issue #1250
        if ($error_field != 'Coupon') {
            //issue #703
            $errors->add($error_field, __('<strong>ERROR</strong>: ' . $error_string, 'mgm') . $error_field);
        }
        // return
        return mgm_set_errors($errors, true);
    }
    // nothing
    return '';
}
/**
 * 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;
}