<?php

/**
 * Класс для формирования HTML документа.
 */
class document extends design {

    public $title = 'Заголовок';
    public $description = '';
    public $keywords = array();
    protected $err = array();
    protected $msg = array();
    protected $outputed = false;
    protected $actions = array();
    protected $returns = array();

    function __construct($group = 0) {
        parent::__construct();
        global $user, $dcms;
        $this->title = $dcms->title;
        if ($group > $user->group) {
            $this->access_denied(__('Доступ к данной странице запрещен'));
        }
        ob_start();
    }

    /**
     * Сообщение об ошибке в верху страницы 
     * @param type $err
     */
    function err($err) {
        $this->err[] = array('text' => text::filter($err, 1));
    }

    /**
     * Сообщение в верху страницы
     * @param string $msg
     */
    function msg($msg) {
        $this->msg[] = array('text' => text::filter($msg, 1));
    }

    /**
     * Добавление ссылки на возврат
     * @param string $name отображаемое название
     * @param string $link URL ссылки
     */
    function ret($name, $link) {
        $this->returns[] = array($name, $link);
    }

    /**
     * Добавление ссылки "Действие"
     * @param string $name отображаемое название
     * @param string $link URL ссылки
     */
    function act($name, $link) {
        $this->actions[] = array($name, $link);
    }

    function access_denied($err) {
        if (isset($_GET['return'])) {
            header('Refresh: 2; url=' . $_GET['return']);
        }
        $this->err($err);
        $this->output();
        exit;
    }

    /**
     * Формирование HTML документа и отправка данных браузеру
     * @global dcms $dcms
     */
    private function output() {
        global $dcms;
        if ($this->outputed) {
            // повторная отправка html кода вызовет нарушение синтаксиса документа, да и вообще нам этого нафиг не надо
            return;
        }
        $this->outputed = true;
        header('Cache-Control: no-store, no-cache, must-revalidate', true);
        header('Expires: ' . date('r'), true);



        // для осла (IE) как обычно отдельное условие
        if ($dcms->browser == 'Microsoft Internet Explorer') {
            $content_type = 'text/html';
            header('X-UA-Compatible: IE=edge', true); // отключение режима совместимости в осле
        } else if (!empty($this->theme['content']) && $this->theme['content'] === 'xhtml')
            $content_type = 'application/xhtml+xml';
        else
            $content_type = 'text/html';
        header('Content-Type: ' . $content_type . '; charset=utf-8', true);

        $this->assign('adt', new adt()); // реклама
        $this->assign('description', $this->description, 1); // описание страницы (meta)
        $this->assign('keywords', implode(', ', $this->keywords), 1); // ключевые слова (meta)
        $this->assign('actions', $this->actions); // ссылки к действию
        $this->assign('returns', $this->returns); // ссылки для возврата
        $this->assign('err', $this->err); // сообщения об ошибке
        $this->assign('msg', $this->msg); // сообщения
        $this->assign('title', $this->title, 1); // заголовок страницы
        $this->assign('content', @ob_get_clean()); // то, что попало в буфер обмена при помощи echo (display())
        $this->assign('document_generation_time', round(microtime(true) - TIME_START, 3)); // время генерации страницы

        if ($dcms->align_html) {
            // форматирование HTML кода
            $document_content = $this->fetch('document.tpl');
            $align = new alignedxhtml();
            echo $align->parse($document_content);
        } else {
            $this->display('document.tpl');
        }
    }

    /**
     * Очистка вывода
     * Тема оформления применяться не будет
     */
    function clean() {
        $this->outputed = true;
        @ob_clean();
    }

    /**
     * То что срабатывает при exit
     */
    function __destruct() {
        $this->output();
    }

}

?>