User:Kephir/gadgets/preview.js

// more info: User:Kephir/gadgets/preview /*jshint undef:true, boss:true, loopfunc:true */ /*global mw, jQuery, importStylesheetURI */ if ((mw.config.get('wgAction') === 'edit') || (mw.config.get('wgAction') === 'submit')) mw.loader.using([/* nothing for now, but you never know */], function { "use strict";

function md5(s) { /*	 * md5 implementation in JavaScript. * I mourn the wasted CPU cycles. */	function rol(x, n) { return ((x << n) | (x >>> (32 - n))); }	function pad(s) { while (s.length < 8) s = '0' + s;		return s;	} function preprocess(s) { if (window.TextEncoder) { // encoding.spec.whatwg.org — I assume using it is a bit faster. /*global TextEncoder */ var encoder = new TextEncoder("utf-8"); var octets = encoder.encode(s); var grown = new Uint8Array((octets.length + 8) + 64 - ((octets.length + 8) % 64)); grown.set(octets, 0); grown[octets.length] = 0x80; grown.set([				(octets.length <<  3) & 0xff,				(octets.length >>>  5) & 0xff,				(octets.length >>> 13) & 0xff,				(octets.length >>> 21) & 0xff,				(octets.length >>> 29) & 0xff,				0, // (octets.length >>> 37) & 0xff,				0, // (octets.length >>> 45) & 0xff,				0, // (octets.length >>> 53) & 0xff			], grown.length - 8); return grown; }		// fall back to array implementation var r = []; for (var i = 0; i < s.length; ++i) { var c = s.charCodeAt(i); if ((c >= 0xd800) && (c <= 0xdbff)) { var d = s.charCodeAt(++i); if (!((d >= 0xdc00) && (d <= 0xdfff))) // not a paired surrogate? throw new Error("Invalid UTF-16 at " + i); c = ((c & 0x3ff) << 10) | (d & 0x3ff); } else if ((c >= 0xdc00) && (c <= 0xdfff)) throw new Error("Invalid UTF-16 at " + i);

if (c < 128) { r.push(s.charAt(i)); } else if (c < 0x800) { r.push(					0xc0 | (c >>>  6)        ,					0x80 | ( c         & 0x3f)				); } else if (c < 0x10000) { r.push(					0xe0 | (c >>> 12)        ,					0x80 | ((c >>>  6) & 0x3f),					0x80 | ( c         & 0x3f)				); } else if (c < 0x200000) { r.push(					0xf0 | (c >>> 18)        ,					0x80 | ((c >>> 12) & 0x3f),					0x80 | ((c >>>  6) & 0x3f),					0x80 | ( c         & 0x3f)				); } else if (c < 0x4000000) { r.push(					0xf8 | (c >>> 24)        ,					0x80 | ((c >>> 18) & 0x3f),					0x80 | ((c >>> 12) & 0x3f),					0x80 | ((c >>>  6) & 0x3f),					0x80 | ( c         & 0x3f)				); } else if (c < 0x80000000) { r.push(					0xfc | (c >>> 30)        ,					0x80 | ((c >>> 24) & 0x3f),					0x80 | ((c >>> 18) & 0x3f),					0x80 | ((c >>> 12) & 0x3f),					0x80 | ((c >>>  6) & 0x3f),					0x80 | ( c         & 0x3f)				); } else throw new Error("Impossible code point: U+" + c.toString(16)); }

var ol = r.length; r.push(0x80); while ((r.length % 64) !== 56) r.push(0); r.push(			(ol <<  3) & 0xff,			(ol >>>  5) & 0xff,			(ol >>> 13) & 0xff,			(ol >>> 21) & 0xff,			(ol >>> 29) & 0xff,			0, // (ol >>> 37) & 0xff,			0, // (ol >>> 45) & 0xff,			0  // (ol >>> 53) & 0xff		);

return r;	} var r = [ 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,		5, 9, 14, 20, 5,  9, 14, 20, 5,  9, 14, 20, 5,  9, 14, 20,		4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,		6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21	];	var k = [ 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 ];	var h0 = 0x67452301, h1 = 0xefcdab89, h2 = 0x98badcfe, h3 = 0x10325476; s = preprocess(s); for (var off = 0; off < s.length; off += 64) { var a = h0, b = h1, c = h2, d = h3; var w = []; for (var i = 0; i < 16; ++i) { w[i] = s[off + i * 4] | (s[off + i * 4 + 1] << 8) | (s[off + i * 4 + 2] << 16) | (s[off + i * 4 + 3] << 24); }		for (var i = 0; i < 64; ++i) { var f = 0, g = 0; switch (i >>> 4) { case 0: f = (b & c) | ((~b) & d); g = i;				break; case 1: f = (b & d) | ((~d) & c); g = (5 * i + 1) & 0xf; break; case 2: f = b ^ c ^ d;				g = (3 * i + 5) & 0xf; break; case 3: f = c ^ (b | (~d)); g = (7 * i   ) & 0xf; break; }			var t = d;			d = c;			c = b;			b = (b + rol(a + f + k[i] + w[g], r[i])) & 0xffffffff; a = t;		} h0 = (h0 + a) & 0xffffffff; h1 = (h1 + b) & 0xffffffff; h2 = (h2 + c) & 0xffffffff; h3 = (h3 + d) & 0xffffffff; }	return (pad((h3 >>> 0).toString(16)) + pad((h2 >>> 0).toString(16)) + pad((h1 >>> 0).toString(16)) + pad((h0 >>> 0).toString(16))).match(/[0-9a-f][0-9a-f]/gi).reverse.join(''); }

mw.loader.load('//en.wikipedia.org/w/index.php?title=User:Kephir/gadgets/preview.css&action=raw&ctype=text/css&smaxage=21600&maxage=86400', 'text/css');

if (mw.user.options.get('forceeditsummary') === '1') { var editform = document.getElementById('editform'); var sum = document.getElementById('wpSummary'); var sumsum = editform.wpAutoSummary.value; var tried = false; var button = null; sum.addEventListener('change', function (ev) {		tried = true;	}, false); var inputs = editform.getElementsByTagName('input'); for (var i = 0; i < inputs.length; ++i) { inputs[i].addEventListener('click', function (ev) {			button = this;		}, false); }	editform.addEventListener('submit', function (ev) {		if (button !== editform.wpSave) {			return false;		}		if (!tried && md5(sum.value) === sumsum) {			if (!sum.parentNode)				return false; // whatever.			ev.preventDefault;			ev.stopPropagation;			var warn = document.createElement('div');			warn.style.position = 'absolute';			warn.style.left = sum.offsetLeft + 'px';			warn.style.top = (sum.offsetTop + sum.offsetHeight) + 'px';			warn.style.border = '1px solid red';			warn.style.background = 'white';			warn.style.color = 'black';			warn.style.padding = '0.2em';			warn.style.fontSize = 'smaller';			warn.appendChild(document.createTextNode('You have not provided an edit summary. If you click "Save page" again, your edit will be saved without one.'));			warn.addEventListener('click', function (ev) { jQuery(this).fadeOut; });			setTimeout(function { jQuery(warn).fadeOut; }, 3000);			sum.parentNode.appendChild(warn);			sum.focus;			tried = true;		}	}, false); var blocker = document.createElement('input'); blocker.type = 'hidden'; blocker.name = 'wpIgnoreBlankSummary'; blocker.value = '1'; editform.appendChild(blocker); }

});