1(function () {
2    'use strict';
3
4    CKEDITOR.plugins.add('pastebase64', {
5        init: init
6    });
7
8    function init(editor) {
9        if (editor.addFeature) {
10            editor.addFeature({
11                allowedContent: 'img[alt,id,!src]{width,height};'
12            });
13        }
14
15        editor.on("contentDom", function () {
16            var editableElement = editor.editable ? editor.editable() : editor.document;
17            editableElement.on("paste", onPaste, null, {editor: editor});
18        });
19
20
21    }
22
23    function onPaste(event) {
24        var editor = event.listenerData && event.listenerData.editor;
25        var $event = event.data.$;
26        var clipboardData = $event.clipboardData;
27        var found = false;
28        var imageType = /^image/;
29
30        if (!clipboardData) {
31            return;
32        }
33
34        return Array.prototype.forEach.call(clipboardData.types, function (type, i) {
35            if (found) {
36                return;
37            }
38
39            if (type.match(imageType) || clipboardData.items[i].type.match(imageType)) {
40                readImageAsBase64(clipboardData.items[i], editor);
41                return found = true;
42            }
43        });
44    }
45
46    function readImageAsBase64(item, editor) {
47        if (!item || typeof item.getAsFile !== 'function') {
48            return;
49        }
50
51        var file = item.getAsFile();
52        var reader = new FileReader();
53
54        reader.onload = function (evt) {
55            var element = editor.document.createElement('img', {
56                attributes: {
57                    src: evt.target.result
58                }
59            });
60
61            // We use a timeout callback to prevent a bug where insertElement inserts at first caret
62            // position
63            setTimeout(function () {
64                editor.insertElement(element);
65            }, 10);
66        };
67
68        reader.readAsDataURL(file);
69    }
70})();
71