Ticket #4210: 4210.patch

File 4210.patch, 6.8 KB (added by Tobiasz Cudnik, 11 years ago)
  • _source/plugins/jquery/plugin.js

     
     1/*
     2Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
     3For licensing, see LICENSE.html or http://ckeditor.com/license
     4*/
     5
     6/**
     7 * @fileOverview jQuery plugin provides easy use of basic CKEditor functions
     8 *   and access to internal API. It also integrates some aspects of CKEditor with
     9 *   jQuery framework.
     10 */
     11
     12(function()
     13{
     14        CKEDITOR.plugins.add( 'jquery',
     15        {
     16                load : function()
     17                {
     18                        if ( !this.onLoad._called )
     19                        {
     20                                this.onLoad();
     21                                this.onLoad._called = 1;
     22                        }
     23                },
     24                onLoad : function()
     25                {
     26                        if ( typeof jQuery == 'undefined' )
     27                                return console.log('no jQuery');
     28                       
     29                        // jQuery namespace methods.
     30                        jQuery.extend( jQuery,
     31                        {
     32                                ckeditorConfig: function( myConfig )
     33                                {
     34                                        jQuery.extend( CKEDITOR.config, myConfig );
     35                                }
     36                        });
     37                       
     38                        // jQuery object methods.
     39                        jQuery.extend( jQuery.fn,
     40                        {
     41                                ckeditorGet: function()
     42                                {
     43                                        var instance = this.eq( 0 ).data( 'ckeditorInstance' );
     44                                        if ( !instance )
     45                                                throw "CKEditor not yet initialized, use ckeditor() with callback.";
     46                                        return instance;
     47                                },
     48                                /**
     49                                 *
     50                                 *
     51                                 * Mixed parameter order allowed.
     52                                 *
     53                                 * @param callback Function to be run on editor instance. Passed parameters: [ textarea ].
     54                                 * Callback is fiered in "this" scope being ckeditor instance and having source textarea as first param.
     55                                 *
     56                                 * @param config Configuration options for new instance(s) if not already created.
     57                                 * See URL
     58                                 *
     59                                 * @example
     60                                 * $( 'textarea' ).ckeditor( function( textarea ) {
     61                                 *   $( textarea ).val( this.getData() )
     62                                 * });
     63                                 */
     64                                ckeditor: function( callback, config )
     65                                {
     66                                        if ( !jQuery.isFunction( callback ))
     67                                        {
     68                                                var tmp = config;
     69                                                config = callback;
     70                                                callback = tmp;
     71                                        }
     72                                        this.each( function()
     73                                        {
     74                                                var $element = jQuery( this ),
     75                                                        instance = $element.data( 'ckeditorInstance' ),
     76                                                        element = this;
     77
     78                                                // TODO filter elements ?
     79
     80                                                if ( instance )
     81                                                {
     82                                                        if ( callback )
     83                                                                callback.apply( instance, [ this ] );
     84                                                }
     85                                                else
     86                                                {
     87                                                        // CREATE NEW INSTANCE
     88                                                        // Register callback.
     89                                                        CKEDITOR.on( 'instanceReady', function( event )
     90                                                        {
     91
     92                                                                var editor = event.editor;
     93                                                                setTimeout( function()
     94                                                                {
     95                                                                        // Delay bit more if editor is still not ready.
     96                                                                        if ( !editor.element )
     97                                                                                return setTimeout( arguments.callee, 100 );
     98
     99                                                                        if ( editor.element.$ == element )
     100                                                                        {
     101                                                                                // Remove this listener.
     102                                                                                event.removeListener( 'instanceReady', this.callee );
     103
     104                                                                                // Remove lock.
     105                                                                                $element.data( '_ckeditorInstanceLock', null );
     106
     107                                                                                // Forward setData and getData events.
     108                                                                                jQuery.each( [ 'setData', 'getData' ], function( i, name )
     109                                                                                {
     110
     111                                                                                        editor.on( name, function( event ) {
     112
     113                                                                                                $element.trigger( name + '.ckeditor', [ editor, event.data.dataValue ] );
     114                                                                                        });
     115                                                                                });
     116
     117                                                                                // Forward destroy event.
     118                                                                                editor.on( 'destroy', function( event ) {
     119                                                                                        $element.trigger( 'destroy.ckeditor', [ editor ] );
     120                                                                                });
     121
     122                                                                                // Integrate with form submit.
     123                                                                                if ( editor.config.jquerySyncTextareaOnSubmit && $element.is( 'textarea' ) && $element.parents( 'form' ).length )
     124                                                                                {
     125                                                                                        var onSubmit = function()
     126                                                                                        {
     127
     128                                                                                                $element.ckeditor( function()
     129                                                                                                {
     130
     131        //                                                                                              $textarea.val( this.getData(), true );
     132                                                                                                        editor.updateElement();
     133                                                                                                });
     134                                                                                        };
     135
     136                                                                                        // Bind to submit event.
     137                                                                                        $element.parents( 'form' ).submit( onSubmit );
     138                                                                                       
     139                                                                                        // Unbind when editor destroyed.
     140                                                                                        $element.bind( 'destroy.ckeditor', function() {
     141                                                                                                        $element.parents( 'form' ).unbind( 'submit', onSubmit );
     142                                                                                                });
     143                                                                                }
     144                                                                                // Fire instanceReady event.
     145                                                                                $element.trigger( 'instanceReady.ckeditor', [ editor ] );
     146
     147                                                                                // Run given code.
     148                                                                                if ( callback )
     149                                                                                        callback.apply( editor, [ element ] );
     150                                                                        }
     151                                                                });
     152                                                        }, null, null, 9999);
     153                                                       
     154                                                        // Trigger instance creation.
     155                                                        if ( !$element.data( '_ckeditorInstanceLock' ) )
     156                                                        {
     157                                                                $element
     158                                                                        .data( '_ckeditorInstanceLock', true )
     159                                                                        .data( 'ckeditorInstance', CKEDITOR.replace( element, config ) );
     160
     161                                                        }
     162                                                }
     163                                        });
     164                                        return this;
     165                                }
     166                        });
     167
     168                        // New val() method for objects.
     169                        if ( CKEDITOR.config.jqueryOverrideVal )
     170                        {
     171                                jQuery.fn.val = CKEDITOR.tools.override( jQuery.fn.val, function( oldValMethod )
     172                                {
     173                                        return function( newValue, forceNative )
     174                                        {
     175                                                var isSetter = typeof newValue != 'undefined',
     176                                                        result;
     177
     178                                                this.each( function()
     179                                                {
     180
     181                                                        var $this = jQuery( this ),
     182                                                                editor = $this.data( 'ckeditorInstance' );
     183
     184                                                        if ( !forceNative && $this.is( 'textarea' ) && editor )
     185                                                        {
     186                                                                if ( isSetter )
     187                                                                        editor.setData( newValue );
     188                                                                else
     189                                                                {
     190                                                                        result = editor.getData();
     191
     192                                                                        // break;
     193                                                                        return null;
     194                                                                }
     195                                                        }
     196                                                        else
     197                                                        {
     198
     199                                                                if ( isSetter )
     200                                                                        oldValMethod.call( $this, newValue );
     201                                                                else
     202                                                                {
     203                                                                        result = oldValMethod.call( $this );
     204
     205                                                                        // break;
     206                                                                        return null;
     207                                                                }
     208
     209                                                        }
     210                                                });
     211                                                return isSetter ? this : result;
     212                                        };
     213                                });
     214                        }
     215                }
     216        });
     217})();
     218
     219/**
     220 * Synchronizes textarea content on submit.
     221 *
     222 * Works with AJAX forms only if CKEditor is created before calling
     223 * .ajaxForm() function on form element.
     224 *
     225 * @type Boolean
     226 * @example
     227 * $( 'form' )
     228 *   .find( 'textarea' ).ckeditor().end()
     229 *   .ajaxForm();
     230 */
     231CKEDITOR.config.jquerySyncTextareaOnSubmit = false;
     232
     233/**
     234 * Allow CKEditor to override jQuery.fn.val(). This results in ability to use val()
     235 * function on textareas as usual and having those calls synchronized with CKEditor
     236 * Rich Text Editor component.
     237 *
     238 * This config option is global and executed during plugin load. Can't be customized accross
     239 * editor instances.
     240 *
     241 * @type Boolean
     242 * @example
     243 * $( 'textarea' ).ckeditor();
     244 * // ...
     245 * $( 'textarea' ).val( 'New editor content' );
     246 */
     247CKEDITOR.config.jqueryOverrideVal = true;
© 2003 – 2020 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy