/** 
  * get posts accessible to member by user id
  *
  * @param int user id
  * @return posts 
  * @verb GET
  * @action all 	
  * @url <site>/mgmapi/members/posts.<format>
  */
 public function posts($id)
 {
     global $wpdb;
     // int
     $id = (int) $id;
     // posts
     $posts = array();
     $total_rows = 0;
     // get member
     if ($member = mgm_get_member($id)) {
         // get all subscribed membership types
         $membership_types = mgm_get_subscribed_membershiptypes($id, $member);
         // accessible posts
         $accessible = mgm_get_membership_contents($membership_types, 'accessible', $id);
         // purchased posts
         $purchased = mgm_get_purchased_posts($id);
         // purchasable posts
         $purchasable = mgm_get_membership_contents($membership_types, 'purchasable', $id);
         // total rows
         $total_rows = $accessible['total_posts'] + $purchased['total_posts'] + $purchasable['total_posts'];
         // posts
         $posts = array('accessible' => array('contents' => $this->_clean_content($accessible['posts'])), 'purchased' => array('contents' => $this->_clean_content($purchased['posts'])), 'purchasable' => array('contents' => $this->_clean_content($purchasable['posts'])));
     }
     // response
     $response = array('status' => 'success', 'message' => sprintf(__('Get posts accessible to member by member id#%d response', 'mgm'), $id), 'data' => array('total_rows' => $total_rows, 'posts' => $posts));
     // return
     return array($response, 200);
 }
/**
 * router for url protection, API calls
 * 
 */
function mgm_url_router($wp)
{
    global $wpdb, $route, $window_title;
    // trim
    $current_uri = trim($_SERVER['REQUEST_URI']);
    // pre process hook for url router
    do_action('mgm_url_router_pre_process');
    // proxy protector for all files in mgm/downloads - more will be added later
    if (isset($_GET['protect']) && isset($_GET['file'])) {
        // get method
        $file = strip_tags($_GET['file']);
        // file
        $protect = strip_tags($_GET['protect']);
        // protected folder
        // check
        mgm_stream_file($file, $protect);
        // exit
        exit;
    }
    // check admin
    if (!is_super_admin()) {
        // TODO, improve code for less query, WARNING, not to use direct URI, posibility of SQL injection
        // having all is better to protet all scenario
        // sql
        $sql = "SELECT url,membership_types FROM `" . TBL_MGM_POST_PROTECTED_URL . "` WHERE `post_id` IS NULL ORDER BY LENGTH(`url`) DESC";
        // direct urls
        $direct_urls = $wpdb->get_results($sql);
        // check
        if ($direct_urls) {
            // loop
            foreach ($direct_urls as $direct_url) {
                // url path only
                $uri = trim(parse_url($direct_url->url, PHP_URL_PATH));
                // append end
                if (substr($uri, -1) == '*') {
                    $uri = preg_quote(str_replace('*', '', $uri), '/') . '(.*)';
                } elseif (substr($uri, -4) == ':any') {
                    $uri = preg_quote(str_replace(':any', '', $uri), '/') . '(.*)';
                } else {
                    $uri = preg_quote($uri, '/');
                }
                // pattern
                $uri_pattern = "#{$uri}#i";
                // match
                if (!empty($uri) && (strcasecmp($uri, $current_uri) == 0 || preg_match($uri_pattern, $current_uri))) {
                    // membership types
                    $membership_types = json_decode($direct_url->membership_types, true);
                    // check
                    $current_user = wp_get_current_user();
                    // access
                    $access = false;
                    // check
                    if ($current_user->ID) {
                        // get member
                        $user_membership_types = array();
                        // default
                        $user_membership_types[] = mgm_get_user_membership_type($current_user->ID, 'code');
                        // multiple
                        $user_membership_types[] = mgm_get_subscribed_membershiptypes($current_user->ID);
                        // loop
                        if (is_array($membership_types)) {
                            // loop
                            foreach ($membership_types as $membership_type) {
                                // check
                                if (in_array($membership_type, $user_membership_types)) {
                                    // set
                                    $access = true;
                                    break;
                                }
                            }
                        }
                    } else {
                        //issue #1173
                        if (is_array($membership_types) && !$current_user->ID) {
                            // loop
                            foreach ($membership_types as $membership_type) {
                                // check
                                if ($membership_type == 'guest') {
                                    // set
                                    $access = true;
                                    break;
                                }
                            }
                        }
                    }
                    // add filter
                    if (!$access) {
                        add_filter('the_content', 'mgm_url_content_protection');
                    }
                }
            }
        }
    }
    // rest api request
    if (mgm_is_restapi_request($current_uri) && mgm_api_access_allowed()) {
        // forward to api handler
        mgm_restapi_server::init();
        exit;
    }
    // post process hook for url router
    do_action('mgm_url_router_post_process');
}
/**
 * text widget : multiple instance
 * front end instance
 *
 * @param array $args
 * @param array $widget_args
 * @return void
 * @since 1.0
 */
