Title: imgur script (DEPRECIATED) Author: Anonymous Pastebin link: http://pastebin.com/D2Xcm2GB First Edit: Monday 16th of June 2014 10:27:42 PM CDT Last Edit: Monday 16th of June 2014 10:27:42 PM CDT // ==UserScript== // @name        4chan imgur thumbnail (fix) // @version     1.1 // @namespace   b4k // @description Scans for 4chan posts that contain a specific link but no file and embeds an image as a thumbnail. Supports Imgur, 4chan, YouTube, Derpibooru and Vocaroo links as well as direct image links (jpg, png, gif). // @include     http*://boards.4chan.org/* // @grant       GM_xmlhttpRequest // @updateURL   http://dl.dropboxusercontent.com/u/9715811/4chanimgur.user.js // @downloadURL http://dl.dropboxusercontent.com/u/9715811/4chanimgur.user.js // ==/UserScript==   (function() {                 var namespace = '4chanimgur.';         var version = '0.9.1';         var home = 'https://userscripts.org/scripts/show/161995';         var d = document;                 var $ = function(selector, context, forceArray) {                 if ($.null(context)) {                         context = d.body;                 }                 if ($.null(context.querySelectorAll)) return null;                 var nodes = context.querySelectorAll(selector);                 if (!forceArray) {                         if (nodes.length == 1) {                                 return nodes[0];                         } else if (nodes.length == 0) {                                 return null;                         }                 }                 return nodes;         };                 $.extend = function(object, properties) {                 var key, val;                 for (key in properties) {                         val = properties[key];                         object[key] = val;                 }         };                 $.extend($, {                 null: function(value) {                         return (value === undefined || value === null);                 },                 notnull: function(value) {                         return !$.null(value);                 },                 json: function(url, data, callback) {                         if (typeof GM_xmlhttpRequest != 'function') {                                 return false;                         }                         GM_xmlhttpRequest({                                 method: 'GET',                                 url:    url,                                 onload: function(req) {                                         try {                                                 var info = JSON.parse(req.responseText);                                                 callback.call(self, data, info);                                         } catch(ex) {                                                 console.log('JSON data from ' + url + ' could not be parsed: ' + ex + '\nHTTP: ' + req.status + '\nResponse: ' + req.responseText);                                         }                                 },                                 onerror: function() {                                         console.log('Request to ' + url + ' failed.');                                 }                         });                 },                 on: function(elem, events, handler) {                         var arr = events.split(' ');                         for (var i = 0, c = arr.length; i < c; i++) {                                 elem.addEventListener(arr[i], handler, false);                         }                 },                 off: function(elem, events, handler) {                         var arr = events.split(' ');                         for (var i = 0, c = arr.length; i < c; i++) {                                 elem.removeEventListener(arr[i], handler, false);                         }                 },                 sibling: function(n, elem) {                         var r = [];                         for ( ; n; n = n.nextSibling ) {                                 if (n.nodeType === 1 && n !== elem) {                                         r.push(n);                                 }                         }                         return r;                 },                 siblings: function(elem) {                         return this.sibling((elem.parentNode || {}).firstChild, elem);                 },                 each: function(list, callback) {                         if ($.null(list)) return;                         for (var i = 0, c = list.length; i < c; i++) {                                 if (callback.call(list[i], list[i], i) === false) {                                         break;                                 }                         }                 },                 attr: function(elem, attr, value) {                         if (!elem.getAttribute) return '';                         if (!value) {                                 return elem.getAttribute(attr);                         } else {                                 return elem.setAttribute(attr, value);                         }                 },                 data: function(elem, key, value) {                         if (!elem.getAttribute) return '';                         if ($.null(value)) {                                 return elem.getAttribute('data-' + key);                         } else {                                 return elem.setAttribute('data-' + key, value);                         }                 },                 strip: function(elem) {                         if (elem.innerHTML) {                                 return elem.innerHTML.replace(//g, '').replace(/&/g, '&').replace(/
/g, ' ');                         }                         return '';                 },                 nodes: function(nodes) {                         var frag, node, _i, _len;                         if (!(nodes instanceof Array)) {                                 return nodes;                         }                         frag = d.createDocumentFragment();                         for (_i = 0, _len = nodes.length; _i < _len; _i++) {                                 node = nodes[_i];                                 frag.appendChild(node);                         }                         return frag;                 },                 append: function(parent, elem) {                         return parent.appendChild($.nodes(elem));                 },                 prepend: function(parent, children) {                         return parent.insertBefore($.nodes(children), parent.firstChild);                 },                 after: function(root, elem) {                         return root.parentNode.insertBefore($.nodes(elem), root.nextSibling);                 },                 before: function(root, elem) {                         return root.parentNode.insertBefore($.nodes(elem), root);                 },                 remove: function(elem) {                         return elem.parentNode.removeChild($.nodes(elem));                 },                 replace: function(root, elem) {                         return root.parentNode.replaceChild($.nodes(elem), root);                 },                 create: function(tag, properties) {                         var elem = d.createElement(tag);                         if (properties) {                                 $.extend(elem, properties);                         }                         return elem;                 },                 tn: function(text) {                         return d.createTextNode(text);                 },                 id: function(id) {                         return d.getElementById(id);                 },                 hasClass: function(elem, className) {                         return (' ' + elem.className + ' ').replace(/[\n\t]/g, ' ').indexOf(className) > -1;                 },                 addClass: function(elem, className) {                         return elem.classList.add(className);                 },                 rmClass: function(elem, className) {                         return elem.classList.remove(className);                 },                 addStyle: function(css) {                         var style = $.create('style', {                                 type: 'text/css',                                 textContent: css                         });                         var f = function() {                                 var root;                                 if (root = d.head || d.documentElement) {                                         return $.append(root, style);                                 } else {                                         return setTimeout(f, 20);                                 }                         };                         f();                         return style;                 },                 inArray: function(arr, obj) {                         return arr.indexOf(obj) > -1;                 },         });                 var Hover = {                 limit: 20,                 elapsed: function() {                         var now = Date.now();                         if (!Hover.lastTimestamp || now - Hover.lastTimestamp >= Hover.limit) {                                 Hover.lastTimestamp = now;                                 return true;                         }                         return false;                 },                 image: {                         set: function(img) {                                 var img = $('#imgur-thumbnail-hover');                                 if ($.null(img)) {                                         img = $.create('img', { id: 'imgur-thumbnail-hover' });                                         $.append(d.body, img);                                 }                                 img.style.display = 'block';                                 img.src = $.data(this, 'image-url');                         },                         update: function(e) {                                 if (!Hover.elapsed()) return;                                 var img = $('#imgur-thumbnail-hover');                                 if ($.notnull(img)) {                                         var style = img.style;                                         var clientX, clientY, top, height;                                         height = img.offsetHeight;                                         clientX = e.clientX, clientY = e.clientY;                                         _ref = d.documentElement, clientHeight = _ref.clientHeight, clientWidth = _ref.clientWidth;                                         top = clientY - 120;                                         style.top = clientHeight <= height || top <= 0 ? '0px' : top + height >= clientHeight ? clientHeight - height + 'px' : top + 'px';                                         if (clientX <= clientWidth - 400) {                                                 style.left = clientX + 45 + 'px';                                                 style.right = null;                                         } else {                                                 style.left = null;                                                 style.right = clientWidth - clientX + 45 + 'px';                                         }                                 }                         },                         hide: function() {                                 var img = $('#imgur-thumbnail-hover');                                 if ($.notnull(img)) {                                         img.style.display = 'none';                                         img.src = '';                                 }                         },                 },                 init: function(img) {                         var processor = $.data(img, 'processor');                         if (Config.get([processor, 'hoverExpand'], Options.processors[processor]['hoverExpand'][0]) === true) {                                 $.on(img, 'mouseover', Hover.image.set);                                 $.on(img, 'mousemove', Hover.image.update);                                 $.on(img, 'mouseout', Hover.image.hide);                         }                 },                 suspend: function(img) {                         $.off(img, 'mouseover', Hover.image.set);                         $.off(img, 'mousemove', Hover.image.update);                         $.off(img, 'mouseout', Hover.image.hide);                         Hover.image.hide();                 },         };                 var Resources = {                 placeholderThumb: 'data:image/png;base64,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',                 loadingThumb: 'data:image/gif;base64,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',                 errorThumb: 'data:image/png;base64,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',                 externalImage: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAahJREFUeNpUks9LFVEUxz933sy8nok/HolGpGIgIghCO3XpJty4ENwUImTLaCEh7foDFNqJiJBb2whi6FoUJAoR1FoomlhI8ohX+qZ5b27fmWcNXvie++t8zz3ne67h2TaQFzoEI/DQGNat1apCOuIrh4IbW7i4PmmHyPF9l/z8OHQ2Q/matPcNJhbx3Oo2I/wQAvFatoKg4d30mhl5/wJa6qoet7MyljAmjBFGWaxecH6CdxlR7vGKJZ/fQZrRVVidXbHmultr/PpchlLZ8unzXbrbfVYVvU2lfS3ISVnXZv8RIvvr7XhbvudeLaOzULrPf+dTOQ9OQ9aHV4+UeAaT1HBL9vUKLG/B/kwaeegNfDkJV3C90pMFRqLqY4qq/J4OQJdEmlyCnVNFFnH3UDXldpdwC6NSq19SDyaEQNJ13IG1STiQfL1T8KBJDek6k65/ajDfI4zdlOt2Qsh5yURrI2y8hKlh1fEcGnJSrhJLXhSOEl1d9cv7eHJJWLEJydf94z74cAznxSjuq5P2KVbJMecTi8ch1t78BvHW0cJzrtLmXvBXgAEAaJaDi8YtYjEAAAAASUVORK5CYII=',         };                         var Thumb = function(props) {                 var self = this;                                 $.extend(self, props);                                                 self.buildFile = function(fileId) {                         var container = $.create('div', { id: fileId, className: 'file imgur-container' });                         var div = $.create('div', { className: 'fileInfo' });                         var span = $.create('span', { className: 'fileText', innerHTML: 'Link: ' });                         var fia = $.create('a', { target: '_BLANK', href: self.link, innerHTML: self.name + ' ' });                         var extImg = $.create('img', { src: Resources.externalImage });                         var fa = $.create('a', { target: '_BLANK', href: self.link, className: 'fileThumb' });                         var img = $.create('img', { className: 'imgur-image thumb' });                         $.data(img, 'processor', self.processor);                         $.data(img, 'thumb-url', self.thumbUrl);                         $.data(img, 'image-url', self.imageUrl);                         $.append(fia, extImg);                         $.append(span, fia);                         $.append(div, span);                         $.append(container, div);                         $.append(fa, img);                         $.append(container, fa);                         return container;                 };                                 self.initInlineExpand = function(img) {                         if (Config.get([self.processor, 'inlineExpand'], Options.processors[self.processor]['inlineExpand'][0]) === false) return;                         $.on(img, 'click', function(e) {                                 e.preventDefault();                                 if ($.hasClass(img, 'thumb')) {                                         $.rmClass(img, 'thumb');                                         img.src = self.imageUrl;                                         Hover.suspend(img);                                 } else {                                         $.addClass(img, 'thumb');                                         img.src = self.thumbUrl;                                         Hover.init(img);                                 }                         });                 };                                 self.loadImage = function(img) {                         img.src = Resources.loadingThumb;                         var image = new Image();                         image.onload = function() {                                 img.src = self.thumbUrl;                                 Hover.init(img);                                 self.initInlineExpand(img);                         };                         image.onerror = function() {                                 console.log("Could not load image: " + self.imageUrl);                                 img.src = Resources.errorThumb;                         };                         image.src = self.thumbUrl;                 };                                 self.placehold = function(post, file) {                         var fileId = 'f' + post.parentElement.id.substring(1);                         var file = file || self.buildFile(fileId);                         var img = $('img.imgur-image', file)                         img.src = Resources.placeholderThumb;                         var handler = function(e) {                                 e.preventDefault();                                 Thumb.preloaded.push(fileId);                                 $.off(img, 'click', handler);                                 self.loadImage(img);                         };                         $.on(img, 'click', handler);                         $.before(post, file);                 };                                 self.plant = function(post, file) {                         var fileId = 'f' + post.parentElement.id.substring(1);                         if (Config.get([self.processor, 'preload'], Options.processors[self.processor]['preload'][0]) === false                                 && !Thumb.isPreloaded(fileId)) {                                         return self.placehold(post, file);                         }                         var file = file || self.buildFile(fileId);                         var img = $('img.imgur-image', file)                         $.before(post, file);                         self.loadImage(img);                 };         };                 $.extend(Thumb, {                 preloaded: [],                 isPreloaded: function(id) {                         return $.inArray(Thumb.preloaded, id);                 },         });                 var EmbedObject = function(props) {                 var self = this;                                 $.extend(self, props);                                 self.buildObject = function(fileId) {                         var container = $.create('div', { id: fileId, className: 'file imgur-container' });                         var div = $.create('div', { className: 'fileInfo' });                         var span = $.create('span', { className: 'fileText', innerHTML: 'Link: ' });                         var fia = $.create('a', { target: '_BLANK', href: self.link, innerHTML: self.name + ' ' });                         var extImg = $.create('img', { src: Resources.externalImage });                         var obj = $.create('object', { className: 'imgur-embed', width: self.width, height: self.height });                         for (var i = 0, c = self.params.length; i < c; i++) {                                 var p = $.create('param', { name: self.params[i].name, value: self.params[i].value });                                 $.append(obj, p);                         }                         var emb = $.create('embed', { src: self.embed, width: self.width, height: self.height });                         $.append(obj, emb);                         $.append(fia, extImg);                         $.append(span, fia);                         $.append(div, span);                         $.append(container, div);                         $.append(container, obj);                         return container;                 };                                 self.plant = function(post, obj) {                         var fileId = 'f' + post.parentElement.id.substring(1);                         var obj = obj || self.buildObject(fileId);                         $.before(post, obj);                 };         };           var Main = {                 processors: [],                 getFile: function(post) {                         var siblings = $.siblings(post);                         var res;                         $.each(siblings, function(sibling) {                                 if ($.hasClass(sibling, 'file')) {                                         res = sibling;                                         return false;                                 }                         });                         return res;                 },                 qualify: function(post, qualifier) {                         return post.innerHTML.toLowerCase().indexOf(qualifier.toLowerCase()) >= 0;                 },                 sortProcessors: function() {                         Main.processors.sort(function(a, b) {                                 if (a.priority < b.priority)                                         return -1;                                 else if (a.priority > b.priority)                                         return 1;                                 return 0;                         });                 },                 attach: function(processor) {                         var exists = false;                         $.each(Main.processors, function(proc) {                                 if (proc.name == processor.name) {                                         exists = true;                                         return false;                                 }                         });                         if (!exists) {                                 //console.log("attaching " + processor.name);                                 Main.processors.push(new processor);                                 Main.sortProcessors();                         }                 },                 detach: function(type) {                         $.each(Main.processors, function(proc, index) {                                 if (proc.name == type) {                                         //console.log("detaching " + type);                                         Main.processors.splice(index, 1);                                         Main.sortProcessors();                                         return false;                                 }                         });                 },                 process: function(target) {                         if (Main.processors.length == 0) return;                         var posts = $('blockquote', target, true);                         $.each(posts, function(post) {                                 var file = Main.getFile(post);                                 if ($.null(file)) {                                         $.each(Main.processors, function(processor) {                                                 if (Main.qualify(post, processor.qualifier)) {                                                         return !processor.process(post, target);                                                 }                                         });                                 } else if ($.hasClass(file, 'imgur-container')) {                                         var img = $('img.imgur-image', file);                                         if (!img) return;                                         var thumb = new Thumb({                                                 processor: $.data(img, 'processor'),                                                 thumbUrl: $.data(img, 'thumb-url'),                                                 imageUrl: $.data(img, 'image-url'),                                         });                                         thumb.plant(post, file);                                 }                         });                 },                 init: function() {                         Main.process(d.body);                                                 $.on(d, 'DOMNodeInserted', function(e) {                                 Main.process(e.target);                         });                 },         };                 var Processors = {                 'Imgur': function() {                         var self = this;                                                 self.priority = 1;                         self.name = 'Imgur';                         self.regex = /((?:i\.)?imgur.com\/)(\w{4,7})(\.?(?:jpg|png|gif))?/i;                         self.qualifier = 'imgur.com/';                         self.imageBase = 'http://i.imgur.com/';                                                 self.process = function(post) {                                 self.regex.lastIndex = 0;                                 var match = self.regex.exec($.strip(post));                                 if (match && $.notnull(match[2])) {                                         var base = match[1];                                         var filename = match[2];                                         var extension = '';                                         if (match.length >= 3 && $.notnull(match[3])) {                                                 extension = match[3];                                         }                                         var name = base + filename + extension;                                         var link = '//' + base + filename + extension;                                         var imageUrl = self.imageBase + filename + (extension.length > 0 ? extension : '.jpg');                                         var thumbUrl;                                         var tinyThumb = Config.get([self.name, 'tinyThumb'], Options.processors[self.name]['tinyThumb'][0]);                                         var autoGif = Config.get([self.name, 'autoGif'], Options.processors[self.name]['autoGif'][0]);                                         if (!tinyThumb && autoGif && extension == '.gif') {                                                 thumbUrl = self.imageBase + filename + extension;                                         } else {                                                 thumbUrl = self.imageBase + filename + (tinyThumb ? 's.jpg' : 'm.jpg');                                         }                                         var thumb = new Thumb({                                                 processor: self.name,                                                 name: name,                                                 link: link,                                                 imageUrl: imageUrl,                                                 thumbUrl: thumbUrl                                         });                                         thumb.plant(post);                                         return true;                                 }                                 return false;                         };                 },                 'Fourchan': function() {                         var self = this;                                                 self.priority = 2;                         self.name = 'Fourchan';                         self.regex = /images\.4chan\.org\/(a|b|c|d|e|f|g|gif|h|hr|k|m|o|p|r|s|t|u|v|vg|w|wg|i|ic|r9k|cm|hm|y|3|adv|an|cgl|ck|co|diy|fa|fit|hc|int|jp|lit|mlp|mu|n|po|pol|sci|soc|sp|tg|toy|trv|tv|vp|wsg|x|rs|q|asp|gd|lgbt|out|vr)\/src\/(\d+?)\.(?:jpg|png|gif)/i;                         self.qualifier = 'images.4chan.org';                         self.url = 'http://thumbs.4chan.org/{board}/thumb/{stamp}s.jpg';                                                 self.process = function(post) {                                 self.regex.lastIndex = 0;                                 var match = self.regex.exec($.strip(post));                                 if (match && $.notnull(match[1]) && $.notnull(match[2])) {                                         var name = match[0];                                         var board = match[1];                                         var stamp = match[2];                                         var link = '//' + name;                                         var thumbUrl = self.url.replace('{board}', board).replace('{stamp}', stamp);                                         var thumb = new Thumb({                                                 processor: self.name,                                                 name: name,                                                 link: link,                                                 imageUrl: link,                                                 thumbUrl: thumbUrl                                         });                                         thumb.plant(post);                                         return true;                                 }                                 return false;                         };                 },                 'YouTube': function() {                         var self = this;                                                 self.priority = 3;                         self.name = 'YouTube';                         //self.regex = /(?:youtube(?:-nocookie)?\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/ ]{11})/i;                         self.regex = /(?:[0-9A-Z-]+\.)?(?:youtu\.be\/|youtube(?:-nocookie)?\.com\S*[^\w\-\s])([\w\-]{11})(?=[^\w\-]|$)(?![?=&+%\w]*(?:['"][^<>]*>|<\/a>))[?=&#+%\w-]*/i;                         self.qualifier = 'youtu';                         self.url = '//i.ytimg.com/vi/{id}/0.jpg';                                                 self.process = function(post) {                                 self.regex.lastIndex = 0;                                 var match = self.regex.exec($.strip(post));                                 if (match && $.notnull(match[1])) {                                         var id = match[1];                                         var name = match[0];                                         var link = '//' + match[0];                                         var imageUrl = self.url.replace('{id}', id);                                         var thumb = new Thumb({                                                 processor: self.name,                                                 name: name,                                                 link: link,                                                 imageUrl: imageUrl,                                                 thumbUrl: imageUrl                                         });                                         thumb.plant(post);                                         return true;                                 }                                 return false;                         };                 },                 'Derpibooru': function() {                         var self = this;                                                 self.priority = 5;                         self.name = 'Derpibooru';                         self.regex = /(derpiboo(?:\.ru|ru\.org)\/)(\d+)/i;                         self.qualifier = 'derpiboo';                         self.cache = {};                                                 self.processJSON = function(data, info) {                                 if ($.notnull(info)) {                                         self.cache[data.id] = info;                                 } else {                                         info = self.cache[data.id];                                 }                                 var name = data.base + info.id_number;                                 var link = data.url;                                 var thumb = new Thumb({                                         processor: self.name,                                         name: name,                                         link: link,                                         imageUrl: info.image,                                         thumbUrl: info.image                                 });                                 thumb.plant(data.post);                         };                                                 self.process = function(post) {                                 self.regex.lastIndex = 0;                                 var match = self.regex.exec($.strip(post));                                 if (match && $.notnull(match[1]) && $.notnull(match[2])) {                                         var data = {                                                 post: post,                                                 base: match[1],                                                 id: match[2],                                         };                                         data.url = '//' + data.base + data.id;                                         if (self.cache[data.id]) {                                                 self.processJSON(data);                                         } else {                                                 $.json(data.url + '.json', data, self.processJSON);                                         }                                         return true;                                 }                                 return false;                         };                 },                 'Vocaroo': function() {                         var self = this;                                                 self.priority = 10;                         self.name = 'Vocaroo';                         self.regex = /vocaroo\.com\/i\/([a-z0-9]+)\b/i;                         self.qualifier = 'vocaroo.com';                                                 self.process = function(post, target) {                                 self.regex.lastIndex = 0;                                 var match = self.regex.exec($.strip(post));                                 if (match && $.notnull(match[1])) {                                         var id = match[1];                                         var link = '//vocaroo.com/i/' + id;                                         var autoplay = (Config.get([self.name, 'autoplay'], Options.processors[self.name]['autoplay'][0]) ? '1' : '0');                                         if (target === d.body) autoplay = 0;                                         var obj = new EmbedObject({                                                 processor: self.name,                                                 name: match[0],                                                 link: link,                                                 width: 148,                                                 height: 44,                                                 params: [                                                         { name: 'movie', value: 'http://vocaroo.com/player.swf?playMediaID=' + id + '&autoplay=' + autoplay },                                                         { name: 'wmode', value: 'transparent' },                                                 ],                                                 embed: 'http://vocaroo.com/player.swf?playMediaID=' + id + '&autoplay=' + autoplay,                                         });                                         obj.plant(post);                                         return true;                                 }                                 return false;                         };                 },                 'Generic': function() {                         var self = this;                                                 self.priority = 10;                         self.name = 'Generic';                         //self.regex = /https?:\/\/[\-A-Z0-9+&@#\/%?=~_|!:,.;]*[\-A-Z0-9+&@#\/%=~_|]?(?:\.(?:jpe?g|png|gif))/i;                         self.regex = /https?:\/\/([\-A-Z0-9.]+)\/[\-A-Z0-9+&@#\/%=~_|]+\.(?:jpe?g|png|gif)/i;                         self.qualifier = 'http';                                                 self.isAllowedDomain = function(domain) {                                 var disallowed = Config.get([self.name, 'disallowedDomains'], Options.processors[self.name]['disallowedDomains'][0]).split(',');                                 for (var i = 0, c = disallowed.length; i < c; i++) {                                         var dom = disallowed[i].trim();                                         if (dom.length > 0 && domain.indexOf(dom) > -1) return false;                                 }                                 if (!Config.get([self.name, 'whitelistOnly'], Options.processors[self.name]['whitelistOnly'][0])) {                                         return true;                                 }                                 var allowed = Config.get([self.name, 'allowedDomains'], Options.processors[self.name]['allowedDomains'][0]).split(',');                                 for (var i = 0, c = allowed.length; i < c; i++) {                                         var dom = allowed[i].trim();                                         if (dom.length > 0 && domain.indexOf(dom) > -1) return true;                                 }                                 return false;                         };                                                 self.process = function(post) {                                 self.regex.lastIndex = 0;                                 var match = self.regex.exec($.strip(post));                                 if (match && $.notnull(match[0])) {                                         var imageUrl = match[0];                                         var domain = match[1];                                         if (self.isAllowedDomain(domain)) {                                                 var thumb = new Thumb({                                                         processor: self.name,                                                         name: imageUrl,                                                         link: imageUrl,                                                         imageUrl: imageUrl,                                                         thumbUrl: imageUrl                                                 });                                                 thumb.plant(post);                                                 return true;                                         }                                 }                                 return false;                         };                 },         };                 var Options = {                 processors: {                         'Imgur': {                                 enabled: [true, 'Enabled', 'Enable imgur.com link thumbnails'],                                 preload: [true, 'Auto-Load', 'Load thumbnail automatically instead of waiting for user action'],                                 inlineExpand: [true, 'Inline Expand', 'Click the thumbnail to switch to the full image'],                                 hoverExpand: [true, 'Hover Expand', 'Hover the thumbnail to show the full image'],                                 autoGif: [true, 'Auto-Gif', 'Use animated gifs instead of non-animated thumbnails'],                                 tinyThumb: [false, 'Tiny Thumb', 'Use smallest available thumbnail (overrides auto-gif)'],                         },                         'Fourchan': {                                 enabled: [true, 'Enabled', 'Enable 4chan link thumbnails'],                                 preload: [true, 'Auto-Load', 'Load thumbnail automatically instead of waiting for user action'],                                 inlineExpand: [true, 'Inline Expand', 'Click the thumbnail to switch to the full image'],                                 hoverExpand: [true, 'Hover Expand', 'Hover the thumbnail to show the full image'],                         },                         'YouTube': {                                 enabled: [true, 'Enabled', 'Enable YouTube link thumbnails'],                                 preload: [true, 'Auto-Load', 'Load thumbnail automatically instead of waiting for user action'],                                 inlineExpand: [false, 'Inline Expand', 'Click the thumbnail to switch to the full image'],                                 hoverExpand: [true, 'Hover Expand', 'Hover the thumbnail to show the full image'],                         },                         'Derpibooru': {                                 enabled: [true, 'Enabled', 'Enable derpibooru.org link thumbnails (probably doesn\'t work on Opera)'],                                 preload: [false, 'Auto-Load', 'Load thumbnail automatically instead of waiting for user action'],                                 inlineExpand: [true, 'Inline Expand', 'Click the thumbnail to switch to the full image'],                                 hoverExpand: [true, 'Hover Expand', 'Hover the thumbnail to show the full image'],                         },                         'Vocaroo': {                                 enabled: [true, 'Enabled', 'Enable vocaroo.com embedding'],                                 autoplay: [false, 'Auto-Play', 'Automatically play new embeds (never on page load)'],                         },                         'Generic': {                                 enabled: [true, 'Enabled', 'Enable other image link thumbnails'],                                 whitelistOnly: [false, 'Allowed Only', 'Only enable for whitelisted domains (comma-separated, match-based)'],                                 allowedDomains: ['tumblr.com,derpicdn.net', 'Allowed Domains'],                                 disallowedDomains: ['', 'Disallowed Domains'],                                 preload: [false, 'Auto-Load', 'Load thumbnail automatically instead of waiting for user action (not recommended)'],                                 inlineExpand: [true, 'Inline Expand', 'Click the thumbnail to switch to the full image'],                                 hoverExpand: [true, 'Hover Expand', 'Hover the thumbnail to show the full image'],                         },                 },         };                 var Config = {                 get: function(key, def) {                         if (key instanceof Array) {                                 key = key.join('.');                         }                         var val = JSON.parse(localStorage.getItem(namespace + key));                         if ($.null(val)) return def;                         return val;                 },                 set: function(key, value) {                         return localStorage.setItem(namespace + key, JSON.stringify(value));                 },                 remove: function(key) {                         return localStorage.removeItem(namespace + key);                 },                 checkbox: {                         change: function() {                                 Config.set(this.name, this.checked);                                 var opt = this.name.split('.');                                 if (opt[1] == 'enabled') {                                         if (this.checked)                                                 Main.attach(Processors[opt[0]]);                                         else                                                 Main.detach(opt[0]);                                 }                                 return this.checked;                         },                 },                 textbox: {                         change: function() {                                 Config.set(this.name, this.value);                                 return this.value;                         },                 },         };                 var Menu = {                 init: function() {                         var ref = ['boardNavDesktop', 'boardNavDesktopFoot', 'shortcuts'];                         for (var i = 0; i < ref.length; i++) {                                 var elem = $.id(ref[i]);                                 if ($.null(elem)) continue;                                                                 var a = $.create('span', {                                         className: 'imgur-settings-link',                                         innerHTML: '[Imgur Settings]',                                 });                                 $.on(a, 'click', Menu.dialog);                                 $.append(elem, a);                         }                         if (!Config.get('firstrun')) {                                 Config.set('firstrun', true);                                 return Menu.dialog();                         }                 },                 dialog: function() {                         var menu = $.create('div', {                                 id: 'imgur-menu',                                 innerHTML: '\                                        
\                                                

4chan imgur thumbnail v' + version + '

\                                        
\                                        
\                                        
\                                                
\                                        
\                                 ',                         });                         var label, key, ref, opt, procs, content;                         ref = Options.processors;                         procs = $('.processors', menu);                         content = $('.content', menu);                         for (label in ref) {                                 var ul = $.create('ul', { innerHTML: '' + label + '' });                                 opt = ref[label];                                 for (key in opt) {                                         var arr = opt[key];                                         var confKey = [label, key].join('.');                                         var def = arr[0];                                         var text = arr[1];                                         switch (typeof def) {                                                 case 'boolean':                                                         var checked = Config.get(confKey, arr[0]) ? true : false;                                                         var description = arr[2];                                                         var li = $.create('li', {                                                                 innerHTML: ': ' + description + '',                                                         });                                                         $.on($('input', li), 'change', Config.checkbox.change);                                                         break;                                                 case 'string':                                                         var value = Config.get(confKey, arr[0]);                                                         var li = $.create('li', {                                                                 innerHTML: ': ',                                                         });                                                         $.on($('input', li), 'change', Config.textbox.change);                                                         break;                                         }                                         $.append(ul, li);                                 }                                 $.append(procs, ul);                         }                                                 overlay = $.create('div', {                                 id: 'imgur-overlay'                         });                         $.on(overlay, 'click', Menu.close);                         $.on(menu, 'click', function(e) {                                 return e.stopPropagation();                         });                         $.append(overlay, menu);                         $.append(d.body, overlay);                 },                 close: function() {                         $.remove(this);                 },         };                 $.addStyle('\                 #imgur-overlay {\                         position: fixed;\                         top: 0;\                         left: 0;\                         width: 100%;\                         height: 100%;\                         text-align: center;\                         background: rgba(0,0,0,.5);\                         z-index: 1;\                 }\                 #imgur-overlay:after {\                         content: "";\                         display: inline-block;\                         height: 100%;\                         vertical-align: middle;\                 }\                 #imgur-menu {\                         background: #D6DAF0;\                         border: 1px solid rgba(0, 0, 0, 0.25);\                         color:#000;\                         display: inline-block;\                         padding: 5px;\                         position: relative;\                         text-align: left;\                         vertical-align: middle;\                         min-width: 350px;\                         max-width: 100%;\                         max-height: 100%;\                 }\                 #imgur-menu .info {\                         font-size: 10px;\                 }\                 #imgur-menu .warning {\                         font-weight: bold;\                         color: #f00;\                 }\                 #imgur-menu .bar {\                         font-size: 16px;\                         font-weight: bold;\                         margin-left: 5px;\                 }\                 #imgur-menu .bar p {\                         margin: 0 0 5px;\                 }\                 #imgur-menu .content {\                         height: 500px;\                         overflow: auto;\                         padding: 0 10px 10px;\                 }\                 #imgur-menu ul {\                         padding: 0;\                         list-style: none;\                 }\                 #imgur-menu label {\                         text-decoration: underline;\                 }\                 #imgur-menu input[type="text"] {\                         width: 300px;\                         margin-top: 3px;\                 }\                 .imgur-settings-link {\                         float: right;\                         margin-right: .25em;\                 }\                 .imgur-embed { float: left; margin: 3px 20px 5px; }\                 .imgur-image {\                         border: 1px solid #00a !important;\                         padding: 2px;\                 }\                 .imgur-image.thumb {\                         max-height: 125px !important;\                         max-width: 125px !important;\                 }\                 #imgur-thumbnail-hover {\                         position: fixed;\                         max-height: 97%;\                         max-width: 75%;\                         padding-bottom: 18px;\                 }\         ');                 Menu.init();           for (label in Options.processors) {                 var opt = Options.processors[label];                 if (Config.get([label, 'enabled'], opt.enabled[0])) {                         Main.attach(Processors[label]);                 }         }                 Main.init();         })();