/**
 * Загружает наcтройки из базы данных.
 *
 * @param        $ConfigVar Переменная в которую будут записаны настройки
 * @param string $ConfigTable
 * @param string $GroupsTable
 * @return void
 */
function LoadSiteConfig(&$ConfigVar, $ConfigTable = 'config', $GroupsTable = 'config_groups')
{
    if (System::cache()->HasCache('config', $ConfigTable)) {
        $ConfigVar = System::cache()->Get('config', $ConfigTable);
        return;
    }
    $temp = System::database()->Select($ConfigTable, "`autoload`='1'");
    foreach ($temp as $i) {
        $configs[$i['group_id']][] = $i;
    }
    // Вытаскиваем группы настроек
    $config_groups = System::database()->Select($GroupsTable, '');
    foreach ($config_groups as $group) {
        if (isset($configs[$group['id']])) {
            foreach ($configs[$group['id']] as $config) {
                $gname = $group['name'];
                $cname = $config['name'];
                $cvalue = $config['value'];
                $type = trim($config['type']);
                if ($type != '') {
                    $type = explode(',', $type);
                } else {
                    $type = array(255, 'string', 'false');
                }
                if ($type[0] > 0) {
                    $cvalue = substr($cvalue, 0, $type[0]);
                }
                if ($type[2] != 'false') {
                    $cvalue = HtmlChars(strip_tags($cvalue));
                }
                settype($cvalue, $type[1]);
                if ($cvalue === '' && ($type[1] == 'bool' || $type[1] == 'boolean')) {
                    $cvalue = '0';
                }
                $ConfigVar[$gname][$cname] = $cvalue;
            }
        }
    }
    System::cache()->Write('config', $ConfigTable, $ConfigVar);
}
function AdminExtensionsInstallList()
{
    global $config;
    $mod_dir = $config['mod_dir'];
    $plug_dir = $config['plug_dir'];
    $block_dir = $config['blocks_dir'];
    $temp_dir = $config['tpl_dir'];
    $list = array();
    $title = 'Установка расширений';
    System::admin()->AddSubTitle($title);
    // Загружаем информацию об установленных модулях
    $installed_mods = array();
    $installed_plugins = array();
    $installed_blocks = array();
    $installed_templates = array();
    System::database()->Select('modules');
    while ($mod = System::database()->FetchRow()) {
        $installed_mods[] = $mod['folder'];
    }
    System::database()->Select('plugins');
    while ($mod = System::database()->FetchRow()) {
        $installed_plugins[] = ($mod['group'] != '' ? $mod['group'] . '/' : '') . $mod['name'];
    }
    System::database()->Select('block_types');
    while ($mod = System::database()->FetchRow()) {
        $installed_blocks[] = $mod['folder'];
    }
    System::database()->Select('templates');
    while ($mod = System::database()->FetchRow()) {
        $installed_templates[] = $mod['folder'];
    }
    // Поиск модулей
    $mod_folders = GetFolders($mod_dir);
    foreach ($mod_folders as $folder) {
        if (!in_array($folder, $installed_mods)) {
            $info = ExtLoadInfo($mod_dir . $folder);
            if ($info !== false) {
                $info['type'] = EXT_MODULE;
                $info['path'] = $mod_dir . $folder . '/';
                $info['folder'] = $folder;
                if (is_file($info['path'] . 'install.php') && is_file($info['path'] . 'uninstall.php')) {
                    $list[] = $info;
                }
            }
        }
    }
    // Поиск плагинов
    $plug_folders = GetFolders($plug_dir);
    foreach ($plug_folders as $folder) {
        $info = false;
        if (is_file($plug_dir . $folder . '/info.php')) {
            // Возможно группа
            $info = ExtLoadInfo($plug_dir . $folder);
        }
        if (isset($info['1.3_old_plugins_group']) || $info === false) {
            // Группа
            $plug_folders2 = GetFolders($plug_dir . $folder . '/');
            foreach ($plug_folders2 as $folder2) {
                if (!in_array($folder . '/' . $folder2, $installed_plugins)) {
                    $info = ExtLoadInfo($plug_dir . $folder . '/' . $folder2);
                    if ($info !== false) {
                        $info['type'] = EXT_PLUGIN;
                        $info['path'] = $plug_dir . $folder . '/' . $folder2 . '/';
                        $info['group'] = $folder;
                        $info['folder'] = $folder2;
                        if (isset($info['1.3']) || is_file($info['path'] . 'install.php') && is_file($info['path'] . 'uninstall.php')) {
                            $list[] = $info;
                        }
                    }
                }
            }
        } else {
            // Отдельный плагин
            if (!in_array($folder, $installed_plugins)) {
                if ($info !== false) {
                    $info['type'] = EXT_PLUGIN;
                    $info['path'] = $plug_dir . $folder . '/';
                    $info['folder'] = $folder;
                    if (isset($info['1.3']) || is_file($info['path'] . 'install.php') && is_file($info['path'] . 'uninstall.php')) {
                        $list[] = $info;
                    }
                }
            }
        }
    }
    // Поиск блоков
    $block_folders = GetFolders($block_dir);
    foreach ($block_folders as $folder) {
        if (!in_array($folder, $installed_blocks)) {
            $info = ExtLoadInfo($block_dir . $folder);
            if ($info !== false) {
                $info['type'] = EXT_BLOCK;
                $info['path'] = $block_dir . $folder . '/';
                $info['folder'] = $folder;
                if (is_file($info['path'] . 'install.php') && is_file($info['path'] . 'uninstall.php')) {
                    $list[] = $info;
                }
            }
        }
    }
    // Поиск шаблонов
    $temp_folders = GetFolders($temp_dir);
    foreach ($temp_folders as $folder) {
        if (!in_array($folder, $installed_templates)) {
            $info = ExtLoadInfo($temp_dir . $folder);
            if ($info === false) {
                $info = array('name' => $folder, 'description' => '', 'author' => '', 'site' => '', 'version' => '1.0', 'admin' => false);
            }
            $info['type'] = EXT_TEMPLATE;
            $info['path'] = $temp_dir . $folder . '/';
            $info['folder'] = $folder;
            $list[] = $info;
        }
    }
    $count = count($list);
    $text = '<form action="' . ADMIN_FILE . '?exe=extensions&a=install" method="post">';
    $text .= '<table cellspacing="0" cellpadding="0" class="cfgtable">';
    $text .= '<tr><th>Установка</th><th>Тип</th><th>Имя</th><th>Описание</th><th>Автор</th><th>Сайт</th></tr>';
    if (count($list) > 0) {
        foreach ($list as $i => $ext) {
            switch ($ext['type']) {
                case 1:
                    if (is_file($ext['path'] . 'icon.png')) {
                        $type = '<img src="' . $ext['path'] . 'icon.png" title="Модуль">';
                    } else {
                        $type = '<img src="' . MOD_DIR . 'icon.png" title="Модуль">';
                    }
                    break;
                case 2:
                    $type = '<img src="images/plugins.png" title="Плагин">';
                    break;
                case 3:
                    $type = '<img src="images/blocks.png" title="Блок">';
                    break;
                case 4:
                    $type = '<img src="images/skins.png" title="Шаблон">';
                    break;
            }
            $text .= Indent('
				<tr>
					<td>' . System::site()->Check('install_' . $i, '1') . System::site()->Hidden('folder_' . $i, $ext['folder']) . System::site()->Hidden('type_' . $i, $ext['type']) . ($ext['type'] == EXT_PLUGIN && isset($ext['group']) ? System::site()->Hidden('group_' . $i, $ext['group']) : '') . '</td>
					<td>' . $type . '</td>
					<td>' . SafeDB($ext['name'], 255, str) . '</td>
					<td>' . (isset($ext['description']) && $ext['description'] != '' && $ext['description'] != ' - ' ? SafeDB($ext['description'], 255, str) : 'Нет описания') . '</td>
					<td>' . (isset($ext['author']) && $ext['author'] != '' ? SafeDB($ext['author'], 255, str) : '&nbsp;') . '</td>
					<td>' . (isset($ext['site']) && $ext['site'] != '' ? '<a href="' . HtmlChars($ext['site']) . '" title="' . HtmlChars($ext['site']) . '" target="_blank">Перейти</a>' : 'Нет') . '</td>
				</tr>
			');
        }
        $text .= '</table>';
        $text .= '<div style="margin-bottom: 25px;">' . System::site()->Hidden('count', $count) . System::site()->Submit('Установить выделенные') . '</div>';
        $text .= '</form>';
    } else {
        $text .= '<tr><td colspan="6" style="text-align: left;">Нет не установленных модулей.</td></tr>';
        $text .= '</table>';
        $text .= '</form>';
    }
    System::admin()->AddCenterBox($title . ' (' . $count . ' готово к установке)');
    System::admin()->AddText($text);
}
/*
 * LinkorCMS 1.4
 * © 2012 LinkorCMS Development Group
 */
define('RSS_SCRIPT', true);
define('VALID_RUN', true);
require 'config/init.php';
// Конфигурация и инициализация
@header("Content-Type: text/xml");
@header("Cache-Control: no-cache");
@header("Pragma: no-cache");
$rss_title = 'Новости на ' . System::config('general/site_url');
$rss_link = System::config('general/site_url');
$rss_description = 'RSS канал сайта ' . System::config('general/site_url') . '.';
$rss = new RssChannel($rss_title, $rss_link, $rss_description);
$rss->pubDate = gmdate('D, d M Y H:i:s') . ' GMT';
$rss->generator = CMS_NAME . ' ' . CMS_VERSION;
$rss->managingEditor = '*****@*****.**';
$rss->webMaster = System::config('general/site_email');
$num = 10;
// Пока максимум 10 заголовков по умолчанию
$news = System::database()->Select('news', "`enabled`='1'", $num, 'date', true);
foreach ($news as $s) {
    $title = SafeDB($s['title'], 255, str);
    $description = SafeDB($s['start_text'], 4048, str);
    $link = HtmlChars(GetSiteUrl() . Ufu('index.php?name=news&op=readfull&news=' . $s['id'] . '&topic=' . $s['topic_id'], 'news/{topic}/{news}/'));
    $pubDate = gmdate('D, d M Y H:i:s', $s['date']) . ' GMT';
    $rss->AddItem($title, $description, $link, $pubDate, $link);
}
echo $rss->Generate();
 /**
  * Выводит форму добавления или редактирования комментария.
  * @param bool        $Edit              Метод редактирования
  * @param string      $PostFormBlockName Имя блока для вывода формы
  */
 public function RenderForm($Edit = false, $PostFormBlockName = 'postsform')
 {
     if ($this->DisableComments) {
         System::site()->AddBlock($PostFormBlockName, false, false, 'form', $this->PostFormTemplate);
         return;
     } else {
         System::site()->AddBlock($PostFormBlockName, true, false, 'form', $this->PostFormTemplate);
     }
     if ($Edit && isset($_GET['post_id'])) {
         $post_id = SafeEnv($_GET['post_id'], 11, int);
     } elseif ($Edit && !isset($_GET['post_id'])) {
         ErrorHandler(USER_ERROR, 'Posts::PostForm(): post_id не инициализирована.', __FILE__);
         return;
     }
     if (!$Edit && !$this->AlloyComments) {
         $this->Alert($PostFormBlockName, 'Обсуждение закрыто');
         return;
     }
     if (!$Edit && !System::user()->Auth && !$this->GuestPost) {
         // Гость
         $this->Alert($PostFormBlockName, 'Гости не могут добавлять комментарии, войдите или зарегистрируйтесь.');
         return;
     }
     System::site()->AddVars('template', array('lang_posts_username' => 'Имя', 'lang_posts_useremail' => 'E-mail', 'lang_posts_hideemail' => 'Скрыть E-mail', 'lang_posts_userhomepage' => 'Сайт', 'lang_posts_posttitle' => 'Заголовок', 'lang_posts_postmessage' => 'Сообщение', 'lang_posts_cancel' => 'Отмена', 'lang_posts_canceltitle' => 'Вернуться к теме без сохранения изменений'));
     $back = '';
     if (!$Edit) {
         $back = '&back=' . SaveRefererUrl();
     }
     $vars = array();
     if ($Edit) {
         System::database()->Select($this->PostsTable, "`id`='{$post_id}'");
         $post = System::database()->FetchRow();
         if (System::user()->Auth) {
             $access = System::user()->Get('u_id') == $post['user_id'] || System::user()->isAdmin();
         } else {
             $access = $post['user_id'] == '0' && $post['user_ip'] == getip();
         }
         if (!$access) {
             $this->Alert($PostFormBlockName, 'У вас не достаточно прав!');
             return;
         }
         $vars['form_title'] = 'Редактирование сообщения';
         $vars['form_action'] = $this->PostFormAction . "&post_id={$post_id}" . $back;
         $vars['post_message'] = HtmlChars($post['post_message']);
         $vars['edit'] = true;
         System::site()->SetVar('template', 'lang_posts_submit', 'Сохранить');
         System::site()->SetVar('template', 'lang_posts_submittitle', 'Сохранить изменения и вернуться');
         $vars['visibility'] = 'visible';
     } else {
         $vars['form_title'] = 'Добавить комментарий';
         $vars['form_action'] = $this->PostFormAction . $back;
         $vars['post_title'] = '';
         $vars['post_message'] = '';
         $vars['edit'] = false;
         System::site()->SetVar('template', 'lang_posts_submit', 'Добавить');
         System::site()->SetVar('template', 'lang_posts_submittitle', 'Добавить новое сообщение');
         $vars['visibility'] = 'hidden';
     }
     $vars['add'] = !$vars['edit'];
     $vars['add_guest'] = (System::user()->AccessLevel() == 3 || System::user()->AccessLevel() == 4) && $vars['add'];
     $vars['show_kaptcha'] = $vars['add_guest'] || !System::user()->isAdmin() && $this->ShowKaptchaForMembers;
     $vars['kaptcha_url'] = 'index.php?name=plugins&amp;p=antibot';
     $vars['kaptcha_width'] = '120';
     $vars['kaptcha_height'] = '40';
     // Подключаем BBCode редактор
     IncludePluginsGroup('bbcode_editors');
     // Смайлики для формы
     $smilies = System::database()->Select('smilies', "`enabled`='1'");
     $vars['is_smilies'] = System::database()->NumRows() != 0;
     if ($vars['is_smilies']) {
         System::site()->AddBlock('smilies', true, true, 'smile');
         foreach ($smilies as $smile) {
             $smile['file'] = RealPath2(System::config('general/smilies_dir') . $smile['file']);
             $sub_codes = explode(',', SafeDB($smile['code'], 255, str));
             $smile['code'] = $sub_codes[0];
             System::site()->AddSubBlock('smilies', true, $smile);
         }
     } else {
         System::site()->AddBlock('smilies', true, false, 'smile', '', 'Смайликов пока нет.');
     }
     System::site()->Blocks[$PostFormBlockName]['vars'] = $vars;
 }
$where = '';
$where_url = '';
if ($action == 'editfield') {
    if (isset($_GET['where'])) {
        $where = $_GET['where'];
        $where_url = '&where=' . SafeDB($_GET['where'], 255, str);
    }
    $edit = true;
    $index = SafeEnv($_GET['index'], 255, int);
    $rows = System::database()->Select($table, $where);
    $row = $rows[$index];
}
$i = 0;
foreach ($columns as $col) {
    if ($edit) {
        $val = HtmlChars($row[$columns[$i]['name']]);
        $cap = 'Сохранить';
        $title = 'Редактирование записи';
    } else {
        $val = '';
        $cap = 'Добавить';
        $title = 'Добавление записи';
    }
    if (strtolower($col['type']) != 'text') {
        FormRow('<font color="#0000FF">' . (isset($col['auto_increment']) && $col['auto_increment'] == true ? '<u>' . $col['name'] . '</u>' : $col['name']) . '</font>' . '<br /><font color="#666666">' . $col['type'] . (isset($col['length']) ? '(' . $col['length'] . ')</font>' : '</font>'), System::admin()->Edit($col['name'], $val, false, 'style="width: 400px;"' . ($i == 0 ? ' class="autofocus"' : '')));
    } else {
        FormRow('<font color="#0000FF">' . $col['name'] . '</font>', System::admin()->TextArea($col['name'], $val, 'style="width: 400px; height: 200px;"' . ($i == 0 ? ' class="autofocus"' : '')));
    }
    $i++;
}
AddCenterBox($title);
/**
 * Фильтрует переменную для безопасного вывода ее содержимого в браузер пользователя.
 * Функция не добавляет экранирование, переменную отфильтрованную данной функцией опасно передавать в запрос к базе данных.
 * @param mixed $Var
 * @param int   $MaxLength
 * @param int   $Type
 * @param bool  $StripTags
 * @param bool  $SpecialChars
 * @param bool  $SafeXss
 * @return mixed
 */
function SafeDB($Var, $MaxLength, $Type, $StripTags = true, $SpecialChars = true, $SafeXss = true)
{
    if (is_array($Var)) {
        foreach ($Var as &$v) {
            if ($MaxLength > 0) {
                $v = substr($v, 0, $MaxLength);
            }
            $v = trim($v);
            if ($SafeXss) {
                SafeXSS($v);
            }
            if ($StripTags) {
                $v = strip_tags($v);
            }
            if ($SpecialChars) {
                $v = HtmlChars($v, ENT_QUOTES);
            }
            settype($v, $Type);
        }
    } else {
        if ($MaxLength > 0) {
            $Var = substr($Var, 0, $MaxLength);
        }
        $Var = trim($Var);
        if ($SafeXss) {
            SafeXSS($Var);
        }
        if ($StripTags) {
            $Var = strip_tags($Var);
        }
        if ($SpecialChars) {
            $Var = HtmlChars($Var, ENT_QUOTES);
        }
        settype($Var, $Type);
    }
    return $Var;
}
 /**
  * Устанавливает переменные страницы
  * @return void
  */
 protected function SetPage()
 {
     $this->AddVars('head', array('doctype' => $this->Doctype, 'title' => HtmlChars($this->GenerateTitle()), 'meta' => $this->GenerateMetaTags(), 'text' => $this->GenerateHead(), 'body_params' => $this->BodyParams, 'base' => GetSiteUrl()));
 }
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']);
}
/**
 * Выводит данные корзины для топика или поста.
 * @global type $forum_lang
 * @staticvar int $num_del
 * @staticvar null $clear_basket_days
 * @param type  $id         Идентификатор топика.
 * @param type  $text       Контент удаляемой темы.
 * @param type  $basket     Данные корзины.
 * @param type  $FullFormat В полном формате.
 * @return string
 */