function mgm_sidebar_widget_text($args, $widget_args = 1)
{
    global $mgm_sidebar_widget, $user_ID;
    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);
    $options = $mgm_sidebar_widget->text_widget;
    if (!isset($options[$number])) {
        return;
    }
    $user_memtypes = array();
    $available_to = explode('|', $options[$number]['access_membership_types']);
    //$membership_type = strtolower(mgm_get_user_membership_type(false, 'code'));
    // issue#: 843
    // fetch subscribed membership types
    $access = false;
    // Issue #1029
    if (empty($options[$number]['access_membership_types']) || count($available_to) === 1 && 'guest' == strtolower($available_to[0]) && !$user_ID) {
        $access = true;
    }
    if (!$access && $user_ID) {
        if (!is_super_admin()) {
            $user_memtypes = mgm_get_subscribed_membershiptypes($user_ID);
            foreach ($available_to as $available) {
                //if ($membership_type == strtolower($available)) {
                if (in_array(strtolower($available), $user_memtypes)) {
                    $access = true;
                    break;
                }
            }
        } else {
            $access = true;
        }
    }
    // has access
    if ($access) {
        $title = apply_filters('mgm_sidebar_widget_text_title', $options[$number]['title']);
        $text = apply_filters('mgm_sidebar_widget_text_text', $options[$number]['text']);
        ?>

		<?php 
        echo $before_widget;
        ?>

		<?php 
        if (!empty($title)) {
            echo $before_title . $title . $after_title;
        }
        ?>

		<div class="textwidget"><?php 
        echo $text;
        ?>
</div>
		<?php 
        echo $after_widget;
    }
}
/**
 * exclude post/pages by membership type
 *
 * @param int $user_id
 * @param string $content_type
 * @return string
 */
