Example #1
0
function VisitFeature($feature, $depth)
{
    Indent($depth);
    PrFeatureType($feature->Type());
    printf("id = %d\n", $feature->id());
    $container = kmldom::AsContainer($feature);
    if ($container) {
        WalkContainer($container, $depth + 1);
    }
}
function AdminUpdateCheck()
{
    global $updates_folder;
    $selected_file = '';
    // Выбранное имя файла обновления
    // Выбираем файл обновления и читаем метаданные
    if (!isset($_FILES['upload_file'])) {
        System::admin()->AddCenterBox('Ошибка');
        System::admin()->HighlightError('Неизвестная ошибка.');
        return;
    }
    $uploaded_file = $_FILES['upload_file'];
    // Загруженный файл
    // Сохраняем загруженный файл
    if ($uploaded_file['error'] != 4) {
        if ($uploaded_file['error'] != 0) {
            System::admin()->AddTextBox('Ошибка', 'Ошибка при загрузке файла. Код ошибки: ' . $_FILES['upload_file'] . '.');
            return;
        }
        if (!is_writable($updates_folder)) {
            System::admin()->AddCenterBox('Ошибка');
            System::admin()->HighlightError('Папка "' . SafeDB($updates_folder, 255, str) . '" не доступна для записи. Не удалось загрузить обновление.');
        } else {
            if (is_file($uploaded_file['tmp_name'])) {
                // Был загружен файл
                // Проверяем тип файла и сохраняем в папку updates
                if (strtolower(GetFileExt($_FILES['upload_file']['name'])) == '.zip') {
                    $selected_file = $updates_folder . $_FILES['upload_file']['name'];
                    copy($_FILES['upload_file']['tmp_name'], $selected_file);
                    Audit('Обновление системы: Загружен архив обновления "' . $selected_file . '"');
                } else {
                    System::admin()->AddCenterBox('Ошибка');
                    System::admin()->HighlightError('Разрешено загружать только ZIP файлы.');
                }
            }
        }
    } else {
        // Берем выбранный ранее загруженный файл
        if (isset($_POST['select_file'])) {
            $selected_file = $updates_folder . $_POST['select_file'];
        } else {
            System::admin()->AddCenterBox('Ошибка');
            System::admin()->HighlightError('Файл обновления не выбран.');
            return;
        }
    }
    // Проверяем select_file, пытаемся открыть и прочитать метаданные
    $zip = new ZipArchive();
    if ($zip->open($selected_file) !== true) {
        System::admin()->AddCenterBox('Ошибка');
        System::admin()->HighlightError('Не удалось открыть файл обновления, возможно архив повреждён.');
        return;
    }
    // Читаем метаданные
    $metadata = $zip->getFromName('metadata');
    $metadata = JsonDecode($metadata);
    if (!isset($metadata) || !isset($metadata['product']) || $metadata['product'] != CMS_UPDATE_PRODUCT || !isset($metadata['type']) || $metadata['type'] != 'update' || !isset($metadata['from_version']) || $metadata['from_version'] != CMS_VERSION || !isset($metadata['to_version']) || !isset($metadata['changelog'])) {
        System::admin()->AddCenterBox('Ошибка');
        System::admin()->HighlightError('Файл не является файлом обновления или не подходит к вашей версии системы.');
        return;
    }
    System::admin()->AddCenterBox('Обновление системы ' . SafeDB($metadata['from_version'], 20, str) . ' › ' . SafeDB($metadata['to_version'], 20, str));
    UseLib('markdown');
    $md = new Markdown();
    $metadata['changelog'] = $md->transform(SafeDB($metadata['changelog'], 0, str, false));
    // Проверяем разрешения на запись в файлы
    $update_files = '<h2>Обновляемые файлы:</h2><ul>';
    $numFiles = $zip->numFiles;
    $create = false;
    $reason = '';
    $create_dirs = array();
    $errors = false;
    for ($i = 0; $i < $numFiles; $i++) {
        $reason = '';
        $fn = $zip->getNameIndex($i);
        if ($fn == 'metadata') {
            continue;
        }
        if (substr($fn, -1) != '/') {
            // Файл
            if (is_file($fn)) {
                // Существует
                $create = is_writable($fn);
                $reason = 'Нет прав на запись';
            } else {
                $fn_path = GetPathName($fn, false);
                if (isset($create_dirs[$fn_path . '/'])) {
                    $create = $create_dirs[$fn_path . '/'];
                    $reason = 'Невозможно создать папку ' . $fn_path . '';
                } else {
                    $create = is_writable($fn_path);
                    $reason = 'Нет прав на запись в папку ' . $fn_path . '';
                }
            }
        } else {
            // Папка
            $create = IsPossiblyCreated($fn);
            $create_dirs[$fn] = $create;
            $reason = 'Невозможно создать, нет прав на запись';
        }
        if ($create) {
            $update_files .= '<li>' . SafeDB($fn, 255, str) . '</li>';
        } else {
            $update_files .= '<li style="color: red;">' . SafeDB($fn, 255, str) . ' (' . $reason . ')</li>';
            $errors = true;
        }
    }
    $update_files .= '</ul>';
    $zip->close();
    // Вывод информации
    System::site()->AddOnLoadJS(Indent('
		AdminUpdateShowChangelog = function(){
			$("#update_changelog").show();
			$("#update_files").hide();
		}
		AdminUpdateShowFiles = function(){
			$("#update_files").show();
			$("#update_changelog").hide();
		}
	'));
    if ($errors) {
        System::admin()->HighlightError('Невозможно обновить некоторые файлы и папки. Смотрите список файлов для более детальной информации.<br>');
    } else {
        System::admin()->Highlight('Ошибок не обнаружено, нажмите кнопку "Обновить" для обновления системы.');
    }
    $html = '
		<div style="margin: 10px 0 10px;">
			<a href="#" onclick="AdminUpdateShowChangelog(); return false;" class="button">Показать изменения</a>
			<a href="#" onclick="AdminUpdateShowFiles(); return false;" class="button">Показать файлы</a>
			' . ($errors ? '' : System::admin()->SpeedButton('Обновить', ADMIN_FILE . '?exe=update&a=apply&file=' . GetFileName($selected_file), '', true, true)) . '
		</div>
		<div id="update_changelog" style="' . ($errors ? 'display: none;' : '') . '">' . $metadata['changelog'] . '</div>
		<div id="update_files" style="' . ($errors ? '' : 'display: none;') . '">' . $update_files . '</div>
';
    System::admin()->AddText($html);
}
/**
 * Отправка письма с новым паролем
 * @param $user_mail
 * @param $name
 * @param $login
 * @param $pass
 * @return void
 */
function UserSendForgotPassword($user_mail, $name, $login, $pass)
{
    $ip = getip();
    $text = Indent('
		Здравствуйте, [' . $name . ']!

		На сайте ' . GetSiteDomain() . '
		было запрошено напоминание пароля.

		Имя: ' . $name . '

		Ваш логин и новый пароль:
		логин: ' . $login . '
		пароль: ' . $pass . '

		Изменить данные аккаунта вы можете по адресу:
		' . GetSiteUrl() . Ufu('index.php?name=user&op=editprofile', 'user/{op}/') . '

		IP-адрес, с которого был запрошен пароль: ' . $ip . '

		С уважением, администрация сайта ' . GetSiteDomain() . '.
	');
    SendMail($name, $user_mail, '[' . GetSiteDomain() . '] Напоминание пароля', $text);
}
if (isset($_GET['a'])) {
    $action = $_GET['a'];
} else {
    $action = 'main';
}
switch ($action) {
    case 'main':
        // SideBar
        System::database()->Select('block_types', '');
        $block_types_data = array();
        while ($row = System::database()->FetchRow()) {
            System::site()->DataAdd($block_types_data, SafeDB($row['folder'], 255, str), SafeDB($row['name'], 255, str));
        }
        $form = Indent('
			<form action="' . ADMIN_FILE . '?exe=blocks&a=add" method="post">
				' . System::site()->Select('type', $block_types_data, false, 'style="width: 200px;"') . '
				<div align="right" style="text-align: right; margin-top: 5px;">' . System::site()->Submit('Добавить') . '</div>
			</form>
		');
        // FIXME: Похоже Indent не работает...
        //System::log($form);
        System::admin()->SideBarAddTextBlock('Добавить блок', $form);
        AdminBlocksMain();
        break;
    case 'add':
        AdminBlocksEdit($action);
        break;
    case 'newsave':
        AdminBlocksSave($action);
        break;
    case 'del':
        AdminBlockDelete();
function AdminArticlesEditor()
{
    global $editarticles;
    if (!$editarticles) {
        System::admin()->AccessDenied();
    }
    $cat_id = isset($_GET['to']) ? SafeDB($_GET['to'], 11, int) : 0;
    $author = '';
    $email = '';
    $www = '';
    $title = '';
    $description = '';
    $article = '';
    $image = '';
    $auto_br_desc = false;
    $auto_br_article = false;
    $allow_comments = true;
    $allow_votes = true;
    $view = 4;
    $active = true;
    //Модуль SEO
    $seo_title = '';
    $seo_keywords = '';
    $seo_description = '';
    //
    $form = 0;
    $product_id = '';
    if (!isset($_GET['id'])) {
        $action = 'add';
        $top = 'Добавить статью';
        $cap = 'Добавить';
    } else {
        $id = SafeEnv($_GET['id'], 11, str);
        System::database()->Select('articles', "`id`='{$id}'");
        $art = System::database()->FetchRow();
        $cat_id = SafeDB($art['cat_id'], 11, int);
        $author = SafeDB($art['author'], 200, str);
        $email = SafeDB($art['email'], 50, str);
        $www = SafeDB($art['www'], 250, str);
        $title = SafeDB($art['title'], 255, str);
        $description = SafeDB($art['description'], 0, str, false);
        $article = SafeDB($art['article'], 0, str, false);
        $image = SafeDB($art['image'], 250, str);
        $auto_br_article = SafeDB($art['auto_br_article'], 1, bool);
        $auto_br_desc = SafeDB($art['auto_br_desc'], 1, bool);
        $active = SafeDB($art['active'], 1, bool);
        $allow_comments = SafeDB($art['allow_comments'], 1, int);
        $allow_votes = SafeDB($art['allow_votes'], 1, int);
        $view = SafeDB($art['view'], 1, int);
        //Модуль SEO
        $seo_title = SafeDB($art['seo_title'], 255, str);
        $seo_keywords = SafeDB($art['seo_keywords'], 255, str);
        $seo_description = SafeDB($art['seo_description'], 255, str);
        //
        $form = SafeDB($art['form'], 11, int);
        $product_id = SafeDB($art['product_id'], 255, str);
        $action = 'save&id=' . $id;
        $top = 'Редактирование статьи';
        $cap = 'Сохранить изменения';
    }
    System::admin()->AddJS(Indent('
		ArticlesPreviewOpen = function(){
			if(tinyMCE){
				tinyMCE.triggerSave();
			}
			var form_data = Admin.SerializeFormData(document.forms.edit_form);
			var left = parseInt(screen.width / 2) - 400;
			var top = parseInt(screen.height / 10);
			var wp = window.open("", "Preview", "resizable=yes,scrollbars=yes,menubar=no,status=no,location=no,width=800,height=600,left="+left+",top="+top+"");
			wp.document.open();
			$.ajax({
				type: "POST",
				url: "' . ADMIN_FILE . '?exe=articles&a=preview",
				data: form_data,
				dataType: "html",
				success: function(data){
					wp.document.write(data);
					wp.document.close();
				}
			});
		}
	'));
    $cats_data = AdminArticlesGetTree()->GetCatsData($cat_id);
    if (count($cats_data) == 0) {
        $back_to_form = SaveRefererUrl();
        AddTextBox($top, 'Нет категорий для добавления! ' . System::admin()->SpeedButton('Добавить категорию', ADMIN_FILE . '?exe=articles&a=cateditor&back=' . $back_to_form, '', true, true));
        return;
    }
    FormRow('В категорию', System::site()->Select('category', $cats_data, false, $cat_id == 0 ? 'class="autofocus"' : ''));
    FormRow('Заголовок', System::site()->Edit('title', $title, false, 'maxlength="250" style="width:400px;"' . ($cat_id != 0 ? 'class="autofocus"' : '')));
    //Модуль SEO
    FormRow('[seo] Заголовок страницы', System::site()->Edit('seo_title', $seo_title, false, 'style="width:400px;"'));
    FormRow('[seo] Ключевые слова', System::site()->Edit('seo_keywords', $seo_keywords, false, 'style="width:400px;"'));
    FormRow('[seo] Описание', System::site()->Edit('seo_description', $seo_description, false, 'style="width:400px;"'));
    //
    // Веб форма
    $forms = System::database()->Select('forms', "`active`='1'");
    $forms_data = array();
    System::site()->DataAdd($forms_data, '0', 'Нет', $form == 0);
    foreach ($forms as $f) {
        System::site()->DataAdd($forms_data, SafeDB($f['id'], 11, int), SafeDB($f['hname'], 255, str), $f['id'] == $form);
    }
    FormRow('Форма', System::site()->Select('form', $forms_data));
    FormRow('Код товара', System::site()->Edit('product_id', $product_id, false, 'maxlength="250" style="width:400px;"'));
    AdminImageControl('Изображение', 'Загрузить изображение', $image, System::config('articles/images_dir'));
    FormTextRow('Короткая статья (HTML)', System::site()->HtmlEditor('description', $description, 600, 200));
    FormRow('', 'Преобразовать текст в HTML: ' . System::site()->Select('auto_br_desc', GetEnData($auto_br_desc, 'Да', 'Нет')));
    FormTextRow('Полная статья (HTML)', System::site()->HtmlEditor('article', $article, 600, 400));
    FormRow('', 'Преобразовать текст в HTML: ' . System::site()->Select('auto_br_article', GetEnData($auto_br_article, 'Да', 'Нет')));
    FormRow('Автор', System::site()->Edit('author', $author, false, 'style="width:400px;" maxlength="50"'));
    FormRow('E-mail автора', System::site()->Edit('email', $email, false, 'style="width:400px;" maxlength="50"'));
    FormRow('Сайт автора', System::site()->Edit('www', $www, false, 'style="width:400px;" maxlength="250"'));
    FormRow('Комментарии', System::site()->Select('allow_comments', GetEnData($allow_comments, 'Разрешить', 'Запретить')));
    FormRow('Оценки', System::site()->Select('allow_votes', GetEnData($allow_votes, 'Разрешить', 'Запретить')));
    FormRow('Кто видит', System::site()->Select('view', GetUserTypesFormData($view)));
    FormRow('Активна', System::site()->Select('active', GetEnData($active, 'Да', 'Нет')));
    AddCenterBox($top);
    if (!isset($_REQUEST['back'])) {
        $_REQUEST['back'] = SaveRefererUrl(ADMIN_FILE . '?exe=articles');
    }
    AddForm('<form name="edit_form" action="' . ADMIN_FILE . '?exe=articles&a=' . $action . '&back=' . SafeDB($_REQUEST['back'], 255, str) . '" method="post" enctype="multipart/form-data">', System::site()->Button('Отмена', 'onclick="history.go(-1)"') . System::site()->Button('Предпросмотр', 'onclick="ArticlesPreviewOpen();"') . System::site()->Submit($cap));
}
function AdminNewsTopics()
{
    global $news_access_edittopics;
    UseScript('jquery_ui', 'colorbox?theme=admin');
    if (!$news_access_edittopics) {
        System::admin()->AccessDenied();
    }
    $cntr = 0;
    AddCenterBox('Текущие новостные разделы');
    $topics = System::database()->Select('news_topics');
    $text = '<table style="width: 100%; border: 1px #ABC5D8 solid; background-color: #fff; padding: 10px;">';
    foreach ($topics as $topic) {
        $topic_id = SafeDB($topic['id'], 11, int);
        $edit_url = ADMIN_FILE . '?exe=news&a=edittopic&id=' . $topic_id;
        $link_go = Ufu('index.php?name=news&topic=' . $topic_id, 'news/{topic}/');
        $title = SafeDB($topic['title'], 255, str);
        $desc = SafeDB($topic['description'], 255, str);
        $counter = SafeDB($topic['counter'], 11, int);
        $image = SafeDB($topic['image'], 255, str);
        if ($image != '') {
            list($width, $height) = SafeDB(explode(':', System::config('news/topics_tmb_size')), 11, int);
            $image = GetThumb($image, $width, $height);
            $image = '<tr><td align="center"><a href="' . $edit_url . '"><img src="' . $image . '" height="80" title="' . $desc . '"></a></td></tr>';
        }
        $func = '';
        $func .= System::admin()->SpeedButton('Перейти к странице на сайте', $link_go, 'images/link_go.png', false, false, 'target="_blank"');
        $func .= System::admin()->SpeedButton('Редактировать', $edit_url, 'images/admin/edit.png');
        $func .= System::admin()->SpeedAjax('Удалить', ADMIN_FILE . '?exe=news&a=deltopic&id=' . $topic_id, 'images/admin/delete.png', 'Удалить раздел? Все новости в этом разделе так-же будут удалены.', '', "\$('#topic_{$topic_id}').children('table').fadeOut('slow');");
        if ($cntr % 4 == 0) {
            $text .= '<tr>';
        }
        $text .= Indent('
			<td id="topic_$topic_id" valign="top" align="center" style="padding: 10px;">
				<table align="center" cellspacing="5" cellpadding="0">
					<tr>
						<td align="center">
							<b><a href="' . $edit_url . '">' . $title . '</a> (' . $counter . ')</b>
						</td>
					</tr>
					' . $image . '
					<tr>
						<td align="center">' . $func . '</td>
					</tr>
				</table>
			</td>
		');
        if (++$cntr % 4 == 0) {
            $text .= '</tr>';
        }
    }
    if ($cntr % 4 != 0) {
        $text .= '</tr>';
    }
    $text .= '</table>';
    AddText($text);
    System::admin()->FormTitleRow('Создать новый раздел новостей');
    System::admin()->FormRow('Название раздела', System::admin()->Edit('topic_name', '', false, 'maxlength="255" style="width:400px;"'));
    System::admin()->FormTextRow('Описание (HTML)', System::admin()->HtmlEditor('topic_description', '', 600, 200));
    FormRow('Изображение', System::admin()->FileManager('topic_image', '') . '<br>
		<a href="images/no_image.png" class="filemanager_topic_image colorbox" data-content="href:path" target="_blank">
			<img src="images/no_image.png" class="filemanager_topic_image" data-content="src:tmb" style="margin-top: 5px; max-width: 250px;">
		</a>');
    System::admin()->AddForm('<form name="topicsform" action="' . ADMIN_FILE . '?exe=news&a=addtopic" method="post" name="topicsform">', System::admin()->Submit('Создать'));
}
                    }
                }
            }
            if ($ConvertDB) {
                if (!$have_errors) {
                    $this->SetContent(Indent('
						<p align="center">База данных успешно сконвертирована!</p>
					'));
                    $this->AddButton('Админ-панель', 'finish&p=3');
                    $this->AddButton('На сайт', 'finish&p=2');
                } else {
                    $this->SetContent(Indent('
						<p align="center">Произошли ошибки при конвертировании БД.</p>
					'));
                }
            } else {
                if (!$have_errors) {
                    $this->SetContent(Indent('
						<h2 class="title" align="center">База данных создана успешно!</h2>
						<p align="center">Нажмите "Далее" для создания учетной записи главного администратора.</p>
					'));
                    $this->AddButton('Далее', 'admin');
                } else {
                    $this->SetContent(Indent('
						<p align="center">Произошли ошибки при создании БД.</p>
					'));
                }
            }
        }
        break;
}
/**
 * Добавляет блок быстрого перехода.
 * @param type $sel_id
 * @param type $title
 * @param type $app_content
 */
function ForumQuickTransitionBox($sel_id, $title = '', $app_content = '')
{
    $data = ForumTree::Instance()->GetCatsDataF($sel_id, true, true);
    $nav_url = 'index.php?name=forum&op=showforum';
    System::site()->AddTextBox('', $app_content . Indent('
		<div style="float:right; white-space:nowrap;" class="forum_quick_transition">
			<table cellspacing="0" cellpadding="0" border="0">
				<tr>
					<th>' . $title . ':&nbsp;</th>
					<td>
						<form action="' . $nav_url . '" method="get">
							<input type="hidden" name="name" value="forum">
							<input type="hidden" name="op" value="showforum">
							' . System::site()->Select('forum', $data, false, 'onchange="this.form.submit();"') . '
						</form>
					</td>
				</tr>
			</table>
		</div>
	'));
}
/**
 * Редактор ссылок
 * @return void
 */
function AdminPagesLinkEditor()
{
    UseScript('jquery');
    System::admin()->AddJS(Indent(<<<JS
\t\tSelectLinkType = function(first){
\t\t\tif(first){
\t\t\t\tvar url = \$('#link_url').val();
\t\t\t\t\$('#link_mods > option').prop('selected', false);
\t\t\t\tif(url.substr(0, 6) == 'mod://'){
\t\t\t\t\tvar mod = url.substr(6);
\t\t\t\t\t\$('#link_mod_'+mod).prop('selected', true);
\t\t\t\t\t\$('.link_form_row').hide();
\t\t\t\t}else{
\t\t\t\t\t\$('#link_mod').prop('selected', true);
\t\t\t\t\t\$('.link_form_row').show();
\t\t\t\t}
\t\t\t}else{
\t\t\t\tvar v = \$('#link_mods').val();
\t\t\t\tif(v == ''){
\t\t\t\t\t\$('.link_form_row').fadeIn(1000);
\t\t\t\t}else{
\t\t\t\t\t\$('.link_form_row').hide();
\t\t\t\t}
\t\t\t}
\t\t};
JS
));
    System::admin()->AddOnLoadJS("SelectLinkType(true);");
    $link = '';
    $id = -1;
    $title = '';
    $parent_id = -1;
    if (isset($_GET['parent'])) {
        $parent_id = SafeEnv($_GET['parent'], 11, int);
    }
    $view = array(1 => false, 2 => false, 3 => false, 4 => false);
    $enabled = true;
    $showinmenu = true;
    if (!isset($_GET['id'])) {
        $view[4] = true;
        $form_title = 'Добавить ссылку';
        $submit = 'Добавить';
    } else {
        $id = SafeEnv($_GET['id'], 11, int);
        System::database()->Select('pages', "`id`='{$id}'");
        $pg = System::database()->FetchRow();
        $parent_id = SafeEnv($pg['parent'], 11, int);
        $title = SafeEnv($pg['title'], 255, str);
        $link = SafeEnv($pg['text'], 255, str);
        $view[SafeDB($pg['view'], 1, int)] = true;
        $enabled = SafeDB($pg['enabled'], 1, bool);
        $showinmenu = SafeDB($pg['showinmenu'], 1, bool);
        $form_title = 'Редактирование ссылки';
        $submit = 'Сохранить изменения';
    }
    // Возможные родительские страницы
    $pages = System::database()->Select('pages');
    SortArray($pages, 'order');
    $tree = new Tree($pages);
    $cats_data = $tree->GetCatsData($parent_id, false, true, $id, true);
    // Кто видит
    $visdata = array();
    System::site()->DataAdd($visdata, 'all', 'Все', $view['4']);
    System::site()->DataAdd($visdata, 'members', 'Только пользователи', $view['2']);
    System::site()->DataAdd($visdata, 'guests', 'Только гости', $view['3']);
    System::site()->DataAdd($visdata, 'admins', 'Только администраторы', $view['1']);
    // Модули
    $modules_data = array();
    $mods = System::database()->Select('modules', "`enabled`='1' and `isindex`='1'");
    System::site()->DataAdd($modules_data, '', '--- URL ---', false, 'id="link_mod"');
    foreach ($mods as $mod) {
        $folder = SafeDB($mod['folder'], 255, str);
        System::site()->DataAdd($modules_data, $folder, SafeDB($mod['name'], 255, str), false, 'id="link_mod_' . $folder . '"');
    }
    // Выводим форму
    System::admin()->FormRow('Родительская страница', System::site()->Select('parent_id', $cats_data, false, $parent_id == -1 ? 'class="autofocus"' : ''));
    System::admin()->FormRow('Заголовок', System::site()->Edit('title', $title, false, 'style="width:400px;" maxlength="255"' . ($parent_id != -1 ? ' class="autofocus"' : '')));
    System::admin()->FormRow('Ссылка на модуль', System::site()->Select('module', $modules_data, false, 'id="link_mods" onchange="SelectLinkType();"'));
    System::admin()->FormRow('Ссылка (URL)', System::site()->Edit('link', $link, false, 'style="width:400px;" id="link_url"'), 'class="link_form_row"');
    System::admin()->FormRow('Кто видит', System::site()->Select('view', $visdata));
    System::admin()->FormRow('Показать в меню', System::admin()->Select('showinmenu', GetEnData($showinmenu, 'Да', 'Нет')));
    System::admin()->FormRow('Включить', System::admin()->Select('enabled', GetEnData($enabled, 'Да', 'Нет')));
    System::admin()->AddCenterBox($form_title);
    System::admin()->AddForm(System::admin()->FormOpen(ADMIN_FILE . '?exe=pages&a=savelink' . ($id != -1 ? '&id=' . $id : '')), System::admin()->Button('Отмена', 'onclick="history.go(-1)"') . System::admin()->Submit($submit));
}
function IndexForumLastTopics_Periods($day, $forum_id = -1)
{
    global $forum_lang;
    $periods = array('1', '2', '3', '4', '5', '6', '7', '14', '21', '30', '60', '90', '120', '150', '180', '365');
    $select = '';
    foreach ($periods as $p) {
        $select .= '<option value="' . $p . '" ' . ($day == $p ? 'selected="selected"' : '') . '>' . $forum_lang['viewlasttopics' . $p] . '</option>';
    }
    $text = Indent('
		<div style="float:left;" class="forum_period">
			<table cellspacing="0" cellpadding="0" border="0">
			<tr>
				<th>Период:&nbsp;</th>
				<td>
					<form name="day" action="index.php?name=forum&op=lasttopics' . ($forum_id > 0 ? '&forum=' . $forum_id . '' : '') . '" method="get">
						<input type="hidden" name="name" value="forum">
						' . ($forum_id > 0 ? '<input type="hidden" name="forum" value="' . $forum_id . '">' : '') . '
						<input type="hidden" name="op" value="lasttopics">
						<select name="day" onchange="this.form.submit();">
							' . $select . '
						</select>
					</form>
				</td>
			</tr>
			</table>
		</div>
	');
    return $text;
}
function AdminDownloadsMain()
{
    $editfiles = System::user()->CheckAccess2('downloads', 'edit_files');
    $back = SaveRefererUrl();
    if (isset($_GET['cat']) && $_GET['cat'] > -1) {
        $cat = SafeEnv($_GET['cat'], 11, int);
        $where = "`category`='{$cat}'";
    } else {
        $cat = -1;
        $where = "";
    }
    $data = array();
    $data = AdminDownloadsGetTree()->GetCatsData($cat, true);
    System::site()->DataAdd($data, -1, 'Все файлы', $cat == -1);
    if (isset($_GET['page'])) {
        $page = SafeEnv($_GET['page'], 10, int);
    } else {
        $page = 1;
    }
    AddCenterBox('Файлы');
    System::admin()->AddJS(Indent('
		DownloadsSelectCat = function(){
			Admin.LoadPage("' . ADMIN_FILE . '?exe=downloads&cat="+$("#download-cat").val());
		}
	'));
    $text = '<div style="text-align: center; margin-bottom: 10px;">Категория: ' . System::site()->Select('cat', $data, false, 'id="download-cat" onchange="DownloadsSelectCat();"') . '</div>';
    AddText($text);
    System::database()->Select('downloads', $where);
    SortArray(System::database()->QueryResult, 'public', true);
    if (count(System::database()->QueryResult) > System::config('downloads/filesonpage')) {
        $navigator = new Navigation($page);
        $navigator->GenNavigationMenu(System::database()->QueryResult, System::config('downloads/filesonpage'), ADMIN_FILE . '?exe=downloads' . ($cat > 0 ? '&cat=' . $cat : ''));
        $nav = true;
    } else {
        $nav = false;
    }
    $text = '<table cellspacing="0" cellpadding="0" class="cfgtable">';
    $text .= '<tr><th>Заголовок</th><th>Скачиваний</th><th>Оценки</th><th>Видят</th><th>Статус</th><th>Функции</th></tr>';
    while ($row = System::database()->FetchRow()) {
        $id = SafeDB($row['id'], 11, int);
        $title = SafeDB($row['title'], 255, str);
        $hits = SafeDB($row['hits'], 11, int);
        $rating = '<img src="' . GetRatingImage(SafeDB($row['votes_amount'], 11, int), SafeDB($row['votes'], 11, int)) . '" border="0" />';
        $st = $row['active'] == '1' ? 'Вкл.' : 'Выкл.';
        $func = '-';
        if ($editfiles) {
            $title = '<b>' . System::admin()->Link($title, ADMIN_FILE . '?exe=downloads&a=editor&id=' . $id . '&back=' . $back) . '</b>';
            $hits .= '&nbsp;' . System::admin()->SpeedConfirm('Обнулить счётчик скачиваний', ADMIN_FILE . '?exe=downloads&a=resetcounter&id=' . $id . '&back=' . $back, 'images/admin/arrow_in.png', 'Сбросить счётчик скачиваний?');
            $rating .= '&nbsp;' . System::admin()->SpeedConfirm('Обнулить счётчик оценок (' . SafeDB($row['votes_amount'], 11, int) . ' голосов)', ADMIN_FILE . '?exe=downloads&a=resetrating&id=' . $id . '&back=' . $back, 'images/admin/arrow_in.png', 'Сбросить оценки?');
            $st = System::admin()->SpeedStatus('Вкл.', 'Выкл.', ADMIN_FILE . '?exe=downloads&a=changestatus&id=' . $id, $row['active'] == '1');
            $func = System::admin()->SpeedButton('Редактировать', ADMIN_FILE . '?exe=downloads&a=editor&id=' . $id . '&back=' . $back, 'images/admin/edit.png');
            $func .= System::admin()->SpeedConfirm('Удалить', ADMIN_FILE . '?exe=downloads&a=deletefile&id=' . $id . '&ok=0&back=' . $back, 'images/admin/delete.png', 'Удалить файл?');
        }
        $text .= '<tr><td>' . $title . '</td>
		<td>' . $hits . '</td>
		<td>' . ($row['allow_votes'] == '1' ? $rating : 'Запрещены') . '</td>
		<td>' . ViewLevelToStr(SafeDB($row['view'], 1, int)) . '</td>
		<td>' . $st . '</td>
		<td>' . $func . '</td>
		</tr>';
    }
    $text .= '</table>';
    AddText($text);
    if ($nav) {
        AddNavigation();
    }
}
        $this->SetTitle(_FDB_CREATE);
        if (!System::database()->Connected) {
            $this->SetContent("<html>\n<head>\n\t<title>!!!Ошибка!!!</title>\n</head>\n<body>\n<p align=\"center\">Проблема с базой данных. Пожалуйста, проверьте настройки базы данных.</p>\n</body>\n</html>");
        } else {
            System::database()->CreateDbIfNotExists($config['db_name'], false);
            System::database()->SelectDb($config['db_name']);
            $tables = ShowTables();
            $prefix = System::database()->Prefix();
            foreach ($tables as $table) {
                $info = $bases_path . $default_prefix . '_' . $table . $info_ext;
                $info2 = $config['db_host'] . $config['db_name'] . '/' . $prefix . $table . $info_ext;
                $data = $bases_path . $default_prefix . '_' . $table . $data_ext;
                $data2 = $config['db_host'] . $config['db_name'] . '/' . $prefix . $table . $data_ext;
                if ($delete_ex && is_file($info2)) {
                    unlink($info2);
                    unlink($data2);
                }
                if (!is_file($info2)) {
                    copy($info, $info2);
                    copy($data, $data2);
                }
            }
            $this->SetContent(Indent('
				<h2 class="title" align="center">База данных создана успешно!</h2>
				<p align="center">Нажмите "Далее" для создания учетной записи главного администратора.</p>
			'));
            $this->AddButton('Далее', 'admin');
            // На страницу создания главного администратора
        }
        break;
}
/**
 * Выводит поля формы в админке, для настройки видимости объекта на определенных страницах сайта.
 * @param array|string $Conditions
 * @param array|string $Uri
 */
function VisibilityConditionsAdmin($Conditions = array(), $Uri = array())
{
    if (is_string($Conditions)) {
        $Conditions = unserialize($Conditions);
    }
    if (is_string($Uri)) {
        $Uri = unserialize($Uri);
    }
    $extrauri = SafeDB(implode(WIN_EOL, $Uri), 0, str);
    // Загружаем все модули из базы данных которые работают с пользователем
    $mods = System::database()->Select('modules', "`isindex`='1'");
    array_unshift($mods, array('name' => 'Главная страница', 'folder' => 'INDEX'));
    $num = 0;
    $ac = '';
    $ac .= Indent('
		<table width="100%" cellspacing="0" cellpadding="0" style="margin-bottom: 5px;">
			<tr>
				<td style="border: none;"><label>' . System::site()->Radio('showin[]', 'SELECT_ONLY', in_array('SELECT_ONLY', $Conditions) || !in_array('ALL_EXCEPT', $Conditions)) . '<span style="display: inline-block; vertical-align: top; padding-top: 3px;">Показывать только:</span></label></td>
				<td style="border: none;"><label>' . System::site()->Radio('showin[]', 'ALL_EXCEPT', in_array('ALL_EXCEPT', $Conditions)) . '<span style="display: inline-block; vertical-align: top; padding-top: 3px;">Показывать везде, кроме:<span></label></td>
			</tr>
		</table>
		<table width="100%" cellspacing="0" cellpadding="0" style="margin-bottom: 5px;">
	');
    foreach ($mods as $a) {
        if ($num == 0) {
            $ac .= '<tr>';
        }
        $num++;
        $ac .= '<td style="border: none;"><label>' . System::site()->Check('showin[]', SafeDB($a['folder'], 255, str), in_array(SafeDB($a['folder'], 255, str), $Conditions)) . '<span style="display: inline-block; vertical-align: top; padding-top: 3px;">' . SafeDB($a['name'], 255, str) . '</span></label></td>';
        if ($num == 3) {
            $ac .= '</tr>';
            $num = 0;
        }
    }
    if ($num != 0) {
        $ac .= '</tr>';
    }
    $ac .= Indent('
		</table>
		<table width="100%" cellspacing="0" cellpadding="0" style="margin-bottom: 5px;">
			<tr>
				<td style="border: none; padding-bottom: 4px;">Страницы (URL):<br>Например: /index.php?name=pages&amp;file=page или /pages/page.html. По одному на строку.</td>
			</tr>
			<tr>
				<td style="border: none;">' . System::site()->TextArea('extra_uri', $extrauri, 'style="width: 95%; min-width: 400px; height: 100px;"') . '</td>
			</tr>
		</table>
	');
    System::admin()->FormTitleRow('Параметры видимости');
    FormRow('', $ac);
}
function IndexUserRegistrationOk()
{
    System::site()->SetTitle('Регистрация на сайте');
    if (isset($_POST['usersave']) && $_POST['usersave'] == 'update') {
        $edit = true;
        $user_id = System::user()->Get('u_id');
        System::database()->Select('users', "`id`='" . $user_id . "'");
        $user = System::database()->FetchRow();
    } else {
        $edit = false;
    }
    if (!$edit) {
        System::user()->UnLogin(false);
    } else {
        if (!System::user()->Auth) {
            GO(Ufu('index.php'));
        }
    }
    if (System::config('user/registration') == 'off' && !$edit) {
        System::site()->AddTextBox('Ошибка', '<p align="center">Извините, регистрация временно приостановлена.</p>');
        return;
    }
    //Обрабатываем данные
    $errors = array();
    // Логин
    $login = '';
    $sendlogin = '';
    if (isset($_POST['login']) && CheckLogin(SafeEnv($_POST['login'], 30, str), $errors, true, $edit ? $user_id : 0)) {
        $login = SafeEnv($_POST['login'], 30, str);
        $sendlogin = $_POST['login'];
    }
    // Пароль
    $pass = '';
    $sendpass = '';
    $pass_generate_message = '';
    if (!System::user()->isAdmin() && $_POST['pass'] != '') {
        $pass = SafeEnv($_POST['pass'], 255, str);
        $rpass = SafeEnv($_POST['rpass'], 255, str);
        $sendpass = $_POST['pass'];
        if ($edit) {
            if ($rpass != '') {
                if (!CheckPass(SafeEnv($_POST['pass'], 255, str), $errors)) {
                    $pass = '';
                } elseif ($rpass != $pass) {
                    $errors[] = 'Пароли не совпадают.';
                    $pass = '';
                }
            } else {
                $pass = '';
            }
        } else {
            if ($_POST['pass'] == '') {
                srand(time());
                $pass = GenBPass(rand(System::config('user/pass_min_length'), 15));
                $sendpass = $pass;
                $pass_generate_message = '<br>Так как Вы не указали пароль, он был сгенерирован автоматически и выслан Вам на E-mail.';
            } else {
                if (CheckPass(SafeEnv($_POST['pass'], 255, str), $errors)) {
                    if ($rpass != $pass) {
                        $errors[] = 'Пароли не совпадают.';
                    }
                }
            }
        }
        $pass2 = md5($pass);
    }
    // E-mail
    if (!System::user()->isAdmin() && isset($_POST['email']) && CheckUserEmail(SafeEnv($_POST['email'], 50, str, true), $errors, true, $edit ? $user_id : 0)) {
        $email = SafeEnv($_POST['email'], 50, str, true);
    } else {
        $email = '';
    }
    // Скрыть E-mail
    if (isset($_POST['hideemail'])) {
        $hide_email = '1';
    } else {
        $hide_email = '0';
    }
    // Имя пользователя
    if (isset($_POST['nikname']) && CheckNikname(SafeEnv($_POST['nikname'], 50, str, true), $errors, true, $edit ? $user_id : 0)) {
        $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'])) {
        $homepage = SafeEnv(Url($_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';
    }
    if (!$edit && (!System::user()->Auth && !System::user()->isDef('captcha_keystring') || System::user()->Get('captcha_keystring') != $_POST['keystr'])) {
        $errors[] = 'Вы ошиблись при вводе кода с картинки.';
    }
    // Аватар
    $updateAvatar = true;
    if (isset($_POST['avatar'])) {
        if (System::config('user/avatar_transfer') == '1' && isset($_FILES['upavatar']) && file_exists($_FILES['upavatar']['tmp_name'])) {
            UserLoadAvatar($errors, $avatar, $a_personal, $user['avatar'], $user['a_personal'] == '1', $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 = 'noavatar.gif';
            $a_personal = '0';
        }
    } else {
        $avatar = 'noavatar.gif';
        $a_personal = '0';
    }
    // Активация аккаунта
    $active = '1';
    $code = '';
    $SendActivation = false;
    $activate = '';
    if (!$edit) {
        $activate = System::config('user/activate_type');
        switch ($activate) {
            case 'manual':
                $active = '0';
                $code = '';
                $SendActivation = false;
                break;
            case 'auto':
                $active = '1';
                $code = '';
                $SendActivation = false;
                break;
            case 'mail':
                $active = '0';
                $code = GenRandomString(32);
                $SendActivation = true;
                break;
        }
    }
    $status = 2;
    $access = -1;
    $reg_date = time();
    $last_visit = time();
    $ip = getip();
    $points = 0;
    $visits = 0;
    // Сохранение
    if (count($errors) == 0) {
        if ($SendActivation) {
            UserSendActivationMail($nik_name, $email, $sendlogin, $sendpass, $code, $reg_date);
            $finish_message = Indent('
				<br>
				На указанный Вами E-Mail отправлено письмо,
				содержащее ссылку для подтверждения регистрации.
				Для активации Вашего аккаунта перейдите по данной ссылке
				и подтвердите регистрацию!
			');
        } elseif (!$edit) {
            UserSendEndRegMail($email, $nik_name, $sendlogin, $sendpass, $reg_date);
            $finish_message = '<br>На ваш E-mail отправлено письмо с данными о регистрации.';
        }
        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, $status, $access, $a_personal, serialize(array()));
            System::database()->Insert('users', $values);
            // Очищаем кэш пользователей
            System::cache()->Delete(system_cache, 'users');
            // Автоматический вход
            if ($activate == 'auto') {
                System::user()->Login($login, $pass, true, false);
                System::site()->InitVars();
            } elseif ($activate == 'mail') {
                System::user()->Def('activate_ps', base64_encode($pass));
            }
            System::site()->AddTextBox('Регистрация', '<p align="center">Поздравляем! Вы успешно зарегистрированы на сайте.' . $pass_generate_message . $finish_message . '<br>С уважением, администрация сайта <strong>' . System::config('general/site_name') . '.</strong></p>');
        } else {
            // Сохранение изменений
            $set = "`login`='{$login}',`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}'" : '') . ($email != '' ? ",`email`='{$email}'" : '');
            System::database()->Update('users', $set, "`id`='" . System::user()->Get('u_id') . "'");
            System::user()->UpdateMemberSession();
            UpdateUserComments(System::user()->Get('u_id'), System::user()->Get('u_id'), $nik_name, $email, $hide_email, $homepage, getip());
            // Очищаем кэш пользователей
            System::cache()->Delete(system_cache, 'users');
            GO(GetSiteUrl() . Ufu('index.php?name=user&op=userinfo', 'user/{op}/'));
        }
    } else {
        // Ошибка
        $text = 'Ваш аккаунт не ' . ($edit ? 'сохранен' : 'добавлен') . ', произошли следующие ошибки:<br><ul>';
        foreach ($errors as $error) {
            $text .= '<li>' . $error;
        }
        $text .= '</ul>';
        // Удаляем аватар
        if ($a_personal == '1' && !$edit) {
            unlink(System::config('general/personal_avatars_dir') . $avatar);
        }
        System::site()->AddTextBox('Ошибка', $text);
        IndexUserRegistration(true, $edit);
    }
}
<?php

/*
 * Файл инициализации шаблона.
 * Здесь устанавливается doctype, Подключаются JS, CSS файлы и скрипты.
 * Можно изменить другие параметры шаблона, или сделать вывод в шаблон произвольного контента.
 */
System::site()->Doctype = '<!doctype html>';
System::site()->AddCSSFile('style.css', false, false, 'media="screen"');
System::site()->AddJSFile('functions.js', false, true);
UseScript('jquery');
UseScript('syntaxhighlighter?theme=Default');
// Подсветка кода на страницах
UseScript('colorbox');
// Скрипт просмотра изображений (LightBox)
System::site()->AddOnLoadJS(Indent('
	if($("#errors").html() != "") $("#errors").show();
'));
System::site()->SetTempVar('template', 'header', 'header.html');
System::site()->SetTempVar('template', 'footer', 'footer.html');
function AdminCommentsMain()
{
    System::admin()->AddCenterBox('Глобальная модерация комментариев');
    if (isset($_GET['page'])) {
        $page = SafeEnv($_GET['page'], 10, int);
    } else {
        $page = 1;
    }
    System::admin()->AddJS('
		UpdateSelectComment = function(){
			$(".comment_check").each(function(){
				$("#comment"+$(this).val()).removeClass("commtable_selected");
			});
			$(".comment_check:checked").each(function(){
				$("#comment"+$(this).val()).addClass("commtable_selected");
			});
		};
		SelectAllComments = function(){
			$(".comment_check").each(function(){
				$(this).attr("checked", true);
			});
			UpdateSelectComment();
		};
		DeleteComments = function(){
			var del = "";
			$(".comment_check:checked").each(function(){
				del += "#"+$(this).val();
			});
			Admin.LoadPagePost("' . ADMIN_FILE . '?exe=comments&a=delete&page=' . $page . '", {delcomments: del}, "Удаление...");
		};
	');
    $commentsOnPage = 50;
    // Выбираем комментарии из всех таблиц
    $where = '';
    $posts = array();
    $comments_tables = System::database()->Select('comments');
    foreach ($comments_tables as $table) {
        $temp_posts = System::database()->Select($table['table'], $where);
        AdminConfigMarkPosts($temp_posts, $table);
        $posts = array_merge($posts, $temp_posts);
    }
    // Сортируем комментарии по дате(Новые сверху)
    SortArray($posts, 'post_date', true);
    // Добавляем постраничную навигацию
    if (count($posts) > $commentsOnPage) {
        $navigator = new Navigation($page);
        $navigator->GenNavigationMenu($posts, $commentsOnPage, ADMIN_FILE . '?exe=comments');
        $nav = true;
    } else {
        $nav = false;
        AddText('<br />');
    }
    // Шапка
    if (count($posts) == 0) {
        System::admin()->Highlight('На сайте нет комментариев.');
        return;
    } else {
        $text = '';
    }
    $text .= '<table cellspacing="0" cellpadding="0" width="90%" align="center" class="commtable_header">
	<tr>
	<th style="width: 160px;">Пользователь</th>
	<th style="width: 260px;">E-mail</th>
	<th style="width: 260px;">Сайт</th>
	<th style="width: 260px;">Дата и время</th>
	<th style="width: 70px;">IP</th>
	<th>Функции</th>
	</tr></table>';
    // Выводим комментарии
    foreach ($posts as $post) {
        $post_id = SafeDB($post['id'], 11, int);
        $object_id = SafeDB($post['object_id'], 11, int);
        $user_id = SafeDB($post['user_id'], 11, int);
        $user_name = SafeDB($post['user_name'], 255, str);
        $user_homepage = SafeDB($post['user_homepage'], 255, str);
        $user_email = SafeDB($post['user_email'], 255, str);
        $user_ip = SafeDB($post['user_ip'], 19, str);
        $post_date = TimeRender($post['post_date']);
        $post_message = SafeDB($post['post_message'], 0, str, false);
        $post_message = nl2br($post_message);
        $edit = ADMIN_FILE . '?exe=comments&a=edit&id=' . $post_id . '&table=' . $post['_table'] . '&page=' . $page;
        if ($user_id != 0) {
            $userinfo = GetUserInfo($user_id);
            $user_name = $userinfo['name'];
            $user_homepage = $userinfo['url'];
            $user_email = PrintEmail($userinfo['email']);
            if ($userinfo['online']) {
                $online = '<b>Сейчас на сайте.</b>';
            } else {
                $online = '';
            }
            $avatar = '<img src="' . $userinfo['avatar_file'] . '" />';
            $rank_image = '<img src="' . $userinfo['rank_image'] . '" />';
            $rank_name = $userinfo['rank_name'];
            $regdate = 'Зарегистрирован: ' . TimeRender($userinfo['regdate'], false);
            $ruser = true;
        } else {
            $user_email = PrintEmail($user_email);
            $online = '';
            $avatar = '<img src="' . GetPersonalAvatar(0) . '" />';
            $rank_image = '';
            $rank_name = '';
            $regdate = '';
            $ruser = false;
        }
        if ($user_homepage != '') {
            $user_homepage = '<a href="http://' . $user_homepage . '" target="_blank">' . $user_homepage . '</a>';
        } else {
            $user_homepage = '&nbsp;';
        }
        if ($ruser) {
            $user_name = '<a href="' . Ufu("index.php?name=user&op=userinfo&user={$user_id}", 'user/{user}/info/') . '" target="_blank">' . $user_name . '</a>';
        }
        $link_go = ADMIN_FILE . '?exe=comments&a=find&table=' . SafeDB($post['_id'], 11, int) . '&post_id=' . $post_id;
        $func = '';
        if ($post['_url'] != '') {
            $func .= System::admin()->SpeedButton('Найти комментарий', $link_go, 'images/search.png', false, false, 'target="_blank"');
        }
        $func .= SpeedButton('Редактировать', $edit, 'images/admin/edit.png');
        $text .= Indent('
			<table cellspacing="0" cellpadding="0" width="90%" align="center" class="commtable" id="comment' . $post_id . '--' . $post['_table'] . '--' . $object_id . '">
				<tr>
					<th style="width: 160px;"><b>' . $user_name . '</b></th>
					<th style="width: 260px;">' . $user_email . '</th>
					<th style="width: 260px;">' . $user_homepage . '</th>
					<th style="width: 260px;">' . $post_date . '</th>
					<th style="width: 70px;">' . $user_ip . '</th>
					<th>' . $func . '</th>
					<th>' . System::admin()->Check('delcomments[]', $post_id . '--' . $post['_table'] . '--' . $object_id, false, 'class="comment_check" onchange="UpdateSelectComment();"') . '</th>
				</tr>
				<tr>
					<td valign="top" width="140">' . $avatar . '<br>' . $rank_image . '<br>' . $rank_name . '</td>
					<td colspan="6" class="commtable_text">' . $post_message . '</td>
				</tr>
			</table>
		');
    }
    // Подвал
    AddText($text);
    if ($nav) {
        AddNavigation();
    }
    $text = '';
    if (count($posts) > 0) {
        $text .= '<div style="text-align: right;">' . System::admin()->SpeedConfirmJs('Выделить все', 'SelectAllComments();', '', '', true) . '&nbsp;' . System::admin()->SpeedConfirmJs('Удалить выделенные', 'DeleteComments();', 'images/admin/delete.png', 'Удалить выделенные комментарии?', true) . '</div>';
    }
    AddText($text);
}
function IndexFormSendMail($email, $form_name, $time, $user, $ip, $data_rows)
{
    if ($user != 0) {
        $user_info = GetUserInfo($user);
        $user = SafeDB($user_info['name'], 255, str) . ' ( id:' . SafeDB($user_info['id'], 11, int) . ' )';
        $from = $user_info['name'];
        $from_email = $user_info['email'];
    } else {
        $user = '******';
        $from = System::config('general/site_name');
        $from_email = System::config('general/site_email');
    }
    $subject = 'Веб форма "' . SafeDB($form_name, 255, str) . '"';
    $mail = LmEmailExtended::Instance();
    $mail->SetSubject(Cp1251ToUtf8($subject));
    $mail->SetFrom($from_email, Cp1251ToUtf8($from));
    $mail->AddTo($email, Cp1251ToUtf8('Администратор'));
    $post_text = '';
    foreach ($data_rows as $row) {
        if ($row[2] == 'file') {
            $mail->AddAttachmentPart(file_get_contents($row[1]), $row[3]);
        } else {
            $post_text .= '<b>' . SafeDB($row[0], 255, str) . ':</b><br />' . SafeDB($row[1], 0, str) . '<br />';
        }
    }
    $text = Indent('
		<html>
		<head>
			<title>Форма</title>
		</head>
		<body>
			<table cellspacing="2" cellpadding="10" border="1">
				<tr>
					<th>Дата: ' . TimeRender($time, true, false) . '</th>
					<th>Пользователь: ' . $user . '</th>
					<th>IP: ' . $ip . '</th>
				</tr>
				<tr>
					<td colspan="3" style="text-align: left;">' . $post_text . '</td>
				</tr>
			</table>
		</body>
		</html>
	');
    $mail->AddHtmlPart(Cp1251ToUtf8($text));
    if (!$mail->Send()) {
        ErrorHandler(USER_ERROR, 'Проблема при отправке E-mail "' . $subject . '".', __FILE__);
    }
}
            $admin_login = '******';
            $admin_pass = '';
            $admin_email = 'support@' . $host;
        }
        $this->SetTitle("Создание учетной записи Главного администратора");
        $this->OpenForm('admin&p=2');
        $text = Indent('
			<table width="40%" align="center">
				<tr>
					<td>Логин:</td>
					<td><input type="text" name="login" value="' . $admin_login . '" style="width: 200px;"></td>
				</tr>
				<tr>
					<td>Пароль:</td>
					<td>
						<div style="white-space: nowrap;"><input type="text" name="pass" id="admin_password" value="' . $admin_pass . '" style="width: 200px;">
						<a href="#" onclick="GenPass(); return false;"><img src="images/admin/refresh.png" title="Сгенерировать новый пароль" style="vertical-align: middle;"></a></div>
					</td>
				</tr>
				<tr>
					<td>E-mail:</td>
					<td><input type="text" name="email" value="' . $admin_email . '" style="width: 200px;"></td>
				</tr>
			</table>
			<p>Запишите или запомните введённые данные!</p>
		');
        $this->SetContent($text);
        $this->AddSubmitButton('Сохранить');
        break;
    case 2:
        $errors = array();
        $admin_login = $_POST['login'];
if (!defined('VALID_RUN')) {
    header("HTTP/1.1 404 Not Found");
    exit;
}
if (isset($_GET['p'])) {
    $p = SafeEnv($_GET['p'], 1, int);
} else {
    $p = 1;
}
switch ($p) {
    case 1:
        $this->SetTitle("Установка завершена!");
        $text = Indent('
			<h2 class="title" align="center">Спасибо за установку!</h2><br>
			<p align="center">Система LinkorCMS была успешно установлена на Ваш сервер.<br>
			Теперь Вы можете перейти в панель администратора и настроить систему по своему вкусу <br>
			или перейти на только что установленный сайт.<br><br></p>
			<p style="color: #FF0000;font-weight: bold;" align="center">Внимание! В целях безопасности удалите файл setup.php c сервера!</p>
		');
        $this->SetContent($text);
        $this->AddButton('Админ-панель', 'finish&p=3');
        $this->AddButton('На сайт', 'finish&p=2');
        break;
    case 2:
        GO('index.php');
        break;
    case 3:
        global $config;
        GO($config['admin_file']);
        break;
}
function AdminGalleryUpload()
{
    // TODO: неправильный порядок изображений при мультизагрузке
    if (!isset($_POST['action']) || !isset($_GET['formid']) || !isset($_SESSION['uploadforms'][$_GET['formid']])) {
        AdminGalleryUploadForm();
        return;
    }
    global $GalleryDir, $ThumbsDir;
    $formid = $_GET['formid'];
    // Загрузка фотографий
    if ($_POST['action'] == 'upload') {
        // SwfUpload кодирует имена файлов в UTF-8
        $_FILES['up_image']['name'] = Utf8ToCp1251($_FILES['up_image']['name']);
        $Error = false;
        $_SESSION['uploadforms'][$formid]['photos'][] = LoadImage('up_image', $GalleryDir, $ThumbsDir, System::config('gallery/thumb_max_width'), System::config('gallery/thumb_max_height'), '', $Error, true, System::config('gallery/optimize_originals'), System::config('gallery/original_width'), System::config('gallery/original_height'));
        if ($Error) {
            exit('ERROR 2');
        }
        exit('OK');
    }
    // Предпросмотр добавляемых фотографий
    $_SESSION['uploadforms'][$formid]['category'] = $_POST['category'];
    $_SESSION['uploadforms'][$formid]['allow_comments'] = EnToInt($_POST['allow_comments']);
    $_SESSION['uploadforms'][$formid]['allow_votes'] = EnToInt($_POST['allow_votes']);
    $_SESSION['uploadforms'][$formid]['show'] = EnToInt($_POST['show']);
    $_SESSION['uploadforms'][$formid]['view'] = ViewLevelToInt($_POST['view']);
    AddCenterBox('Мультизагрузка - предпросмотр');
    $count_photos = count($_SESSION['uploadforms'][$formid]['photos']);
    $text = '<form action="' . ADMIN_FILE . '?exe=gallery&a=saveuploaded&formid=' . $formid . '" method="post">';
    $submits = System::admin()->Submit('Отмена', 'name="submit_cancel" value="cancel"') . System::admin()->Submit('Сохранить', 'name="submit_save" value="save"');
    $text .= '<div class="cfgboxsubmit"><div style="float: left;">Загружено ' . $count_photos . ' изображений.</div>' . $submits . '</div>';
    foreach ($_SESSION['uploadforms'][$formid]['photos'] as $id => $photo) {
        $func = System::admin()->SpeedAjax('Удалить', ADMIN_FILE . '?exe=gallery&a=deleteuploaded&id=' . $id . '&formid=' . $formid, 'images/admin/delete.png', '', '', "jQuery('#photo_box_{$id}').fadeOut();");
        $text .= Indent('
			<div class="cfgbox" id="photo_box_' . $id . '">
				<table cellspacing="0" cellpadding="0" border="0" style="width: 100%;">
					<tr>
						<td style="vertical-align: top; width: 160px;">
							<a href="' . $GalleryDir . $photo . '" target="_blank"><img src="' . $ThumbsDir . $photo . '" /></a>
							' . $photo . '
						</td>
						<td style="vertical-align: top;">
							<table cellspacing="2" cellpadding="4" style="width: 100%;" class="cfgtable">
								<tr>
									<td>Заголовок</td>
									<td colspan="3" style="text-align: left;">' . System::admin()->Edit('title_' . $id, '', false, 'maxlength="250" style="width:400px;"') . '</td>
								</tr>
								<tr>
									<td>Описание (HTML)</td>
									<td colspan="3" style="text-align: left;">' . System::admin()->TextArea('description_' . $id, '', 'style="width: 400px; height: 120px;"') . '</td>
								</tr>
								<tr>
									<td>Автор</td>
									<td style="text-align: left;">' . System::admin()->Edit('author_' . $id, '', false, 'maxlength="250" style="width:200px;"') . '</td>
									<td>Email автора</td>
									<td style="text-align: left;">' . System::admin()->Edit('email_' . $id, '', false, 'maxlength="250" style="width:200px;"') . '</td>
								</tr>
								<tr>
									<td>Сайт автора</td>
									<td colspan="3" style="text-align: left;">' . System::admin()->Edit('www_' . $id, '', false, 'maxlength="250" style="width:200px;"') . '</td>
								</tr>
							</table>
						</td>
						<td style="vertical-align: top; text-align: right; width: 50px;">' . $func . '</td>
					</tr>
				</table>
			</div>
		');
    }
    $text .= '<div class="cfgboxsubmit">' . $submits . '</div>';
    $text .= '</form>';
    AddText($text);
}
function AdminAuditReferers()
{
    System::admin()->AddCenterBox('Переходы с сайтов (Рефералы)');
    $query = System::database()->Select('referers', '');
    SortArray($query, 'count', true);
    $allcount = 0;
    $count = count($query);
    if (isset($_GET['page'])) {
        $page = SafeEnv($_GET['page'], 10, int);
    } else {
        $page = 1;
    }
    $num = 50;
    if ($count > $num) {
        $navigator = new Navigation($page);
        $navigator->GenNavigationMenu($query, $num, ADMIN_FILE . '?exe=audit&a=referers');
        $nav = true;
    } else {
        $nav = false;
    }
    if ($count == 0) {
        System::admin()->Highlight('Рефералов не было обнаружено.');
    } elseif ($count >= 1) {
        $text = '<table cellspacing="0" cellpadding="0" class="cfgtable">';
        $text .= Indent('<tr>
			<th>Реферал</th>
			<th>Переходов</th>
		</tr>');
        foreach ($query as $q) {
            $referer = 'http://' . $q['referer'];
            $title = AdminAuditDecodeUrl($referer);
            $count = SafeDB($q['count'], 11, int);
            $allcount += $count;
            $text .= '<tr>
			<td><a href="' . $referer . '" target="_blank">' . $title . '</a></td>
			<td>' . $count . '</td>
			</tr>';
        }
        $text .= '</table>';
        $text .= 'Всего переходов на этой странице: <b>' . $allcount . '</b>.&nbsp;' . System::admin()->SpeedConfirm('Очистить  лог', ADMIN_FILE . '?exe=audit&a=clear_referers', '', 'Очистить лог рефералов?', true, true);
        AddText($text);
        if ($nav) {
            AddNavigation();
        }
    }
}
function 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();
    }
}
function AdminSmilesEditSmile()
{
    global $smilies_dir, $mod;
    System::admin()->AddJS(Indent('
		SelectSmile = function(){
			var selected = $("#smile_file option:selected");
			$("#smile_image").prop("src", "' . $smilies_dir . '"+selected.val());
			$("#smile_code").val(selected.attr("code"));
			$("#smile_desc").val(selected.attr("description"));
		};
	'));
    $id = 0;
    $file = '';
    $code = '';
    $desc = '';
    $enabled = true;
    $box_title = 'Добавить смайлик';
    $submit = 'Добавить';
    if (isset($_GET['id'])) {
        $id = SafeEnv($_GET['id'], 11, int);
        System::database()->Select('smilies', "`id`='{$id}'");
        $smile = System::database()->FetchRow();
        $file = $smile['file'];
        $code = SafeDB($smile['code'], 255, str);
        $desc = SafeDB($smile['desc'], 255, str);
        $enabled = SafeDB($smile['enabled'], 1, bool);
        $submit = 'Сохранить';
        $box_title = 'Редактирование смайлика';
        System::admin()->AddOnLoadJS('$("#smile_image").prop("src", "' . $smilies_dir . '"+$("#smile_file option:selected").val());');
    } else {
        System::admin()->AddOnLoadJS('SelectSmile();');
    }
    AddCenterBox($box_title);
    $smilies = System::database()->Select('smilies');
    $xor = array();
    if ($id == 0) {
        $xor =& $smilies;
    } else {
        foreach ($smilies as $smile) {
            if ($smile['id'] != $id) {
                $xor[] = $smile;
            }
        }
    }
    $smilies_data = AdminSmiliesGetData($file, $xor);
    if ($id == 0 && count($smilies_data) == 0) {
        System::admin()->Highlight('Загрузите изображения смайликов в папку <b>' . $smilies_dir . '</b> для добавления.');
        return;
    }
    FormRow('Изображение', System::site()->Select('file', $smilies_data, false, 'onchange="SelectSmile()" id="smile_file" class="autofocus"'));
    FormRow('Предпросмотр', '<img id="smile_image">');
    FormRow('Код', System::site()->Edit('code', $code, false, 'style="width: 200px;" id="smile_code"'));
    FormRow('Описание', System::site()->Edit('desc', $desc, false, 'style="width: 200px;" id="smile_desc"'));
    FormRow('Показывать', System::admin()->Select('indexview', GetEnData($enabled, 'Да', 'Нет')));
    AddForm('<form name="newsmile" action="' . $mod . '&a=save' . ($id != 0 ? '&id=' . $id : '') . '" method="post">', System::site()->Button('Отмена', 'onclick="history.go(-1)"') . System::site()->Submit($submit));
}
function AdminViewRetrofittingList()
{
    if (!AdminConfigPlugins()) {
        $access_config = 'System::config(';
    } else {
        $access_config = 'System::plug_config(';
    }
    $back = SaveRefererUrl();
    $groupid = 1;
    if (isset($_GET['group'])) {
        $groupid = SafeEnv($_GET['group'], 11, int);
    }
    $groups_data = array();
    $groups = array();
    System::admin()->DataAdd($groups_data, 0, 'Все группы', $groupid == 0);
    System::database()->Select(AdminConfigGroupTable());
    SortArray(System::database()->QueryResult, 'hname');
    while ($group = System::database()->FetchRow()) {
        $sel = false;
        if ($groupid != 0) {
            $sel = $group['id'] == $groupid;
        }
        System::admin()->DataAdd($groups_data, SafeDB($group['id'], 11, int), SafeDB($group['hname'], 255, str), $sel);
        $groups[$group['id']] = $group;
    }
    System::admin()->AddCenterBox('Все настройки');
    System::admin()->AddJS(Indent('
		RetrofittingSelectGroup = function(){
			Admin.LoadPage("' . ADMIN_FILE . '?exe=config_admin' . (AdminConfigPlugins() ? '&a=view_all_plugins&plugins=1' : '') . '&group="+$("#retrofitting-group").val());
		}
	'));
    $text = '<div style="text-align: left; margin-bottom: 10px;">Группа: ' . System::site()->Select('group', $groups_data, false, 'id="retrofitting-group" onchange="RetrofittingSelectGroup();"') . '</div>';
    System::admin()->AddText($text);
    System::database()->Select(AdminConfigConfigTable(), $groupid > 0 ? "`group_id`='{$groupid}'" : '');
    SortArray(System::database()->QueryResult, 'name');
    $text = '<table cellspacing="0" cellpadding="0" class="cfgtable">';
    $text .= Indent('
		<tr>
			<th>№</th>
			<th>Настройка</th>
			<th>PHP код</th>
			<th>Видимая</th>
			<th>Функции</th>
		</tr>
	');
    $id = 0;
    while ($conf = System::database()->FetchRow()) {
        $id++;
        $confid = SafeDB($conf['id'], 11, int);
        $func = '';
        $func .= System::admin()->SpeedButton('Редактировать', ADMIN_FILE . '?exe=config_admin&a=edit&id=' . $confid . (AdminConfigPlugins() ? '&plugins=1' : '') . '&back=' . $back, 'images/admin/edit.png');
        $func .= System::admin()->SpeedConfirm('Удалить', ADMIN_FILE . '?exe=config_admin&a=delete&id=' . $confid . '&ok=0' . (AdminConfigPlugins() ? '&plugins=1' : '') . '&back=' . $back, 'images/admin/delete.png', 'Это может повлиять на работу системы. Нажмите отмена, если не уверены. Удалить настройку?');
        $access = $access_config . "<span style=\"color: #008200\">'" . SafeDB($groups[$conf['group_id']]['name'], 255, str) . '/' . "" . SafeDB($conf['name'], 255, str) . "'</span>)";
        //		$install_vals = Values('', $conf['group_id'], $conf['name'], $conf['value'],
        //			$conf['visible'], $conf['hname'], $conf['description'], $conf['kind'],
        //			$conf['values'], $conf['savefunc'], $conf['type'], $conf['autoload']);
        //		$install = 'System::database()->Insert("'.AdminConfigConfigTable().'","'.$install_vals.'");';
        if ($conf['visible'] == '1') {
            $visible = '<font color="#008000">Да</font>';
        } else {
            $visible = '<font color="#FF0000">Нет</font>';
        }
        $text .= Indent('
			<tr>
				<td>' . $id . '</td>
				<td style="text-align: left; padding-left: 10px; ' . ($conf['visible'] == '0' ? 'color: #888;' : '') . '">' . SafeDB($conf['hname'], 255, str) . '</td>
				<td style="text-align: left; padding-left: 10px;">' . $access . '</td>
				<td>' . $visible . '</td>
				<td>' . $func . '</td>
			</tr>
		');
    }
    $text .= '</table>';
    if (isset($_GET['saveok'])) {
        System::admin()->Highlight('Изменения сохранены.');
    } elseif (isset($_GET['addok'])) {
        System::admin()->Highlight('Настройка добавлена.');
    } elseif (isset($_GET['delok'])) {
        System::admin()->Highlight('Настройка удалена.');
    }
    System::admin()->AddText($text);
}
function AdminAdminMenuEditor()
{
    UseScript('jquery');
    System::admin()->AddJS(Indent(<<<JS
\t\tSelectLinkType = function(type, first){
\t\t\t\$('.aaml').hide();
\t\t\tif(first){
\t\t\t\t\$('.aaml_'+type).show();
\t\t\t}else{
\t\t\t\t\$('.aaml_'+type).fadeIn(1000);
\t\t\t}
\t\t};
\t\tSelectModule = function(mod){
\t\t\t\tvar mod = \$(mod).find('option:selected').attr('title');
\t\t\t\t\$('#item_title').val(mod).focus();
\t\t};
JS
));
    $id = -1;
    $parent = 0;
    if (isset($_GET['parent'])) {
        $parent = SafeEnv($_GET['parent'], 11, int);
    }
    $module = '';
    $title = '';
    $icon = '';
    $admin_link = '';
    $external_link = '';
    $blank = false;
    $js = '';
    $type = 'admin';
    //(admin|external|js|node|delimiter)
    $enabled = true;
    if (isset($_GET['id'])) {
        $id = SafeEnv($_GET['id'], 11, int);
        System::database()->Select('adminmenu', "`id`='{$id}'");
        $item = System::database()->FetchRow();
        $parent = SafeDB($item['parent'], 11, int);
        $module = SafeDB($item['module'], 255, str);
        $title = SafeDB($item['title'], 255, str);
        $icon = SafeDB($item['icon'], 255, str);
        $admin_link = SafeDB($item['admin_link'], 255, str);
        $external_link = SafeDB($item['external_link'], 255, str);
        $blank = SafeDB($item['blank'], 1, bool);
        $js = SafeDB($item['js'], 0, str);
        $type = SafeDB($item['type'], 255, str);
        $enabled = SafeDB($item['enabled'], 1, bool);
        $form_title = 'Редактирование элемента';
        $button = 'Сохранить';
    } else {
        $form_title = 'Добавить элемент';
        $button = 'Добавить';
    }
    System::admin()->AddOnLoadJS("SelectLinkType('{$type}', true);");
    $items_db = System::database()->Select('adminmenu', "`type`<>'delimiter'");
    $items_tree = new Tree($items_db);
    $parent_data = $items_tree->GetCatsData($parent, false, true, $id, true);
    $modules_db = System::database()->Select('modules');
    $modules_data = array();
    System::admin()->DataAdd($modules_data, '', '', '' == $module);
    foreach ($modules_db as $mod) {
        System::admin()->DataAdd($modules_data, $mod['folder'], $mod['name'], $mod['folder'] == $module);
    }
    $types_data = array();
    $types_av = array('admin' => 'Внутренняя ссылка', 'external' => 'Внешняя ссылка', 'js' => 'JavaScript', 'node' => 'Категория', 'delimiter' => 'Разделитель');
    foreach ($types_av as $t => $c) {
        System::admin()->DataAdd($types_data, $t, $c, $t == $type);
    }
    System::admin()->FormRow('Родительский элемент', System::admin()->Select('parent', $parent_data, false, $parent == 0 ? 'class="autofocus"' : ''));
    System::admin()->FormRow('Модуль', System::admin()->Select('module', $modules_data, false, 'onchange="SelectModule(this);"' . ($parent != 0 ? ' class="autofocus"' : '')));
    System::admin()->FormRow('Заголовок', System::site()->Edit('title', $title, false, 'id="item_title" style="width:400px;" maxlength="255"'));
    System::admin()->FormRow('Иконка (16x16)', System::site()->Edit('icon', $icon, false, 'style="width:400px;" maxlength="255"'));
    System::admin()->FormRow('Тип', System::admin()->Select('type', $types_data, false, 'onchange="SelectLinkType(this.value);"'));
    System::admin()->FormRow('Внутренняя ссылка', System::site()->Edit('admin_link', $admin_link, false, 'style="width:400px;" maxlength="255"'), 'class="aaml aaml_admin"');
    System::admin()->FormRow('Внешняя ссылка', System::site()->Edit('external_link', $external_link, false, 'style="width:400px;" maxlength="255"'), 'class="aaml aaml_external"');
    System::admin()->FormRow('Открыть ссылку в новом окне/вкладке', System::admin()->Select('blank', GetEnData($blank, 'Да', 'Нет')), 'class="aaml aaml_external"');
    System::admin()->FormTextRow('JavaScript', System::site()->TextArea('js', $js, 'style="width:400px;height:100px;"'), 'class="aaml aaml_js"');
    System::admin()->FormRow('Включить', System::admin()->Select('enabled', GetEnData($enabled, 'Да', 'Нет')));
    System::admin()->AddCenterBox($form_title);
    System::admin()->AddForm('<form action="' . ADMIN_FILE . '?exe=adminmenu&a=save' . ($id != -1 ? '&id=' . $id : '') . '" method="post">', System::site()->Button('Отмена', 'onclick="history.go(-1)"') . System::site()->Submit($button));
}
function AdminExtensionsInstall()
{
    global $db, $config, $site;
    // Для обратной совместимости
    $count = SafeEnv($_POST['count'], 11, int);
    $new_installed = array();
    for ($i = 0; $i < $count; $i++) {
        if (isset($_POST['install_' . $i])) {
            $type = $_POST['type_' . $i];
            $folder = RealPath2($_POST['folder_' . $i], 255, str);
            switch ($type) {
                case EXT_PLUGIN:
                    $group = '';
                    $group_info = null;
                    if (isset($_POST['group_' . $i])) {
                        $group = $_POST['group_' . $i];
                        $group_info = ExtLoadInfo(System::config('plug_dir') . $group);
                    }
                    $path = RealPath2(System::config('plug_dir') . $group . '/' . $folder);
                    $info = ExtLoadInfo($path, $group_info);
                    if ($info === false) {
                        continue;
                    }
                    if (isset($info['1.3'])) {
                        // Установка старой версии плагина
                        $function = '';
                        if (isset($info['function'])) {
                            $function = $info['function'];
                        }
                        $type = '';
                        if (isset($info['function'])) {
                            $type = $info['function'];
                        }
                        ExtAddPlugin($group, $folder, $info['function'], $info['type']);
                        if (is_file($path . '/install.php')) {
                            require $path . '/install.php';
                        }
                        $new_installed[] = $info;
                    } else {
                        if (is_file($path . '/install.php')) {
                            // Наличие install.php обязательно
                            require $path . '/install.php';
                            $new_installed[] = $info;
                        }
                    }
                    Audit('Расширения: Установка плагина: ' . $group . '/' . $folder);
                    break;
                case EXT_BLOCK:
                    $path = RealPath2(System::config('blocks_dir') . $folder);
                    $info = ExtLoadInfo($path);
                    if ($info === false) {
                        continue;
                    }
                    require $path . '/install.php';
                    $new_installed[] = $info;
                    Audit('Расширения: Установка блока: ' . $folder);
                    break;
                case EXT_MODULE:
                    $path = RealPath2(System::config('mod_dir') . $folder);
                    $info = ExtLoadInfo($path);
                    if ($info === false) {
                        continue;
                    }
                    require $path . '/install.php';
                    if (isset($info['1.3'])) {
                        // Добавляем пункт меню
                        $folder = SafeEnv($folder, 255, str);
                        $mod_name = SafeEnv($info['name'], 255, str);
                        AdminMenuAddModule($mod_name, $folder);
                    }
                    $new_installed[] = $info;
                    Audit('Расширения: Установка модуля: ' . $folder);
                    break;
                case EXT_TEMPLATE:
                    // Установка тем оформления происходит автоматически
                    $path = RealPath2(System::config('tpl_dir') . $folder);
                    $info = ExtLoadInfo($path);
                    if ($info === false) {
                        $info = array('name' => $folder, 'description' => '', 'author' => '', 'site' => '', 'version' => '1.0', 'admin' => false);
                    }
                    $admin = isset($info['admin']) && $info['admin'] ? '1' : '0';
                    ExtAddTemplate($info['name'], $folder, $admin);
                    $new_installed[] = $info;
                    Audit('Расширения: Установка шаблона: ' . $folder);
                    break;
            }
        }
    }
    $html = '';
    $html .= '<div style="border: 1px #cfcfcf solid; width: 50%; background-color: #fff; margin-bottom: 5px;">';
    if (count($new_installed) > 0) {
        foreach ($new_installed as $info) {
            $html .= Indent('
				<table style="width: 100%;">
					<tr>
						<td style="padding: 5px;">' . SafeDB($info['name'], 255, str) . '</td>
						<td style="width: 120px; padding: 5px;"><img src="images/admin/accept.png" style="vertical-align: middle;" /> Установлено</td>
					</tr>
				</table>
			');
        }
        $html .= '</div>' . System::admin()->Button('Назад', 'onclick="history.go(-1);"') . System::admin()->Button('Далее', "onclick=\"Admin.LoadPage('" . ADMIN_FILE . "?exe=extensions');\"");
        System::cache()->Clear('config');
    } else {
        $html .= '<div style="padding:  5px;">Вы не выбрали расширения для установки. Нажмите "назад" и отметьте галочками расширения которые нужно установить.</div>';
        $html .= '</div>' . System::admin()->Button('Назад', 'onclick="history.go(-1);"');
    }
    System::admin()->AddTextBox('Установка расширений', $html);
}
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));
}