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;
}
/**
 * login widget : multiple instance
 * front end instance
 *
 * @param array $args
 * @param array $widget_args
 * @return void
 * @since 1.0
 */
function mgm_sidebar_widget_login($args, $widget_args = 1)
{
    global $user_ID, $current_user, $mgm_sidebar_widget;
    // if hide on custom login page
    $post_id = get_the_ID();
    // post custom register
    if ($post_id > 0) {
        // if match
        if (get_permalink($post_id) == mgm_get_custom_url('login')) {
            return "";
        }
    }
    // actual widget
    extract($args, EXTR_SKIP);
    if (is_numeric($widget_args)) {
        $widget_args = array('number' => $widget_args);
    }
    $widget_args = wp_parse_args($widget_args, array('number' => -1));
    extract($widget_args, EXTR_SKIP);
    // get widget options
    $options = $mgm_sidebar_widget->login_widget;
    // validate
    if (!isset($options[$number])) {
        return;
    }
    // home url
    $home_url = home_url();
    // get options
    $title_logged_in = isset($options[$number]['title_logged_in']) ? $options[$number]['title_logged_in'] : __('Magic Membership Details', 'mgm');
    $title_logged_out = isset($options[$number]['title_logged_out']) ? $options[$number]['title_logged_out'] : __('Login', 'mgm');
    $profile_text = isset($options[$number]['profile_text']) ? $options[$number]['profile_text'] : __('Profile', 'mgm');
    $membership_details_text = isset($options[$number]['membership_details_text']) ? $options[$number]['membership_details_text'] : __('Membership Details', 'mgm');
    $membership_contents_text = isset($options[$number]['membership_contents_text']) ? $options[$number]['membership_contents_text'] : __('Membership Contents', 'mgm');
    $logout_text = isset($options[$number]['logout_text']) ? $options[$number]['logout_text'] : __('Logout', 'mgm');
    $register_text = isset($options[$number]['register_text']) ? $options[$number]['register_text'] : __('Register', 'mgm');
    $lostpassword_text = isset($options[$number]['lostpassword_text']) ? $options[$number]['lostpassword_text'] : __('Lost your Password?', 'mgm');
    $logged_out_intro = isset($options[$number]['logged_out_intro']) ? stripslashes($options[$number]['logged_out_intro']) : '';
    // logged in user view
    if ($user_ID) {
        echo $before_widget;
        if (trim($title_logged_in)) {
            echo $before_title . $title_logged_in . $after_title;
        }
        //>=WP2.7 = DB9872
        if (get_option('db_version') >= 9872) {
            $logout_url = wp_logout_url($home_url);
        } else {
            //$logout_url = trailingslashit($home_url) . 'wp-login.php?action=logout';
            $logout_url = add_query_arg(array('action' => 'logout'), mgm_get_custom_field_array('login'));
        }
        // @todo check the actual reason
        $membership_details_link = mgm_get_custom_url('membership_details');
        $membership_contents_link = mgm_get_custom_url('membership_contents');
        $profile_link = mgm_get_custom_url('profile');
        // issue #945
        // $system_obj = mgm_get_class('system');
        // $membership_details_link 	= esc_html($system_obj->get_setting('membership_details_url'));
        // $membership_contents_link 	= esc_html($system_obj->get_setting('membership_contents_url'));
        // set tmpl
        $logged_in_template = isset($options[$number]['logged_in_template']) ? $options[$number]['logged_in_template'] : $mgm_sidebar_widget->default_text['logged_in_template'];
        $logged_in_template = str_replace('[display_name]', $current_user->display_name, $logged_in_template);
        $logged_in_template = str_replace('[membership_details_url]', $membership_details_link, $logged_in_template);
        $logged_in_template = str_replace('[membership_details_link]', sprintf('<a href="%s">%s</a>', $membership_details_link, $membership_details_text), $logged_in_template);
        $logged_in_template = str_replace('[membership_contents_url]', $membership_contents_link, $logged_in_template);
        $logged_in_template = str_replace('[membership_contents_link]', sprintf('<a href="%s">%s</a>', $membership_contents_link, $membership_contents_text), $logged_in_template);
        $logged_in_template = str_replace('[profile_url]', $profile_link, $logged_in_template);
        $logged_in_template = str_replace('[profile_link]', sprintf('<a href="%s">%s</a>', $profile_link, $profile_text), $logged_in_template);
        //Issue #825
        $logged_in_template = str_replace('[logout_url]', $logout_url, $logged_in_template);
        $logged_in_template = str_replace('[logout_link]', '<a href="' . $logout_url . '">' . $logout_text . '</a>', $logged_in_template);
        echo $logged_in_template;
        echo $after_widget;
    } else {
        echo $before_widget;
        if (trim($title_logged_out)) {
            echo $before_title . $title_logged_out . $after_title;
        }
        echo $logged_out_intro;
        echo mgm_sidebar_user_login_form($register_text, $lostpassword_text);
        echo $after_widget;
    }
}