function sp_do_sp_ForumDropdownTag($args = '')
{
    #check if forum displayed
    if (sp_abort_display_forum()) {
        return;
    }
    $defs = array('tagId' => 'spForumDropdownTag', 'tagClass' => 'spLinkTag', 'selectClass' => 'spSelectTag', 'forumList' => 0, 'label' => __("Select forum", 'sp-ttags'), 'length' => 30, 'echo' => 1);
    $a = wp_parse_args($args, $defs);
    $a = apply_filters('sph_ForumDropdownTag_args', $a);
    extract($a, EXTR_SKIP);
    # sanitize before use
    $tagId = esc_attr($tagId);
    $tagClass = esc_attr($tagClass);
    $selectClass = esc_attr($selectClass);
    $forumList = esc_attr($forumList);
    $label = sp_filter_title_display($label);
    $length = (int) $length;
    $echo = (int) $echo;
    global $spThisUser;
    sp_forum_api_support();
    $forum_ids = array();
    if ($forumList == 0) {
        $forum_ids = sp_get_forum_memberships($spThisUser->ID);
    } else {
        $allforums = explode(',', $forumList);
        foreach ($allforums as $thisforum) {
            if (sp_can_view($thisforum, 'forum-title')) {
                $forum_ids[] = $thisforum;
            }
        }
    }
    if (empty($forum_ids)) {
        return;
    }
    # create where clause based on forums that current user can view
    $where = "forum_id IN (" . implode(",", $forum_ids) . ")";
    $spdb = new spdbComplex();
    $spdb->table = SFFORUMS;
    $spdb->fields = 'forum_slug, forum_name';
    $spdb->join = array(SFGROUPS . ' ON ' . SFFORUMS . '.group_id = ' . SFGROUPS . '.group_id');
    $spdb->where = $where;
    $spdb->orderby = 'group_seq, forum_seq';
    $forums = $spdb->select();
    $out = "<div id='{$tagId}' class='{$tagClass}'>";
    $out .= '<select name="forumselect" class="' . $selectClass . '" onChange="javascript:spjChangeForumURL(this)">' . "\n";
    $out .= '<option>' . $label . '</option>' . "\n";
    foreach ($forums as $forum) {
        $out .= '<option value="' . sp_build_url($forum->forum_slug, '', 0, 0) . '">&nbsp;&nbsp;' . sp_create_name_extract(sp_filter_title_display($forum->forum_name), $length) . '</option>' . "\n";
    }
    $out .= '</select>' . "\n";
    $out .= '</div>';
    $out .= '<script type="text/javascript">';
    $out .= 'function spjChangeForumURL(menuObj) {';
    $out .= 'var i = menuObj.selectedIndex;';
    $out .= 'if(i > 0) {';
    $out .= 'if(menuObj.options[i].value != "#") {';
    $out .= 'window.location = menuObj.options[i].value;';
    $out .= '}}}';
    $out .= '</script>';
    $out = apply_filters('sph_ForumDropdownTag', $out);
    if ($echo) {
        echo $out;
    } else {
        return $out;
    }
}
function sp_do_sp_AuthorPostsTag($args = '')
{
    #check if forum displayed
    if (sp_abort_display_forum()) {
        return;
    }
    $defs = array('tagId' => 'spAuthorPostsTag', 'tagClass' => 'spLinkTag', 'authorId' => '', 'showForum' => 1, 'showDate' => 1, 'limit' => 5, 'listTags' => 0, 'echo' => 1);
    $a = wp_parse_args($args, $defs);
    $a = apply_filters('sph_AuthorPostsTag_args', $a);
    extract($a, EXTR_SKIP);
    # sanitize before use
    $tagId = esc_attr($tagId);
    $tagClass = esc_attr($tagClass);
    $authorId = (int) $authorId;
    $showForum = (int) $showForum;
    $showDate = (int) $showDate;
    $limit = (int) $limit;
    $listTags = (int) $listTags;
    $echo = (int) $echo;
    if (empty($authorId)) {
        return;
    }
    sp_forum_api_support();
    if ($limit == 0) {
        $limit = '';
    }
    # limit to viewable forums based on permissions
    $where = SFPOSTS . '.user_id = ' . $authorId . ' AND ' . SFPOSTS . '.post_status=0 ';
    $forum_ids = sp_get_forum_memberships();
    # create where clause based on forums that current user can view
    if ($forum_ids != '') {
        $where .= "AND " . SFPOSTS . ".forum_id IN (" . implode(",", $forum_ids) . ")";
    } else {
        return '';
    }
    $spdb = new spdbComplex();
    $spdb->table = SFPOSTS;
    $spdb->distinct = true;
    $spdb->fields = SFPOSTS . '.post_id, ' . SFPOSTS . '.forum_id, ' . SFPOSTS . '.topic_id, ' . spdb_zone_datetime('post_date') . ',
							  post_index, forum_slug, forum_name, topic_slug, topic_name';
    $spdb->join = array(SFTOPICS . ' ON ' . SFPOSTS . '.topic_id = ' . SFTOPICS . '.topic_id', SFFORUMS . ' ON ' . SFPOSTS . '.forum_id = ' . SFFORUMS . '.forum_id');
    $spdb->where = $where;
    $spdb->orderby = 'post_date DESC';
    $spdb->limits = $limit;
    $sfposts = $spdb->select();
    if (!$listTags) {
        $out = "<div id='{$tagId}' class='{$tagClass}'>";
        $open = '<div>';
        $close = '</div>';
    } else {
        $out = "<ul id='{$tagId}' class='{$tagClass}'>";
        $open = '<li>';
        $close = '</li>';
    }
    if ($sfposts) {
        foreach ($sfposts as $sfpost) {
            $out .= $open;
            if ($showForum) {
                $out .= sp_filter_title_display($sfpost->forum_name) . '<br />';
            }
            $out .= '<a href="' . sp_build_url($sfpost->forum_slug, $sfpost->topic_slug, 0, $sfpost->post_id, $sfpost->post_index) . '">' . sp_filter_title_display($sfpost->topic_name) . '</a><br />' . "\n";
            if ($showDate) {
                $out .= sp_date('d', $sfpost->post_date) . '<br />';
            }
            $out .= $close;
        }
    } else {
        $out .= $open . __('No posts by this author', 'sp-ttags') . $close;
    }
    if (!$listTags) {
        $out .= '</div>';
    } else {
        $out .= '</ul>';
    }
    $out = apply_filters('sph_AuthorPostsTag', $out);
    if ($echo) {
        echo $out;
    } else {
        return $out;
    }
}
    function sp_memberslist_query($groupBy, $orderBy, $sortBy, $number, $limitUG, $ugids)
    {
        global $spThisUser, $spVars, $wpdb;
        # check for page
        $page = isset($_GET['page']) ? sp_esc_int($_GET['page']) : $spVars['page'];
        # check for member search
        $search = !empty($_POST['msearch']) && !isset($_POST['allmembers']) ? sp_esc_str($_POST['msearch']) : '';
        $search = !empty($_GET['msearch']) ? sp_esc_str($_GET['msearch']) : $search;
        # check for usergroup selection query arg
        $ug_select = !empty($_POST['ug']) && !isset($_POST['allmembers']) ? sp_esc_int($_POST['ug']) : '';
        $ug_select = !empty($_GET['ug']) ? sp_esc_int($_GET['ug']) : $ug_select;
        # check for constructor limiting usergroups
        if ($groupBy == 'usergroup' && !empty($ugids)) {
            $ugids = explode(',', sp_esc_str($ugids));
        }
        $data = new stdClass();
        $data->records = new stdClass();
        $data->count = 0;
        if ($spThisUser->admin || sp_get_auth('view_members_list')) {
            # default to 'no data'
            $this->membersListStatus = 'no data';
            # are we limiting member lists to user group memberships?
            $where = 'posts > -2';
            if ($groupBy == 'usergroup' && !$spThisUser->admin) {
                # if limiting to memberships, get usergroups current user has membership in
                if ($limitUG) {
                    $ugs = sp_get_user_memberships($spThisUser->ID);
                    if (empty($ugs)) {
                        $value = sp_get_sfmeta('default usergroup', 'sfguests');
                        $sql = 'SELECT * FROM ' . SFUSERGROUPS . " WHERE usergroup_id={$value[0]['meta_value']}";
                        $ugs = spdb_select('set', $sql, ARRAY_A);
                    }
                    # Now add any moderator user groups who can moderate the current users forums
                    $forums = sp_get_forum_memberships($spThisUser->ID);
                    $forums = implode(',', $forums);
                    $sql = 'SELECT DISTINCT ' . SFMEMBERSHIPS . '.usergroup_id, usergroup_name, usergroup_desc, usergroup_join, usergroup_badge FROM ' . SFMEMBERSHIPS . '
					JOIN ' . SFUSERGROUPS . ' ON ' . SFUSERGROUPS . '.usergroup_id = ' . SFMEMBERSHIPS . '.usergroup_id
					JOIN ' . SFPERMISSIONS . ' ON ' . SFPERMISSIONS . ".forum_id IN ({$forums})\n\t\t\t\t\tWHERE usergroup_is_moderator=1 ORDER BY " . SFMEMBERSHIPS . '.usergroup_id';
                    $mugs = spdb_select('set', $sql, ARRAY_A);
                    if ($mugs) {
                        $ugs = array_merge($mugs, $ugs);
                    }
                } else {
                    $ugs = spdb_table(SFUSERGROUPS, '', '', '', '', ARRAY_A);
                }
                if (empty($ugs)) {
                    return $data;
                }
                # now build the where clause
                $ug_ids = array();
                foreach ($ugs as $index => $ug) {
                    if (empty($ugids) || in_array($ug['usergroup_id'], $ugids)) {
                        $ug_ids[] = $ug['usergroup_id'];
                    } else {
                        unset($ugs[$index]);
                    }
                }
                if (empty($ug_ids)) {
                    return $data;
                }
                $this->userGroups = array_values($ugs);
                # create where clause based on user memberships
                if (!$limitUG && empty($ugids) && empty($ug_select)) {
                    # not limiting by usergroup or specific ids so grab all users
                    $where .= ' AND (' . SFMEMBERSHIPS . '.usergroup_id IN (' . implode(',', $ug_ids) . ') OR ' . SFMEMBERSHIPS . '.usergroup_id IS NULL)';
                } else {
                    if (empty($ug_select)) {
                        # limiting by usergroup or specific ids, so only grab those users plus admins (skips users with no memmberships)
                        $where .= ' AND (' . SFMEMBERSHIPS . '.usergroup_id IN (' . implode(',', $ug_ids) . ') OR admin=1)';
                    } else {
                        $where .= ' AND (' . SFMEMBERSHIPS . ".usergroup_id = {$ug_select} AND " . SFMEMBERSHIPS . '.usergroup_id IN (' . implode(',', $ug_ids) . '))';
                    }
                }
            } else {
                if (!empty($ug_select)) {
                    $where .= ' AND ' . SFMEMBERSHIPS . ".usergroup_id = {$ug_select}";
                }
                $this->userGroups = spdb_table(SFUSERGROUPS, '', '', '', '', ARRAY_A);
            }
            if ($search != '') {
                $where .= ' AND ' . SFMEMBERS . '.display_name LIKE "' . esc_sql($wpdb->esc_like($search)) . '%"';
            }
            # how many members per page?
            $startlimit = 0;
            if ($page != 1) {
                $startlimit = ($page - 1) * $number;
            }
            $limit = $startlimit . ', ' . $number;
            $order = '';
            if ($groupBy == 'usergroup' && $orderBy == 'id') {
                $order .= "usergroup_id {$sortBy}, " . SFMEMBERS . ".display_name {$sortBy}";
            }
            if ($groupBy == 'usergroup' && $orderBy == 'alpha') {
                $order .= "usergroup_name {$sortBy}, " . SFMEMBERS . ".display_name {$sortBy}";
            }
            if ($groupBy == 'user' && $orderBy == 'id') {
                $order .= SFMEMBERS . ".user_id {$sortBy}";
            }
            if ($groupBy == 'user' && $orderBy == 'alpha') {
                $order .= SFMEMBERS . ".display_name {$sortBy}";
            }
            $join = SFUSERS . ' ON ' . SFMEMBERS . '.user_id=' . SFUSERS . '.ID ';
            if ($groupBy == 'usergroup') {
                $q = 'if (' . SFMEMBERS . '.admin=1, 0, IFNULL(' . SFMEMBERSHIPS . '.usergroup_id, 99999999)) AS usergroup_id,
					  if (' . SFMEMBERS . '.admin=1, "' . sp_text('Admins') . '", IFNULL(' . SFUSERGROUPS . '.usergroup_name, "' . sp_text('No Memberships') . '")) as usergroup_name,
					  if (' . SFMEMBERS . '.admin=1, "' . sp_text('Forum Administrators') . '", IFNULL(' . SFUSERGROUPS . '.usergroup_desc, "' . sp_text('Members without any usergroup memberships') . '")) as usergroup_desc,
					  ' . SFMEMBERS . '.user_id, ' . SFMEMBERS . '.display_name, admin, avatar, posts, lastvisit, user_registered, user_url, user_options';
                $join .= 'LEFT JOIN ' . SFMEMBERSHIPS . ' ON ' . SFMEMBERSHIPS . '.user_id=' . SFMEMBERS . '.user_id
						 LEFT JOIN ' . SFUSERGROUPS . ' ON ' . SFUSERGROUPS . '.usergroup_id=' . SFMEMBERSHIPS . '.usergroup_id';
            } else {
                $q = SFMEMBERS . '.user_id, ' . SFMEMBERS . '.display_name, admin, avatar, posts, lastvisit, user_registered, user_url, user_options';
            }
            # retrieve members list records
            $spdb = new spdbComplex();
            $spdb->table = SFMEMBERS;
            $spdb->fields = $q;
            $spdb->found_rows = true;
            $spdb->distinct = true;
            $spdb->left_join = $join;
            $spdb->where = $where;
            $spdb->orderby = $order;
            $spdb->limits = $limit;
            $spdb = apply_filters('sph_members_list_query', $spdb, $this);
            $records = $spdb->select();
            if ($records) {
                $m = array();
                $ugidx = -1;
                $midx = 0;
                $data->count = spdb_select('var', 'SELECT FOUND_ROWS()');
                foreach ($records as $r) {
                    # for user list only, set up dummy usergroup
                    if ($groupBy != 'usergroup') {
                        $ugidx = 0;
                    }
                    # we have data
                    $this->membersListStatus = 'data';
                    # set up the usergroup outer data and member inner data
                    if ($groupBy == 'usergroup' && ($ugidx == -1 || $m[$ugidx]->usergroup_id != $r->usergroup_id)) {
                        $ugidx++;
                        $midx = 0;
                        $m[$ugidx] = new stdClass();
                        $m[$ugidx]->usergroup_id = $r->usergroup_id;
                        $name = !empty($r->usergroup_name) ? sp_filter_title_display($r->usergroup_name) : sp_text('No Memberships');
                        $desc = !empty($r->usergroup_desc) ? sp_filter_title_display($r->usergroup_desc) : sp_text('Members without any usergroup memberships');
                        $m[$ugidx]->usergroup_name = $name;
                        $m[$ugidx]->usergroup_desc = $desc;
                        $m[$ugidx] = apply_filters('sph_members_list_records', $m[$ugidx], $r);
                    }
                    if (isset($r->user_id)) {
                        $m[$ugidx]->members[$midx] = new stdClass();
                        $m[$ugidx]->members[$midx]->user_id = $r->user_id;
                        $m[$ugidx]->members[$midx]->display_name = sp_filter_title_display($r->display_name);
                        $m[$ugidx]->members[$midx]->posts = $r->posts;
                        $m[$ugidx]->members[$midx]->user_url = $r->user_url;
                        $m[$ugidx]->members[$midx]->admin = $r->admin;
                        $m[$ugidx]->members[$midx]->avatar = unserialize($r->avatar);
                        $m[$ugidx]->members[$midx]->user_options = unserialize($r->user_options);
                        $m[$ugidx]->members[$midx]->lastvisit = sp_apply_timezone(sp_member_lastvisit_to_server_tz($r->lastvisit, $m[$ugidx]->members[$midx]->user_options), 'mysql');
                        $m[$ugidx]->members[$midx]->user_registered = sp_member_registration_to_server_tz($r->user_registered);
                        $m[$ugidx]->members[$midx] = apply_filters('sph_members_list_records', $m[$ugidx]->members[$midx], $r);
                        $midx++;
                    }
                }
                $data->records = $m;
            }
        } else {
            $this->membersListStatus = 'no access';
        }
        return $data;
    }
