Gertykhon / Joyreactor Add Image From Clipboard

// ==UserScript==
// @name         Joyreactor Add Image From Clipboard
// @namespace    http://tampermonkey.net/
// @version      0.2.1
// @description  Позволяет вставить из буфера обмена/перетащить из проводника картинку в поле ввода комментария
// @author       Gertykhon
// @include      *reactor.cc*
// @include      *joyreactor.cc*
// @include      *jr-proxy.com*
// @grant        none
// @license MIT
// ==/UserScript==

(function () {
  'use strict';

  /*
   * Leoric(@joyreactor.cc)
   *
   * v0.2
   * добавлено перетаскивание файлов изображений из проводника
   */

  function start() {
    for (var elem of document.getElementsByClassName('toggleComments')) {
      elem.onclick = function (btnComClick) {
        setTimeout(function () {
          var ufoot = btnComClick.target.parentNode.parentNode.parentNode;
          addImgPaste(ufoot);
          addRespImgPaste(ufoot);
        }, 1000);
      };
    }
    addRespImgPaste(document);
    addImgPaste(document);
  }

  function addRespImgPaste(parent) {
    for (var elem of parent.querySelectorAll('a[class="response"]')) {
      elem.onclick = function (btnRespClick) {
        setTimeout(function () {
          var respDiv = btnRespClick.target.parentNode.parentNode.nextElementSibling;
          if (respDiv.getElementsByTagName('img')[0]) {
            respDiv.getElementsByTagName('img')[0].remove();
            respDiv.querySelector('form[class="post_comment_form"]').querySelector('span').innerHTML +=
              '<input type="file" accept="image/*" name="comment_picture" class="comment_picture" value="" style="display:none">';
          }
          addImgPaste(respDiv);
        }, 1000);
      };
    }
  }

  //добавляем полю ввода комента обработчики вставки и перетаскивания
  function addImgPaste(parent) {
    try {
      var form = parent.querySelector('form[class="post_comment_form"]');
      if (form === null) return;
      var txt = form.querySelector('textarea[class="comment_text"]');
      txt.ondrop = function (event) {
        dropAndPasteHandler(event);
      };
      txt.ondragover = function (event) {
        event.preventDefault();
      };
      txt.onpaste = function (event) {
        dropAndPasteHandler(event);
      };
    }
    catch (err) {
      console.log(err);
    }
  }

  function dropAndPasteHandler(event) {
    var imageBlob, items;
    //достаем картинку
    try {
      if (event.type == 'drop') {
        event.preventDefault();
        items = event.dataTransfer.items;
      }
      else if (event.type == 'paste') {
        items = event.clipboardData.items;
      }
    }
    catch (err) {
      console.log(err);
    }
    if (items) {
      for (var i = 0; i < items.length; i++) {
        if (items[i].type.indexOf("image") != -1) imageBlob = items[i].getAsFile();
      }
    }
    else {
      return;
    }
    if (!imageBlob) return;
    //добавляем предпросмотр
    var form = event.target.parentNode;
    var img = form.getElementsByTagName('img')[0];
    if (img === undefined) {
      img = document.createElement('img');
      img.title = 'Preview';
      img.width = 100;
      form.appendChild(img);
    }
    var URLObj = window.URL || window.webkitURL;
    img.src = URLObj.createObjectURL(imageBlob);
    //заменяем стандартную отправку формы своей
    try {
      form.getElementsByClassName('comment_picture')[0].remove();
    }
    catch (err) {}
    form.onsubmit = function (submit) {
      submit.stopPropagation();
      submit.preventDefault();
      uploadForm(submit.target, imageBlob);
      return false;
    };

  }

  //отправка комента
  function uploadForm(form, blob) {
    var xhr = new XMLHttpRequest();
    xhr.open('POST', '/post_comment/create', true);
    var formData = new FormData(form);
    formData.append('comment_picture', blob, 'image.jpg');
    xhr.onload = function (e) {
      //кусок скрипта с сайта, обновляющий коменты
      var f = $(form).closest(".ufoot").find(
          ".post_comment_list"),
        g = $(form).closest(".postContainer").attr("id").substr(13);
      $.ajax({
        url: "/post/comments/" + g,
        cache: !1,
        success: function (a) {
          f.html(a).show("fast").trigger("DOMUpdate");
          window["commentTime" + g] = Math.round((new Date).getTime() / 1E3);
        }
      })
    };
    xhr.send(formData);
  }

  start();
  document.body.addEventListener('DOMSubtreeModified', function () {
    start();
  }, false);
})();