function AdminUserMain()
{
    global $user, $editing;
    $searchm = false;
    if (isset($_GET['page'])) {
        $page = SafeEnv($_GET['page'], 10, int);
    } else {
        $page = 1;
    }
    if (isset($_GET['show'])) {
        $show = $_GET['show'];
    } else {
        $show = '';
    }
    //Пользователи online
    $sonline = false;
    $onlwhere = '';
    $where = '`type`=\'2\'';
    if ($show == 'online') {
        $donline = $user->Online();
        $donline = $donline['members'];
        $onlwhere = '';
        foreach ($donline as $memb) {
            $onlwhere .= "or `id`='" . SafeDB($memb['u_id'], 11, int) . "'";
        }
        $onlwhere = substr($onlwhere, 3);
        $sonline = true;
        if (count($donline) > 0) {
            $where = "`type`='2' and ({$onlwhere})";
            $users = AdminUserGetUsers($where);
        } else {
            $users = array();
        }
        $searchm = true;
    } else {
        $users = AdminUserGetUsers();
    }
    //Поиск
    $criterion = '';
    $sstr = '';
    if (isset($_GET['criterion']) && isset($_GET['stext']) && $_GET['stext'] != '') {
        $searchm = true;
        $criterion = $_GET['criterion'];
        $sstr = SafeEnv($_GET['stext'], 255, str);
        switch ($criterion) {
            case 'nikname':
                AdminUserQueryStristrFilter($users, $sstr, 'name');
                break;
            case 'email':
                AdminUserQueryStristrFilter($users, $sstr, 'email');
                break;
            case 'rname':
                AdminUserQueryStristrFilter($users, $sstr, 'truename');
                break;
            case 'age':
                AdminUserQueryStristrFilter($users, $sstr, 'age');
                break;
            case 'city':
                AdminUserQueryStristrFilter($users, $sstr, 'city');
                break;
            case 'site':
                AdminUserQueryStristrFilter($users, $sstr, 'url');
                break;
            case 'icq':
                AdminUserQueryStristrFilter($users, $sstr, 'icq');
                break;
            case 'gmt':
                AdminUserQueryStristrFilter($users, $sstr, 'timezone');
                break;
            case 'active':
                AdminUserQueryStristrFilter($users, $sstr, 'active');
                break;
            case 'points':
                AdminUserQueryStristrFilter2($users, $sstr, 'points');
                break;
            case 'ip':
                AdminUserQueryStristrFilter($users, $sstr, 'lastip');
                break;
        }
        Audit('Пользователи: Поиск пользователей, критерий: "' . $criterion . '", запрос: "' . $sstr . '"');
    }
    $sstr = strval($sstr);
    $showd = array();
    System::site()->DataAdd($showd, 'all', 'Все пользователи', $show == '');
    System::site()->DataAdd($showd, 'online', 'Пользователи OnLine', $show == 'online');
    $searchd = array();
    System::site()->DataAdd($searchd, 'nikname', 'Ник', $criterion == 'nikname');
    System::site()->DataAdd($searchd, 'email', 'E-mail', $criterion == 'email');
    System::site()->DataAdd($searchd, 'rname', 'Настоящее имя', $criterion == 'rname');
    System::site()->DataAdd($searchd, 'age', 'Возраст', $criterion == 'age');
    System::site()->DataAdd($searchd, 'city', 'Город', $criterion == 'city');
    System::site()->DataAdd($searchd, 'site', 'Сайт', $criterion == 'site');
    System::site()->DataAdd($searchd, 'icq', 'ICQ', $criterion == 'icq');
    System::site()->DataAdd($searchd, 'gmt', 'Часовой пояс', $criterion == 'gmt');
    System::site()->DataAdd($searchd, 'active', 'Активен', $criterion == 'active');
    System::site()->DataAdd($searchd, 'points', 'Пунктов более', $criterion == 'points');
    System::site()->DataAdd($searchd, 'ip', 'IP', $criterion == 'ip');
    System::admin()->AddJS('
	SearchUsers = function(){
		var cri = "&criterion="+$("#criterion").val();
		var stext = "&stext="+$("#stext").val();
		var online = "&show="+$("#online").val();
		Admin.LoadPage("' . ADMIN_FILE . '?exe=user"+cri+stext+online, undefined, "Идёт поиск");
	}
	');
    TAddSubTitle('Главная');
    AddCenterBox('Зарегистрированные пользователи (' . count($users) . ')');
    $searchtool = '<style>.ustd td{ border: none; padding: 0; }</style>';
    $searchtool .= '<table cellspacing="0" cellpadding="0" border="0" class="cfgtable"><tr><td>' . "\n";
    $searchtool .= '<table cellspacing="0" cellpadding="0" border="0" width="100%" class="ustd">
	<tr>
	<td>Поиск: </td>
	<td>' . System::site()->Select('criterion', $searchd, false, 'id="criterion"') . '&nbsp;' . System::site()->Edit('stext', $sstr, false, 'id="stext"') . '&nbsp;' . System::site()->Select('show', $showd, false, 'id="online"') . '</td>
	<td>' . System::admin()->SpeedConfirmJs('Поиск', 'SearchUsers();', 'images/search.png', '', true) . '</td>
	</tr>
	</table>' . "\n";
    $searchtool .= '</td></tr></table>' . "\n";
    AddText($searchtool);
    SortArray($users, 'regdate', true);
    // Сортируем по дате регистрации
    if (count($users) > System::config('user/users_on_page')) {
        $navigator = new Navigation($page);
        $navigator->GenNavigationMenu($users, System::config('user/users_on_page'), ADMIN_FILE . '?exe=user' . ($searchm ? '&criterion=' . $criterion . '&stext=' . $sstr . '&show=' . $show : ''));
        $nav = true;
    } else {
        $nav = false;
        AddText('<br />');
    }
    $text = '';
    $text .= '<table cellspacing="0" cellpadding="0" class="cfgtable">';
    $text .= '<tr><th>Ник</th><th>E-mail</th><th>Дата региcтрации</th><th>Посл. посещение</th><th>Посещений</th><th>Пунктов</th><th>Активация</th><th>IP</th><th>Функции</th></tr>';
    foreach ($users as $row) {
        $uid = SafeDB($row['id'], 11, int);
        if ($row['active'] == '1') {
            $active = 'Да';
        } elseif ($row['active'] == '0' && $row['activate'] == '') {
            $active = 'Нет';
        } elseif ($row['active'] == '0' && $row['activate'] != '') {
            $active = 'Ожидается';
        }
        $funcs = '';
        if ($editing) {
            $funcs .= System::admin()->SpeedButton('Редактировать', ADMIN_FILE . '?exe=user&a=edituser&id=' . $uid, 'images/admin/edit.png');
            $funcs .= System::admin()->SpeedButton('Удалить', ADMIN_FILE . '?exe=user&a=deluser&id=' . $uid, 'images/admin/delete.png');
            // Всё верно
        }
        $text .= '<tr>
		<td>' . ($editing ? '<b>' . System::admin()->Link(SafeDB($row['name'], 50, str), ADMIN_FILE . '?exe=user&a=edituser&id=' . $uid) . '</b>' : SafeDB($row['name'], 50, str)) . '</td>
		<td>' . PrintEmail($row['email']) . '</td>
		<td>' . TimeRender($row['regdate']) . '</td>
		<td>' . TimeRender($row['lastvisit']) . '</td>
		<td>' . SafeDB($row['visits'], 11, int) . '</td>
		<td>' . SafeDB($row['points'], 11, int) . '</td>
		<td>' . $active . '</td>
		<td>' . SafeDB($row['lastip'], 20, str) . '</td>
		<td>' . $funcs . '</td>
		</tr>';
    }
    $text .= '</table>';
    AddText($text);
    if ($nav) {
        AddNavigation();
    }
}
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']);
}
function AdminCommentsMain()
{
    System::admin()->AddCenterBox('Глобальная модерация комментариев');
    if (isset($_GET['page'])) {
        $page = SafeEnv($_GET['page'], 10, int);
    } else {
        $page = 1;
    }
    System::admin()->AddJS('
		UpdateSelectComment = function(){
			$(".comment_check").each(function(){
				$("#comment"+$(this).val()).removeClass("commtable_selected");
			});
			$(".comment_check:checked").each(function(){
				$("#comment"+$(this).val()).addClass("commtable_selected");
			});
		};
		SelectAllComments = function(){
			$(".comment_check").each(function(){
				$(this).attr("checked", true);
			});
			UpdateSelectComment();
		};
		DeleteComments = function(){
			var del = "";
			$(".comment_check:checked").each(function(){
				del += "#"+$(this).val();
			});
			Admin.LoadPagePost("' . ADMIN_FILE . '?exe=comments&a=delete&page=' . $page . '", {delcomments: del}, "Удаление...");
		};
	');
    $commentsOnPage = 50;
    // Выбираем комментарии из всех таблиц
    $where = '';
    $posts = array();
    $comments_tables = System::database()->Select('comments');
    foreach ($comments_tables as $table) {
        $temp_posts = System::database()->Select($table['table'], $where);
        AdminConfigMarkPosts($temp_posts, $table);
        $posts = array_merge($posts, $temp_posts);
    }
    // Сортируем комментарии по дате(Новые сверху)
    SortArray($posts, 'post_date', true);
    // Добавляем постраничную навигацию
    if (count($posts) > $commentsOnPage) {
        $navigator = new Navigation($page);
        $navigator->GenNavigationMenu($posts, $commentsOnPage, ADMIN_FILE . '?exe=comments');
        $nav = true;
    } else {
        $nav = false;
        AddText('<br />');
    }
    // Шапка
    if (count($posts) == 0) {
        System::admin()->Highlight('На сайте нет комментариев.');
        return;
    } else {
        $text = '';
    }
    $text .= '<table cellspacing="0" cellpadding="0" width="90%" align="center" class="commtable_header">
	<tr>
	<th style="width: 160px;">Пользователь</th>
	<th style="width: 260px;">E-mail</th>
	<th style="width: 260px;">Сайт</th>
	<th style="width: 260px;">Дата и время</th>
	<th style="width: 70px;">IP</th>
	<th>Функции</th>
	</tr></table>';
    // Выводим комментарии
    foreach ($posts as $post) {
        $post_id = SafeDB($post['id'], 11, int);
        $object_id = SafeDB($post['object_id'], 11, int);
        $user_id = SafeDB($post['user_id'], 11, int);
        $user_name = SafeDB($post['user_name'], 255, str);
        $user_homepage = SafeDB($post['user_homepage'], 255, str);
        $user_email = SafeDB($post['user_email'], 255, str);
        $user_ip = SafeDB($post['user_ip'], 19, str);
        $post_date = TimeRender($post['post_date']);
        $post_message = SafeDB($post['post_message'], 0, str, false);
        $post_message = nl2br($post_message);
        $edit = ADMIN_FILE . '?exe=comments&a=edit&id=' . $post_id . '&table=' . $post['_table'] . '&page=' . $page;
        if ($user_id != 0) {
            $userinfo = GetUserInfo($user_id);
            $user_name = $userinfo['name'];
            $user_homepage = $userinfo['url'];
            $user_email = PrintEmail($userinfo['email']);
            if ($userinfo['online']) {
                $online = '<b>Сейчас на сайте.</b>';
            } else {
                $online = '';
            }
            $avatar = '<img src="' . $userinfo['avatar_file'] . '" />';
            $rank_image = '<img src="' . $userinfo['rank_image'] . '" />';
            $rank_name = $userinfo['rank_name'];
            $regdate = 'Зарегистрирован: ' . TimeRender($userinfo['regdate'], false);
            $ruser = true;
        } else {
            $user_email = PrintEmail($user_email);
            $online = '';
            $avatar = '<img src="' . GetPersonalAvatar(0) . '" />';
            $rank_image = '';
            $rank_name = '';
            $regdate = '';
            $ruser = false;
        }
        if ($user_homepage != '') {
            $user_homepage = '<a href="http://' . $user_homepage . '" target="_blank">' . $user_homepage . '</a>';
        } else {
            $user_homepage = '&nbsp;';
        }
        if ($ruser) {
            $user_name = '<a href="' . Ufu("index.php?name=user&op=userinfo&user={$user_id}", 'user/{user}/info/') . '" target="_blank">' . $user_name . '</a>';
        }
        $link_go = ADMIN_FILE . '?exe=comments&a=find&table=' . SafeDB($post['_id'], 11, int) . '&post_id=' . $post_id;
        $func = '';
        if ($post['_url'] != '') {
            $func .= System::admin()->SpeedButton('Найти комментарий', $link_go, 'images/search.png', false, false, 'target="_blank"');
        }
        $func .= SpeedButton('Редактировать', $edit, 'images/admin/edit.png');
        $text .= Indent('
			<table cellspacing="0" cellpadding="0" width="90%" align="center" class="commtable" id="comment' . $post_id . '--' . $post['_table'] . '--' . $object_id . '">
				<tr>
					<th style="width: 160px;"><b>' . $user_name . '</b></th>
					<th style="width: 260px;">' . $user_email . '</th>
					<th style="width: 260px;">' . $user_homepage . '</th>
					<th style="width: 260px;">' . $post_date . '</th>
					<th style="width: 70px;">' . $user_ip . '</th>
					<th>' . $func . '</th>
					<th>' . System::admin()->Check('delcomments[]', $post_id . '--' . $post['_table'] . '--' . $object_id, false, 'class="comment_check" onchange="UpdateSelectComment();"') . '</th>
				</tr>
				<tr>
					<td valign="top" width="140">' . $avatar . '<br>' . $rank_image . '<br>' . $rank_name . '</td>
					<td colspan="6" class="commtable_text">' . $post_message . '</td>
				</tr>
			</table>
		');
    }
    // Подвал
    AddText($text);
    if ($nav) {
        AddNavigation();
    }
    $text = '';
    if (count($posts) > 0) {
        $text .= '<div style="text-align: right;">' . System::admin()->SpeedConfirmJs('Выделить все', 'SelectAllComments();', '', '', true) . '&nbsp;' . System::admin()->SpeedConfirmJs('Удалить выделенные', 'DeleteComments();', 'images/admin/delete.png', 'Удалить выделенные комментарии?', true) . '</div>';
    }
    AddText($text);
}
function IndexDownloadsMain()
{
    if (isset($_GET['cat'])) {
        $cat = SafeEnv($_GET['cat'], 11, int);
    } else {
        $cat = 0;
    }
    if ($cat != 0) {
        System::site()->SetTitle('Файлы в категории ' . SafeDB(IndexDownloadsGetTree()->IdCats[$cat]['title'], 255, str));
    }
    if (isset($_GET['page'])) {
        $page = SafeEnv($_GET['page'], 10, int);
    } else {
        $page = 1;
    }
    if (System::config('downloads/show_last') == '1') {
        IndexDownloadsGetTree()->ShowCats($cat);
        IndexDownloadsGetTree()->BreadCrumbs($cat);
    }
    if ($cat != 0 || System::config('downloads/show_last') == '1') {
        $downs = System::database()->Select('downloads', GetWhereByAccess('view', ($cat != 0 ? "`category`='{$cat}' and " : '') . "`active`='1'"));
        SortArray($downs, 'public', true);
        // Постраничная навигация
        $num = System::config('downloads/filesonpage');
        $navigation = new Navigation($page);
        $nav_link = Ufu('index.php?name=downloads' . ($cat != 0 ? '&cat=' . $cat : ''), 'downloads/' . ($cat != 0 ? '{cat}/' : '') . 'page{page}/', true);
        $navigation->FrendlyUrl = System::config('general/ufu');
        $navigation->GenNavigationMenu($downs, $num, $nav_link);
        if (System::database()->NumRows() > 0) {
            System::site()->AddTemplatedBox('', 'module/download.html');
            System::site()->AddBlock('download', true, true, 'dl');
            foreach ($downs as $down) {
                AddDownload($down);
            }
        } elseif (!isset(IndexDownloadsGetTree()->Cats[$cat]) && count(IndexDownloadsGetTree()->Cats) > 0) {
            System::site()->AddTextBox('', '<p align="center">В этой категории пока нет файлов.</p>');
        }
    }
}
function IndexUserlist()
{
    System::site()->SetTitle('Список пользователей');
    System::site()->BreadCrumbAdd('Список пользователей');
    $page = 0;
    if (isset($_GET['page'])) {
        $page = SafeEnv($_GET['page'], 11, int);
    } else {
        $page = 1;
    }
    $users = System::database()->Select('users', "`active`='1'");
    SortArray($users, 'points', true);
    // regdate
    SortArray($users, 'type', false);
    // type
    $num = System::config('user/users_on_page');
    $navigation = new Navigation($page);
    $navigation->FrendlyUrl = System::site()->Ufu;
    $navigation->GenNavigationMenu($users, $num, Ufu('index.php?name=user&op=userslist', 'user/users/page{page}/', true));
    System::site()->AddTemplatedBox('Список пользователей', 'module/user_list.html');
    System::site()->AddBlock('userlist_th', true, false, 'title');
    System::site()->Blocks['userlist_th']['vars'] = array('name' => 'Имя', 'email' => 'E-mail', 'date' => 'Дата регистрации', 'last_visit' => 'Посл. посещение', 'last' => 'Посл. посещение', 'rank' => 'Ранг/статус');
    System::site()->AddBlock('userlist', true, true, 'user');
    foreach ($users as $usr) {
        $vars = array();
        $rank_stat = GetUserRank($usr['points'], $usr['type'], $usr['access']);
        $rank_stat = $rank_stat[0];
        $vars['avatar'] = GetUserAvatar($usr['id']);
        $vars['avatar_small'] = GetSmallUserAvatar($usr['id'], $vars['avatar']);
        $vars['avatar_smallest'] = GetSmallestUserAvatar($usr['id'], $vars['avatar']);
        $vars['user_id'] = SafeDB($usr['id'], 11, int);
        $vars['url'] = Ufu('index.php?name=user&op=userinfo&user='******'id'], 11, int), 'user/{user}/info/');
        $vars['name'] = SafeDB($usr['name'], 50, str);
        if ($usr['hideemail'] == '1') {
            $vars['email'] = 'Скрывается';
        } else {
            $vars['email'] = SafeDB($usr['email'], 50, str);
        }
        $vars['date'] = TimeRender($usr['regdate'], true);
        $vars['lastdate'] = TimeRender($usr['lastvisit'], true);
        $vars['rank'] = $rank_stat;
        System::site()->AddSubBlock('userlist', true, $vars);
    }
}
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']);
}
 /**
  * Вывод комментариев с постраничной навигацией.
  * @param int           $ObjectId       "object_id" комментария
  * @param string|string $PostsBlockName имя блока в шаблоне, куда выводить комментарии
  * @param string        $NavigationBlockName
  * @param bool          $LastPage       Если истина, то функция покажет последнюю страницу комментариев
  * @param int           $Page           Номер страницы комментариев
  * @param string|string $ExWhere        Свой Where запрос. Используйте, если вам необходим особый способ выбора комментариев.
  */
 public function RenderPosts($ObjectId, $PostsBlockName = 'posts', $NavigationBlockName = 'navigation', $LastPage = false, &$Page = 0, $ExWhere = '')
 {
     if ($this->DisableComments) {
         System::site()->AddBlock($PostsBlockName, false, false, 'post');
         System::site()->AddBlock($NavigationBlockName, true, false);
         return;
     } else {
         System::site()->AddBlock($PostsBlockName, true, true, 'post');
     }
     if ($this->EditPageUrl == '') {
         ErrorHandler(USER_NOTICE, 'Posts::Posts(): Не инициализирован адрес страницы редактирования комментариев Posts::$EditPageUrl.', __FILE__);
     }
     if ($this->DeletePageUrl == '') {
         ErrorHandler(USER_NOTICE, 'Posts::Posts(): Не инициализирован адрес страницы удаления комментариев Posts::$DeletePageUrl.', __FILE__);
     }
     if ($this->NavigationUrl == '') {
         ErrorHandler(USER_NOTICE, 'Posts::Posts(): Не инициализирован адрес текущей страницы для постраничной навигации Posts::$NavigationUrl.', __FILE__);
     }
     // Выбираем сообщения из базы данных
     if ($ObjectId != 0) {
         $where = "`object_id`='" . $ObjectId . "'";
     } elseif ($ExWhere != '') {
         $where = $ExWhere;
     } else {
         $where = '';
         // Вся таблица
     }
     $posts = System::database()->Select($this->PostsTable, $where, null, 'post_date', !$this->DecreaseSort);
     $this->PostsTree = array();
     foreach ($posts as $post) {
         $this->PostsTree[$post['post_parent_id']][] = $post;
     }
     if ($Page == 0) {
         // Страница по умолчанию
         if ($this->DecreaseSort) {
             $LastPage = true;
         } else {
             $Page = 1;
         }
     }
     // Инициализируем навигацию
     $nav = new Navigation($Page, $NavigationBlockName, $this->NavigationParam);
     $nav->FrendlyUrl = System::config('general/ufu');
     $nav->Anchor = $this->NavigationAnchor;
     $nav->DefaultPageLink = $this->NavigationDefaultPageLink;
     if (!isset($this->PostsTree[0])) {
         $nav->DisableNavigation();
     } else {
         if (!$this->EnNavigation) {
             $nav->DisableNavigation();
         } else {
             $last_pn = ceil(count($this->PostsTree[0]) / $this->MessagesOnPage);
             if ($LastPage) {
                 $Page = $last_pn;
             }
             if ($this->DecreaseSort) {
                 $nav->DefaultPage = $last_pn;
             }
             $nav->GenNavigationMenu($this->PostsTree[0], $this->MessagesOnPage, $this->NavigationUrl, $Page);
         }
         $this->RenderPost($ObjectId, $this->PostsTree[0], $PostsBlockName, 0);
     }
 }
