Просмотр файла guestbook/index.php

Размер файла: 47.78Kb
<?php
/**
 * Гостевая гнига на файлах AGB!
 * Версия: 1.0
 * Автор: Jeey
 * Email: [email protected]
 * ICQ: 9510787
 * Сайт: http://jeey.ru
 */

//error_reporting(E_ALL);

session_name('sid');
session_start();

define('ST', microtime(true));
define('SID', constant('sid'));

include('system/config.inc.php');
include('system/func_active.inc.php');

// Получаем браузер и айпи юзера

$ua = '?#?';

if( !empty($_SERVER['HTTP_X_OPERAMINI_PHONE_UA']) )
{
    $ua = '(OM) ' . clean($_SERVER['HTTP_X_OPERAMINI_PHONE_UA'], 100, '?#?');
}
elseif( !empty($_SERVER['HTTP_USER_AGENT']) )
{
    $ua = clean($_SERVER['HTTP_USER_AGENT'], 100, '?#?');
}

$ip = $_SERVER['REMOTE_ADDR'];

// Присваиваем куки id юзеру

if( !isset($_COOKIE['id']) )
{
    setcookie('id', md5(uniqid(rand() , 1)), time() + 31536000);
}

// Достаем из кукисов данные юзера

$_COOKIE['name'] = ( empty($_COOKIE['name']) ? '' : clean($_COOKIE['name'], Q_NAME) );
$_COOKIE['email'] = ( empty($_COOKIE['email']) ? '' : clean($_COOKIE['email'], 20) );
$_COOKIE['icq'] = ( empty($_COOKIE['icq']) ? '' : clean($_COOKIE['icq'], 10) );
$_COOKIE['id'] = ( empty($_COOKIE['id']) ? '' : clean($_COOKIE['id'], 32) );

// Авторизация админа

$auth = isset($_SESSION['admin_name'], $_SESSION['admin_email'], $_SESSION['admin_icq']);

// Онлайн счетчик

$online = file('data/online.dat');
$cnt = count($online) - 1;
$new_online = true;
$time = time();

for( $i = 0; $i <= $cnt; $i++ )
{
    $o = explode('|', rtrim($online[$i]));

    if( $ip == $o[3] )
    {
        $online[$i] = $time + (ONLINE_TIME * 60) . '|' . ( $auth ? $_SESSION['admin_name'] : $_COOKIE['name'] ) . "|$ua|$ip\r\n";
        $new_online = false;
    }
    elseif( $time > $o[0] )
    {
        $online[$i] = '';
    }
}

if( $new_online )
{
    $online[] = $time + (ONLINE_TIME * 60) . '|' . ( $auth ? $_SESSION['admin_name'] : $_COOKIE['name'] ) . "|$ua|$ip\r\n";
}

puts('data/online.dat', implode($online), 'w');

// Заголовки и шапка

header('Content-type: application/vnd.wap.xhtml+xml; charset=UTF-8');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Cache-Control: no-cache, must-revalidate');
header('Pragma: no-cache');
header('Last-Modified: ' . gmdate('r') . ' GMT');

$header = '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="copyright" content="Powered by Jeey.RU" />
<link rel="stylesheet" type="text/css" href="style/style.css" />
<title>' . TITLE . '</title>
</head>
<body>
<div class="header">' . ( $auth ? 'Админ-панель <strong>[' . $_SESSION['admin_name'] . ']</strong>' : HEADER_TEXT ) . '</div>' . "\r\n";

// Если переходим на сайт

if( isset($_GET['site']) )
{
    $_GET['site'] = clean($_GET['site'], 500);

    header('Refresh: 3; URL=' . str_replace('&amp;', '&', $_GET['site']));
    echo '<a href="' . $_GET['site'] . '">' . $_GET['site'] . '</a>';
    exit;
}

// Страницы (для юзера)