function mgm_content_exclude_by_user($user_id = 0, $content_type = 'category')
{
    // not for admin
    if (is_super_admin()) {
        return array();
    }
    // global
    global $wpdb;
    // system
    $system_obj = mgm_get_class('system');
    // protecction
    $content_hide_by_membership = $system_obj->get_setting('content_hide_by_membership');
    // get member
    $member = mgm_get_member($user_id);
    $user = wp_get_current_user();
    $temp_member = new stdClass();
    $membership_type = $member->membership_type;
    // set default
    $membership_type = empty($membership_type) ? 'guest' : $membership_type;
    //get user membership types: multiple level membership issue#: 400 modification
    $arr_mt = mgm_get_subscribed_membershiptypes($user_id, $member);
    // store
    if (!in_array($membership_type, $arr_mt)) {
        $arr_mt[] = $membership_type;
    }
    // on type
    switch ($content_type) {
        case 'category':
        case 'taxonomy':
            // category
            if (!($hide_terms = wp_cache_get($content_type . '_exclusion_' . $user_id, 'users'))) {
                // exclude protected terms
                $hide_terms = array();
                // get post terms settings
                $post_terms = mgm_get_class('post_' . $content_type);
                // loop set
                foreach ($post_terms->get_access_membership_types() as $term_id => $membership_types) {
                    // exclude
                    if ($membership_types) {
                        // not set public access
                        // multiple level membership issue#: 400 modification
                        if (array_diff($membership_types, $arr_mt) != $membership_types) {
                            continue;
                        }
                        // hide
                        $hide_terms[] = $term_id;
                    }
                }
                // set cache
                wp_cache_set($content_type . '_exclusion_' . $user_id, $hide_terms, 'users');
            }
            // return
            return $hide_terms;
            // end check
            break;
        case 'post':
            // post
            // $content_hide_by_membership = $system_obj->get_setting('content_hide_by_membership');
            // no check if not required
            if (!bool_from_yn($content_hide_by_membership)) {
                return array();
            }
            // check
            if (!($hide_posts = wp_cache_get('post_exclusion_' . $user_id, 'users'))) {
                // exclude protected posts
                $hide_posts = array();
                // fetch all posts
                $posts = $wpdb->get_results("SELECT ID FROM `{$wpdb->posts}` WHERE `post_type` NOT IN('revision','attachment')");
                // check
                if ($posts) {
                    // loop
                    foreach ($posts as $post) {
                        // get post
                        $post_obj = mgm_get_post($post->ID);
                        $access_delay = $post_obj->access_delay;
                        // check types
                        if (is_array($post_obj->access_membership_types) && count($post_obj->access_membership_types)) {
                            // default
                            $access = false;
                            // check
                            foreach ($post_obj->access_membership_types as $a_membership_type) {
                                // match
                                // multiple level membership issue#: 400 modification
                                if (in_array($a_membership_type, $arr_mt)) {
                                    // done
                                    $access = true;
                                    // check protection
                                    if (bool_from_yn($content_hide_by_membership)) {
                                        // temp
                                        $temp_member->membership_type = $a_membership_type;
                                        //deny access if delay: issue#: 516
                                        if (mgm_check_post_access_delay($temp_member, $user, $access_delay)) {
                                            //OK:
                                            break;
                                        } else {
                                            $access = false;
                                        }
                                    }
                                }
                            }
                            //issue #841
                            if (bool_from_yn($post_obj->purchasable)) {
                                $access = true;
                            }
                            // protect
                            if (!$access) {
                                $hide_posts[] = $post->ID;
                            }
                        }
                        // unset
                        unset($post_obj);
                    }
                }
                // set cache
                wp_cache_set('post_exclusion_' . $user_id, $hide_posts, 'users');
            }
            // return
            return $hide_posts;
            // end check
            break;
    }
    // empty
    return array();
}
/**
 * create purchase another button
 *
 * @param array userdata
 * @retun string html output
 */
