function sp_response($section, $die = true, $status = 'success', $error = '')
{
    global $wpdb;
    $response = array('status' => '', 'type' => '', 'section' => '', 'response' => '', 'error' => '');
    # log the build section and status in the response
    echo "Build upgrade section {$section} executing.  Status: {$status} <br />";
    if ($status == 'error' && !empty($error)) {
        echo "Error: {$error} <br />";
    }
    # build the response
    $response['status'] = $status;
    $response['type'] = 'upgrade';
    $response['section'] = $section;
    $response['error'] = $error;
    $response['response'] = ob_get_contents();
    # save as log meta data if table exists! (Need to check if installed yet sadly)
    $go = $wpdb->get_var("SHOW TABLES LIKE '" . SFLOGMETA . "'");
    if ($go) {
        $sql = '
			INSERT INTO ' . SFLOGMETA . " (version, log_data)\n\t\t\tVALUES (\n\t\t\t'" . SPVERSION . "',\n\t\t\t'" . serialize($response) . "')";
        spdb_query($sql);
    }
    ob_end_clean();
    # send the response (mark with tags so we can extract only the response)
    echo '%%%marker%%%';
    print json_encode($response);
    echo '%%%marker%%%';
    # and if this is the last update in build finish off...
    if (SPBUILD == $section) {
        # let plugins know
        do_action('sph_upgrade_done', SPBUILD);
        # Finished Upgrades ===============================================================================
        sp_log_event(SPRELEASE, SPVERSION, SPBUILD);
        sp_update_permalink(true);
        delete_option('sfInstallID');
        # use wp option table
        # and some final cleanuop tasks
        sp_reset_auths();
        sp_clear_combined_css('all');
        sp_clear_combined_css('mobile');
        sp_clear_combined_css('tablet');
        sp_clear_combined_scripts('desktop');
        sp_clear_combined_scripts('mobile');
        sp_clear_combined_scripts('tablet');
        sp_flush_cache('all');
        sp_reset_member_plugindata();
    }
    if ($die) {
        die;
    }
}
function sp_deactivate_auth($name)
{
    $success = spdb_query('UPDATE ' . SFAUTHS . " SET active=0 WHERE auth_name='{$name}'");
    if ($success) {
        sp_reset_auths();
    }
    return $success;
}
function spa_save_usergroups_delete_usergroup()
{
    check_admin_referer('forum-adminform_usergroupdelete', 'forum-adminform_usergroupdelete');
    $usergroup_id = sp_esc_int($_POST['usergroup_id']);
    # dont allow updates to the default user groups
    $usergroup = spa_get_usergroups_row($usergroup_id);
    if ($usergroup->usergroup_locked) {
        $mess = spa_text('Sorry, the default User Groups cannot be deleted');
        return $mess;
    }
    # remove all memberships for this user group
    spdb_query("DELETE FROM " . SFMEMBERSHIPS . " WHERE usergroup_id=" . $usergroup_id);
    # remove any permission sets using this user group
    $permissions = spdb_table(SFPERMISSIONS, "usergroup_id={$usergroup_id}");
    if ($permissions) {
        foreach ($permissions as $permission) {
            spa_remove_permission_data($permission->permission_id);
        }
    }
    # remove any group default permissions using this user group
    spdb_query("DELETE FROM " . SFDEFPERMISSIONS . " WHERE usergroup_id=" . $usergroup_id);
    # remove the user group
    spdb_query("DELETE FROM " . SFMEMBERSHIPS . " WHERE usergroup_id=" . $usergroup_id);
    $success = spdb_query("DELETE FROM " . SFUSERGROUPS . " WHERE usergroup_id=" . $usergroup_id);
    if ($success == false) {
        $mess = spa_text('User group delete failed');
    } else {
        $mess = spa_text('User group deleted');
        # reset auths and memberships for everyone
        sp_reset_memberships();
        sp_reset_auths();
        do_action('sph_usergroup_del', $usergroup_id);
    }
    return $mess;
}
function spa_save_forums_merge()
{
    check_admin_referer('forum-adminform_mergeforums', 'forum-adminform_mergeforums');
    $source = $target = 0;
    if (isset($_POST['source'])) {
        $source = (int) $_POST['source'];
    }
    if (isset($_POST['target'])) {
        $target = (int) $_POST['target'];
    }
    if (empty($source) || empty($target) || $source == $target) {
        return spa_text('Selections invalid');
    }
    $sourceForum = spdb_table(SFFORUMS, "forum_id={$source}", 'row');
    $targetForum = spdb_table(SFFORUMS, "forum_id={$target}", 'row');
    # 1 - Move sub-forums
    if (!empty($sourceForum->children)) {
        spdb_query("UPDATE " . SFFORUMS . " SET parent={$target} WHERE parent={$source}");
    }
    # 2 - Change forum ids in requirted tables
    spdb_query("UPDATE " . SFTOPICS . " SET forum_id={$target} WHERE forum_id={$source}");
    spdb_query("UPDATE " . SFPOSTS . " SET forum_id={$target} WHERE forum_id={$source}");
    spdb_query("UPDATE " . SFTRACK . " SET forum_id={$target} WHERE forum_id={$source}");
    spdb_query("UPDATE " . SFWAITING . " SET forum_id={$target} WHERE forum_id={$source}");
    # 3 - Delete forum id rows in following tables
    spdb_query("DELETE FROM " . SFPERMISSIONS . " WHERE forum_id={$source}");
    # 4 - Run clean up operations
    sp_reset_memberships();
    sp_reset_auths();
    sp_update_post_urls($sourceForum->forum_slug, $targetForum->forum_slug);
    sp_build_forum_index($target);
    # 5 - Delete the old forum record
    spdb_query("DELETE FROM " . SFFORUMS . " WHERE forum_id={$source}");
    spa_clean_forum_children();
    spa_resequence_forums($targetForum->group_id, 0);
    # 6 - Update Sitemap
    do_action('sm_rebuild');
    # 7 - Update Stats
    do_action('sph_stats_cron');
    # 8 - Let plugins in on the secret
    do_action('sph_merge_forums', $source, $target);
    # clear out group cache tpo enable change_user
    sp_flush_cache('group');
    $mess = spa_text('Forum Merge Completed');
    return $mess;
}
function spa_save_housekeeping_data()
{
    check_admin_referer('forum-adminform_housekeeping', 'forum-adminform_housekeeping');
    $mess = '';
    if (isset($_POST['rebuild-fidx'])) {
        $forumid = $_POST['forum_id'];
        if (is_numeric($forumid)) {
            $topics = spdb_table(SFTOPICS, "forum_id={$forumid}");
            if ($topics) {
                include_once SF_PLUGIN_DIR . '/forum/database/sp-db-management.php';
                foreach ($topics as $topic) {
                    sp_build_post_index($topic->topic_id);
                }
                # after reubuilding post indexes, rebuild the forum indexes
                sp_build_forum_index($forumid);
                do_action('sph_toolbox_housekeeping_forum_index');
                $mess = spa_text('Forum indexes rebuilt');
            } else {
                $mess = spa_text('Forum index rebuild failed - no topics in selected forum');
            }
        } else {
            $mess = spa_text('Forum index rebuild failed - no forum selected');
        }
    }
    if (isset($_POST['transient-cleanup'])) {
        include_once SF_PLUGIN_DIR . '/forum/database/sp-db-management.php';
        sp_transient_cleanup();
        do_action('sph_toolbox_housekeeping_transient');
        $mess = spa_text('WP transients cleaned');
    }
    if (isset($_POST['clean-newposts'])) {
        $days = isset($_POST['sfdays']) ? max(sp_esc_int($_POST['sfdays']), 0) : 30;
        $users = spdb_select('col', "SELECT user_id FROM " . SFMEMBERS . " WHERE lastvisit < DATE_SUB(CURDATE(), INTERVAL " . $days . " DAY)");
        if ($users) {
            foreach ($users as $user) {
                spdb_query('UPDATE ' . SFMEMBERS . " SET newposts='a:1:{i:0;i:0;}' WHERE user_id={$user}");
            }
        }
        do_action('sph_toolbox_housekeeping_newpost');
        $mess = spa_text('New posts lists cleaned');
    }
    if (isset($_POST['postcount-cleanup'])) {
        spdb_query('UPDATE ' . SFMEMBERS . ' SET posts = (SELECT COUNT(*) FROM ' . SFPOSTS . ' WHERE ' . SFPOSTS . '.user_id = ' . SFMEMBERS . '.user_id)');
        # force stats to update
        do_action('sph_stats_cron');
        do_action('sph_toolbox_housekeeping_postcount');
        $mess = spa_text('User post counts calculated');
    }
    if (isset($_POST['reset-tabs'])) {
        # clear out current tabs
        $tabs = sp_get_sfmeta('profile', 'tabs');
        sp_delete_sfmeta($tabs[0]['meta_id']);
        # start adding new ones
        spa_new_profile_setup();
        do_action('sph_toolbox_housekeeping_profile_tabs');
        $mess = spa_text('Profile tabs reset');
    }
    if (isset($_POST['reset-auths'])) {
        sp_reset_auths();
        do_action('sph_toolbox_housekeeping_auths');
        $mess = spa_text('Auths caches cleaned');
    }
    if (isset($_POST['reset-plugin-data'])) {
        sp_reset_member_plugindata();
        do_action('sph_toolbox_housekeeping_plugindata');
        $mess = spa_text('Users Plugin Data reset');
    }
    if (isset($_POST['reset-combinedcss'])) {
        sp_clear_combined_css('all');
        sp_clear_combined_css('mobile');
        sp_clear_combined_css('tablet');
        do_action('sph_toolbox_housekeeping_ccombined_css');
        $mess = spa_text('Combined CSS cache file removed');
    }
    if (isset($_POST['reset-combinedjs'])) {
        sp_clear_combined_scripts('desktop');
        sp_clear_combined_scripts('mobile');
        sp_clear_combined_scripts('tablet');
        do_action('sph_toolbox_housekeeping_combined_js');
        $mess = spa_text('Combined scripts cache files removed');
    }
    if (isset($_POST['flushcache'])) {
        sp_flush_cache('all');
        do_action('sph_toolbox_housekeeping_flush_cache');
        $mess = spa_text('General cache flushed');
    }
    do_action('sph_toolbox_housekeeping_save');
    return $mess;
}
$batchSQL = sp_esc_int($_GET['batchNum']);
$where = ' WHERE admin=0';
if ($_GET['ignoremods']) {
    $where .= ' AND moderator=0';
}
$users = spdb_select('col', 'SELECT user_id FROM ' . SFMEMBERS . $where . ' ORDER BY user_id LIMIT ' . $startSQL . ', ' . $batchSQL);
if ($users) {
    $value = sp_get_sfmeta('default usergroup', 'sfmembers');
    $defaultUG = $value[0]['meta_value'];
    foreach ($users as $thisUser) {
        if ($_GET['mapoption'] == 2) {
            spdb_query('DELETE FROM ' . SFMEMBERSHIPS . ' WHERE user_id=' . $thisUser);
        }
        $user = new WP_User($thisUser);
        if (!empty($user->roles) && is_array($user->roles)) {
            foreach ($user->roles as $role) {
                $value = sp_get_sfmeta('default usergroup', $role);
                if (!empty($value)) {
                    $ug = $value[0]['meta_value'];
                } else {
                    $ug = $defaultUG;
                }
                sp_add_membership($ug, $thisUser);
            }
        }
    }
    # clean up
    sp_reset_memberships();
    sp_reset_auths();
}
die;
function sp_remove_membership($usergroup_id, $user_id)
{
    spdb_query('DELETE FROM ' . SFMEMBERSHIPS . " WHERE user_id={$user_id} AND usergroup_id={$usergroup_id}");
    # reset auths and memberships for added user
    sp_reset_memberships($user_id);
    sp_reset_auths($user_id);
    sp_update_member_moderator_flag($user_id);
    return true;
}
function spa_save_permissions_new_auth()
{
    check_admin_referer('forum-adminform_authnew', 'forum-adminform_authnew');
    # create the auth
    if (!empty($_POST['auth_name'])) {
        $active = isset($_POST['auth_active']) ? 1 : 0;
        $ignored = isset($_POST['auth_guests']) ? 1 : 0;
        $enabling = isset($_POST['auth_enabling']) ? 1 : 0;
        $result = sp_add_auth(sp_filter_title_save($_POST['auth_name']), sp_filter_title_save($_POST['auth_desc']), $active, $ignored, $enabling);
        if ($result) {
            # reset the auths to account for new auth
            sp_reset_auths();
            $mess = spa_text('New auth added');
        } else {
            $mess = spa_text('New auth failed - duplicate auth?');
        }
    } else {
        $mess = spa_text('New auth failed - missing data');
    }
    return $mess;
}
            }
        }
    }
}
if ($action == 'del') {
    check_admin_referer('forum-adminform_memberdel', 'forum-adminform_memberdel');
    $usergroup_id = sp_esc_int($_GET['usergroupid']);
    $new_usergroup_id = $_GET['usergroup_id'];
    if (isset($_GET['dmid'])) {
        $user_id_list = array_unique($_GET['dmid']);
    }
    # make sure not moving to same user group
    if (!isset($user_id_list) || $usergroup_id == $new_usergroup_id) {
        die;
    }
    for ($x = $startNum; $x < $startNum + $batchNum; $x++) {
        if (isset($user_id_list[$x])) {
            $user_id = sp_esc_int($user_id_list[$x]);
            $success = spdb_query('DELETE FROM ' . SFMEMBERSHIPS . " WHERE user_id={$user_id} AND usergroup_id={$usergroup_id}");
            if ($new_usergroup_id != -1) {
                $success = sp_add_membership($new_usergroup_id, $user_id);
            }
            # reset auths and memberships for added user
            sp_reset_memberships($user_id);
            sp_reset_auths($user_id);
            # update mod flag
            sp_update_member_moderator_flag($user_id);
        }
    }
}
die;
function spa_save_admins_newadmin_data()
{
    check_admin_referer('forum-adminform_sfaddadmins', 'forum-adminform_sfaddadmins');
    if (isset($_POST['member_id'])) {
        $newadmins = array_unique($_POST['member_id']);
    } else {
        $mess = spa_text('No users selected!');
        return $mess;
    }
    if (isset($_POST['add-opts'])) {
        $opts = $_POST['add-opts'];
    } else {
        $opts = '';
    }
    if (isset($_POST['add-forums'])) {
        $forums = $_POST['add-forums'];
    } else {
        $forums = '';
    }
    if (isset($_POST['add-ugs'])) {
        $ugs = $_POST['add-ugs'];
    } else {
        $ugs = '';
    }
    if (isset($_POST['add-perms'])) {
        $perms = $_POST['add-perms'];
    } else {
        $perms = '';
    }
    if (isset($_POST['add-comps'])) {
        $comps = $_POST['add-comps'];
    } else {
        $comps = '';
    }
    if (isset($_POST['add-users'])) {
        $users = $_POST['add-users'];
    } else {
        $users = '';
    }
    if (isset($_POST['add-profiles'])) {
        $profiles = $_POST['add-profiles'];
    } else {
        $profiles = '';
    }
    if (isset($_POST['add-admins'])) {
        $admins = $_POST['add-admins'];
    } else {
        $admins = '';
    }
    if (isset($_POST['add-tools'])) {
        $tools = $_POST['add-tools'];
    } else {
        $tools = '';
    }
    if (isset($_POST['add-plugins'])) {
        $plugins = $_POST['add-plugins'];
    } else {
        $plugins = '';
    }
    if (isset($_POST['add-themes'])) {
        $themes = $_POST['add-themes'];
    } else {
        $themes = '';
    }
    if (isset($_POST['add-integration'])) {
        $integration = $_POST['add-integration'];
    } else {
        $integration = '';
    }
    $added = false;
    for ($index = 0; $index < count($newadmins); $index++) {
        # get user index and sanitize
        $uid = intval($newadmins[$index]);
        $user = new WP_User(sp_esc_int($uid));
        if ($opts == 'on') {
            $user->add_cap('SPF Manage Options');
        }
        if ($forums == 'on') {
            $user->add_cap('SPF Manage Forums');
        }
        if ($ugs == 'on') {
            $user->add_cap('SPF Manage User Groups');
        }
        if ($perms == 'on') {
            $user->add_cap('SPF Manage Permissions');
        }
        if ($comps == 'on') {
            $user->add_cap('SPF Manage Components');
        }
        if ($users == 'on') {
            $user->add_cap('SPF Manage Users');
        }
        if ($profiles == 'on') {
            $user->add_cap('SPF Manage Profiles');
        }
        if ($admins == 'on') {
            $user->add_cap('SPF Manage Admins');
        }
        if ($tools == 'on') {
            $user->add_cap('SPF Manage Toolbox');
        }
        if ($plugins == 'on') {
            $user->add_cap('SPF Manage Plugins');
        }
        if ($themes == 'on') {
            $user->add_cap('SPF Manage Themes');
        }
        if ($integration == 'on') {
            $user->add_cap('SPF Manage Integration');
        }
        $newadmin = $opts == 'on' || $forums == 'on' || $ugs == 'on' || $perms == 'on' || $comps == 'on' || $users == 'on' || $profiles == 'on' || $admins == 'on' || $tools == 'on' || $plugins == 'on' || $themes == 'on' || $integration == 'on';
        $newadmin = apply_filters('sph_admin_caps_new', $newadmin, $user);
        if ($newadmin) {
            $added = true;
            # flag as admin with remove moderator flag
            sp_update_member_item($uid, 'admin', 1);
            sp_update_member_item($uid, 'moderator', 0);
            # admin default options
            $sfadminoptions = array();
            $sfadminoptions['sfnotify'] = false;
            $sfadminoptions['notify-edited'] = false;
            $sfadminoptions['bypasslogout'] = false;
            sp_update_member_item($uid, 'admin_options', $sfadminoptions);
            # remove any usergroup permissions
            spdb_query('DELETE FROM ' . SFMEMBERSHIPS . " WHERE user_id={$uid}");
            do_action('sph_admin_new_admin', $uid);
        }
        # reset auths and memberships for new admins
        sp_reset_memberships($uid);
        sp_reset_auths($uid);
    }
    do_action('sph_admin_new_save');
    if ($added) {
        $mess = spa_text('New admins added!');
    } else {
        $mess = spa_text('No data changed!');
    }
    return $mess;
}