/**
 * Вызывается при запросе несуществующей
 * страницы или ошибки и использования спецсимволов в параметрах
 * @param bool $LowProtect
 * @param bool $Redirect
 * @return void
 */
function HackOff($LowProtect = false, $Redirect = true)
{
    global $config;
    if (System::user()->isAdmin() || $LowProtect) {
        if (defined('MAIN_SCRIPT') || defined('PLUG_SCRIPT') || !defined('ADMIN_SCRIPT')) {
            if ($Redirect) {
                GO(Ufu('index.php'));
            }
        } elseif (defined('ADMIN_SCRIPT')) {
            GO(ADMIN_FILE);
        }
    } else {
        if (System::config('security/hack_event') == 'alert') {
            die(System::config('security/hack_alert'));
        } elseif (System::config('security/hack_event') == 'ban') {
            die('Вам был запрещен доступ к сайту, возможно система обнаружила подозрительные
			действия с Вашей стороны. Если Вы считаете, что это произошло по ошибке, - обратитесь
			в службу поддержки по e-mail ' . System::config('general/site_email') . '.');
        } else {
            if ($Redirect) {
                GO(Ufu('index.php'));
            }
        }
    }
}
function IndexForumLogin()
{
    if (!System::user()->Auth) {
        System::site()->Login('');
        System::user()->Def('forum_referrer', $_SERVER['HTTP_REFERER']);
    } else {
        GO(System::user()->Get('forum_referrer'), 202);
    }
}
function IndexForumMarkRead()
{
    $mark_forums = array();
    // Форумы на которых устанавливать метки
    $forums_tree = ForumTree::Instance();
    if (isset($_GET['forum'])) {
        // Только внутри определённого форума
        $forum = SafeDB($_GET['forum'], 11, int);
        $mark_forums = $forums_tree->GetAllAccessForumId($forum);
    } else {
        // На всех форумах
        $mark_forums = $forums_tree->GetAllAccessForumId();
    }
    $user_id = System::user()->Get('u_id');
    if (System::user()->Auth) {
        // Загружаем данные о прочтении тем пользователем
        $read_data = Forum_Marker_GetReadData();
        // Загружаем топики (агрегированы по forum_id)
        $topics = ForumCacheGetTopics();
        $del_where = '';
        $insert_values = array();
        $time = time();
        foreach ($mark_forums as $forum_id) {
            if (!isset($topics[$forum_id])) {
                continue;
            }
            foreach ($topics[$forum_id] as $topic) {
                $tid = SafeEnv($topic['id'], 11, int);
                // Не прочитана или метка устарела
                if (!isset($read_data[$topic['id']])) {
                    $insert_values[] = "'{$user_id}','{$tid}','{$time}'";
                    // Добавить новую метку
                } elseif ($read_data[$topic['id']]['date'] < $topic['last_post']) {
                    $del_where .= "(`tid`='{$tid}' and `mid`= '{$user_id}') or ";
                    // Удалить текущую метку
                    $insert_values[] = "'{$user_id}','{$tid}','{$time}'";
                    // Добавить новую метку
                }
            }
        }
        // Удаляем устаревшие метки
        if ($del_where != '') {
            $del_where = substr($del_where, 0, -4);
            // Удаляем .or.
            System::database()->Delete('forum_topics_read', $del_where);
        }
        // Добавляем новые метки
        // TODO: В будущем нужно перейти на InnoDB и использовать транзакции как в MySQL так и в FilesDB.
        if (count($insert_values) > 0) {
            foreach ($insert_values as $vals) {
                System::database()->Insert('forum_topics_read', $vals);
            }
        }
    }
    GO(GetSiteUrl() . Ufu('index.php?name=forum' . (isset($forum) ? '&op=showforum&forum=' . $forum : ''), 'forum/' . (isset($forum) ? '{forum}/' : '')));
}
function IndexForumSubscription()
{
    global $forum_lang;
    $forums_tree = ForumTree::Instance();
    // Проверки на доступ
    if (CheckGet('topic')) {
        // Тема
        $topic_id = SafeEnv($_GET['topic'], 11, int);
        System::database()->Select('forum_topics', "`id`='{$topic_id}'");
        if (System::database()->NumRows() > 0) {
            $topic = System::database()->FetchRow();
        } else {
            System::site()->AddTextBox($forum_lang['error'], $forum_lang['error_access_category']);
            return;
        }
        if ($topic['delete'] == '1') {
            // Тема на удалении
            System::site()->AddTextBox($forum_lang['error'], $forum_lang['topic_basket'] . '.' . $forum_lang['no_topic_basket_edit']);
            return;
        }
        if ($topic['close_topics'] == '1') {
            // Тема закрыта
            System::site()->AddTextBox($forum_lang['error'], $forum_lang['topic_close_for_discussion'] . '.' . $forum_lang['no_create_new_message_current_topic_add']);
            return;
        }
        // Форум
        $forum_id = SafeEnv($topic['forum_id'], 11, int);
        if (!isset($forums_tree->IdCats[$forum_id])) {
            System::site()->AddTextBox($forum_lang['error'], $forum_lang['error_data']);
            return;
        }
        $forum_config = $forums_tree->GetForumConfigRecursive($forum_id);
        if (!$forum_config['access']) {
            // Доступ
            System::site()->AddTextBox($forum_lang['error'], $forum_config['access_reason']);
            return;
        } elseif (!$forum_config['new_message_email']) {
            // Разрешено ли подписываться на новые сообщения (+ защита от гостей)
            System::site()->AddTextBox($forum_lang['error'], $forum_config['add_post_reason']);
            return;
        }
    } else {
        System::site()->AddTextBox($forum_lang['error'], $forum_lang['error_data']);
        return;
    }
    Forum_Subscription($topic_id);
    // Подписка (обратное действие, если пользователь уже подписан)
    GO(Ufu('index.php?name=forum&op=showtopic&topic=' . $topic_id . '&view=lastpost', 'forum/topic{topic}-new.html'));
}
function IndexFormsMain()
{
    $forms = System::database()->Select('forms', GetWhereByAccess('view', "`active`='1'"));
    if (System::database()->NumRows() == 0) {
        GO(FORMS_UFU);
    }
    System::site()->AddTemplatedBox('', 'module/forms_list.html');
    System::site()->AddBlock('forms_list', true, true, 'form');
    foreach ($forms as $form) {
        $vars = array();
        $vars['link'] = Ufu('index.php?name=forms&formlink=' . SafeDB($form['link'], 255, str), 'forms:form');
        $vars['title'] = SafeDB($form['hname'], 255, str);
        System::site()->AddSubBlock('forms_list', true, $vars);
    }
}
function IndexForumCloseTopic()
{
    if (!System::user()->isAdmin()) {
        HackOff();
        return;
    }
    if (CheckGet('topic')) {
        $topic_id = SafeEnv($_GET['topic'], 11, int);
    } else {
        System::site()->AddTextBox($forum_lang['error'], $forum_lang['error_data']);
        return;
    }
    System::database()->Select('forum_topics', "`id`='{$topic_id}'");
    $topic = System::database()->FetchRow();
    $forum_id = SafeDB($topic['forum_id'], 11, int);
    System::database()->Update('forum_topics', "`close_topics`='1'", "`id`='{$topic_id}'");
    GO(Ufu('index.php?name=forum&op=showforum&forum=' . $forum_id, 'forum/{forum}/'));
}
function IndexForumEditPosts()
{
    global $forum_lang;
    if (!System::user()->isAdmin()) {
        System::site()->AddTextBox($forum_lang['forum'], '<p align="center">' . $forum_lang['error_no_right_edit'] . '.</p>');
        return;
    }
    if (!isset($_POST['posts'])) {
        System::site()->AddTextBox($forum_lang['forum'], '<p align="center">' . $forum_lang['error_no_messages'] . '</p><br><a href="javascript:history.go(-1)">' . System::site()->Button($forum_lang['back']) . '</a>');
        return;
    }
    if (isset($_GET['ok']) && $_GET['ok'] == '1') {
        $posts_ids = SafeEnv(explode(',', $_POST['posts']), 11, int);
        $moderation_result = ForumModerationPosts($_GET['edit'], $posts_ids, true);
        if ($moderation_result) {
            if (isset($_GET['back'])) {
                GoRefererUrl($_GET['back']);
            } else {
                GO($_POST['backurl']);
            }
        }
    } else {
        $posts_ids = array();
        foreach (array_keys($_POST['posts']) as $post_id) {
            $posts_ids[] = SafeEnv($post_id, 11, int);
        }
        $do = SafeDB($_POST['do'], 255, str);
        $form_url = 'index.php?name=forum&op=edit_posts&edit=' . $do . '&ok=1';
        if (isset($_GET['back'])) {
            $form_url .= '&back=' . SafeDB($_GET['back'], 10, str);
        }
        $vars['lang_premoderation'] = $forum_lang['moderation_messages'];
        $vars['posts_count'] = count($posts_ids);
        $vars['form_action'] = $form_url;
        $vars['form_name'] = 'forum_delete';
        $vars['posts'] = implode(',', $posts_ids);
        $vars['backurl'] = $_SERVER['HTTP_REFERER'];
        $vars['reason'] = System::config('forum/basket') && $do == 'deleteposts';
        $vars['lang_do'] = ForumModerationPosts($do, $posts_ids, false);
        System::site()->AddTemplatedBox($vars['lang_do'], 'module/forum_moderation.html');
        System::site()->AddBlock('forum_moderation', true, false, 'mod');
        System::site()->SetVars('forum_moderation', $vars);
    }
}
        }
        $text = "<div class=\"license_frame\"><div>" . $license . "</div></div>";
        $this->SetContent($text);
        $this->AddButton('Назад', 'main&p=2');
        $this->AddButton('Принимаю', 'install&p=2');
        break;
    case 2:
        // Выбор типа базы данных
        global $db_types;
        $db_types = array();
        SetupPlugins('db_types');
        $this->SetTitle("Выбор типа Базы данных.");
        $this->OpenForm('install&p=3');
        $text = '<p>Выберите тип Базы данных:&nbsp;</p>' . System::site()->Select('db_type', $db_types, true);
        $this->SetContent($text);
        $this->AddButton('Назад', 'install&p=1');
        $this->AddSubmitButton('Далее');
        break;
    case 3:
        // Перенаправление соответственно выбранному типу БД
        if (!isset($_POST['db_type'])) {
            $this->SetTitle('Ошибка');
            $this->SetContent('Вы не выбрали тип Базы данных.');
            $this->AddButton('Назад', 'install&p=2');
            break;
        }
        $smod = SafeEnv($_POST['db_type'], 255, str);
        System::user()->Session('db_type', $smod);
        GO('setup.php?mod=' . $smod);
        break;
}
function IndexFeedBackSend()
{
    $err = array();
    if (!isset($_POST['name']) || !isset($_POST['email']) || !isset($_POST['subject']) || !isset($_POST['department']) || !isset($_POST['message']) || !isset($_POST['feedback_form'])) {
        GO(Ufu('index.php'));
    } else {
        if ($_POST['name'] != '') {
            $name = SafeDB($_POST['name'], 250, str);
        } else {
            $err[] = 'Пожалуйста, укажите Ваше имя!';
        }
        if ($_POST['email'] != '') {
            $email = SafeDB($_POST['email'], 50, str);
        } else {
            $err[] = 'Пожалуйста, укажите Ваш действительный адрес E-mail!';
        }
        if ($_POST['subject'] != '') {
            $subject = SafeDB($_POST['subject'], 250, str, false, false, false);
        } else {
            $err[] = 'Пожалуйста, введите тему сообщения!';
        }
        // Проверяем капчу
        if (!System::user()->isDef('captcha_keystring') || System::user()->Get('captcha_keystring') != $_POST['keystr']) {
            $err[] = 'Вы ошиблись при вводе кода с картинки.';
        }
        if ($_POST['department'] != '') {
            $department = SafeEnv($_POST['department'], 11, int);
            System::database()->Select('feedback', "`active`='1' and `id`='{$department}'");
            if (System::database()->NumRows() > 0) {
                $dep = System::database()->FetchRow();
                $dep_email = SafeDB($dep['email'], 255, str);
                $department = SafeDB($dep['name'], 255, str);
            } else {
                $err[] = 'Департамент больше не существует или обратная связь с этим департаментом отключена.';
            }
        } else {
            $err[] = 'Пожалуйста, выберите департамент!';
        }
        if ($_POST['message'] != '') {
            $message = SafeDB($_POST['message'], 65535, str, false, false, false);
        } else {
            $err[] = 'Пожалуйста, введите сообщение!';
        }
    }
    $size = $_FILES['attach']['size'];
    // / 1024;
    if ($_FILES['attach']['error'] == UPLOAD_ERR_OK && $size >= System::config('feedback/max_filesize')) {
        $err[] = 'Слишком большой размер файла.';
    }
    if (count($err) == 0) {
        $mail = LmEmailExtended::Instance();
        $mail->SetTo($dep_email, Cp1251ToUtf8($department));
        $mail->SetFrom($email, Cp1251ToUtf8($name));
        $mail->SetSubject(Cp1251ToUtf8($subject));
        $text = Indent("\n\t\t\tЗдравствуйте!\n\n\t\t\tС помощью формы обратной связи на сайте \"" . System::config('general/site_name') . "\"\n\t\t\tвам было отправлено сообщение.\n\n\t\t\tДепартамент: {$department}\n\t\t\tИмя: {$name}\n\t\t\tE-mail: {$email}\n\t\t\tТема сообщения: {$subject}\n\t\t\tДата отправки: " . TimeRender(time(), true, false) . "\n\t\t\tСообщение: {$message}\n\t\t");
        $mail->AddTextPart(Cp1251ToUtf8($text));
        if ($_FILES['attach']['error'] == UPLOAD_ERR_OK) {
            $mail->AddAttachmentPart(file_get_contents($_FILES['attach']['tmp_name']), $_FILES['attach']['name']);
        }
        if ($mail->Send()) {
            System::site()->AddTextBox('Обратная связь', '<div style="text-align: center;">Ваше сообщение успешно отправлено!</div>');
        } else {
            System::site()->AddTextBox('Обратная связь', '<div style="text-align: center;">При отправке вашего сообщения произошла ошибка, повторите попытку или обратитесь к администратору.</div>');
        }
    } else {
        $text = 'Сообщение не отправлено:<br /><ul>';
        foreach ($err as $error) {
            $text .= '<li>' . $error . '</li>';
        }
        $text .= '</ul>';
        System::site()->AddTextBox('Ошибка', $text);
        IndexFeedBackForm();
    }
}
<?php

