/*!

* froala_editor v2.3.3 (https://www.froala.com/wysiwyg-editor)
* License https://froala.com/wysiwyg-editor/terms/
* Copyright 2014-2016 Froala Labs
*/

(function (factory) {

if (typeof define === 'function' && define.amd) {
    // AMD. Register as an anonymous module.
    define(['jquery'], factory);
} else if (typeof module === 'object' && module.exports) {
    // Node/CommonJS
    module.exports = function( root, jQuery ) {
        if ( jQuery === undefined ) {
            // require('jQuery') returns a factory that requires window to
            // build a jQuery instance, we normalize how we use modules
            // that require this pattern but the window provided is a noop
            // if it's defined (how jquery works)
            if ( typeof window !== 'undefined' ) {
                jQuery = require('jquery');
            }
            else {
                jQuery = require('jquery')(root);
            }
        }
        factory(jQuery);
        return jQuery;
    };
} else {
    // Browser globals
    factory(jQuery);
}

}(function ($) {

'use strict';

// Extend defaults.
$.extend($.FE.DEFAULTS, {
  charCounterMax: -1,
  charCounterCount: true
});

$.FE.PLUGINS.charCounter = function (editor) {
  var $counter;

  /**
   * Get the char number.
   */
  function count () {
    return editor.$el.text().length;
  }

  /**
   * Check chars on typing.
   */
  function _checkCharNumber (e) {
    // Continue if infinite characters;
    if (editor.opts.charCounterMax < 0) return true;

    // Continue if enough characters.
    if (count() < editor.opts.charCounterMax) return true;

    // Stop if the key will produce a new char.
    var keyCode = e.which;
    if (!editor.keys.ctrlKey(e) && editor.keys.isCharacter(keyCode)) {
      e.preventDefault();
      e.stopPropagation();
      editor.events.trigger('charCounter.exceeded');
      return false;
    }

    return true;
  }

  /**
   * Check chars on paste.
   */
  function _checkCharNumberOnPaste (html) {
    if (editor.opts.charCounterMax < 0) return html;

    var len = $('<div>').html(html).text().length;
    if (len + count() <= editor.opts.charCounterMax) return html;

    editor.events.trigger('charCounter.exceeded');

    return '';
  }

  /**
   * Update the char counter.
   */
  function _updateCharNumber () {
    if (editor.opts.charCounterCount) {
      var chars = count() + (editor.opts.charCounterMax > 0 ?  '/' + editor.opts.charCounterMax : '');

      $counter.text(chars);

      if (editor.opts.toolbarBottom) {
        $counter.css('margin-bottom', editor.$tb.outerHeight(true))
      }

      // Scroll size correction.
      var scroll_size = editor.$wp.get(0).offsetWidth - editor.$wp.get(0).clientWidth;
      if (scroll_size >= 0) {
        if (editor.opts.direction == 'rtl') {
          $counter.css('margin-left', scroll_size);
        }
        else {
          $counter.css('margin-right', scroll_size);
        }
      }
    }
  }

  /*
   * Initialize.
   */
  function _init () {
    if (!editor.$wp) return false;

    if (!editor.opts.charCounterCount) return false;

    $counter = $('<span class="fr-counter"></span><input class="fr-color-picker" type="color">');
    $counter.css('bottom', editor.$wp.css('border-bottom-width'));
    editor.$box.append($counter);

    editor.events.on('keydown', _checkCharNumber, true);
    editor.events.on('paste.afterCleanup', _checkCharNumberOnPaste);
    editor.events.on('keyup contentChanged', function () {
      editor.events.trigger('charCounter.update');
    });

    editor.events.on('charCounter.update', _updateCharNumber);
    editor.events.trigger('charCounter.update');

    editor.events.on('destroy', function () {
      $(editor.o_win).off('resize.char' + editor.id);
      $counter.removeData().remove();
      $counter = null;
    });
  }

  return {
    _init: _init,
    count: count
  }
}

}));