Skip to content
Code-Schnipsel Gruppen Projekte
Editor.js 31,5 KiB
Newer Older
  • Learn to ignore specific revisions
  • Henning Leutz's avatar
    Henning Leutz committed
    /**
     * ckeditor4 for QUIQQER
     *
    
     * @module package/quiqqer/ckeditor4/bin/Editor
    
    Henning Leutz's avatar
    Henning Leutz committed
     * @author www.pcsg.de (Henning Leutz)
     *
    
    Henning Leutz's avatar
    Henning Leutz committed
     * @require require
    
    Henning Leutz's avatar
    Henning Leutz committed
     * @require qui/QUI
    
    Henning Leutz's avatar
    Henning Leutz committed
     * @require controls/editors/Editor
     * @require Locale
     * @require Ajax
     * @require qui/utils/Math
    
    Henning Leutz's avatar
    Henning Leutz committed
     * @require qui/utils/Elements
    
    Henning Leutz's avatar
    Henning Leutz committed
     * @require css!package/quiqqer/ckeditor4/bin/Editor.css
    
    Henning Leutz's avatar
    Henning Leutz committed
     */
    
    define('package/quiqqer/ckeditor4/bin/Editor', [
    
    Henning Leutz's avatar
    Henning Leutz committed
    
        'require',
    
    Henning Leutz's avatar
    Henning Leutz committed
        'controls/editors/Editor',
    
        'Locale',
    
        'qui/utils/Elements',
    
        'package/quiqqer/ckeditor4/bin/Settings',
    
        'css!package/quiqqer/ckeditor4/bin/Editor.css'
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    ], function (require, QUI, Editor, Locale, Ajax, QUIMath, QUIElements, Settings) {
    
    Henning Leutz's avatar
    Henning Leutz committed
        "use strict";
    
    
    Henning Leutz's avatar
    Henning Leutz committed
        return new Class({
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            Extends: Editor,
            Type   : 'package/quiqqer/ckeditor4/bin/Editor',
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            Binds: [
    
    Henning Leutz's avatar
    Henning Leutz committed
                '$onLoad',
                '$onDestroy',
                '$onSetContent',
                '$onGetContent',
                '$onDrop',
                '$onResize',
                '$onAddCSS',
                '$onInstanceReadyListener'
    
    Henning Leutz's avatar
    Henning Leutz committed
            ],
    
    
            /**
             * Control Constructor
             * @param Manager
             * @param options
             */
    
    Henning Leutz's avatar
    Henning Leutz committed
            initialize: function (Manager, options) {
                this.parent(Manager, options);
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
                this.$cssFiles = {};
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                this.addEvents({
    
    Henning Leutz's avatar
    Henning Leutz committed
                    onLoad      : this.$onLoad,
                    onResize    : this.$onResize,
                    onDestroy   : this.$onDestroy,
                    onSetContent: this.$onSetContent,
                    onGetContent: this.$onGetContent,
                    onDrop      : this.$onDrop,
                    onAddCSS    : this.$onAddCSS
    
    Henning Leutz's avatar
    Henning Leutz committed
                });
            },
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            /**
             * Editor onLoad Event
             * if the editor is to be drawn and inserted
             *
             * @param {Object} data - Editor data
             */
    
    Henning Leutz's avatar
    Henning Leutz committed
            $onLoad: function (data) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                var self = this;
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                // load CKEDITOR
    
    Henning Leutz's avatar
    Henning Leutz committed
                require([URL_OPT_DIR + 'ckeditor/ckeditor/ckeditor.js'], function () {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    window.CKEDITOR.on('instanceReady', function (ev) {
    
                        if (Editor && "$onInstanceReadyListener" in Editor) {
                            Editor.$onInstanceReadyListener(ev);
                        }
    
                    });
    
                    // http://docs.ckeditor.com/#!/guide/dev_howtos_dialog_windows
    
    Henning Leutz's avatar
    Henning Leutz committed
                    window.CKEDITOR.on('dialogDefinition', function (ev) {
    
                        Editor.$html5AudioDialog(ev);
                        Editor.$html5VideoDialog(ev);
    
    Henning Leutz's avatar
    Henning Leutz committed
            /**
             * Load the CKEditor Instance into an Textarea or DOMNode Element
             *
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param {Object} data - Editor settings data
    
    Henning Leutz's avatar
    Henning Leutz committed
             */
    
    Henning Leutz's avatar
    Henning Leutz committed
            $loadInstance: function (data) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                if (typeof window.CKEDITOR === 'undefined') {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    return;
                }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                var self      = this,
                    Container = this.getContainer(),
                    Textarea  = false,
                    size      = Container.getSize();
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                if (!Container.getElement('textarea')) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    Textarea = new Element('textarea', {
    
                        id    : self.getId(),
    
    Henning Leutz's avatar
    Henning Leutz committed
                        styles: {
                            height: size.y,
    
    Henning Leutz's avatar
    Henning Leutz committed
                            width : size.x
    
    Henning Leutz's avatar
    Henning Leutz committed
                        }
    
    Henning Leutz's avatar
    Henning Leutz committed
                    }).inject(Container);
    
    Henning Leutz's avatar
    Henning Leutz committed
                if (!Textarea) {
                    Textarea = Container.getElement('textarea');
    
    Henning Leutz's avatar
    Henning Leutz committed
                }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                var instance = Textarea.get('id');
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                if (window.CKEDITOR.instances[instance]) {
                    window.CKEDITOR.instances[instance].destroy(true);
    
    Henning Leutz's avatar
    Henning Leutz committed
                }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                self.setAttribute('instancename', instance);
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                // parse the buttons for the ckeditor
                var b, g, i, len, blen, glen, group, items,
                    buttonEntry, lineEntry, groupEntry;
    
                var buttons = data.toolbar,
                    lines   = buttons.lines || [],
                    toolbar = [];
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                for (i = 0, len = lines.length; i < len; i++) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    items     = [];
    
    Henning Leutz's avatar
    Henning Leutz committed
                    lineEntry = lines[i];
    
    Henning Leutz's avatar
    Henning Leutz committed
    
                    // groups
    
    Henning Leutz's avatar
    Henning Leutz committed
                    for (g = 0, glen = lineEntry.length; g < glen; g++) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                        group      = [];
    
    Henning Leutz's avatar
    Henning Leutz committed
                        groupEntry = lineEntry[g];
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                        // buttons
    
    Henning Leutz's avatar
    Henning Leutz committed
                        for (b = 0, blen = groupEntry.length; b < blen; b++) {
                            buttonEntry = groupEntry[b];
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
                            if (buttonEntry.type === 'separator') {
    
    Henning Leutz's avatar
    Henning Leutz committed
                                group.push('-');
    
    Henning Leutz's avatar
    Henning Leutz committed
                                continue;
    
    Henning Leutz's avatar
    Henning Leutz committed
                            }
    
    Henning Leutz's avatar
    Henning Leutz committed
                            group.push(buttonEntry.button);
    
    Henning Leutz's avatar
    Henning Leutz committed
                        }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                        toolbar.push(group);
    
    Henning Leutz's avatar
    Henning Leutz committed
                    }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                    toolbar.push('/');
    
    Henning Leutz's avatar
    Henning Leutz committed
                }
    
    Henning Leutz's avatar
    Henning Leutz committed
                var height = size.y,
                    width  = size.x;
    
    Henning Leutz's avatar
    Henning Leutz committed
                if (self.getAttribute('width')) {
                    width = self.getAttribute('width');
    
    Henning Leutz's avatar
    Henning Leutz committed
                if (self.getAttribute('height')) {
                    height = self.getAttribute('height');
    
    Henning Leutz's avatar
    Henning Leutz committed
                }
    
    Henning Leutz's avatar
    Henning Leutz committed
                var zIndex = QUIElements.getComputedZIndex(Container);
    
    Henning Leutz's avatar
    Henning Leutz committed
                // parse styles to fckedit styles
                var entry, styles = [];
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                if (!("styles" in data)) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    data.styles = [];
                }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                for (i = 0, len = data.styles.length; i < len; i++) {
                    entry = data.styles[i];
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                    styles.push({
    
    Henning Leutz's avatar
    Henning Leutz committed
                        name      : entry.text,
                        element   : entry.element,
                        attributes: entry.attributes
    
    Henning Leutz's avatar
    Henning Leutz committed
                    });
    
                if (!("cssFiles" in data)) {
                    data.cssFiles = [];
                }
    
    
                data.cssFiles.push(
    
    Henning Leutz's avatar
    Henning Leutz committed
                    URL_OPT_DIR + 'quiqqer/ckeditor4/bin/defaultWysiwyg.css'
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
                data.cssFiles.push(
                    URL_OPT_DIR + 'quiqqer/quiqqer/bin/css/fonts/font-awesome.min.css'
                );
    
    
                Settings.getConfig().then(function (config) {
    
                    plugins = self.$parseToolbarToPlugins(toolbar).concat(plugins);
                    plugins = plugins.unique();
    
    
                    var pluginPath   = config.pluginPath;
    
                    var extraPlugins = plugins.join(",");
    
    
    
                    for (var i = 0, len = plugins.length; i < len; i++) {
                        var pluginName = plugins[i];
                        if (!window.CKEDITOR.plugins.get(pluginName)) {
                            window.CKEDITOR.plugins.addExternal(pluginName, pluginPath + "/bin/" + pluginName + "/", "");
                        }
                    }
    
    
    
                    window.CKEDITOR.replace(instance, {
    
                        skinName                 : 'moono-lisa',
                        customConfig             : '',
                        language                 : Locale.getCurrent(),
                        baseHref                 : URL_DIR,
                        basePath                 : URL_DIR,
                        height                   : height,
                        width                    : width,
    
                        allowedContent           : true,
                        extraAllowedContent      : 'div(*)[*]{*}; iframe(*)[*]{*}; img(*)[*]{*}; script(*)[*]{*}',
                        stylesSet                : styles,
                        contentsCss              : data.cssFiles || [],
                        bodyClass                : data.bodyClass,
    
                        // templates_files : [URL_OPT_DIR +'base/bin/pcsgEditorPlugins/templates.php'],
    
                        baseFloatZIndex          : zIndex,
                        extraPlugins             : extraPlugins,
                        //removePlugins            : 'scayt',
    
                        disableNativeSpellChecker: config.disableNativeSpellChecker
    
    Henning Leutz's avatar
    Henning Leutz committed
                });
    
    Henning Leutz's avatar
    Henning Leutz committed
            },
    
            /**
             * Editor onDestroy Event
             *
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param {Object} Editor - controls/editors/Editor
    
    Henning Leutz's avatar
    Henning Leutz committed
             */
    
    Henning Leutz's avatar
    Henning Leutz committed
            $onDestroy: function (Editor) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                var Instance = Editor.getInstance();
    
    
                if (!Instance || !(name in Instance)) {
                    return;
                }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                if (window.CKEDITOR.instances[Instance.name]) {
                    try {
                        window.CKEDITOR.instances[Instance.name].destroy(true);
                    } catch (e) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    window.CKEDITOR.instances[Instance.name] = null;
                    delete window.CKEDITOR.instances[Instance.name];
    
    Henning Leutz's avatar
    Henning Leutz committed
                    window.CKEDITOR.removeListener(
                        'instanceReady',
                        this.$onInstanceReadyListener
                    );
    
    Henning Leutz's avatar
    Henning Leutz committed
                }
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
            /**
             * event : instance ready
             * @param instance
             */
    
    Henning Leutz's avatar
    Henning Leutz committed
            $onInstanceReadyListener: function (instance) {
                if (typeof instance.editor === 'undefined' ||
                    typeof instance.editor.name === 'undefined' ||
                    instance.editor.name !== this.getAttribute('instancename')) {
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                // resize the editor
    
    Henning Leutz's avatar
    Henning Leutz committed
                var Container     = this.getContainer(),
    
    Henning Leutz's avatar
    Henning Leutz committed
                    containerSize = Container.getSize();
    
                // fckeditor resize, setHeight is sooooooooooo mysterious
    
    Henning Leutz's avatar
    Henning Leutz committed
                instance.editor.resize(containerSize.x, containerSize.y);
    
    Henning Leutz's avatar
    Henning Leutz committed
                this.setInstance(instance.editor);
                this.fireEvent('loaded', [this, instance.editor]);
    
    
                instance.editor.focus();
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            /**
             * event : on resize
             */
    
    Henning Leutz's avatar
    Henning Leutz committed
            $onResize: function () {
                var Container     = this.getContainer(),
                    Instance      = this.getInstance(),
    
    Henning Leutz's avatar
    Henning Leutz committed
                    containerSize = Container.getSize();
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                Instance.resize(containerSize.x, containerSize.y);
    
    Henning Leutz's avatar
    Henning Leutz committed
            /**
             * Editor onSetContent Event
             *
             * @param {String} content
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param {Object} Editor - controls/editors/Editor
    
    Henning Leutz's avatar
    Henning Leutz committed
             */
    
    Henning Leutz's avatar
    Henning Leutz committed
            $onSetContent: function (content, Editor) {
                if (Editor.getInstance()) {
                    Editor.getInstance().setData(content);
    
    Henning Leutz's avatar
    Henning Leutz committed
                }
    
    Henning Leutz's avatar
    Henning Leutz committed
    
            /**
             * Editor onGetContent Event
             *
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param {Object} Editor - controls/editors/Editor
    
    Henning Leutz's avatar
    Henning Leutz committed
             */
    
    Henning Leutz's avatar
    Henning Leutz committed
            $onGetContent: function (Editor) {
                if (Editor.getInstance()) {
                    Editor.setAttribute('content', Editor.getInstance().getData());
    
    Henning Leutz's avatar
    Henning Leutz committed
                }
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            /**
             * Set the focus to the editor
             */
    
    Henning Leutz's avatar
    Henning Leutz committed
            focus: function () {
                if (this.getInstance()) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    this.getInstance().focus();
                }
    
    Henning Leutz's avatar
    Henning Leutz committed
    
            /**
             * Switch to source mode
             */
    
    Henning Leutz's avatar
    Henning Leutz committed
            switchToSource: function () {
                if (this.getInstance()) {
                    this.getInstance().setMode('source');
    
    Henning Leutz's avatar
    Henning Leutz committed
                }
    
    Henning Leutz's avatar
    Henning Leutz committed
    
            /**
             * Switch to wysiwyg editor
             */
    
    Henning Leutz's avatar
    Henning Leutz committed
            switchToWYSIWYG: function () {
                if (this.getInstance()) {
                    this.getInstance().setMode('wysiwyg');
    
    Henning Leutz's avatar
    Henning Leutz committed
                }
    
    Henning Leutz's avatar
    Henning Leutz committed
    
            /**
             * Hide the toolbar
             */
    
    Henning Leutz's avatar
    Henning Leutz committed
            hideToolbar: function () {
                var Toolbar = this.getElm().getElement('.cke_top');
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                if (Toolbar) {
                    Toolbar.setStyle('display', 'none');
    
    Henning Leutz's avatar
    Henning Leutz committed
                }
    
    Henning Leutz's avatar
    Henning Leutz committed
    
            /**
             * show the toolbar
             */
    
    Henning Leutz's avatar
    Henning Leutz committed
            showToolbar: function () {
                var Toolbar = this.getElm().getElement('.cke_top');
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                if (Toolbar) {
                    Toolbar.setStyle('display', null);
    
    Henning Leutz's avatar
    Henning Leutz committed
                }
    
    Henning Leutz's avatar
    Henning Leutz committed
    
            /**
             * Set the height of the instance
             *
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param {Number} height
    
    Henning Leutz's avatar
    Henning Leutz committed
             */
    
    Henning Leutz's avatar
    Henning Leutz committed
            setHeight: function (height) {
                if (this.getInstance()) {
                    this.getInstance().resize(false, height);
    
    Henning Leutz's avatar
    Henning Leutz committed
                }
    
    Henning Leutz's avatar
    Henning Leutz committed
                this.setAttribute('height', height);
    
    
            /**
             * Set the height of the instance
             *
             * @param {Number} width
             */
    
    Henning Leutz's avatar
    Henning Leutz committed
            setWidth: function (width) {
                if (this.getInstance()) {
                    this.getInstance().resize(width, false);
    
    Henning Leutz's avatar
    Henning Leutz committed
                this.setAttribute('width', width);
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
            /**
             * event : on add css
             *
             * @param {String} file - path to the css file
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param {Object} Editor - controls/editor/Editor
    
    Henning Leutz's avatar
    Henning Leutz committed
            $onAddCSS: function (file, Editor) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                this.$cssFiles[file] = true;
    
    Henning Leutz's avatar
    Henning Leutz committed
                if (Instance) {
    
                    var Doc  = Editor.getDocument(),
                        Link = Doc.createElement('link');
    
                    Link.href = file;
                    Link.rel  = "stylesheet";
                    Link.type = "text/css";
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                    Doc.head.appendChild(Link);
    
    Henning Leutz's avatar
    Henning Leutz committed
            /**
    
    Henning Leutz's avatar
    Henning Leutz committed
             * event : on Drop
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param {Object} params
             */
    
    Henning Leutz's avatar
    Henning Leutz committed
            $onDrop: function (params) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                var Instance = this.getInstance();
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                for (var i = 0, len = params.length; i < len; i++) {
                    Instance.insertHtml("<img src=" + params[i].url + " />");
    
    Henning Leutz's avatar
    Henning Leutz committed
                }
    
            /**
             * Generate the extra plugins option in dependence of the toolbar
             * @param toolbar
             *
             * @return Array
             */
            $parseToolbarToPlugins: function (toolbar) {
                var extra      = [],
                    buttonList = [];
    
                if (typeOf(toolbar) == 'array') {
                    buttonList = toolbar.flatten();
                }
    
                for (var i = 0, len = buttonList.length; i < len; i++) {
                    switch (buttonList[i]) {
                        case 'Templates':
                            extra.push('templates');
                            break;
    
                        case 'Find':
                        case 'Replace':
                            extra.push('find');
                            break;
    
                        case 'SelectAll':
                            extra.push('selectall');
                            break;
    
                        case 'Form':
                        case 'Checkbox':
                        case 'Radio':
                        case 'TextField':
                        case 'Textarea':
                        case 'Select':
                        case 'Button':
                        case 'ImageButton':
                        case 'HiddenField':
                            extra.push('forms');
                            break;
    
                        case 'CreateDiv':
                            extra.push('div');
                            break;
    
                        case 'JustifyLeft':
                        case 'JustifyCenter':
                        case 'JustifyRight':
                        case 'JustifyBlock':
                            extra.push('justify');
                            break;
    
                        case 'BidiLtr':
                        case 'BidiRtl':
                            extra.push('bidi');
                            break;
    
                        case 'Language':
                            extra.push('language');
                            break;
    
                        case 'Link':
                        case 'Unlink':
                        case 'Anchor':
                            extra.push('link');
                            break;
    
                        case 'Flash':
                            extra.push('flash');
                            break;
    
                        case 'Smiley':
                            extra.push('smiley');
                            break;
    
                        case 'PageBreak':
                            extra.push('pagebreak');
                            break;
    
                        case 'Iframe':
                            extra.push('iframe');
                            break;
    
                        case 'Font':
                        case 'FontSize':
                            extra.push('font');
                            break;
    
                        case 'BGColor':
                        case 'TextColor':
                            extra.push('colorbutton');
                            break;
    
                        case 'Code':
                            extra.push('codetag');
                            break;
                        case 'Image':
                            extra.push('image2');
                            break;
                        case 'Zoom':
                            extra.push('zoom');
                            break;
                        case 'Youtube':
                            extra.push('youtube');
                            break;
                        case 'Videodetector':
                            extra.push('videodetector');
                            break;
                        case 'Tweetabletext':
                            extra.push('tweetabletext');
                            break;
                        case 'Createtoken':
                            extra.push('token');
                            break;
                        case 'TransformTextSwitcher':
                        case 'TransformTextToLowercase':
                        case 'TransformTextToUppercase':
                        case 'TransformTextCapitalize':
                            extra.push('texttransform');
                            break;
                        case 't2s_button':
                            extra.push('text2speech');
                            break;
                        case 'Symbol':
                            extra.push('symbol');
                            break;
                        case 'pre':
                            extra.push('pre');
                            break;
                        case 'pbckeditor':
                            extra.push('pbckeditor');
                            break;
                        case 'page2images':
                            extra.push('page2images');
                            break;
                        case 'Markdown':
                            extra.push('markdown');
                            break;
                        case 'Loremipsum':
                            extra.push('loremipsum');
                            break;
                        case 'inserthtml4x':
                            extra.push('inserthtml4x');
                            break;
                        case 'Html5Video':
                            extra.push('html5video');
                            break;
                        case 'Html5Audio':
                            extra.push('html5audio');
                            break;
                        case 'EqnEditor':
                            extra.push('eqneditor');
                            break;
                        case 'cssanim':
                            extra.push('cssanim');
                            break;
                        case 'WebSpeechEnabled':
                        case 'WebSpeechSettings':
                            extra.push('ckwebspeech');
                            break;
                        case 'base64image':
                            extra.push('base64image');
                            break;
                        case 'AutoCorrect':
                            extra.push('autocorrect');
                            break;
    
            /**
             * edit the image dialog
             *
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param {DOMEvent} ev - CKEvent
             * @return {DOMEvent} ev (CKEvent)
    
    Henning Leutz's avatar
    Henning Leutz committed
            $imageDialog: function (ev) {
    
                // Take the dialog name and its definition from the event data.
    
    Henning Leutz's avatar
    Henning Leutz committed
                var self             = this,
                    dialogName       = ev.data.name,
                    dialogDefinition = ev.data.definition;
    
                /**
                 * Image dialog
                 */
    
    Henning Leutz's avatar
    Henning Leutz committed
                if (dialogName != 'image') {
    
    Henning Leutz's avatar
    Henning Leutz committed
                var oldOnShow = dialogDefinition.onShow;
    
    
                // Get a reference to the "Link Info" tab.
    
    Henning Leutz's avatar
    Henning Leutz committed
                dialogDefinition.onShow = function () {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    var Button;
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                    oldOnShow.bind(this)();
    
                    // image button
    
    Henning Leutz's avatar
    Henning Leutz committed
                    var UrlGroup = this.getContentElement('info', 'txtUrl')
    
                        .getElement()
    
    Henning Leutz's avatar
    Henning Leutz committed
                        .$;
    
    Henning Leutz's avatar
    Henning Leutz committed
                    var UrlInput = UrlGroup.getElement('input[type="text"]');
    
    Henning Leutz's avatar
    Henning Leutz committed
                    var HeightInput = this.getContentElement('info', 'txtHeight')
    
                        .getElement().$
                        .getElement('input[type="text"]');
    
    Henning Leutz's avatar
    Henning Leutz committed
                    var WidthInput = this.getContentElement('info', 'txtWidth')
    
                        .getElement().$
                        .getElement('input[type="text"]');
    
    Henning Leutz's avatar
    Henning Leutz committed
                    if (!UrlGroup.getElement('.qui-button')) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                        Button = new Element('button', {
    
    Henning Leutz's avatar
    Henning Leutz committed
                            'class': 'qui-button',
    
    Henning Leutz's avatar
    Henning Leutz committed
                            html   : '<span class="fa fa-picture-o"></span>',
    
    Henning Leutz's avatar
    Henning Leutz committed
                            events : {
                                click: function () {
    
                                    self.openMedia({
    
    Henning Leutz's avatar
    Henning Leutz committed
                                        events: {
                                            onSubmit: function (Win, data) {
    
                                                UrlInput.value = data.url;
    
    Henning Leutz's avatar
    Henning Leutz committed
                                                Ajax.get('ajax_media_details', function (fileData) {
                                                    if (fileData.image_height > 500 ||
                                                        fileData.image_width > 500) {
    
                                                        var result = QUIMath.resizeVar(
                                                            fileData.image_height,
                                                            fileData.image_width,
                                                            500
                                                        );
    
                                                        HeightInput.value = result.var1;
                                                        WidthInput.value  = result.var2;
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                                                    } else {
    
                                                        HeightInput.value = fileData.image_height;
                                                        WidthInput.value  = fileData.image_width;
                                                    }
    
                                                    if (!fileData.image_height) {
                                                        HeightInput.value = '';
                                                    }
    
                                                    if (!fileData.image_width) {
                                                        WidthInput.value = '';
                                                    }
    
    Henning Leutz's avatar
    Henning Leutz committed
                                                    project: data.project,
                                                    fileid : data.id
    
    Henning Leutz's avatar
    Henning Leutz committed
                        }).inject(UrlGroup);
    
    
                        Button.getPrevious().setStyles({
    
    Henning Leutz's avatar
    Henning Leutz committed
                            'float': 'left'
    
    Henning Leutz's avatar
    Henning Leutz committed
                    var LinkGroup = this.getContentElement('Link', 'txtUrl')
    
                        .getElement()
    
    Henning Leutz's avatar
    Henning Leutz committed
                        .$;
    
    Henning Leutz's avatar
    Henning Leutz committed
                    if (LinkGroup.getElement('.qui-button')) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    var LinkInput = LinkGroup.getElement('input[type="text"]');
    
    Henning Leutz's avatar
    Henning Leutz committed
                    Button = new Element('button', {
    
    Henning Leutz's avatar
    Henning Leutz committed
                        'class': 'qui-button',
    
    Henning Leutz's avatar
    Henning Leutz committed
                        html   : '<span class="fa fa-home"></span>',
    
    Henning Leutz's avatar
    Henning Leutz committed
                        events : {
                            click: function () {
    
                                self.openProject({
    
    Henning Leutz's avatar
    Henning Leutz committed
                                    events: {
                                        onSubmit: function (Win, data) {
                                            LinkInput.value = data.urls[0];
    
    Henning Leutz's avatar
    Henning Leutz committed
                    }).inject(LinkGroup);
    
                    var Prev = Button.getPrevious();
    
                    Prev.setStyles({
    
    Henning Leutz's avatar
    Henning Leutz committed
                        'float': 'left',
                        width  : Prev.getSize().x - 100
    
    Henning Leutz's avatar
    Henning Leutz committed
                };
    
    
                return ev;
    
    
            /**
             * edit the link dialog
             *
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param {DOMEvent} ev - CKEvent
             * @return {DOMEvent} ev - CKEvent
    
    Henning Leutz's avatar
    Henning Leutz committed
            $linkDialog: function (ev) {
    
                // Take the dialog name and its definition from the event data.
    
    Henning Leutz's avatar
    Henning Leutz committed
                var dialogName = ev.data.name;
    
                 * Link dialog
    
    Henning Leutz's avatar
    Henning Leutz committed
                if (dialogName != 'link') {
    
                // remove protokoll dropdown
    
    Henning Leutz's avatar
    Henning Leutz committed
                //dialogDefinition.getContents( 'info' ).remove( 'protocol');
    
    
                // remove protokoll at insertion
    
    Henning Leutz's avatar
    Henning Leutz committed
                var Protokoll;
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                var dialogDefinition = ev.data.definition,
    
    Henning Leutz's avatar
    Henning Leutz committed
                    Url              = dialogDefinition.getContents('info').get('url'),
                    orgCommit        = Url.commit;
    
    Henning Leutz's avatar
    Henning Leutz committed
                Url.commit = function (data) {
                    orgCommit.call(this, data);
    
    Henning Leutz's avatar
    Henning Leutz committed
                    Protokoll = dialogDefinition.dialog
    
                        .getContentElement('info', 'protocol')
                        .getElement()
                        .$
                        .getElement('select');
    
                    data.url = {
    
    Henning Leutz's avatar
    Henning Leutz committed
                        protocol: Protokoll.value,
                        url     : this.getValue()
    
    Henning Leutz's avatar
    Henning Leutz committed
                var self      = this,
                    oldOnShow = dialogDefinition.onShow;
    
                // Get a reference to the "Link Info" tab.
    
    Henning Leutz's avatar
    Henning Leutz committed
                dialogDefinition.onShow = function () {
                    oldOnShow.bind(this)();
    
    Henning Leutz's avatar
    Henning Leutz committed
                    var UrlGroup = this.getContentElement('info', 'url')
    
                        .getElement()
    
    Henning Leutz's avatar
    Henning Leutz committed
                        .$;
    
    Henning Leutz's avatar
    Henning Leutz committed
                    if (UrlGroup.getElement('.qui-button')) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    var UrlInput = UrlGroup.getElement('input[type="text"]');
    
    Henning Leutz's avatar
    Henning Leutz committed
                    Protokoll = this.getContentElement('info', 'protocol')
    
                        .getElement()
                        .$
                        .getElement('select');
    
    
                    UrlInput.setStyles({
    
    Henning Leutz's avatar
    Henning Leutz committed
                        'float': 'left',
                        width  : UrlInput.getSize().x - 100
    
    Henning Leutz's avatar
    Henning Leutz committed
                    var Links = new Element('button', {
    
    Henning Leutz's avatar
    Henning Leutz committed
                        'class': 'qui-button',
    
    Henning Leutz's avatar
    Henning Leutz committed
                        html   : '<span class="fa fa-home"></span>',
    
    Henning Leutz's avatar
    Henning Leutz committed
                        events : {
                            click: function () {
    
                                self.openProject({
    
    Henning Leutz's avatar
    Henning Leutz committed
                                    events: {
                                        onSubmit: function (Win, data) {
                                            UrlInput.value  = data.urls[0];
    
    Henning Leutz's avatar
    Henning Leutz committed
                                            Protokoll.value = '';
    
    Henning Leutz's avatar
    Henning Leutz committed
                    }).inject(UrlInput, 'after');
    
    Henning Leutz's avatar
    Henning Leutz committed
    
                    // image button
                    new Element('button', {
    
    Henning Leutz's avatar
    Henning Leutz committed
                        'class': 'qui-button',
    
    Henning Leutz's avatar
    Henning Leutz committed
                        html   : '<span class="fa fa-picture-o"></span>',
    
    Henning Leutz's avatar
    Henning Leutz committed
                        events : {
                            click: function () {
    
    Henning Leutz's avatar
    Henning Leutz committed
                                self.openMedia({
    
    Henning Leutz's avatar
    Henning Leutz committed
                                    events: {
                                        onSubmit: function (Win, data) {
                                            UrlInput.value  = data.url;
    
    Henning Leutz's avatar
    Henning Leutz committed
                                            Protokoll.value = '';
                                        }
                                    }
                                });
                            }
                        }
    
    Henning Leutz's avatar
    Henning Leutz committed
                    }).inject(Links, 'after');
    
    Henning Leutz's avatar
    Henning Leutz committed
                };
    
                return ev;
            },
    
            /**
             * Extends the Html5Audio Dialog
             *
             * @param {DOMEvent} ev - CKEvent
             * @return {DOMEvent} ev - CKEvent
             */
            $html5AudioDialog: function (ev) {
    
                var dialogname       = ev.data.name,
                    dialogDefinition = ev.data.definition,
                    Button           = null;
    
                if (dialogname !== "html5audio") {
                    return ev;
                }
    
                var self = this;
    
                var oldOnShow = dialogDefinition.onShow || function () {
                    };
    
                dialogDefinition.onShow = function () {
                    oldOnShow.bind(this)();
    
                    var UrlGroup = this.getContentElement("info", "url").getElement().$;
    
                    if (UrlGroup.getElement('.qui-button')) {
                        return;
                    }
    
                    var UrlInput = UrlGroup.getElement('input[type="text"]');
    
    
                    Button = new Element('button', {
                        'class': 'qui-button',
                        html   : '<span class="fa fa-picture-o"></span>',
                        events : {
                            click: function () {
                                self.openMedia({
                                    events: {
                                        onSubmit: function (Win, data) {
                                            UrlInput.value = data.url;
                                        }
                                    }
                                });
                            }
                        },
                        style  : {
                            float: "left"
                        }
                    }).inject(UrlGroup);
    
    
                    var Label = UrlGroup.getElement("label");
    
                    Label.setStyles({
                        width  : "100%",
                        display: "block"
                    });
    
                    Button.getPrevious().setStyles({
                        'width': '85%',
                        float  : "left"
                    });
                };
    
                return ev;
            },
    
    
            $html5VideoDialog: function (ev) {
                var dialogname       = ev.data.name,
                    dialogDefinition = ev.data.definition,
                    Button           = null;
    
    
                if (dialogname !== "html5video") {
                    return ev;
                }
    
                var self = this;
    
                var oldOnShow = dialogDefinition.onShow || function () {
                    };
    
                dialogDefinition.onShow = function () {
                    oldOnShow.bind(this)();
    
                    var UrlGroup = this.getContentElement("info", "url").getElement().$;
    
                    if (UrlGroup.getElement('.qui-button')) {
                        return;
                    }
    
                    var UrlInput = UrlGroup.getElement('input[type="text"]');
    
    
                    Button = new Element('button', {
                        'class': 'qui-button',
                        html   : '<span class="fa fa-picture-o"></span>',
                        events : {
                            click: function () {
                                self.openMedia({
                                    events: {
                                        onSubmit: function (Win, data) {
                                            UrlInput.value = data.url;
                                        }
                                    }
                                });
                            }
                        }
                    }).inject(UrlGroup);