<?php
/**
 * @brief dcCKEditor, a plugin for Dotclear 2
 *
 * @package Dotclear
 * @subpackage Plugins
 *
 * @copyright Olivier Meunier & Association Dotclear
 * @copyright GPL-2.0-only
 */
if (!defined('DC_CONTEXT_ADMIN')) {
    return;
}

header('Content-type: text/javascript');

if (!empty($_GET['context'])) {
    $context = $_GET['context'];
} else {
    $context = '';
}

$__extraPlugins = new ArrayObject();
$core->callBehavior('ckeditorExtraPlugins', $__extraPlugins, $context);
$extraPlugins = $__extraPlugins->getArrayCopy();

?>

(function($) {
    $.toolbarPopup = function toolbarPopup(url) {
        if (dotclear.admin_base_url != '') {
            var pos = url.indexOf(dotclear.admin_base_url);
            if (pos == -1) {
                url = dotclear.admin_base_url + url;
            }
        }

        var args = Array.prototype.slice.call(arguments);
        var width = 520, height = 420;
        if (args[1]!==undefined) {
            width = args[1].width || width;
            height = args[1].height || height;
        }

        var popup_params = 'alwaysRaised=yes,dependent=yes,toolbar=yes,';
        popup_params += 'height='+height+',width='+width+',menubar=no,resizable=yes,scrollbars=yes,status=no';
        var popup_link = window.open(url,'dc_popup', popup_params);
    };

    $.stripBaseURL = function stripBaseURL(url) {
        if (dotclear.base_url != '') {
            var pos = url.indexOf(dotclear.base_url);
            if (pos == 0) {
                url = url.substr(dotclear.base_url.length);
            }
        }

        return url;
    };

    /* Retrieve editor from popup */
    $.active_editor = null;
    $.getEditorName = function getEditorName() {
        return $.active_editor;
    }
    chainHandler(window,'onbeforeunload',function(e) {
        if (e == undefined && window.event) {
            e = window.event;
        }

        var editor = CKEDITOR.instances[$.getEditorName()];
        if (editor !== undefined && !dotclear.confirmClosePage.form_submit && editor.checkDirty()) {
            e.preventDefault(); // HTML5 specification
            e.returnValue = ''; // Google Chrome requires returnValue to be set.
        }
        return false;
    });
})(jQuery);

