// ==UserScript== // @id org.userscripts.users.kuehlschrank.MouseoverPopupImageViewer // @name Mouseover Popup Image Viewer // @description Adds floating full-size previews to thumbnails. Can bypass hotlink protections. // @version 2012.3.14 // @author kuehlschrank // @homepage http://userscripts.org/scripts/show/109262 // @icon http://s3.amazonaws.com/uso_ss/icon/109262/large.png // @updateURL https://userscripts.org/scripts/source/109262.meta.js // @include http* // @exclude http*imgur.com/a/* // ==/UserScript== var hosts = [ {r:/500px\.com\/photo\//, q:'#mainphoto'}, {r:/depic\.me\//, q:'#pic'}, {r:/deviantart\.com\/art\//, q:'#gmi-ResViewSizer_img'}, {r:/fastpic\.ru\/view\//, q:'#image'}, {r:/fbcdn\.net\/.+\.jpg($|\?)/, xhr:true}, {r:/flickr\.com\/photos\/([0-9]+@N[0-9]+|[a-z0-9-_]+)\/([0-9]+)/, s:'http://www.flickr.com/photos/$1/$2/sizes/l/', q:'#allsizes-photo > img'}, {r:/google\.[a-z.]+\/.+imgurl=(.+?\.(png|gif|jpe?g))/i, s:'$1'}, {r:/hotimg\.com\/image\/([a-z0-9]+)/i, s:'http://www.hotimg.com/direct/$1'}, {r:/imagearn\.com\/image/, q:'#img', xhr:true}, {r:/imagefap\.com\/(image|photo)/, q:'#gallery + noscript'}, {r:/imagebam\.com\/image\//, q:'img[id]', xhr:true}, {r:/imageban\.ru\/show/, q:'#img_obj'}, {r:/imagebunk\.com\/image/, q:'#img_obj', xhr:true}, {r:/imagehaven\.net\/img\.php/, q:'#image'}, {r:/imagehyper\.com\/img\.php/, q:'img[src*="imagehyper.com/img"]', xhr:true}, {r:/imagerise\.com\/show/, q:'#img_obj', xhr:true}, {r:/imageshack\.us\/(i|photo)\//, q:'#main_image'}, {r:/imageshost\.ru\/photo\//i, q:'#bphoto'}, {r:/imagetwist\.com\/[a-z0-9]+\/?(.+\.html)?/, q:'img.pic', xhr:true}, {r:/imageupper\.com\/i\//, q:'#img', xhr:true}, {r:/imagepix\.org\/image\/(.+)\.html$/, s:'http://imagepix.org/full/$1.jpg', xhr:true}, {r:/imageporter\.com\/i\//, xhr:true}, {r:/imagevenue\.com\/img\.php/, q:'#thepic'}, {r:/imagewaste\.com\/pictures\/(.+)/, s:'http://www.imagewaste.com/pictures/big/$1', xhr:true}, {r:/imagezilla\.net\/show\/(.+\.jpg)$/, s:'http://imagezilla.net/images/$1', xhr:true}, {r:/(imgchili|hoooster)\.com\/show/, q:'#show_image', xhr:true}, {r:/imgdepot\.org\/show\/(.+\.jpg)/, s:'http://imgdepot.org/images/$1', xhr:true}, {r:/imgtheif\.com\/image\//, q:'a > img[src*="/pictures/"]'}, {r:/imgur\.com\/(gallery\/|[a-z0-9]+#)?([a-z0-9]{5,}[^\.]*$)/i, s:'http://i.imgur.com/$2.jpg'}, {r:/itmages\.ru\/image\/view\//, q:'#image'}, {r:/listal\.com\/viewimage\/([0-9]+)/, s:'http://www.listal.com/viewimage/$1h', q:'center img'}, {r:/memegenerator\.net\/instance\/([0-9]+)/, s:'http://images.memegenerator.net/instances/500x/$1.jpg'}, {r:/(min\.us|minus\.com)\/l([a-z0-9]+)$/i, s:'http://i.min.us/i$2.jpg'}, {r:/myphoto\.to\/view\/(.+)/, s:'http://img.myphoto.to/$1'}, {r:/photosex\.biz\/.+?id=([a-z0-9]+)/i, s:'http://img.photosex.biz/pic_b/$1.jpg', xhr:true}, {r:/(pic4all\.eu\/|^)(images\/|view\.php\?filename=)(.+)/, s:'http://www.pic4all.eu/images/$3'}, {r:/(picszone\.net|myadultimage\.com|fotoshare\.org|badimg\.com)\/viewer\.php\?file=(.+)/, s:'http://$1/images/$2', xhr:true}, {r:/picturescream\.com\/\?v=/, q:'#imagen img'}, {r:/pimpandhost\.com\/(image|guest)\//, q:'#image'}, {r:/pixhost\.org\/show\//, q:'#show_image', xhr:true}, {r:/pixroute\.com\/.+\.html$/, q:'img[id]', xhr:true}, {r:/postimage\.org\/image\//, q:'center img'}, {r:/(qkme\.me|quickmeme\.com\/meme)\/([a-z0-9]+)/i, s:'http://i.qkme.me/$2.jpg'}, {r:/radikal\.ru\/.+\.html$/, q:'div > div > img'}, {r:/r70\.info\/viewer\.php\?file=(.+)/, s:'http://r70.info/images/$1'}, {r:/sharenxs\.com\/view\//, q:'#img1', xhr:true}, {r:/image\.skins\.be\/[0-9]+\//, q:'#wallpaper_image'}, {r:/stooorage\.com\/show\//, q:'#page_body div div img', xhr:true}, {r:/turboimagehost\.com\/p\//, q:'#imageid', xhr:true}, {r:/twitpic\.com\/[a-z0-9]+$/i, q:'#photo-display', xhr:true}, {r:/uppix\.net\/([0-9a-z\/]+)\.html$/i, s:'http://uppix.net/$1.jpg'}, {r:/wikipedia\.org\/(wiki\/.+:|w\/.+title=).+\.(jpe?g|gif|png|svg)/i, q:'#file img'}, {r:/winimg\.com\/view/, q:'#image_container img'}, {r:/yfrog\.com\/(z\/)?[a-z0-9]+$/i, q:'#main_image, #the-image img'}, {r:/^[^\?]+\.(jpe?g|gif|png)($|\?)/i} ]; function prepareLinks(parent) { var list = document.evaluate(cfg.thumbsonly ? './/a[img or */img]' : './/a', parent, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); for(var i = list.snapshotLength; i--;) { prepareLink(list.snapshotItem(i)); } } function prepareLink(a) { a.addEventListener('mouseover', onMouseOver, false); } function activateLink(a) { return hosts.some(function(host) { deactivateLink(); var m = host.r.exec(a.href); if(!m || host.r.test(window.location.href)) return false; var url = host.hasOwnProperty('s') ? replace(host.s, m) : a.href; var pos = url.lastIndexOf('http:'); var img = a.querySelector('img'); cur = { link: a, url: pos > 0 ? url.substr(pos) : url, q: host.q, xhr: host.xhr, rect: img ? img.getBoundingClientRect() : a.getBoundingClientRect(), cw: Math.min(window.innerWidth, document.documentElement.clientWidth) - 2, ch: Math.min(window.innerHeight, document.documentElement.clientHeight) - 2, t: Date.now() } document.addEventListener('mousemove', onMouseMove, false); document.addEventListener('mousedown', onMouseDown, false); document.addEventListener('contextmenu', onContext, false); document.addEventListener('keyup', onKeyUp, false); document.addEventListener('DOMMouseScroll', deactivateLink, false); document.addEventListener('mousewheel', deactivateLink, false); document.addEventListener('mouseout', onMouseOut, false); return true; }); } function deactivateLink(e) { window.clearTimeout(cur.timeout); if(cur.req && typeof cur.req.stop == 'function') cur.req.stop(); if(cur.link) cur.link.style.cursor = ''; cur = {}; document.removeEventListener('mousemove', onMouseMove, false); document.removeEventListener('mousedown', onMouseDown, false); document.removeEventListener('contextmenu', onContext, false); document.removeEventListener('keyup', onKeyUp, false); document.removeEventListener('DOMMouseScroll', deactivateLink, false); document.removeEventListener('mousewheel', deactivateLink, false); document.removeEventListener('mouseout', onMouseOut, false); setStatus(false); setPreview(false); } function onMouseOver(e) { if(e !== false) { if(!e.shiftKey && this != cur.link && !cur.full && activateLink(this)) { cur.timeout = delay(onMouseOver, cfg.delay, false); cur.cx = e.clientX; cur.cy = e.clientY; } return; } setStatus(cur.xhr ? 'xhr' : 'loading'); placeStatus(); if(cur.q) { downloadPage(rel2abs(cur.url, window.location.href), cur.q, cur.xhr, cur.t); } else { if(cur.xhr) { downloadImage(cur.url, cur.url, cur.t); } else { setPreview(cur.url); checkProgress(true); } } } function onMouseMove(e) { if(e.shiftKey) { return; } var r = cur.rect; if(!cur.full && (e.clientX > r.right || e.clientX < r.left || e.clientY > r.bottom || e.clientY < r.top)) { deactivateLink(); return; } cur.cx = e.clientX; cur.cy = e.clientY; placeStatus(); placePreview(); } function onMouseDown(e) { if(e.which != 3) setPreview(false); } function onMouseOut(e) { if(!e.relatedTarget) deactivateLink(); } function onKeyUp(e) { if(e.keyCode == 9 && !e.ctrlKey) { deactivateLink(); setup(); } else if(e.keyCode == 16) { toggleFull(); } else { setPreview(false); } } function onContext(e) { if(cfg.context && !e.shiftKey && getPreview() && !getStatus() && toggleFull()) { e.preventDefault(); } else { setPreview(false); deactivateLink(); } } function onNodeInserted(e) { var t = e.target; switch(t.tagName) { case 'A': if(!t.firstChild) break; if(!cfg.thumbsonly || t.firstChild.tagName == 'IMG' || t.firstChild.firstChild && t.firstChild.firstChild.tagName == 'IMG') prepareLink(t); break; case 'IMG': if(t.parentNode.tagName == 'A') prepareLink(t.parentNode); else if(t.parentNode.parentNode && t.parentNode.parentNode.tagName == 'A') prepareLink(t.parentNode.parentNode); break; default: prepareLinks(t); } } function downloadPage(url, q, xhr, t) { cur.req = GM_xmlhttpRequest({ method: 'GET', url: url, ignoreCache: true, onload: function(req) { try { var node = GM_safeHTMLParser(req.responseText).querySelector(q); if(!node) throw 'No results for "' + q + '" at ' + url; var iurl = rel2abs(node.tagName.toUpperCase() == 'IMG' ? node.getAttribute('src').trim() : node.innerHTML.match(/http:\/\/[.\/a-z0-9_+%-]+\.(jpe?g|gif|png)/i)[0], url); if(!iurl) throw 'Image URL not found'; if(cur.t != t) return; if(xhr) { downloadImage(iurl, url, t); } else { setPreview(iurl); checkProgress(true); } } catch(ex) { showError(ex, t); } } }); } function downloadImage(url, referer, t) { cur.req = GM_xmlhttpRequest({ method: 'GET', url: url, overrideMimeType:'text/plain; charset=x-user-defined', headers: {'Accept':'image/png,image/*;q=0.8,*/*;q=0.5','Referer':referer}, onload: function(req) { try { if(cur.t != t) return; var data = ''; for(var i = 0, len = req.responseText.length; i < len; i++) { data += String.fromCharCode(req.responseText.charCodeAt(i) & 0xff); } setPreview('data:;base64,' + window.btoa(data)); checkProgress(true); } catch(ex) { showError(ex, t); } } }); } function checkProgress(start) { if(start === true) { window.clearInterval(checkProgress.interval); checkProgress.interval = window.setInterval(checkProgress, 150); return; } var img = getPreview(); if(!img) { window.clearInterval(checkProgress.interval); return; } if(img.naturalHeight) { setStatus(false); window.clearInterval(checkProgress.interval); img.style.display = ''; placePreview(); if(img.naturalWidth > img.clientWidth || img.naturalHeight > img.clientHeight) { img.style.cursor = 'all-scroll'; cur.link.style.cursor = 'all-scroll'; } } } function placePreview() { var img = getPreview(); if(!img) return; var cx = cur.cx, cy = cur.cy; var cw = cur.cw, ch = cur.ch; if(cur.full) { img.style.maxWidth = null; img.style.maxHeight = null; img.style.left = (cw > img.naturalWidth ? cw/2 - img.naturalWidth/2 : -1 * Math.min(1, Math.max(0, 5/3*(cx/cw-0.2))) * (img.naturalWidth - cw)) + 'px'; img.style.top = (ch > img.naturalHeight ? ch/2 - img.naturalHeight/2 : -1 * Math.min(1, Math.max(0, 5/3*(cy/ch-0.2))) * (img.naturalHeight - ch)) + 'px'; } else { img.style.maxWidth = cw + 'px'; img.style.maxHeight = ch + 'px'; var w = img.clientWidth; var h = img.clientHeight; img.style.left = Math.min(cw - w, Math.max(0, cx + (w && cx > cw/2 ? -w -30 : 30))) + 'px'; img.style.top = Math.min(ch - h, Math.max(0, cy + (h && cy > ch/2 ? -h -30 : 30))) + 'px'; } } function placeStatus() { var img = getStatus(); if(img) { img.style.left = cur.cx + 30 + 'px'; img.style.top = cur.cy + 30 + 'px'; } } function toggleFull() { var img = getPreview(); if(!img || !img.naturalHeight) return; img.style.cursor = ''; if(cur.link) cur.link.style.cursor = ''; cur.full = !cur.full && (img.naturalWidth > cur.cw || img.naturalHeight > cur.ch); onMouseMove({clientX:cur.cx,clientY:cur.cy}); return cur.full; } function showError(ex, t) { if(t && t != cur.t) return; setStatus('error'); GM_log(ex); } function getStatus() { return document.getElementById('mpiv-status'); } function setStatus(status) { var img = getStatus(); if(!img && !status) return; if(!img) { img = document.createElement('img'); img.id = 'mpiv-status'; img.style.cssText = 'display:none;border:1px solid black;background-color:white;position:fixed;z-index:10000;margin:0'; document.body.appendChild(img); } if(status) { var srcs = { loading:'data:image/gif;base64,R0lGODlhKAAoALMAAEeJxkfGzInG/wBHiQBHxsb//YmJxgAAkgCJvP/G+P//xomJ/4nGxsbGxsbG/////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQEDQAAACwAAAAAKAAoAAAE//DJSau9OOvNu/9gKF7GsIziQAxVg1KMUQ0HQTmM8D4OMgAU1WFSaAhcO9VAJznQJsaGY/cwrGzNlcQRpUqUsgeNxWM4Ct4H44oW8hpmipTBWQ/oE8BKlqAUphJFR0cbBggEBAB4a2EZcziAGwAqhwCRGlGEHwyTKwgdXAx9IoYESByXIjhprBVmOXBcGEYGAAacjR2vkHEkira1TB6ZcxkCMQACtkCtzamqw2bPHUUMaKivDdfURqEevLIcUbAbcDCQ0zfdp28WkOxcAgobgvDSD3B4kNs78UgC4fylMSNFwqsJ6Kg4gAQFIBE47EZE2YYD3qodBM/hQejlTwuHzQwwFOEXsqTJkyhHRAAAIfkEBA0AAAAsBAAEACAAIAAABP/wyUkpI63qzScgQAU4neZkFDEgiTcMJVUYI7XC0jUQMWUEhsKEQEAMd4bexEFLShBEyWentPxIDxWvsBsIKsKSgwEIPm4PgyrkOjCWDQZWYiDPJ+r3g7E7EJwPBWMnYTNfHQ4IBwOLPBQNg3JhMYwEfndwAg1xSmoDgByCAi1KNT0NkzGpVaxyDK6QkK5jKFWzs5GymDENmppjgbqurMTFu4hVcQ7HFCd6HWG5qxInArRVg7EVvcrME5wTrtbf2ZNyJtpwDpMFvamDQsMPvsUPuhLcEu3nxNxY8g/G8FNSrdagJdVaAQu3kBqDWqfGLRmojxRBBRXkQKzHgYHFGBEBAAAh+QQEDQAAACwIAAQAHAAgAAAE8vDJSR1zNOs9mc9Mwk1OkRkLQxkMMD5F02Ads5AGoL7WPKWGiSGQej0sjkZNIGGwXMZHQ8AwPQysow1gnXQphWTyQQ06hkEhYkCjSaY70E3iWBMIu6RV/GoABgRrUA8XMl8ja4JuUlRjUQYIBGkZSQKLLwaHYCJRnQ8KnhKAo4AsU5dGowSqSRehD6uxgBcCDXGvuBwGqBWefwOTFbaaGwMHBMeTrQ4WnQ6rA6MStY1GzRIGq8mEjm+ott1X0UwCX0gmF3kXxBozrlo0Me9GUz7ccT28wrUT9SRIRtJRoCbs1oZTFPxtMlKAU4dwuSgYfBEBACH5BAQNAAAALAwABAAcACAAAATh8MnpWpk4691Ey86mXZjDhFPHiFiDSucqFY3LTowtdd8uVDcYUCiQOEyvm4pk+lQ8JMqm8Ew8Yg/aqWUS8aKTRNHI82QUj0pS4yr3MmAWcusN7rq3NYtq7/v/DwYMAAaEDDKAEoQAg4MLiRMGAQaSgnqQmBkGcSB+DAQIBiwMnBsEAwgDjBt4QQUAAwSgAFYtQQYDDmgCsKeIGToYuAQAwggEvxQnFwMHA1mxuX1PPQcEBxIGpwR9PCix2BKnA6J5PBPN3DCyzzdYE9ftirGlKT8Y4JrJI7Xo1pkZFgzYZycCACH5BAQNAAAALAYAEgAhABUAAASo8Emppr2WNeYYbxOnCQ5mTo7QqF0ptZt7YrHoFCinMnPv/6Yb8OEADBsNB8hnGBwMOJ/AJrswBgMC9qhiVSzZA0FcpQGij48A/QA4tQtJg2DAMAx4i1KZOQygE24ERgMIA0QMABw/ZQxaAzhaBC8GikNgBHQShZMSdwBlTIadD4YIKAGVlw9ZAzKSGQYBq1pGEwSGFw6hPXcXAIOrQwJ/q1/CyMnKyccRACH5BAQNAAAALAQADAAfABgAAATJ8LFxzLuviVYwTgLmaORlEANqPaPjvdm4bR56oIQLww7T66/TYUDcwRo9I0a4UmIKQGXSSa1aGQ0fw2cgDikEq2iGnHzP4kv2x7URboO0XO6IGh1NagPZUTIICAtWAlp1MAwABIBhViQbDgoYiQMIAwB2L1kJfWUOfQaVBAAhGQYMLwoOjx4yCRd/CHkMBoQSGg8FJH13L3gABh0/FzINcgYBtK9TLBqYRrMCACI+GCTFVga/u2ust9gBUT3XT5BWy8qkc0oJp1YRADs=', xhr:'data:image/gif;base64,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', error:'data:image/gif;base64,R0lGODlhKAAoAOYAANssLOyZmZkDA/oBAbUBAeVqavO2ttgZGffX1/xra+kAAMwzM7apqcYZGdZqavWiov3//+d5efh7e7sjI/hdXfrq6twBAdtAQPf+/qmmpsGcnMSzs65VVeywsOxTU/WLi3onJ9BdXYQtLfWUlHk0NOBGRuY6OpyWlssBAeuMjMC7u++lpe5KSuJbW/H29vTLy/TExOZNTdjLy8EAAOQrK/Cqqr65uc0PD6oTE6grK+xCQuSEhLIZGd08PKAVFbMREZIoKOMzM6KTk8whIfrDw4Q1NW41NawBAX1hYaQNDe3y8rSWlsm0tPf5+cUrK/r8/P719Y1oaJk5Oa1/f99LS+ozM94ICMCZmfn8/NQ1Nfv///JOTs0uLrF8fLwWFq0fH/75+ZV9fek9PeqHh6lhYbOamtE6OqEbG7ANDevv74h0dNk2NtQAANa7u8MhIaEAAPf//62CgrCFhc2vr81UVOhiYt5TU+7BwcIJCc0ICMtISItcXO83N8e/v+OgoP///yH5BAAAAAAALAAAAAAoACgAAAf/gH+Cg4SFhoeIiYqLjItKLo2GaZCRWAxRUX2RgnBXHBxzjVgnIHl4IgyRGF0/fDQ/V4sQJyJWAwp5qIxwrGIlHjqwEIhNJyQWAwYrVjeow4hYXTxVay8rOsFXz4TFJLYjgikWzQzbhBhTPEFcd2BgAVsswoQQDCDII00ICFA740DlCq3CQWNIByj7KoygsOVHG0JpkOQZMKLCCxgwXlSIwOYGQEJw0gFw46cCxowIRiSowgHLICVR8AyQgMCATZsIHKA4AHAYljhfAHgJUPOmgTsfEtAg43KQCiMTE9ypsYJqDSIOZvBkoEVO0B87iKyoWrVDBApicMgo9CQD1AF1/zoEmDvXQAgCB6TsyTEETQQDdOeuKEDBBA4m5gRBcDvRQ4AUYyKneECHwJAvQ5I4eBBZcoo6WwxvSEyI8YAYKSKoVv1BT5LMIT6sVr3DTmgfG2RlIJFHwYUIBYIHl2BGAB0JwoXrYWECd6PFJG4oWFOghXXrdezUuX7dzIUgziNBv2EBgB0q6NF7SE8lRowFPcCP3iQogwjyQ0r02M+/v5M18tE3SD1FNIBCA0EAoOCCCrrBRRY5MCFgIWoAcQBeB2So4QEN8KBDElNMOIgWQliIwgwEpHjEimj8wAMPXPTwhQakMfJEiQdYMAOKR7whwI9J4MDDBBNkkRaN9GEhhP8IOZ7I4xs+ChDkkBM4cYEOaCApihAgWKEAG04S0GOUUxLphBMlYKmlIk+Q4qUFYO4oJpQ+llnlAmYAk2WNg7TZ5QAWwBlmj17QgIYAQpqJ5wUesLAnIn7aokCgcaL4xg1D+ADAD0lQ6cSiJVDgqAZaGFLMnwpMKuiOR2AqRRg5CIWDot6VEEMCo5ZKiD3I3KJqnARgKoIKWpRxRhBuDPlprTF4kMAWaDw0SEQT+frriVYMIYINihkbhBN3MusBBRLw0dJLSMhkLaUoZFsEtwMu4cM6E4DaLLlLPTGgDUaomyqlVrhRhAqGaLHEGSZk4YS4CaS1FiFtGXGDr4Fa0cBbu4gY7IMYPSxwga0JiFajWxNPqkADJBCcCARL4OCLGaE2l1siJA8wgBcpM2JwEjqM25yEi+zmBQ85N7JzFTScATQjfagRxsORaMEEGWRA3YgL+k7YRBMidp1IIAA7' }; img.src = srcs[status]; img.style.display = ''; } else { img.parentNode.removeChild(img); } } function getPreview() { return document.getElementById('mpiv-preview'); } function setPreview(src) { var img = getPreview(); if(!img && !src) return; if(!img) { img = document.createElement('img'); img.id = 'mpiv-preview'; img.style.cssText = 'display:none;border:1px solid black;background-color:white;position:fixed;z-index:10000;margin:0;cursor:default'; img.addEventListener('error', showError, false); document.body.appendChild(img); } if(src) { img.src = src; img.style.display = 'none'; } else { cur.full = false; img.removeEventListener('error', showError, false); img.parentNode.removeChild(img); } } function rel2abs(rel, abs) { if(rel.indexOf('//') == 0) rel = 'http:' + rel; var re = /^([a-z]+:)?\/\//; if(re.test(rel)) return rel; if(!re.exec(abs)) return false; if(rel[0] == '/') return abs.substr(0, abs.indexOf('/', RegExp.lastMatch.length)) + rel; return abs.substr(0, abs.lastIndexOf('/')) + '/' + rel; } function replace(s, m) { for(var i = m.length; i--;) { s = s.replace('$'+i, m[i]); } return s; } function delay(f, t) { var args = arguments.length > 2 ? Array.prototype.slice.call(arguments, 2) : null; return window.setTimeout(function() { f.apply(null, args); }, t); } function setup() { if(document.getElementById('mpiv-setup')) return; var style = document.createElement('style'); style.appendChild(document.createTextNode('#mpiv-setup { position:fixed;z-index:10001;top:40px;right:40px;padding:20px 30px;background-color:white;width:300px;border:1px solid black } #mpiv-setup * { color:black;text-align:left;line-height:normal;font-size:12px } #mpiv-setup div { text-align:center;font-weight:bold;font-size:14px } #mpiv-setup ul { margin:15px 0 15px 0;padding:0;list-style:none } #mpiv-setup li { margin:0;padding:6px 0;vertical-align:middle; } #mpiv-setup p { background-color:white;color:gray;padding:2px 16px; margin:0; } #mpiv-setup input[type=text] { width: 50px; }')); document.getElementsByTagName('head')[0].appendChild(style); var div = document.createElement('div'); div.id = 'mpiv-setup'; div.innerHTML = '<div>Mouseover Popup Image Viewer</div><ul><li>Popup delay: <input id="mpiv-setup-delay" type="text"/> ms</li><li><input type="checkbox" id="mpiv-setup-thumbsonly"> Restrict popups to thumbnailed links<p>If unchecked, popups are also shown on normal links, i.e. links that don\'t contain a thumbnail.</p></li><li><input type="checkbox" id="mpiv-setup-context"> Use right mouse button to enlarge to full size<p>To access context menu: Right-click before popup is visible or hold down shift while right-clicking.</p></li></ul><div><button id="mpiv-setup-button">Save settings</button></div>'; document.body.appendChild(div); document.getElementById('mpiv-setup-button').addEventListener('click', function() { var delay = parseInt(document.getElementById('mpiv-setup-delay').value); if(!isNaN(delay) && delay >= 0) GM_setValue('delay', delay); GM_setValue('thumbsonly', !!document.getElementById('mpiv-setup-thumbsonly').checked); GM_setValue('context', !!document.getElementById('mpiv-setup-context').checked); this.disabled = true; this.innerHTML = 'Reloading...'; window.location.reload(); }, false); document.getElementById('mpiv-setup-delay').value = cfg.delay; document.getElementById('mpiv-setup-thumbsonly').checked = cfg.thumbsonly; document.getElementById('mpiv-setup-context').checked = cfg.context; } if(typeof GM_safeHTMLParser != 'function' && typeof document.implementation != 'undefined') { function GM_safeHTMLParser(s) { var d = document.implementation.createHTMLDocument('MPIV'); d.documentElement.innerHTML = s; return d; } } var cfg = {delay:GM_getValue('delay', 400), thumbsonly:GM_getValue('thumbsonly', true), context:GM_getValue('context', true)}; var cur = {}; prepareLinks(document); document.addEventListener('DOMNodeInserted', onNodeInserted, false);

Mozilla add on,User script,Grease Monkey Script, greasemonkey userscripts, updater userscripts mafia wars userscripts mafia wars autoplayer userscripts mafia wars wall userscripts scripts userscripts travian greasemonkey greasemonkey download greasemonkey facebook greasemonkey tutorial greasemonkey youtube greasemonkey travian greasemonkey chrome greasemonkey mafia wars greasemonkey mafia wars autoplayer
Friday, March 16, 2012
Mouseover Popup Image Viewer
Subscribe to:
Post Comments (Atom)
0 comments:
Post a Comment