function ForumBasketRender($id = 0, $text = '', &$basket = array(), $FullFormat = true)
{
    global $forum_lang;
    static $num_del = 0;
    static $clear_basket_days = null;
    if (!isset($clear_basket_days)) {
        $clear_basket_days = System::config('forum/clear_basket_day');
    }
    $num_del++;
    $id = SafeDB($id, 11, int);
    $del_admin = '';
    $del_reason = '';
    $del_time = '';
    // Кто удалил
    $admin_info = GetUserInfo($basket[$id]['user']);
    $del_admin = $forum_lang['deleted'] . ':<a href="index.php?name=user&op=userinfo&user='******'user'] . '"> ' . $admin_info['name'] . '</a>';
    // Время удаления (будет удалено навсегда)
    $del_time = $forum_lang['basket_delete_forever'] . ' ' . TimeRender($basket[$id]['date'] + 86400 * $clear_basket_days, false, false);
    // Причина удаления
    if (trim($basket[$id]['reason']) != '') {
        $del_reason = '<span style="color: #FF0000;">' . $forum_lang['reason'] . '</span>:' . ($FullFormat ? '<br>' : '&nbsp;') . BbCodePrepare($basket[$id]['reason']) . '<br>';
    }
    // Вывод
    if ($FullFormat) {
        $out_text = $forum_lang['basket_removed_in_basket_message'];
        $out_text .= '<br>' . $del_admin . '<br>' . $del_time . '.<br>' . $del_reason . '<br>';
        // Показать / Скрыть удаляемое сообщение
        $out_text .= '<a href="#" onclick="ShowHide(\'delete_com' . $num_del . '\'); return false;" class="button">' . $forum_lang['basket_see'] . '</a>';
        // Ссылка - восстановить
        if (System::user()->isAdmin()) {
            $out_text .= '&nbsp;|&nbsp;';
            $out_text .= '<a href="index.php?name=forum&op=restore_basket&' . $basket['table'] . '=' . $id . '&back=' . SaveRefererUrl() . '" class="button">' . $forum_lang['restore'] . '</a>';
        }
        // Блок с контентом удаляемого сообщения (скрывается)
        // Содержимое темы (заголовок) или сообщение поста
        $text = HtmlChars($text);
        SmiliesReplace($text);
        $text = nl2br($text);
        $text = BbCodePrepare($text);
        $out_text .= '<div align="left" id="delete_com' . $num_del . '" style="visibility: hidden; display: none; border-top: 1px #888 solid; margin: 10px 0 5px 0; padding: 5px 0;">' . $text . '</div>';
    } else {
        // Просто сообщение, что удалено в корзину
        $out_text = $forum_lang['basket_removed_in_basket_message_smile'];
        $out_text .= '<br>' . $del_admin . '<br>' . $del_time . '.<br>' . $del_reason . '<br>';
        // Ссылка - восстановить
        if (System::user()->isAdmin()) {
            $out_text .= '<a href="index.php?name=forum&op=restore_basket&' . $basket['table'] . '=' . $id . '&back=' . SaveRefererUrl() . '" class="button">' . $forum_lang['restore'] . '</a>';
        }
    }
    return $out_text;
}
	<tr>
		<th>Действие</th>
		<th width="2">
	</th>';