/*
 * LinkorCMS 1.4
 * © 2012 LinkorCMS Development Group
 */
if (!defined('VALID_RUN')) {
    header("HTTP/1.1 404 Not Found");
    exit;
}
if (isset($_POST['newname'])) {
    System::database()->RenameTable(SafeEnv($_GET['name'], 255, str), SafeEnv($_POST['newname'], 255, str));
    Audit('Управление БД: Переименование таблицы "' . $_GET['name'] . '" в "' . $_POST['newname'] . '"');
    GO(ADMIN_FILE . '?exe=dbadmin');
} else {
    AddCenterBox('Переименовать таблицу "' . SafeDB($_GET['name'], 255, str) . '"');
    FormRow('Новое имя', $site->Edit('newname', SafeDB($_GET['name'], 255, str), false, 'style="width: 210px;" class="autofocus"'));
    AddForm('<form action="' . ADMIN_FILE . '?exe=dbadmin&a=renametable&name=' . SafeEnv($_GET['name'], 255, str) . '" method="post">', $site->Button('Отмена', 'onclick="history.go(-1);"') . $site->Submit('Переименовать'));
}
function AdminsDeleteGroup()
{
    if (!isset($_GET['id'])) {
        GO(ADMIN_FILE . '?exe=admins&a=groups');
        exit;
    }
    $id = SafeEnv($_GET['id'], 11, int);
    if (isset($_GET['ok']) && SafeEnv($_GET['ok'], 1, int) == '1') {
        // Очищаем кэш
        if (System::cache()->HasCache(system_cache, 'usertypes')) {
            System::cache()->Delete(system_cache, 'usertypes');
        }
        System::database()->Select('users', "`access`='" . $id . "'");
        $num_users = System::database()->NumRows();
        System::database()->Select('usertypes', "`id`='{$id}'");
        $group = System::database()->FetchRow();
        if ($num_users > 0) {
            if (!isset($_GET['users'])) {
                $text = 'К этой группе принадлежат ' . $num_users . ' пользователей. Вы можете:<br />' . '<a href="' . ADMIN_FILE . '?exe=admins&a=delgroup&id=' . $id . '&ok=1&users=del">Удалить их...</a> <br />' . '<a href="' . ADMIN_FILE . '?exe=admins&a=delgroup&id=' . SafeEnv($_GET['id'], 11, int) . '&ok=1&users=move">Переместить их в другую группу.</a>';
                AddTextBox('Внимание!', $text);
            } else {
                if ($_GET['users'] == 'del') {
                    System::database()->Delete('users', "`access`='" . $id . "'");
                } elseif ($_GET['users'] == 'move' && !isset($_POST['to'])) {
                    $text = 'Выберите группу, в которую Вы желаете переместить пользователей:<br />' . '<form action="' . ADMIN_FILE . '?exe=admins&a=delgroup&id=' . $id . '&ok=1&users=move" method="post">';
                    System::database()->Select('usertypes', "`id`<>'" . $id . "'");
                    System::site()->DataAdd($group_data, '-1', 'Пользователи');
                    while ($tp = System::database()->FetchRow()) {
                        System::site()->DataAdd($group_data, $tp['id'], $tp['name']);
                    }
                    $text .= System::site()->Select('to', $group_data) . '<br />';
                    $text .= System::site()->Submit('Продолжить') . '<br />';
                    $text .= '</form>';
                    AddTextBox('Внимание!', $text);
                    return;
                } elseif ($_GET['users'] == 'move' && isset($_POST['to'])) {
                    $to = SafeEnv($_POST['to'], 11, int);
                    if ($to == '-1') {
                        $set = "type='2',access='" . $to . "'";
                    } else {
                        $set = "access='" . $to . "'";
                    }
                    System::database()->Update('users', $set, "`access`='" . $id . "'");
                }
            }
        }
        System::database()->Delete('usertypes', "`id`='" . $id . "'");
        Audit('Администраторы: Удаление группы администраторов "' . $group['name'] . '"');
        GO(ADMIN_FILE . '?exe=admins&a=groups');
    } else {
        System::database()->Select('usertypes', "`id`='" . $id . "'");
        $group = System::database()->FetchRow();
        $text = 'Вы действительно хотите удалить группу "' . SafeDB($group['name'], 255, str) . '"?<br />' . '<a href="' . ADMIN_FILE . '?exe=admins&a=delgroup&id=' . $id . '&ok=1">Да</a> &nbsp;&nbsp;&nbsp; <a href="javascript:history.go(-1)">Нет</a>';
        AddTextBox("Предупреждение", $text);
    }
}
        } elseif (!CheckEmail($admin_email)) {
            $errors[] = 'Формат E-mail не правильный. Он должен быть вида: <b>domain@host.ru</b> .';
        }
        if (count($errors) > 0) {
            $this->SetTitle("Создание учетной записи Главного администратора");
            $text = 'Ошибки:<br /><ul>';
            foreach ($errors as $error) {
                $text .= '<li>' . $error;
            }
            $text .= '</ul>';
            $this->SetContent($text);
            $this->AddButton('Назад', 'admin&p=1');
        } else {
            // Изменяем главного администратора
            $login = SafeEnv($admin_login, 255, str);
            $pass2 = md5($admin_pass);
            $email = SafeEnv($admin_email, 255, str);
            System::database()->Update('users', "`login`='{$login}',`pass`='{$pass2}',`email`='{$email}'", "`id`='1'");
            // Автоматически определяем и устанавливаем URL сайта в настройках.
            ConfigSetValue('general', 'site_url', GetSiteUrl());
            // Устанавливаем Email сайта - такой-же как и у администратора
            ConfigSetValue('general', 'site_email', $email);
            // Изменяем email Департамента обратной связи
            System::database()->Update('feedback', "`email`='{$email}'", "`id`='1'");
            // Создаём бекап базы данных
            $backupfilename = System::config('backup_dir') . date("Y.m.d_H.i.s_") . GenRandomString(8, 'abcdefghijklmnopqrstuvwxyz0123456789') . '.' . System::database()->Name . '.zip';
            System::database()->CreateBackupFile($backupfilename);
            GO('setup.php?mod=finish');
        }
        break;
}
/**
 * Выполняет перенаправление по сохраненному в сессии адресу
 * @param        $id     Идентификатор ссылки
 * @param string $anchor Добавление якоря к ссылке. Пример: #post244. Так-же могут быть просто дополнительные параметры.
 * @param bool   $unset_url Удалить сохраненный URL из сессии
 * @return bool
 */