$(function() {
    /* By default ckeditor load related resources with a timestamp to avoid cache problem when upgrading itself
     * load_plugin_file.php does not allow other param that file to load (pf param), so remove timestamp
     */

    CKEDITOR.timestamp = '';

<?php if (!isset($dcckeditor_disable_native_spellchecker) || $dcckeditor_disable_native_spellchecker): ?>
    CKEDITOR.config.disableNativeSpellChecker = true;
<?php else: ?>
    CKEDITOR.config.disableNativeSpellChecker = false;
<?php endif;?>

    CKEDITOR.config.skin = 'dotclear,'+dotclear.dcckeditor_plugin_url+'/js/ckeditor-skins/dotclear/';
    CKEDITOR.config.baseHref = dotclear.base_url;
    CKEDITOR.config.height = '<?php echo $core->auth->getOption('edit_size') * 14; ?>px';

<?php if (!empty($dcckeditor_cancollapse_button)): ?>
    CKEDITOR.config.toolbarCanCollapse = true;
<?php endif;?>

    CKEDITOR.plugins.addExternal('entrylink',dotclear.dcckeditor_plugin_url+'/js/ckeditor-plugins/entrylink/');
    CKEDITOR.plugins.addExternal('dclink',dotclear.dcckeditor_plugin_url+'/js/ckeditor-plugins/dclink/');
    CKEDITOR.plugins.addExternal('media',dotclear.dcckeditor_plugin_url+'/js/ckeditor-plugins/media/');
    CKEDITOR.plugins.addExternal('img',dotclear.dcckeditor_plugin_url+'/js/ckeditor-plugins/img/');

<?php if (!empty($dcckeditor_textcolor_button) || !empty($dcckeditor_background_textcolor_button)): ?>
    // button add "More Colors..." can be added if colordialog plugin is enabled
    CKEDITOR.config.colorButton_enableMore = true;
    <?php if (!empty($dcckeditor_custom_color_list)) : ?>
        CKEDITOR.config.colorButton_colors = '<?php echo $dcckeditor_custom_color_list; ?>';
    <?php endif;?>
    CKEDITOR.config.colorButton_colorsPerRow = <?php echo($dcckeditor_colors_per_row ?: 6); /* @phpstan-ignore-line */ ?>;
<?php endif;?>

    CKEDITOR.config.defaultLanguage = dotclear.user_language;
    CKEDITOR.config.language = dotclear.user_language;
    CKEDITOR.config.contentsLanguage = dotclear.user_language;

<?php
if (!empty($extraPlugins)) {
    foreach ($extraPlugins as $plugin) {
        printf("\tCKEDITOR.plugins.addExternal('%s','%s');\n", $plugin['name'], $plugin['url']);
    }
}
?>
    if (dotclear.ckeditor_context === undefined || dotclear.ckeditor_tags_context[dotclear.ckeditor_context] === undefined) {
        return;
    }
    $(dotclear.ckeditor_tags_context[dotclear.ckeditor_context].join(',')).ckeditor({

<?php
$defautExtraPlugins = 'entrylink,dclink,media,justify,colorbutton,format,img,footnotes';
if (!empty($extraPlugins)) {
    foreach ($extraPlugins as $plugin) {
        $defautExtraPlugins .= ',' . $plugin['name'];
    }
}
?>
        extraPlugins: '<?php echo $defautExtraPlugins; ?>',

        keystrokes: [
            [ CKEDITOR.CTRL + (CKEDITOR.env.mac ? CKEDITOR.ALT : CKEDITOR.SHIFT) +
                dotclear.msg.link_accesskey.toUpperCase().charCodeAt(0),'dcLinkCommand' ],    // Ctrl+Alt+l
            [ CKEDITOR.CTRL + (CKEDITOR.env.mac ? CKEDITOR.ALT : CKEDITOR.SHIFT) +
                dotclear.msg.img_select_accesskey.toUpperCase().charCodeAt(0),'mediaCommand' ],    // Ctrl+Alt+m
        ],

<?php if (!empty($dcckeditor_format_select)): ?>
        // format tags

    <?php if (!empty($dcckeditor_format_tags)): ?>
        format_tags: '<?php echo $dcckeditor_format_tags; ?>',
    <?php else: ?>
        format_tags: 'p;h1;h2;h3;h4;h5;h6;pre;address',
    <?php endif;?>

        // following definition are needed to be specialized
        format_p: { element: 'p' },
        format_h1: { element: 'h1' },
        format_h2: { element: 'h2' },
        format_h3: { element: 'h3' },
        format_h4: { element: 'h4' },
        format_h5: { element: 'h5' },
        format_h6: { element: 'h6' },
        format_pre: { element: 'pre' },
        format_address: { element: 'address' },
<?php endif;?>

        entities: false,
        removeButtons: '',
        allowedContent: true,
        toolbar: [
            {
                name: 'basicstyles',
                items: [

<?php if (!empty($dcckeditor_format_select)): ?>
                    'Format',
<?php endif;?>

                    'Bold','Italic','Underline','Strike','Subscript','Superscript','Code','Blockquote',

<?php if (!empty($dcckeditor_list_buttons)): ?>
                    'NumberedList','BulletedList',
<?php endif;?>

                    'RemoveFormat'
                ]
            },

<?php if (!empty($dcckeditor_clipboard_buttons)): ?>
            {
                name: 'clipoard',
                items: ['Cut','Copy','Paste','PasteText','PasteFromWord']
            },
<?php endif;?>

<?php if (!empty($dcckeditor_action_buttons)): ?>
            {
                name: 'action',
                items: ['Undo','Redo']
            },
<?php endif;?>

<?php if (!empty($dcckeditor_alignment_buttons)): ?>
            {
                name: 'paragraph',
                items: ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock']
            },
<?php endif;?>

<?php if (!empty($dcckeditor_table_button)): ?>
            {
                name: 'table',
                items: ['Table']
            },
<?php endif;?>

            {
                name: 'custom',
                items: [
                    'EntryLink','dcLink','Media','img','Footnotes','-',
                    'Source'

<?php if (!empty($dcckeditor_textcolor_button)): ?>
                    ,'TextColor'
<?php endif;?>

<?php if (!empty($dcckeditor_background_textcolor_button)): ?>
                    ,'BGColor'
<?php endif;?>
                ]
            },
            {
                name: 'special',
                items: [
                    'Maximize'
                ]
            },

<?php // add extra buttons comming from dotclear plugins
if (!empty($extraPlugins)) {
    $extraPlugins_str = "{name: 'extra', items: [%s]},\n";
    $extra_icons      = '';
    foreach ($extraPlugins as $plugin) {
        $extra_icons .= sprintf("'%s',", $plugin['button']);
    }
    printf($extraPlugins_str, $extra_icons);
}
?>
        ],

<?php // footnotes related
    switch ($core->blog->settings->system->note_title_tag) {
        case 1:
            $tag = 'h3';

            break;
        case 2:
            $tag = 'p';

            break;
        default:
            $tag = 'h4';

            break;
    }
    $notes_tag   = sprintf("['<%s>', '</%s>']", $tag, $tag);
    $notes_title = sprintf('"%s"', __('Note(s)'));
?>
        footnotesHeaderEls: <?php printf($notes_tag); ?>,
        footnotesTitle: <?php printf($notes_title); ?>

    });

    CKEDITOR.on('instanceLoaded',function(e) {
        // Retrieve textarea element of the instance, then its line-height (in px) and rows values,
        // then apply line-height * rows (min = 6) to the inner height of the instance.

        var ta = document.getElementById(e.editor.name);
        if (ta !== undefined) {
            var ta_rows = ta.rows;
            var ta_line_height = parseFloat(window.getComputedStyle(ta,null).getPropertyValue('line-height'));
            if (ta_rows > 0 && ta_line_height > 0) {
                var ta_height = String(Math.max(ta_rows,6) * ta_line_height);
                e.editor.resize('100%',ta_height,true);
            }
        }
    });

    CKEDITOR.on('instanceReady',function(e) {
        if (ff = $('body').css("font-family")) {
            e.editor.document.$.querySelector('body').style.setProperty('font-family',ff);
        }
        if (dotclear?.data?.htmlFontSize) {
            e.editor.document.$.documentElement.style.setProperty('--html-font-size',dotclear.data.htmlFontSize);
            e.editor.document.$.querySelector('body').style.setProperty('font-size','calc(var(--html-font-size) * 1.4)');
        }

        if ($('label[for="post_excerpt"] button').attr('aria-label') == dotclear.img_minus_alt) {
            $('#cke_post_excerpt').removeClass('hide');
        } else {
            $('#cke_post_excerpt').addClass('hide');
        }

        $('#excerpt-area label').on('click', function() {
            $('#cke_post_excerpt').toggleClass('hide',$('#post_excerpt').hasClass('hide'));
        });

        const ta = document.getElementById(e.editor.name);
        if (ta !== undefined) {
            if (ta.lang && e.editor.config.contentsLanguage !== ta.lang) {
                e.editor.config.contentsLanguage = ta.lang;
            }
        }
    });

    // @TODO: find a better way to retrieve active editor
    for (var id in CKEDITOR.instances) {
        CKEDITOR.instances[id].on('focus',function(e) {
            $.active_editor = e.editor.name;
        });
    }
});
