/**
 * Добавляет форму добавления сообщений.
 * @param bool          $edit
 * @param int           $forum
 * @param int           $topic
 * @param int           $id
 * @param string        $value
 * @param string        $text_title
 * @param bool          $loadform
 * @global array        $forum_lang
 */
function ForumRenderPostForm($edit = false, $forum = 0, $topic = 0, $id = 0, $value = '', $text_title = '', $loadform = true)
{
    global $forum_lang;
    System::site()->AddBlock('forum_editpost_form', $loadform, false, 'form');
    $vars = array();
    $page = 1;
    if (isset($_GET['page'])) {
        $page = SafeEnv($_GET['page'], 11, int);
    }
    if ($edit) {
        $vars['pag'] = $page;
        $vars['post'] = $id;
        $vars['text_value'] = $value;
        $vars['text_title'] = $text_title;
        $vars['edit_title'] = $text_title != '';
        $vars['topic'] = $topic;
        $vars['title'] = $forum_lang['edit_post'];
        $vars['url'] = "index.php?name=forum&op=savepost&topic={$topic}&post={$id}&page={$page}";
        $vars['edit'] = true;
        $vars['lsubmit'] = $forum_lang['save'];
        $vars['lsubmit_title'] = $forum_lang['save_edit'];
        $vars['visibility'] = 'visible';
    } else {
        $vars['post'] = 0;
        $vars['topic'] = $topic;
        $vars['forum'] = $forum;
        $vars['edit_title'] = $text_title != '';
        $vars['text_value'] = '';
        $vars['title'] = $forum_lang['add_post'];
        $vars['url'] = "index.php?name=forum&op=addpost&topic={$topic}&forum={$forum}";
        $vars['edit'] = false;
        $vars['lsubmit'] = $forum_lang['add'];
        $vars['lsubmit_title'] = $forum_lang['add_post'];
        $vars['visibility'] = 'hidden';
    }
    $vars['add'] = !$vars['edit'];
    System::site()->Blocks['forum_editpost_form']['vars'] = $vars;
    ForumSmiliesRender();
    // Подключаем BBCode редактор
    IncludePluginsGroup('bbcode_editors');
    System::site()->AddBlock('files', false, true, 'u_files');
    if ($edit) {
        System::site()->AddTemplatedBox('', 'module/forum_edit_post.html');
    } else {
        System::site()->AddBlock('post_form', true, false, 'post_form', 'module/forum_edit_post.html');
    }
}
function IndexForumShowForum()
{
    global $forum_lang;
    $forums_tree = ForumTree::Instance();
    // Параметры просмотра из GET
    // $forum_id
    // $forum
    // $forum_config
    if (isset($_GET['forum'])) {
        $forum_id = SafeEnv($_GET['forum'], 11, int);
        if (isset($forums_tree->IdCats[$forum_id])) {
            // Проверяем идентификатор форума и загружаем его данные
            $forum = $forums_tree->IdCats[$forum_id];
            // Форум
            $forum_config = $forums_tree->GetForumConfigRecursive($forum_id);
            // Конфигурация просматриваемого форума
        } else {
            System::site()->AddTextBox($forum_lang['error'], $forum_lang['error_no_forum']);
            // Форум не найден
            return;
        }
    } else {
        System::site()->AddTextBox($forum_lang['error'], $forum_lang['error_no_forum']);
        // Нет параметра
        return;
    }
    // Проверяем доступ
    if (!$forum_config['access']) {
        System::site()->AddTextBox($forum_lang['error'], $forum_config['access_reason']);
        // Нет доступа в этот форум
        return;
    }
    // Параметры постраничной навигации
    if (isset($_GET['page'])) {
        $page = SafeEnv($_GET['page'], 11, int);
    } else {
        $page = 1;
    }
    $topics_on_page = System::config('forum/topics_on_page');
    // Устанавливаем заголовок страницы
    System::site()->SetTitle(SafeDB($forum['title'], 255, str) . ' - ' . ($page > 1 ? $forum_lang['page'] . $page . ' - ' : '') . $forum_lang['forum']);
    // Объекты статистики и онлайн
    $statistics = ForumStatistics::Instance();
    $online = ForumOnline::Instance($forum_id);
    // Инициализируем статистику
    $statistics->Initialize($forum_lang['statistics_cat']);
    // Загружаем информацию по топикам в $topics_data и считаем статистику (кэшировать статистику)
    $topics_data = ForumCacheGetTopics();
    // Запрашиваем данные тем (агрегированы по форумам)
    $resolve_cats = $forums_tree->GetAllChildId($forum_id);
    // Считаем только в текущем форуме и всех подфорумах
    foreach ($resolve_cats as $resolve_cat) {
        if (!isset($topics_data[$resolve_cat])) {
            continue;
        }
        foreach ($topics_data[$resolve_cat] as $topic) {
            $statistics->hits += $topic['hits'];
            $statistics->AddTopicAuthor($topic['starter_id'], $topic['starter_name']);
        }
    }
    // Подсчитываем количество тем и постов
    $counters = $forums_tree->GetCountersRecursive($forum_id);
    $statistics->topics_count = $counters['files'];
    $statistics->reply_count = $counters['cats'];
    // Выводим подфорумы с помощью функции main (если есть)
    if (isset($forums_tree->Cats[$forum_id]) && count($forums_tree->Cats[$forum_id]) > 0) {
        ForumLoadFunction('main');
        IndexForumMain($forum_id, $topics_data);
        // <-- IndexForumMain
        // Если просматриваем категорию, то топики не выводим
        if ($forum['parent_id'] == 0) {
            return;
        }
    }
    // Выводим хлебные крошки (нужно после IndexForumMain чтобы не выводились два раза при просмотре категории)
    $forums_tree->BreadCrumbsF($forum_id);
    // Блоки шаблона
    // Ссылки, Отметить все как прочитанные и показать все не прочитанные темы.
    $vars_is_forum_member = array();
    $vars_is_forum_member['url'] = '<a href="' . Ufu('index.php?name=forum&op=markread' . ($forum_id > 0 ? '&forum=' . $forum_id : ''), 'forum/markread/' . ($forum_id > 0 ? '{forum}/' : '')) . '">' . $forum_lang['mark_all_read'] . '</a>';
    $vars_is_forum_member['viewnoreadurl'] = '<a href="' . Ufu('index.php?name=forum&op=viewnoread' . ($forum_id > 0 ? '&forum=' . $forum_id : ''), 'forum/viewnoread/' . ($forum_id > 0 ? '{forum}/' : '')) . '">' . $forum_lang['viewnoread'] . '</a>';
    $vars_is_forum_member['forum_id'] = $forum_id;
    if (!System::site()->HasBlock('is_forum_member')) {
        System::site()->AddBlock('is_forum_member', AccessIsResolved(2), false, 'mark');
    }
    System::site()->SetVars('is_forum_member', $vars_is_forum_member);
    // Последние темы форума
    System::site()->AddBlock('old', true, false, 'mark');
    $vars_old = array();
    $vars_old['lasttopics'] = '<a href="' . Ufu('index.php?name=forum&op=lasttopics&forum=' . $forum_id, 'forum/lasttopics/{forum}/') . '">' . $forum_lang['lasttopics'] . '</a>';
    System::site()->SetVars('old', $vars_old);
    // Заголовки (Темы, Ответов, Просмотры)
    System::site()->AddBlock('statistik', true, false, 'stat');
    $vars_stat = array();
    $vars_stat['count_read'] = '';
    $cat_users_count = $online->GetCatOnlineCount($forum_id);
    if ($cat_users_count > 0) {
        $vars_stat['count_read'] = $cat_users_count > 0 ? '<small> (' . $forum_lang['online'] . ': ' . $cat_users_count . ')</small>' : '';
    }
    System::site()->SetVars('statistik', $vars_stat);
    // Блок с информацией о форуме
    System::site()->AddBlock('forum', true, false);
    System::site()->SetVars('forum', IndexForumDataFilter($forum, $forum_config));
    System::site()->AddBlock('forum_guest_message', true);
    // Блок списка топиков
    System::site()->AddBlock('topics', true, true, 'topic');
    // Инициализируем постраничную навигацию
    $navigation = new Navigation($page);
    $navigation->FrendlyUrl = System::config('general/ufu');
    // Есть ли видимые для пользователя топики
    $visable_topics = false;
    $auth = System::user()->Auth;
    $user_id = System::user()->Get('u_id');
    $is_admin = System::user()->isAdmin();
    if (!isset($topics_data[$forum_id]) || count($topics_data[$forum_id]) == 0) {
        // В этом форуме пока нет ни одной темы
        System::site()->AddBlock('no_topics', true);
        $navigation->DisableNavigation();
    } else {
        // Загружаем данные корзины для видимых топиков
        $basket = ForumBasketGetData('forum_basket_topics');
        // Загружаем данные о прочтении тем
        $read_data = Forum_Marker_GetReadData();
        // Фильтруем топики
        $topics_data = $topics_data[$forum_id];
        // Топики в этом форуме
        $topics = array();
        foreach ($topics_data as $topic) {
            // Добавляем данные из корзины, если топик удалён в корзину (корзину тем видят только админы и пользователи-стартеры удалённых тем)
            $topic['status'] = '';
            $topic['show_delete'] = $is_admin;
            if ($topic['delete'] && isset($basket[$topic['id']]) && $auth && ($is_admin || $topic['starter_id'] == $user_id)) {
                // Добавляем сообщение - "Удалено в корзину"
                $topic['status'] = ForumBasketRender($topic['id'], $topic['title'], $basket, false);
                $topic['show_delete'] = false;
            } elseif ($topic['delete']) {
                continue;
                // Удалён топик и корзина не показывается для этого пользователя
            }
            $topics[] = $topic;
        }
        unset($topics_data);
        // Вывод постраничной навигации
        $navigation->GenNavigationMenu($topics, $topics_on_page, Ufu('index.php?name=forum&op=showforum&forum=' . $forum_id, 'forum/{forum}-{page}/', true));
        // Вывод тем из этой категории с постраничной навигацией
        foreach ($topics as $topic) {
            $close = false;
            if ($forum_config['close']) {
                $close = true;
            }
            // Статус прочитано
            $read = true;
            // прочитано
            if ($auth && (!isset($read_data[$topic['id']]) || $topic['last_post'] > $read_data[$topic['id']]['date'])) {
                $read = false;
            }
            $topic = ForumTopicFilterData($topic);
            // Фильтрация данных топика
            $topic['on'] = !$read;
            $topic['off'] = $read;
            // Закрытие топиков в форуме
            if (!$topic['close']) {
                $topic['close'] = $forum_config['close'];
                $topic['begin'] = !$forum_config['close'];
            }
            $topic['page'] = $page;
            $visable_topics = true;
            System::site()->AddSubBlock('topics', true, $topic);
        }
        System::site()->AddBlock('no_topics', !$visable_topics);
    }
    // Форма добавления топиков
    $show_form = $forum_config['add_topic'] && $auth;
    System::site()->AddBlock('topic_form', $show_form, false, 'form');
    if ($show_form) {
        System::site()->SetVar('topic_form', 'url', Ufu('index.php?name=forum&op=addtopic&forum=' . $forum_id, 'forum/addtopic/{forum}/'));
        ForumSmiliesRender();
        // Подключаем BBCode редактор
        IncludePluginsGroup('bbcode_editors');
    }
    // Блок "Права на форуме"
    System::site()->AddBlock('topic_right', true, false, 'topic', 'module/forum_right.html');
    $right_text = '';
    if ($forum_config['add_topic']) {
        $right_text .= $forum_lang['create_new_topics'] . '<br />';
    } else {
        $right_text .= $forum_lang['no_create_new_topics'] . '<br />';
        $right_text .= '(' . $forum_config['add_topic_reason'] . ')<br />';
    }
    if ($forum_config['add_post']) {
        $right_text .= $forum_lang['create_new_message_in_topics'] . '<br />';
    } else {
        $right_text .= $forum_lang['no_create_new_message_in_topics'] . '<br />';
        $right_text .= '(' . $forum_config['add_post_reason'] . ')<br />';
    }
    System::site()->SetVars('topic_right', array('right' => $right_text));
    // Блоки модерации
    ModerationForumTopicsBlocks();
    // Подключаем шаблон
    System::site()->AddTemplatedBox('', 'module/forum_topics.html');
    // Выводм блок онлайн
    $online->Render($forum_id, '0', $forum_lang['current_category'], 'forum_topics_online');
    // Выводим статистику
    $statistics->Render('forum_topics_statistics');
    // Быстрый переход по форумам
    ForumQuickTransitionBox($forum_id, $forum_lang['quick_transition']);
}