function mgm_replace_message_tags($message, $user_id = NULL)
{
    // get user
    if (!$user_id) {
        // cusrrent user
        $current_user = wp_get_current_user();
        // set
        $user_id = $current_user->ID;
    }
    // int
    $logged_in = isset($current_user) && $current_user->ID > 0 ? true : false;
    // user
    if ($user_id > 0) {
        // get user
        $user = get_userdata($user_id);
        // mgm member
        $member = mgm_get_member($user_id);
        // set
        $username = $user->user_login;
        $name = mgm_str_concat($user->first_name, $user->last_name);
        $email = $user->user_email;
        $url = $user->user_url;
        $display_name = $user->display_name;
        $first_name = $user->first_name;
        $last_name = $user->last_name;
        $description = $user->description;
        $nickname = $user->nickname;
        // get active custom fields
        $custom_fields = mgm_get_class('member_custom_fields')->get_fields_where(array('display' => array('on_register' => true, 'on_profile' => true, 'on_public_profile' => true)));
        // init
        $custom_field_tags = array();
        // loop
        foreach ($custom_fields as $custom_field) {
            // if already set skip it
            if (!isset(${$custom_field['name']}) || isset(${$custom_field['name']}) && empty(${$custom_field['name']})) {
                // check
                if (isset($member->custom_fields->{$custom_field}['name'])) {
                    // skip password always
                    if ($custom_field['name'] == 'password') {
                        continue;
                    }
                    // value
                    $value = $member->custom_fields->{$custom_field}['name'];
                    // country
                    if ($custom_field['name'] == 'country') {
                        $value = mgm_country_from_code($value);
                    }
                    // set
                    $custom_field_tags[$custom_field['name']] = $value;
                }
            }
        }
    } else {
        // get active custom fields
        $custom_fields = mgm_get_class('member_custom_fields')->get_fields_where(array('display' => array('on_register' => true, 'on_profile' => true, 'on_public_profile' => true)));
        // init
        $custom_field_tags = array();
        // loop
        foreach ($custom_fields as $custom_field) {
            // set
            $custom_field_tags[$custom_field['name']] = '';
        }
    }
    /*
     * [[purchase_cost]] = Cost and currency of a purchasable post
     * [[login_register]] = Login or register form
     * [[login_register_links]] = Links for login and register
     * [[login_link]] = Login link only
     * [[facebook_login_button]] = Facebook login button	 
     * [[register_link]] = Register link only
     * [[membership_types]] = A list of membership levels that can see this post/page
     * [[duration]] = number of days that the user will have access for
     * [[username]] = username
     * [[name]] = name / username
     * [[register]] = register form
     */
    // post
    $post_id = get_the_ID();
    // vars
    $system_obj = mgm_get_class('system');
    $currency = $system_obj->setting['currency'];
    $post_obj = mgm_get_post($post_id);
    $duration = $post_obj->get_access_duration();
    if (!$duration) {
        $duration = __('unlimited', 'mgm');
    }
    $purchase_cost = $post_obj->purchase_cost;
    $currency_sign = mgm_get_currency_symbols($system_obj->setting['currency']);
    // these function calls are called repeadtedly as filter is used in multiple places
    // call only when tag present in message
    // [login_register_links]
    if (preg_match('/[[login_register_links]]/', $message)) {
        $login_register_links = !$logged_in ? mgm_get_login_register_links() : '';
    }
    // [login_link]
    if (preg_match('/[[login_link]]/', $message)) {
        $login_link = !$logged_in ? mgm_get_login_link() : '';
    }
    // [facebook_login_button]
    if (preg_match('/[[facebook_login_button]]/', $message)) {
        $facebook_login_button = !$logged_in ? mgm_generate_facebook_login() : '';
    }
    // [register_link]
    if (preg_match('/[[register_link]]/', $message)) {
        $register_link = !$logged_in ? mgm_get_register_link() : '';
    }
    // [login_register]
    if (preg_match('/[[login_register]]/', $message)) {
        $login_register = !$logged_in ? mgm_sidebar_user_login_form(__('Register', 'mgm')) : '';
    }
    // [register]
    if (preg_match('/[[register]]/', $message)) {
        $register = !$logged_in ? mgm_user_register_form() : '';
    }
    // membership type
    if (!($membership_types = $post_obj->get_access_membership_types())) {
        // purchasble
        if (mgm_post_is_purchasable($post_id)) {
            $membership_types = 'Purchasable Only';
        } else {
            // access
            $membership_types = 'No access';
        }
    } else {
        // get object
        $membership_types_obj = mgm_get_class('membership_types');
        // init array
        $ms_types_array = array();
        // loop
        foreach ($membership_types as $membership_type) {
            // set
            if (isset($membership_types_obj->membership_types[$membership_type])) {
                $ms_types_array[] = $membership_types_obj->membership_types[$membership_type];
            }
        }
        // reset
        $membership_types = implode(', ', $ms_types_array);
        // unset
        unset($ms_types_array);
    }
    // loop defined
    $tags = array('purchase_cost', 'login_register', 'login_register_links', 'login_link', 'register_link', 'membership_types', 'duration', 'register', 'username', 'name', 'email', 'url', 'display_name', 'first_name', 'last_name', 'description', 'nickname', 'facebook_login_button', 'currency_sign');
    // loop
    foreach ($tags as $tag) {
        // check
        if (!isset(${$tag})) {
            ${$tag} = '';
        }
        // set
        $message = str_replace('[[' . $tag . ']]', ${$tag}, $message);
    }
    // custom_field_tags
    if (is_array($custom_field_tags)) {
        // loop
        foreach ($custom_field_tags as $tag => $value) {
            // check
            if (!isset($value)) {
                $value = '';
            }
            // set
            $message = str_replace('[[' . $tag . ']]', $value, $message);
        }
    }
    // return
    return $message;
}
 /**
  * API helper method get userdata
  *
  * @param int $user_id
  * @return array $userdata
  */
 function _get_userdata($user_id)
 {
     // get userdata
     $user = mgm_get_userdata($user_id);
     // user data
     $email = stripslashes($user->user_email);
     $first_name = !empty($user->first_name) ? stripslashes($user->first_name) : '';
     $last_name = !empty($user->last_name) ? stripslashes($user->last_name) : '';
     $full_name = !empty($first_name) ? mgm_str_concat($first_name, $last_name) : $user->display_name;
     // return
     $userdata = array('email' => $email, 'full_name' => $full_name, 'first_name' => $first_name, 'last_name' => $last_name);
     // member
     $member = mgm_get_member($user_id);
     // custom fields
     if ($member->custom_fields) {
         // get vars
         $custom_fields = get_object_vars($member->custom_fields);
         // check
         if (count($custom_fields) > 0) {
             // loop
             foreach ($custom_fields as $custom_field => $value) {
                 // check
                 if (!isset($userdata[$custom_field])) {
                     // ensure fields already set are not overwritten
                     $userdata[$custom_field] = $value;
                 }
             }
         }
     }
     //other membership types -issue #1073
     if ($member->other_membership_types) {
         $other_membership_types = array();
         foreach ($member->other_membership_types as $o_membership_type) {
             if (!empty($o_membership_type)) {
                 $other_membership_types[] = $o_membership_type['membership_type'];
             }
         }
         $userdata['other_membership_types'] = $other_membership_types;
     }
     // membership type
     if ($member->membership_type) {
         $userdata['membership_type'] = $member->membership_type;
     }
     // return
     return $userdata;
 }
 /**
  * API helper method set address fields
  *
  * @param object $user
  * @param array $data	 
  * @param array $mapping	
  * @param string $callback	 
  * @return none
  */
 function _set_address_fields($user, &$data, $mapping, $callback = NULL)
 {
     // get address_fields
     $address_fields = $this->_get_address_fields($user);
     // consider post alter, #762
     if (isset($_POST['mgm_payment_field']) && is_array($_POST['mgm_payment_field'])) {
         // merge
         $address_fields = array_merge($address_fields, $_POST['mgm_payment_field']);
     }
     // loop custom fields map
     foreach ($mapping as $custom_field => $payment_field) {
         // string
         if (is_string($payment_field)) {
             // set
             if (isset($address_fields[$custom_field])) {
                 // filter
                 $value = $callback ? call_user_func_array($callback, array($custom_field, $address_fields[$custom_field])) : $this->_address_field_filter($custom_field, $address_fields[$custom_field]);
                 // set
                 $data[$payment_field] = $value;
             }
         } else {
             if (is_array($payment_field)) {
                 // array for address
                 $uf_values = explode("\n", $address_fields[$custom_field]);
                 // loop
                 foreach ($payment_field as $pf) {
                     // set
                     if ($uf_value = array_shift($uf_values)) {
                         $data[$pf] = substr($uf_value, 0, 64);
                         // take 64 chars only per line
                     }
                 }
             }
         }
     }
     // concat name
     if (isset($mapping['full_name'])) {
         // value
         $value = $user->first_name ? mgm_str_concat($user->first_name, $user->last_name) : $user->display_name;
         // filter
         $value = $callback ? call_user_func_array($callback, array('full_name', $value)) : $this->_address_field_filter('full_name', $value);
         // set
         $data[$mapping['full_name']] = $value;
     }
 }