/**
 * Show edit group form.
 * @param int $group_id group id
 */
function groups_admin_groups_edit($group_id)
{
    global $wpdb;
    if (!current_user_can(GROUPS_ADMINISTER_GROUPS)) {
        wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
    }
    $group = Groups_Group::read(intval($group_id));
    if (empty($group)) {
        wp_die(__('No such group.', GROUPS_PLUGIN_DOMAIN));
    }
    $current_url = (is_ssl() ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    $current_url = remove_query_arg('action', $current_url);
    $current_url = remove_query_arg('group_id', $current_url);
    $name = isset($_POST['name-field']) ? $_POST['name-field'] : $group->name;
    $description = isset($_POST['description-field']) ? $_POST['description-field'] : $group->description;
    $parent_id = isset($_POST['parent-id-field']) ? $_POST['parent-id-field'] : $group->parent_id;
    $group_table = _groups_get_tablename('group');
    $parent_select = '<select name="parent-id-field">';
    $parent_select .= '<option value="">--</option>';
    $groups = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$group_table} WHERE group_id != %d", $group->group_id));
    foreach ($groups as $g) {
        $selected = $g->group_id == $group->parent_id ? ' selected="selected" ' : '';
        $parent_select .= '<option ' . $selected . 'value="' . esc_attr($g->group_id) . '">' . wp_filter_nohtml_kses($g->name) . '</option>';
    }
    $parent_select .= '</select>';
    $name_readonly = $name !== Groups_Registered::REGISTERED_GROUP_NAME ? "" : ' readonly="readonly" ';
    $output = '<div class="manage-groups">' . '<div>' . '<h2>' . __('Edit a group', GROUPS_PLUGIN_DOMAIN) . '</h2>' . '</div>' . '<form id="edit-group" action="' . $current_url . '" method="post">' . '<div class="group edit">' . '<input id="group-id-field" name="group-id-field" type="hidden" value="' . esc_attr(intval($group_id)) . '"/>' . '<div class="field">' . '<label for="name-field" class="field-label first required">' . __('Name', GROUPS_PLUGIN_DOMAIN) . '</label>' . '<input ' . $name_readonly . ' id="name-field" name="name-field" class="namefield" type="text" value="' . esc_attr($name) . '"/>' . '</div>' . '<div class="field">' . '<label for="parent-id-field" class="field-label">' . __('Parent', GROUPS_PLUGIN_DOMAIN) . '</label>' . $parent_select . '</div>' . '<div class="field">' . '<label for="description-field" class="field-label description-field">' . __('Description', GROUPS_PLUGIN_DOMAIN) . '</label>' . '<textarea id="description-field" name="description-field" rows="5" cols="45">' . wp_filter_nohtml_kses($description) . '</textarea>' . '</div>' . '<div class="field">' . wp_nonce_field('groups-edit', GROUPS_ADMIN_GROUPS_NONCE, true, false) . '<input class="button" type="submit" value="' . __('Save', GROUPS_PLUGIN_DOMAIN) . '"/>' . '<input type="hidden" value="edit" name="action"/>' . '<a class="cancel" href="' . $current_url . '">' . __('Cancel', GROUPS_PLUGIN_DOMAIN) . '</a>' . '</div>' . '</div>' . '</form>' . '</div>';
    // .manage-groups
    echo $output;
    Groups_Help::footer();
}
/**
 * Show add group form.
 */
