/**
 * Декодирует объект из строки в формате JSON
 *
 * @param      $Json    Json строка (string) для декодирования.
 * @param bool $Assoc   Если TRUE, возвращаемые объекты будут преобразованы в ассоциативные массивы.
 * @param int  $Depth   Указывает глубину рекурсии.
 * @param int  $Options Битовая маска опций декодирования JSON. В настоящий момент поддерживается только JSON_BIGINT_AS_STRING (по умолчанию большие целые числа приводятся к числам с плавающей запятой (float))
 * @return mixed
 * @since 1.3.5
 */
function JsonDecode($Json, $Assoc = true, $Depth = 128, $Options = 0)
{
    if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
        $decoded = json_decode($Json, $Assoc, $Depth, $Options);
    } elseif (version_compare(PHP_VERSION, '5.3.0', '>=')) {
        $decoded = json_decode($Json, $Assoc, $Depth);
    } else {
        $decoded = json_decode($Json, $Assoc);
    }
    return ObjectUtf8ToCp1251($decoded);
}
/**
 * Преобразует строки объекта или массива из UTF-8 кодировки в CP1251
 * @param  $var
 * @return array|string
 * @since 1.3.5
 */
function ObjectUtf8ToCp1251(&$var)
{
    if (is_array($var)) {
        foreach ($var as &$v) {
            $v = ObjectUtf8ToCp1251($v);
        }
    } elseif (is_object($var)) {
        $vars = get_object_vars($var);
        foreach ($vars as $f => &$v) {
            $var->{$f} = ObjectUtf8ToCp1251($v);
        }
    } elseif (is_string($var)) {
        $var = Utf8ToCp1251($var);
    }
    return $var;
}
function AdminNewsPreview()
{
    $_POST = ObjectUtf8ToCp1251($_POST);
    $preview = new Page('module/news_preview.html', '', false, PAGE_SPECIAL);
    $preview->Doctype = '<!DOCTYPE html>';
    $preview->AddCSSFile('style.css');
    $preview->AddBlock('news', true, true);
    // Отключаем показ блоков с комментариями
    $preview->SetVar('template', 'enabled_comments', false);
    $preview->SetVar('template', 'disabled_comments', true);
    // Скрываем ненужные блоки
    $preview->AddBlock('comments_navigation', false);
    $preview->AddBlock('news_comments', false);
    $preview->AddBlock('news_comments_form', false);
    $preview->SetTitle(SafeDB($_POST['title'], 255, str));
    $topic_id = SafeEnv($_POST['topic_id'], 11, int);
    System::database()->Select('news_topics', "`id`='{$topic_id}'");
    $topic = System::database()->FetchRow();
    $topic_title = SafeDB($topic['title'], 255, str);
    if (isset($_GET['id'])) {
        $news_id = SafeDB($_GET['id'], 11, int);
        System::database()->Select('news', "`id`='" . SafeEnv($_GET['id'], 11, int) . "'");
        $news = System::database()->FetchRow();
        $comments_counter = SafeDB($news['comments_counter'], 11, int);
        $hit_counter = SafeDB($news['hit_counter'], 11, int);
    } else {
        $news_id = 0;
        $comments_counter = 0;
        $hit_counter = 0;
    }
    $img_view = SafeDB($_POST['img_view'], 1, int);
    $link = Ufu('index.php?name=news&op=readfull&news=' . $news_id . '&topic=' . $topic_id, 'news/{topic}/{news}/');
    $topic_link = Ufu('index.php?name=news&topic=' . $topic_id, 'news/{topic}/');
    $vars['topic'] = $topic_title;
    $vars['id'] = $news_id;
    $vars['title'] = SafeDB($_POST['title'], 255, str);
    $vars['author'] = System::user()->Get('u_name');
    $date = strtotime(str_replace('.', '-', $_POST['public_date']) . ' ' . $_POST['public_time']);
    $vars['date'] = TimeRender($date);
    $vars['time'] = date('H:i', $date);
    $vars['day'] = date('d', $date);
    $vars['month'] = date('m', $date);
    $vars['year'] = date('y', $date);
    $vars['year_full'] = date('Y', $date);
    $vars['link'] = $link;
    $vars['cat_link'] = $topic_link;
    $vars['com_count'] = $comments_counter;
    $vars['hit_count'] = $hit_counter;
    $vars['admin'] = System::user()->isAdmin();
    if (strlen(strip_tags($_POST['continuation'])) > 0) {
        // Есть ли продолжение новости
        $vars['full'] = '<a href="' . $link . '">Читать далее…</a>';
        $read_more = true;
    } else {
        $vars['full'] = '';
        $read_more = false;
    }
    $image = SafeDB($_POST['icon'], 255, str);
    list($width, $height) = SafeDB(explode(':', System::config('news/tmb_size')), 11, int);
    if ($image == '' || substr($image, 0, 7) == 'http://') {
        $vars['image'] = $image;
        $vars['image_url'] = false;
    } elseif ($img_view == 1) {
        // Исходная картинка
        $vars['image'] = GetThumb($image, $width, $height);
        $vars['image_url'] = false;
    } elseif ($img_view == 2) {
        // Эскиз
        $vars['image'] = GetThumb($image, $width, $height);
        $vars['image_url'] = $image;
    } elseif ($img_view == 0) {
        // Авто
        $size = ImageSize($image);
        if ($size['width'] > $width) {
            $vars['image'] = GetThumb($image, $width, $height);
            $vars['image_url'] = $image;
        } else {
            $vars['image'] = $image;
            $vars['image_url'] = false;
        }
    }
    $vars['com_status'] = '';
    if ($read_more) {
        $vars['text'] = SafeDB($_POST['shorttext'] . $_POST['continuation'], 0, str, false, false);
    } else {
        $vars['text'] = SafeDB($_POST['shorttext'], 0, str, false, false);
    }
    if ($_POST['auto_br'] == 'on') {
        $vars['text'] = nl2br($vars['text']);
    }
    $preview->AddSubBlock('news', true, $vars);
    $preview->TEcho(false, false);
    exit;
}
function AdminArticlesPreview()
{
    $_POST = ObjectUtf8ToCp1251($_POST);
    $preview = new Page('module/page.html', '', false, PAGE_SPECIAL);
    $preview->Doctype = '<!DOCTYPE html>';
    $preview->AddCSSFile('style.css');
    $preview->AddBlock('page');
    $vars = array();
    $vars['show_info'] = false;
    $vars['show_title'] = true;
    $vars['title'] = SafeDB($_POST['title'], 255, str);
    if ($_POST['auto_br_desc'] == '1') {
        $description = nl2br(SafeDB($_POST['description'], 0, str, false, false));
    } else {
        $description = SafeDB($_POST['description'], 0, str, false, false);
    }
    $vars['text'] = $description;
    if ($_POST['auto_br_article'] == '1') {
        $article = nl2br(SafeDB($_POST['article'], 0, str, false, false));
    } else {
        $article = SafeDB($_POST['article'], 0, str, false, false);
    }
    $vars['text'] .= $article;
    $preview->SetTitle($vars['title']);
    $preview->SetVars('page', $vars);
    $preview->TEcho(false, false);
    exit;
}
function AdminCodetesterSave($action)
{
    $snippet = SafeR('title,type', 255, str) + SafeR('code', 0, str);
    ObjectUtf8ToCp1251($snippet);
    if ($action == 'save' && (isset($_POST['id']) && $_POST['id'] != 0)) {
        // Редактирование
        $id = SafeEnv($_POST['id'], 11, int);
        System::database()->Update('snippets', MakeSet($snippet), "`id`='{$id}'");
        Audit('Тестирование кода: Изменение сниппета "' . $snippet['title'] . '"');
        echo JsonEncode(array('id' => $id));
    } else {
        // Добавить новый снипет
        System::database()->Insert('snippets', MakeValues("'','title','code','type'", $snippet));
        Audit('Тестирование кода: Добавление сниппета "' . $snippet['title'] . '"');
        echo JsonEncode(array('id' => System::database()->GetLastId()));
    }
    exit;
}
function AdminPagesPreview()
{
    $_POST = ObjectUtf8ToCp1251($_POST);
    $preview = new Page('module/page.html', '', false, PAGE_SPECIAL);
    $preview->Doctype = '<!DOCTYPE html>';
    $preview->AddCSSFile('style.css');
    $hits = 0;
    $modified = time();
    $public = time();
    if (isset($_GET['id'])) {
        $page_id = SafeEnv($_GET['id'], 11, int);
        System::database()->Select('pages', "`id`='{$page_id}'");
        $page = System::database()->FetchRow();
        $hits = SafeDB($page['hits'], 11, int);
        $modified = $page['modified'];
        $public = $page['date'];
    }
    $preview->AddBlock('page');
    $vars = array();
    $vars['show_title'] = isset($_POST['ins_title']);
    $vars['show_copy'] = isset($_POST['ins_copy']);
    $vars['show_public'] = isset($_POST['ins_date']);
    $vars['show_modified'] = isset($_POST['ins_modified']);
    $vars['show_hits'] = isset($_POST['ins_counter']);
    $vars['show_info'] = $vars['show_copy'] || $vars['show_public'] || $vars['show_modified'] || $vars['show_hits'];
    $vars['title'] = SafeDB($_POST['title'], 255, str);
    if ($_POST['auto_br'] == '1') {
        $text = nl2br(SafeDB($_POST['text'], 0, str, false, false));
    } else {
        $text = SafeDB($_POST['text'], 0, str, false, false);
    }
    $vars['text'] = $text;
    $vars['copyright'] = '&copy; ' . SafeDB($_POST['copy'], 255, str);
    $vars['public'] = 'Опубликована: ' . TimeRender($public);
    $vars['hits'] = 'Просмотров: ' . $hits;
    $vars['modified'] = 'Изменена: ' . TimeRender($modified);
    $preview->SetTitle($vars['title']);
    $preview->SetVars('page', $vars);
    $preview->TEcho(false, false);
    exit;
}