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

/**
 * ## Input Counter Widget
 *
 * Adds a counter element to input and textarea elements.
 *
 * ### Options:
 *
 * **Persistence | `data-input_counter-persistent` | bool | Optional**
 *
 * Omits to hide the counter element. This option is optional and the default value is true, so
 * the counter element is permanent displayed.
 *
 * **Pull | `data-input_counter-persistent` | bool/string | Optional**
 *
 * The option gives the possibility to pull the counter element to whether the right or left side.
 *
 * ### Example
 * ```html
 * <!-- Default input counter element -->
 * <input type="text" data-gx-widget="input_counter">
 * <textarea data-gx-widget="input_counter"></textarea>
 *
 * <!-- Show element on focus and hide on blur -->
 * <input type="text" data-input_counter-persistent="false">
 *
 * <!-- Disable counter pull -->
 * <input type="text" data-input_counter-pull="false">
 *
 * <!-- Pull counter to left side -->
 * <input type="text" data-input_counter-pull="left">
 * ```
 *
 * @module Admin/Widgets/input_counter
 */

gx.widgets.module(
    'input_counter',

    [],

    function (data) {
        'use strict';

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

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

            /**
             * Default Widget Options
             *
             * @type {object}
             */
            defaults = {
                persistent: true,
                pull: 'right',
                label: false
            },

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

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

            counterLabel = jse.core.lang.translate('COUNTER', 'admin_general'),

            $counter = $('<span/>');

        var _showCharCounter = function (event) {
            $this.parent().append($counter);
            if (options.max) {
                $counter.text($this.val().length + '/' + options.max);
                options.label ? $counter.append(` - ${counterLabel}`) : '';
            } else {
                $counter.text($this.val().length);
                options.label ? $counter.append(` - ${counterLabel}`) : '';
            }
        };

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

        /**
         * Initialize method of the widget, called by the engine.
         */
        module.init = function (done) {
            // check and set handling of persistent pull
            if (options.pull) {
                $counter.addClass('pull-' + options.pull);
            }

            // check and set handling of persistent option
            if (options.persistent) {
                _showCharCounter();
            } else {
                $this.focus(_showCharCounter);
                $this.blur(function () {
                    $counter.remove();
                });
            }

            $this.on('keyup', _showCharCounter);
            done();
        };

        return module;
    }
);