function groups_admin_groups_add()
{
    global $wpdb;
    if (!current_user_can(GROUPS_ADMINISTER_GROUPS)) {
        wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
    }
    $current_url = (is_ssl() ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    $current_url = remove_query_arg('paged', $current_url);
    $current_url = remove_query_arg('action', $current_url);
    $current_url = remove_query_arg('group_id', $current_url);
    $parent_id = isset($_POST['parent-id-field']) ? $_POST['parent-id-field'] : '';
    $name = isset($_POST['name-field']) ? $_POST['name-field'] : '';
    $description = isset($_POST['description-field']) ? $_POST['description-field'] : '';
    $group_table = _groups_get_tablename('group');
    $parent_select = '<select name="parent-id-field">';
    $parent_select .= '<option value="">--</option>';
    $groups = $wpdb->get_results("SELECT * FROM {$group_table}");
    foreach ($groups as $group) {
        $parent_select .= '<option value="' . esc_attr($group->group_id) . '">' . wp_filter_nohtml_kses($group->name) . '</option>';
    }
    $parent_select .= '</select>';
    $output = '<div class="manage-groups">' . '<div>' . '<h2>' . __('Add a new group', GROUPS_PLUGIN_DOMAIN) . '</h2>' . '</div>' . '<form id="add-group" action="' . $current_url . '" method="post">' . '<div class="group new">' . '<div class="field">' . '<label for="name-field" class="field-label first required">' . __('Name', GROUPS_PLUGIN_DOMAIN) . '</label>' . '<input id="name-field" name="name-field" class="namefield" type="text" value="' . esc_attr($name) . '"/>' . '</div>' . '<div class="field">' . '<label for="parent-id-field" class="field-label">' . __('Parent', GROUPS_PLUGIN_DOMAIN) . '</label>' . $parent_select . '</div>' . '<div class="field">' . '<label for="description-field" class="field-label description-field">' . __('Description', GROUPS_PLUGIN_DOMAIN) . '</label>' . '<textarea id="description-field" name="description-field" rows="5" cols="45">' . wp_filter_nohtml_kses($description) . '</textarea>' . '</div>' . '<div class="field">' . wp_nonce_field('groups-add', GROUPS_ADMIN_GROUPS_NONCE, true, false) . '<input class="button" type="submit" value="' . __('Add', GROUPS_PLUGIN_DOMAIN) . '"/>' . '<input type="hidden" value="add" name="action"/>' . '<a class="cancel" href="' . $current_url . '">' . __('Cancel', GROUPS_PLUGIN_DOMAIN) . '</a>' . '</div>' . '</div>' . '</form>' . '</div>';
    // .manage-groups
    echo $output;
    Groups_Help::footer();
}
/**
 * Renders the content of the Add-Ons section.
 */
function groups_admin_add_ons()
{
    echo '<div class="groups-admin-add-ons">';
    echo '<h1>';
    echo __('Add-Ons', GROUPS_PLUGIN_DOMAIN);
    echo '</h1>';
    echo '<h2>';
    echo __('Recommended extensions for Groups', GROUPS_PLUGIN_DOMAIN);
    echo '</h2>';
    $entries = array('groups-file-access' => array('title' => 'Groups File Access', 'content' => 'Groups File Access is a WordPress plugin that allows to provide file download links for authorized users. Access to files is restricted to users by their group membership.', 'image' => GROUPS_PLUGIN_URL . 'images/add-ons/groups-file-access.png', 'url' => 'http://www.itthinx.com/shop/groups-file-access/', 'index' => 100), 'groups-forums' => array('title' => 'Groups Forums', 'content' => 'Groups Forums provides a powerful and yet light-weight forum system for WordPress sites.', 'image' => GROUPS_PLUGIN_URL . 'images/add-ons/groups-forums.png', 'url' => 'http://www.itthinx.com/shop/groups-forums/', 'index' => 100), 'groups-gravity-forms' => array('title' => 'Groups Gravity Forms', 'content' => 'This extension integrates Groups with Gravity Forms. It allows to add users to groups automatically, based on form submissions.', 'image' => GROUPS_PLUGIN_URL . 'images/add-ons/groups-gravity-forms.png', 'url' => 'http://www.itthinx.com/shop/groups-gravity-forms/', 'index' => 100), 'groups-import-export' => array('title' => 'Groups Import Export', 'content' => 'This is an extension for Groups, providing import and export facilities. Users can be imported and assigned to groups in bulk from a text file. Users can be exported in bulk, including all users or users that belong to specific groups.', 'image' => GROUPS_PLUGIN_URL . 'images/add-ons/groups-import-export.png', 'url' => 'http://www.itthinx.com/shop/groups-import-export/', 'index' => 100), 'groups-newsletters' => array('title' => 'Groups Newsletter', 'content' => 'Newsletter Campaigns for Subscribers and Groups. Groups Newsletters helps you to communicate efficiently, providing targeted information to groups of recipients through automated campaigns.', 'image' => GROUPS_PLUGIN_URL . 'images/add-ons/groups-newsletters.png', 'url' => 'http://www.itthinx.com/shop/groups-newsletters/', 'index' => 100), 'groups-paypal' => array('title' => 'Groups PayPal', 'content' => 'Sell memberships and subscriptions with Groups and PayPal.', 'image' => GROUPS_PLUGIN_URL . 'images/add-ons/groups-paypal.png', 'url' => 'http://www.itthinx.com/shop/groups-paypal/', 'index' => 10), 'groups-restrict-categories' => array('title' => 'Groups Restrict Categories', 'content' => 'Access restrictions for categories and tags, also supporting custom post types and taxonomies.', 'image' => GROUPS_PLUGIN_URL . 'images/add-ons/groups-restrict-categories.png', 'url' => 'http://www.itthinx.com/shop/groups-restrict-categories/', 'index' => 10), 'groups-restrict-comments-pro' => array('title' => 'Groups Restrict Comments Pro', 'content' => 'This extension allows to restrict who can post or read comments based on a user’s group membership.', 'image' => GROUPS_PLUGIN_URL . 'images/add-ons/groups-restrict-comments-pro.png', 'url' => 'http://www.itthinx.com/shop/groups-restrict-comments-pro/', 'index' => 100), 'groups-woocommerce' => array('title' => 'Groups WooCommerce', 'content' => 'This extension allows you to sell memberships with WooCommerce.', 'image' => GROUPS_PLUGIN_URL . 'images/add-ons/groups-woocommerce.png', 'url' => 'http://www.itthinx.com/shop/groups-woocommerce/', 'index' => 20), 'widgets-control-pro' => array('title' => 'Widgets Control Pro', 'content' => 'An advanced Widget toolbox that adds visibility management and helps to control where widgets are shown efficiently. Show or hide widgets based on a user’s group membership.', 'image' => GROUPS_PLUGIN_URL . 'images/add-ons/widgets-control-pro.png', 'url' => 'http://www.itthinx.com/shop/widgets-control-pro/', 'index' => 20), 'woocommerce-group-coupons' => array('title' => 'WooCommerce Group Coupons', 'content' => 'This extension allows to limit the validity of coupons based on groups and roles.', 'image' => GROUPS_PLUGIN_URL . 'images/add-ons/woocommerce-group-coupons.png', 'url' => 'http://www.itthinx.com/shop/woocommerce-group-coupons/', 'index' => 100), 'woocommerce-groups-newsletters' => array('title' => 'WooCommerce Groups Newsletters', 'content' => 'The WooCommerce Groups Newsletters extension lets customers subscribe to newsletters at checkout.', 'image' => GROUPS_PLUGIN_URL . 'images/add-ons/woocommerce-groups-newsletters.png', 'url' => 'http://www.itthinx.com/shop/woocommerce-groups-newsletters/', 'index' => 100));
    usort($entries, 'groups_admin_add_ons_sort');
    echo '<ul class="add-ons">';
    foreach ($entries as $key => $entry) {
        echo '<li class="add-on">';
        echo sprintf('<a href="%s">', $entry['url']);
        echo '<h3>';
        echo sprintf('<img src="%s"/>', $entry['image']);
        echo $entry['title'];
        echo '</h3>';
        echo '<p>';
        echo $entry['content'];
        echo '</p>';
        echo '</a>';
        echo '</li>';
        // .add-on
    }
    echo '</ul>';
    // .add-ons
    echo '<h2>';
    echo __('Recommended plugins by itthinx', GROUPS_PLUGIN_DOMAIN);
    echo '</h2>';
    $entries = array('affiliates-pro' => array('title' => 'Affiliates Pro', 'content' => 'Boost Sales with Affiliate Marketing for your WordPress site.', 'image' => GROUPS_PLUGIN_URL . 'images/add-ons/affiliates-pro.png', 'url' => 'http://www.itthinx.com/shop/affiliates-pro/', 'index' => 100), 'affiliates-enterprise' => array('title' => 'Affiliates Enterprise', 'content' => 'Affiliates Enterprise provides an affiliate management system for sellers, shops and developers, who want to boost sales with their own affiliate program. Features affiliate campaigns, tracking pixels and multiple tiers.', 'image' => GROUPS_PLUGIN_URL . 'images/add-ons/affiliates-enterprise.png', 'url' => 'http://www.itthinx.com/shop/affiliates-enterprise/', 'index' => 100));
    usort($entries, 'groups_admin_add_ons_sort');
    echo '<ul class="add-ons">';
    foreach ($entries as $key => $entry) {
        echo '<li class="add-on">';
        echo sprintf('<a href="%s">', $entry['url']);
        echo '<h3>';
        echo sprintf('<img src="%s"/>', $entry['image']);
        echo $entry['title'];
        echo '</h3>';
        echo '<p>';
        echo $entry['content'];
        echo '</p>';
        echo '</a>';
        echo '</li>';
        // .add-on
    }
    echo '</ul>';
    // .add-ons
    echo '</div>';
    // .groups-admin-add-ons
    Groups_Help::footer();
}
/**
 * Tree view : a simple tree view
 */
function groups_admin_tree_view()
{
    global $wpdb;
    $output = '';
    $today = date('Y-m-d', time());
    if (!current_user_can(GROUPS_ACCESS_GROUPS)) {
        wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
    }
    $output .= '<div class="groups-tree-view">' . '<h1>' . __('Tree of Groups', GROUPS_PLUGIN_DOMAIN) . '</h1>';
    $tree = Groups_Utility::get_group_tree();
    $tree_output = '';
    Groups_Utility::render_group_tree($tree, $tree_output);
    $output .= $tree_output;
    $output .= '</div>';
    // .groups-tree-view
    echo $output;
    Groups_Help::footer();
}
/**
 * Show add capability form.
 */
function groups_admin_capabilities_add()
{
    global $wpdb;
    if (!current_user_can(GROUPS_ADMINISTER_GROUPS)) {
        wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
    }
    $current_url = (is_ssl() ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    $current_url = remove_query_arg('paged', $current_url);
    $current_url = remove_query_arg('action', $current_url);
    $current_url = remove_query_arg('capability_id', $current_url);
    $capability = isset($_POST['capability-field']) ? $_POST['capability-field'] : '';
    $description = isset($_POST['description-field']) ? $_POST['description-field'] : '';
    $capability_table = _groups_get_tablename('capability');
    $output = '<div class="manage-capabilities">' . '<div>' . '<h2>' . __('Add a new capability', GROUPS_PLUGIN_DOMAIN) . '</h2>' . '</div>' . Groups_Admin::render_messages() . '<form id="add-capability" action="' . esc_url($current_url) . '" method="post">' . '<div class="capability new">' . '<div class="field">' . '<label for="capability-field" class="field-label first required">' . __('Capability', GROUPS_PLUGIN_DOMAIN) . '</label>' . '<input id="name-field" name="capability-field" class="capability-field" type="text" value="' . esc_attr(stripslashes($capability)) . '"/>' . '</div>' . '<div class="field">' . '<label for="description-field" class="field-label description-field">' . __('Description', GROUPS_PLUGIN_DOMAIN) . '</label>' . '<textarea id="description-field" name="description-field" rows="5" cols="45">' . stripslashes(wp_filter_nohtml_kses($description)) . '</textarea>' . '</div>' . '<div class="field">' . wp_nonce_field('capabilities-add', GROUPS_ADMIN_GROUPS_NONCE, true, false) . '<input class="button button-primary" type="submit" value="' . __('Add', GROUPS_PLUGIN_DOMAIN) . '"/>' . '<input type="hidden" value="add" name="action"/>' . '<a class="cancel button" href="' . esc_url($current_url) . '">' . __('Cancel', GROUPS_PLUGIN_DOMAIN) . '</a>' . '</div>' . '</div>' . '</form>' . '</div>';
    // .manage-capabilities
    echo $output;
    Groups_Help::footer();
}
/**
 * Shows form to confirm removal of a group.
 * @param int $group_id group id
 */
function groups_admin_groups_remove($group_id)
{
    global $wpdb;
    if (!current_user_can(GROUPS_ADMINISTER_GROUPS)) {
        wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
    }
    $group = Groups_Group::read(intval($group_id));
    if (empty($group)) {
        wp_die(__('No such group.', GROUPS_PLUGIN_DOMAIN));
    }
    $group_table = _groups_get_tablename('group');
    $current_url = (is_ssl() ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    $current_url = remove_query_arg('action', $current_url);
    $current_url = remove_query_arg('group_id', $current_url);
    $output = '<div class="manage-groups">' . '<div>' . '<h2>' . __('Remove a group', GROUPS_PLUGIN_DOMAIN) . '</h2>' . '</div>' . '<form id="remove-group" action="' . $current_url . '" method="post">' . '<div class="group remove">' . '<input id="group-id-field" name="group-id-field" type="hidden" value="' . esc_attr(intval($group->group_id)) . '"/>' . '<ul>' . '<li>' . sprintf(__('Group Name : %s', GROUPS_PLUGIN_DOMAIN), wp_filter_nohtml_kses($group->name)) . '</li>' . '</ul> ' . wp_nonce_field('groups-remove', GROUPS_ADMIN_GROUPS_NONCE, true, false) . '<input class="button" type="submit" value="' . __('Remove', GROUPS_PLUGIN_DOMAIN) . '"/>' . '<input type="hidden" value="remove" name="action"/>' . '<a class="cancel" href="' . $current_url . '">' . __('Cancel', GROUPS_PLUGIN_DOMAIN) . '</a>' . '</div>' . '</div>' . '</form>' . '</div>';
    // .manage-groups
    echo $output;
    Groups_Help::footer();
}
/**
 * Show edit capability form.
 * @param int $capability_id capability id
 */
function groups_admin_capabilities_edit($capability_id)
{
    global $wpdb;
    if (!current_user_can(GROUPS_ADMINISTER_GROUPS)) {
        wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
    }
    $capability = Groups_Capability::read(intval($capability_id));
    if (empty($capability)) {
        wp_die(__('No such capability.', GROUPS_PLUGIN_DOMAIN));
    }
    $current_url = (is_ssl() ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    $current_url = remove_query_arg('action', $current_url);
    $current_url = remove_query_arg('capability_id', $current_url);
    $capability_capability = isset($_POST['capability-field']) ? $_POST['capability-field'] : $capability->capability;
    $description = isset($_POST['description-field']) ? $_POST['description-field'] : $capability->description;
    $capability_readonly = $capability->capability !== Groups_Post_Access::READ_POST_CAPABILITY ? "" : ' readonly="readonly" ';
    $output = '<div class="manage-capabilities">' . '<div>' . '<h1>' . __('Edit a capability', GROUPS_PLUGIN_DOMAIN) . '</h1>' . '</div>' . Groups_Admin::render_messages() . '<form id="edit-capability" action="' . esc_url($current_url) . '" method="post">' . '<div class="capability edit">' . '<input id="capability-id-field" name="capability-id-field" type="hidden" value="' . esc_attr(intval($capability_id)) . '"/>' . '<div class="field">' . '<label for="capability-field" class="field-label first required">' . __('Capability', GROUPS_PLUGIN_DOMAIN) . '</label>' . '<input ' . $capability_readonly . ' id="capability-field" name="capability-field" class="capability-field" type="text" value="' . esc_attr(stripslashes($capability_capability)) . '"/>' . '</div>' . '<div class="field">' . '<label for="description-field" class="field-label description-field">' . __('Description', GROUPS_PLUGIN_DOMAIN) . '</label>' . '<textarea id="description-field" name="description-field" rows="5" cols="45">' . stripslashes(wp_filter_nohtml_kses($description)) . '</textarea>' . '</div>' . '<div class="field">' . wp_nonce_field('capabilities-edit', GROUPS_ADMIN_GROUPS_NONCE, true, false) . '<input class="button button-primary" type="submit" value="' . __('Save', GROUPS_PLUGIN_DOMAIN) . '"/>' . '<input type="hidden" value="edit" name="action"/>' . '<a class="cancel button" href="' . esc_url($current_url) . '">' . __('Cancel', GROUPS_PLUGIN_DOMAIN) . '</a>' . '</div>' . '</div>' . '</form>' . '</div>';
    // .manage-capabilities
    echo $output;
    Groups_Help::footer();
}
Example #8
0
function groups_network_admin_options()
{
    if (!current_user_can(GROUPS_ADMINISTER_OPTIONS)) {
        wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
    }
    echo '<div>' . '<h2>' . __('Groups network options', GROUPS_PLUGIN_DOMAIN) . '</h2>' . '</div>';
    // handle options form submission
    if (isset($_POST['submit'])) {
        if (wp_verify_nonce($_POST[GROUPS_ADMIN_OPTIONS_NONCE], 'admin')) {
            // delete data
            if (!empty($_POST['delete-data'])) {
                Groups_Options::update_option('groups_network_delete_data', true);
            } else {
                Groups_Options::update_option('groups_network_delete_data', false);
            }
        }
    }
    $delete_data = Groups_Options::get_option('groups_network_delete_data', false);
    // options form
    echo '<form action="" name="options" method="post">' . '<div>' . '<h3>' . __('Network deactivation and data persistence', GROUPS_PLUGIN_DOMAIN) . '</h3>' . '<p>' . '<input name="delete-data" type="checkbox" ' . ($delete_data ? 'checked="checked"' : '') . '/>' . '<label for="delete-data">' . __('Delete all Groups plugin data for ALL sites on network deactivation', GROUPS_PLUGIN_DOMAIN) . '</label>' . '</p>' . '<p class="description warning">' . __('CAUTION: If this option is active while the plugin is deactivated, ALL plugin settings and data will be DELETED for <strong>all sites</strong>. If you are going to use this option, now would be a good time to make a backup. By enabling this option you agree to be solely responsible for any loss of data or any other consequences thereof.', GROUPS_PLUGIN_DOMAIN) . '</p>' . '<p>' . wp_nonce_field('admin', GROUPS_ADMIN_OPTIONS_NONCE, true, false) . '<input type="submit" name="submit" value="' . __('Save', GROUPS_PLUGIN_DOMAIN) . '"/>' . '</p>' . '</div>' . '</form>';
    Groups_Help::footer();
}
/**
 * Shows form to confirm removal bulk capabilities
 */
function groups_admin_capabilities_bulk_remove()
{
    global $wpdb;
    $output = '';
    if (!current_user_can(GROUPS_ADMINISTER_GROUPS)) {
        wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
    }
    $capability_ids = isset($_POST['capability_ids']) ? $_POST['capability_ids'] : null;
    if (!$capability_ids) {
        wp_die(__('No such capabilities.', GROUPS_PLUGIN_DOMAIN));
    }
    $capabilities = array();
    foreach ($capability_ids as $capability_id) {
        $capability = Groups_Capability::read(intval($capability_id));
        if ($capability) {
            $capabilities[] = $capability;
        }
    }
    $current_url = (is_ssl() ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    $current_url = remove_query_arg('action', $current_url);
    $current_url = remove_query_arg('capability_id', $current_url);
    $output .= '<div class="manage-capabilities">';
    $output .= '<div>';
    $output .= '<h2>';
    $output .= __('Remove capabilities', GROUPS_PLUGIN_DOMAIN);
    $output .= '</h2>';
    $output .= '</div>';
    $output .= '<form id="capabilities-action" method="post" action="">';
    $output .= '<div class="capability remove">';
    $output .= '<p>';
    $output .= __('Please confirm to remove the following capabilities. This action cannot be undone.', GROUPS_PLUGIN_DOMAIN);
    $output .= '</p>';
    foreach ($capabilities as $capability) {
        $output .= '<input id="capability_ids" name="capability_ids[]" type="hidden" value="' . esc_attr(intval($capability->capability_id)) . '"/>';
        $output .= '<ul>';
        $output .= '<li>';
        $output .= sprintf(__('<strong>%s</strong>', GROUPS_PLUGIN_DOMAIN), wp_filter_nohtml_kses($capability->capability));
        $output .= '</li>';
        $output .= '</ul>';
    }
    $output .= '<input class="button button-primary" type="submit" name="bulk" value="' . __("Remove", GROUPS_PLUGIN_DOMAIN) . '"/>';
    $output .= '<a class="cancel button" href="' . $current_url . '">' . __('Cancel', GROUPS_PLUGIN_DOMAIN) . '</a>';
    $output .= '<input type="hidden" name="action" value="groups-action"/>';
    $output .= '<input type="hidden" name="bulk-action" value="remove"/>';
    $output .= '<input type="hidden" name="confirm" value="1"/>';
    $output .= wp_nonce_field('admin', GROUPS_ADMIN_GROUPS_ACTION_NONCE, true, false);
    $output .= '</div>';
    $output .= '</form>';
    $output .= '</div>';
    echo $output;
    Groups_Help::footer();
}
/**
 * Show edit group form.
 * @param int $group_id group id
 */
function groups_admin_groups_edit($group_id)
{
    global $wpdb;
    $output = '';
    if (!current_user_can(GROUPS_ADMINISTER_GROUPS)) {
        wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
    }
    $group = Groups_Group::read(intval($group_id));
    if (empty($group)) {
        wp_die(__('No such group.', GROUPS_PLUGIN_DOMAIN));
    }
    $current_url = (is_ssl() ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    $current_url = remove_query_arg('action', $current_url);
    $current_url = remove_query_arg('group_id', $current_url);
    $name = isset($_POST['name-field']) ? $_POST['name-field'] : $group->name;
    $description = isset($_POST['description-field']) ? $_POST['description-field'] : $group->description;
    $parent_id = isset($_POST['parent-id-field']) ? $_POST['parent-id-field'] : $group->parent_id;
    $group_table = _groups_get_tablename('group');
    $parent_select = '<select name="parent-id-field">';
    $parent_select .= '<option value="">--</option>';
    $groups = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$group_table} WHERE group_id != %d", $group->group_id));
    foreach ($groups as $g) {
        $selected = $g->group_id == $group->parent_id ? ' selected="selected" ' : '';
        $parent_select .= '<option ' . $selected . 'value="' . esc_attr($g->group_id) . '">' . wp_filter_nohtml_kses($g->name) . '</option>';
    }
    $parent_select .= '</select>';
    $name_readonly = $name !== Groups_Registered::REGISTERED_GROUP_NAME ? "" : ' readonly="readonly" ';
    $output .= '<div class="manage-groups">';
    $output .= '<div>';
    $output .= '<h2>';
    $output .= __('Edit a group', GROUPS_PLUGIN_DOMAIN);
    $output .= '</h2>';
    $output .= '</div>';
    $output .= Groups_Admin::render_messages();
    $output .= '<form id="edit-group" action="' . esc_url($current_url) . '" method="post">';
    $output .= '<div class="group edit">';
    $output .= '<input id="group-id-field" name="group-id-field" type="hidden" value="' . esc_attr(intval($group_id)) . '"/>';
    $output .= '<div class="field">';
    $output .= '<label for="name-field" class="field-label first required">';
    $output .= __('Name', GROUPS_PLUGIN_DOMAIN);
    $output .= '</label>';
    $output .= '<input ' . $name_readonly . ' id="name-field" name="name-field" class="namefield" type="text" value="' . esc_attr(stripslashes($name)) . '"/>';
    $output .= '</div>';
    $output .= '<div class="field">';
    $output .= '<label for="parent-id-field" class="field-label">';
    $output .= __('Parent', GROUPS_PLUGIN_DOMAIN);
    $output .= '</label>';
    $output .= $parent_select;
    $output .= '</div>';
    $output .= '<div class="field">';
    $output .= '<label for="description-field" class="field-label description-field">';
    $output .= __('Description', GROUPS_PLUGIN_DOMAIN);
    $output .= '</label>';
    $output .= '<textarea id="description-field" name="description-field" rows="5" cols="45">';
    $output .= stripslashes(wp_filter_nohtml_kses($description));
    $output .= '</textarea>';
    $output .= '</div>';
    $capability_table = _groups_get_tablename('capability');
    $group_capability_table = _groups_get_tablename('group_capability');
    $group_capabilities = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$capability_table} WHERE capability_id IN ( SELECT capability_id FROM {$group_capability_table} WHERE group_id = %d )", Groups_Utility::id($group_id)));
    $group_capabilities_array = array();
    if (count($group_capabilities) > 0) {
        foreach ($group_capabilities as $group_capability) {
            $group_capabilities_array[] = $group_capability->capability_id;
        }
    }
    $capabilities = $wpdb->get_results("SELECT * FROM {$capability_table} ORDER BY capability");
    $output .= '<div class="field">';
    $output .= '<div class="select-capability-container" style="width:62%;">';
    $output .= '<label>';
    $output .= __('Capabilities', GROUPS_PLUGIN_DOMAIN);
    $output .= sprintf('<select class="select capability" name="capability_ids[]" multiple="multiple" placeholder="%s">', __('Choose capabilities &hellip;', GROUPS_PLUGIN_DOMAIN));
    foreach ($capabilities as $capability) {
        $selected = in_array($capability->capability_id, $group_capabilities_array) ? ' selected="selected" ' : '';
        $output .= sprintf('<option value="%s" %s>%s</option>', esc_attr($capability->capability_id), $selected, wp_filter_nohtml_kses($capability->capability));
    }
    $output .= '</select>';
    $output .= '</label>';
    $output .= '</div>';
    // .select-capability-container
    $output .= '<p class="description">';
    $output .= __('The chosen capabilities are assigned to the group.', GROUPS_PLUGIN_DOMAIN);
    $output .= '</p>';
    $output .= '</div>';
    // .field
    $output .= Groups_UIE::render_select('.select.capability');
    $group_object = new Groups_Group($group_id);
    $group_capabilities = $group_object->capabilities;
    $group_capabilities_deep = $group_object->capabilities_deep;
    if (count($group_capabilities_deep) - count($group_capabilities) > 0) {
        usort($group_capabilities_deep, array('Groups_Utility', 'cmp'));
        $output .= '<div class="field">';
        $output .= __('Inherited capabilities:', GROUPS_PLUGIN_DOMAIN);
        $output .= ' ';
        $inherited_caps = array();
        foreach ($group_capabilities_deep as $group_capability) {
            $class = '';
            if (empty($group_capabilities) || !in_array($group_capability, $group_capabilities)) {
                $inherited_caps[] = wp_filter_nohtml_kses($group_capability->capability->capability);
            }
        }
        $output .= implode(' ', $inherited_caps);
        $output .= '</div>';
    }
    $output .= '<div class="field">';
    $output .= wp_nonce_field('groups-edit', GROUPS_ADMIN_GROUPS_NONCE, true, false);
    $output .= '<input class="button button-primary" type="submit" value="' . __('Save', GROUPS_PLUGIN_DOMAIN) . '"/>';
    $output .= '<input type="hidden" value="edit" name="action"/>';
    $output .= '<a class="cancel button" href="' . esc_url($current_url) . '">' . __('Cancel', GROUPS_PLUGIN_DOMAIN) . '</a>';
    $output .= '</div>';
    $output .= '</div>';
    // .group.edit
    $output .= '</form>';
    $output .= '</div>';
    // .manage-groups
    echo $output;
    Groups_Help::footer();
}
     * @param string $footer_text
     * @return mixed
     */
    public static function admin_footer_text($text)
    {
        if (function_exists('get_current_screen')) {
            $current_screen = get_current_screen();
            if (isset($current_screen->id) && (stripos($current_screen->id, 'groups-') === 0 || stripos($current_screen->id, 'groups_') === 0 || stripos($current_screen->id, 'toplevel_page_groups') === 0)) {
                $text = self::footer(false);
            }
        }
        return $text;
    }
    /**
     * Returns or renders the footer.
     *
     * @param boolean $render
     */
    public static function footer($render = true)
    {
        $footer = '<span class="groups-footer">' . __('Thank you for using <a href="http://www.itthinx.com/plugins/groups" target="_blank">Groups</a> by <a href="http://www.itthinx.com" target="_blank">itthinx</a>.', GROUPS_PLUGIN_DOMAIN) . ' ' . sprintf(__('Please give it a <a href="%s">&#9733;&#9733;&#9733;&#9733;&#9733;</a> rating.', GROUPS_PLUGIN_DOMAIN), esc_attr('http://wordpress.org/support/view/plugin-reviews/groups?filter=5#postform')) . '</span>';
        $footer = apply_filters('groups_footer', $footer);
        if ($render) {
            echo $footer;
        } else {
            return $footer;
        }
    }
}
Groups_Help::init();
/**
 * Manage Groups: table of groups and add, edit, remove actions.
 */
function groups_admin_groups()
{
    global $wpdb;
    $output = '';
    $today = date('Y-m-d', time());
    if (!current_user_can(GROUPS_ADMINISTER_GROUPS)) {
        wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
    }
    //
    // handle actions
    //
    if (isset($_POST['action'])) {
        //  handle action submit - do it
        switch ($_POST['action']) {
            case 'add':
                if (!($group_id = groups_admin_groups_add_submit())) {
                    return groups_admin_groups_add();
                } else {
                    $group = Groups_Group::read($group_id);
                    Groups_Admin::add_message(sprintf(__("The <em>%s</em> group has been created.", GROUPS_PLUGIN_DOMAIN), stripslashes(wp_filter_nohtml_kses($group->name))));
                }
                break;
            case 'edit':
                if (!($group_id = groups_admin_groups_edit_submit())) {
                    return groups_admin_groups_edit($_POST['group-id-field']);
                } else {
                    $group = Groups_Group::read($group_id);
                    Groups_Admin::add_message(sprintf(__('The <em>%s</em> group has been updated.', GROUPS_PLUGIN_DOMAIN), stripslashes(wp_filter_nohtml_kses($group->name))));
                }
                break;
            case 'remove':
                if ($group_id = groups_admin_groups_remove_submit()) {
                    Groups_Admin::add_message(__('The group has been deleted.', GROUPS_PLUGIN_DOMAIN));
                }
                break;
                // bulk actions on groups: add capabilities, remove capabilities, remove groups
            // bulk actions on groups: add capabilities, remove capabilities, remove groups
            case 'groups-action':
                if (wp_verify_nonce($_POST[GROUPS_ADMIN_GROUPS_ACTION_NONCE], 'admin')) {
                    $group_ids = isset($_POST['group_ids']) ? $_POST['group_ids'] : null;
                    $bulk_action = null;
                    if (isset($_POST['bulk'])) {
                        $bulk_action = $_POST['bulk-action'];
                    }
                    if (is_array($group_ids) && $bulk_action !== null) {
                        foreach ($group_ids as $group_id) {
                            switch ($bulk_action) {
                                case 'add-capability':
                                    $capabilities_id = isset($_POST['capability_id']) ? $_POST['capability_id'] : null;
                                    if ($capabilities_id !== null) {
                                        foreach ($capabilities_id as $capability_id) {
                                            Groups_Group_Capability::create(array('group_id' => $group_id, 'capability_id' => $capability_id));
                                        }
                                    }
                                    break;
                                case 'remove-capability':
                                    $capabilities_id = isset($_POST['capability_id']) ? $_POST['capability_id'] : null;
                                    if ($capabilities_id !== null) {
                                        foreach ($capabilities_id as $capability_id) {
                                            Groups_Group_Capability::delete($group_id, $capability_id);
                                        }
                                    }
                                    break;
                                case 'remove-group':
                                    $bulk_confirm = isset($_POST['confirm']) ? true : false;
                                    if ($bulk_confirm) {
                                        groups_admin_groups_bulk_remove_submit();
                                    } else {
                                        return groups_admin_groups_bulk_remove();
                                    }
                                    break;
                            }
                        }
                    }
                }
                break;
        }
    } else {
        if (isset($_GET['action'])) {
            // handle action request - show form
            switch ($_GET['action']) {
                case 'add':
                    return groups_admin_groups_add();
                    break;
                case 'edit':
                    if (isset($_GET['group_id'])) {
                        return groups_admin_groups_edit($_GET['group_id']);
                    }
                    break;
                case 'remove':
                    if (isset($_GET['group_id'])) {
                        return groups_admin_groups_remove($_GET['group_id']);
                    }
                    break;
            }
        }
    }
    //
    // group table
    //
    if (isset($_POST['clear_filters']) || isset($_POST['group_id']) || isset($_POST['group_name'])) {
        if (!wp_verify_nonce($_POST[GROUPS_ADMIN_GROUPS_FILTER_NONCE], 'admin')) {
            wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
        }
    }
    // filters
    $group_id = Groups_Options::get_user_option('groups_group_id', null);
    $group_name = Groups_Options::get_user_option('groups_group_name', null);
    if (isset($_POST['clear_filters'])) {
        Groups_Options::delete_user_option('groups_group_id');
        Groups_Options::delete_user_option('groups_group_name');
        $group_id = null;
        $group_name = null;
    } else {
        if (isset($_POST['submitted'])) {
            // filter by name
            if (!empty($_POST['group_name'])) {
                $group_name = $_POST['group_name'];
                Groups_Options::update_user_option('groups_group_name', $group_name);
            }
            // filter by group id
            if (!empty($_POST['group_id'])) {
                $group_id = intval($_POST['group_id']);
                Groups_Options::update_user_option('groups_group_id', $group_id);
            } else {
                if (isset($_POST['group_id'])) {
                    // empty && isset => '' => all
                    $group_id = null;
                    Groups_Options::delete_user_option('groups_group_id');
                }
            }
        }
    }
    if (isset($_POST['row_count'])) {
        if (!wp_verify_nonce($_POST[GROUPS_ADMIN_GROUPS_NONCE_1], 'admin')) {
            wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
        }
    }
    if (isset($_POST['paged'])) {
        if (!wp_verify_nonce($_POST[GROUPS_ADMIN_GROUPS_NONCE_2], 'admin')) {
            wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
        }
    }
    $current_url = (is_ssl() ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    $current_url = remove_query_arg('paged', $current_url);
    $current_url = remove_query_arg('action', $current_url);
    $current_url = remove_query_arg('group_id', $current_url);
    $group_table = _groups_get_tablename('group');
    $output .= '<div class="manage-groups">' . '<div>' . '<h2>' . _x('Groups', 'page-title', GROUPS_PLUGIN_DOMAIN) . '</h2>' . '</div>';
    $output .= Groups_Admin::render_messages();
    $output .= '<div class="manage">' . "<a title='" . __('Click to add a new group', GROUPS_PLUGIN_DOMAIN) . "' class='add button' href='" . esc_url($current_url) . "&action=add'><img class='icon' alt='" . __('Add', GROUPS_PLUGIN_DOMAIN) . "' src='" . GROUPS_PLUGIN_URL . "images/add.png'/><span class='label'>" . __('New Group', GROUPS_PLUGIN_DOMAIN) . "</span></a>" . '</div>';
    $row_count = isset($_POST['row_count']) ? intval($_POST['row_count']) : 0;
    if ($row_count <= 0) {
        $row_count = Groups_Options::get_user_option('groups_per_page', GROUPS_GROUPS_PER_PAGE);
    } else {
        Groups_Options::update_user_option('groups_per_page', $row_count);
    }
    $offset = isset($_GET['offset']) ? intval($_GET['offset']) : 0;
    if ($offset < 0) {
        $offset = 0;
    }
    $paged = isset($_REQUEST['paged']) ? intval($_REQUEST['paged']) : 0;
    if ($paged < 0) {
        $paged = 0;
    }
    $orderby = isset($_GET['orderby']) ? $_GET['orderby'] : null;
    switch ($orderby) {
        case 'group_id':
        case 'name':
            break;
        default:
            $orderby = 'name';
    }
    $order = isset($_GET['order']) ? $_GET['order'] : null;
    switch ($order) {
        case 'asc':
        case 'ASC':
            $switch_order = 'DESC';
            break;
        case 'desc':
        case 'DESC':
            $switch_order = 'ASC';
            break;
        default:
            $order = 'ASC';
            $switch_order = 'DESC';
    }
    $filters = array(" 1=%d ");
    $filter_params = array(1);
    if ($group_id) {
        $filters[] = " {$group_table}.group_id = %d ";
        $filter_params[] = $group_id;
    }
    if ($group_name) {
        $filters[] = " {$group_table}.name LIKE '%%%s%%' ";
        $filter_params[] = $group_name;
    }
    if (!empty($filters)) {
        $filters = " WHERE " . implode(" AND ", $filters);
    } else {
        $filters = '';
    }
    $count_query = $wpdb->prepare("SELECT COUNT(*) FROM {$group_table} {$filters}", $filter_params);
    $count = $wpdb->get_var($count_query);
    if ($count > $row_count) {
        $paginate = true;
    } else {
        $paginate = false;
    }
    $pages = ceil($count / $row_count);
    if ($paged > $pages) {
        $paged = $pages;
    }
    if ($paged != 0) {
        $offset = ($paged - 1) * $row_count;
    }
    $query = $wpdb->prepare("SELECT * FROM {$group_table}\n\t\t{$filters}\n\t\tORDER BY {$orderby} {$order}\n\t\tLIMIT {$row_count} OFFSET {$offset}", $filter_params);
    $results = $wpdb->get_results($query, OBJECT);
    $column_display_names = array('group_id' => __('Id', GROUPS_PLUGIN_DOMAIN), 'name' => __('Group', GROUPS_PLUGIN_DOMAIN), 'description' => __('Description', GROUPS_PLUGIN_DOMAIN), 'capabilities' => __('Capabilities', GROUPS_PLUGIN_DOMAIN), 'edit' => __('Edit', GROUPS_PLUGIN_DOMAIN), 'remove' => __('Remove', GROUPS_PLUGIN_DOMAIN));
    $output .= '<div class="groups-overview">';
    $output .= '<div class="filters">' . '<label class="description" for="setfilters">' . __('Filters', GROUPS_PLUGIN_DOMAIN) . '</label>' . '<form id="setfilters" action="" method="post">' . '<p>' . '<label class="group-id-filter" for="group_id">' . __('Group Id', GROUPS_PLUGIN_DOMAIN) . '</label>' . '<input class="group-id-filter" name="group_id" type="text" value="' . esc_attr($group_id) . '"/>' . '<label class="group-name-filter" for="group_name">' . __('Group Name', GROUPS_PLUGIN_DOMAIN) . '</label>' . '<input class="group-name-filter" name="group_name" type="text" value="' . $group_name . '"/>' . '</p>' . '<p>' . wp_nonce_field('admin', GROUPS_ADMIN_GROUPS_FILTER_NONCE, true, false) . '<input class="button" type="submit" value="' . __('Apply', GROUPS_PLUGIN_DOMAIN) . '"/>' . '<input class="button" type="submit" name="clear_filters" value="' . __('Clear', GROUPS_PLUGIN_DOMAIN) . '"/>' . '<input type="hidden" value="submitted" name="submitted"/>' . '</p>' . '</form>' . '</div>';
    if ($paginate) {
        require_once GROUPS_CORE_LIB . '/class-groups-pagination.php';
        $pagination = new Groups_Pagination($count, null, $row_count);
        $output .= '<form id="posts-filter" method="post" action="">';
        $output .= '<div>';
        $output .= wp_nonce_field('admin', GROUPS_ADMIN_GROUPS_NONCE_2, true, false);
        $output .= '</div>';
        $output .= '<div class="tablenav top">';
        $output .= $pagination->pagination('top');
        $output .= '</div>';
        $output .= '</form>';
    }
    $output .= '<div class="page-options right">';
    $output .= '<form id="setrowcount" action="" method="post">';
    $output .= '<div>';
    $output .= '<label for="row_count">' . __('Results per page', GROUPS_PLUGIN_DOMAIN) . '</label>';
    $output .= '<input name="row_count" type="text" size="2" value="' . esc_attr($row_count) . '" />';
    $output .= wp_nonce_field('admin', GROUPS_ADMIN_GROUPS_NONCE_1, true, false);
    $output .= '<input class="button" type="submit" value="' . __('Apply', GROUPS_PLUGIN_DOMAIN) . '"/>';
    $output .= '</div>';
    $output .= '</form>';
    $output .= '</div>';
    $capability_table = _groups_get_tablename("capability");
    $group_capability_table = _groups_get_tablename("group_capability");
    // capabilities select
    $capabilities = $wpdb->get_results("SELECT * FROM {$capability_table} ORDER BY capability");
    $capabilities_select = sprintf('<select class="select capability" name="capability_id[]" multiple="multiple" placeholder="%s" data-placeholder="%s">', esc_attr(__('Capabilities &hellip;', GROUPS_PLUGIN_DOMAIN)), esc_attr(__('Capabilities &hellip;', GROUPS_PLUGIN_DOMAIN)));
    foreach ($capabilities as $capability) {
        $capabilities_select .= sprintf('<option value="%s">%s</option>', esc_attr($capability->capability_id), wp_filter_nohtml_kses($capability->capability));
    }
    $capabilities_select .= '</select>';
    $capabilities_select .= Groups_UIE::render_select('.select.capability');
    $output .= '<form id="groups-action" method="post" action="">';
    $output .= '<div class="tablenav top">';
    $output .= '<div class="groups-bulk-container">';
    $output .= '<div class="capabilities-select-container">';
    $output .= $capabilities_select;
    $output .= wp_nonce_field('admin', GROUPS_ADMIN_GROUPS_ACTION_NONCE, true, false);
    $output .= '</div>';
    $output .= '<select class="bulk-action" name="bulk-action">';
    $output .= '<option selected="selected" value="-1">' . __('Bulk Actions', GROUPS_PLUGIN_DOMAIN) . '</option>';
    $output .= '<option value="remove-group">' . __('Remove group', GROUPS_PLUGIN_DOMAIN) . '</option>';
    $output .= '<option value="add-capability">' . __('Add capability', GROUPS_PLUGIN_DOMAIN) . '</option>';
    $output .= '<option value="remove-capability">' . __('Remove capability', GROUPS_PLUGIN_DOMAIN) . '</option>';
    $output .= '</select>';
    $output .= sprintf('<input class="button" type="submit" name="bulk" value="%s" />', __('Apply', GROUPS_PLUGIN_DOMAIN));
    $output .= '<input type="hidden" name="action" value="groups-action"/>';
    $output .= '</div>';
    $output .= '</div>';
    $output .= '<table id="" class="wp-list-table widefat fixed" cellspacing="0">';
    $output .= '<thead>';
    $output .= '<tr>';
    $output .= '<th id="cb" class="manage-column column-cb check-column" scope="col"><input type="checkbox"></th>';
    foreach ($column_display_names as $key => $column_display_name) {
        $options = array('orderby' => $key, 'order' => $switch_order);
        $class = $key;
        if (!in_array($key, array('capabilities', 'edit', 'remove'))) {
            if (strcmp($key, $orderby) == 0) {
                $lorder = strtolower($order);
                $class = "{$key} manage-column sorted {$lorder}";
            } else {
                $class = "{$key} manage-column sortable";
            }
            $column_display_name = '<a href="' . esc_url(add_query_arg($options, $current_url)) . '"><span>' . $column_display_name . '</span><span class="sorting-indicator"></span></a>';
        }
        $output .= "<th scope='col' class='{$class}'>{$column_display_name}</th>";
    }
    $output .= '</tr>';
    $output .= '</thead>';
    $output .= '<tbody>';
    if (count($results) > 0) {
        for ($i = 0; $i < count($results); $i++) {
            $result = $results[$i];
            $output .= '<tr class="' . ($i % 2 == 0 ? 'even' : 'odd') . '">';
            $output .= '<th class="check-column">';
            $output .= '<input type="checkbox" value="' . esc_attr($result->group_id) . '" name="group_ids[]"/>';
            $output .= '</th>';
            $output .= "<td class='group-id'>";
            $output .= $result->group_id;
            $output .= "</td>";
            $output .= "<td class='group-name'>" . stripslashes(wp_filter_nohtml_kses($result->name)) . "</td>";
            $output .= "<td class='group-description'>" . stripslashes(wp_filter_nohtml_kses($result->description)) . "</td>";
            $output .= '<td class="capabilities">';
            $group = new Groups_Group($result->group_id);
            $group_capabilities = $group->capabilities;
            $group_capabilities_deep = $group->capabilities_deep;
            usort($group_capabilities_deep, array('Groups_Utility', 'cmp'));
            if (count($group_capabilities_deep) > 0) {
                $output .= '<ul>';
                foreach ($group_capabilities_deep as $group_capability) {
                    $output .= '<li>';
                    $class = '';
                    if (empty($group_capabilities) || !in_array($group_capability, $group_capabilities)) {
                        $class = 'inherited';
                    }
                    $output .= sprintf('<span class="%s">', $class);
                    if (isset($group_capability->capability) && isset($group_capability->capability->capability)) {
                        $output .= wp_filter_nohtml_kses($group_capability->capability->capability);
                    }
                    $output .= '</span>';
                    $output .= '</li>';
                }
                $output .= '</ul>';
            } else {
                $output .= __('This group has no capabilities.', GROUPS_PLUGIN_DOMAIN);
            }
            $output .= '</td>';
            $output .= "<td class='edit'>";
            $output .= "<a href='" . esc_url(add_query_arg('paged', $paged, $current_url)) . "&action=edit&group_id=" . $result->group_id . "' alt='" . __('Edit', GROUPS_PLUGIN_DOMAIN) . "'><img src='" . GROUPS_PLUGIN_URL . "images/edit.png'/></a>";
            $output .= "</td>";
            $output .= "<td class='remove'>";
            if ($result->name !== Groups_Registered::REGISTERED_GROUP_NAME) {
                $output .= "<a href='" . esc_url($current_url) . "&action=remove&group_id=" . $result->group_id . "' alt='" . __('Remove', GROUPS_PLUGIN_DOMAIN) . "'><img src='" . GROUPS_PLUGIN_URL . "images/remove.png'/></a>";
            }
            $output .= "</td>";
            $output .= '</tr>';
        }
    } else {
        $output .= '<tr><td colspan="7">' . __('There are no results.', GROUPS_PLUGIN_DOMAIN) . '</td></tr>';
    }
    $output .= '</tbody>';
    $output .= '</table>';
    $output .= Groups_UIE::render_add_titles('.groups-overview table td');
    $output .= '</form>';
    // #groups-action
    if ($paginate) {
        require_once GROUPS_CORE_LIB . '/class-groups-pagination.php';
        $pagination = new Groups_Pagination($count, null, $row_count);
        $output .= '<div class="tablenav bottom">';
        $output .= $pagination->pagination('bottom');
        $output .= '</div>';
    }
    $output .= '</div>';
    // .groups-overview
    $output .= '</div>';
    // .manage-groups
    echo $output;
    Groups_Help::footer();
}
/**
 * Show add group form.
 */
function groups_admin_groups_add()
{
    global $wpdb;
    $output = '';
    if (!current_user_can(GROUPS_ADMINISTER_GROUPS)) {
        wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
    }
    $current_url = (is_ssl() ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    $current_url = remove_query_arg('paged', $current_url);
    $current_url = remove_query_arg('action', $current_url);
    $current_url = remove_query_arg('group_id', $current_url);
    $parent_id = isset($_POST['parent-id-field']) ? $_POST['parent-id-field'] : '';
    $name = isset($_POST['name-field']) ? $_POST['name-field'] : '';
    $description = isset($_POST['description-field']) ? $_POST['description-field'] : '';
    $group_table = _groups_get_tablename('group');
    $parent_select = '<select name="parent-id-field">';
    $parent_select .= '<option value="">--</option>';
    $groups = $wpdb->get_results("SELECT * FROM {$group_table}");
    foreach ($groups as $group) {
        $parent_select .= '<option value="' . esc_attr($group->group_id) . '">' . wp_filter_nohtml_kses($group->name) . '</option>';
    }
    $parent_select .= '</select>';
    $output .= '<div class="manage-groups">';
    $output .= '<div>';
    $output .= '<h1>';
    $output .= __('Add a new group', GROUPS_PLUGIN_DOMAIN);
    $output .= '</h1>';
    $output .= '</div>';
    $output .= Groups_Admin::render_messages();
    $output .= '<form id="add-group" action="' . esc_url($current_url) . '" method="post">';
    $output .= '<div class="group new">';
    $output .= '<div class="field">';
    $output .= '<label for="name-field" class="field-label first required">';
    $output .= __('Name', GROUPS_PLUGIN_DOMAIN);
    $output .= '</label>';
    $output .= '<input id="name-field" name="name-field" class="namefield" type="text" value="' . esc_attr(stripslashes($name)) . '"/>';
    $output .= '</div>';
    $output .= '<div class="field">';
    $output .= '<label for="parent-id-field" class="field-label">';
    $output .= __('Parent', GROUPS_PLUGIN_DOMAIN);
    $output .= '</label>';
    $output .= $parent_select;
    $output .= '</div>';
    $output .= '<div class="field">';
    $output .= '<label for="description-field" class="field-label description-field">';
    $output .= __('Description', GROUPS_PLUGIN_DOMAIN);
    $output .= '</label>';
    $output .= '<textarea id="description-field" name="description-field" rows="5" cols="45">';
    $output .= stripslashes(wp_filter_nohtml_kses($description));
    $output .= '</textarea>';
    $output .= '</div>';
    $output .= '<div class="field">';
    $capability_table = _groups_get_tablename("capability");
    $capabilities = $wpdb->get_results("SELECT * FROM {$capability_table} ORDER BY capability");
    $output .= '<div class="select-capability-container" style="width:62%;">';
    $output .= '<label>';
    $output .= __('Capabilities', GROUPS_PLUGIN_DOMAIN);
    $output .= sprintf('<select class="select capability" name="capability_ids[]" multiple="multiple" placeholder="%s">', __('Choose capabilities &hellip;', GROUPS_PLUGIN_DOMAIN));
    foreach ($capabilities as $capability) {
        $output .= sprintf('<option value="%s">%s</option>', esc_attr($capability->capability_id), wp_filter_nohtml_kses($capability->capability));
    }
    $output .= '</select>';
    $output .= '</label>';
    $output .= '</div>';
    $output .= '<p class="description">';
    $output .= __('These capabilities will be assigned to the group.', GROUPS_PLUGIN_DOMAIN);
    $output .= '</p>';
    $output .= Groups_UIE::render_select('.select.capability');
    $output .= '</div>';
    $output .= '<div class="field">';
    $output .= wp_nonce_field('groups-add', GROUPS_ADMIN_GROUPS_NONCE, true, false);
    $output .= '<input class="button button-primary" type="submit" value="' . __('Add', GROUPS_PLUGIN_DOMAIN) . '"/>';
    $output .= '<input type="hidden" value="add" name="action"/>';
    $output .= '<a class="cancel button" href="' . esc_url($current_url) . '">' . __('Cancel', GROUPS_PLUGIN_DOMAIN) . '</a>';
    $output .= '</div>';
    $output .= '</div>';
    // .group.new
    $output .= '</form>';
    $output .= '</div>';
    // .manage-groups
    echo $output;
    Groups_Help::footer();
}
/**
 * Manage capabilities: table of capabilities and add, edit, remove actions.
 */
function groups_admin_capabilities()
{
    global $wpdb;
    $output = '';
    $today = date('Y-m-d', time());
    if (!current_user_can(GROUPS_ADMINISTER_GROUPS)) {
        wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
    }
    //
    // handle actions
    //
    if (isset($_POST['action'])) {
        //  handle action submit - do it
        switch ($_POST['action']) {
            case 'add':
                if (!groups_admin_capabilities_add_submit()) {
                    return groups_admin_capabilities_add();
                }
                break;
            case 'edit':
                if (!groups_admin_capabilities_edit_submit()) {
                    return groups_admin_capabilities_edit($_POST['capability-id-field']);
                }
                break;
            case 'remove':
                groups_admin_capabilities_remove_submit();
                break;
                // bulk actions on groups: capabilities
            // bulk actions on groups: capabilities
            case 'groups-action':
                //				 if ( wp_verify_nonce( $_POST[GROUPS_ADMIN_CAPABILITIES_ACTION_NONCE], 'admin' ) ) {
                //					 $group_ids = isset( $_POST['group_ids'] ) ? $_POST['group_ids'] : null;
                //					 $subaction = isset( $_POST['add'] ) ? $_POST['add'] : ( isset( $_POST['remove'] ) ? $_POST['remove'] : null );
                //					 $capability_id = isset( $_POST['capability_id'] ) ? $_POST['capability_id'] : null;
                //					 if ( is_array( $group_ids ) && ( $subaction !== null ) && ( $capability_id !== null ) ) {
                //						 foreach ( $group_ids as $group_id ) {
                //							 switch ( $subaction ) {
                //								 case 'Add' :
                //									 Groups_Group_Capability::create( array( 'group_id' => $group_id, 'capability_id' => $capability_id ) );
                //									 break;
                //								 case 'Remove' :
                //									 Groups_Group_Capability::delete( $group_id, $capability_id );
                //									 break;
                //							 }
                //						 }
                //					 }
                //				 }
                break;
        }
    } else {
        if (isset($_GET['action'])) {
            // handle action request - show form
            switch ($_GET['action']) {
                case 'add':
                    return groups_admin_capabilities_add();
                    break;
                case 'edit':
                    if (isset($_GET['capability_id'])) {
                        return groups_admin_capabilities_edit($_GET['capability_id']);
                    }
                    break;
                case 'remove':
                    if (isset($_GET['capability_id'])) {
                        return groups_admin_capabilities_remove($_GET['capability_id']);
                    }
                    break;
                case 'refresh':
                    if (check_admin_referer('refresh')) {
                        $n = Groups_WordPress::refresh_capabilities();
                        if ($n > 0) {
                            $output .= '<div class="info">' . sprintf(_n('One capability has been added.', '%d capabilities have been added.', $n, GROUPS_PLUGIN_DOMAIN), $n) . '</div>';
                        } else {
                            $output .= '<div class="info">' . __('No new capabilities have been found.', GROUPS_PLUGIN_DOMAIN) . '</div>';
                        }
                    } else {
                        wp_die(__('A Duck!', GROUPS_PLUGIN_DOMAIN));
                    }
                    break;
            }
        }
    }
    //
    // capabilities table
    //
    if (isset($_POST['clear_filters']) || isset($_POST['capability_id']) || isset($_POST['capability'])) {
        if (!wp_verify_nonce($_POST[GROUPS_ADMIN_CAPABILITIES_FILTER_NONCE], 'admin')) {
            wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
        }
    }
    // filters
    $capability_id = Groups_Options::get_user_option('capabilities_capability_id', null);
    $capability = Groups_Options::get_user_option('capabilities_capability', null);
    if (isset($_POST['clear_filters'])) {
        Groups_Options::delete_user_option('capabilities_capability_id');
        Groups_Options::delete_user_option('capabilities_capability');
        $capability_id = null;
        $capability = null;
    } else {
        if (isset($_POST['submitted'])) {
            // filter by name
            if (!empty($_POST['capability'])) {
                $capability = $_POST['capability'];
                Groups_Options::update_user_option('capabilities_capability', $capability);
            }
            // filter by capability id
            if (!empty($_POST['capability_id'])) {
                $capability_id = intval($_POST['capability_id']);
                Groups_Options::update_user_option('capabilities_capability_id', $capability_id);
            } else {
                if (isset($_POST['capability_id'])) {
                    // empty && isset => '' => all
                    $capability_id = null;
                    Groups_Options::delete_user_option('capabilities_capability_id');
                }
            }
        }
    }
    if (isset($_POST['row_count'])) {
        if (!wp_verify_nonce($_POST[GROUPS_ADMIN_CAPABILITIES_NONCE_1], 'admin')) {
            wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
        }
    }
    if (isset($_POST['paged'])) {
        if (!wp_verify_nonce($_POST[GROUPS_ADMIN_CAPABILITIES_NONCE_2], 'admin')) {
            wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
        }
    }
    $current_url = (is_ssl() ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    $current_url = remove_query_arg('paged', $current_url);
    $current_url = remove_query_arg('action', $current_url);
    $current_url = remove_query_arg('capability_id', $current_url);
    $capability_table = _groups_get_tablename('capability');
    $output .= '<div class="manage-capabilities">' . '<div>' . '<h2>' . __('Capabilities', GROUPS_PLUGIN_DOMAIN) . '</h2>' . '</div>';
    $output .= '<div class="manage">' . "<a title='" . __('Click to add a new capability', GROUPS_PLUGIN_DOMAIN) . "' class='add button' href='" . esc_url($current_url) . "&action=add'><img class='icon' alt='" . __('Add', GROUPS_PLUGIN_DOMAIN) . "' src='" . GROUPS_PLUGIN_URL . "images/add.png'/><span class='label'>" . __('New Capability', GROUPS_PLUGIN_DOMAIN) . "</span></a>" . "<a title='" . __('Click to refresh capabilities', GROUPS_PLUGIN_DOMAIN) . "' class='refresh button' href='" . esc_url(wp_nonce_url($current_url, 'refresh')) . "&action=refresh'><img class='icon' alt='" . __('Refresh', GROUPS_PLUGIN_DOMAIN) . "' src='" . GROUPS_PLUGIN_URL . "images/refresh.png'/><span class='label'>" . __('', GROUPS_PLUGIN_DOMAIN) . "</span></a>" . '</div>';
    $row_count = isset($_POST['row_count']) ? intval($_POST['row_count']) : 0;
    if ($row_count <= 0) {
        $row_count = Groups_Options::get_user_option('capabilities_per_page', GROUPS_CAPABILITIES_PER_PAGE);
    } else {
        Groups_Options::update_user_option('capabilities_per_page', $row_count);
    }
    $offset = isset($_GET['offset']) ? intval($_GET['offset']) : 0;
    if ($offset < 0) {
        $offset = 0;
    }
    $paged = isset($_GET['paged']) ? intval($_GET['paged']) : 0;
    if ($paged < 0) {
        $paged = 0;
    }
    $orderby = isset($_GET['orderby']) ? $_GET['orderby'] : null;
    switch ($orderby) {
        case 'capability_id':
        case 'capability':
            break;
        default:
            $orderby = 'name';
    }
    $order = isset($_GET['order']) ? $_GET['order'] : null;
    switch ($order) {
        case 'asc':
        case 'ASC':
            $switch_order = 'DESC';
            break;
        case 'desc':
        case 'DESC':
            $switch_order = 'ASC';
            break;
        default:
            $order = 'ASC';
            $switch_order = 'DESC';
    }
    $filters = array();
    $filter_params = array();
    if ($capability_id) {
        $filters[] = " {$capability_table}.capability_id = %d ";
        $filter_params[] = $capability_id;
    }
    if ($capability) {
        $filters[] = " {$capability_table}.capability LIKE '%%%s%%' ";
        $filter_params[] = $capability;
    }
    if (!empty($filters)) {
        $filters = " WHERE " . implode(" AND ", $filters);
    } else {
        $filters = '';
    }
    $count_query = $wpdb->prepare("SELECT COUNT(*) FROM {$capability_table} {$filters}", $filter_params);
    $count = $wpdb->get_var($count_query);
    if ($count > $row_count) {
        $paginate = true;
    } else {
        $paginate = false;
    }
    $pages = ceil($count / $row_count);
    if ($paged > $pages) {
        $paged = $pages;
    }
    if ($paged != 0) {
        $offset = ($paged - 1) * $row_count;
    }
    $query = $wpdb->prepare("SELECT * FROM {$capability_table}\n\t\t{$filters}\n\t\tORDER BY {$orderby} {$order}\n\t\tLIMIT {$row_count} OFFSET {$offset}", $filter_params);
    $results = $wpdb->get_results($query, OBJECT);
    $column_display_names = array('capability_id' => __('Id', GROUPS_PLUGIN_DOMAIN), 'capability' => __('Capability', GROUPS_PLUGIN_DOMAIN), 'description' => __('Description', GROUPS_PLUGIN_DOMAIN), 'edit' => __('Edit', GROUPS_PLUGIN_DOMAIN), 'remove' => __('Remove', GROUPS_PLUGIN_DOMAIN));
    $output .= '<div class="capabilities-overview">';
    $output .= '<div class="filters">' . '<label class="description" for="setfilters">' . __('Filters', GROUPS_PLUGIN_DOMAIN) . '</label>' . '<form id="setfilters" action="" method="post">' . '<p>' . '<label class="capability-id-filter" for="capability_id">' . __('Capability Id', GROUPS_PLUGIN_DOMAIN) . '</label>' . '<input class="capability-id-filter" name="capability_id" type="text" value="' . esc_attr($capability_id) . '"/>' . '<label class="capability-filter" for="capability">' . __('Capability', GROUPS_PLUGIN_DOMAIN) . '</label>' . '<input class="capability-filter" name="capability" type="text" value="' . $capability . '"/>' . '</p>' . '<p>' . wp_nonce_field('admin', GROUPS_ADMIN_CAPABILITIES_FILTER_NONCE, true, false) . '<input class="button" type="submit" value="' . __('Apply', GROUPS_PLUGIN_DOMAIN) . '"/>' . '<input class="button" type="submit" name="clear_filters" value="' . __('Clear', GROUPS_PLUGIN_DOMAIN) . '"/>' . '<input type="hidden" value="submitted" name="submitted"/>' . '</p>' . '</form>' . '</div>';
    $output .= '
		<div class="page-options">
			<form id="setrowcount" action="" method="post">
				<div>
					<label for="row_count">' . __('Results per page', GROUPS_PLUGIN_DOMAIN) . '</label>' . '<input name="row_count" type="text" size="2" value="' . esc_attr($row_count) . '" />
					' . wp_nonce_field('admin', GROUPS_ADMIN_CAPABILITIES_NONCE_1, true, false) . '
					<input class="button" type="submit" value="' . __('Apply', GROUPS_PLUGIN_DOMAIN) . '"/>
				</div>
			</form>
		</div>
		';
    if ($paginate) {
        require_once GROUPS_CORE_LIB . '/class-groups-pagination.php';
        $pagination = new Groups_Pagination($count, null, $row_count);
        $output .= '<form id="posts-filter" method="post" action="">';
        $output .= '<div>';
        $output .= wp_nonce_field('admin', GROUPS_ADMIN_CAPABILITIES_NONCE_2, true, false);
        $output .= '</div>';
        $output .= '<div class="tablenav top">';
        $output .= $pagination->pagination('top');
        $output .= '</div>';
        $output .= '</form>';
    }
    //	 $capability_table = _groups_get_tablename( "capability" );
    //	 $group_capability_table = _groups_get_tablename( "group_capability" );
    //	 // capabilities select
    //	 $capabilities_select = '<select name="capability_id">';
    //	 $capabilities = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $capability_table ORDER BY capability" ) );
    //	 foreach( $capabilities as $capability ) {
    //		 $capabilities_select .= '<option value="' . esc_attr( $capability->capability_id ) . '">' . wp_filter_nohtml_kses( $capability->capability ) . '</option>';
    //	 }
    //	 $capabilities_select .= '</select>';
    //	 $output .= '<form id="groups-action" method="post" action="">';
    //	 $output .= '<div class="tablenav top">';
    //	 $output .= '<div class="alignleft">';
    //	 $output .= __( "Apply capability to selected groups:", GROUPS_PLUGIN_DOMAIN );
    //	 $output .= $capabilities_select;
    //	 $output .= '<input class="button" type="submit" name="add" value="' . __( "Add", GROUPS_PLUGIN_DOMAIN ) . '"/>';
    //	 $output .= '<input class="button" type="submit" name="remove" value="' . __( "Remove", GROUPS_PLUGIN_DOMAIN ) . '"/>';
    //	 $output .= wp_nonce_field( 'admin', GROUPS_ADMIN_CAPABILITIES_ACTION_NONCE, true, false );
    //	 $output .= '<input type="hidden" name="action" value="groups-action"/>';
    //	 $output .= '</div>'; // .alignleft
    //	 $output .= '</div>'; // .tablenav.top
    $output .= '
		<table id="" class="wp-list-table widefat fixed" cellspacing="0">
		<thead>
			<tr>
			';
    $output .= '<th id="cb" class="manage-column column-cb check-column" scope="col"><input type="checkbox"></th>';
    foreach ($column_display_names as $key => $column_display_name) {
        $options = array('orderby' => $key, 'order' => $switch_order);
        $class = $key;
        if (!in_array($key, array('capabilities', 'edit', 'remove'))) {
            if (strcmp($key, $orderby) == 0) {
                $lorder = strtolower($order);
                $class = "{$key} manage-column sorted {$lorder}";
            } else {
                $class = "{$key} manage-column sortable";
            }
            $column_display_name = '<a href="' . esc_url(add_query_arg($options, $current_url)) . '"><span>' . $column_display_name . '</span><span class="sorting-indicator"></span></a>';
        }
        $output .= "<th scope='col' class='{$class}'>{$column_display_name}</th>";
    }
    $output .= '</tr>
		</thead>
		<tbody>
		';
    if (count($results) > 0) {
        for ($i = 0; $i < count($results); $i++) {
            $result = $results[$i];
            $output .= '<tr class="' . ($i % 2 == 0 ? 'even' : 'odd') . '">';
            $output .= '<th class="check-column">';
            $output .= '<input type="checkbox" value="' . esc_attr($result->capability_id) . '" name="capability_ids[]"/>';
            $output .= '</th>';
            $output .= "<td class='capability-id'>";
            $output .= $result->capability_id;
            $output .= "</td>";
            $output .= "<td class='capability'>" . stripslashes(wp_filter_nohtml_kses($result->capability)) . "</td>";
            $output .= "<td class='description'>" . stripslashes(wp_filter_nohtml_kses($result->description)) . "</td>";
            $output .= "<td class='edit'>";
            $output .= "<a href='" . esc_url(add_query_arg('paged', $paged, $current_url)) . "&action=edit&capability_id=" . $result->capability_id . "' alt='" . __('Edit', GROUPS_PLUGIN_DOMAIN) . "'><img src='" . GROUPS_PLUGIN_URL . "images/edit.png'/></a>";
            $output .= "</td>";
            $output .= "<td class='remove'>";
            if ($result->capability !== Groups_Post_Access::READ_POST_CAPABILITY) {
                $output .= "<a href='" . esc_url($current_url) . "&action=remove&capability_id=" . $result->capability_id . "' alt='" . __('Remove', GROUPS_PLUGIN_DOMAIN) . "'><img src='" . GROUPS_PLUGIN_URL . "images/remove.png'/></a>";
            }
            $output .= "</td>";
            $output .= '</tr>';
        }
    } else {
        $output .= '<tr><td colspan="10">' . __('There are no results.', GROUPS_PLUGIN_DOMAIN) . '</td></tr>';
    }
    $output .= '</tbody>';
    $output .= '</table>';
    //	 $output .= '</form>'; // #groups-action
    if ($paginate) {
        require_once GROUPS_CORE_LIB . '/class-groups-pagination.php';
        $pagination = new Groups_Pagination($count, null, $row_count);
        $output .= '<div class="tablenav bottom">';
        $output .= $pagination->pagination('bottom');
        $output .= '</div>';
    }
    $output .= '</div>';
    // .capabilities-overview
    $output .= '</div>';
    // .manage-capabilities
    echo $output;
    Groups_Help::footer();
}