function sp_do_sp_HotTopicsTag($args = '')
{
    #check if forum displayed
    if (sp_abort_display_forum()) {
        return;
    }
    global $spThisUser;
    $defs = array('tagId' => 'spHotTopicsTag', 'tagClass' => 'spHotTopicsTag', 'listClass' => 'spListItemTag', 'textClass' => 'spHotTopicTextTag', 'listTags' => 1, 'forumIds' => 0, 'limit' => 5, 'days' => 30, 'showForum' => 1, 'textForum' => __('posted in', 'sp-ttags'), 'showCount' => 1, 'textCount' => __('recent posts', 'sp-ttags'), 'showHotness' => 1, 'textHotness' => __('hotness', 'sp-ttags'), 'echo' => 1);
    $a = wp_parse_args($args, $defs);
    $a = apply_filters('sph_HotTopicsTag_args', $a);
    extract($a, EXTR_SKIP);
    # sanitize before use
    $tagId = esc_attr($tagId);
    $tagClass = esc_attr($tagClass);
    $listClass = esc_attr($listClass);
    $textClass = esc_attr($textClass);
    $listTags = (int) $listTags;
    $forumIds = sp_filter_title_display($forumIds);
    $limit = (int) $limit;
    $days = (int) $days;
    $showForum = (int) $showForum;
    $textForum = sp_filter_title_display($textForum);
    $showCount = (int) $showCount;
    $textCount = sp_filter_title_display($textCount);
    $showHotness = (int) $showHotness;
    $textHotness = sp_filter_title_display($textHotness);
    $echo = (int) $echo;
    sp_forum_api_support();
    $forumList = '';
    if (!empty($forumIds)) {
        # are we passing forum ID's?
        $flist = explode(',', $forumIds);
        foreach ($flist as $id) {
            if (sp_can_view($id, 'topic-title')) {
                $forumList[] = $id;
            }
        }
    } else {
        global $spThisUser;
        $allForums = sp_get_forum_memberships($spThisUser->ID);
        if ($allForums) {
            foreach ($allForums as $id) {
                if (sp_can_view($id, 'topic-title')) {
                    $forumList[] = $id;
                }
            }
        }
    }
    if (!empty($forumList)) {
        $where = ' AND ' . SFPOSTS . '.forum_id IN (' . implode(',', $forumList) . ')';
    } else {
        return '';
    }
    # get any posts that meeet date criteria
    $spdb = new spdbComplex();
    $spdb->table = SFPOSTS;
    $spdb->fields = SFPOSTS . '.topic_id, DATEDIFF(CURDATE(), post_date) AS delta, ' . SFPOSTS . '.forum_id, forum_name, forum_slug, forum_slug, topic_name, topic_slug';
    $spdb->join = array(SFTOPICS . ' ON ' . SFTOPICS . '.topic_id = ' . SFPOSTS . '.topic_id', SFFORUMS . ' ON ' . SFFORUMS . '.forum_id = ' . SFPOSTS . '.forum_id');
    $spdb->where = 'DATE_SUB(CURDATE(),INTERVAL ' . $days . ' DAY) <= post_date' . $where;
    $spdb = apply_filters('sph_HotTopicsTagQuery', $spdb);
    $posts = $spdb->select();
    $out = '';
    $out = $listTags ? "<ul id='{$tagId}' class='{$tagClass}'>" : "<div id='{$tagId}' class='{$tagClass}'>";
    if ($posts) {
        # give each topic with posts a score - currently ln(cur date - post date) for each post
        $score = $count = $forum_name = $forum_slug = $topic_slug = $topic_name = array();
        foreach ($posts as $post) {
            if ($post->delta != $days) {
                $value = apply_filters('sph_HotTopicTagScore', log($days - $post->delta), $post, $a);
                # let plugins modify the hotness algorithm
                $score[$post->topic_id] = isset($score[$post->topic_id]) ? $score[$post->topic_id] + $value : $value;
                $count[$post->topic_id] = isset($count[$post->topic_id]) ? $count[$post->topic_id] + 1 : 1;
                $forum_name[$post->topic_id] = sp_filter_title_display($post->forum_name);
                $forum_slug[$post->topic_id] = $post->forum_slug;
                $topic_slug[$post->topic_id] = $post->topic_slug;
                $topic_name[$post->topic_id] = sp_filter_title_display($post->topic_name);
            }
        }
        # reverse sort the posts and limit to number to display
        arsort($score);
        $topics = array_slice($score, 0, $limit, true);
        # now output the popular topics
        foreach ($topics as $id => $topic) {
            $out .= $listTags ? "<li class='{$listClass}'>" : "<div class='{$textClass}'>";
            $out .= sp_get_topic_url($forum_slug[$id], $topic_slug[$id], $topic_name[$id]);
            if ($showForum) {
                $out .= " {$textForum} {$forum_name[$id]}";
            }
            if ($showCount) {
                $out .= ' (' . $count[$id] . " {$textCount})";
            }
            if ($showHotness) {
                $out .= ' (' . round($score[$id], 2) . " {$textHotness})";
            }
            $out .= $listTags ? '</li>' : '</div>';
        }
    } else {
        $out .= "<div class='{$textClass}'>" . __('No current hot topics to display', 'sp-ttags') . '</div>';
    }
    $out .= $listTags ? '</ul>' : '</div>';
    $out = apply_filters('sph_HotTopicsTag', $out);
    if ($echo) {
        echo $out;
    } else {
        return $out;
    }
}