function IndexForumUserTopics()
{
    global $forum_lang;
    $forums_tree = ForumTree::Instance();
    // Проверка данных
    if (isset($_GET['user'])) {
        $user_id = SafeEnv($_GET['user'], 11, int);
        $user = GetUserInfo($user_id);
        if ($user === false) {
            // Пользователь не найден
            System::site()->AddTextBox($forum_lang['error'], $forum_lang['error_no_user']);
            return;
        }
    } else {
        System::site()->AddTextBox($forum_lang['error'], $forum_lang['error_no_data']);
        // Нет параметра
        return;
    }
    // Параметры постраничной навигации
    if (isset($_GET['page'])) {
        $page = SafeEnv($_GET['page'], 11, int);
    } else {
        $page = 1;
    }
    $topics_on_page = System::config('forum/topics_on_page');
    // Устанавливаем заголовок страницы
    $function_title = $forum_lang['allusertopics'] . ' "' . $user['name'] . '"';
    System::site()->SetTitle(SafeDB($function_title, 255, str) . ' - ' . ($page > 1 ? $forum_lang['page'] . $page . ' - ' : '') . $forum_lang['forum']);
    $forum_nav_url = Ufu('index.php?name=forum&op=usertopics&user='******'forum/usertopics/{user}-{page}/', true);
    //$forum_url = Ufu('index.php?name=forum&op=usertopics&user='******'forum/usertopics/{user}/');
    // Объекты статистики и онлайн
    $statistics = ForumStatistics::Instance();
    $online = ForumOnline::Instance('0', '0', true);
    // Обновляем статус онлайн
    // Инициализируем статистику
    $statistics->Initialize($forum_lang['statistics_cat']);
    // Хлебные крошки
    System::site()->BreadCrumbAdd($function_title);
    $auth = System::user()->Auth;
    $is_admin = System::user()->isAdmin();
    $current_user_id = System::user()->Get('u_id');
    // Загружаем данные корзины для видимых топиков
    $basket = ForumBasketGetData('forum_basket_topics');
    // Загружаем информацию по топикам в $topics_data и считаем статистику (кэшировать статистику)
    $topics_data = ForumCacheGetTopics();
    // Запрашиваем данные тем (агрегированы по форумам)
    $topics = array();
    // Сюда будем добавлять топики для вывода
    $resolve_cats = $forums_tree->GetAllAccessForumId(0);
    // Считаем только в открытых для доступа форумах
    foreach ($resolve_cats as $resolve_cat) {
        if (!isset($topics_data[$resolve_cat])) {
            continue;
        }
        foreach ($topics_data[$resolve_cat] as $topic) {
            // Отсеиваем
            if ($topic['starter_id'] == $user_id) {
                // Добавляем данные из корзины, если топик удалён в корзину
                $topic['status'] = '';
                $topic['show_delete'] = $is_admin;
                if ($topic['delete'] && isset($basket[$topic['id']]) && $auth && ($is_admin || $topic['starter_id'] == $current_user_id)) {
                    // Добавляем сообщение - "Удалено в корзину"
                    $topic['status'] = ForumBasketRender($topic['id'], $topic['title'], $basket, false);
                    $topic['show_delete'] = false;
                } elseif ($topic['delete']) {
                    continue;
                    // Удалён топик и корзина не показывается для этого пользователя
                }
                $statistics->hits += $topic['hits'];
                $statistics->AddTopicAuthor($topic['starter_id'], $topic['starter_name']);
                $statistics->topics_count += 1;
                $statistics->reply_count += $topic['posts'];
                $topics[] = $topic;
            }
        }
    }
    unset($topics_data);
    // Заголовки (Темы, Ответов, Просмотры)
    System::site()->AddBlock('statistik', true, false, 'stat');
    System::site()->SetVars('statistik', array('count_read' => ''));
    // Отключаем некоторые блоки
    System::site()->AddBlock('topic_form', false, false, 'form');
    System::site()->AddBlock('topic_right', false, false, 'topic');
    System::site()->AddBlock('forum', false);
    System::site()->AddBlock('forum_guest_message', false);
    // Блоки шаблона
    // Ссылки, Отметить все как прочитанные и показать все не прочитанные темы.
    $vars_is_forum_member = array();
    $vars_is_forum_member['url'] = '<a href="' . Ufu('index.php?name=forum&op=markread', 'forum/markread/') . '">' . $forum_lang['mark_all_read'] . '</a>';
    $vars_is_forum_member['viewnoreadurl'] = '<a href="' . Ufu('index.php?name=forum&op=viewnoread', 'forum/viewnoread/') . '">' . $forum_lang['viewnoread'] . '</a>';
    $vars_is_forum_member['forum_id'] = '0';
    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/lasttopics/') . '">' . $forum_lang['lasttopics'] . '</a>';
    System::site()->SetVars('old', $vars_old);
    // Блок списка топиков
    System::site()->AddBlock('topics', true, true, 'topic');
    // Инициализируем постраничную навигацию
    $navigation = new Navigation($page);
    $navigation->FrendlyUrl = System::config('general/ufu');
    // Выводим топики в шаблон
    if (count($topics) == 0) {
        // В этом форуме пока нет ни одной темы
        System::site()->AddBlock('no_topics', true);
        $navigation->DisableNavigation();
    } else {
        // Вывод постраничной навигации
        $navigation->GenNavigationMenu($topics, $topics_on_page, $forum_nav_url);
        // Загружаем данные о прочтении тем
        $read_data = Forum_Marker_GetReadData();
        $visable_topics = false;
        // Вывод тем из этой категории с постраничной навигацией
        foreach ($topics as $topic) {
            $forum_config = $forums_tree->GetForumConfigRecursive($topic['forum_id']);
            // Конфигурация просматриваемого форума
            // Статус прочитано
            $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);
    }
    // Блоки модерации
    ModerationForumTopicsBlocks();
    // Подключаем шаблон
    System::site()->AddTemplatedBox('', 'module/forum_topics.html');
    // Выводм блок онлайн
    $online->Render('0', '0', $forum_lang['all_online'], 'forum_topics_online');
    // Выводим статистику
    $statistics->Render('forum_topics_statistics');
    // Выбор периода и быстрый переход
    ForumQuickTransitionBox(0, $forum_lang['quick_transition']);
}
 /**
  * Рекурсивно проверяет ограничения доступа у всех родителей объекта и возвращает наименьшие права, а так-же ищет последнее сообщение
  * в ветке форума и подсчитывает общее количество тем и сообщений.
  * @param type $CatId
  * @param null $UserLevel
  * @param null $RankMin
  * @return array [no_link_guest, new_message_email, access, add_topic, add_post, close, access_reason, add_topic_reason, add_post_reason, ...]
  */
 public function GetForumConfigRecursive($CatId, $UserLevel = null, $RankMin = null)
 {
     $config = array('no_link_guest' => '0', 'new_message_email' => '1', 'admin_theme_add' => '0', 'rang_access' => '0', 'rang_message' => '0', 'rang_add_theme' => '0', 'close_topic' => '0', 'view' => '4', 'status' => '1');
     $result = array('no_link_guest' => false, 'new_message_email' => true, 'access' => true, 'add_topic' => true, 'add_post' => true, 'close' => false, 'access_reason' => '', 'add_topic_reason' => '', 'add_post_reason' => '', 'topics' => 0, 'posts' => 0, 'last_post' => 0, 'last_poster_id' => 0, 'last_poster_name' => '', 'last_title' => '', 'last_id' => 0);
     // Подсчитываем наименьшие права
     $parents = $this->GetAllParent($CatId);
     // У всех родителей и у себя
     foreach ($parents as &$parent) {
         if ($parent['no_link_guest'] == '1') {
             $config['no_link_guest'] = '1';
         }
         if ($parent['new_message_email'] == '0') {
             $config['new_message_email'] = '0';
         }
         if ($parent['admin_theme_add'] == '1') {
             $config['admin_theme_add'] = '1';
         }
         if ($parent['rang_access'] != '0' && $config['rang_access'] == '0') {
             $config['rang_access'] = $parent['rang_access'];
         } elseif ($parent['rang_access'] != '0' && $config['rang_access'] != '0' && GetRankInfo($parent['rang_access'], 'min') > GetRankInfo($config['rang_access'], 'min')) {
             $config['rang_access'] = $parent['rang_access'];
         }
         if ($parent['rang_message'] != '0' && $config['rang_message'] == '0') {
             $config['rang_message'] = $parent['rang_message'];
         } elseif ($parent['rang_message'] != '0' && $config['rang_message'] != '0' && GetRankInfo($parent['rang_message'], 'min') > GetRankInfo($config['rang_message'], 'min')) {
             $config['rang_message'] = $parent['rang_message'];
         }
         if ($parent['rang_add_theme'] != '0' && $config['rang_add_theme'] == '0') {
             $config['rang_add_theme'] = $parent['rang_add_theme'];
         } elseif ($parent['rang_add_theme'] != '0' && $config['rang_add_theme'] != '0' && GetRankInfo($parent['rang_add_theme'], 'min') > GetRankInfo($config['rang_add_theme'], 'min')) {
             $config['rang_add_theme'] = $parent['rang_add_theme'];
         }
         if ($parent['close_topic'] == '1') {
             $config['close_topic'] = '1';
         }
         if ($parent['view'] < $config['view']) {
             $config['view'] = $parent['view'];
         }
         if ($parent['status'] == '0') {
             $config['status'] = '0';
         }
     }
     $user_rank = array();
     if (isset($UserLevel)) {
         $user_level = $UserLevel;
         if (isset($RankMin)) {
             $user_rank['min'] = $RankMin;
         } else {
             $user_rank['min'] = 0;
         }
     } else {
         $user_level = System::user()->AccessLevel();
         if ($user_level == ACCESS_MEMBER) {
             // Пользователь
             $user_rank = GetUserRankInfo();
             // Ранг текущего пользователя
         }
     }
     $result['no_link_guest'] = $user_level == ACCESS_GUEST && $config['no_link_guest'] == '1';
     // Только для гостей
     $result['new_message_email'] = $user_level < ACCESS_MEMBER && $config['new_message_email'] == '1';
     // Только для пользователй
     // Доступ
     if (!AccessIsResolved($config['view'])) {
         // Проверяем доступ по view
         $result['access'] = false;
         $result['access_reason'] = 'Доступ в этот раздел ограничен.';
     } elseif ($config['status'] == '0') {
         $result['access'] = false;
         $result['access_reason'] = 'Раздел отключён.';
     } elseif ($user_level != ACCESS_ADMIN && $config['rang_access'] != '0') {
         if ($user_level > ACCESS_MEMBER) {
             // Гость
             $result['access'] = false;
             $result['access_reason'] = 'Доступ в этот раздел ограничен для гостей.';
         } elseif ($user_level == ACCESS_MEMBER && GetRankInfo($config['rang_access'], 'min') > $user_rank['min']) {
             // Пользователь
             $result['access'] = false;
             $result['access_reason'] = 'Доступ в этот раздел разрешен только пользователям с рангом "' . SafeDB(GetRankInfo($config['rang_access'], 'title'), 255, str) . '" и выше.';
         }
     }
     // Добавление тем
     if (!$result['access']) {
         $result['add_topic'] = false;
         $result['add_topic_reason'] = $result['access_reason'];
     } elseif ($user_level != ACCESS_ADMIN) {
         if ($user_level > ACCESS_MEMBER) {
             $result['add_topic'] = false;
             $result['add_topic_reason'] = 'Гости не могут создавать темы.';
         } elseif ($config['close_topic'] == '1') {
             $result['add_topic'] = false;
             $result['add_topic_reason'] = 'Форум закрыт для обсуждения.';
         } elseif ($config['admin_theme_add'] == '1') {
             $result['add_topic'] = false;
             $result['add_topic_reason'] = 'Создавать новые темы могут только администраторы.';
         } elseif ($config['rang_add_theme'] != '0') {
             if ($user_level == ACCESS_MEMBER && GetRankInfo($config['rang_add_theme'], 'min') > $user_rank['min']) {
                 // Пользователь
                 $result['add_topic'] = false;
                 $result['add_topic_reason'] = 'Создание тем разрешено только пользователям с рангом "' . SafeDB(GetRankInfo($config['rang_add_theme'], 'title'), 255, str) . '" и выше.';
             }
         }
     }
     // Добавление сообщений
     if (!$result['access']) {
         $result['add_post'] = false;
         $result['add_post_reason'] = $result['access_reason'];
     } elseif ($user_level != ACCESS_ADMIN) {
         if ($user_level > ACCESS_MEMBER) {
             $result['add_post'] = false;
             $result['add_post_reason'] = 'Гости не могут добавлять сообщения.';
         } elseif ($config['close_topic'] == '1') {
             $result['add_post'] = false;
             $result['add_post_reason'] = 'Форум закрыт для обсуждения.';
         } elseif ($config['rang_add_theme'] != '0') {
             if ($user_level == ACCESS_MEMBER && GetRankInfo($config['rang_message'], 'min') > $user_rank['min']) {
                 // Пользователь
                 $result['add_post'] = false;
                 $result['add_post_reason'] = 'Добавление сообщений разрешено только пользователям с рангом "' . SafeDB(GetRankInfo($config['rang_message'], 'title'), 255, str) . '" и выше.';
             }
         }
     }
     // Форум закрыт
     $result['close'] = $config['close_topic'] == '1';
     // Ищем данные о последнем посте, подсчитываем общее количество тем и сообщений
     $childs = $this->GetAllChildId($CatId);
     foreach ($childs as $child) {
         $child = $this->IdCats[$child];
         $result['topics'] += $child['topics'];
         $result['posts'] += $child['posts'];
         if ($result['last_post'] < $child['last_post']) {
             $result['last_post'] = $child['last_post'];
             $result['last_poster_id'] = $child['last_poster_id'];
             $result['last_poster_name'] = $child['last_poster_name'];
             $result['last_title'] = $child['last_title'];
             $result['last_id'] = $child['last_id'];
         }
     }
     return $result;
 }
