/* --------------------------------------------------------------
 ckeditor.js 2017-07-19
 Gambio GmbH
 http://www.gambio.de
 Copyright (c) 2017 Gambio GmbH
 Released under the GNU General Public License (Version 2)
 [http://www.gnu.org/licenses/gpl-2.0.html]
 --------------------------------------------------------------
 */

/**
 * ## CKEditor Widget
 *
 * Use this widget on a parent container to convert all the textareas with the "wysiwyg" class into
 * CKEditor instances at once.
 *
 * Official CKEditor Website: {@link http://ckeditor.com}
 *
 * ### Options
 *
 * **File Browser URL | `data-ckeditor-filebrowser-browse-url` | String | Optional**
 *
 * Provide the default URL of the file browser that is integrated within the CKEditor instance. The default
 * value points is 'includes/ckeditor/filemanager/index.html'.
 *
 * **Base URL | `data-ckeditor-base-href` | String | Optional**
 *
 * The base URL of the CKEditor instance. The default value points to the `http://shop.de/admin` directory.
 *
 * **Enter Mode | `data-ckeditor-enter-mode` | Number | Optional**
 *
 * Define the enter mode of the CKEditor instance. The default value of this option is CKEDITOR.ENTER_BR which
 * means that the editor will use the `<br>` element for every line break. For a list of possible values visit
 * this [CKEditor API reference page](http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.config.html#.enterMode).
 *
 * **Shift Enter Mode | `data-ckeditor-shift-enter-mode` | Number| Optional**
 *
 * Define the shift-enter mode of the CKEditor instance. The default value of this option is CKEDITOR.ENTER_P which
 * means that the editor will use the `<p>` element for every line break. For a list of possible values visit this
 * [CKEditor API reference page](http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.config.html#.shiftEnterMode).
 *
 * **Language Code | `data-ckeditor-language` | String | Optional**
 *
 * Provide a language code for the CKEditor instance. The default value comes from the
 * `jse.core.config.get('languageCode')` value which has the active language setting of the current page.
 *
 * ### Example
 *
 * When the page loads the textarea element will be converted into a CKEditor instance.
 *
 * ```html
 * <div data-gx-widget="ckeditor">
 *   <textarea name="my-textarea" class="wysiwyg"></textarea>
 * </div>
 * ```
 *
 * **Important: For CKEditor to work correctly the textarea elements need to have a `name` attribute.**
 *
 * @module Admin/Widgets/ckeditor
 * @requires CKEditor-Library
 */
gx.widgets.module(
    'ckeditor',

    [],

    function (data) {

        'use strict';

        // ------------------------------------------------------------------------
        // VARIABLE DEFINITION
        // ------------------------------------------------------------------------

        var
            /**
             * Widget Reference
             *
             * @type {object}
             */
            $this = $(this),

            /**
             * Default Options for Widget
             *
             * @type {object}
             */
            defaults = { // Configuration gets passed to the ckeditor.
                'filebrowserBrowseUrl': 'includes/ckeditor/filemanager/index.html',
                'baseHref': jse.core.config.get('appUrl') + '/admin',
                'enterMode': CKEDITOR.ENTER_BR,
                'shiftEnterMode': CKEDITOR.ENTER_P,
                'language': jse.core.config.get('languageCode'),
                'useRelPath': true
            },

            /**
             * Final Widget Options
             *
             * @type {object}
             */
            options = $.extend(true, {}, defaults, data),

            /**
             * Module Object
             *
             * @type {object}
             */
            module = {},

            /**
             * Editors Selector Object
             *
             * @type {object}
             */
            $editors = null;

        // ------------------------------------------------------------------------
        // INITIALIZATION
        // ------------------------------------------------------------------------

        /**
         * Initialize method of the widget, called by the engine.
         */
        module.init = function (done) {
            if (!options.useRelPath) {
                options.filebrowserBrowseUrl += '?mode=mail';
            }

            $editors = $this
                .filter('.wysiwyg')
                .add($this.find('.wysiwyg'));

            $editors
                .each(function () {
                    var $self = $(this),
                        dataset = $.extend({}, options, $self.data()), // Get textarea specific configuration.
                        name = $self.attr('name');
                    $self.removeClass('wysiwyg');
                    CKEDITOR.replace(name, dataset);
                });

            // Event handler for the update event, which is updating the ckeditor with the value
            // of the textarea.
            $this.on('ckeditor.update', function () {
                $editors
                    .each(function () {
                        var $self = $(this),
                            name = $self.attr('name'),
                            editor = (CKEDITOR) ? CKEDITOR.instances[name] : null;

                        if (editor) {
                            editor.setData($self.val());
                        }
                    });
            });

            $this.trigger('widget.initialized', 'ckeditor');

            done();
        };

        // Return data to module engine.
        return module;
    });