function mgm_get_purchase_another_subscription_button($args = array())
{
    global $wpdb;
    //ceck settings
    $settings = mgm_get_class('system')->get_setting();
    // check
    if (!isset($settings['enable_multiple_level_purchase']) || isset($settings['enable_multiple_level_purchase']) && !bool_from_yn($settings['enable_multiple_level_purchase'])) {
        return;
    }
    // current user
    $user = wp_get_current_user();
    // validate
    if (!$user->ID) {
        // 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');
    $member = mgm_get_member($user->ID);
    $system_obj = mgm_get_class('system');
    $membership_type = mgm_get_user_membership_type($user->ID, 'code');
    $packs_obj = mgm_get_class('subscription_packs');
    $packs = $packs_obj->get_packs('upgrade');
    $duration_str = $packs_obj->duration_str;
    $trial_taken = $member->trial_taken;
    // pack_ids
    $pack_ids = mgm_get_members_packids($member);
    $pack_membership_types = mgm_get_subscribed_membershiptypes($user->ID, $member);
    // query_arg
    $form_action = mgm_get_custom_url('transactions', false, array('action' => 'purchase_another', 'username' => $username));
    //issue 1009
    if (isset($settings['membership_details_url'])) {
        $membership_details_url = $settings['membership_details_url'];
    } else {
        $membership_details_url = get_admin_url() . 'profile.php?page=mgm/profile';
    }
    // cancel
    $cancel_url = $membership_details_url;
    // $cancel_url = mgm_get_custom_url('membership_details');
    // active modules
    $a_payment_modules = $system_obj->get_active_modules('payment');
    // 	selected_subscription
    $selected_subs = mgm_get_selected_subscription($args);
    // second step, after post
    if (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;
        }
        // get subs data
        $subs_opt_pack = mgm_decode_package($_POST['subs_opt']);
        extract($subs_opt_pack);
        // check
        $valid = false;
        // loop packs
        foreach ($packs as $pack) {
            // check
            //check pack id as well: issue#: 580
            if ($pack['cost'] == $cost && $pack['duration'] == $duration && $pack['duration_type'] == $duration_type && $membership_type == $pack['membership_type'] && $pack_id == $pack['id']) {
                $valid = true;
                break;
            }
        }
        // error
        if (!$valid) {
            return __('Invalid data passed', 'mgm');
            exit;
        }
        // get object
        $member = new mgm_member($user->ID);
        $temp_membership = $member->_default_fields();
        $temp_membership['membership_type'] = $membership_type;
        $temp_membership['pack_id'] = $pack_id;
        //issue #860
        //if (isset($_POST['mgm_upgrade_field']['autoresponder']) && ($_POST['mgm_upgrade_field']['autoresponder'])=='Y') {
        if (isset($_POST['mgm_upgrade_field']['autoresponder']) && substr($_POST['mgm_upgrade_field']['autoresponder'], 0, 1) == 'Y') {
            $temp_membership['subscribed'] = 'Y';
            $temp_membership['autoresponder'] = $system_obj->active_modules['autoresponder'];
        }
        //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']);
                    // redirect
                    mgm_redirect($redirect);
                    exit;
                } else {
                    // membership type check
                    // 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']);
                            // redirect
                            mgm_redirect($redirect);
                            exit;
                        }
                    }
                }
            }
        }
        //inserted an incomplete entry for the selected subscription type
        mgm_save_another_membership_fields($temp_membership, $user->ID);
        // save coupon fields and update member object
        $member = mgm_save_partial_fields_purchase_more($user->ID, $membership_type, $cost);
        // coupon
        $purchase_another_coupon = false;
        // array
        if (isset($member->upgrade)) {
            if (is_array($member->upgrade) && isset($member->upgrade['coupon']['id'])) {
                $purchase_another_coupon = $member->upgrade['coupon'];
            } elseif (is_object($member->upgrade) && isset($member->upgrade->coupon->id)) {
                $purchase_another_coupon = mgm_object2array($member->upgrade->coupon);
            }
            // coupon
            mgm_get_purchase_another_coupon_pack($purchase_another_coupon, $pack);
        }
        //save custom fields -issue #1285
        if (isset($_POST['mgm_upgrade_field']) && !empty($_POST['mgm_upgrade_field'])) {
            //member
            $cf_member = mgm_get_member($user->ID);
            //upgrade custom fileds
            $cfu_fileds = mgm_get_class('member_custom_fields')->get_fields_where(array('display' => array('on_multiple_membership_level_purchase' => 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($cf_member->custom_fields->{$cf_filed}['name'])) {
                        $cf_member->custom_fields->{$cf_filed}['name'] = $_POST['mgm_upgrade_field'][$cf_filed['name']];
                    } else {
                        $cf_member->custom_fields->{$cf_filed}['name'] = $_POST['mgm_upgrade_field'][$cf_filed['name']];
                    }
                }
            }
            $cf_member->save();
        }
        // start html
        $html = '<div>';
        // free
        if (($pack['cost'] == 0 || $membership_type == 'free') && in_array('mgm_free', $a_payment_modules) && mgm_get_module('mgm_free')->is_enabled()) {
            $html .= sprintf('<div>%s - %s</div>', __('Create a free account ', 'mgm'), ucwords($membership_type));
            $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 ($membership_type == 'trial') {
                if (in_array('mgm_trial', $a_payment_modules)) {
                    $module = 'mgm_trial';
                }
            }
            //Purchase Another Membership Level problem : issue #: 752
            $redirect = add_query_arg(array('method' => 'payment_return', 'module' => $module, 'custom' => $user->ID . '_' . $duration . '_' . $duration_type . '_' . $pack_id . '_Y', 'redirector' => $redirector), $payments_url);
            // redirect
            if (!headers_sent()) {
                @header('location: ' . $redirect);
                exit;
            }
            // js redirect
            $html .= sprintf('<script type="text/javascript">window.location = "%s";</script><div>%s</div>', $redirect, $packs_obj->get_pack_desc($pack));
        } else {
            $html .= sprintf('<div class="mgm_get_subs_btn">%s</div>', $packs_obj->get_pack_desc($pack));
            // coupon
            if (isset($purchase_another_coupon['id'])) {
                $html .= sprintf('<div class="mgm_get_subs_btn">%s</div>', sprintf(__('Using Coupon "%s" - %s', 'mgm'), $purchase_another_coupon['name'], $purchase_another_coupon['description']));
            }
            $html .= sprintf('<div class="mgm_get_subs_btn">%s</div>', __('Please Select from Available Payment Gateways', 'mgm'));
        }
        //bypass if payment gateway field is selected -issue #1764
        if ((double) $pack['cost'] > 0 && isset($_POST['mgm_payment_gateways']) && !empty($_POST['mgm_payment_gateways'])) {
            //init
            $tran_id = 0;
            if (!$tran_id) {
                $tran_id = mgm_add_transaction($pack, array('is_another_membership_purchase' => true, 'user_id' => $user->ID));
            }
            // module
            $mod_obj = mgm_get_module($_POST['mgm_payment_gateways'], 'payment');
            // module end point
            $redirect = $mod_obj->_get_endpoint('html_redirect', false);
            // encode id:
            //encode transaction id
            $encode_tran_id = mgm_encode_id($tran_id);
            //args
            $redirect = add_query_arg(array('tran_id' => $encode_tran_id), $redirect);
            // do the redirect to payment
            mgm_redirect($redirect);
        }
        // init
        $payment_modules = array();
        // when active
        if ($a_payment_modules) {
            // 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($pack['modules']) && !in_array($payment_module, (array) $pack['modules'])) {
                    continue;
                }
                // store
                $payment_modules[] = $payment_module;
            }
        }
        // loop payment mods if not free
        if (count($payment_modules) && $cost) {
            // transaction
            $tran_id = 0;
            // 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($pack, array('is_another_membership_purchase' => true, 'user_id' => $user->ID));
                if (!$tran_id) {
                    $tran_id = mgm_add_transaction($pack, array('is_another_membership_purchase' => true, 'user_id' => $user->ID));
                }
                // button
                $html .= sprintf('<div class="mgm_get_subs_btn">%s</div>', $mod_obj->get_button_subscribe(array('pack' => $pack, 'tran_id' => $tran_id)));
            }
        } else {
            if ($cost) {
                $html .= sprintf('<div class="mgm_get_subs_btn">%s</div>', __('There are no payment gateways available at this time.', 'mgm'));
            }
        }
        // html
        $html .= '</div>';
    } else {
        // first step show upgrade options
        // html
        $html = sprintf('<p class="message register">%s</p>', __('Please Select from Available Membership Packages', 'mgm'));
        // upgrade_packages
        $upgrade_packages = '';
        // pack to modules
        $pack_modules = array();
        // loop
        foreach ($packs as $pack) {
            // default
            $checked = '';
            // skip already purchased packs
            if (in_array($pack['id'], $pack_ids)) {
                continue;
            }
            //skip same membership level subscriptions
            if (in_array($pack['membership_type'], $pack_membership_types)) {
                continue;
            }
            // do not show trial or free as upgradre
            if ($pack['membership_type'] == 'trial' || $pack['membership_type'] == 'free') {
                continue;
            }
            // reset
            $checked = mgm_select_subscription($pack, $selected_subs);
            // skip other when a package sent as selected
            if ($selected_subs !== false) {
                if (empty($checked)) {
                    continue;
                }
            }
            // 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']];
            }
            $css_group = mgm_get_css_group();
            // encode pack
            $subs_opt_enc = mgm_encode_package($pack);
            // set
            $pack_modules[$subs_opt_enc] = $pack['modules'];
            //issue #867
            if ($css_group != 'none') {
                //expand this if needed
                $css_link_format = '<link rel="stylesheet" href="%s" type="text/css" media="all" />';
                $css_file = MGM_ASSETS_URL . 'css/' . $css_group . '/mgm.form.fields.css';
                $upgrade_packages .= sprintf($css_link_format, $css_file);
            }
            // free
            if (($pack['cost'] == 0 || strtolower($pack['membership_type']) == 'free') && in_array('mgm_free', $a_payment_modules) && mgm_get_module('mgm_free')->enabled == 'Y') {
                // 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>';
            }
        }
        // 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));
        }
        // show error
        if (!$upgrade_packages) {
            // html
            $html .= '<div class="mgm_subs_wrapper">
						<div class="mgm_subs_pack_desc">
							' . __('Sorry, no packages available.', 'mgm') . '
						</div>
					 </div>
					 <p>						
						<input type="button" name="cancel" onclick="window.location=\'' . $cancel_url . '\'" value="' . __('Cancel', 'mgm') . '" class="button-primary" />&nbsp;					
					 </p>';
        } else {
            /*			$error_field = mgm_request_var('error_field'); 
            			if(!empty($error_field)) {
            				$errors = new WP_Error();
            				switch (mgm_request_var('error_type')) {
            					case 'empty':
            						$error_string = 'You must provide a ';
            						break;
            					case 'invalid':
            						$error_string = 'Invalid ';
            						break;	
            				}				
            				//issue #703
            				$errors->add( $error_field, __( '<strong>ERROR</strong>: '.$error_string, 'mgm' ).$error_field );
            				$html .= mgm_set_errors($errors, true);					
            			}*/
            // check errors if any:
            $html .= mgm_subscription_purchase_errors();
            // form
            $html .= '<form action="' . $form_action . '" method="post" class="mgm_form"><div class="mgm_get_pack_form_container">';
            $html .= '<input type="hidden" name="form_action" value="' . $form_action . '" />';
            $html .= $upgrade_packages;
            //issue #1285
            $html .= mgm_get_custom_fields($user->ID, array('on_multiple_membership_level_purchase' => true), 'mgm_upgrade_field');
            // html
            $html .= '<input type="hidden" name="ref" value="' . md5($member->amount . '_' . $member->duration . '_' . $member->duration_type . '_' . $member->membership_type) . '" />';
            // set
            $html .= '<p>						
						<input class="button" type="submit" name="submit" value="' . __('Next', 'mgm') . '" />&nbsp;&nbsp;
						<input class="button" type="button" name="cancel" onclick="window.location=\'' . $cancel_url . '\'" value="' . __('Cancel', 'mgm') . '"/>&nbsp;					
					  </p>';
            // html
            $html .= '</div></form>';
        }
    }
    // return
    return $html;
}
function mgm_member_purchasable_contents($pagetype = 'admin')
{
    global $wpdb;
    // current_user
    $current_user = wp_get_current_user();
    // setting
    $setting = mgm_get_class('system')->get_setting();
    // snippet
    $snippet_length = 200;
    //  member
    $member = mgm_get_member($current_user->ID);
    $arr_memberships = mgm_get_subscribed_membershiptypes($current_user->ID, $member);
    // purchasable
    $purchasable_posts = mgm_get_membership_contents($arr_memberships, 'purchasable', $current_user->ID);
    // posts
    $posts = $purchasable_posts['posts'];
    // total posts
    $total_posts = $purchasable_posts['total_posts'];
    // total_post_rows
    $total_post_rows = $purchasable_posts['total_post_rows'];
    // init
    $html = $alt = '';
    // start output
    $html .= '<div class="table width100 br">' . '<div class="row br_bottom">' . '<div class="cell th_div width25 padding10px"><b>' . __('Post Title', 'mgm') . '</b></div>' . '<div class="cell th_div width45 padding10px"><b>' . __('Post Content', 'mgm') . '</b></div>' . '<div class="cell th_div width15 padding10px"><b>' . __('Price', 'mgm') . '</b></div>' . '<div class="cell th_div width15 padding10px"><b></b></div>' . '</div>';
    // check
    if ($total_posts) {
        $pattern = get_shortcode_regex();
        $currency = mgm_get_setting('currency');
        // loop
        foreach ($posts as $id => $obj) {
            // check purchasable
            $published = date('jS F Y', strtotime($obj->post_date));
            $title = $obj->post_title;
            $content = $obj->post_content;
            if (function_exists('qtrans_useCurrentLanguageIfNotFoundUseDefaultLanguage')) {
                $title = qtrans_useCurrentLanguageIfNotFoundUseDefaultLanguage($title);
                $content = qtrans_useCurrentLanguageIfNotFoundUseDefaultLanguage($content);
            }
            // strip_shortcodes
            $content = preg_replace('/' . $pattern . '/s', '', $content);
            $content = substr(strip_tags($content), 0, $snippet_length);
            $content .= strlen($content) > $snippet_length ? '...' : '';
            $html .= '<div class="row br_bottom ' . ($alt = $alt == '' ? 'alternate' : '') . '">' . '<div class="cell width25 padding10px"><a href="' . get_permalink($obj->ID) . '">' . $title . '</a></div>' . '<div class="cell width45 padding10px">' . $content . '</div>' . '<div class="cell width15 padding10px">' . $obj->purchase_cost . ' ' . $currency . '</div>' . '<div class="cell width15 padding10px"><a href="' . get_permalink($obj->ID) . '" class="button">' . __('Buy', 'mgm') . '</a></div>' . '</div>';
        }
    } else {
        $html .= '<div class="row ' . ($alt = $alt == '' ? 'alternate' : '') . '">' . '<div class="cell mgm_text_align_center">' . __('No purchasable contents', 'mgm') . '</div>' . '</div>';
    }
    $html .= '</div>';
    if ($total_posts > 0) {
        $html .= '<div class="mgm_margin10px">';
        if (isset($_GET['section']) && $_GET['section'] == 'purchasable') {
            $html .= '<div class="mgm_content_back_link_div">' . '<a href="' . ($pagetype == 'admin' ? admin_url('profile.php?page=mgm/membership/content') : mgm_get_custom_url('membership_contents')) . '" class="button">' . __('Back', 'mgm') . '</a>' . '</div>';
        }
        $html .= '<div class="mgm_content_total_post_div">' . sprintf(__('You have a total of %d premium %s you can purchase and access.', 'mgm'), $total_posts, $total_posts == 1 ? __('Post', 'mgm') : __('Posts', 'mgm')) . '</div>';
        $html .= '<div class="mgm_content_total_publish_div">';
        if (isset($_GET['section']) && $_GET['section'] == 'purchasable') {
            $html .= '<span class="pager">' . $purchasable_posts['pager'] . '</span>';
            //}elseif($total_post_rows > $total_posts) {
            //Do not show See All if number of records are <= $total_posts
        } elseif ($total_posts > count($posts)) {
            $html .= '<a href="' . ($pagetype == 'admin' ? admin_url('profile.php?page=mgm/membership/content&section=purchasable') : mgm_get_custom_url('membership_contents', false, array('section' => 'purchasable'))) . '" class="button">' . __('See All', 'mgm') . '</a>';
        }
        $html .= '</div>';
        $html .= '<br/><div class="clearfix"></div>';
        $html .= '</div>';
    }
    return $html;
}
 private function _save_member_object($user_id, $member, $previous_membership)
 {
     // pack
     $pack = mgm_get_class('subscription_packs')->get_pack($member->pack_id);
     // multiple_level_purchase
     $multiple_level_purchase = bool_from_yn(mgm_get_class('system')->get_setting('enable_multiple_level_purchase'));
     // update options
     $update_options = mgm_post_var('update_opt');
     // new level
     if (in_array('subscription', $update_options) && mgm_post_var('insert_new_level') == 'new') {
         // save flag
         $save = true;
         // guest
         if ($previous_membership->membership_type == "guest" && $previous_membership->amount == 0) {
             // check selected membership already selected:
             if ($previous_membership->membership_type == $member->membership_type) {
                 $save = false;
             }
         } else {
             // old
             $old_subtypes = mgm_get_subscribed_membershiptypes($user_id);
             //check selected membership already selected:
             if (in_array($member->membership_type, $old_subtypes)) {
                 $save = false;
             } else {
                 if (isset($member->custom_fields)) {
                     unset($member->custom_fields);
                 }
                 if (isset($member->other_membership_types) || empty($member->other_membership_types)) {
                     unset($member->other_membership_types);
                 }
             }
         }
         // save
         if ($save) {
             // multiple
             if ($multiple_level_purchase) {
                 mgm_save_another_membership_fields($member, $user_id);
             } else {
                 $member->save();
             }
         }
         // assign role:
         $change_order = isset($_POST['highlight_role']) && isset($_POST['upd_subscription_pack']) && $_POST['upd_subscription_pack'] != '-' ? true : false;
         // set
         $obj_role = new mgm_roles();
         $obj_role->add_user_role($user_id, $pack['role'], $change_order);
     } else {
         if (isset($_POST['ps_mem'][$user_id]) && !empty($_POST['ps_mem'][$user_id])) {
             if (isset($member->custom_fields)) {
                 unset($member->custom_fields);
             }
             if (isset($member->other_membership_types) || empty($member->other_membership_types)) {
                 unset($member->other_membership_types);
             }
             $prev_index = isset($_POST['ps_mem_index'][$user_id][$previous_membership->membership_type]) ? $_POST['ps_mem_index'][$user_id][$previous_membership->membership_type] : null;
             //uncomment
             mgm_save_another_membership_fields($member, $user_id, $prev_index);
         } else {
             $member->save();
         }
         if ($member->status == MGM_STATUS_EXPIRED) {
             //remove role from user:
             mgm_remove_userroles($user_id, $member);
         } else {
             //if($member->membership_type != $previous_membership->membership_type) {//check this condition
             //mgm role object:
             $change_order = isset($_POST['highlight_role']) && isset($_POST['upd_subscription_pack']) && $_POST['upd_subscription_pack'] != '-' ? true : false;
             $obj_role = new mgm_roles();
             //update role/change order
             $obj_role->add_user_role($user_id, $pack['role'], $change_order);
             //}
         }
     }
     return true;
 }
/**
 * check any more subscriptions exist to purchase:
 */
function mgm_check_purchasable_level_exists($user_id, $member = null)
{
    $subscribed_types = mgm_get_subscribed_membershiptypes($user_id, $member);
    $subscribed_types = array_unique(array_merge($subscribed_types, array('free', 'trial', 'guest')));
    $membership_types_obj = mgm_get_class('membership_types')->membership_types;
    $membership_types_obj = array_unique(array_keys($membership_types_obj));
    return count($subscribed_types) > 3 && count(array_diff($membership_types_obj, $subscribed_types)) == 0 ? false : true;
}