function GoRefererUrl($id, $anchor = '', $unset_url = true)
{
    if (isset($_SESSION['saved_urls'][$id])) {
        $url = $_SESSION['saved_urls'][$id];
        if ($unset_url) {
            unset($_SESSION['saved_urls'][$id]);
        }
        return GO($url . $anchor);
    } else {
        return GO(HistoryGetUrl(2));
    }
}
function AdminConfigGroupDelete()
{
    $back_url = '';
    if (!AdminConfigPlugins()) {
        $back_url = ADMIN_FILE . '?exe=config_admin&a=view_groups&delok';
    } else {
        $back_url = ADMIN_FILE . '?exe=config_admin&a=view_groups_plugins&plugins=1&delok';
    }
    if (!isset($_GET['id'])) {
        GO($back_url);
    } else {
        $id = SafeEnv($_GET['id'], 11, int);
    }
    if (isset($_GET['ok']) && $_GET['ok'] == '1' || IsAjax()) {
        System::database()->Select(AdminConfigGroupTable(), "`id`='{$id}'");
        $conf = System::database()->FetchRow();
        System::database()->Delete(AdminConfigGroupTable(), "`id`='{$id}'");
        System::database()->Delete(AdminConfigConfigTable(), "`group_id`='{$id}'");
        Audit('Управление настройками: Удаление группы настроек "' . $conf['hname'] . '(' . $conf['name'] . ')" в "' . AdminConfigGroupTable() . '"');
        GO($back_url);
    } else {
        $r = System::database()->Select(AdminConfigGroupTable(), "`id`='{$id}'");
        AddCenterBox('Удаление группы навтроек');
        System::admin()->HighlightConfirm('Это может повлиять на работу системы. Нажмите отмена, если не уверены. Удалить группу настроек "' . SafeDB($r[0]['hname'], 255, str) . '"?', ADMIN_FILE . '?exe=config_admin&a=delete&id=' . $id . '&ok=1' . (AdminConfigPlugins() ? '&plugins=1' : ''));
    }
}
    exit;
}
$table = SafeEnv($_GET['name'], 255, str);
$index = SafeEnv($_GET['index'], 255, int);
$where = '';
$where_url = '';
if (isset($_GET['where'])) {
    $where = $_GET['where'];
    $where_url = '&where=' . $_GET['where'];
}
$rows = System::database()->Select($table, $where);
$row = $rows[$index];
$columns = System::database()->GetTableColumns($table);
$names = array();
foreach ($columns as $col) {
    $names[$col['name']] = $row[$col['name']];
}
$sql = '';
foreach ($row as $key => $value) {
    if (isset($names[$key])) {
        $sql .= "`" . $key . "`='" . System::database()->EscapeString($value) . "' and ";
    }
}
$sql = substr($sql, 0, strlen($sql) - 4);
System::database()->Delete($table, $sql);
Audit('Управление БД: Удаление строки из таблицы "' . $table . '"');
if (isset($_REQUEST['back'])) {
    GoRefererUrl($_REQUEST['back']);
} else {
    GO(ADMIN_FILE . '?exe=dbadmin&a=review&name=' . SafeDB($_GET['name'], 255, str) . $where_url);
}
/**
 * Сохраняет конфигурацию в базе данных
 * @param $Exe
 * @param string $Group
 * @param bool $ShowHidden
 * @return void
 */