/**
 * Главная страница форума, список форумов в категории или подфорумов в форуме.
 * @param int   $cat_id Идентификатор просматриваемого каталога
 * @global type $forum_lang
 * @return type
 */
function IndexForumMain($cat_id = null, &$topics_data = null)
{
    global $forum_lang;
    $forums_tree = ForumTree::Instance();
    if (isset($cat_id)) {
        $parent = $forums_tree->IdCats[$cat_id]['parent_id'];
        // Чтобы сделать просмотр категории нужно её выводить как подкатегорию родительской категории
        $cat = $parent == 0;
        // Просмотр категории или главной страницы форума
        $main = false;
        // Не главная страница (просмотр категории или форума)
    } else {
        $cat = true;
        // Однозначно просматриваем категрию или главную страницу форума (выводим блоки онлайн и статистики)
        $cat_id = 0;
        $parent = 0;
        // Корневой раздел в качестве родительской категории
        $main = true;
        // Главная страница
    }
    // Нет категорий, выводим сообщение
    if (!isset($forums_tree->Cats[$parent]) && $cat) {
        System::site()->AddTextBox($forum_lang['forum'], $forum_lang['no_category']);
        return;
    }
    if ($cat) {
        // Выводим категорию или главная страница форума (без топиков)
        // Устанавливаем заголовок страницы
        if (!$main) {
            System::site()->SetTitle(SafeDB($forums_tree->IdCats[$cat_id]['title'], 255, str) . ' - ' . $forum_lang['forum']);
        }
        // Объекты статистини и онлайн
        $statistics = ForumStatistics::Instance();
        $online = ForumOnline::Instance($cat_id, '0', true);
        // Инициализируем статистику
        $statistics->Initialize($forum_lang['statistics']);
        // Загружаем информацию по топикам в $topics_data и считаем статистику (кэшировать статистику)
        $topics_data = ForumCacheGetTopics();
        // Запрашиваем данные тем (агрегированы по форумам)
        $resolve_cats = array_keys($topics_data);
        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($cat_id);
        $statistics->topics_count = $counters['files'];
        $statistics->reply_count = $counters['cats'];
        // Выводим хлебные крошки
        $forums_tree->BreadCrumbsF($cat_id);
        System::site()->BreadCrumbsLastUrl = true;
        // Ссылки, Отметить все как прочитанные и показать все не прочитанные темы.
        System::site()->AddBlock('is_forum_member', AccessIsResolved(2), false, 'mark');
        $vars_is_forum_member = array();
        $vars_is_forum_member['url'] = '<a href="' . Ufu('index.php?name=forum&op=markread', 'forum/markread/') . '">' . $forum_lang['mark_all_read'] . '</a>';
        $vars_is_forum_member['viewnoreadurl'] = '<a href="' . Ufu('index.php?name=forum&op=viewnoread', 'forum/viewnoread/') . '">' . $forum_lang['viewnoread'] . '</a>';
        System::site()->Blocks['is_forum_member']['vars'] = $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/lasttopics/') . '">' . $forum_lang['lasttopics'] . '</a>';
        System::site()->Blocks['old']['vars'] = $vars_old;
    }
    // Загружаем данные о прочтении тем
    $read_data = Forum_Marker_GetReadData();
    $auth = System::user()->Auth;
    // Блоки форума
    System::site()->AddBlock('forums', true, true, 'forum');
    System::site()->AddBlock('is_no_sub_forum', $cat, false);
    // Блок со статистикой и онлайн (отключается в категории)
    $visable_cats = false;
    // Выведена хотябы одна категория с форумом - если нет то показываем ошибку
    foreach ($forums_tree->Cats[$parent] as $category) {
        // Категории
        if (!$main && ($category['id'] != $cat_id || !isset($forums_tree->Cats[$category['id']]))) {
            // Если просматриваем только одну категорию
            continue;
        }
        // Рекурсивно определяем настройки
        $forum_config = $forums_tree->GetForumConfigRecursive($category['id']);
        // Нет доступа или форум не виден или отключён
        if (!$forum_config['access']) {
            continue;
        }
        $visable_cats = true;
        $category = IndexForumDataFilter($category, $forum_config);
        // Выводим категорию
        IndexForumCatOpen($category);
        IndexForumRender($category);
        // Выводим форумы
        foreach ($forums_tree->Cats[$category['id']] as $forum) {
            $forum_id = $forum['id'];
            $forum_config = $forums_tree->GetForumConfigRecursive($forum_id);
            // Нет доступа или форум не виден или отключён
            if (!$forum_config['access']) {
                continue;
            }
            $forum = IndexForumDataFilter($forum, $forum_config);
            // Обрабатываем подфорумы
            $subforums = array();
            if (isset($forums_tree->Cats[$forum_id])) {
                foreach ($forums_tree->Cats[$forum_id] as $sforum) {
                    // Подфорумы, нужно добавить только пометку о прочтении и обработать
                    $read = true;
                    // прочитан
                    if ($auth) {
                        $childs_forums = $forums_tree->GetAllChildId($sforum['id']);
                        foreach ($childs_forums as $child_forum_id) {
                            if (!isset($topics_data[$child_forum_id])) {
                                continue;
                            }
                            foreach ($topics_data[$child_forum_id] as $topic) {
                                if (!isset($read_data[$topic['id']]) || $topic['last_post'] > $read_data[$topic['id']]['date']) {
                                    $read = false;
                                    // не прочитан
                                    break;
                                }
                            }
                            if (!$read) {
                                break;
                            }
                        }
                    }
                    $sforum = IndexForumDataFilter($sforum);
                    $sforum['read'] = $read;
                    $subforums[] = $sforum;
                }
            }
            // Определяем статус "прочинано" для форума
            $read = true;
            // прочитан
            if ($auth) {
                $childs_forums = $forums_tree->GetAllChildId($forum_id);
                foreach ($childs_forums as $child_forum_id) {
                    if (!isset($topics_data[$child_forum_id])) {
                        continue;
                    }
                    foreach ($topics_data[$child_forum_id] as $topic) {
                        if (!isset($read_data[$topic['id']]) || $topic['last_post'] > $read_data[$topic['id']]['date']) {
                            $read = false;
                            // не прочитан
                            break;
                        }
                    }
                    if (!$read) {
                        break;
                    }
                }
            }
            // Вывод форума в шаблон
            IndexForumRender($forum, false, $read, $subforums);
        }
        // Закрываем категорию
        IndexForumCatClose($category);
    }
    if ($visable_cats) {
        // Шаблон форума (полезно подключать шаблоны вконце, там может быть PHP код)
        System::site()->AddTemplatedBox('', 'module/forums.html');
    }
    if ($cat) {
        // Не при просмотре форума (субфорумы + топики)
        if (!$visable_cats) {
            System::site()->AddTextBox($forum_lang['forum'], $forum_lang['no_category']);
            return;
        }
        // Выводим блок онлайн
        $online->Render($cat_id, '0', $cat_id == 0 ? $forum_lang['all_online'] : $forum_lang['current_category']);
        // Выводим статистику
        $statistics->Render();
        // Быстрый переход
        if (!$cat) {
            ForumQuickTransitionBox($cat_id, $forum_lang['quick_transition']);
        }
    }
}
    exit;
}
System::site()->SetTitle('Страницы');
// Удаляем хлебную крошку с именем модуля
unset(System::site()->BreadCrumbs[count(System::site()->BreadCrumbs) - 1]);
if (isset($_GET['file']) && $_GET['file'] != '') {
    $link = SafeEnv(Utf8ToCp1251(rawurldecode($_GET['file'])), 255, str);
} else {
    $link = System::config('pages/default_page');
}
System::database()->Select('pages', "`link`='{$link}' and `enabled`='1' and `type`='page'");
if (System::database()->NumRows() > 0) {
    $page = System::database()->FetchRow();
    $hits = SafeEnv($page['hits'], 11, int) + 1;
    System::database()->Update('pages', "`hits`='{$hits}'", "`link`='{$link}'");
    if (AccessIsResolved($page['view'])) {
        System::site()->SetTitle(SafeDB($page['title'], 255, str));
        System::site()->Seo(SafeDB($page['seo_title'], 255, str), SafeDB($page['seo_keywords'], 255, str), SafeDB($page['seo_description'], 255, str));
        System::site()->AddTemplatedBox('', 'module/page.html');
        System::site()->AddBlock('page');
        $vars = array();
        ErrorsOff();
        $vars['show_title'] = $page['info_showmode'][0] == '1';
        $vars['show_copy'] = $page['info_showmode'][1] == '1';
        $vars['show_public'] = $page['info_showmode'][2] == '1';
        $vars['show_modified'] = $page['info_showmode'][3] == '1';
        $vars['show_hits'] = $page['info_showmode'][4] == '1';
        $vars['show_info'] = $vars['show_copy'] || $vars['show_public'] || $vars['show_modified'] || $vars['show_hits'];
        ErrorsOn();
        $vars['title'] = SafeDB($page['title'], 255, str);
        if ($page['auto_br'] == '1') {
function IndexForumShowTopic($one_post = false)
{
    global $forum_lang;
    $forums_tree = ForumTree::Instance();
    // Вспомогательные переменные
    $user_auth = System::user()->Auth;
    $user_id = System::user()->Get('u_id');
    $user_admin = System::user()->isAdmin();
    $time = time();
    $max_word_length = System::config('forum/max_word_length');
    if (isset($_GET['topic'])) {
        $topic_id = SafeEnv($_GET['topic'], 11, int);
    } else {
        System::site()->AddTextBox($forum_lang['error'], $forum_lang['error_no_topic']);
        return;
    }
    // Берём тему и проверяем на доступ
    System::database()->Select('forum_topics', "`id`='" . $topic_id . "'");
    if (System::database()->NumRows() == 0) {
        System::site()->AddTextBox($forum_lang['error'], $forum_lang['error_no_topic']);
        return;
    }
    $topic = System::database()->FetchRow();
    if (!$user_admin && $topic['starter_id'] == $user_id && $topic['delete'] == '1') {
        // Тема удалена в корзину (только админы видят корзину и автор темы)
        System::site()->AddTextBox($forum_lang['topic_basket_current_post'], '<p align="center">' . $forum_lang['topic_basket_post'] . '.<br><input type="button" value="' . $forum_lang['back'] . '"onclick="history.back();"></p>');
        return;
    }
    // Проверяем доступ к форуму
    $forum_id = SafeEnv($topic['forum_id'], 11, int);
    $forum_config = $forums_tree->GetForumConfigRecursive($forum_id);
    // Параметры доступа на форум
    if (!$forum_config['access']) {
        System::site()->AddTextBox($forum_lang['error'], $forum_config['access_reason']);
        // Нет доступа в этот форум
        return;
    }
    // $forum_config['add_post'] - право добавлять сообщения
    // $forum_config['add_post_reason'] - причина запрета добавления сообщений
    // $forum_config['no_link_guest'] - скрывать ссылки от гостей
    // $forum_config['new_message_email'] - разрешить подписку на новые сообщения
    // Определяем следующую и предыдущую темы
    $topics_data = ForumCacheGetTopics();
    $topics_data = $topics_data[$forum_id];
    $prev_topic = null;
    $next_topic = null;
    $find = false;
    foreach ($topics_data as $topic_row) {
        if ($topic_row['id'] == $topic_id) {
            $find = true;
            continue;
        }
        if ($find) {
            $next_topic = $topic_row;
            break;
        }
        $prev_topic = $topic_row;
    }
    // Параметры постраничной навигации
    if (isset($_GET['page'])) {
        $page = SafeEnv($_GET['page'], 11, int);
    } else {
        $page = 1;
    }
    if (isset($_GET['view']) && $_GET['view'] == 'lastpost') {
        $lastpost = true;
    } else {
        $lastpost = false;
    }
    $posts_on_page = System::config('forum/posts_on_page');
    // Обновляем метку о прочтении темы, если пользователь авторизован
    if ($user_auth) {
        System::database()->Delete('forum_topics_read', "`tid`='{$topic_id}' and `mid`='{$user_id}'");
        System::database()->Insert('forum_topics_read', "'{$user_id}','{$topic_id}','{$time}'");
    }
    // Объект онлайн
    $online = ForumOnline::Instance($forum_id, $topic_id);
    // Устанавливаем заголовок страницы
    $topic_title = SafeDB($topic['title'], 255, str);
    System::site()->SetTitle($topic_title . ($page > 1 ? ' - Страница ' . $page : ''));
    // Хлебные крошки
    $forums_tree->BreadCrumbsF($forum_id);
    System::site()->BreadCrumbAdd(SafeDB($topic['title'], 255, str));
    // Добавляем корзину (если тема удалена в корзину)
    if ($topic['delete'] == '1') {
        $basket_topics = ForumBasketGetData('forum_basket_topics');
        if (isset($basket_topics[$topic['id']])) {
            System::site()->AddTextBox($forum_lang['topic_basket_red'], ForumBasketRender($topic['id'], $topic['title'], $basket_topics, true));
        }
    }
    // Увеличиваем счётчик просмотров
    System::database()->Update('forum_topics', "`hits`='" . (SafeDB($topic['hits'], 11, int) + 1) . "'", "`id`='" . $topic_id . "'");
    // Инициализируем постраничную навигацию
    $navigation = new Navigation($page);
    $navigation->FrendlyUrl = System::config('general/ufu');
    // Загружаем сообщения из базы данных
    $basket_where = '';
    // Администратор (подготавливаем запрос выборки т.к. нужно знать сколько всего сообщений для постр. навигации)
    if ($user_auth) {
        if (!$user_admin) {
            $basket_where = " and (`delete`='0' or `user_id`='{$user_id}')";
            // Пользователь
        }
    } else {
        $basket_where = " and `delete`='0'";
        // Гость
    }
    $posts = System::database()->Select('forum_posts', ($one_post !== false ? "`id`='{$one_post}'" : "`object`='{$topic_id}'") . $basket_where);
    SortArray($posts, 'public', false);
    //Сортируем по дате
    // Вывод постраничной навигации
    if (count($posts) > $posts_on_page) {
        if ($lastpost) {
            $page = ceil(count($posts) / $posts_on_page);
        }
        $navigation->GenNavigationMenu($posts, $posts_on_page, Ufu('index.php?name=forum&op=showtopic&topic=' . $topic_id, 'forum/topic' . $topic_id . '-{page}.html', true), $page);
    } else {
        $navigation->DisableNavigation();
    }
    // Загружаем корзину для сообщений
    $basket = ForumBasketGetData('forum_basket_post');
    // Блок с информацией о теме
    System::site()->AddBlock('topic', true, false);
    System::site()->SetVars('topic', ForumTopicFilterData($topic));
    // Блок шаблонизатора для вывода сообщений
    System::site()->AddBlock('forum_posts', true, true, 'post');
    $is_forum_member = AccessIsResolved(2);
    // Для определения первого и последнего сообщения
    $i = 1;
    // Выводим сообщения в шаблонизатор
    foreach ($posts as $post) {
        $post_user_id = SafeDB($post['user_id'], 11, int);
        if ($post_user_id == 0) {
            continue;
        }
        $vars = array();
        // Обрабатываем текст сообщения
        if ($post['delete'] == '1') {
            // Сообщение удалено в корзину
            $vars['text'] = ForumBasketRender($post['id'], $post['message'], $basket);
        } else {
            $vars['text'] = HtmlChars($post['message']);
            if ($forum_config['no_link_guest']) {
                // Скрываем ссылки от гостей
                $replace = '<p class="notice">' . $forum_lang['hide_links_for_guests'] . '</p>';
                $vars['text'] = preg_replace('/\\<a[^\\>]*?(http|https|ftp|www)(.*?)\\<\\/a\\>/is', $replace, $vars['text']);
                $vars['text'] = preg_replace('/(http:\\/\\/|https:\\/\\/|ftp:\\/\\/|www\\.)?([a-zA-Z0-9]+)\\.(ru|su|com|org|net|info|name|ws|cc|tv|tel|kz|biz|mobi|asia|me|tw|ua)+([а-яА-Яa-zA-Z0-9\'~;,@#%&_\\!\\$\\^\\*\\(\\)\\-\\=\\+\\?\\.\\:\\/\\\\]*)?/is', $replace, $vars['text']);
            }
            SmiliesReplace($vars['text']);
            $vars['text'] = nl2br($vars['text']);
            $vars['text'] = BbCodePrepare($vars['text']);
            if ($max_word_length > 0) {
                $vars['text'] = word_wrapped_string($vars['text'], $max_word_length);
            }
        }
        // Обрабатываем данные сообщения
        // Пользователь
        $user_info = GetUserInfo($post_user_id);
        $vars['usertopics'] = '<a href="' . Ufu('index.php?name=forum&op=usertopics&user='******'forum/usertopics/{user}/') . '">' . $forum_lang['allusertopics'] . '</a>';
        if ($user_info['rank_name'] != '') {
            $vars['author'] = '<a href="' . Ufu('index.php?name=user&op=userinfo&user='******'user/{user}/info/') . '">' . $user_info['name'] . '</a>';
            $vars['author_name'] = $user_info['name'];
        } else {
            $vars['author'] = $post['name'];
            $vars['author_name'] = $post['name'];
        }
        if ($user_info['hideemail'] == '0') {
            $vars['email'] = AntispamEmail($user_info['email']);
        } else {
            $vars['email'] = '&nbsp;';
        }
        if ($user_info['url'] != '') {
            $vars['homepage'] = '<a href="http://' . $user_info['url'] . '" target="_blank">' . $user_info['url'] . '</a>';
        } else {
            $vars['homepage'] = '&nbsp;';
        }
        $vars['icq'] = $user_info['icq'];
        if ($user_info['online']) {
            $vars['status'] = $forum_lang['user_online'];
        } else {
            $vars['status'] = '';
        }
        $vars['rank_image'] = $user_info['rank_image'] != '' ? $user_info['rank_image'] : '';
        $vars['rank_name'] = $user_info['rank_name'] != '' ? $user_info['rank_name'] : '';
        $vars['avatar'] = $user_info['avatar_file'] != '' ? $user_info['avatar_file'] : GetPersonalAvatar(0);
        $vars['regdate'] = TimeRender($user_info['regdate'], false, true);
        if (isset($user_info['data']['forum_counters'])) {
            $vars['user_posts_count'] = $user_info['data']['forum_counters']['posts'];
            $vars['user_topics_count'] = $user_info['data']['forum_counters']['topics'];
        } else {
            $vars['user_posts_count'] = '0';
            $vars['user_topics_count'] = '0';
        }
        // Сообщение
        $vars['public'] = $forum_lang['added'] . TimeRender($post['public']);
        $vars['public_date'] = TimeRender($post['public']);
        $vars['ip'] = SafeDB($post['user_ip'], 19, str);
        $vars['topic_id'] = $topic_id;
        $vars['id'] = SafeDB($post['id'], 11, int);
        $vars['nodelete'] = SafeDB($post['delete'], 1, int) == 1 ? false : true;
        $vars['is_admin_and_nodelete'] = $vars['nodelete'] && $user_admin;
        $vars['page'] = $page;
        // is_current_user Пользователь является владельцем сообщения (кнопки редактировать и удалить)
        if ($post['delete'] == '0') {
            $vars['is_current_user'] = $user_id == $post['user_id'] && $topic['close_topics'] == '0' || $user_admin;
        } else {
            $vars['is_current_user'] = false;
        }
        if ($one_post === false) {
            $vars['num'] = $page > 1 ? $page * $posts_on_page - $posts_on_page + $i : $i;
            $vars['url'] = "javascript:link_post('" . GetSiteUrl() . Ufu("index.php?name=forum&op=post&topic=" . $topic_id . "&post=" . $post['id'], 'forum/t{topic}/post{post}.html') . "')";
        } else {
            $vars['num'] = '';
            $vars['url'] = 'javascript:history.go(-1)';
        }
        $vars['is_forum_member'] = $is_forum_member;
        System::site()->AddSubBlock('forum_posts', true, $vars, array(), 'module/forum_post.html');
        $i++;
    }
    // Форма добавления сообщений
    System::site()->AddBlock('post_form', $forum_config['add_post'], false);
    ForumRenderPostForm(false, $forum_id, $topic_id, 0, '', '', $is_forum_member);
    // Подписка на тему
    System::site()->AddBlock('subscription', $forum_config['new_message_email'], false, 'subs');
    $vars_subs = array();
    $vars_subs['topic'] = $topic_id;
    $vars_subs['sub_status'] = Forum_Subscription_Status($topic_id);
    $vars_subs['status'] = $vars_subs['sub_status'] ? 'Отписаться от этой темы' : 'Подписаться на эту тему';
    System::site()->SetVars('subscription', $vars_subs);
    System::site()->AddBlock('is_forum_member', $is_forum_member, false, 'marker');
    System::site()->SetVars('is_forum_member', array('id' => $topic_id));
    // Подключаем шаблон
    System::site()->AddTemplatedBox('', 'module/forum_showtopic.html');
    // Выводим блок онлайн
    $online->Render($forum_id, $topic_id, $forum_lang['current_online'], 'forum_online');
    // Предыдущая и следующая тема
    System::site()->AddBlock('forum_prev_topic', isset($prev_topic), false, 'topic');
    if (isset($prev_topic)) {
        System::site()->SetVars('forum_prev_topic', array('url' => Ufu('index.php?name=forum&op=showtopic&topic=' . SafeDB($prev_topic['id'], 11, int), 'forum/topic{topic}.html'), 'title' => SafeDB($prev_topic['title'], 255, str), 'lang_prev_topic' => $forum_lang['prev_topic']));
    }
    System::site()->AddBlock('forum_next_topic', isset($next_topic), false, 'topic');
    if (isset($next_topic)) {
        System::site()->SetVars('forum_next_topic', array('url' => Ufu('index.php?name=forum&op=showtopic&topic=' . SafeDB($next_topic['id'], 11, int), 'forum/topic{topic}.html'), 'title' => SafeDB($next_topic['title'], 255, str), 'lang_next_topic' => $forum_lang['next_topic']));
    }
    // Быстрый переход по форумам
    ForumQuickTransitionBox($forum_id, $forum_lang['quick_transition']);
}
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']);
}
    // Позже это будет вынесено в настройки сайта
    System::site()->SetVar('template', 'text', 'Технические работы.');
    System::site()->TEcho();
    exit;
}
// Вспомогательные константы
define('MOD_DIR', System::config('mod_dir') . $ModuleName . '/');
define('MOD_FILE', MOD_DIR . 'index.php');
define('MOD_INIT', MOD_DIR . 'init.php');
define('MOD_ICON', is_file(MOD_DIR . 'icon.png') ? MOD_DIR . 'icon.png' : 'images/application.png');
$module = System::database()->SelectOne('modules', "`enabled`='1' and `folder`='" . SafeEnv($ModuleName, 255, str) . "'");
if ($module === false) {
    Error404();
}
// Проверка на доступ
if (!AccessIsResolved($module['view'], System::user()->AccessLevel()) || $module['system'] == '1' && !System::user()->isSuperUser()) {
    Header('HTTP/1.1 403 Forbidden');
    System::site()->InitPage();
    System::site()->AddTextBox('Ошибка', '<p align="center">Доступ запрещен.</p>');
    System::site()->TEcho();
    exit;
}
define('MOD_NAME', SafeDB($module['folder'], 255, str));
define('MOD_TITLE', SafeDB($module['name'], 255, str));
define('MOD_THEME', RealPath2(SafeDB($module['theme'], 255, str)));
// Инициализация модуля
$valid_init = file_exists(MOD_INIT);
if ($valid_init) {
    include MOD_INIT;
    if (function_exists('mod_initialization')) {
        mod_initialization();
function AddDetailDownload(&$down)
{
    $id = SafeDB($down['id'], 11, int);
    $cat_id = SafeDB($down['category'], 11, int);
    $func = IndexDownloadsFunc($id);
    $vars = array();
    $vars['category_url'] = Ufu("index.php?name=downloads&cat={$cat_id}", 'downloads/{cat}/');
    $vars['category_title'] = IndexDownloadsGetTree()->IdCats[$down['category']]['title'];
    $vars['category'] = '<a href="' . $vars['category_url'] . '">' . $vars['category_title'] . '</a>';
    $vars['file_link'] = "index.php?name=downloads&op=download&file={$id}";
    // Если сделать ЧПУ ссылку, то появляется проблема с относительным адресом файла
    if (AccessIsResolved($down['view'])) {
        $vars['access'] = true;
        $url = '<a href="' . $vars['file_link'] . '" target="_blank">Скачать файл</a>';
    } else {
        $vars['access'] = false;
        $url = 'Файл только для зарегистрированных пользователей.';
    }
    $vars['not_access'] = !$vars['access'];
    $vars['url'] = $url;
    $vars['file_title'] = SafeDB($down['title'], 255, str) . (System::user()->isAdmin() ? $func : '');
    $vars['description'] = SafeDB($down['description'], 0, str, false, false);
    $vars['author'] = SafeDB($down['author'], 200, str);
    $vars['homepage'] = SafeDB($down['author_site'], 250, str);
    $vars['homepage_url'] = UrlRender(SafeDB($down['author_site'], 250, str));
    $vars['mail'] = SafeDB($down['author_email'], 50, str);
    $vars['date'] = TimeRender($down['public']);
    $vars['hits'] = SafeDB($down['hits'], 11, int);
    $vars['version'] = SafeDB($down['file_version'], 250, str);
    $vars['size'] = FormatFileSize(SafeDB($down['size'], 11, real), SafeDB($down['size_type'], 1, str));
    $vars['filetype'] = IndexDownloadsGetFileType(SafeDB($down['url'], 250, str));
    $vars['addvote_url'] = "index.php?name=downloads&op=addvote&file={$id}";
    System::site()->DataAdd($vdata, '0', 'Ваша оценка');
    System::site()->DataAdd($vdata, '1', 'Очень плохо');
    System::site()->DataAdd($vdata, '2', 'Плохо');
    System::site()->DataAdd($vdata, '3', 'Средне');
    System::site()->DataAdd($vdata, '4', 'Хорошо');
    System::site()->DataAdd($vdata, '5', 'Отлично');
    $vars['votes'] = System::site()->Select('vote', $vdata);
    $vars['addvotesubm'] = System::site()->Submit('Оценить файл');
    $vars['allow_votes'] = SafeDB($down['allow_votes'], 1, bool);
    if ($down['image'] != '') {
        $vars['image'] = RealPath2(System::config('downloads/images_dir') . SafeDB($down['image'], 255, str));
        $vars['thumb_image'] = RealPath2(System::config('downloads/images_dir') . 'thumbs/' . SafeDB($down['image'], 255, str));
    } else {
        $vars['image'] = false;
    }
    //Выводим rating
    $vars['rating_num_votes'] = SafeDB($down['votes_amount'], 11, int);
    $vars['rating_image'] = GetRatingImage(SafeDB($down['votes_amount'], 11, int), SafeDB($down['votes'], 11, int));
    $rating = $vars['rating_image'];
    if ($rating == '' && SafeDB($down['allow_votes'], 1, bool)) {
        // allow_rating
        $rating = 'Нет оценки';
    } elseif (SafeDB($down['allow_votes'], 1, bool)) {
        $rating = '<img src="' . $rating . '" /> (Оценок: ' . SafeDB($down['votes_amount'], 11, int) . ')';
    } else {
        $rating = ' - ';
    }
    $vars['rating'] = $rating;
    //
    if (!SafeDB($down['allow_comments'], 1, bool)) {
        // allow coments
        $vars['comments'] = ' - ';
    } else {
        $vars['comments'] = SafeDB($down['comments_counter'], 11, int);
    }
    System::site()->AddBlock('download', true, false, 'dl');
    System::site()->Blocks['download']['vars'] = $vars;
}