Skip to content
Code-Schnipsel Gruppen Projekte
Editor.js 19,2 KiB
Newer Older
Henning Leutz's avatar
Henning Leutz committed
/**
 * ckeditor4 for QUIQQER
 *
Henning Leutz's avatar
Henning Leutz committed
 * @module URL_OPT_DIR/quiqqer/ckeditor4/bin/Editor
Henning Leutz's avatar
Henning Leutz committed
 * @author www.pcsg.de (Henning Leutz)
 *
Henning Leutz's avatar
Henning Leutz committed
 *
Henning Leutz's avatar
Henning Leutz committed
 */

Henning Leutz's avatar
Henning Leutz committed
define([
Henning Leutz's avatar
Henning Leutz committed

    'require',
Henning Leutz's avatar
Henning Leutz committed
    'controls/editors/Editor',
    'Locale',
    'css!package/quiqqer/ckeditor4/bin/Editor.css'
Henning Leutz's avatar
Henning Leutz committed

], function(require, Editor, Locale, Ajax, QUIMath)
Henning Leutz's avatar
Henning Leutz committed
{
    "use strict";

    return new Class({

        Extends : Editor,
        Type    : 'package/quiqqer/ckeditor4/bin/Editor',
Henning Leutz's avatar
Henning Leutz committed

        Binds : [
Henning Leutz's avatar
Henning Leutz committed
             '$onDestroy',
             '$onDraw',
             '$onSetContent',
             '$onGetContent',
             '$onDrop',
             '$onInstanceReadyListener'
Henning Leutz's avatar
Henning Leutz committed
        ],

        initialize : function(Manager, options)
        {
            this.parent( Manager, options );

            this.addEvents({
                onDestroy    : this.$onDestroy,
                onDraw       : this.$onDraw,
                onSetContent : this.$onSetContent,
                onGetContent : this.$onGetContent,
Henning Leutz's avatar
Henning Leutz committed
                onDrop       : this.$onDrop
Henning Leutz's avatar
Henning Leutz committed
            });
        },

        /**
         * Load the CKEditor Instance into an Textarea or DOMNode Element
         *
         * @param {DOMNode} Container
Henning Leutz's avatar
Henning Leutz committed
         * @param {controls/editor/Editor} Editor
Henning Leutz's avatar
Henning Leutz committed
         */
        loadInstance : function(Container, Editor)
        {
Henning Leutz's avatar
Henning Leutz committed
            if ( typeof window.CKEDITOR === 'undefined' ) {
Henning Leutz's avatar
Henning Leutz committed
                return;
            }

            var self     = this,
                Instance = Container;
Henning Leutz's avatar
Henning Leutz committed

Henning Leutz's avatar
Henning Leutz committed
            if ( !Container.getElement( 'textarea' ) )
            {
                var size = Container.getSize(),

                    Instance = new Element('textarea', {
                        id : this.getId(),
                        styles : {
                            height : size.y,
                            width : size.x - 20
                        }
                    }).inject( Container );
            }

Henning Leutz's avatar
Henning Leutz committed
            if ( Instance.nodeName != 'TEXTAREA' ) {
                Instance = Instance.getElement( 'textarea' );
            }

            var instance = Instance.get( 'id' );

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
            }

            Editor.setAttribute( 'instancename', instance );

            // http://docs.ckeditor.com/#!/guide/dev_howtos_dialog_windows
            window.CKEDITOR.on( 'dialogDefinition', function( ev )
            {
Henning Leutz's avatar
Henning Leutz committed
                ev = self.$imageDialog( ev );
                ev = self.$linkDialog( ev );
Henning Leutz's avatar
Henning Leutz committed
            this.getButtons(function(buttons)
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;

Henning Leutz's avatar
Henning Leutz committed
                var lines   = buttons.lines || [],
Henning Leutz's avatar
Henning Leutz committed
                    toolbar = [];

                for ( i = 0, len = lines.length; i < len; i++ )
                {
                    items     = [];
                    lineEntry = lines[ i ];

                    // groups
                    for ( g = 0, glen = lineEntry.length; g < glen; g++ )
                    {
                        group      = [];
                        groupEntry = lineEntry[ g ];

                        // buttons
                        for ( b = 0, blen = groupEntry.length; b < blen; b++ )
                        {
                            buttonEntry = groupEntry[ b ];

                            if ( buttonEntry.type == 'seperator' )
                            {
                                group.push( '-' );
                                continue;
                            }

                            group.push( buttonEntry.button );
                        }
Henning Leutz's avatar
Henning Leutz committed
                        toolbar.push( group );
                    }

                    toolbar.push( '/' );
                }

                window.CKEDITOR.replace(instance, {
Henning Leutz's avatar
Henning Leutz committed
                    language : Locale.getCurrent(),
                    baseHref : URL_DIR,
                    basePath : URL_DIR,
                    height   : Instance.getSize().y - 140,
                    width    : Instance.getSize().x + 20,
                    toolbar  : toolbar,

                    allowedContent      : true,
                    extraAllowedContent : 'div(*)[*]{*}, iframe(*)[*]{*}',

Henning Leutz's avatar
Henning Leutz committed
                    // contentsCss  : CKEDITOR_NEXGAM_CSS,
                    // bodyClass    : CKEDITOR_NEXGAM_BODY_CLASS,
Henning Leutz's avatar
Henning Leutz committed
                    // plugins      : CKEDITOR_NEXGAM_PLUGINS,
                    // templates_files : [URL_OPT_DIR +'base/bin/pcsgEditorPlugins/templates.php'],
                    baseFloatZIndex : 100
                });
Henning Leutz's avatar
Henning Leutz committed
            });
        },

        /**
         * Editor onDestroy Event
         *
         * @param {QUI.classes.Editor} Editor
         */
        $onDestroy : function(Editor)
        {
            var Instance = Editor.getInstance();

            if ( window.CKEDITOR.instances[ Instance.name ] )
            {
                try
                {
                    window.CKEDITOR.instances[ Instance.name ].destroy( true );

                } catch ( e ) {

                }

                window.CKEDITOR.instances[ Instance.name ] = null;
                delete window.CKEDITOR.instances[ Instance.name ];


                window.CKEDITOR.removeListener( 'instanceReady', this.$onInstanceReadyListener );
Henning Leutz's avatar
Henning Leutz committed
            }
        },

        /**
         * Editor onDraw Event
         * if the editor is to be drawn
         *
         * @param {DOMNode} Container
Henning Leutz's avatar
Henning Leutz committed
         * @param {controls/editors/Editor} Editor
Henning Leutz's avatar
Henning Leutz committed
         */
        $onDraw : function(Container, Editor)
        {
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 +'bin/package-ckeditor4/ckeditor.js'], function()
            {
Henning Leutz's avatar
Henning Leutz committed
                /*
                CKEDITOR.editorConfig = function( config ) {
                    config.language = 'fr';
                    config.uiColor = '#AADC6E';
                };
                */


                // CKEditor aufbauen
                // CKEDITOR_BASEPATH = URL_DIR;
                /*
                CKEDITOR_NEXGAM_TOOLBAR = [
                    { name: 'clipboard', items : [ 'Source', ,'Maximize', '-','pcsg_short', 'Templates','-', 'Paste','PasteText','PasteFromWord','-','Undo','Redo' ] },
                    { name: 'basicstyles', items : [ 'Bold','Italic', 'Underline', 'Strike','-','Subscript','Superscript','-','RemoveFormat' ] },
                    { name: 'paragraph', items : [ 'JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock','-','NumberedList','BulletedList' ] },
                    { name: 'pcsg', items : [ 'pcsg_image','-', 'pcsg_link', 'pcsg_unlink' ] },
                    { name: 'blocks', items : [ 'Format', 'pcsg_youtube' ] }
                ];

                CKEDITOR_NEXGAM_PLUGINS = '' +
                    'basicstyles,blockquote,button,clipboard,contextmenu,div,elementspath,enterkey,entities,find,' +
                    'font,format,indent,justify,keystrokes,list,liststyle,maximize,pastefromword,' +
                    'pastetext,removeformat,showblocks,showborders,sourcearea,stylescombo,' +
                    'table,tabletools,specialchar,tab,templates,toolbar,undo,wysiwygarea,wsc,pcsg_image,pcsg_link,pcsg_short,pcsg_youtube';

                CKEDITOR_NEXGAM_CSS = [
                    URL_USR_DIR +"bin/nexgam3/css/reset.css",
                    URL_USR_DIR +"bin/nexgam3/css/style.css",
                    URL_USR_DIR +"bin/nexgam3/css/wysiwyg.css",
                    URL_USR_DIR +"bin/nexgam3/css/images.css",
                    URL_USR_DIR +"bin/nexgam3/css/review.css"
                ];

                CKEDITOR_NEXGAM_BODY_CLASS = 'content left content-inner-container wysiwyg';
                */

                window.CKEDITOR.on('instanceReady', self.$onInstanceReadyListener );
Henning Leutz's avatar
Henning Leutz committed

                Editor.loadInstance( Container, Editor );
            });
        },
        $onInstanceReadyListener : function(instance)
        {
            if ( typeof instance.editor === 'undefined' ||
                 typeof instance.editor.name  === 'undefined' ||
                 instance.editor.name !== this.getAttribute( 'instancename' ) )
            {
                return;
            }
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
        /**
         * Editor onSetContent Event
         *
         * @param {String} content
Henning Leutz's avatar
Henning Leutz committed
         * @param {controls/editors/Editor} Editor
Henning Leutz's avatar
Henning Leutz committed
         */
        $onSetContent : function(content, Editor)
        {
            if ( Editor.getInstance() ) {
                Editor.getInstance().setData( content );
            }
        },

        /**
         * Editor onGetContent Event
         *
         * @param {String} content
Henning Leutz's avatar
Henning Leutz committed
         * @param {controls/editors/Editor} Editor
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
        /**
         * Set the focus to the editor
         */
        focus : function()
        {
            if ( this.getInstance() ) {
                this.getInstance().focus();
            }
        },

        /**
         * Switch to source mode
         */
        switchToSource : function()
        {
            if ( this.getInstance() ) {
                this.getInstance().setMode( 'source' );
            }
        },

        /**
         * Switch to wysiwyg editor
         */
        switchToWYSIWYG : function()
        {
            if ( this.getInstance() ) {
                this.getInstance().setMode( 'wysiwyg' );
            }
        },

        /**
         * Hide the toolbar
         */
        hideToolbar : function()
        {
            var Toolbar = this.getElm().getElement( '.cke_top' );

            if ( Toolbar ) {
                Toolbar.setStyle( 'display', 'none' );
            }
        },

        /**
         * show the toolbar
         */
        showToolbar : function()
        {
            var Toolbar = this.getElm().getElement( '.cke_top' );

            if ( Toolbar ) {
                Toolbar.setStyle( 'display', null );
            }
        },

        /**
         * Set the height of the instance
         *
         * @param {Integer} height
         */
        setHeight : function(height)
        {
            if ( this.getInstance() ) {
                this.getInstance().resize( false, height );
            }
        },

Henning Leutz's avatar
Henning Leutz committed
        /**
         *
         * @param {Object} params
         */
        $onDrop : function(params)
        {
            var Instance = this.getInstance();

            for ( var i = 0, len = params.length; i < len; i++ ) {
                Instance.insertHtml( "<img src="+ params[ i ].url +" />" );
            }
Henning Leutz's avatar
Henning Leutz committed
        },

        /**
         * edit the image dialog
         *
         * @param {CKEvent} ev
         * @return {CKEvent} ev
         */
        $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;
Henning Leutz's avatar
Henning Leutz committed

            /**
             * Image dialog
             */
            if ( dialogName != 'image' ) {
                return ev;
            }

Henning Leutz's avatar
Henning Leutz committed
            var oldOnShow = dialogDefinition.onShow;

Henning Leutz's avatar
Henning Leutz committed
            // Get a reference to the "Link Info" tab.
            dialogDefinition.onShow = function()
            {
Henning Leutz's avatar
Henning Leutz committed
                oldOnShow.bind( this )();

Henning Leutz's avatar
Henning Leutz committed
                // image button
                var UrlGroup = this.getContentElement('info', 'txtUrl' )
                                   .getElement()
                                   .$;

                var UrlInput = UrlGroup.getElement( 'input[type="text"]' );

                var HeightInput = this.getContentElement('info', 'txtHeight' )
                                      .getElement().$
                                      .getElement( 'input[type="text"]' );

                var WidthInput = this.getContentElement('info', 'txtWidth' )
                                     .getElement().$
                                     .getElement( 'input[type="text"]' );


Henning Leutz's avatar
Henning Leutz committed
                if ( !UrlGroup.getElement( '.qui-button' ) )
                {
                    var Button = new Element('button', {
                        'class' : 'qui-button',
                        html : '<span class="icon-picture"></span>',
                        events :
                        {
                            click : function()
                            {
                                self.openMedia({
                                    events :
                                    {
                                        onSubmit : function(Win, data)
                                        {
                                            UrlInput.value = data.url;

                                            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;

                                                } else
                                                {
                                                    HeightInput.value = fileData.image_height;
                                                    WidthInput.value  = fileData.image_width;
                                                }

                                            }, {
                                                project : data.project,
                                                fileid  : data.id
                                            });
Henning Leutz's avatar
Henning Leutz committed
                                        }
                                    }
                                });
                            }
                        }
                    }).inject( UrlGroup );

                    Button.getPrevious().setStyles({
                        'float' : 'left'
                    });
                }


                // link button
                var LinkGroup = this.getContentElement('Link', 'txtUrl' )
                                   .getElement()
                                   .$;


                if ( LinkGroup.getElement( '.qui-button' ) ) {
                    return;
                }

                var LinkInput = LinkGroup.getElement( 'input[type="text"]' );

                var Button = new Element('button', {
                    'class' : 'qui-button',
                    html : '<span class="icon-home"></span>',
                    events :
                    {
                        click : function()
                        {
                            self.openProject({
                                events :
                                {
                                    onSubmit : function(Win, data) {
                                        LinkInput.value = data.urls[ 0 ];
                                    }
                                }
                            });
                        }
                    }
                }).inject( LinkGroup );

                var Prev = Button.getPrevious();

                Prev.setStyles({
                    'float' : 'left',
                    width : Prev.getSize().x - 100
                });
            }

            return ev;
        },

        /**
         * edit the link dialog
         *
         * @param {CKEvent} ev
         * @return {CKEvent} ev
         */
        $linkDialog : function(ev)
        {
            // Take the dialog name and its definition from the event data.
            var self             = this,
                dialogName       = ev.data.name,
                dialogDefinition = ev.data.definition;

            /**
             * Link dialog
Henning Leutz's avatar
Henning Leutz committed
             */
            if ( dialogName != 'link' ) {
                return ev;
            }

            // 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;

            var Url       = dialogDefinition.getContents( 'info' ).get( 'url' ),
                orgCommit = Url.commit;

            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 oldOnShow = dialogDefinition.onShow;

Henning Leutz's avatar
Henning Leutz committed
            // Get a reference to the "Link Info" tab.
            dialogDefinition.onShow = function()
            {
Henning Leutz's avatar
Henning Leutz committed
                oldOnShow.bind( this )();

Henning Leutz's avatar
Henning Leutz committed
                var UrlGroup = this.getContentElement('info', 'url' )
                                   .getElement()
                                   .$;

                if ( UrlGroup.getElement( '.qui-button' ) ) {
                    return;
                }

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')
Henning Leutz's avatar
Henning Leutz committed

                UrlInput.setStyles({
                    'float' : 'left',
                    width   : UrlInput.getSize().x - 50
                });

                var Button = new Element('button', {
                    'class' : 'qui-button',
Henning Leutz's avatar
Henning Leutz committed
                    html    : '<span class="icon-home"></span>',
                    events  :
Henning Leutz's avatar
Henning Leutz committed
                    {
                        click : function()
                        {
                            self.openProject({
                                events :
                                {
Henning Leutz's avatar
Henning Leutz committed
                                    onSubmit : function(Win, data)
                                    {
                                        UrlInput.value  = data.urls[ 0 ];
                                        Protokoll.value = '';
Henning Leutz's avatar
Henning Leutz committed
                                    }
                                }
                            });
                        }
                    }
                }).inject( UrlInput, 'after' );
            }

            return ev;
Henning Leutz's avatar
Henning Leutz committed
        }
    });