(function() {
  "use strict";

  CKEDITOR.plugins.add("pastebase64", {
    init: init
  });

  function init(editor) {
    if (editor.addFeature) {
      editor.addFeature({
        allowedContent: "img[alt,id,!src]{width,height};"
      });
    }

    editor.on("contentDom", function() {
      var editableElement = editor.editable
        ? editor.editable()
        : editor.document;
      editableElement.on("paste", onPaste, null, { editor: editor });
    });
  }

  function onPaste(event) {
    var editor = event.listenerData && event.listenerData.editor;
    var $event = event.data.$;
    var clipboardData = $event.clipboardData;
    var found = false;
    var imageType = /^image/;

    if (!clipboardData) {
      return;
    }

    return Array.prototype.forEach.call(clipboardData.types, function(type, i) {
      if (found) {
        return;
      }

      if (
        type.match(imageType) ||
        clipboardData.items[i].type.match(imageType)
      ) {
        readImageAsBase64(clipboardData.items[i], editor);
        return (found = true);
      }
    });
  }

  function readImageAsBase64(item, editor) {
    if (!item || typeof item.getAsFile !== "function") {
      return;
    }

    var file = item.getAsFile();
    var reader = new FileReader();

    reader.onload = function(evt) {
      var element = editor.document.createElement("img", {
        attributes: {
          src: evt.target.result
        }
      });

      // We use a timeout callback to prevent a bug where insertElement inserts at first caret
      // position
      setTimeout(function() {
        editor.insertElement(element);
        editor.setData(editor.getData());
      }, 10);
    };

    reader.readAsDataURL(file);
  }
})();