function IndexGBMain()
{
    if (isset($_GET['page'])) {
        $page = SafeEnv($_GET['page'], 10, int);
    } else {
        $page = 1;
    }
    $msgs = System::database()->Select('guestbook', "`premoderate`='1'");
    SortArray($msgs, 'date', true);
    $num = System::config('gb/msgonpage');
    $navigation = new Navigation($page);
    $navigation->FrendlyUrl = System::config('general/ufu');
    $navigation->GenNavigationMenu($msgs, $num, Ufu('index.php?name=guestbook', 'guestbook/page{page}/', true));
    System::site()->AddBlock('guestbook', true, true, 'gb');
    if (count($msgs) > 0) {
        foreach ($msgs as $message) {
            IndexGBAddMessage($message);
        }
    } else {
        System::site()->AddTextBox('', '<p align="center">Сообщений пока нет.</p>');
    }
    System::site()->AddTemplatedBox('', 'module/guestbook.html');
    IndexGBAddForm(System::config('gb/formposition') == 'top');
}
function AdminGuestBookPremoderationMain()
{
    System::admin()->AddCenterBox('Премодерация');
    $premoderation = System::user()->CheckAccess2('guestbook', 'premoderation');
    $premoderate = System::database()->Select('guestbook', "`premoderate`='0'");
    if (System::database()->NumRows() == 0) {
        System::admin()->Highlight('В премодерации нет сообщений.');
        return;
    }
    if (isset($_GET['page'])) {
        $page = SafeEnv($_GET['page'], 10, int);
    } else {
        $page = 1;
    }
    SortArray($premoderate, 'date', true);
    $num = System::config('gb/msgonpage');
    if (count($premoderate) > $num) {
        $navigator = new Navigation($page);
        $navigator->GenNavigationMenu($premoderate, $num, ADMIN_FILE . '?exe=guestbook&a=premoderation');
        $nav = true;
    } else {
        $nav = false;
    }
    $text = '';
    $back = SaveRefererUrl();
    foreach ($premoderate as $pre) {
        if ($pre['url'] == '') {
            $url = 'Нет';
        } else {
            $url = '<a href="http://' . SafeDB($pre['url'], 250, str) . '" target="_blank">' . SafeDB($pre['url'], 250, str) . '</a>';
        }
        if ($pre['email'] == '') {
            $name = SafeDB($pre['name'], 50, str);
        } else {
            $name = PrintEmail($pre['email'], $pre['name']);
        }
        $mid = SafeDB($pre['id'], 11, int);
        $del = System::admin()->SpeedConfirm('Удалить сообщение', ADMIN_FILE . '?exe=guestbook&a=delete&id=' . $mid . '&back=' . $back, 'images/admin/delete.png', 'Удалить сообщение?');
        $func2 = '';
        $func2 = System::admin()->Link('Разрешить', ADMIN_FILE . '?exe=guestbook&a=prem_yes&id=' . $mid . '&back=' . $back);
        $text .= '<table cellspacing="0" cellpadding="0" class="commtable" style="width:75%;">';
        $text .= '<tr>
			<th style="text-align: left; width: 180px;">' . $name . '</th>
			<th style="width: 160px;">Сайт: ' . $url . '</th>
			<th style="width: 120px;">ICQ: ' . SafeDB($pre['icq'], 15, str) . '</th>
			<th style="width: 120px;">IP: ' . SafeDB($pre['user_ip'], 20, str) . '</th>
			<th> ' . $del . ' </th>
		</tr>';
        $text .= '<tr><td colspan="5" style="text-align:left;padding:10px;" class="commtable_text">' . SafeDB($pre['message'], 0, str) . '</td></tr>';
        $text .= '<tr><th>Дата: ' . TimeRender($pre['date']) . '</th><th colspan="4" style="text-align:right;">' . $func2 . '</th></tr>';
        $text .= '</table>';
    }
    AddText($text);
    if ($nav) {
        AddNavigation();
    }
    AddText('<div style="text-align: center;">' . System::admin()->SpeedConfirm('Разрешить все', ADMIN_FILE . '?exe=guestbook&a=prem_yes_all&back=' . $back, 'images/admin/accept.png', 'Разрешить все сообщения?', true, true) . '&nbsp;' . System::admin()->SpeedConfirm('Удалить все', ADMIN_FILE . '?exe=guestbook&a=prem_del_all&back=' . $back, 'images/admin/delete.png', 'Удалить все сообщения?', true, true) . '</div>');
}
function AdminForumBasket($table = 'forum_basket_post')
{
    global $config, $site;
    if (isset($_GET['page'])) {
        $page = SafeEnv($_GET['page'], 10, int);
    } else {
        $page = 1;
    }
    if ($table == 'forum_basket_post') {
        $site->Title .= ' > Удаляемые сообщения';
        $caption = 'Удаляемые сообщения';
    } else {
        $site->Title .= ' > Удаляемые Темы';
        $caption = 'Удаляемые Темы';
    }
    $result = System::database()->Select($table);
    if (count($result) > 20) {
        $navigator = new Navigation($page);
        $navigator->GenNavigationMenu($result, 20, ADMIN_FILE . '?exe=forum&a=' . $table);
        $nav = true;
    } else {
        $nav = false;
    }
    $mop = 'showtopic&topic=';
    if ($table == 'forum_basket_post') {
        $table_caption = ' (сообщение)';
        if (count($result) > 0) {
            $mposts = array();
            $where = '';
            foreach ($result as $mpost) {
                $where .= "`id`='" . $mpost['obj_id'] . "' or ";
            }
            $where = substr($where, 0, strlen($where) - 3);
            $result_posts = System::database()->Select('forum_posts', $where);
            if (count($result_posts) > 0) {
                foreach ($result_posts as $mpost) {
                    $mposts[$mpost['id']] = $mpost['object'];
                    $mpostsm[$mpost['id']] = $mpost['message'];
                }
                foreach ($result as $mpost) {
                    $mpost['obj_id2'] = $mposts[$mpost['obj_id']];
                    $mpost['obj_id'] = $mpost['obj_id'];
                    $mpost['date'] = $mpost['date'];
                    $mpost['user'] = $mpost['user'];
                    $mpost['reason'] = $mpost['reason'];
                    $mpost['message'] = $mpostsm[$mpost['obj_id']];
                    $result2[] = $mpost;
                }
                $result = $result2;
            }
        }
    } else {
        $table_caption = ' (название темы)';
        if (count($result) > 0) {
            $where = '';
            foreach ($result as $mpost) {
                $where .= "`id`='" . $mpost['obj_id'] . "' or ";
            }
            $where = substr($where, 0, strlen($where) - 3);
            $result_topics = System::database()->Select('forum_topics', $where);
            if (count($result_topics) > 0) {
                foreach ($result_topics as $mtopic) {
                    $mtopics[$mtopic['id']] = $mtopic['title'];
                }
                foreach ($result as $mtopic) {
                    $mpost['obj_id'] = $mtopic['obj_id'];
                    $mpost['date'] = $mtopic['date'];
                    $mpost['user'] = $mtopic['user'];
                    $mpost['reason'] = $mtopic['reason'];
                    $mpost['message'] = $mtopics[$mtopic['obj_id']];
                    $result2[] = $mpost;
                }
                $result = $result2;
            }
        }
    }
    $text = '<table cellspacing="0" cellpadding="0" class="cfgtable">';
    $text .= '<tr><th>Кто удалил</th><th>Дата удаления</th><th>Дата окончательного удаления</th><th>Комментарий</th><th>Содержимое удаляемого <BR>' . $table_caption . '</th><th>Функции</th></tr>';
    foreach ($result as $basket) {
        $mop = 'showtopic&topic=' . ($table == 'forum_basket_post' ? $basket['obj_id2'] : $basket['obj_id']);
        $restore_link = ADMIN_FILE . '?exe=forum&a=basket_restore&' . $table . '=' . $basket['obj_id'];
        $ainfo = GetUserInfo($basket['user']);
        $text .= '<tr>
		<td>' . $ainfo['name'] . '</td>
		<td>' . TimeRender($basket['date'], false, false) . '</td>
		<td>' . TimeRender($basket['date'] + 86400 * $config['forum']['clear_basket_day'], false, false) . '</td>
		<td>' . $basket['reason'] . '</td>
		<td>' . (isset($basket['message']) ? $basket['message'] : '') . '</td>
		<td><a href="' . $restore_link . '">Восстановить</a>
		&nbsp;<a href="index.php?name=forum&op=' . $mop . '" target="_blank">Просмотр</a></td>
		</tr>';
    }
    $text .= '</table>';
    AddTextBox($caption, $text);
    if ($nav) {
        AddNavigation();
    }
}
function AdminAuditReferers()
{
    System::admin()->AddCenterBox('Переходы с сайтов (Рефералы)');
    $query = System::database()->Select('referers', '');
    SortArray($query, 'count', true);
    $allcount = 0;
    $count = count($query);
    if (isset($_GET['page'])) {
        $page = SafeEnv($_GET['page'], 10, int);
    } else {
        $page = 1;
    }
    $num = 50;
    if ($count > $num) {
        $navigator = new Navigation($page);
        $navigator->GenNavigationMenu($query, $num, ADMIN_FILE . '?exe=audit&a=referers');
        $nav = true;
    } else {
        $nav = false;
    }
    if ($count == 0) {
        System::admin()->Highlight('Рефералов не было обнаружено.');
    } elseif ($count >= 1) {
        $text = '<table cellspacing="0" cellpadding="0" class="cfgtable">';
        $text .= Indent('<tr>
			<th>Реферал</th>
			<th>Переходов</th>
		</tr>');
        foreach ($query as $q) {
            $referer = 'http://' . $q['referer'];
            $title = AdminAuditDecodeUrl($referer);
            $count = SafeDB($q['count'], 11, int);
            $allcount += $count;
            $text .= '<tr>
			<td><a href="' . $referer . '" target="_blank">' . $title . '</a></td>
			<td>' . $count . '</td>
			</tr>';
        }
        $text .= '</table>';
        $text .= 'Всего переходов на этой странице: <b>' . $allcount . '</b>.&nbsp;' . System::admin()->SpeedConfirm('Очистить  лог', ADMIN_FILE . '?exe=audit&a=clear_referers', '', 'Очистить лог рефералов?', true, true);
        AddText($text);
        if ($nav) {
            AddNavigation();
        }
    }
}
function IndexNewsMain()
{
    System::site()->AddBlock('news', true, true);
    if (isset($_GET['page'])) {
        $page = SafeEnv($_GET['page'], 10, int);
    } else {
        $page = 1;
    }
    $topics = IndexNewsGetTopics();
    if (isset($_GET['topic'])) {
        $topic = SafeEnv($_GET['topic'], 11, int);
        $title = SafeDB($topics[$topic]['title'], 255, str);
        System::site()->SetTitle($title);
        System::site()->BreadCrumbAdd($title);
    } else {
        $topic = false;
    }
    $num = SafeDB(System::config('news/newsonpage'), 11, int);
    //Количество новостей на страницу
    $news = System::database()->Select('news', GetWhereByAccess('view', "`enabled`='1'" . ($topic !== false ? " and `topic_id`='{$topic}'" : "")), null, 'date', true);
    // Постраничная навигация
    $navigation = new Navigation($page);
    $nav_link = Ufu('index.php?name=news' . ($topic != 0 ? '&topic=' . $topic : ''), 'news/' . ($topic != 0 ? '{topic}/' : '') . 'page-{page}/', true);
    $navigation->FrendlyUrl = System::config('general/ufu');
    $navigation->GenNavigationMenu($news, $num, $nav_link);
    if (count($news) > 0) {
        System::site()->AddTemplatedBox('', 'module/news.html');
        foreach ($news as $s) {
            IndexNewsAdd($s, SafeDB($topics[$s['topic_id']]['title'], 255, str), false);
        }
    } else {
        if ($topic === false) {
            $NewsContent = '<p align="center">Новостей пока нет</p>';
        } else {
            $NewsContent = '<p align="center">В этой категории пока нет новостей</p>';
        }
        System::site()->AddTextBox('', $NewsContent);
    }
}
function IndexSearchResults()
{
    global $searchstr;
    // Блок поискового запроса, возвращает инф-ю о включенных поисковых плагинах (где искать)
    $mods = IndexSearchMain();
    // Формируем URL страницы для постраничной навигации
    $mods_str = '';
    foreach ($mods as $i => $mod) {
        // Модули поиска
        $mods[$i] = $mod;
        $mods_str .= '&mod[]=' . SafeDB($mods[$i], 255, str);
    }
    if (isset($_GET['searchstr'])) {
        // Поисковый запрос
        $searchstr = $_GET['searchstr'];
    } else {
        System::site()->AddTextBox('', '<div style="text-align: center;">По вашему запросу ничего не найдено.</div>');
        return;
    }
    $SearchUrl = 'index.php?name=search&op=search&searchstr=' . urlencode(SafeDB($searchstr, 255, str)) . $mods_str;
    // Страница
    if (isset($_GET['page'])) {
        $page = SafeEnv($_GET['page'], 10, int);
    } else {
        $page = 1;
    }
    // Добавляем хлебные крошки
    System::site()->BreadCrumbAdd('Результаты поиска для "' . SafeDB($searchstr, 255, str) . '"');
    // Поиск
    $results = IndexSearchSearch($mods);
    // Сортируем результаты поиска
    usort($results, 'IndexSearchSortResults');
    // Выводим результаты
    if (count($results) > 0) {
        $num = 20;
        //Количество результатов на страницу
        $si = $num * ($page - 1);
        $navigation = new Navigation($page);
        $navigation->GenNavigationMenu($results, $num, $SearchUrl);
        System::site()->AddTemplatedBox('Результаты поиска', 'module/search_results.html');
        System::site()->AddBlock('search_results', true, true, 'result');
        foreach ($results as $i => $result) {
            $result['no'] = $si + $i + 1;
            System::site()->AddSubBlock('search_results', true, $result);
        }
    } else {
        System::site()->AddTextBox('', '<div style="text-align: center;">По вашему запросу ничего не найдено.</div>');
    }
}
function IndexArticlesShow($cat)
{
    if ($cat != 0) {
        System::site()->SetTitle('Статьи в категории ' . SafeDB(IndexArticlesGetTree()->IdCats[$cat]['title'], 255, str));
    }
    if (isset($_GET['page'])) {
        $page = SafeEnv($_GET['page'], 11, int);
    } else {
        $page = 1;
    }
    $arts = System::database()->Select('articles', GetWhereByAccess('view', ($cat != 0 ? "`cat_id`='{$cat}' and " : '') . "`active`='1'"));
    SortArray($arts, 'public', true);
    // Постраничная навигация
    $num = System::config('articles/articles_on_page');
    $navigation = new Navigation($page);
    $nav_link = Ufu('index.php?name=articles' . ($cat != 0 ? '&cat=' . $cat : ''), 'articles/' . ($cat != 0 ? '{cat}/' : '') . 'page{page}/', true);
    $navigation->FrendlyUrl = System::config('general/ufu');
    $navigation->GenNavigationMenu($arts, $num, $nav_link);
    if (System::database()->NumRows() > 0) {
        System::site()->AddTemplatedBox('', 'module/article.html');
        System::site()->AddBlock('articles', true, true, 'art');
        foreach ($arts as $art) {
            RenderArticle($art);
        }
    } elseif (!isset(IndexArticlesGetTree()->Cats[$cat]) && count(IndexArticlesGetTree()->Cats) > 0) {
        System::site()->AddTextBox('', '<p align="center">В этой категории статей пока нет.</p>');
    }
}
function AdminArticlesMain()
{
    global $editarticles;
    // Фильтр, дает возможность показывать статьи определенной категории.
    if (isset($_GET['cat']) && $_GET['cat'] > -1) {
        $cat = SafeEnv($_GET['cat'], 11, int);
        $where = "`cat_id`='{$cat}'";
    } else {
        $cat = -1;
        $where = "";
    }
    $data = array();
    $data = AdminArticlesGetTree()->GetCatsData($cat, true);
    System::site()->DataAdd($data, -1, 'Все статьи', $cat == -1);
    // Получаем номер страницы
    if (isset($_GET['page'])) {
        $page = SafeEnv($_GET['page'], 10, int);
    } else {
        $page = 1;
    }
    AddCenterBox('Статьи');
    // Форма фильтра по категориям
    System::admin()->AddJS('
	ArticlesSelectCat = function(){
		Admin.LoadPage("' . ADMIN_FILE . '?exe=articles&cat="+$("#article-cat").val());
	}
	');
    $text = '<div style="text-align: center; margin-bottom: 10px;">Категория: ' . System::site()->Select('cat', $data, false, 'id="article-cat" onchange="ArticlesSelectCat();"') . '</div>';
    AddText($text);
    // Берем статьи из БД и включаем постраничную навигацию если нужно.
    $r = System::database()->Select('articles', $where);
    SortArray($r, 'public', true);
    // Сортируем по дате добавления
    if (count($r) > System::config('articles/articles_on_page')) {
        $navigator = new Navigation($page);
        $navigator->GenNavigationMenu($r, System::config('articles/articles_on_page'), ADMIN_FILE . '?exe=articles' . ($cat > 0 ? '&cat=' . $cat : ''));
        $nav = true;
    } else {
        $nav = false;
    }
    $text = '<table cellspacing="0" cellpadding="0" class="cfgtable">';
    $text .= '<tr><th>Название</th><th>Прочитано</th><th>Оценки</th><th>Видят</th><th>Статус</th><th>Функции</th></tr>';
    $back = SaveRefererUrl();
    foreach ($r as $art) {
        $id = SafeDB($art['id'], 11, int);
        $cat_id = SafeDB($art['cat_id'], 11, int);
        $title = SafeDB($art['title'], 255, str);
        $hits = SafeDB($art['hits'], 11, int);
        $rating = '<img src="' . GetRatingImage(SafeDB($art['num_votes'], 11, int), SafeDB($art['all_votes'], 11, int)) . '" border="0" />';
        $st = $art['active'] == '1' ? 'Вкл.' : 'Выкл.';
        $link_go = Ufu("index.php?name=articles&op=read&art={$id}&cat={$cat_id}", 'articles/{cat}/{art}/');
        $func = '';
        $func .= System::admin()->SpeedButton('Перейти к странице на сайте', $link_go, 'images/link_go.png', false, false, 'target="_blank"');
        if ($editarticles) {
            $title = '<b>' . System::admin()->Link($title, ADMIN_FILE . '?exe=articles&a=editor&id=' . $id . '&back=' . $back) . '</b>';
            $hits .= '&nbsp;' . System::admin()->SpeedConfirm('Обнулить счётчик просмотров', ADMIN_FILE . '?exe=articles&a=resethits&id=' . $id . '&back=' . $back, 'images/admin/arrow_in.png', 'Сбросить счётчик просмотров?');
            $rating .= '&nbsp;' . System::admin()->SpeedConfirm('Обнулить счётчик оценок (' . SafeDB($art['num_votes'], 11, int) . ' голосов)', ADMIN_FILE . '?exe=articles&a=resetrating&id=' . $id . '&back=' . $back, 'images/admin/arrow_in.png', 'Сбросить оценки?');
            $st = System::admin()->SpeedStatus('Включена', 'Отключена', ADMIN_FILE . '?exe=articles&a=changestatus&id=' . $id, $art['active'] == '1');
            $func .= System::admin()->SpeedButton('Редактировать', ADMIN_FILE . '?exe=articles&a=editor&id=' . $id . '&back=' . $back, 'images/admin/edit.png');
            $func .= System::admin()->SpeedConfirm('Удалить', ADMIN_FILE . '?exe=articles&a=delete&id=' . $id . '&ok=1&back=' . $back, 'images/admin/delete.png', 'Удалить статью?');
        }
        $text .= '<tr>
		<td>' . $title . '</td>
		<td>' . $hits . '</td>
		<td>' . ($art['allow_votes'] == '1' ? $rating : 'Запрещены') . '</td>
		<td>' . ViewLevelToStr(SafeDB($art['view'], 1, int)) . '</td>
		<td>' . $st . '</td>
		<td>' . $func . '</td>
		</tr>';
    }
    $text .= '</table>';
    AddText($text);
    if ($nav) {
        AddNavigation();
    }
}
function IndexGalleryShow($Cat, $Images = null, $OnlyBlock = false, $Parent = null, $Active = -1)
{
    if (!$OnlyBlock) {
        if ($Cat != 0) {
            System::site()->SetTitle('Изображения в категории ' . SafeDB(IndexGalleryGetTree()->IdCats[$Cat]['title'], 255, str));
        }
        $images_on_page = System::config('gallery/images_on_page');
        $thumbs_on_row = System::config('gallery/thumbs_onrow');
        if (isset($_GET['page'])) {
            $page = SafeEnv($_GET['page'], 11, int);
        } else {
            $page = 1;
        }
    }
    if (!isset($Images)) {
        $Images = System::database()->Select('gallery', GetWhereByAccess('view', "`cat_id`='{$Cat}' and `show`='1'"), null, 'order');
    }
    $count = count($Images);
    /*
     * Постраничная навигация.
     */
    if (!$OnlyBlock) {
        $navigation = new Navigation($page);
        if (System::config('gallery/page_navigation')) {
            $nav_link = Ufu('index.php?name=gallery' . ($Cat != 0 ? '&cat=' . $Cat : ''), 'gallery/' . ($Cat != 0 ? '{cat}/' : '') . 'page{page}/', true);
            $navigation->FrendlyUrl = System::config('general/ufu');
            $navigation->GenNavigationMenu($Images, $images_on_page, $nav_link);
        } else {
            $navigation->DisableNavigation();
        }
    }
    if ($count > 0 || $OnlyBlock) {
        /*
         * Выводим изображения в шаблонизатор.
         */
        if (isset($Parent)) {
            $block_images = $Parent->NewBlock('gallery_images', true, true, 'img');
        } else {
            $block_images = System::site()->NewBlock('gallery_images_block', true, true, 'img');
        }
        if (!$OnlyBlock) {
            System::site()->AddTable('gallery_images', true, 'img', $thumbs_on_row);
        }
        foreach ($Images as $index => $img) {
            if (!$OnlyBlock) {
                $index = strval($index + 1 + ($page - 1) * $images_on_page);
            }
            $vars = IndexGalleryFilterImageData($img, $index, $count);
            if ($vars['title'] == '') {
                $vars['title'] = 'Изображение ' . $index;
            }
            $vars['active'] = $index == $Active;
            $block_images->NewSubBlock(true, $vars);
            if (!$OnlyBlock) {
                System::site()->AddTableCell('gallery_images', true, $vars);
            }
        }
        if (!$OnlyBlock) {
            System::site()->AddTemplatedBox('', 'module/gallery_image.html');
        }
    } else {
        System::site()->AddTextBox('', '<p align="center">В этой категории пока нет изображений.</p>');
    }
}
function IndexMailHistory()
{
    if (isset($_GET['topic_id'])) {
        $topic_id = SafeEnv($_GET['topic_id'], 11, int);
    } else {
        GO(GetSiteUrl() . Ufu('index.php?name=mail&op=topics', 'mail/{op}/'));
    }
    System::database()->Select('mail_topics', "`id`='{$topic_id}'");
    if (System::database()->NumRows() > 0) {
        $topic = System::database()->FetchRow();
    } else {
        GO(GetSiteUrl() . Ufu('index.php?name=mail&op=topics', 'mail/{op}/'));
    }
    if (isset($_GET['page'])) {
        $page = SafeEnv($_GET['page'], 10, int);
    } else {
        $page = 1;
    }
    $mails = System::database()->Select('mail_history', "`topic_id`='{$topic_id}'");
    if (System::database()->NumRows() == 0) {
        System::site()->AddTextBox('Рассылки', '<p align="center"><br>Рассылок на тему "' . SafeDB($topic['title'], 250, str) . '" не проводилось.<br><br><a href="javascript:history.go(-1)">Назад</a><br><br></p>');
        return;
    }
    SortArray($mails, 'date', false);
    $num = 20;
    // FIXME: System::config('mail/mail_on_page');
    $navigation = new Navigation($page);
    $navigation->FrendlyUrl = System::config('general/ufu');
    $navigation->GenNavigationMenu($mails, $num, Ufu("index.php?name=mail&op=history&topic_id={$topic_id}", 'mail/history/topic{topic_id}/page{page}/'));
    System::site()->AddTemplatedBox('', 'module/mail_showid_nav.html');
    System::site()->AddBlock('mail_nav');
    $vars['lprev'] = 'Список рассылок';
    $vars['prev_id'] = true;
    $vars['next_id'] = false;
    $vars['back'] = false;
    $vars['prev_url'] = 'index.php?name=mail&amp;op=topics';
    System::site()->Blocks['mail_nav']['vars'] = $vars;
    System::site()->AddTemplatedBox('Архив рассылки', 'module/mail_mail.html');
    System::site()->AddBlock('mail_history');
    $vars['topic'] = SafeDB($topic['title'], 255, str);
    $vars['ldate'] = 'Дата выпуска';
    $vars['lsubject'] = 'Тема выпуска';
    System::site()->Blocks['mail_history']['vars'] = $vars;
    System::site()->AddBlock('mail', true, true);
    foreach ($mails as $mail) {
        $vars = array();
        $vars['subject'] = SafeDB($mail['subject'], 250, str);
        $vars['date'] = TimeRender(SafeDB($mail['date'], 11, int));
        $vars['url'] = Ufu("index.php?name=mail&op=showid&topic_id={$topic_id}&id=" . SafeDB($mail['id'], 11, int), 'mail/show/topic{topic_id}/id{id}/');
        System::site()->AddSubBlock('mail', true, $vars);
    }
}
function AdminMailHistory()
{
    System::admin()->AddCenterBox('История рассылки');
    if (isset($_GET['topic_id'])) {
        $topic = SafeEnv($_GET['topic_id'], 11, int);
    } elseif (isset($_POST['topic'])) {
        $topic = SafeEnv($_POST['topic_id'], 11, int);
    } else {
        System::admin()->Highlight('Тема не указана.');
        return;
    }
    $msgs = System::database()->Select('mail_history', '');
    if (System::database()->NumRows() == 0) {
        System::admin()->Highlight('Рассылок по данной теме не проводилось.');
        return;
    }
    if (isset($_GET['page'])) {
        $page = SafeEnv($_GET['page'], 10, int);
    } else {
        $page = 1;
    }
    SortArray($msgs, 'date', true);
    $num = 10;
    if (count($msgs) > $num) {
        $nav = new Navigation($page);
        $nav->GenNavigationMenu($msgs, $num, ADMIN_FILE . '?exe=mail&a=history&topic_id=' . $topic);
        $nav = true;
    } else {
        $nav = false;
    }
    $text = '<table cellspacing="0" cellpadding="0" align="center" class="commtable_header" style="width:80%;">
	<tr>
	<th style="width: 120px;">Дата</th>
	<th style="width: 510px;">Тема</th>
	<th>Функции</th>
	</tr></table>';
    foreach ($msgs as $msg) {
        $mid = SafeDB($msg['id'], 11, int);
        $subject = SafeDB($msg['subject'], 255, str);
        $date = SafeDB($msg['date'], 11, int);
        $from = SafeDB($msg['from'], 255, str);
        $from_email = SafeDB($msg['from_email'], 255, str);
        $mailtext = nl2br(SafeDB($msg['plain_text'], 0, str));
        $func = '';
        $func .= System::admin()->SpeedButton('Редактировать письмо', ADMIN_FILE . '?exe=mail&a=edit&id=' . $mid . '&topic_id=' . $topic, 'images/admin/edit.png');
        $func .= System::admin()->SpeedConfirm('Удалить письмо', ADMIN_FILE . '?exe=mail&a=delete&id=' . $mid . '&topic_id=' . $topic . '&ok=0', 'images/admin/delete.png', 'Удалить письмо из истории?');
        $text .= '<table cellspacing="0" cellpadding="0" class="commtable" style="width:80%;">';
        $text .= '<tr>
			<th style="text-align: left; width: 120px;">' . TimeRender($date) . '</td>
			<th style="text-align: left; width: 510px;">' . $subject . '</td>
			<th>' . $func . '</td>
		</tr>';
        $text .= '<tr><td colspan="3" class="commtable_text">' . $mailtext . '</td></tr>';
        $text .= '</table>';
    }
    AddText($text);
    if ($nav) {
        AddNavigation();
    }
}
function AdminGalleryMainFunc()
{
    global $edit_images, $GalleryDir, $ThumbsDir;
    UseScript('colorbox?theme=admin');
    $back = SaveRefererUrl();
    if (isset($_GET['cat']) && $_GET['cat'] > -1) {
        $cat = SafeEnv($_GET['cat'], 11, int);
        $where = "`cat_id`='{$cat}'";
    } else {
        $cat = -1;
        $where = "";
    }
    $data = AdminGalleryGetTree()->GetCatsData($cat, true);
    System::site()->DataAdd($data, -1, 'Все изображения', $cat == -1);
    if (isset($_GET['page'])) {
        $page = SafeEnv($_GET['page'], 11, int);
        $page_param = '&page=' . SafeDB($_GET['page'], 11, int);
    } else {
        $page = 1;
        $page_param = '';
    }
    AddCenterBox('Фото');
    System::admin()->AddJS(Indent('
		GallerySelectCat = function(){
			Admin.LoadPage("' . ADMIN_FILE . '?exe=gallery&cat="+$("#gallery-cat").val());
		}
	'));
    $text = '<div style="margin-bottom: 10px;">Категория: ' . System::site()->Select('cat', $data, false, 'id="gallery-cat" onchange="GallerySelectCat();"');
    if ($cat < 0) {
        $text .= ' (Для сортировки изображений, выберите категорию)';
    }
    $text .= '</div>';
    AddText($text);
    $images = System::database()->Select('gallery', $where);
    $count_images = count($images) - 1;
    SortArray($images, 'order');
    if (count($images) > System::config('gallery/images_on_page')) {
        $navigator = new Navigation($page);
        $navigator->GenNavigationMenu($images, System::config('gallery/images_on_page'), ADMIN_FILE . '?exe=gallery' . ($cat > 0 ? '&cat=' . $cat : ''));
        $nav = true;
    } else {
        $nav = false;
    }
    $text = '<table cellspacing="0" cellpadding="0" class="cfgtable">';
    $text .= '<tr>' . ($cat > 0 ? '<th>Сортировка</th>' : '') . '<th>Изображение</th><th>Просмотров</th><th>Видят</th><th>Статус</th><th>Функции</th></tr>';
    foreach ($images as $i => $img) {
        $id = SafeDB($img['id'], 11, int);
        $title = SafeDB($img['title'], 255, str);
        if ($title == '') {
            $title = 'Изображение ' . $id;
        }
        if (System::config('gallery/show_thumbs')) {
            $img_filename = SafeDB($img['file'], 255, str);
            $size = FormatFileSize(filesize($GalleryDir . $img_filename));
            $asize = getimagesize($GalleryDir . $img_filename);
            $asize = $asize[0] . 'x' . $asize[1];
            $thumb = '<div style="margin: 5px 0;"><a href="' . $GalleryDir . $img_filename . '" target="_blank" class="colorbox">' . '<img title="' . $title . '" src="' . $ThumbsDir . $img_filename . (isset($_GET['update']) && $_GET['update'] == $id ? '?' . GenRandomString(5) : '') . '"></a></div>' . "({$asize}, {$size})";
        } else {
            $thumb = '';
        }
        $hits = SafeDB($img['hits'], 11, int);
        $st = $img['show'] == '1' ? 'Вкл.' : 'Выкл.';
        $func = '-';
        $move_menu = '';
        $link_go = Ufu('index.php?name=gallery&op=view&img=' . $id . '&cat=' . SafeDB($img['cat_id'], 11, int), 'gallery/{cat}/{img}/');
        $func = '';
        $func .= System::admin()->SpeedButton('Перейти к странице на сайте', $link_go, 'images/link_go.png', false, false, 'target="_blank"');
        if ($edit_images) {
            $edit_url = ADMIN_FILE . '?exe=gallery&a=editor&id=' . $id . '&back=' . $back;
            $title = '<b>' . System::admin()->Link($title, $edit_url) . '</b>';
            $hits .= '&nbsp;' . System::admin()->SpeedConfirm('Обнулить счётчик просмотров', ADMIN_FILE . '?exe=gallery&a=resethits&id=' . $id . '&back=' . $back, 'images/admin/arrow_in.png', 'Сбросить счётчик просмотров?');
            $st = System::admin()->SpeedStatus('Вкл.', 'Выкл.', ADMIN_FILE . '?exe=gallery&a=changestatus&id=' . $id, $img['show'] == '1');
            $func .= System::admin()->SpeedButton('Редактировать', $edit_url, 'images/admin/edit.png');
            $func .= System::admin()->SpeedConfirm('Удалить', ADMIN_FILE . '?exe=gallery&a=delete&id=' . $id . '&back=' . $back, 'images/admin/delete.png', 'Удалить изображение?');
            $func .= '<div style="margin-top: 4px;">';
            $func .= System::admin()->SpeedButton('Повернуть влево на 90°', ADMIN_FILE . '?exe=gallery&a=rotate&turn=left&id=' . $id . '&back=' . $back, 'images/admin/layer-rotate-left.png');
            $func .= System::admin()->SpeedButton('Повернуть вправо на 90° ', ADMIN_FILE . '?exe=gallery&a=rotate&turn=right&id=' . $id . '&back=' . $back, 'images/admin/layer-rotate-right.png');
            $func .= System::admin()->SpeedButton('Обновить эскиз', ADMIN_FILE . '?exe=gallery&a=refreshthumb&id=' . $id . '&back=' . $back, 'images/admin/refresh.png');
            $func .= '</div>';
            if ($count_images == 0) {
                // Единственный элемент в списке
                $move_menu .= ' - ';
            } else {
                if ($i != $count_images) {
                    // Первый элемент
                    $move_menu .= System::admin()->SpeedButton('Вниз', ADMIN_FILE . '?exe=gallery&a=move&to=down&id=' . $id . '&cat=' . $cat . $page_param, 'images/admin/down.png');
                }
                if ($i != 0) {
                    // Последний элемент
                    $move_menu .= System::admin()->SpeedButton('Вверх', ADMIN_FILE . '?exe=gallery&a=move&to=up&id=' . $id . '&cat=' . $cat . $page_param, 'images/admin/up.png');
                }
            }
        }
        $text .= Indent('
			<tr>
				' . ($cat > 0 ? '<td>' . $move_menu . '</td>' : '') . '
				<td>' . $title . $thumb . '</td>
				<td>' . $hits . '</td>
				<td>' . ViewLevelToStr(SafeDB($img['view'], 1, int)) . '</td>
				<td>' . $st . '</td>
				<td>' . $func . '</td>
			</tr>
		');
    }
    $text .= '</table>';
    AddText($text);
    if ($nav) {
        AddNavigation();
    }
}
$where_url = '';
if (isset($_GET['where'])) {
    $where = $_GET['where'];
    $where_url = '&where=' . $_GET['where'];
}
$info = System::database()->GetTableColumns($name);
$rows = System::database()->Select($name, $where);
if (isset($_GET['page'])) {
    $page = SafeEnv($_GET['page'], 11, int);
} else {
    $page = 1;
}
$rows_on_page = 40;
if (count($rows) > $rows_on_page) {
    $navigator = new Navigation($page);
    $navigator->GenNavigationMenu($rows, $rows_on_page, ADMIN_FILE . '?exe=dbadmin&a=review&name=' . $name);
    $nav = true;
} else {
    $nav = false;
    AddText('<br>');
}
System::admin()->AddJS('
	DbAdminWhereApply = function(){
		var where = $("#dbadmin_where").val();
		Admin.LoadPage("' . ADMIN_FILE . '?exe=dbadmin&a=review&name=' . $namedb . '&where="+where, undefined, "Идёт поиск");
	}
');
$searchtool = '<div>
	Запрос (WHERE): ' . System::site()->Edit('where', SafeDB($where, 255, str), false, 'id="dbadmin_where" style="width: 400px;" onkeyup="if(event.keyCode == 13) DbAdminWhereApply();"') . '
	' . System::admin()->SpeedConfirmJs('Применить', 'DbAdminWhereApply();', '', '', true) . '
</div>';
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']);
}
function AdminDownloadsMain()
{
    $editfiles = System::user()->CheckAccess2('downloads', 'edit_files');
    $back = SaveRefererUrl();
    if (isset($_GET['cat']) && $_GET['cat'] > -1) {
        $cat = SafeEnv($_GET['cat'], 11, int);
        $where = "`category`='{$cat}'";
    } else {
        $cat = -1;
        $where = "";
    }
    $data = array();
    $data = AdminDownloadsGetTree()->GetCatsData($cat, true);
    System::site()->DataAdd($data, -1, 'Все файлы', $cat == -1);
    if (isset($_GET['page'])) {
        $page = SafeEnv($_GET['page'], 10, int);
    } else {
        $page = 1;
    }
    AddCenterBox('Файлы');
    System::admin()->AddJS(Indent('
		DownloadsSelectCat = function(){
			Admin.LoadPage("' . ADMIN_FILE . '?exe=downloads&cat="+$("#download-cat").val());
		}
	'));
    $text = '<div style="text-align: center; margin-bottom: 10px;">Категория: ' . System::site()->Select('cat', $data, false, 'id="download-cat" onchange="DownloadsSelectCat();"') . '</div>';
    AddText($text);
    System::database()->Select('downloads', $where);
    SortArray(System::database()->QueryResult, 'public', true);
    if (count(System::database()->QueryResult) > System::config('downloads/filesonpage')) {
        $navigator = new Navigation($page);
        $navigator->GenNavigationMenu(System::database()->QueryResult, System::config('downloads/filesonpage'), ADMIN_FILE . '?exe=downloads' . ($cat > 0 ? '&cat=' . $cat : ''));
        $nav = true;
    } else {
        $nav = false;
    }
    $text = '<table cellspacing="0" cellpadding="0" class="cfgtable">';
    $text .= '<tr><th>Заголовок</th><th>Скачиваний</th><th>Оценки</th><th>Видят</th><th>Статус</th><th>Функции</th></tr>';
    while ($row = System::database()->FetchRow()) {
        $id = SafeDB($row['id'], 11, int);
        $title = SafeDB($row['title'], 255, str);
        $hits = SafeDB($row['hits'], 11, int);
        $rating = '<img src="' . GetRatingImage(SafeDB($row['votes_amount'], 11, int), SafeDB($row['votes'], 11, int)) . '" border="0" />';
        $st = $row['active'] == '1' ? 'Вкл.' : 'Выкл.';
        $func = '-';
        if ($editfiles) {
            $title = '<b>' . System::admin()->Link($title, ADMIN_FILE . '?exe=downloads&a=editor&id=' . $id . '&back=' . $back) . '</b>';
            $hits .= '&nbsp;' . System::admin()->SpeedConfirm('Обнулить счётчик скачиваний', ADMIN_FILE . '?exe=downloads&a=resetcounter&id=' . $id . '&back=' . $back, 'images/admin/arrow_in.png', 'Сбросить счётчик скачиваний?');
            $rating .= '&nbsp;' . System::admin()->SpeedConfirm('Обнулить счётчик оценок (' . SafeDB($row['votes_amount'], 11, int) . ' голосов)', ADMIN_FILE . '?exe=downloads&a=resetrating&id=' . $id . '&back=' . $back, 'images/admin/arrow_in.png', 'Сбросить оценки?');
            $st = System::admin()->SpeedStatus('Вкл.', 'Выкл.', ADMIN_FILE . '?exe=downloads&a=changestatus&id=' . $id, $row['active'] == '1');
            $func = System::admin()->SpeedButton('Редактировать', ADMIN_FILE . '?exe=downloads&a=editor&id=' . $id . '&back=' . $back, 'images/admin/edit.png');
            $func .= System::admin()->SpeedConfirm('Удалить', ADMIN_FILE . '?exe=downloads&a=deletefile&id=' . $id . '&ok=0&back=' . $back, 'images/admin/delete.png', 'Удалить файл?');
        }
        $text .= '<tr><td>' . $title . '</td>
		<td>' . $hits . '</td>
		<td>' . ($row['allow_votes'] == '1' ? $rating : 'Запрещены') . '</td>
		<td>' . ViewLevelToStr(SafeDB($row['view'], 1, int)) . '</td>
		<td>' . $st . '</td>
		<td>' . $func . '</td>
		</tr>';
    }
    $text .= '</table>';
    AddText($text);
    if ($nav) {
        AddNavigation();
    }
}