if( !$auth )
{
    if( isset($_GET['add']) ) // Страница добавления сообщения
    {
        // Вытаскиваем данные юзера

        $message = file('data/message.dat');
        $is_id = false;

        if( isset($_GET['id']) )
        {
            $_GET['id'] = (int) $_GET['id'];

            if( array_key_exists($_GET['id'], $message) )
            {
                $m = explode('|', rtrim($message[$_GET['id']]));
                $is_id = true;
            }
        }

        $error = '';

        if( isset($_POST['send']) )
        {
            $_POST['name'] = ( empty($_POST['name']) ? '' : clean($_POST['name'], Q_NAME) );
            $_POST['email'] = ( empty($_POST['email']) ? '' : clean($_POST['email'], 20) );
            $_POST['icq'] = ( empty($_POST['icq']) ? '' : clean($_POST['icq'], 10) );
            $_POST['text'] = ( empty($_POST['text']) ? '' : clean($_POST['text'], Q_TEXT) );
            $_POST['code'] = ( isset($_POST['code']) ? (int) $_POST['code'] : '' );

            // Сначала проверяем, не забанен ли юзер. Потом всё остальное

            if( preg_match('/' . preg_quote("1|$ip|$ua", '/') . ( $_COOKIE['id'] ? '|' . preg_quote('2|' . $_COOKIE['id'], '/') : '' ) . '|' . preg_quote("3|$ip", '/') . '/', file_get_contents('data/ban.dat')) )
            {
                $error.= '<div><span class="green">- Вы заблокированы и не можете добавлять сообщения!</span></div>';
            }
            else
            {
                foreach( $admin as $v )
                {
                    $admin_name[] = strtok($v, '|');
                }

                if( !$_POST['name'] )
                {
                    $error.= '<div>- Вы не ввели имя.</div>';
                }
                elseif( !preg_match('/[;,~!:@&\.\?\/\[\]\(\)\*\+\-=еёа-яa-z0-9]+/iu', $_POST['name']) )
                {
                    $error.= '<div>- В имени обнаружены недопустимые символы.</div>';
                }
                elseif( in_array($_POST['name'], $admin_name) )
                {
                    $error.= '<div><span class="green">- Нельзя писать от этого имени! Пожалуйста, придумайте себе другое.</span></div>';
                }

                if( $_POST['email'] && !preg_match('/^~?[\.\-a-zA-Z_]+@[\.\-a-zA-Z]+$/', $_POST['email']) )
                {
                    $error.= '<div>- Вы ввели некорректный E-mail адрес.</div>';
                }

                if( $_POST['icq'] && !preg_match('/^~?[0-9]+$/', $_POST['icq']) )
                {
                    $error.= '<div>- ICQ может содержать только цифры.</div>';
                }

                if( !$_POST['text'] )
                {
                    $error.= '<div>- Вы не ввели текст.</div>';
                }

                if( !isset($_SESSION['code']) )
                {
                    exit('oops!');
                }

                if( !$_POST['code'] )
                {
                    $error.= '<div>- Вы не ввели проверочный код.</div>';
                }
                elseif( $_POST['code'] != $_SESSION['code'] )
                {
                    $error.= '<div>- Вы неверно ввели проверочный код.</div>';
                }
                unset($_SESSION['code']);
            }

            // Если все верно, приступаем к записи сообщения

            if( !$error )
            {
                // Загружаем файл с функциями

                include('system/func_not_active.inc.php');

                // Обрабатываем

                $_POST['text'] = bbcodesmile(str_replace("\r\n", '<br/>', $_POST['text']));

                // Транслитируем

                if( isset($_POST['tr_name']) )
                {
                    $_POST['name'] = translate($_POST['name']);
                }

                if( isset($_POST['tr_text']) )
                {
                    $_POST['text'] = translate($_POST['text']);
                }

                // Если пишем определённому юзеру, то добавляем его имя в начало текста

                if( $is_id )
                {
                    $_POST['text'] = $m[1] . ', ' . $_POST['text'];
                }

                // Проверяем сообщение на одинаковость с последним сообщением

                if( $message )
                {
                    $search = explode('|', end($message));

                    if( $_POST['name'] == $search[1] && $_POST['text'] == $search[9] )
                    {
                        header('Location: ./' . ( SID ? '?' . SID : '' ));
                        exit;
                    }
                }

                // Записываем данные юзера в куки

                setcookie('name', $_POST['name'], time() + 31536000);
                setcookie('email', $_POST['email'], time() + 31536000);
                setcookie('icq', $_POST['icq'], time() + 31536000);

                // Удалялка старых сообщений

                if( count($message) >= MAX_MESSAGE )
                {
                    $message[0] = '';
                }

                // Записываем сообщение в файл

                $message[] = 'user|' . $_POST['name'] . '|' . date('j.m') . '|' . date('H:i') . '|' . $_POST['email'] . '|'. $_POST['icq'] . "|$ua|$ip|" . $_COOKIE['id'] . '|' . $_POST['text'] . "|||\r\n";

                puts('data/message.dat', implode($message), 'w');

                header('Location: ./' . ( SID ? '?' . SID : '' ));
                exit;
            }
        }

        // Шапка

        echo $header . '<div class="top"><a href="?help' . ( $is_id ? '&amp;id=' . $_GET['id'] : '' ) . '">Помощь</a></div>' . "\r\n";

        // Выводим ошибки, если есть

        if( $error )
        {
            echo '<div class="b"><span class="red"><strong>Ошибка!</strong></span><br/>' . $error . '</div>' . "\r\n";
        }

        // Генерируем число для каптчи

        $_SESSION['code'] = rand(1000, 9999);

        // Форма ввода

        echo '<div class="a"><form action="?add' . ( $is_id ? '&amp;id=' . $_GET['id'] : '' ) . '" method="post"><fieldset>' . "\r\n",
        'Имя: [' . Q_NAME . ']<br /><input type="text" name="name" value="' . ( $error ? $_POST['name'] : $_COOKIE['name'] ) . '" maxlength="' . Q_NAME . '" class="texta" size="16" /><br /><input type="checkbox" name="tr_name" /> Транслит<br />' . "\r\n",
        'Email: [20]<br /><input type="text" name="email" value="' . ( $error ? $_POST['email'] : $_COOKIE['email'] ) . '" maxlength="20" class="text" size="16" /><br />' . "\r\n",
        'ICQ: [10]<br /><input type="text" name="icq" value="' . ( $error ? $_POST['icq'] : $_COOKIE['icq'] ) . '" maxlength="9" class="text" size="16" /><br />' . "\r\n",
        ( $is_id ? '<strong>' . $m[1] . '</strong>,' : 'Текст:' ) . ' [' . Q_TEXT . ']<br /><textarea name="text" cols="15" rows="2" class="texta">' . ( $error ? $_POST['text'] : '' ) . '</textarea><br /><input type="checkbox" name="tr_text" /> Транслит<br />' . "\r\n",
        '<img src="code/code.php?' . rand(1000, 9999) . ( SID ? '&amp;' . SID : '' ) . '" alt="" width="65" height="25"/><br />Проверочное число:<br /><input type="text" name="code" maxlength="4" size="4" class="texta" /><br />' . "\r\n",
        '<input type="submit" name="send" value="Написать" class="submit" />' . "\r\n",
        '</fieldset></form></div>' . "\r\n";

        // Данные пользователя

        if( $is_id )
        {
            echo '<div class="b"><strong>Данные пользователя</strong><br />' . "\r\n",
            '<img src="style/email.gif" alt="Email" /> ' . ( $m[4] && $m[4]{0} != '~' ? $m[4] : 'Не указано' ) . '<br />' . "\r\n",
            '<img src="style/icq.gif" alt="ICQ" /> ' . ( $m[5] && $m[5]{0} != '~' ? $m[5] : 'Не указано' ) . '</div>' . "\r\n";
        }

        echo '<div class="bottom"><a href="./">Назад</a> • <a href="/">На главную</a></div>';
    }
    elseif( isset($_GET['help']) ) // Страница помощи
    {
        $_GET['id'] = ( isset($_GET['id']) ? '&amp;id=' . (int) $_GET['id'] : '' );

        echo $header;

        if( isset($_GET['smile']) ) // Страница смайлов
        {
            $smile = array_diff(array_map(create_function('$v', 'return substr($v, 0, -4);'), scandir('smile/')), array(''));
            rsort($smile);
            $all = count($smile);
            $page = ( isset($_GET['page']) ? (int) $_GET['page'] : 1 );
            $num_pages = ceil($all / Q_PSMILE);
            $start = $page * Q_PSMILE - Q_PSMILE;

            if( $page > $num_pages || $page < 1 )
            {
                $page = 1;
                $start = 0;
            }

            echo '<div class="top">Смайлы</a></div>' . "\r\n";

            // Выводим

            if( $all )
            {
                echo '<div class="a">' . "\r\n";

                for( $i = $all - $start - 1; $i >= $all - $start - Q_PSMILE && isset($smile[$i]); $i-- )
                {
                    echo ':' . $smile[$i] . ': <img src="smile/' . $smile[$i] . '.gif" alt=":' . $smile[$i] . ':" /><br />' . "\r\n";
                }

                echo '</div>' . "\r\n";

                // Навигация

                echo '<div class="bottom">' . ( $num_pages >= 10 ? '<a href="?go&amp;back=' . $page . '">Стр.</a>' : 'Стр.' );

                for( $pr = '', $i = 1; $i <= $num_pages; $i++ )
                {
                    echo $pr = (($i == 1 || $i == $num_pages || abs($i - $page) < 3) ? ($i == $page ? " [$i] " : ' <a href="./?help&amp;smile' . $_GET['id'] . '&amp;page=' . $i . '">' . $i . '</a> ') : (($pr == ' .. ' || $pr == '') ? '' : ' .. '));
                }
            }
            else
            {
                echo '<div class="a">Смайлов нет.</div>' . "\r\n",
                '<div class="bottom">Стр. [1]';
            }

            echo ' • <a href="?help' . $_GET['id'] . '">Назад</a> • <a href="./">В гостевую</a> • <a href="/">На главную</a></div>';
        }
        elseif( isset($_GET['bbcode']) ) // Страница ббкодов
        {
            echo '<div class="top">ББ коды</div>' . "\r\n",
            '<div class="a">' . "\r\n",
            '<strong>[b]Текст[/b]</strong><br />' . "\r\n",
            '<span class="red">[red]Текст[/red]</span><br />' . "\r\n",
            '<span class="green">[green]Текст[/green]</span><br />' . "\r\n",
            '<span class="blue">[blue]Текст[/blue]</span><br />' . "\r\n",
            '[url=http://URL-адрес]название[/url]' . "\r\n",
            '</div>' . "\r\n",
            '<div class="bottom"><a href="?help' . $_GET['id'] . '">Назад</a> • <a href="./">В гостевую</a> • <a href="/">На главную</a></div>';
        }
        elseif( isset($_GET['translate']) ) // Страница с правилами транслита
        {
            echo '<div class="top">Правила транслита</div>' . "\r\n",
            '<div class="a">',
            'А - A, a - a<br />',
            'Б - B, б - b<br />',
            'В - V, в - v<br />',
            'Г - G, г - g<br />',
            'Д - D, д - d<br />',
            'Е - E, е - e<br />',
            'Ё - YO Yo, ё - yo<br />',
            'Ж - ZH Zh, ж - zh<br />',
            'З - Z, з - z<br />',
            'И - I, и - i<br />',
            'Й - J, й - j<br />',
            'К - K, к - k<br />',
            'Л - L, л - l<br />',
            'М - M, м - m<br />',
            'Н - N, н - n<br />',
            'О - O, о - о<br />',
            'П - P, п - p<br />',
            'Р - R, р - r<br />',
            'С - S, с - s<br />',
            'Т - T, т - t<br />',
            'У - U, у - u<br />',
            'Ф - F, ф - f<br />',
            'Х - H X, х - h x<br />',
            'Ц - C, ц - c<br />',
            'Ч - CH Ch, ч - ch<br />',
            'Ш - SH Sh W, ш - sh w<br />',
            'Щ - SHC Shc, щ - shc<br />',
            'Ь - Q, ь - q \' (одн. кавычка)<br />',
            'Ы - YI Yi, ы - yi<br />',
            'Ъ - QQ Qq, ъ - qq \'\' (2 одн. кавычки)<br />',
            'Э - YE Ye, э - ye<br />',
            'Ю - YU Yu, ю - yu<br />',
            'Я - YA Ya, я - ya<br/><br />',
            'Если Вам необходимо, чтобы какая-то часть текста не транслитировалась, заключите её в скобки <strong>[]</strong>.<br />Пример: Adres sajta [http://jeey.ru] транслитируется как: Адрес сайта http://jeey.ru',
            '</div>' . "\r\n",
            '<div class="bottom"><a href="?help' . $_GET['id'] . '">Назад</a> • <a href="./">В гостевую</a> • <a href="/">На главную</a></div>';
        }
        else // Основная страница помощи
        {
            echo '<div class="top">Раздел помощи</div>' . "\r\n",
            '<div class="a">' . "\r\n",
            '• <a href="?help&amp;smile' . $_GET['id'] . '">Смайлы</a><br />' . "\r\n",
            '• <a href="?help&amp;bbcode' . $_GET['id'] . '">BB коды</a><br />' . "\r\n",
            '• <a href="?help&amp;translate' . $_GET['id'] . '">Правила транслита</a><br /><br />' . "\r\n",
            'Имя, Текст и Проверочное число обязательны для заполнения.<br /><br />' . "\r\n",
            'Если Вы не хотите, чтобы Ваш Email или ICQ был виден другим пользователям, предваряйте их символом <strong>~</strong>.<br />' . "\r\n",
            'Пример:<br />' . "\r\n",
            '[email protected]<br />' . "\r\n",
            '~12345678<br />' . "\r\n",
            'Тогда ваши данные, кроме администрации, никто не увидит.</div>' . "\r\n",
            '<div class="bottom"><a href="?add' . $_GET['id'] . '">Назад</a> • <a href="./">В гостевую</a> • <a href="/">На главную</a></div>';
        }
    }
    elseif( isset($_GET['go']) ) // Страница перехода на страницу (страница перехода на страницу... бгг)
    {
        echo $header . '<div class="top">Перейти на страницу</div>' . "\r\n",
        '<div class="a"><form action="" method="get"><fieldset>' . "\r\n",
        'Стр. <input type="text" name="page" size="4" class="texta" />' . "\r\n",
        '<input type="submit" value="Go" class="submit" />' . "\r\n",
        '</fieldset></form></div>' . "\r\n",
        '<div class="bottom"><a href="?page=' . ( isset($_GET['back']) ? (int) $_GET['back'] : 1 ) . '">Назад</a> • <a href="/">На главную</a></div>';
    }
    elseif( isset($_GET['admin']) ) // Страница авторизации
    {
        $error = '';

        if( isset($_REQUEST['send']) )
        {
            $_REQUEST['login'] = ( isset($_REQUEST['login']) ? (string) $_REQUEST['login'] : '' );
            $_REQUEST['password'] = ( isset($_REQUEST['password']) ? (string) $_REQUEST['password'] : '' );

            foreach( $admin as $v )
            {
                $admin_name[] = strtok($v, '|');
            }

            $k = array_search($_REQUEST['login'], $admin_name);

            if( !$_REQUEST['login'] || !$_REQUEST['password'] )
            {
                $error.= '<div>- Вы не ввели логин или пароль.</div>';
            }
            elseif( $k === false || $_REQUEST['password'] != $password )
            {
                $error.= '<div>- Вы неверно ввели логин или пароль.</div>';
            }
            else
            {
                $admin = explode('|', $admin[$k]);

                $_SESSION['admin_name'] = $admin[0];
                $_SESSION['admin_email'] = $admin[1];
                $_SESSION['admin_icq'] = $admin[2];

                header('Location: ./' . ( SID ? '?' . SID : '' ));
                exit;
            }
        }

        // Шапка

        echo $header . '<div class="top">Авторизация</div>';

        // Выводим ошибки, если есть

        if( $error )
        {
            echo '<div class="b"><span class="red"><strong>Ошибка!</strong></span><br />' . $error . '</div>';
        }

        // Форма ввода

        echo '<div class="a"><form action="?admin" method="post"><fieldset>' . "\r\n",
        'Логин:<br /><input type="text" name="login" class="texta" /><br />' . "\r\n",
        'Пароль:<br /><input type="password" name="password" class="texta" /><br />' . "\r\n",
        '<input type="submit" name="send" value="Войти" class="submit" />' . "\r\n",
        '</fieldset></form></div>' . "\r\n",
        '<div class="bottom"><a href="./">Назад</a> • <a href="/">На главную</a></div>';
    }
    else // Главная
    {
        $message = file('data/message.dat');
        $all = count($message);
        $_GET['page'] = ( isset($_GET['page']) ? (int) $_GET['page'] : 1 );
        $num_pages = ceil($all / U_Q_MESSAGE);
        $start = $_GET['page'] * U_Q_MESSAGE - U_Q_MESSAGE;

        if( $_GET['page'] > $num_pages || $_GET['page'] < 1 )
        {
            $_GET['page'] = 1;
            $start = 0;
        }

        // Шапка

        echo $header . '<div class="top"><a href="?add">Добавить сообщение</a></div>' . "\r\n";

        // Выводим сообщения

        if( $all )
        {
            for( $i = $all - $start - 1; $i >= $all - $start - U_Q_MESSAGE && isset($message[$i]); $i-- )
            {
                $m = explode('|', rtrim($message[$i]));
                echo '<div class="' . ( $i % 2 == 0 ? 'a' : 'b' ) . '"><span class="' . $m[0] . '"><strong><a href="?add&amp;id=' . $i . '">' . $m[1] . '</a></strong></span> <span class="aa">' . today($m[2]) . ', ' . $m[3] . '</span><br />' . $m[9] . ( $m[10] ? '<div class="answer"><span class="red"><strong>Ответ</strong></span> <span class="aa">' . today($m[11]) . ', ' . $m[12] . '</span><br />' . $m[10] . '</div>' : '' ) . '</div>' . "\r\n";
            }

            // Навигация

            echo '<div class="bottom">' . ( $num_pages >= 10 ? '<a href="?go&amp;back=' . $_GET['page'] . '">Стр.</a>' : 'Стр.' );

            for( $pr = '', $i = 1; $i <= $num_pages; $i++ )
            {
                echo $pr = (($i == 1 || $i == $num_pages || abs($i - $_GET['page']) < 3) ? ($i == $_GET['page'] ? " [$i] " : ' <a href="?page=' . $i . '">' . $i . '</a> ') : (($pr == ' .. ' || $pr == '') ? '' : ' .. '));
            }
        }
        else
        {
            echo '<div class="a">Сообщений нет.</div>' . "\r\n",
            '<div class="bottom">Стр. [1]';
        }

        echo ' • <a href="/">На главную</a></div>';
    }

    // Ноги

    echo  "\r\n" . '<div class="footer">' . COPYRIGHT . '</div>' . "\r\n",
    '</body></html>' . "\r\n",
    '<!-- ' . round(microtime(true) - ST, 4) . ' -->';

    exit;
}