$nc = count($info);
foreach ($info as $col) {
    $text .= '<th>' . $col['name'] . '</th>';
}
$text .= '</tr>';
$i = $rows_on_page * $page - $rows_on_page;
$back = SaveRefererUrl();
foreach ($rows as $col) {
    $func = '';
    $func .= SpeedButton('Редактировать', ADMIN_FILE . '?exe=dbadmin&a=editfield&name=' . $namedb . '&index=' . $i . $where_url . '&back=' . $back, 'images/admin/edit.png');
    $func .= System::admin()->SpeedConfirm('Удалить', ADMIN_FILE . '?exe=dbadmin&a=deleterow&name=' . $namedb . '&index=' . $i . $where_url . '&back=' . $back, 'images/admin/delete.png', 'Удалить запись?');
    $func .= SpeedButton('PHP код вставки', ADMIN_FILE . '?exe=dbadmin&a=viewcode&name=' . $namedb . '&index=' . $i . $where_url, 'images/admin/php.png');
    $text .= '<tr><td nowrap="nowrap">' . $func . '</td><td></td>';
    for ($j = 0; $j < $nc; $j++) {
        $col_name = $info[$j]['name'];
        strlen($col[$col_name]) > 255 ? $p = '... ...' : ($p = '');
        $text .= '<td>' . substr(HtmlChars($col[$col_name]), 0, 255) . $p . '</td>';
    }
    $text .= '</tr>';
    $i++;
}
$text .= '</table>';
AddText($text);
if ($nav) {
    AddNavigation();
}
AdminFdbAdminGenTableMenu($namedb);
function AdminGuestBookAnswerEditor()
{
    if (!System::user()->CheckAccess2('guestbook', 'answer')) {
        System::admin()->AccessDenied();
    }
    $id = SafeEnv($_GET['id'], 11, int);
    System::database()->Select('guestbook', "`id`='" . $id . "'");
    if (System::database()->NumRows() > 0) {
        AddCenterBox('Ответ на сообщение');
        $msg = System::database()->FetchRow();
        if ($msg['answers'] == '') {
            $answers = array();
        } else {
            $answers = unserialize($msg['answers']);
        }
        if (array_key_exists(System::user()->Name(), $answers)) {
            $ans = $answers[System::user()->Name()];
        } else {
            $ans = '';
        }
        FormRow('Ответ', System::site()->TextArea('answer', HtmlChars($ans), 'style="width:400px;height:200px;" class="autofocus"'));
        if (isset($_GET['back'])) {
            $back = '&back=' . SafeDB($_GET['back'], 255, str);
        } else {
            $back = '';
        }
        AddForm('<form action="' . ADMIN_FILE . '?exe=guestbook&a=saveanswer&id=' . $id . $back . '" method="POST">', System::site()->Button('Отмена', 'onclick="history.go(-1);"') . System::site()->Submit('Сохранить'));
    } else {
        GO(ADMIN_FILE . '?exe=guestbook');
    }
}
function FormsGetControl($name, $value, $kind, $type, $values, $other = '')
{
    //values = array(val1,val2,val3,...)
    //kind = (Edit,Password,Text,Check,Radio,List,Combo)
    $kind = explode(':', $kind);
    $control = '';
    $kind[0] = trim(strtolower($kind[0]));
    if ($type != '') {
        $type = explode(',', $type);
        settype($type[0], int);
        //maxlength
        settype($type[1], str);
        //type
        settype($type[2], bool);
        //strip tags/special chars
    } else {
        $type = array(255, str, false);
    }
    $params = FormsParseParams($kind);
    switch ($kind[0]) {
        case 'edit':
            $otherParams = ($type[0] != 0 ? 'maxlength="' . $type[0] . '" ' : '') . $params['style'] . ' ' . ($params['required'] ? 'required ' : '') . $other;
            $control = System::site()->Edit($name, HtmlChars($value), false, $otherParams);
            break;
        case 'password':
            $otherParams = ($type[0] != 0 ? 'maxlength="' . $type[0] . '" ' : '') . $params['style'] . ' ' . ($params['required'] ? 'required ' : '') . $other;
            $control = System::site()->Edit($name, HtmlChars($value), true, $otherParams);
            break;
        case 'text':
            $control = System::site()->TextArea($name, HtmlChars($value), $params['style'] . ' ' . ($params['required'] ? 'required ' : '') . $other);
            break;
        case 'check':
            $vals = explode(':', $values);
            if (count($vals) == 2 && FormsConfigCheck2Func($vals[0], $vals[1])) {
                $func = CONF_GET_PREFIX . trim($vals[1]);
                $vals = $func($name);
                $usefunc = true;
            } else {
                $vals = explode(',', $values);
                $usefunc = false;
            }
            $value = explode(',', $value);
            $control = '<table cellspacing="0" cellpadding="0" align="center">';
            $col = 0;
            $cols = $params['cols'];
            for ($i = 0; $i < count($vals); $i++) {
                if (!$usefunc) {
                    $s = explode(':', $vals[$i]);
                } else {
                    $s = $vals[$i];
                }
                if ($col == 0) {
                    $control .= '<tr>';
                }
                $col++;
                $control .= '<td nowrap class="rightc">' . System::site()->Check($name . '[]', $s[0], in_array($s[0], $value)) . $s[1] . '</td>';
                if ($col == $cols) {
                    $control .= '</tr>';
                    $col = 0;
                }
            }
            if ($col < $cols) {
                $control .= '</tr>';
            }
            $control .= '</table>';
            break;
        case 'radio':
            $vals = explode(':', $values);
            if (count($vals) == 2 && FormsConfigCheck2Func($vals[0], $vals[1])) {
                $func = CONF_GET_PREFIX . trim($vals[1]);
                $vals = $func($name);
                $usefunc = true;
            } else {
                $vals = explode(',', $values);
                $usefunc = false;
            }
            $control = '<table cellspacing="0" cellpadding="0" align="center">';
            $col = 0;
            $cols = $params['cols'];
            for ($i = 0; $i < count($vals); $i++) {
                if (!$usefunc) {
                    $s = explode(':', $vals[$i]);
                } else {
                    $s = $vals[$i];
                }
                if ($col == 0) {
                    $control .= '<tr>';
                }
                $col++;
                $control .= '<td nowrap class="rightc">' . System::site()->Radio($name, $s[0], $value == $s[0]) . $s[1] . '</td>';
                if ($col == $cols) {
                    $control .= '</tr>';
                    $col = 0;
                }
            }
            if ($col < $cols) {
                $control .= '</tr>';
            }
            $control .= '</table>';
            break;
        case 'list':
        case 'combo':
            $vals = explode(':', $values);
            if (count($vals) == 2 && FormsConfigCheck2Func($vals[0], $vals[1])) {
                $func = CONF_GET_PREFIX . trim($vals[1]);
                $vals = $func($name);
                $usefunc = true;
            } else {
                $vals = explode(',', $values);
                $usefunc = false;
            }
            $cdata = array();
            for ($i = 0; $i < count($vals); $i++) {
                if (!$usefunc) {
                    $s = explode(':', $vals[$i]);
                } else {
                    $s = $vals[$i];
                }
                if (count($s) == 2) {
                    System::site()->DataAdd($cdata, $s[0], $s[1], $value == $s[0]);
                }
            }
            $control = System::site()->Select($name . ($kind[0] == 'list' ? '[]' : ''), $cdata, $kind[0] == 'list', $params['style'] . ' ' . $other);
            break;
        case 'file':
            //////////////////////////////////////////////////////////////////
            $control = System::site()->FFile($name, ($params['required'] ? 'required ' : '') . $other);
            break;
        default:
            $control = $value;
    }
    return $control;
}
function AdminPollsEditor()
{
    global $editpolls;
    if (!$editpolls) {
        System::admin()->AccessDenied();
    }
    $view = 4;
    $answers = array();
    if (isset($_GET['id'])) {
        //Редактирование
        $title = 'Редактирование опроса';
        $btitle = 'Сохранить изменения';
        $id = SafeEnv($_GET['id'], 11, int);
        System::database()->Select('polls', "`id`='{$id}'");
        $p = System::database()->FetchRow();
        $poll = SafeDB($p['question'], 255, str);
        $desc = SafeDB($p['description'], 255, str);
        $showinblock = SafeDB($p['showinblock'], 1, int);
        $multianswers = SafeDB($p['multianswers'], 1, int);
        //Ответы
        $answers = unserialize($p['answers']);
        $allow_comments = SafeDB($p['allow_comments'], 1, int);
        $active = $p['active'];
        $view = SafeDB($p['view'], 1, int);
        $uid = '&id=' . $id;
    } else {
        //Добавление
        $title = 'Добавить опрос';
        $btitle = 'Добавить';
        $poll = '';
        $desc = '';
        $showinblock = true;
        $multianswers = false;
        $answers[] = array('Вариант ответа 1', '', '0');
        $answers[] = array('Вариант ответа 2', '', '0');
        $allow_comments = true;
        $active = true;
        $uid = '';
    }
    FormRow('Вопрос', System::site()->Edit('poll', $poll, false, 'maxlength="250" style="width:400px;" class="autofocus"'));
    FormRow('Описание', System::site()->Edit('desc', $desc, false, 'maxlength="250" style="width:400px;"'));
    FormRow('Показывать в блоке', System::site()->Select('showinblock', GetEnData($showinblock, 'Да', 'Нет')));
    FormRow('Мультиответы', System::site()->Select('multianswers', GetEnData($multianswers, 'Да', 'Нет')));
    $answers_js = '';
    foreach ($answers as $answer) {
        $answers_js .= ",['" . HtmlChars($answer[0], ENT_QUOTES) . "', '" . HtmlChars($answer[1], ENT_QUOTES) . "', " . SafeDB($answer[2], 11, int) . "]";
    }
    $answers_js = '[' . substr($answers_js, 1) . ']';
    // Выводим поле для редактирования ответов
    System::admin()->AddOnLoadJS(Indent('
		if(!("map" in Array.prototype)) Array.prototype.map = function(mapper, that){
			var other = new Array(this.length);
			for(var i=0, n=this.length; i<n; i++){
				if(i in this){
					other[i] = mapper.call(that, this[i], i, this);
				}
			}
			return other;
		};

		answersdata = ' . $answers_js . ';

		tableAddRow = function(answer, color, voices){
			var tr = $("<tr>");
			var answerinput = $("<input>", {type: "text", name: "answer[]", "class": "fd_answer"}).val(answer).css("width", "400px");
			$("<td>").append(answerinput).appendTo(tr);
			$("<td>").append($("<input>", {type: "text", name: "color[]", "class": "fd_color"}).val(color).css("width", "80px")).appendTo(tr);
			$("<td>").append($("<input>", {type: "text", name: "voices[]", "class": "fd_voices"}).val(voices).css("width", "50px").css("text-align", "right")).appendTo(tr);

			var td_delete = $("<td>").appendTo(tr);
			$("<a>", {"class": "button", html: "<img src=\\"images/admin/delete.png\\">", href: "#", title: "Удалить"}).click(function(){
				tr.remove();
				return false;
			}).appendTo(td_delete);

			tr.appendTo($("#answers_table tbody"));
			answerinput.focus();
		};

		AddPollAnswer = function(){
			tableAddRow("", "", "0");
		};

		answersdata.map(function(item){
			tableAddRow(item[0], item[1], item[2]);
		});

		$("#answers_table tbody").sortable();
	'));
    FormRow('Ответы', Indent('
		<table cellspacing="0" cellpadding="0" class="cfgtable" id="answers_table">
			<thead>
				<tr>
					<th style="width: 400px;">Ответ</th>
					<th style="width: 80px;">Цвет</th>
					<th style="width: 50px;">Ответы</th>
					<th style="width: 40px;">&nbsp;</th>
				</tr>
			</thead>
			<tbody></tbody>
		</table>
		<div style="float: right;">' . System::admin()->SpeedConfirmJs('Добавить ответ', 'AddPollAnswer();', 'images/admin/plus.png', '', true) . '</div>
	'));
    FormRow('Разрешить комментарии', System::site()->Select('allow_comments', GetEnData($allow_comments, 'Да', 'Нет')));
    FormRow('Включить', System::site()->Select('active', GetEnData($active, 'Да', 'Нет')));
    FormRow('Кто может отвечать', System::site()->Select('view', GetUserTypesFormData($view)));
    AddCenterBox($title);
    AddForm('<form action="' . ADMIN_FILE . '?exe=polls&a=save' . $uid . '" method="post">', System::site()->Button('Отмена', 'onclick="history.go(-1)"') . System::site()->Submit($btitle));
}