/*!

* 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, {
  quickInsertButtons: ['image', 'table', 'ul', 'ol', 'hr'],
  quickInsertTags: ['p', 'div', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'pre', 'blockquote']
});

$.FE.QUICK_INSERT_BUTTONS = {
  image: {
    icon: 'insertImage',
    callback: function () {
      var editor = this;

      if (!editor.shared.$qi_image_input) {
        editor.shared.$qi_image_input = $('<input accept="image/*" name="quickInsertImage' + this.id + '" style="display: none;" type="file">');
        $('body').append(editor.shared.$qi_image_input);

        editor.events.$on(editor.shared.$qi_image_input, 'change', function () {
          var inst = $(this).data('inst');
          if (this.files) {
            inst.quickInsert.hide();

            inst.image.upload(this.files);
          }

          // Chrome fix.
          $(this).val('');
        }, true);
      }

      editor.$qi_image_input = editor.shared.$qi_image_input;

      if (editor.helpers.isMobile()) editor.selection.save();
      editor.$qi_image_input.data('inst', editor).trigger('click');
    },
    requiredPlugin: 'image',
    title: 'Insert Image'
  },
  table: {
    icon: 'insertTable',
    callback: function () {
      this.quickInsert.hide();
      this.table.insert(2, 2);
      this.undo.saveStep();
    },
    requiredPlugin: 'table',
    title: 'Insert Table'
  },
  ol: {
    icon: 'formatOL',
    callback: function () {
      this.quickInsert.hide();
      this.lists.format('OL');
      this.undo.saveStep();
    },
    requiredPlugin: 'lists',
    title: 'Ordered List'
  },
  ul: {
    icon: 'formatUL',
    callback: function () {
      this.quickInsert.hide();
      this.lists.format('UL');
      this.undo.saveStep();
    },
    requiredPlugin: 'lists',
    title: 'Unordered List'
  },
  hr: {
    icon: 'insertHR',
    callback: function () {
      this.quickInsert.hide();
      this.commands.insertHR();
      this.undo.saveStep();
    },
    title: 'Insert Horizontal Line'
  }
}

$.FE.RegisterQuickInsertCommand = function (name, data) {
  $.FE.QUICK_INSERT_BUTTONS[name] = data;
}

$.FE.PLUGINS.quickInsert = function (editor) {
  var $quick_insert;

  /*
   * Show quick insert.
   * Compute top, left, width and show the quick insert.
   */
  function _show ($tag) {
    if (!$quick_insert) _initquickInsert();

    editor.$box.append($quick_insert);

    // Quick insert's possition.
    var qiTop;
    var qiLeft;

    qiTop = $tag.offset().top - editor.$box.offset().top - ($quick_insert.outerHeight() - $tag.outerHeight()) / 2;
    qiLeft = 0 - $quick_insert.outerWidth();

    if (editor.opts.iframe) {
      qiTop += editor.$iframe.offset().top - $(editor.o_win).scrollTop();
    }

    // Set quick insert's top and left.
    $quick_insert.css('top', qiTop);
    $quick_insert.css('left', qiLeft);

    $quick_insert.data('tag', $tag);

    // Show the quick insert.
    $quick_insert.addClass('fr-visible');
  }

  /*
   * Check the tag where the cursor is.
   */
  function _checkTag () {
    var tag = editor.selection.element();

    // Get block tag.
    if (!editor.node.isBlock(tag)) {
      tag = editor.node.blockParent(tag);
    }

    // Tag must be empty and direct child of element in order to show the quick insert.
    if (tag && editor.node.isEmpty(tag) && editor.node.isElement(tag.parentNode)) {
      // If tag is block and selection is collapsed.
      if (tag && editor.selection.isCollapsed()) {
        _show($(tag));
      }
    }

    // Quick insert should not be visible.
    else {
      hide();
    }
  }

  /*
   * Hide quick insert.
   */
  function hide () {
    if ($quick_insert) {
      editor.html.checkIfEmpty();

      // Hide the quick insert helper if visible.
      if ($quick_insert.hasClass('fr-on')) {
        _hideHelper();
      }

      // Hide the quick insert.
      $quick_insert.removeClass('fr-visible fr-on');
      $quick_insert.css('left', -9999).css('top', -9999);
    }
  }

  /*
   * Show the quick insert helper.
   */
  var $helper;
  function _showQIHelper (e) {
    e.preventDefault();

    // Hide helper.
    if ($quick_insert.hasClass('fr-on')) {
      _hideHelper();
    }

    else {
      if (!editor.shared.$qi_helper) {
        var btns = editor.opts.quickInsertButtons;
        var btns_html = '<div class="fr-qi-helper">';
        var idx = 0;

        for (var i = 0; i < btns.length; i++) {
          var info = $.FE.QUICK_INSERT_BUTTONS[btns[i]];
          if (info) {
            if (!info.requiredPlugin || ($.FE.PLUGINS[info.requiredPlugin] && editor.opts.pluginsEnabled.indexOf(info.requiredPlugin) >= 0)) {
              btns_html += '<a class="fr-btn fr-floating-btn" role="button" title="' + editor.language.translate(info.title) + '" tabindex="-1" data-cmd="' + btns[i] + '" style="transition-delay: ' + (0.025 * (idx++)) + 's;">' + editor.icon.create(info.icon) + '</a>';
            }
          }
        }

        btns_html += '</div>';
        editor.shared.$qi_helper = $(btns_html);

        // Quick insert helper tooltip.
        editor.tooltip.bind(editor.shared.$qi_helper, '.fr-qi-helper > a.fr-btn');
      }

      $helper = editor.shared.$qi_helper;
      $helper.appendTo(editor.$box);

      // Show the quick insert helper.
      setTimeout(function () {
        $helper.css('top', parseFloat($quick_insert.css('top')));
        $helper.css('left', parseFloat($quick_insert.css('left')) + $quick_insert.outerWidth());
        $helper.find('a').addClass('fr-size-1')
        $quick_insert.addClass('fr-on');
      }, 10);
    }
  }

  /*
   * Hides the quick insert helper and places the cursor.
   */
  function _hideHelper () {
    var $helper = editor.$box.find('.fr-qi-helper');

    if ($helper.length) {
      $helper.find('a').removeClass('fr-size-1');
      $helper.css('left', -9999);
      $quick_insert.removeClass('fr-on');
    }
  }

  /*
   * Initialize the quick insert.
   */
  function _initquickInsert () {
    if (!editor.shared.$quick_insert) {
      // Append quick insert HTML to editor wrapper.
      editor.shared.$quick_insert = $('<div class="fr-quick-insert"><a class="fr-floating-btn" role="button" tabindex="-1" title="' + editor.language.translate('Quick Insert') + '"><svg viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"><path d="M22,16.75 L16.75,16.75 L16.75,22 L15.25,22.000 L15.25,16.75 L10,16.75 L10,15.25 L15.25,15.25 L15.25,10 L16.75,10 L16.75,15.25 L22,15.25 L22,16.75 Z"/></svg></a></div>');
    }
    $quick_insert = editor.shared.$quick_insert;

    // Quick Insert tooltip.
    editor.tooltip.bind(editor.$box, '.fr-quick-insert > a.fr-floating-btn');

    // Editor destroy.
    editor.events.on('destroy', function () {
      $quick_insert.removeClass('fr-on').appendTo($('body')).css('left', -9999).css('top', -9999);

      if ($helper) {
        _hideHelper();
        $helper.appendTo($('body'));
      }
    }, true);

    editor.events.on('shared.destroy', function () {
      $quick_insert.html('').removeData().remove();
      $quick_insert = null;

      if ($helper) {
        $helper.html('').removeData().remove();
        $helper = null;
      }
    }, true);

    // Hide before a command is executed.
    editor.events.on('commands.before', hide);

    // Check if the quick insert should be shown after a command has been executed.
    editor.events.on('commands.after', function () {
      if (!editor.popups.areVisible()) {
        _checkTag();
      }
    });

    // User clicks on the quick insert.
    editor.events.bindClick(editor.$box, '.fr-quick-insert > a', _showQIHelper);

    // User clicks on a button from the quick insert helper.
    editor.events.bindClick(editor.$box, '.fr-qi-helper > a.fr-btn', function (e) {
      var cmd = $(e.currentTarget).data('cmd');

      $.FE.QUICK_INSERT_BUTTONS[cmd].callback.apply(editor, [e.currentTarget]);
    });
  }

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

    if (editor.opts.iframe) {
      editor.$el.parent('html').find('head').append('<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.4.0/css/font-awesome.min.css">');
    }

    // Hide the quick insert if user click on an image.
    editor.popups.onShow('image.edit', hide);

    // Check tag where cursor is to see if the quick insert needs to be shown.
    editor.events.on('mouseup', _checkTag);

    if (editor.helpers.isMobile()) {
      editor.events.$on($(editor.o_doc), 'selectionchange', _checkTag);
    }

    // Hide the quick insert when editor loses focus.
    editor.events.on('blur', hide);

    // Check if the quick insert should be shown after a key was pressed.
    editor.events.on('keyup', _checkTag);
  }

  return {
    _init: _init,
    hide: hide
  }
};

}));