// Страницы (админ-панель)

if( isset($_GET['add']) ) // Страница добавления сообщения/ответа
{
    include('system/func_not_active.inc.php');

    $message = file('data/message.dat');
    $is_id = false;

    if( isset($_GET['id']) )
    {
        $_GET['id'] = (int) $_GET['id'];

        if( array_key_exists($_GET['id'], $message) )
        {
            $m = explode('|', rtrim($message[$_GET['id']]));
            $is_id = true;
        }
    }

    $_GET['back'] = ( isset($_GET['back']) ? (int) $_GET['back'] : 1 );

    if( isset($_POST['send']) )
    {
        if( empty($_POST['text']) )
        {
            $_POST['text'] = '';
        }
        else
        {
            $_POST['text'] = bbcodesmile(str_replace("\r\n", '<br/>', clean($_POST['text'], Q_TEXT)));

            if( isset($_POST['tr_text']) )
            {
                $_POST['text'] = translate($_POST['text']);
            }
        }

        // Если добавляем ответ админа

        if( $is_id )
        {
            $m[10] = &$_POST['text'];
            $m[11] = '';
            $m[12] = '';

            if( $_POST['text'] )
            {
                $m[11] = date('j.m');
                $m[12] = date('H:i');
            }

            $message[$_GET['id']] = implode('|', $m) . "\r\n";

            puts('data/message.dat', implode($message), 'w');

            header('Location: ./?page=' . $_GET['back'] . ( SID ? '&' . SID : '' ));
            exit;
        }

        // Если пишем как обычное сообщение

        if( $_POST['text'] )
        {
            // Проверяем сообщение на одинаковость

            if( $message )
            {
                $search = explode('|', end($message));

                if( $_SESSION['admin_name'] == $search[1] && $_POST['text'] == $search[9] )
                {
                    header('Location: ./' . ( SID ? '?' . SID : '' ));
                    exit;
                }
            }

            // Удалялка старых сообщений

            if( count($message) >= MAX_MESSAGE )
            {
                $message[0] = '';
            }

            // Записываем сообщение в файл

            $message[] = 'admin|' . $_SESSION['admin_name'] . '|' . date('j.m') . '|' . date('H:i') . '|' . $_SESSION['admin_email'] . '|' . $_SESSION['admin_icq'] . '|' . $ua . '|' . $ip . '|' . $_COOKIE['id'] . '|' . $_POST['text'] . "|||\r\n";

            puts('data/message.dat', implode($message), 'w');

            header('Location: ./' . ( SID ? '?' . SID : '' ));
            exit;
        }
    }

    // Выводим

    echo $header;

    if( $is_id ) // Если отвечаем на сообщение
    {
        echo '<div class="top"><a href="?help&amp;id=' . $_GET['id'] . '&amp;back=' . $_GET['back'] . '">Помощь</a></div>' . "\r\n",
        '<div class="a"><form action="?add&amp;id=' . $_GET['id'] . '&amp;back=' . $_GET['back'] . '" method="post"><fieldset>' . "\r\n",
        'Текст: [' . Q_TEXT . ']<br /><textarea name="text" cols="15" rows="2" class="text">' . edittext($m[10]) . '</textarea><br /><input type="checkbox" name="tr_text" /> Транслит<br />' . "\r\n",
        '<input type="submit" name="send" value="' . ( $m[10] ? 'Сохранить' : 'Ответить' ) . '" class="submit" /></fieldset></form></div>' . "\r\n",
        '<div class="b"><strong>' . $m[1] . '</strong><br />' . $m[9] . '<br />' . "\r\n",
        '<strong>Данные пользователя</strong> <a href="?edit&amp;id=' . $_GET['id'] . '">[Ред]</a><br />' . "\r\n",
        '<img src="style/email.gif" alt="" /> ' . ( $m[4] ? $m[4] : 'Не указано' ) . '<br />' . "\r\n",
        '<img src="style/icq.gif" alt="" /> ' . ( $m[5] ? $m[5] : 'Не указано' ) . '</div>';
    }
    else // Если просто пишем
    {
        echo '<div class="top"><a href="?help">Помощь</a></div>' . "\r\n",
        '<div class="a"><form action="?add" method="post"><fieldset>' . "\r\n",
        'Текст: [' . Q_TEXT . ']<br /><textarea name="text" cols="15" rows="2" class="texta"></textarea><br /><input type="checkbox" name="tr_text" /> Транслит<br />' . "\r\n",
        '<input type="submit" name="send" value="Написать" class="submit" /></fieldset></form></div>';
    }

    echo "\r\n" . '<div class="bottom"><a href="./">В гостевую</a> • <a href="?exit">Выход!</a></div>';
}
elseif( isset($_GET['edit']) ) // Страница редактирования данных юзера
{
    $message = file('data/message.dat');
    $_GET['id'] = ( isset($_GET['id']) ? (int) $_GET['id'] : '' );

    if( !array_key_exists($_GET['id'], $message) )
    {
        exit('Нет сообщения с таким ID\'ом.');
    }

    $m = explode('|', rtrim($message[$_GET['id']]));

    include('system/func_not_active.inc.php');

    $error = '';

    if( isset($_POST['send']) )
    {
        $_POST['name'] = ( empty($_POST['name']) ? '' : clean($_POST['name'], Q_NAME) );
        $_POST['email'] = ( empty($_POST['email']) ? '' : clean($_POST['email'], 20) );
        $_POST['icq'] = ( empty($_POST['icq']) ? '' : clean($_POST['icq'], 10) );
        $_POST['text'] = ( empty($_POST['text']) ? '' : clean($_POST['text'], Q_TEXT) );

        if( !$_POST['name'] )
        {
            $error.= '<div>- Вы не ввели имя.</div>';
        }
        elseif( !preg_match('/[;,~!:@&\.\?\/\[\]\(\)\*\+\-=еёа-яa-z0-9]+/iu', $_POST['name']) )
        {
            $error.= '<div>- В имени обнаружены недопустимые символы.</div>';
        }

        if( $_POST['email'] && !preg_match('/^~?[\.\-a-zA-Z_]+@[\.\-a-zA-Z]+$/', $_POST['email']) )
        {
            $error.= '<div>- Вы ввели некорректный E-mail адрес.</div>';
        }

        if( $_POST['icq'] && !preg_match('/^~?[0-9]+$/', $_POST['icq']) )
        {
            $error.= '<div>- ICQ может содержать только цифры.</div>';
        }

        if( !$_POST['text'] )
        {
            $error.= '<div>- Вы не ввели текст.</div>';
        }

        if( !$error )
        {
            // Обрабатываем

            $_POST['text'] = bbcodesmile(str_replace("\r\n", '<br/>', $_POST['text']));

            // Транслитируем

            if( isset($_POST['tr_name']) )
            {
                $_POST['name'] = translate($_POST['name']);
            }

            if( isset($_POST['tr_text']) )
            {
                $_POST['text'] = translate($_POST['text']);
            }

            foreach( $admin as $v )
            {
                $admin_name[] = strtok($v, '|');
            }

            // Записываем сообщение в файл

            $m[0] = ( in_array($_POST['name'], $admin_name) ? 'admin' : 'user' );
            $m[1] = &$_POST['name'];
            $m[4] = &$_POST['email'];
            $m[5] = &$_POST['icq'];
            $m[9] = &$_POST['text'];
            $message[$_GET['id']] = implode('|', &$m) . "\r\n";

            puts('data/message.dat', implode($message), 'w');

            header('Location: ./' . ( SID ? '?' . SID : '' ));
            exit;
        }
    }

    // Шапка

    echo $header . '<div class="top">Редактирование сообщения</div>' . "\r\n";

    // Если появились ошибки, выводим

    if( $error )
    {
        echo '<div class="b"><span class="red"><strong>Ошибка!</strong></span><br />' . $error . '</div>' . "\r\n";
    }

    // Форма ввода

    echo '<div class="a"><form action="?edit&amp;id=' . $_GET['id'] . '" method="post"><fieldset>' . "\r\n",
    'Имя: [' . Q_NAME . ']<br /><input type="text" name="name" value="' . ( $error ? $_POST['name'] : $m[1] ) . '" maxlength="' . Q_NAME . '" size="15" class="texta" /><br /><input type="checkbox" name="tr_name" />Транслит<br />' . "\r\n",
    'Email: [20]<br /><input type="text" name="email" value="' . ( $error ? $_POST['email'] : $m[4] ) . '" maxlength="20" size="15" class="text" /><br />' . "\r\n",
    'ICQ: [10]<br /><input type="text" name="icq" value="' . ( $error ? $_POST['icq'] : $m[5] ) . '" maxlength="9" size="15" class="text" /><br />' . "\r\n",
    'Текст: [' . Q_TEXT . ']<br /><textarea name="text" cols="15" rows="2" class="texta">' . ( $error ? $_POST['text'] : edittext($m[9]) ) . '</textarea><br /><input type="checkbox" name="tr_text" />Транслит<br />' . "\r\n",
    '<input type="submit" name="send" value="Сохранить" class="submit" />' . "\r\n",
    '</fieldset></form></div>' . "\r\n",
    '<div class="bottom"><a href="?add&amp;id=' . $_GET['id'] . '">Назад</a> • <a href="./">В гостевую</a> • <a href="?exit">Выход!</a></div>';
}
elseif( isset($_GET['ban']) ) // Страница с списком забаненых
{
    $ban = file('data/ban.dat');

    if( isset($_REQUEST['send']) )
    {
        // Выборочное удаление заблокированых

        if( !empty($_POST['id']) && is_array($_POST['id']) )
        {
            puts('data/ban.dat', implode(array_diff_key($ban, array_flip($_POST['id']))), 'w');

            header('Location: ./?ban&page=' . ( isset($_POST['back']) ? (int) $_POST['back'] : 1 ) . ( SID ? '&' . SID : '' ));
            exit;
        }

        // Полная очистка заблокированых

        if( isset($_GET['clear']) )
        {
            puts('data/ban.dat', '', 'w');

            header('Location: ./?ban' . ( SID ? '&' . SID : '' ));
            exit;
        }
    }

    $all = count($ban);
    $_GET['page'] = ( isset($_GET['page']) ? (int) $_GET['page'] : 1 );
    $num_pages = ceil($all / Q_PBAN);
    $start = $_GET['page'] * Q_PBAN - Q_PBAN;

    if( $_GET['page'] > $num_pages || $_GET['page'] < 1 )
    {
        $_GET['page'] = 1;
        $start = 0;
    }

    // Шапка

    echo $header . '<div class="top">Банлист [' . $all . ']</div>' . "\r\n";

    // Выводим

    if( $all )
    {
        echo '<form action="?ban" method="post"><fieldset><input type="hidden" name="back" value="' . $_GET['page'] . '" />' . "\r\n";

        for( $i = $all - $start - 1; $i >= $all - $start - Q_PBAN && isset($ban[$i]); $i-- )
        {
            $b = explode('|', rtrim($ban[$i]));

            echo '<div class="' . ( $i % 2 == 0 ? 'a' : 'b' ) . '">';

            if( $b[0] == 1 ) // Если IP+UA
            {
                echo $b[1] . '/' . strtok($b[2], '/') . '<br />';
            }
            elseif( $b[0] == 2 ) // Если Cookie
            {
                echo 'Cookie ID<br />';
            }
            else // Иначе IP
            {
                echo $b[1] . '<br />';
            }

            echo '<input type="checkbox" name="id[]" value="' . $i . '" /></div>' . "\r\n";
        }

        // Навигация

        echo '<div class="bottom">' . ( $num_pages >= 10 ? '<a href="?go&amp;back=' . $_GET['page'] . '">Стр.</a>' : 'Стр.' );

        for( $pr = '', $i = 1; $i <= $num_pages; $i++ )
        {
            echo $pr = (($i == 1 || $i == $num_pages || abs($i - $_GET['page']) < 3) ? ($i == $_GET['page'] ? " [$i] " : ' <a href="?ban&amp;page=' . $i . '">' . $i . '</a> ') : (($pr == ' .. ' || $pr == '') ? '' : ' .. '));
        }

        echo '</div>' . "\r\n",
        '<div class="a"><input type="submit" name="send" value="Удалить" class="submit" /> <a href="?ban&amp;send&amp;clear">Очистить</a></div></fieldset></form>' . "\r\n",
        '<div class="bottom">';
    }
    else
    {
        echo '<div class="a">Список заблокированных пуст.</div>' . "\r\n",
        '<div class="bottom">Стр. [1] • ';
    }

    echo '<a href="./">В гостевую</a> • <a href="?exit">Выход!</a></div>';
}
elseif( isset($_GET['online']) ) // Страница онлайн
{
    $online = file('data/online.dat');
    $all = count($online);
    $_GET['page'] = ( isset($_GET['page']) ? (int) $_GET['page'] : 1 );
    $num_pages = ceil($all / Q_PONLINE);
    $start = $_GET['page'] * Q_PONLINE - Q_PONLINE;

    // Проверка номера страницы

    if( $_GET['page'] > $num_pages || $_GET['page'] < 1 )
    {
        $_GET['page'] = 1;
        $start = 0;
    }

    echo $header . '<div class="top">Кто здесь? [' . $all . ']</div>' . "\r\n";

    // Выводим

    for( $i = $all - $start - 1; $i >= $all - $start - Q_PONLINE && isset($online[$i]); $i-- )
    {
        $o = explode('|', rtrim($online[$i]));
        echo '<div class="' . ( $i % 2 == 0 ? 'a' : 'b' ) . '">' . ( $o[1] ? '<strong>' . $o[1] . '</strong>' : 'Неизвестно' ) . '<br />' .  strtok($o[2], '/') . ', ' . $o[3] . '</div>' . "\r\n";
    }

    // Навигация

    echo '<div class="bottom">' . ( $num_pages >= 10 ? '<a href="?go&amp;back=' . $_GET['page'] . '">Стр.</a> ' : 'Стр. ' );

    for( $pr = '', $i = 1 ; $i <= $num_pages ; $i++ )
    {
        echo $pr = (($i == 1 || $i == $num_pages || abs($i - $_GET['page']) < 3) ? ($i == $_GET['page'] ? " [$i] " : ' <a href="?online&amp;page=' . $i . '">' . $i . '</a> ') : (($pr == ' .. ' || $pr == '') ? '' : ' .. '));
    }

    echo ' • <a href="./">В гостевую</a> • <a href="?exit">Выход!</a></div>';
}
elseif( isset($_GET['help']) ) // Страница помощи
{
    $id_back = ( isset($_GET['id'], $_GET['back']) ? '&amp;id=' . (int) $_GET['id'] . '&amp;back=' . (int) $_GET['back'] : '' );

    echo $header;

    if( isset($_GET['smile']) )
    {
        $smile = array_diff(array_map(create_function('$v', 'return substr($v, 0, -4);'), scandir('smile/')), array(''));
        rsort($smile);
        $all = count($smile);
        $_GET['page'] = ( isset($_GET['page']) ? (int) $_GET['page'] : 1 );
        $num_pages = ceil($all / Q_PSMILE);
        $start = $_GET['page'] * Q_PSMILE - Q_PSMILE;

        // Проверка номера страницы

        if( $_GET['page'] > $num_pages || $_GET['page'] < 1 )
        {
            $_GET['page'] = 1;
            $start = 0;
        }

        echo '<div class="top">Смайлы</a></div>' . "\r\n";

        // Выводим

        if( $all )
        {
            echo '<div class="a">' . "\r\n";

            for( $i = $all - $start - 1; $i >= $all - $start - Q_PSMILE && isset($smile[$i]); $i-- )
            {
                echo ':' . $smile[$i] . ': <img src="smile/' . $smile[$i] . '.gif" alt=":' . $smile[$i] . ':" /><br />' . "\r\n";
            }

            echo '</div>' . "\r\n";

            // Навигация

            echo '<div class="bottom">' . ( $num_pages >= 10 ? '<a href="?go&amp;back=' . $_GET['page'] . '">Стр.</a> ' : 'Стр. ' );

            for( $pr = '', $i = 1; $i <= $num_pages; $i++ )
            {
                echo $pr = (($i == 1 || $i == $num_pages || abs($i - $_GET['page']) < 3) ? ($i == $_GET['page'] ? " [$i] " : ' <a href="?help&amp;smile' . $id_back . '&amp;page=' . $i . '">' . $i . '</a> ') : (($pr == ' .. ' || $pr == '') ? '' : ' .. '));
            }
        }
        else
        {
            echo '<div class="a">Смайлов нет.</div>' . "\r\n",
            '<div class="bottom">Стр. [1]';
        }

        echo ' • <a href="?help' . $id_back . '">Назад</a> • <a href="./">В гостевую</a> • <a href="?exit">Выход!</a></div>';
    }
    elseif( isset($_GET['bbcode']) )
    {
        echo '<div class="top">ББ коды</div>' . "\r\n",
        '<div class="a">' . "\r\n",
        '[url=http://адрес]Название[/url]<br />' . "\r\n",
        '<strong>[b]Текст[/b]</strong><br />' . "\r\n",
        '<span class="red">[red]Текст[/red]</span><br />' . "\r\n",
        '<span class="green">[green]Текст[/green]</span><br />' . "\r\n",
        '<span class="blue">[blue]Текст[/blue]</span>' . "\r\n",
        '</div>' . "\r\n",
        '<div class="bottom"><a href="?help' . $id_back . '">Назад</a> • <a href="./">В гостевую</a> • <a href="?exit">Выход!</a></div>';
    }
    elseif( isset($_GET['translate']) )
    {
        echo '<div class="top">Правила транслита</div>' . "\r\n",
        '<div class="a">',
        'А - A, a - a<br />',
        'Б - B, б - b<br />',
        'В - V, в - v<br />',
        'Г - G, г - g<br />',
        'Д - D, д - d<br />',
        'Е - E, е - e<br />',
        'Ё - YO Yo, ё - yo<br />',
        'Ж - ZH Zh, ж - zh<br />',
        'З - Z, з - z<br />',
        'И - I, и - i<br />',
        'Й - J, й - j<br />',
        'К - K, к - k<br />',
        'Л - L, л - l<br />',
        'М - M, м - m<br />',
        'Н - N, н - n<br />',
        'О - O, о - о<br />',
        'П - P, п - p<br />',
        'Р - R, р - r<br />',
        'С - S, с - s<br />',
        'Т - T, т - t<br />',
        'У - U, у - u<br />',
        'Ф - F, ф - f<br />',
        'Х - H X, х - h x<br />',
        'Ц - C, ц - c<br />',
        'Ч - CH Ch, ч - ch<br />',
        'Ш - SH Sh W, ш - sh w<br />',
        'Щ - SHC Shc, щ - shc<br />',
        'Ь - Q, ь - q \' (одн. кавычка)<br />',
        'Ы - YI Yi, ы - yi<br />',
        'Ъ - QQ Qq, ъ - qq \'\' (2 одн. кавычки)<br />',
        'Э - YE Ye, э - ye<br />',
        'Ю - YU Yu, ю - yu<br />',
        'Я - YA Ya, я - ya<br/><br />' . "\r\n",
        'Если Вам необходимо, чтобы какая-то часть текста не транслитировалась, заключите его в скобки <strong>[]</strong>.<br />Пример: Адрес сайта [http://jeey.ru]' . "\r\n",
        '</div>' . "\r\n",
        '<div class="bottom"><a href="?help' . $id_back . '">Назад</a> • <a href="./">В гостевую</a> • <a href="?exit">Выход!</a></div>';
    }
    else
    {
        echo '<div class="top">Раздел помощи</div>' . "\r\n",
        '<div class="a">' . "\r\n",
        '• <a href="?help&amp;smile' . $id_back . '">Смайлы</a><br />' . "\r\n",
        '• <a href="?help&amp;bbcode' . $id_back . '">BB коды</a><br />' . "\r\n",
        '• <a href="?help&amp;translate' . $id_back . '">Правила транслита</a>' . "\r\n",
        '</div>' . "\r\n",
        '<div class="bottom"><a href="?add' . $id_back . '">Назад</a> • <a href="./">В гостевую</a> • <a href="?exit">Выход!</a></div>';
    }
}
elseif( isset($_GET['go']) ) // Страница перехода на страницу
{
    echo $header . '<div class="top">Перейти на страницу</div>' . "\r\n",
    '<div class="a"><form action="" method="get"><fieldset>' . "\r\n",
    'Стр. <input type="text" name="page" size="4" class="texta" />' . "\r\n",
    '<input type="submit" value="-&gt;" class="submit" />' . "\r\n",
    '</fieldset></form></div>' . "\r\n",
    '<div class="bottom"><a href="?page=' . ( isset($_GET['back']) ? (int) $_GET['back'] : 1 ) . '">Назад</a> • <a href="?exit">Выход!</a></div>';
}
elseif( isset($_GET['exit']) ) // Выход из админки
{
    session_destroy();

    header('Location: ./');
    exit;
}
else // Главная страница
{
    $message = file('data/message.dat');

    if( isset($_REQUEST['send']) )
    {
        // Баним юзеров и/или удаляем сообщения

        if( !empty($_POST['id']) && !empty($_POST['action']) )
        {
            if( !is_array($_POST['id']) || !is_array($_POST['action']) )
            {
                exit('oops!');
            }

            $ban = file('data/ban.dat');

            // Баним

            $in_ipua = in_array('ipua', $_POST['action']);
            $in_cookie = in_array('cookie', $_POST['action']);
            $in_ip = in_array('ip', $_POST['action']);

            if( $in_ipua || $in_cookie || $in_ip )
            {
                foreach( $_POST['id'] as $v )
                {
                    $m = explode('|', $message[intval($v)]);

                    if( $in_ipua )
                    {
                        $ban[] = '1|' . $m[7] . '|' . $m[6] . "\r\n";
                    }

                    if( $in_cookie && $m[8] )
                    {
                        $ban[] = '2|' . $m[8] . "|\r\n";
                    }

                    if( $in_ip )
                    {
                        $ban[] = '3|' . $m[7] . "|\r\n";
                    }
                }

                puts('data/ban.dat', implode(array_unique($ban)), 'w');
            }

            // Удаляем сообщение(я)

            if( in_array('delete', $_POST['action']) )
            {
                puts('data/message.dat', implode(array_diff_key($message, array_flip($_POST['id']))), 'w');
            }

            header('Location: ./?page=' . ( isset($_POST['back']) ? (int) $_POST['back'] : 1 ) . ( SID ? '&' . SID : '' ));
            exit;
        }

        // Удаление всех сообщений

        if( isset($_GET['clear']) )
        {
            puts('data/message.dat', '', 'w');

            header('Location: ./' . ( SID ? '?' . SID : '' ));
            exit;
        }
    }

    $all = count($message);
    $_GET['page'] = isset($_GET['page']) ? (int) $_GET['page'] : 1;
    $num_pages = ceil($all / A_Q_MESSAGE);
    $start = $_GET['page'] * A_Q_MESSAGE - A_Q_MESSAGE;

    if( $_GET['page'] > $num_pages || $_GET['page'] < 1 )
    {
        $_GET['page'] = 1;
        $start = 0;
    }

    // Шапка

    echo $header . '<div class="top"><a href="?add">Добавить сообщение</a></div>' . "\r\n";

    if( $all )
    {
        // Сообщения

        echo '<form action="" method="post"><fieldset><input type="hidden" name="back" value="' . $_GET['page'] . '" />' . "\r\n";

        for( $i = $all - $start - 1; $i >= $all - $start - A_Q_MESSAGE && isset($message[$i]); $i-- )
        {
            $m = explode('|', rtrim($message[$i]));
            echo '<div class="' . ( $i % 2 == 0 ? 'a' : 'b' ) . '"><input type="checkbox" name="id[]" value="' . $i . '" /> <span class="' . $m[0] . '"><strong><a href="?add&amp;id=' . $i . '&amp;back=' . $_GET['page'] . '">' . $m[1] . '</a></strong></span> <span class="aa">' . today($m[2]) . ', ' . $m[3] . '</span><br /><span class="ab">' . strtok($m[6], '/')  . ', ' . $m[7] . '</span><br />' . $m[9] . ( $m[10] ? '<div class="answer"><span class="red"><strong>Ответ</strong></span> <span class="aa">' . today($m[11]) . ', ' . $m[12] . '</span><br />' . $m[10] . '</div>' : '' ) . '</div>' . "\r\n";
        }

        // Навигация

        echo '<div class="bottom">' . ( $num_pages >= 10 ? '<a href="?go&amp;back=' . $_GET['page'] . '">Стр.</a> ' : 'Стр. ' );

        for( $pr = '', $i = 1 ; $i <= $num_pages ; $i++ )
        {
            echo $pr = (($i == 1 || $i == $num_pages || abs($i - $_GET['page']) < 3) ? ($i == $_GET['page'] ? " [$i] " : ' <a href="./?page=' . $i . '">' . $i . '</a> ') : (($pr == ' .. ' || $pr == '') ? '' : ' .. '));
        }

        echo '</div>' . "\r\n",
        '<div class="a"><select name="action[]" size="1" multiple><option value="delete">Удалить</option><option value="ipua">IP+UA</option><option value="cookie">Cookie</option><option value="ip">IP</option></select><input type="submit" name="send" value="ok" class="submit" /><br />';
    }
    else
    {
        echo '<div class="a">Сообщений нет.</div>' . "\r\n",
        '<div class="bottom">Стр. [1]</div><div class="a">';
    }

    // Админская менюшка

    echo '• <a href="?ban">Банлист</a><br />• Кто здесь? <a href="?online">[' . count(file('data/online.dat')) . ']</a>' . ( $all ? '<br />• Сообщений: ' . $all . ' <a href="?send&amp;clear">[Очистить]</a></fieldset></form>' : '' ) . '</div>' . "\r\n",
    '<div class="bottom"><a href="?exit">Выход!</a></div>';
}

// Ноги

echo "\r\n" . '<div class="footer">' . COPYRIGHT . '</div>
</body></html>
<!-- ' . round(microtime(true) - ST, 4) . ' -->';
?>