<?php 

/**
 * Клас 'page_Html' - Общ шаблон за всички HTML страници
 *
 *
 * @category  ef
 * @package   page
 *
 * @author    Milen Georgiev <milen@download.bg>
 * @copyright 2006 - 2012 Experta OOD
 * @license   GPL 3
 *
 * @since     v 0.1
 */
class page_Html extends core_ET
{
    /**
     * Конструктор, който генерира лейаута на шаблона
     */
    public function __construct()
    {
        $bodyClass = Mode::is('screenMode', 'narrow') ? 'narrow narrow-scroll' : 'wide';
        
        $bodyId = str::getRand();
        
        if ($this instanceof cms_page_External) {
            $loadJS = "\n<script type=\"text/javascript\"> [#SCRIPTS#] window.onload = function() {if (window.jQuery) {[#JQRUN#]} }\n</script>";
        } else {
            $loadJS = "<script type=\"text/javascript\">[#SCRIPTS#][#JQRUN#]\n</script>";
        }
        
        parent::__construct(
            '<!doctype html>' .
            
            (Mode::is('screenMode', 'narrow') ?
                "\n<html xmlns=\"http://www.w3.org/1999/xhtml\"[#HTML_ATTR#]>" :
                "\n<html[#HTML_ATTR#]>") .
            
            "\n<head>" .
            "\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=2\">" .
            "\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=[#ENCODING#]\">" .
            "<!--ET_BEGIN META_DESCRIPTION-->\n<meta name=\"description\" content=\"[#META_DESCRIPTION#]\"><!--ET_END META_DESCRIPTION-->" .
            "<!--ET_BEGIN META_KEYWORDS-->\n<meta name=\"keywords\" content=\"[#META_KEYWORDS#]\"><!--ET_END META_KEYWORDS-->" .
            "<!--ET_BEGIN PAGE_TITLE-->\n<title>[#NOT_CNT#][#PAGE_TITLE#]</title><!--ET_END PAGE_TITLE-->" .
            "<!--ET_BEGIN STYLE_IMPORT-->\n<style type=\"text/css\">[#STYLE_IMPORT#]\n</style><!--ET_END STYLE_IMPORT-->" .
            "<!--ET_BEGIN STYLES-->\n<style type=\"text/css\">[#STYLES#]\n</style><!--ET_END STYLES-->" .
            '<!--ET_BEGIN HEAD-->[#HEAD#]<!--ET_END HEAD-->' .
            "\n</head>" .
            "\n<body<!--ET_BEGIN ON_LOAD--> onload=\"[#ON_LOAD#]\"<!--ET_END ON_LOAD--> id=\"{$bodyId}\" class=\"{$bodyClass} [#BODY_CLASS_NAME#]\">" .
            '<!--ET_BEGIN PAGE_CONTENT-->[#PAGE_CONTENT#]<!--ET_END PAGE_CONTENT-->' .
            $loadJS .
            '<!--ET_BEGIN BROWSER_DETECT-->[#BROWSER_DETECT#]<!--ET_END BROWSER_DETECT-->' .
            '[#page_Html::addJs#]' .
            "\n</body>" .
            "\n</html>"
        );

        // Шрифт на системата
        $conf = core_Packs::getConfig('core');
        $systemFont = $conf->CORE_FONTS;
        if ($systemFont != 'arial') {
            $woff2 = sbf("/fonts/{$systemFont}-Regular.woff2", "");
            $woff = sbf("/fonts/{$systemFont}-Regular.woff", "");

            $woff2Bold = sbf("/fonts/{$systemFont}-Bold.woff2", "");
            $woffBold = sbf("/fonts/{$systemFont}-Bold.woff", "");

            $woff2Italic = sbf("/fonts/{$systemFont}-Italic.woff2", "");
            $woffItalic = sbf("/fonts/{$systemFont}-Italic.woff", "");
            $style = "<style>@font-face {
                font-family: '{$systemFont}';
                src: url('{$woff2}') format('woff2'),
                    url('{$woff}') format('woff');
                font-weight: ;
                font-style: normal;
                font-display: swap;
            }
            
            @font-face {
                font-family: '{$systemFont}';
                src: url('{$woff2Bold}') format('woff2'),
                    url('{$woffBold}') format('woff');
                font-weight: bold;
                font-style: normal;
                font-display: swap;
            }
            
            @font-face {
                font-family: '{$systemFont}';
                src: url('{$woff2Italic}') format('woff2'),
                    url('{$woffItalic}') format('woff');
                font-weight: normal;
                font-style: italic;
                font-display: swap;
            }
            body.modern-theme, .modern-theme .richtext { font-family: '{$systemFont}', Helvetica, Arial, Verdana, Sans-serif !important;}</style>";

        $this->appendOnce($style, 'HEAD');
        }
    }

    
    /**
     * Прихваща събитието 'output' на ЕТ, за да добави стиловете и javascripts
     */
    public static function on_Output(&$invoker)
    {
        // Добавяне на хедърите
        $headers = $invoker->getArray('HTTP_HEADER');
        if (!empty($headers)) {
            foreach ($headers as $hdr) {
                if ($hdr[0] == '-') {
                    header_remove(substr($hdr, 1));
                } else {
                    header($hdr, true);
                }
            }
        }
        
        // Добавяне на файловете
        $files = (object) array(
            'css' => $invoker->getArray('CSS'),
            'js' => $invoker->getArray('JS'),
            'invoker' => $invoker
        );
        
        $invoker->appendFiles($files);
    }
    
    
    /**
     * Интерфейсен метод
     *
     * @see core_page_WrapperIntf
     */
    public function prepare()
    {
    }
    
    
    /**
     * Добавя JS
     *
     * @return core_ET
     */
    public static function addJs()
    {
        $tpl = new ET();
        
        // Показване на статус съобщения
        static::subscribeStatus($tpl);
        
        // Записване на избрания текст с JS
        static::saveSelTextJs($tpl);
        
        // Вземане на времето на бездействие в съответния таб
        static::idleTimerJs($tpl);
        
        $tpl->push('context/'.  context_Setup::get('VERSION') . '/contextMenu.css', 'CSS');
        $tpl->push('context/'.  context_Setup::get('VERSION') . '/contextMenu.js', 'JS');
        
        jquery_Jquery::run($tpl, 'getContextMenuFromAjax();', true);
        jquery_Jquery::runAfterAjax($tpl, 'getContextMenuFromAjax');
        jquery_Jquery::runAfterAjax($tpl, 'makeTooltipFromTitle');
        
        jquery_Jquery::run($tpl, 'scrollLongListTable();');
        jquery_Jquery::run($tpl, 'editCopiedTextBeforePaste();');
        jquery_Jquery::run($tpl, 'smartCenter();');
        jquery_Jquery::run($tpl, 'showTooltip();');
        jquery_Jquery::run($tpl, 'makeTooltipFromTitle();');
        
        $url = json_encode(toUrl(array('bgerp_A', 'wp'), 'local'));
        $tpl->appendOnce("var wpUrl = {$url};", 'SCRIPTS');
        
        return $tpl;
    }
    
    
    /**
     * Показва статус съобщението
     *
     * @param core_ET $tpl
     */
    public static function subscribeStatus(&$tpl)
    {
        // Ако не е сетнато времето на извикване
        if (!$hitTime = Mode::get('hitTime')) {
            
            // Използваме текущото
            $hitTime = dt::mysql2timestamp();
        }
        
        // Добавяме в JS timestamp на извикване на страницата
        $tpl->appendOnce("var hitTime = {$hitTime};", 'SCRIPTS');
        
        // Извикваме показването на статусите
        $tpl->append(core_Statuses::subscribe(), 'STATUSES');
    }
    
    
    /**
     * Маркиране на избрания текст с JS
     *
     * @param core_ET $tpl
     */
    public static function saveSelTextJs(&$tpl)
    {
        // Скрипт, за вземане на инстанция на efae
        jquery_Jquery::run($tpl, 'getEO().saveSelText();', true);
    }
    
    
    /**
     * Функция за вземане на времето на бездействие в съответния таб
     *
     * @param core_ET $tpl
     */
    public static function idleTimerJs(&$tpl)
    {
        jquery_Jquery::run($tpl, "\n getEO().runIdleTimer();", true);
    }
    
    
    /**
     * Ако няма кой да прихване извикването на функцията
     *
     * @param array $css
     */
    public function appendFiles_($files)
    {
        // Дали връзките да са абсолютни
        $absolute = (boolean) (Mode::is('text', 'xhtml'));
        
        if (is_array($files->css)) {
            foreach ($files->css as $file) {
                $file = $this->getFileForAppend($file, $absolute);
                
                $files->invoker->appendOnce("\n@import url(\"{$file}\");", 'STYLE_IMPORT', true);
            }
        }
        
        if (is_array($files->js)) {
            foreach ($files->js as $file) {
                $attr = array();
                $fallbackScript = null;
                if (is_string($file)) {
                    $attr['src'] = $file;
                } elseif (is_object($file)) {
                    $attr = (array) $file;
                    if ($fallbackScript = $attr['fallbackScript']) {
                        unset($attr['fallbackScript']);
                    }
                }
                $attr['type'] = 'text/javascript';
                $attr['src'] = $this->getFileForAppend($attr['src'], $absolute);
                if ($this instanceof cms_page_External) {
                    $attr['defer'] = 'defer';
                }
                $files->invoker->appendOnce("\n" . ht::createElement('script', $attr, ''), 'HEAD', true);
                if ($fallback) {
                    $files->invoker->appendOnce($fallbackScript, 'HEAD', true);
                }
            }
        }
    }
    
    
    /**
     * Връща файла за добавя. Ако е от системата минава през sbf.
     * Ако е външен линк, не го променя
     *
     * @param string    $filePath
     * @param NULL|bool $absolute
     *
     * @return string
     */
    public static function getFileForAppend($filePath, $absolute = null)
    {
        if (preg_match('#^[^/]*//#', $filePath) || $filePath[0] == '/') {
            
            return $filePath;
        }
        
        if (!isset($absolute)) {
            $absolute = (boolean) (Mode::is('text', 'xhtml') || Mode::is('printing') || Mode::is('pdf'));
        }
        
        $filePath = sbf($filePath, '', $absolute);
        
        return $filePath;
    }
    
    
    /**
     * Ако няма кой да прихване извикването на функцията
     *
     * @param array $css
     */
    public function prepareJsFiles_($js)
    {
        return $js;
    }
}