function AdminConfigurationSave($Exe, $Group = '', $ShowHidden = false)
{
    global $config, $conf_config_table, $conf_config_groups_table;
    // Вытаскиваем настройки и отсортировываем по группам
    $temp = System::database()->Select($conf_config_table, '');
    for ($i = 0, $cnt = count($temp); $i < $cnt; $i++) {
        $configs[$temp[$i]['group_id']][] = $temp[$i];
    }
    unset($temp);
    // Вытаскиваем группы настроек
    if ($Group == '') {
        $q = '';
    } else {
        $q = "`name`='" . $Group . "'";
    }
    $cfg_grps = System::database()->Select($conf_config_groups_table, $q);
    for ($i = 0, $cnt = count($cfg_grps); $i < $cnt; $i++) {
        // Если эта группа невидима то пропускаем её
        if ($Group == '') {
            if ($cfg_grps[$i]['visible'] == 0) {
                continue;
            }
        }
        // Или если в ней нет настроек
        if (!isset($configs[$cfg_grps[$i]['id']])) {
            continue;
        }
        for ($j = 0, $jcnt = count($configs[$cfg_grps[$i]['id']]); $j < $jcnt; $j++) {
            // Если настройка невидима то пропускаем её
            if ($configs[$cfg_grps[$i]['id']][$j]['visible'] == 0 && !$ShowHidden) {
                continue;
            }
            $name = $configs[$cfg_grps[$i]['id']][$j]['name'];
            $kind = explode(':', $configs[$cfg_grps[$i]['id']][$j]['kind']);
            $kind = trim(strtolower($kind[0]));
            $savefunc = trim($configs[$cfg_grps[$i]['id']][$j]['savefunc']);
            $type = trim($configs[$cfg_grps[$i]['id']][$j]['type']);
            if ($type != '') {
                $type = explode(',', $type);
            } else {
                $type = array(255, str, false);
            }
            $where = "`name`='{$name}' and `group_id`='" . $cfg_grps[$i]['id'] . "'";
            if (isset($_POST[$name])) {
                switch ($kind) {
                    case 'edit':
                    case 'radio':
                    case 'combo':
                        if (FormsConfigCheck2Func('function', $savefunc, 'save')) {
                            $savefunc = CONF_SAVE_PREFIX . $savefunc;
                            $value = $savefunc(FormsCheckType($_POST[$name], $type));
                        } else {
                            $value = FormsCheckType($_POST[$name], $type);
                        }
                        break;
                    case 'text':
                        if (FormsConfigCheck2Func('function', $savefunc, 'save')) {
                            $savefunc = CONF_SAVE_PREFIX . $savefunc;
                            $value = $savefunc(FormsCheckType($_POST[$name], $type));
                        } else {
                            $value = FormsCheckType($_POST[$name], $type);
                        }
                        break;
                    case 'check':
                    case 'list':
                        if (FormsConfigCheck2Func('function', $savefunc, 'save')) {
                            $savefunc = CONF_SAVE_PREFIX . $savefunc;
                            $value = $savefunc(FormsCheckType($_POST[$name], $type));
                        } else {
                            if (isset($_POST[$name])) {
                                $c = count($_POST[$name]);
                            } else {
                                $c = 0;
                            }
                            $value = '';
                            for ($k = 0; $k < $c; $k++) {
                                $value .= ',';
                                $value .= FormsCheckType($_POST[$name][$k], $type);
                            }
                            $value = substr($value, 1);
                        }
                        break;
                    default:
                        if (FormsConfigCheck2Func('function', $savefunc, 'save')) {
                            $savefunc = CONF_SAVE_PREFIX . $savefunc;
                            $value = $savefunc(FormsCheckType($_POST[$name], $type));
                        } else {
                            $value = FormsCheckType($_POST[$name], $type);
                        }
                }
                System::database()->Update($conf_config_table, 'value=\'' . $value . '\'', $where);
                // FIXME: Использовать транзакцию
            }
        }
    }
    // Очищаем кэш настроек
    System::cache()->Clear('config');
    GO(ADMIN_FILE . '?exe=' . $Exe);
}
function IndexForumDeleteTopic()
{
    global $forum_lang;
    if (!System::user()->isAdmin() || !CheckGet('topic', 'ok')) {
        HackOff();
        return;
    }
    $topic_id = SafeEnv($_GET['topic'], 11, int);
    // Подтверждение на удаление
    if (!isset($_GET['ok']) || !isset($_POST['text']) && System::config('forum/basket') || $_GET['ok'] == '0') {
        System::database()->Select('forum_topics', "`id`='" . SafeEnv($_GET['topic'], 11, int) . "'");
        $topic = System::database()->FetchRow();
        $text = $forum_lang['delete_topic'] . ' "' . SafeDB($topic['title'], 255, str) . '"?';
        System::site()->AddTextBox($forum_lang['forum'], '<p align="center">' . $text . '</p>');
        System::site()->AddTemplatedBox('', 'module/forum_delete_post.html');
        System::site()->AddBlock('delete_form', true, false, 'form');
        $vars = array();
        $vars['basket'] = System::config('forum/basket') == true;
        $vars['url'] = 'index.php?name=forum&op=deletetopic&topic=' . SafeEnv($_GET['topic'], 11, int) . '&ok=1';
        // Без UFU
        System::site()->Blocks['delete_form']['vars'] = $vars;
        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 ($topic['delete'] == '1') {
        // Удалена в корзину
        System::site()->AddTextBox($forum_lang['error'], $forum_lang['topic_basket']);
        return;
    }
    // Удаление
    if (System::config('forum/basket')) {
        // Удаляем тему в корзину
        $reason = '';
        if (isset($_POST['text'])) {
            $reason = SafeEnv($_POST['text'], 255, str);
        }
        Moderation_Do_Basket_Topic($topic_id, $reason);
    } else {
        ForumAdminDeleteTopic($topic_id);
    }
    // Форум (Изменяем счетчики количества тем и сообщений, устанавливаем информацию о последнем посте)
    $forum_id = SafeEnv($topic['forum_id'], 11, int);
    System::database()->Select('forums', "`id`='{$forum_id}'");
    if (System::database()->NumRows() == 0) {
        System::site()->AddTextBox($forum_lang['error'], $forum_lang['error_no_forum']);
        return;
    }
    $forum = System::database()->FetchRow();
    // Значения счётчиков форума
    $forum_topics = (int) $forum['topics'] - 1;
    if ($forum_topics < 0) {
        $forum_topics = 0;
    }
    $forum_posts = (int) $forum['posts'] - (int) $topic['posts'];
    if ($forum_posts < 0) {
        $forum_posts = 0;
    }
    $forum_set = "`topics`='{$forum_topics}',`posts`='{$forum_posts}'";
    // Устанавливаем информацию о последнем посте в форуме
    if ($forum['last_id'] == $topic_id) {
        // Только если удалена тема с последним постом
        $forum_set = ForumSetLastTopic($forum_id, $forum_set, true);
    }
    System::database()->Update('forums', $forum_set, "`id`= '{$forum_id}'");
    // Очищаем кэш форума
    ForumCacheClear();
    GO(Ufu('index.php?name=forum&op=showforum&forum=' . $forum_id, 'forum/{forum}/'));
}
function IndexMailSubscribe()
{
    global $mail_selected;
    if (isset($_POST['topic_id'])) {
        $topic_id = SafeEnv($_POST['topic_id'], 11, int);
        if (!isset($_POST['mail_block_form'])) {
            GO(GetSiteUrl() . Ufu('index.php?name=mail&op=topics', 'mail/{op}/'));
        }
        $html = SafeEnv($_POST['html'], 1, int);
    } elseif (isset($_GET['topic_id'])) {
        $topic_id = SafeEnv($_GET['topic_id'], 11, int);
        $html = 1;
    } else {
        GO(GetSiteUrl() . Ufu('index.php?name=mail&op=topics', 'mail/{op}/'));
    }
    System::database()->Delete('mail_list', "`email`='{$mail_selected}' and `topic_id`='{$topic_id}'");
    if (System::user()->Auth) {
        $user_id = System::user()->Get('u_id');
    } else {
        $user_id = 0;
    }
    System::database()->Select('mail_topics', "`id`='{$topic_id}'");
    $topic = System::database()->FetchRow();
    $count = SafeDB($topic['count'], 11, int) + 1;
    System::database()->Update('mail_topics', "count='{$count}'", "`id`='{$topic_id}'");
    $vals = Values($user_id, $topic_id, $mail_selected, $html);
    System::database()->Insert('mail_list', $vals);
    $back = Ufu('index.php?name=mail&op=topics', 'mail/{op}/');
    System::site()->AddTextBox('Рассылки', '<p align="center"><br>Спасибо, что Вы подписались на нашу рассылку.<br>Список других рассылок сайта можете посмотреть <a href="' . $back . '">Здесь</a>.<br><br><a href="javascript:history.go(-1)">Вернуться назад</a>.<br><br></p>');
}
function AdminArticlesChangeStatus()
{
    global $editarticles;
    if (!$editarticles) {
        if (IsAjax()) {
            exit("ERROR");
        }
        System::admin()->AccessDenied();
    }
    if (!isset($_GET['id'])) {
        if (IsAjax()) {
            exit("ERROR");
        }
        GO(ADMIN_FILE . '?exe=articles');
    }
    System::database()->Select('articles', "`id`='" . SafeEnv($_GET['id'], 11, int) . "'");
    if (System::database()->NumRows() > 0) {
        $r = System::database()->FetchRow();
        if ($r['active'] == 1) {
            $en = '0';
            AdminArticlesGetTree()->CalcFileCounter($r['cat_id'], false);
        } else {
            $en = '1';
            AdminArticlesGetTree()->CalcFileCounter($r['cat_id'], true);
        }
        System::database()->Update('articles', "`active`='{$en}'", "`id`='" . SafeEnv($_GET['id'], 11, int) . "'");
        Audit('Статьи: Изменение статуса статьи "' . $r['title'] . '"');
    }
    if (IsAjax()) {
        exit("OK");
    }
    GO(ADMIN_FILE . '?exe=articles');
}
function AdminUserDeleteAvatar()
{
    if (isset($_GET['personal'])) {
        $dir = System::config('general/personal_avatars_dir');
        $personal = true;
    } else {
        $dir = System::config('general/avatars_dir');
        $personal = false;
    }
    $avatar = SafeEnv($_GET['filename'], 250, str);
    $filename = RealPath2($dir . $avatar);
    if (file_exists($filename) && is_file($filename)) {
        unlink($filename);
    }
    if ($personal) {
        System::database()->Update('users', "`a_personal`='0',`avatar`=''", "`a_personal`='1' and `avatar`='{$avatar}'");
    }
    Audit('Пользователи: Удаление аватара "' . $filename . '"');
    GO(ADMIN_FILE . '?exe=user&a=avatars');
}
function IndexUserActivate()
{
    if (isset($_GET['code'])) {
        $code = SafeEnv($_GET['code'], 32, str);
        System::database()->Select('users', "`activate`='" . $code . "'");
        if (System::database()->NumRows() > 0) {
            $activation_user = System::database()->FetchRow();
            System::database()->Update('users', "`active`='1',`activate`=''", "`id`='" . SafeDB($activation_user['id'], 11, int) . "'");
            // Автоматический вход
            if (System::user()->isDef('activate_ps')) {
                $pass = base64_decode(System::user()->Get('activate_ps'));
                System::user()->Login($activation_user['login'], $pass, true);
                System::user()->UnDef('activate_ps');
                System::site()->InitVars();
                UserSendEndRegMail($activation_user['email'], $activation_user['name'], $activation_user['login'], $pass, $activation_user['regdate']);
            }
            System::site()->AddTextBox('Информация', '<p align="center">Ваш аккаунт активирован. Вы успешно авторизовались на сайте.</p>');
        } else {
            System::site()->AddTextBox('Ошибка', '<p align="center">Неверный код активации.</p>');
        }
    } else {
        GO(Ufu('index.php'));
    }
}
function CommentsAddPost($ObjectId, $CommentsTable, $ObjectsTable, $CounterField, $AlloyField, $BackUrl, $BackUrlUfu, $PageParam = 'page', $PageParamUfu = null, $BackUrlUfuSuffix = '')
{
    $parent_id = explode('_', $_POST['parent_id'], 2);
    if ($parent_id[1] == 0) {
        $sp = false;
    } else {
        $sp = true;
    }
    if (!isset($PageParamUfu)) {
        $PageParamUfu = $PageParam;
    }
    $back_url = GetSiteUrl() . Ufu($BackUrl . ($sp ? "&{$PageParam}=" . $_GET[$PageParam] : ''), $BackUrlUfu . ($sp ? $PageParamUfu . '{' . $PageParam . '}' : '') . $BackUrlUfuSuffix);
    // -----------------------------------------------------
    System::database()->Select($ObjectsTable, "`id`='{$ObjectId}'");
    $obj = System::database()->FetchRow();
    $alloy_comments = $obj[$AlloyField] == '1';
    $posts = new Posts($CommentsTable, $alloy_comments);
    if ($posts->SavePost($ObjectId, false)) {
        $post_id = System::database()->GetLastId();
        $counter = $obj[$CounterField] + 1;
        System::database()->Update($ObjectsTable, "`{$CounterField}`='{$counter}'", "`id`='{$ObjectId}'");
        $parent_id = explode('_', $_POST['parent_id'], 2);
        $parent_id = SafeDB($parent_id[1], 11, int);
        $post_anchor = $parent_id != 0 ? "#post_{$parent_id}" : '#post_' . $post_id;
        GO($back_url . $post_anchor);
    } else {
        System::site()->AddTextBox('Ошибка', $posts->PrintErrors());
    }
}
/**
 * Сохраняет данные формы сгенерированной фукцией AdminUserEditor
 *
 * @param  $back_link
 * @param string $a
 * @param int $id
 * @param bool $IsAdmin
 * @return void
 */
function AdminUserEditSave($back_link, $a = 'insert', $id = 0, $IsAdmin = false)
{
    $SystemAdmin = System::user()->isSuperUser();
    $edit = $a == 'update';
    $editProfile = $edit && !$SystemAdmin && $id == System::user()->Get('u_id');
    // Администратор редактирует свой профиль
    $editStatus = false;
    // Разрешено редактирование статуса
    $editType = false;
    // Разрешено редактировать тип пользователя
    // Загружаем данные пользователя из БД
    if ($edit) {
        $user = System::database()->SelectOne('users', "`id`='{$id}'" . ($IsAdmin ? " and `type`='1'" : " and `type`='2'"));
        if (!$user) {
            AddTextBox('Ошибка', '<p align="center">Пользователь не найден, либо у вас не достаточно прав для редактирования администраторов.</p>');
            return;
        }
    }
    // Устанавливаем ограничения доступа
    if ($IsAdmin) {
        // Редактируем администратора
        if ($SystemAdmin) {
            // Только системные администраторы могут редактировать статус и тип администраторов
            if (!$edit) {
                $editStatus = true;
            } elseif (!(groupIsSystem(SafeEnv($user['access'], 11, int)) && GetSystemAdminsCount() <= 1)) {
                // Если он не системный или системных больше 1
                $editStatus = true;
            }
            $editType = $editStatus;
        }
    } else {
        // Если пользователь
        $editStatus = true;
        // Все администраторы с доступом могут редактировать статус пользователя
        $editType = $SystemAdmin;
        // Только системные администраторы могут создавать администраторов
    }
    // Обрабатываем данные
    $errors = array();
    // Логин
    if (isset($_POST['login']) && CheckLogin($_POST['login'], $errors, !$edit)) {
        $login = SafeEnv($_POST['login'], 30, str);
    } else {
        $login = '';
    }
    // Пароль
    $pass = '';
    if (!$edit || $_POST['pass'] != '') {
        $pass_generate_message = '';
        if (isset($_POST['pass']) && CheckPass($_POST['pass'], $errors)) {
            $pass = SafeEnv($_POST['pass'], 30, str);
            if (!isset($_POST['rpass']) || SafeEnv($_POST['rpass'], 30, str) != $pass) {
                $errors[] = 'Пароли не совпадают.';
            }
        } else {
            $pass = '';
        }
        if (isset($_POST['pass']) && $_POST['pass'] == '') {
            srand(time());
            $pass = GenBPass(rand(System::config('user/pass_min_length'), 15));
            $pass_generate_message = '<br />Так как вы не указали пароль, он был сгенерирован автоматически и выслан на указанный E-mail пользователя.';
        }
        $pass2 = md5($pass);
    }
    // e-mail
    if (isset($_POST['email']) && $_POST['email'] != '') {
        if (!CheckEmail($_POST['email'])) {
            $errors[] = 'Не правильный формат E-mail. Он должен быть вида: <b>domain@host.ru</b> .';
        }
        $email = SafeEnv($_POST['email'], 50, str, true);
    } else {
        $email = '';
        $errors[] = 'Вы не ввели E-mail.';
    }
    // Скрыть e-mail
    if (isset($_POST['hideemail'])) {
        $hide_email = '1';
    } else {
        $hide_email = '0';
    }
    // Имя пользователя на сайте
    if (isset($_POST['nikname']) && CheckNikname($_POST['nikname'], $errors, !$edit)) {
        $nik_name = SafeEnv($_POST['nikname'], 50, str, true);
    } else {
        $nik_name = '';
    }
    // Полное имя
    if (isset($_POST['realname'])) {
        $real_name = SafeEnv($_POST['realname'], 250, str, true);
    } else {
        $real_name = '';
    }
    // Возраст
    if (isset($_POST['age'])) {
        if ($_POST['age'] == '' || is_numeric($_POST['age'])) {
            $age = SafeEnv($_POST['age'], 3, int);
        } else {
            $errors[] = 'Ваш возраст должен быть числом!';
        }
    } else {
        $age = '';
    }
    // Домашняя страница
    if (isset($_POST['homepage'])) {
        if ($_POST['homepage'] != '' && substr($_POST['homepage'], 0, 7) == 'http://') {
            $_POST['homepage'] = substr($_POST['homepage'], 7);
        }
        $homepage = SafeEnv($_POST['homepage'], 250, str, true);
    } else {
        $homepage = '';
    }
    // Номер ICQ
    if (isset($_POST['icq'])) {
        if ($_POST['icq'] == '' || is_numeric($_POST['icq'])) {
            $icq = SafeEnv($_POST['icq'], 15, str, true);
        } else {
            $errors[] = 'Номер ICQ должен содержать только числа!';
        }
    } else {
        $icq = '';
    }
    // Город
    if (isset($_POST['city'])) {
        $city = SafeEnv($_POST['city'], 100, str, true);
    } else {
        $city = '';
    }
    // Часовой пояс
    if (isset($_POST['gmt'])) {
        $gmt = SafeEnv($_POST['gmt'], 255, str);
    } else {
        $gmt = System::config('general/default_timezone');
    }
    // О себе
    if (isset($_POST['about'])) {
        $about = SafeEnv($_POST['about'], System::config('user/about_max_length'), str, true);
    } else {
        $about = '';
    }
    // Подписка на новости
    if (isset($_POST['snews'])) {
        $server_news = '1';
    } else {
        $server_news = '0';
    }
    //Обрабатываем аватар
    $updateAvatar = true;
    if (isset($_POST['avatar'])) {
        if (System::config('user/avatar_transfer') == '1' && isset($_FILES['upavatar']) && file_exists($_FILES['upavatar']['tmp_name'])) {
            if ($edit) {
                $avatar = $user['avatar'];
                $a_personal = $user['a_personal'];
            } else {
                $avatar = '';
                $a_personal = '0';
            }
            UserLoadAvatar($errors, $avatar, $a_personal, $avatar, $a_personal, $edit);
        } elseif ($_POST['avatar'] == '') {
            $updateAvatar = false;
        } elseif (file_exists(RealPath2(System::config('general/avatars_dir') . $_POST['avatar']))) {
            if ($edit) {
                if ($user['a_personal'] == '1') {
                    UnlinkUserAvatarFiles($user['avatar']);
                }
            }
            $a_personal = '0';
            $avatar = $_POST['avatar'];
        } else {
            $avatar = '';
            $a_personal = '0';
        }
    } else {
        $avatar = '';
        $a_personal = '0';
    }
    $SendActivation = false;
    if ($edit) {
        $active = SafeEnv($user['active'], 11, int);
        $code = SafeEnv($user['activate'], 11, int);
    } else {
        $active = '1';
        $code = '';
    }
    if ($editStatus) {
        $activate = $_POST['activate'];
        $lastactivate = 'manual';
        if ($active == '0' && $code != '') {
            $lastactivate = 'mail';
        } elseif ($active == '1' && $code == '') {
            $lastactivate = 'auto';
        }
        if ($activate != $lastactivate) {
            switch ($activate) {
                case 'manual':
                    $active = '0';
                    $code = '';
                    $SendActivation = false;
                    break;
                case 'auto':
                    $active = '1';
                    $code = '';
                    $SendActivation = false;
                    break;
                case 'mail':
                    $active = '0';
                    $code = GenRandomString(8, 'qwertyuiopasdfghjklzxcvbnm');
                    $SendActivation = true;
                    break;
            }
        }
    }
    if ($edit) {
        $access = SafeEnv($user['type'], 11, int);
        $user_type = SafeEnv($user['access'], 11, int);
    } else {
        $access = '2';
        $user_type = '-1';
    }
    if ($editType && $_POST['status'] != 'member') {
        $access = '1';
        $user_type = SafeEnv($_POST['status'], 11, int);
    }
    $reg_date = time();
    $last_visit = time();
    $ip = getip();
    $points = 0;
    $visits = 0;
    if ($SendActivation) {
        UserSendActivationMail($nik_name, $email, $login, $pass, $code, $reg_date);
    } elseif (!$edit) {
        UserSendEndRegMail($email, $nik_name, $login, $pass, $reg_date);
    }
    if (!$edit) {
        $values = Values('', $login, $pass2, $nik_name, $real_name, $age, $email, $hide_email, $city, $icq, $homepage, $gmt, $avatar, $about, $server_news, $reg_date, $last_visit, $ip, $points, $visits, $active, $code, $access, $user_type, $a_personal, serialize(array()));
        System::database()->Insert('users', $values);
    } else {
        $set = "`login`='{$login}',`email`='{$email}',`hideemail`='{$hide_email}',`name`='{$nik_name}'," . "`truename`='{$real_name}',`age`='{$age}',`url`='{$homepage}',`icq`='{$icq}',`city`='{$city}'," . "`timezone`='{$gmt}'" . ($updateAvatar == true ? ",`avatar`='{$avatar}',`a_personal`='{$a_personal}'" : '') . "," . "`about`='{$about}',`servernews`='{$server_news}'" . ($pass != '' ? ",`pass`='{$pass2}'" : '') . ",`type`='{$access}'," . "`access`='{$user_type}',`active`='{$active}',`activate`='{$code}'";
        System::database()->Update('users', $set, "`id`='" . $id . "'");
        System::user()->UpdateMemberSession();
        UpdateUserComments($id, $id, $nik_name, $email, $hide_email, $homepage);
    }
    if (count($errors) > 0) {
        $text = 'Аккаунт сохранен, но имели место следующие ошибки:<br /><ul>';
        foreach ($errors as $error) {
            $text .= '<li>' . $error;
        }
        $text .= '</ul>';
        AddTextBox('Внимание', $text);
    } else {
        // Очищаем кэш пользователей
        System::cache()->Delete(system_cache, 'users');
        if (!$editProfile) {
            GO(ADMIN_FILE . '?exe=' . $back_link);
        } else {
            System::admin()->AddCenterBox('Редактирование профиля');
            System::admin()->Highlight('Ваш профиль сохранён, обновите страницу.');
        }
    }
}
function AdminGalleryImageRotate()
{
    global $GalleryDir, $ThumbsDir;
    $turn = $_GET['turn'];
    $id = SafeEnv($_GET['id'], 11, int);
    $angle = 0;
    if ($turn == 'left') {
        $angle = 90;
    } else {
        $angle = 270;
    }
    System::database()->Select('gallery', "`id`='{$id}'");
    $img = System::database()->FetchRow();
    $file_name = $img['file'];
    $file = $GalleryDir . $file_name;
    $thumb = $ThumbsDir . $file_name;
    // Поворачиваем изображение
    $pic = new TPicture($file);
    $pic->Rotate($angle);
    $pic->SaveToFile($file);
    // Обновляем эскиз
    if (is_file($thumb)) {
        unlink($thumb);
    }
    CreateThumb($file, $thumb, System::config('gallery/thumb_max_width'), System::config('gallery/thumb_max_height'));
    Audit('Фотогалерея: Поворот изображения ' . ($turn == 'left' ? 'влево' : 'вправо') . ' "' . $img['title'] . '" (id: ' . $img['id'] . ')');
    $back = new Url(GetRefererUrl($_REQUEST['back']));
    $back['update'] = SafeDB($_GET['id'], 11, int);
    // Добавляем / изменяем параметр update
    GO($back);
}
function AdminBlocksMove()
{
    $move = SafeEnv($_GET['to'], 4, str);
    $id = SafeEnv($_GET['id'], 11, int);
    System::database()->Select('blocks', "`id`='" . $id . "'");
    if (System::database()->NumRows() > 0) {
        $block = System::database()->FetchRow();
        $pos = SafeDB($block['place'], 255, str);
        $blocks = System::database()->Select('blocks', "`position`='" . SafeDB($block['position'], 1, str) . "'");
        usort($blocks, 'AdminBlocksSort');
        $c = count($blocks);
        $cur_pos = 0;
        for ($i = 0; $i < $c; $i++) {
            $blocks[$i]['place'] = $i;
            if ($blocks[$i]['id'] == $id) {
                $cur_pos = $i;
            }
        }
        //Индекс перемещения
        $rep_pos = $cur_pos;
        if ($move == 'up') {
            $rep_pos = $cur_pos - 1;
        } elseif ($move == 'down') {
            $rep_pos = $cur_pos + 1;
        } else {
            $rep_pos = $cur_pos;
        }
        if ($rep_pos < 0 || $rep_pos >= $c) {
            $rep_pos = $cur_pos;
        }
        $temp = intval($blocks[$cur_pos]['place']);
        $blocks[$cur_pos]['place'] = intval($blocks[$rep_pos]['place']);
        $blocks[$rep_pos]['place'] = intval($temp);
        //Обновляем данные
        for ($i = 0; $i < $c; $i++) {
            System::database()->Update('blocks', "place='" . SafeDB($blocks[$i]['place'], 11, int) . "'", "`id`='" . SafeDB($blocks[$i]['id'], 11, int) . "'");
        }
    }
    Audit('Блока: Перемещение блока ' . ($move == 'up' ? 'вверх' : 'вниз') . ' "' . $block['title'] . '"');
    GO(ADMIN_FILE . '?exe=blocks');
}
function AdminNewsTopicSave()
{
    global $news_access_edittopics, $action;
    if (!$news_access_edittopics) {
        System::admin()->AccessDenied();
    }
    $image = SafeEnv($_POST['topic_image'], 255, str, true);
    if ($action == 'addtopic') {
        $values = Values('', SafeEnv($_POST['topic_name'], 255, str), SafeEnv($_POST['topic_description'], 255, str), $image, '0');
        System::database()->Insert('news_topics', $values);
        Audit('Новости: Добавление новостного раздела "' . $_POST['topic_name'] . '"');
    } elseif ($action == 'savetopic') {
        $id = SafeEnv($_GET['id'], 11, int);
        System::database()->Select('news_topics', "`id`='" . $id . "'");
        $topic = System::database()->FetchRow();
        $values = Values('', SafeEnv($_POST['topic_name'], 255, str), SafeEnv($_POST['topic_description'], 255, str), $image, SafeEnv($topic['counter'], 11, int));
        System::database()->Update('news_topics', $values, "`id`='{$id}'", true);
        Audit('Редактирование новостного раздела "' . $_POST['topic_name'] . '"');
    }
    GO(ADMIN_FILE . '?exe=news&a=topics');
}
function AdminExtensionsConfigSave()
{
    $post = SafeR('view', 255, str) + SafeR('name, theme', 255, str) + SafeR('enabled', 3, onoff);
    $post['view'] = ViewLevelToInt($post['view']);
    System::database()->Update('modules', MakeSet($post), "`folder`='" . SafeEnv($_GET['name'], 255, str) . "'");
    Audit('Расширения: Изменение настроек модуля "' . $_GET['name'] . '"');
    GO(ADMIN_FILE . '?exe=extensions');
}
function AdminCommentsFind()
{
    if (System::config('comments/disable_posts_engine')) {
        System::admin()->AddCenterBox('Ошибка');
        System::admin()->HighlightError('Система комментариев отключена.');
        return;
    }
    // Рекурсивная функция для поиска родителя комментария верхнего уровня
    function CommentsFindTopLevelPost(&$posts, $post_id, $post_parent_id)
    {
        if (isset($posts[$post_parent_id])) {
            if ($posts[$post_parent_id]['post_parent_id'] == 0) {
                return $posts[$post_parent_id]['id'];
            }
            return CommentsFindTopLevelPost($posts, $posts[$post_parent_id]['id'], $posts[$post_parent_id]['post_parent_id']);
        } else {
            return $post_id;
        }
    }
    // id таблицы комментариев в таблице comments и id комментария
    $table_id = SafeEnv($_GET['table'], 11, int);
    $post_id = SafeEnv($_GET['post_id'], 11, int);
    System::database()->Select('comments', "`id`='{$table_id}'");
    if (!System::database()->NumRows()) {
        System::admin()->AddCenterBox('Ошибка');
        System::admin()->HighlightError('Таблица комментариев не найдена.');
        return;
    }
    $table = System::database()->FetchRow();
    // Загружаем комментарий
    System::database()->Select($table['table'], "`id`='{$post_id}'");
    if (!System::database()->NumRows()) {
        System::admin()->AddCenterBox('Ошибка');
        System::admin()->HighlightError('Комментарий не найден.');
        return;
    }
    $post = System::database()->FetchRow();
    // Загружаем объект комментария
    $id_coll = SafeEnv($table['id_coll'], 255, str);
    $object_id = SafeEnv($post['object_id'], 11, int);
    System::database()->Select($table['objects_table'], "`{$id_coll}`='{$object_id}'");
    if (!System::database()->NumRows()) {
        System::admin()->AddCenterBox('Ошибка');
        System::admin()->HighlightError('Объект комментария не найден.');
        return;
    }
    $object = System::database()->FetchRow();
    $en_navigation = System::config('comments/ennav');
    $navigation_page = 1;
    if ($en_navigation) {
        // Включена постраничная навигация в комментариях
        // Количество комментарий на страницу
        $comments_on_page = System::config('comments/onpage');
        // Загружаем комментарии объекта
        $object_postsdb = System::database()->Select($table['table'], "`object_id`='{$object_id}'");
        SortArray($object_postsdb, 'post_date', !System::config('comments/decreasesort'));
        if (count($object_postsdb) <= $comments_on_page) {
            // Навигация не требуется
            $en_navigation = false;
        } else {
            // Определяем страницу на котором отображается комментарий
            if ($post['post_parent_id'] == 0) {
                // Комментарий верхнего уровня
                $post_top_id = $post_id;
            } else {
                // Поиск родительского комментария верхнего уровня
                // Агрегируем комментарии объекта по id
                $object_posts = array();
                foreach ($object_postsdb as $p) {
                    $object_posts[$p['id']] = $p;
                }
                $post_top_id = CommentsFindTopLevelPost($object_posts, $post_id, $post['post_parent_id']);
            }
            // Берём только комментарии верхнего уровня
            $object_top_posts = array();
            foreach ($object_postsdb as $p) {
                if ($p['post_parent_id'] == 0) {
                    $object_top_posts[$p['id']] = true;
                }
            }
            // Узнаём порядковый номер post_top_id
            $index = array_search($post_top_id, array_keys($object_top_posts));
            $navigation_page = ceil(($index + 1) / $comments_on_page);
            // Определили страницу
            if ($navigation_page > 1) {
                $en_navigation = true;
            }
        }
    }
    if (System::config('general/ufu')) {
        if ($en_navigation) {
            $url_template = $table['nav_ufu'];
        } else {
            $url_template = $table['ufu'];
        }
    } else {
        $url_template = $table['url'];
        if ($en_navigation) {
            $url_template .= '&' . urlencode($table['page_param']) . '=' . $navigation_page;
        }
    }
    // Парсим шаблон URL
    $keys = array();
    foreach ($object as $key => &$val) {
        $val = urlencode($val);
        $keys['{' . $key . '}'] =& $val;
    }
    $keys['{' . $table['page_param'] . '}'] = $navigation_page;
    $url = str_replace(array_keys($keys), array_values($keys), $url_template);
    GO($url . '#post_' . $post_id);
}
function IndexForumAddPost()
{
    global $forum_lang;
    $forums_tree = ForumTree::Instance();
    // Проверки на доступ
    if (CheckGet('topic')) {
        // Тема
        $topic_id = SafeEnv($_GET['topic'], 11, int);
        System::database()->Select('forum_topics', "`id`='{$topic_id}'");
        if (System::database()->NumRows() > 0) {
            $topic = System::database()->FetchRow();
        } else {
            System::site()->AddTextBox($forum_lang['error'], $forum_lang['error_access_category']);
            return;
        }
        if ($topic['delete'] == '1') {
            // Тема на удалении
            System::site()->AddTextBox($forum_lang['error'], $forum_lang['topic_basket'] . '.' . $forum_lang['no_topic_basket_edit']);
            return;
        }
        if ($topic['close_topics'] == '1') {
            // Тема закрыта
            System::site()->AddTextBox($forum_lang['error'], $forum_lang['topic_close_for_discussion'] . '.' . $forum_lang['no_create_new_message_current_topic_add']);
            return;
        }
        // Форум
        $forum_id = SafeEnv($topic['forum_id'], 11, int);
        if (!isset($forums_tree->IdCats[$forum_id])) {
            System::site()->AddTextBox($forum_lang['error'], $forum_lang['error_data']);
            return;
        }
        $forum = $forums_tree->IdCats[$forum_id];
        $forum_config = $forums_tree->GetForumConfigRecursive($forum_id);
        if (!$forum_config['access']) {
            // Доступ
            System::site()->AddTextBox($forum_lang['error'], $forum_config['access_reason']);
            return;
        } elseif (!$forum_config['add_post']) {
            // Разрешено ли добавлять новые сообщения (+ защита от гостей)
            System::site()->AddTextBox($forum_lang['error'], $forum_config['add_post_reason']);
            return;
        }
    } else {
        System::site()->AddTextBox($forum_lang['error'], $forum_lang['error_data']);
        return;
    }
    // Добавляем сообщение
    if (!CheckPost('text') || strlen($_POST['text']) == 0) {
        System::site()->AddTextBox($forum_lang['error'], $forum_lang['error_data']);
        return;
    }
    $name = System::user()->Get('u_name');
    $email = System::user()->Get('u_email');
    $hideemail = System::user()->Get('u_hideemail');
    $site = System::user()->Get('u_homepage');
    $icq = System::user()->Get('u_icq');
    $uid = System::user()->Get('u_id');
    $text = SafeEnv($_POST['text'], 0, str);
    $vals = Values('', $topic_id, $uid, time(), $name, $site, $email, $hideemail, $icq, $text, getip(), 0);
    System::database()->Insert('forum_posts', $vals);
    // Обновляем время прочтения темы автором сообщения
    $user_id = System::user()->Get('u_id');
    System::database()->Delete('forum_topics_read', "`tid`='{$topic_id}' and `mid`='{$user_id}'");
    $time = time();
    $vals = "'{$user_id}','{$topic_id}','{$time}'";
    System::database()->Insert('forum_topics_read', $vals);
    // Информация о последнем сообщении в теме и форуме
    $forum['posts'] = (int) $forum['posts'] + 1;
    $topic['posts'] = (int) $topic['posts'] + 1;
    IndexForumSetLastPostInfo($forum, $topic);
    // Добавляем очков пользователю
    System::user()->ChargePoints(System::config('points/forum_post'));
    // Увеличиваем счётчик сообщений пользователя
    ForumCalcUserCounters(1);
    // Делаем рассылку подписчикам на эту тему
    Forum_Subscription_Send($topic_id);
    // Очищаем кэш форума
    ForumCacheClear();
    GO(Ufu('index.php?name=forum&op=showtopic&topic=' . $topic_id . '&view=lastpost#last', 'forum/topic{topic}-new.html'));
}
function IndexForumDeletePost()
{
    global $forum_lang;
    if (!System::user()->isAdmin() || !CheckGet('topic', 'post', 'ok')) {
        HackOff();
        return;
    }
    if (isset($_GET['page']) && $_GET['page'] > 1) {
        $page = '&page=' . SafeDB($_GET['page'], 11, int);
        $page_ufu = '-{page}';
    } else {
        $page = '';
        $page_ufu = '';
    }
    // Подтверждение на удаление
    if (!isset($_GET['ok']) || !isset($_POST['text']) && System::config('forum/basket') || $_GET['ok'] == '0') {
        $text = '<br>' . $forum_lang['delete_post'] . '?';
        System::site()->AddTextBox($forum_lang['forum'], '<p align="center">' . $text . '</p>');
        System::site()->AddTemplatedBox('', 'module/forum_delete_post.html');
        System::site()->AddBlock('delete_form', true, false, 'form');
        $vars = array();
        $vars['basket'] = System::config('forum/basket');
        $vars['url'] = 'index.php?name=forum&op=deletepost&topic=' . SafeDB($_GET['topic'], 11, int) . '&post=' . SafeDB($_GET['post'], 11, int) . $page . '&ok=1';
        // Без UFU
        System::site()->Blocks['delete_form']['vars'] = $vars;
        return;
    }
    // Сообщение
    $post_id = SafeEnv($_GET['post'], 11, int);
    System::database()->Select('forum_posts', "`id`='{$post_id}'");
    if (System::database()->NumRows() == 0) {
        System::site()->AddTextBox($forum_lang['error'], $forum_lang['error_no_post']);
        return;
    }
    $post = System::database()->FetchRow();
    if ($post['delete'] == '1') {
        // На удалении
        System::site()->AddTextBox($forum_lang['error'], $forum_lang['post_basket']);
        return;
    }
    // Тема
    $topic_id = SafeEnv($_GET['topic'], 11, int);
    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 ($topic['delete'] == '1') {
        // Тема на удалении
        System::site()->AddTextBox($forum_lang['error'], $forum_lang['topic_basket']);
        return;
    }
    // Форум
    $forum_id = SafeEnv($topic['forum_id'], 11, int);
    System::database()->Select('forums', "`id`='{$forum_id}'");
    if (System::database()->NumRows() == 0) {
        System::site()->AddTextBox($forum_lang['error'], $forum_lang['error_no_forum']);
        return;
    }
    $forum = System::database()->FetchRow();
    // Удаление поста
    if (System::config('forum/basket')) {
        // Удаляем сообщение в корзину
        $reason = '';
        if (isset($_POST['text'])) {
            $reason = SafeEnv($_POST['text'], 255, str);
        }
        Moderation_Do_Basket_Post($post_id, $reason);
    } else {
        ForumAdminDeletePost($post_id);
    }
    // Обновляем тему
    $topic_posts = (int) $topic['posts'] - 1;
    if ($topic_posts < 0) {
        $topic_posts = 0;
    }
    $topic_set = "`posts`='{$topic_posts}'";
    $topic_extra_set = false;
    // Удаляется последний пост в теме (нужно ли обновлять последний пост в форуме)
    if ($topic['last_post'] == $post['public'] && $topic['last_poster_id'] == $post['user_id']) {
        $topic_extra_set = true;
        $topic_set = ForumSetLastPost($topic_id, $topic_set, true);
    }
    System::database()->Update('forum_topics', $topic_set, "`id`='{$topic_id}'");
    // Обновляем форум
    $forum_posts = (int) $forum['posts'] - 1;
    if ($forum_posts < 0) {
        $forum_posts = 0;
    }
    $forum_set = "`posts`='{$forum_posts}'";
    if ($topic_extra_set) {
        // Только если удален последний пост в теме
        $forum_set = ForumSetLastTopic($forum_id, $forum_set, true);
    }
    System::database()->Update('forums', $forum_set, "`id`= '{$forum_id}'");
    // Очищаем кэш форума
    ForumCacheClear();
    GO(Ufu('index.php?name=forum&op=showtopic&topic=' . $topic_id . $page, 'forum/topic{topic}' . $page_ufu . '.html'));
}