/**
  * Get available tabs for Membership2 page.
  *
  * @since  1.0.0
  *
  * @return array The tabs configuration.
  */
 public function get_available_tabs()
 {
     static $Tabs = null;
     if (null === $Tabs) {
         $membership = $this->load_membership();
         $membership_id = $membership->id;
         $is_base = $membership->is_base();
         $settings = MS_Factory::load('MS_Model_Settings');
         // First create a list including all possible tabs.
         $tabs = array(MS_Rule_Page::RULE_ID => true, MS_Rule_Post::RULE_ID => true, MS_Rule_Category::RULE_ID => true, MS_Rule_Content::RULE_ID => true, MS_Rule_Media::RULE_ID => true, MS_Rule_MenuItem::RULE_ID => true, MS_Rule_ReplaceMenu::RULE_ID => true, MS_Rule_ReplaceLocation::RULE_ID => true, MS_Rule_Shortcode::RULE_ID => true, MS_Rule_Url::RULE_ID => true, MS_Rule_Special::RULE_ID => true, MS_Rule_MemberCaps::RULE_ID => true, MS_Rule_MemberRoles::RULE_ID => true);
         // Now remove items from the list that are not available.
         // Optionally show "Posts"
         if (!MS_Model_Addon::is_enabled(MS_Model_Addon::ADDON_POST_BY_POST)) {
             $tabs[MS_Rule_Post::RULE_ID] = false;
         }
         // Optionally show "Category"
         if (!MS_Model_Addon::is_enabled(MS_Addon_Category::ID)) {
             $tabs[MS_Rule_Category::RULE_ID] = false;
         }
         // Optionally show "Media"
         if (!MS_Model_Addon::is_enabled(MS_Addon_Mediafiles::ID)) {
             $tabs[MS_Rule_Media::RULE_ID] = false;
         }
         // Either "Menu Item" or "Menus" or "Menu Location"
         switch ($settings->menu_protection) {
             case 'menu':
                 $tabs[MS_Rule_MenuItem::RULE_ID] = false;
                 $tabs[MS_Rule_ReplaceLocation::RULE_ID] = false;
                 break;
             case 'location':
                 $tabs[MS_Rule_MenuItem::RULE_ID] = false;
                 $tabs[MS_Rule_ReplaceMenu::RULE_ID] = false;
                 break;
             case 'item':
             default:
                 $tabs[MS_Rule_ReplaceMenu::RULE_ID] = false;
                 $tabs[MS_Rule_ReplaceLocation::RULE_ID] = false;
                 break;
         }
         // Maybe "Special Pages".
         if (!MS_Model_Addon::is_enabled(MS_Model_Addon::ADDON_SPECIAL_PAGES)) {
             $tabs[MS_Rule_Special::RULE_ID] = false;
         }
         // Maybe "URLs"
         if (!MS_Model_Addon::is_enabled(MS_Model_Addon::ADDON_URL_GROUPS)) {
             $tabs[MS_Rule_Url::RULE_ID] = false;
         }
         // Maybe "Shortcodes"
         if (!MS_Model_Addon::is_enabled(MS_Model_Addon::ADDON_SHORTCODE)) {
             $tabs[MS_Rule_Shortcode::RULE_ID] = false;
         }
         // Maybe "Membercaps"
         if (MS_Model_Addon::is_enabled(MS_Model_Addon::ADDON_MEMBERCAPS)) {
             if (MS_Model_Addon::is_enabled(MS_Model_Addon::ADDON_MEMBERCAPS_ADV)) {
                 $tabs[MS_Rule_MemberRoles::RULE_ID] = false;
             } else {
                 $tabs[MS_Rule_MemberCaps::RULE_ID] = false;
             }
         } else {
             $tabs[MS_Rule_MemberRoles::RULE_ID] = false;
             $tabs[MS_Rule_MemberCaps::RULE_ID] = false;
         }
         lib2()->array->equip($_GET, 'page');
         // Allow Add-ons to add or remove rule tabs
         $tabs = apply_filters('ms_controller_protection_tabs', $tabs, $membership_id);
         $page = sanitize_html_class($_GET['page'], MS_Controller_Plugin::MENU_SLUG . '-memberships');
         $rule_titles = MS_Model_Rule::get_rule_type_titles();
         $result = array();
         foreach ($tabs as $rule_type => $state) {
             if (!$state) {
                 continue;
             }
             $url = sprintf('%s?page=%s&tab=%s', admin_url('admin.php'), $page, $rule_type);
             // Try to keep the selected Membership and Status filter.
             if (!empty($_REQUEST['membership_id'])) {
                 $url = esc_url_raw(add_query_arg(array('membership_id' => $_REQUEST['membership_id']), $url));
             }
             if (!empty($_REQUEST['status'])) {
                 $url = esc_url_raw(add_query_arg(array('status' => $_REQUEST['status']), $url));
             }
             $result[$rule_type] = array('title' => $rule_titles[$rule_type], 'url' => $url);
         }
         $Tabs = apply_filters('ms_controller_protection_get_available_tabs', $result, $membership_id, $this);
     }
     return $Tabs;
 }
    /**
     * Echo a content list as 2-column table that show Content-Title and the
     * Available date.
     * Used by Dripped-Content view.
     *
     * @since  1.0.0
     *
     * @param  array $contents List of content items to display.
     */
    protected function content_box($contents)
    {
        $row_class = '';
        ksort($contents);
        $rule_titles = MS_Model_Rule::get_rule_type_titles();
        $edit_url = MS_Controller_Plugin::get_admin_url('protection', array('tab' => $rule->rule_type));
        $edit_link = array('id' => 'edit_dripped', 'type' => MS_Helper_Html::TYPE_HTML_LINK);
        ?>
		<table class="ms-list-table ms-list-date widefat">
			<thead>
				<tr>
					<th class="col-icon">&nbsp;</th>
					<th class="col-text"><?php 
        _e('Rule', MS_TEXT_DOMAIN);
        ?>
</th>
					<th class="col-text"><?php 
        _e('Protected Item', MS_TEXT_DOMAIN);
        ?>
</th>
					<th class="col-date"><?php 
        _e('Access', MS_TEXT_DOMAIN);
        ?>
</th>
				</tr>
			</thead>
			<tbody>
			<?php 
        foreach ($contents as $id => $content) {
            $row_class = $row_class == 'alternate' ? '' : 'alternate';
            ?>
				<tr class="<?php 
            echo esc_attr($row_class . ' ' . $content->icon);
            ?>
">
					<td class="col-icon">
						<i class="dashicons dashicons-<?php 
            echo esc_attr($content->icon);
            ?>
"></i>
					</td>
					<td class="col-text col-type">
						<?php 
            $edit_link['url'] = esc_url_raw(add_query_arg('tab', $content->type, $edit_url));
            $edit_link['value'] = $rule_titles[$content->type];
            MS_Helper_Html::html_element($edit_link);
            ?>
					</td>
					<td class="col-text">
						<?php 
            MS_Helper_Html::content_tag($content, 'span');
            ?>
					</td>
					<td class="col-date">
						<?php 
            echo '' . $content->date;
            ?>
					</td>
				</tr>
			<?php 
        }
        ?>
			</tbody>
		</table>
		<?php 
    }
    /**
     * Echo a content list as tag-list.
     *
     * @since  1.0.0
     *
     * @param  array $contents List of content items to display.
     */
    protected function content_box($rule)
    {
        static $row_items = 0;
        $rule_titles = MS_Model_Rule::get_rule_type_titles();
        $title = $rule_titles[$rule->rule_type];
        $contents = (array) $rule->get_contents(null, true);
        $membership_id = $this->data['membership']->id;
        $row_items += 1;
        $new_row = $row_items % 4 === 0;
        $show_sep = ($row_items - 1) % 4 === 0;
        if ($show_sep && $row_items > 1) {
            MS_Helper_Html::html_separator();
        }
        ?>
		<div class="ms-part-4 ms-min-height">
			<?php 
        if (!$new_row) {
            MS_Helper_Html::html_separator('vertical');
        }
        ?>
			<div class="ms-bold">
				<?php 
        printf('%s (%s):', $title, $rule->count_rules());
        ?>
			</div>

			<div class="inside">
				<ul class="ms-content-tag-list ms-group">
				<?php 
        foreach ($contents as $content) {
            if ($content->access) {
                MS_Helper_Html::content_tag($content);
            }
        }
        ?>
				</ul>

				<div class="ms-protection-edit-wrapper">
					<?php 
        $edit_url = MS_Controller_Plugin::get_admin_url('protection', array('tab' => $rule->rule_type, 'membership_id' => $membership_id));
        MS_Helper_Html::html_element(array('id' => 'edit_' . $rule->rule_type, 'type' => MS_Helper_Html::TYPE_HTML_LINK, 'title' => $title, 'value' => sprintf(__('Edit %s Access', 'membership2'), $title), 'url' => $edit_url, 'class' => 'wpmui-field-button button'));
        ?>
				</div>
			</div>
		</div>
		<?php 
        if ($new_row) {
            echo '</div><div class="ms-group">';
        }
    }
    /**
     * Output details on which membership denied or allowed access to the
     * current page
     *
     * @since  1.0.0
     * @param  string $denied_url URL of the denied page (empty if not denied)
     * @param  int $membership_id Membership_id
     * @param  array $rules List of Rule_types
     */
    protected function output_deciding_info($denied_url, $membership_id, $rules)
    {
        $membership = MS_Factory::load('MS_Model_Membership', $membership_id);
        $rule_title = MS_Model_Rule::get_rule_type_titles();
        if (!empty($denied_url)) {
            ?>
			<div class="ms-sim-denied">
			<?php 
            printf(__('Access denied by %s', MS_TEXT_DOMAIN), '<b>' . esc_html($membership->name) . '</b>');
            ?>
			</div>
			<ul class="ms-sim-rules">
			<?php 
            printf('<li><a href="%1$s">%1$s</a></li>', $denied_url);
            foreach ($rules as $rule_type) {
                printf('<li><a href="%1$s" target="_blank">%3$s %2$s</a></li>', MS_Controller_Plugin::get_admin_url('protection', array('tab' => $rule_type, 'membership_id' => $membership->id)), $rule_title[$rule_type], __('Denied by Rule:', MS_TEXT_DOMAIN));
            }
            ?>
		<?php 
        } elseif ($membership->is_valid()) {
            ?>
			<div class="ms-sim-allowed">
			<?php 
            printf(__('Access granted by %s', MS_TEXT_DOMAIN), '<b>' . esc_html($membership->name) . '</b>');
            ?>
			</div>
			<ul class="ms-sim-rules">
			<?php 
            foreach ($rules as $rule_type) {
                printf('<li><a href="%1$s" target="_blank">%3$s %2$s</a></li>', MS_Controller_Plugin::get_admin_url('protection', array('tab' => $rule_type, 'membership_id' => $membership->id)), $rule_title[$rule_type], __('Allowed by Rule:', MS_TEXT_DOMAIN));
            }
            ?>
			</ul>
		<?php 
        } else {
            ?>
			<div class="ms-sim-public">
			<?php 
            _e('Unprotected', MS_TEXT_DOMAIN);
            ?>
			</div>
		<?php 
        }
    }