function sp_do_sp_TopicLinkTag($args = '')
{
    #check if forum displayed
    if (sp_abort_display_forum()) {
        return;
    }
    $defs = array('topicId' => '', 'linkText' => '%TOPICNAME%', 'beforeLink' => '', 'afterLink' => '', 'listTags' => 0, 'echo' => 1);
    $a = wp_parse_args($args, $defs);
    $a = apply_filters('sph_TopicLinkTag_args', $a);
    extract($a, EXTR_SKIP);
    # sanitize before use
    $topicId = (int) $topicId;
    $linkText = esc_attr($linkText);
    $beforeLink = sp_filter_title_display($beforeLink);
    $afterLink = sp_filter_title_display($afterLink);
    $listTags = (int) $listTags;
    $echo = (int) $echo;
    if (empty($topicId)) {
        return '';
    }
    sp_forum_api_support();
    if (!empty($beforeLink)) {
        $beforeLink = trim($beforeLink) . ' ';
    }
    if (!empty($afterLink)) {
        $afterLink = ' ' . trim($afterLink);
    }
    $spdb = new spdbComplex();
    $spdb->table = SFTOPICS;
    $spdb->fields = SFTOPICS . '.topic_id, ' . SFTOPICS . '.forum_id, topic_slug, topic_name, forum_name, forum_slug';
    $spdb->join = array(SFFORUMS . ' ON ' . SFTOPICS . '.forum_id = ' . SFFORUMS . '.forum_id');
    $spdb->where = SFTOPICS . '.topic_id=' . $topicId;
    $thistopic = $spdb->select();
    $out = '';
    if ($thistopic) {
        if (sp_can_view($thistopic[0]->forum_id, 'topic-title')) {
            $out = '';
            $linkText = str_replace("%TOPICNAME%", sp_filter_title_display($thistopic[0]->topic_name), $linkText);
            if (empty($linkText)) {
                $linkText = sp_filter_title_display($thistopic[0]->topic_name);
            }
            if ($listTags) {
                $out .= '<li>';
            }
            $out .= '<span>' . $beforeLink . '<a href="' . sp_build_url($thistopic[0]->forum_slug, $thistopic[0]->topic_slug, 0, 0) . '">' . $linkText . '</a>' . $afterLink . '</span>';
            if ($listTags) {
                $out .= '</li>';
            }
        }
    } else {
        $out = sprintf(__('Topic %s not found', 'sp-ttags'), $topicId);
    }
    $out = apply_filters('sph_TopicLinkTag', $out);
    if ($echo) {
        echo $out;
    } else {
        return $out;
    }
}
function spa_clean_forum_children()
{
    # Remove all child records from forums
    spdb_query('UPDATE ' . SFFORUMS . ' set children=""');
    # Now get ALL forums
    $forums = spdb_table(SFFORUMS);
    if ($forums) {
        foreach ($forums as $forum) {
            if ($forum->parent != 0) {
                $spdb = new spdbComplex();
                $spdb->table = SFFORUMS;
                $spdb->fields = 'children, group_id';
                $spdb->where = 'forum_id=' . $forum->parent;
                $childlist = $spdb->select();
                if (!empty($childlist[0]->children)) {
                    $children = unserialize($childlist[0]->children);
                } else {
                    $children = array();
                }
                $children[] = $forum->forum_id;
                spdb_query('UPDATE ' . SFFORUMS . " set children='" . serialize($children) . "' WHERE forum_id={$forum->parent}");
                spdb_query('UPDATE ' . SFFORUMS . " set group_id=" . $childlist[0]->group_id . " WHERE forum_id={$forum->forum_id}");
                spdb_flush();
            }
        }
    }
}
function sp_do_sp_AdminModeratorOnlineTag($args = '')
{
    #check if forum displayed
    if (sp_abort_display_forum()) {
        return;
    }
    $defs = array('tagId' => 'spAdminModeratorOnlineTag', 'tagClass' => 'spListTag', 'moderator' => 1, 'custom' => 1, 'customClass' => 'spAdminMessageTag', 'listTags' => 1, 'listClass' => 'spListItemTag', 'onToolTip' => __('Online', 'sp-ttags'), 'onIcon' => 'sp_UserOnlineSmall.png', 'offIcon' => 'sp_UserOfflineSmall.png', 'offToolTip' => __('Offline', 'sp-ttags'), 'useAvatar' => 0, 'avatarSize' => 25, 'echo' => 1);
    $a = wp_parse_args($args, $defs);
    $a = apply_filters('sph_AdminModeratorOnlineTag_args', $a);
    extract($a, EXTR_SKIP);
    # sanitize before use
    $tagId = esc_attr($tagId);
    $tagClass = esc_attr($tagClass);
    $moderator = (int) $moderator;
    $custom = (int) $custom;
    $customClass = esc_attr($customClass);
    $listTags = (int) $listTags;
    $listClass = esc_attr($listClass);
    $onToolTip = sp_filter_title_display($onToolTip);
    $offToolTip = sp_filter_title_display($offToolTip);
    $onIcon = sp_filter_filename_save($onIcon);
    $offIcon = sp_filter_filename_save($offIcon);
    $useAvatar = (int) $useAvatar;
    $avatarSize = (int) $avatarSize;
    $echo = (int) $echo;
    sp_forum_api_support();
    $where = 'admin=1';
    if ($moderator) {
        $where .= ' OR moderator = 1';
    }
    $spdb = new spdbComplex();
    $spdb->table = SFMEMBERS;
    $spdb->fields = 'user_id AS ID, user_email, ' . SFMEMBERS . '.display_name, admin, user_options, admin_options, ' . SFTRACK . '.id AS online';
    $spdb->left_join = array(SFTRACK . ' ON ' . SFMEMBERS . '.user_id = ' . SFTRACK . '.trackuserid', SFUSERS . ' ON ' . SFMEMBERS . '.user_id = ' . SFUSERS . '.ID');
    $spdb->where = $where;
    $spdb->orderby = 'online DESC';
    $admins = $spdb->select();
    $out = '';
    if ($admins) {
        $out .= $listTags ? "<ul id='{$tagId}' class='{$tagClass}'>" : "<div id='{$tagId}' class='{$tagClass}'>";
        foreach ($admins as $admin) {
            $noAvatar = '';
            $msg = '';
            $userOpts = unserialize($admin->user_options);
            if (!$userOpts['hidestatus']) {
                $userName = sp_build_name_display($admin->ID, sp_filter_name_display($admin->display_name));
                $icon = $admin->online ? $onIcon : $offIcon;
                $tip = $admin->online ? $onToolTip : $offToolTip;
                if (!$useAvatar) {
                    $noAvatar .= "<img src='" . sp_find_icon(SPTHEMEICONSURL, "{$icon}") . "' alt='' title='{$tip}' />";
                }
                if (!$admin->online && $custom) {
                    $userOpts = unserialize($admin->admin_options);
                    if (isset($userOpts['offline_message'])) {
                        $msg = sp_filter_text_display($userOpts['offline_message']);
                        if ($msg != '') {
                            $msg = "<div class='{$customClass}'>{$msg}</div>";
                        }
                    }
                }
                # begin loop display
                if ($listTags ? $out .= "<li class='{$listClass}'>" : ($out .= "<div class='{$listClass}'>")) {
                }
                # Avatar or Icon
                if ($useAvatar) {
                    $admin->avatar = '';
                    $out .= sp_UserAvatar("tagClass=spAvatar&imgClass=spAvatar&size={$avatarSize}&context=user&echo=0", $admin);
                } else {
                    $out .= $noAvatar;
                }
                # User name and current online status
                $out .= "<span class='spOnlineAdmin'><span class='spOnlineUser'>{$userName}</span> is <span class='admin{$tip}'>{$tip}</span>";
                # display offline message is set
                $out .= $msg;
                $out .= '</span>';
                # end loop display
                if ($listTags ? $out .= '<div style="clear:both;"></div></li>' : ($out .= '</div><div style="clear:both;"></div>')) {
                }
            }
        }
        $out .= $listTags ? '</ul>' : '</div>';
    }
    $out = apply_filters('sph_AdminModeratorOnlineTag', $out);
    if ($echo) {
        echo $out;
    } else {
        return $out;
    }
}
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;
    }
}