<?php
/* Буферизация. */
ob_start();

/* Старт сессии. */
!isset($_SESSION) AND @session_start();

/* IP адрес. */
@$ip = @preg_replace('|[^0-9\.]|', '', (isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? @$_SERVER['HTTP_X_FORWARDED_FOR'] : @$_SERVER['REMOTE_ADDR']));

/* Фичи. */
define('ROOT', $_SERVER['DOCUMENT_ROOT'] . "/");        // Корневой каталог.
define('CORE', ROOT . "system/");        // Каталог ядра.
define('CACHE', ROOT . "template/ajaxappcache/"); // Кеш 
define('AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) and strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'); // Какой переход выполнен.
define('MODULE', ROOT . "_modules/"); // Папка файлов 
define('CONFIG_FILE', CORE . "config.ini"); // Конфиги с админки
define('FILES_SERVER', 'https://files.vineti.ru/'); // Файловый сервер
define('FILES_PATH', '/var/www/www-root/data/www/files.vineti.ru/'); //Путь к файловому серверу


$_QUERY = array();

/* Показ ошибок. */
error_reporting(E_ALL);
ini_set("display_errors", 1);

/* Данные для подключения */
define('pdoOST', 'localhost');
define('DBPORT', '3306');
define('DBNAME', '');
define('DBUSER', '');
define('DBPASS', '');

// PDO классы для работы c DB .
class PDO_ extends PDO
{
    function __construct($dsn, $username, $password)
    {
        parent:: __construct($dsn, $username, $password);
        $this->setAttribute(PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION);
        $this->setAttribute(PDO :: ATTR_DEFAULT_FETCH_MODE, PDO :: FETCH_ASSOC);
    }

    function prepare($sql, $a = array())
    {
        $stmt = parent:: prepare($sql, array(
            PDO :: ATTR_STATEMENT_CLASS => array('PDOStatement_')
        ));
        return $stmt;
    }

    function query($sql, $params = array())
    {
        global $_QUERY;
        $stmt = $this->prepare($sql);
        $_QUERY[] = $sql;
        $stmt->execute($params);
        return $stmt;
    }

    function querySingle($sql, $params = array())
    {
        $stmt = $this->query($sql, $params);
        $stmt->execute($params);
        return $stmt->fetchColumn(0);
    }

    function queryFetch($sql, $params = array())
    {
        $stmt = $this->query($sql, $params);
        $stmt->execute($params);
        return $stmt->fetch();
    }
}

// Классы для работы PDOStatement .
class PDOStatement_ extends PDOStatement
{
    function execute($params = array())
    {
        if (func_num_args() == 1) {
            $params = func_get_arg(0);
        } else {
            $params = func_get_args();
        }

        if (!is_array($params)) {
            $params = array($params);
        }
        parent:: execute($params);
        return $this;
    }

    function fetchSingle()
    {
        return $this->fetchColumn(0);
    }

    function fetchAssoc()
    {
        $this->setFetchMode(PDO :: FETCH_NUM);
        $data = array();
        while ($row = $this->fetch()) {
            $data[$row[0]] = $row[1];
        }
        return $data;
    }
}

// Классы для работы DB .	
class DB
{
    static $pdo;
    static $dbh;

    public function __construct()
    {
        try {
            self:: $pdo = new PDO_('mysql:host=' . pdoOST . ';port=' . DBPORT . ';dbname=' . DBNAME, DBUSER, DBPASS);
            self:: $pdo->exec('SET CHARACTER SET utf8');
            self:: $pdo->exec('SET NAMES utf8');

            self:: $dbh = self:: $pdo;
        } catch (PDOException $e) {
            die('Временные технические работы. Приносим свои извинения.');
        }
    }

    final public function __destruct()
    {
        self:: $pdo = null;
        self:: $dbh = null;
    }
}

$database = new DB();

// Функция автозагрузки классов для работы с движком
function autoload($class)
{
    @require(CORE . 'classes/' . strtolower($class) . '.php');
}

@spl_autoload_register('autoload');
function shutdownHeaderLocation() // Ajax переходы
{
    $_SESSION['X-AJAX-REQUEST-URL'] = null;
    foreach (headers_list() as $item) {
        if (stripos($item, 'Location:') !== false && stripos($item, '/audio/file/') === false) {
            $_SESSION['X-AJAX-REQUEST-URL'] = 'X-AJAX-REQUEST-URL: ' . trim(substr($item, 9));
            break;
        }
    }
}

if (!empty($_SESSION['X-AJAX-REQUEST-URL']))
    header($_SESSION['X-AJAX-REQUEST-URL']);
register_shutdown_function('shutdownHeaderLocation');
if (isset($_COOKIE['xsid']) && $_COOKIE['xsid'] != NULL) {

    $sid = system:: check($_COOKIE['xsid']);
    $user = DB:: $pdo->queryFetch("SELECT * FROM `users` WHERE `sid` = ? LIMIT 1;", array($sid));
    if (isset($user['sid'])) {
        define('ACCESS', $user['access']);
        $userLevel = admin:: getLevel($user);
        $user_online = time() - $user['last_time'];
       
        $online_time = ($user_online < 60) ? $user['online_time'] + $user_online : $user['online_time'];
        if ($user['set_online_hide'] == 0) {
            DB:: $pdo->query("UPDATE `users` SET `last_time` = ?, `online_time` = ?, `adm_ip` = ?, `adm_ua` = ? WHERE `id` = ? LIMIT 1;", array(time(), $online_time, $ip, system:: check($_SERVER['HTTP_USER_AGENT']), $user['id']));
        } else {
            DB:: $pdo->query("UPDATE `users` SET `adm_ip` = ?, `adm_ua` = ? WHERE `id` = ? LIMIT 1;", array($ip, system:: check($_SERVER['HTTP_USER_AGENT']), $user['id']));
        }
    } else {
        setcookie('xsid', '', time());
        system:: redirect('Ошибка авторизации.', '/');
    }
}

$config = (array)(json_decode(file_get_contents(CONFIG_FILE)));


$config['LEVELS'] = array(
    'a' => array(
        1 => 'Разработчик',
        'Технический администратор',
        'Системный администратор'
    ),
    'h' => 'Техническая поддержка',
    'm_file' => 'Модератор фото',
    'm_chat' => 'Модератор чата',
    'm_note' => 'Модератор записей'
);
$config['CAUSE_BLOCK'] = array('Предупреждение', 'Рассылка СПАМа', ' Оскорбительное поведение', 'Размещение запрещенного контента', 'Использование скриптов', 'Иное');


$startTime = microtime(true);


if (isset($user['id']) && $user['block_unlock'] == 0) {
    require(MODULE . "profile/includes/profile.block.php");
}

// Вызываем метод с дешифрованием все поступающий POST данных
emoji::dataDecode();


//Языковый пакет 
if (isset($user['id']) && $user['language'] != NULL && is_dir(CORE.'languages/'.$user['language']) && $user['language'] != '.' && $user['language'] != '..')
{
    $language = $user['language'];
}
else if (isset($_SESSION['language']) && stripcslashes(htmlspecialchars($_SESSION['language'])) != NULL && is_dir(CORE.'languages/'.stripcslashes(htmlspecialchars($_SESSION['language']))) && stripcslashes(htmlspecialchars($_SESSION['language'])) != '.' && stripcslashes(htmlspecialchars($_SESSION['language'])) != '..')
{
    $language = stripcslashes(htmlspecialchars($_SESSION['language']));
} else {
    $language = 'ru';
}
if(defined('ACCESS') === false) {
    define('ACCESS', -1);
}
