User:Gakusha/monobook.js

// [[User:Lupin/popups.js]]

importScript('User:Lupin/popups.js');

/* -----------------------------------------------------------------------------
 God-like Monobook skin
 (c) 2005-2006 Sam Hocevar <[email protected]>
 $Id: godmode-light.js 1106 2006-04-03 20:25:37Z sam $
 -----------------------------------------------------------------------------
 -----------------------------------------------------------------------------
 Language support, taken from phase3/languages
 -----------------------------------------------------------------------------
 */
var rollbacklink = 'rollback';
var cantrollback = 'Cannot revert edit; last contributor is only author of this page.';
var alreadyrolled = 'Cannot rollback last edit of [[$1]] by [[User:$2|$2]] ([[User talk:$2|Talk]]); someone else has edited or rolled back the page already. Last edit was by [[User:$3|$3]] ([[User talk:$3|Talk]]). ';
var revertpage = 'Reverted edits by [[Special:Contributions/$2|$2]] to last version by $1';

 // error messages  language support (en:, de:)
var ERROR_MESSAGE = 'No ['+rollbacklink+'] Button can be produced. This can happen by new MediaWiki version or other changes at the software. Inform please one of the authors of the Godmode script.';
var UNABLE_TO_DETERMINE_VANDAL = 'The vandal cannot be determined.';
var NOT_TOP_VERSION = 'Cannot revert edit; That is not the last version difference.';
var ERROR_XML = 'Giving up! :( Cannot create an XMLHTTP instance.';
var PARAMETER_MISSING = 'Cannot display revert button; A parameter is missing.';


// -----------------------------------------------------------------------------
// XMLHttpRequest support
// -----------------------------------------------------------------------------
if (document.implementation.createDocument) var gml_xmlparser = new DOMParser();
var gml_xmlhttp;

function gml_XMLParse(string){
	if (document.implementation.createDocument)
		return gml_xmlparser.parseFromString(string, "text/xml");
	else if (IE){
		var gml_xmldoc = new ActiveXObject("Microsoft.XMLDOM");
		//var gml_xmldoc = new ActiveXObject("Msxml2.DOMDocument.3.0");
		gml_xmldoc.async = false;
		//gml_xmldoc.validateOnParse = true;
		ret = gml_xmldoc.loadXML(string);
		myErr = gml_xmldoc.parseError;
		if (myErr.errorCode || !ret){
			showError("Error: " + ERROR_XML + myErr.reason);
			return null;
		}
		return gml_xmldoc.documentElement
	}
	return null
}

function HTTPClient(){
  var http = false;
  if(window.XMLHttpRequest) http = new XMLHttpRequest();
  else if (IE){
    try{
      http = new ActiveXObject("Msxml2.XMLHTTP")
    } catch(e){
      try{
        http = new ActiveXObject("Microsoft.XMLHTTP")
      } catch(e){}
    }
  }
  return http
};

// -----------------------------------------------------------------------------
// MD5 hash calculator
// -----------------------------------------------------------------------------
// Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
// Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
// Distributed under the BSD License
// See http://pajhome.org.uk/crypt/md5 for more info.
// -----------------------------------------------------------------------------
var hexcase = 0;
var b64pad = "";
var chrsz = 8;

function hex_md5(s){return binl2hex(core_md5(str2binl(s), s.length * chrsz))};

function core_md5(x,len){
 x[len>>5]|=0x80<<((len)% 32);
 x[(((len+64)>>>9)<<4)+14]=len;
 var a=1732584193, b=-271733879, c=-1732584194, d=271733878;
 for(var i=0;i<x.length;i+=16){
  var olda=a, oldb=b, oldc=c, oldd=d;
  a=md5_ff(a,b,c,d,x[i+0],7,-680876936);d=md5_ff(d,a,b,c,x[i+1],12,-389564586);c=md5_ff(c,d,a,b,x[i+2],17,606105819);b=md5_ff(b,c,d,a,x[i+3],22,-1044525330);a=md5_ff(a,b,c,d,x[i+4],7,-176418897);d=md5_ff(d,a,b,c,x[i+5],12,1200080426);c=md5_ff(c,d,a,b,x[i+6],17,-1473231341);b=md5_ff(b,c,d,a,x[i+7],22,-45705983);a=md5_ff(a,b,c,d,x[i+8],7,1770035416);d=md5_ff(d,a,b,c,x[i+9],12,-1958414417);c=md5_ff(c,d,a,b,x[i+10],17,-42063);b=md5_ff(b,c,d,a,x[i+11],22,-1990404162);a=md5_ff(a,b,c,d,x[i+12],7,1804603682);d=md5_ff(d,a,b,c,x[i+13],12,-40341101);c=md5_ff(c,d,a,b,x[i+14],17,-1502002290);b=md5_ff(b,c,d,a,x[i+15],22,1236535329);
  a=md5_gg(a,b,c,d,x[i+1],5,-165796510);d=md5_gg(d,a,b,c,x[i+6],9,-1069501632);c=md5_gg(c,d,a,b,x[i+11],14,643717713);b=md5_gg(b,c,d,a,x[i+0],20,-373897302);a=md5_gg(a,b,c,d,x[i+5],5,-701558691);d=md5_gg(d,a,b,c,x[i+10],9,38016083);c=md5_gg(c,d,a,b,x[i+15],14,-660478335);b=md5_gg(b,c,d,a,x[i+4],20,-405537848);a=md5_gg(a,b,c,d,x[i+9],5,568446438);d=md5_gg(d,a,b,c,x[i+14],9,-1019803690);c=md5_gg(c,d,a,b,x[i+3],14,-187363961);b=md5_gg(b,c,d,a,x[i+8],20,1163531501);a=md5_gg(a,b,c,d,x[i+13],5,-1444681467);d=md5_gg(d,a,b,c,x[i+2],9,-51403784);c=md5_gg(c,d,a,b,x[i+7],14,1735328473);b=md5_gg(b,c,d,a,x[i+12],20,-1926607734);
  a=md5_hh(a,b,c,d,x[i+5],4,-378558);d=md5_hh(d,a,b,c,x[i+8],11,-2022574463);c=md5_hh(c,d,a,b,x[i+11],16,1839030562);b=md5_hh(b,c,d,a,x[i+14],23,-35309556);a=md5_hh(a,b,c,d,x[i+1],4,-1530992060);d=md5_hh(d,a,b,c,x[i+4],11,1272893353);c=md5_hh(c,d,a,b,x[i+7],16,-155497632);b=md5_hh(b,c,d,a,x[i+10],23,-1094730640);a=md5_hh(a,b,c,d,x[i+13],4,681279174);d=md5_hh(d,a,b,c,x[i+0],11,-358537222);c=md5_hh(c,d,a,b,x[i+3],16,-722521979);b=md5_hh(b,c,d,a,x[i+6],23,76029189);a=md5_hh(a,b,c,d,x[i+9],4,-640364487);d=md5_hh(d,a,b,c,x[i+12],11,-421815835);c=md5_hh(c,d,a,b,x[i+15],16,530742520);b=md5_hh(b,c,d,a,x[i+2],23,-995338651);
  a=md5_ii(a,b,c,d,x[i+0],6,-198630844);d=md5_ii(d,a,b,c,x[i+7],10,1126891415);c=md5_ii(c,d,a,b,x[i+14],15,-1416354905);b=md5_ii(b,c,d,a,x[i+5],21,-57434055);a=md5_ii(a,b,c,d,x[i+12],6,1700485571);d=md5_ii(d,a,b,c,x[i+3],10,-1894986606);c=md5_ii(c,d,a,b,x[i+10],15,-1051523);b=md5_ii(b,c,d,a,x[i+1],21,-2054922799);a=md5_ii(a,b,c,d,x[i+8],6,1873313359);d=md5_ii(d,a,b,c,x[i+15],10,-30611744);c=md5_ii(c,d,a,b,x[i+6],15,-1560198380);b=md5_ii(b,c,d,a,x[i+13],21,1309151649);a=md5_ii(a,b,c,d,x[i+4],6,-145523070);d=md5_ii(d,a,b,c,x[i+11],10,-1120210379);c=md5_ii(c,d,a,b,x[i+2],15,718787259);b=md5_ii(b,c,d,a,x[i+9],21,-343485551);
  a=safe_add(a,olda);
  b=safe_add(b,oldb);
  c=safe_add(c,oldc);
  d=safe_add(d,oldd)
 }
 return Array(a,b,c,d)
};

function md5_cmn(q,a,b,x,s,t){return safe_add(bit_rol(safe_add(safe_add(a,q),safe_add(x,t)),s),b)};
function md5_ff(a,b,c,d,x,s,t){return md5_cmn((b&c)|((~b)&d),a,b,x,s,t)};
function md5_gg(a,b,c,d,x,s,t){return md5_cmn((b&d)|(c&(~d)),a,b,x,s,t)};
function md5_hh(a,b,c,d,x,s,t){return md5_cmn(b^c^d,a,b,x,s,t)};
function md5_ii(a,b,c,d,x,s,t){return md5_cmn(c^(b|(~d)),a,b,x,s,t)};

function safe_add(x, y){
  var lsw = (x & 0xFFFF) + (y & 0xFFFF), msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return (msw << 16) | (lsw & 0xFFFF)
};

function bit_rol(num, cnt){return (num << cnt) | (num >>> (32 - cnt))};

function str2binl(str){
  var bin = Array();
  var mask = (1 << chrsz) - 1;
  for(var i = 0; i < str.length * chrsz; i += chrsz)
    bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
  return bin
};

function binl2hex(binarray){
  var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
  var str = "";
  for(var i = 0; i < binarray.length * 4; i++)
    str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
           hex_tab.charAt((binarray[i>>2] >> ((i%4)*8  )) & 0xF);
  return str
};

// -----------------------------------------------------------------------------
// Our nice Revert functions
// -----------------------------------------------------------------------------
var gml_vandal, gml_editor, gml_url;
var IE=(window.ActiveXObject)?true:false;

function PerformRevert(){
  var l, token = '', revert = false;

	if (!(window.bodyContent = document.getElementById('bodyContent')))	 
		window.bodyContent = document.getElementById('article');

  // Look for '&fakeaction=rollback' in URL
  gml_url = location.pathname;
  l = location.search.substring(1).split('&');
  for (i = 0; i < l.length; i++){
    var n = l[i].indexOf('=');
    var name = l[i].substring(0, n);
    if (name == 'fakeaction'){
      if (l[i].substring(n + 1) == 'rollback') revert = true
    }
    else if (name == 'vandal') gml_vandal = decodeURI(l[i].substring(n + 1));
    else if (name == 'token') token = decodeURI(l[i].substring(n + 1));
    else if (name == 'title') gml_url += '?' + l[i];
  }
  if (!revert) return;
  bodyContent.innerHTML = 'Please wait, reverting edits by ' + gml_vandal + '...';
  // Avoid XSS kiddies by using a special token
  if (token == '' || token != hex_md5(gml_url + gml_vandal + document.cookie))
    return bodyContent.innerHTML += '<br />Bad authentication token!';
  gml_xmlhttp = HTTPClient();
  if (!gml_xmlhttp) return showError(ERROR_XML);
  history_url = gml_url + '&action=history&limit=25';  //
  bodyContent.innerHTML += '<br />Getting article history (' + history_url + ')...';
  gml_xmlhttp.open("GET", history_url, true);
  gml_xmlhttp.onreadystatechange = RevertStepTwo;
  gml_xmlhttp.send(null)
};

function parseXMLhack(xml){  // fixed: Hack for a MediaWiki bugs
	xml = xml.replace(/<body .*\"ns-(.*)\">/, '<body class="ns-$1">');
	rer = xml.match(/<h1 .*<\/h1>/)[0].replace(/&/g, '&amp;');
	if (rer) xml = xml.replace(/<h1 .*<\/h1>/, rer);
	return xml
};

function RevertStepTwo(){
	if (gml_xmlhttp.readyState != 4) return;
	var l, oldid = false;
	 // Get the vandal and new editor names
	gml_vandal = gml_vandal.replace(/_/g, ' ');
	gml_editor = '',
	ERROR_MESSAGE = 'failure';
	xml = parseXMLhack(gml_xmlhttp.responseText);
	xmlDoc = gml_XMLParse(xml);
	if (!xmlDoc || !xmlDoc.hasChildNodes())
		return bodyContent.innerHTML +=
		'<br />Failed to parse XML data returned by the server.' +
		'<br /><b>Hint: try to disable both "Enable section editing by right-clicking on section titles (JavaScript)" and "Edit pages on double click (JavaScript)" in your editing preferences until a proper fix is found<\/b>.'+ 
		'<br />Dump of the unparseable page : <br />' + xml.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
		// IE: added by Olliminatore 03.05.2006
	l = (IE)?xmlDoc.selectSingleNode('//*[@id="pagehistory"]').childNodes:
		xmlDoc.getElementById('pagehistory').getElementsByTagName('li');
	name = l[0].getElementsByTagName('span')[0].getElementsByTagName('a')[0].firstChild.nodeValue.replace(/_/g, ' ');
	if (name == gml_vandal){
		for (i = 1; i < l.length; i++){
			name = l[i].getElementsByTagName('span')[0].getElementsByTagName('a')[0].firstChild.nodeValue.replace(/_/g, ' ');
			if (name != gml_vandal){
				oldid = l[i].getElementsByTagName('input')[0].getAttribute('value');
				gml_editor = name;
				break
			}
		}
	}
	else {//if (!oldid)
	  return showError('Last editor is ' + name + ', not ' + gml_vandal + '!');
	}
	if (gml_editor == '') {// FIXME: if over 25 edits, than next page?action=history
		return showError(gml_vandal + ' is the only editor!');
	}
	gml_xmlhttp = HTTPClient();
	if (!gml_xmlhttp) return showError(ERROR_XML);
	bodyContent.innerHTML += '<br />Getting article edit form (GET' + gml_url + '&action=edit&oldid=' + oldid + ')...';
	gml_xmlhttp.open('GET', gml_url + '&action=edit&oldid=' + oldid, true);
	gml_xmlhttp.onreadystatechange = RevertStepThree;
	gml_xmlhttp.send(null)
};

function RevertStepThree(){
  if (gml_xmlhttp.readyState != 4) return;
  var form, newform, l;
  // Insert the downloaded form in our current page, using
  // only hidden form inputs.
	// IE: added by Olliminatore 03.05.2006
	xmlDoc = gml_XMLParse(parseXMLhack(gml_xmlhttp.responseText));
	form = (IE)? xmlDoc.selectSingleNode('//*[@id="editform"]') :
		xmlDoc.getElementById('editform');
	l = form.getElementsByTagName('textarea');
	newform = document.createElement('form');
	for (i = l.length; i--;){
		var t = document.createElement('input');
		t.type = 'hidden',
		t.name = l[i].getAttribute('name');
		t.value = (IE)?l[i].nodeTypedValue:l[i].value;  //nodeValue don't work for FF
		newform.appendChild(t)
	}
	l = form.getElementsByTagName('input');
	for (i = l.length; i--;){
	liname = l[i].getAttribute('name');
		if (liname == 'wpSummary')
			l[i].setAttribute('value', revertpage.replace(/\$1/g, gml_editor).replace(/\$2/g, gml_vandal));
		else if (liname == 'wpMinoredit') l[i].setAttribute('value', '1');
		else if (liname == 'wpWatchthis'){
			if (!l[i].getAttribute('checked')) continue; // Don’t touch the "watch" status
			l[i].setAttribute('value', "on")
    }
    else if (liname == 'wpPreview' || liname == 'wpDiff') continue;
		l[i].setAttribute('type', 'hidden');
		if (IE) newform.insertAdjacentHTML('beforeEnd', l[i].xml);
		else newform.appendChild(l[i]);
	}
	newform.style.visibility='hidden'; // not really needed
	newform.name = form.getAttribute('name');
	newform.method = form.getAttribute('method');
	newform.id = form.getAttribute('id');
	newform.action = form.getAttribute('action');
	bodyContent.innerHTML += '<br />Submitting form...';
	bodyContent.appendChild(newform);
	// Submit the form
	newform.submit()
};

// -----------------------------------------------------------------------------
// Add revert buttons to the page
// -----------------------------------------------------------------------------
function AddRevertButtons(){
	var l, article = '', vandal;
	this._appendLink = function (node,article,vandal){
		// node = strong element
		link = document.createElement('a')
		link.setAttribute('href', article + '&fakeaction=rollback&vandal=' + encodeURI(vandal) + '&token=' + hex_md5(article + vandal + document.cookie));
		link.appendChild(document.createTextNode(rollbacklink));
		node.appendChild(document.createTextNode(' ['));
		node.appendChild(link);
		node.appendChild(document.createTextNode(']')); 	
	}
	// Add 'revert' links to a contributions page
		var contribution_pos = location.href.indexOf(':Contributions') + 14;
		if (contribution_pos != 13){
			var a, c;
			if (location.href.indexOf('target=',contribution_pos) == -1){ // after /wiki/Spezial:Contributions/?
				c = location.href.substr(contribution_pos); // content user
				if (c.length < 2)
					return bodyContent.innerHTML += '<p style="color: RosyBrown;"><small>Godmode Info: ' + PARAMETER_MISSING + '<\/small><\/p>';
			}
		c = document.getElementById('contentSub');
		a = c.getElementsByTagName('a');
		// (1. Version, von Sam Hocevar)
		//if (a.length >= 2) vandal = a[0].innerHTML; (clasht leider mit dem Mark-Admin-Skript)
		//else vandal = c.innerHTML.replace(/ \(.*/, '').replace(/.* /, '');
		// (2. Version, von Littl)
		// if (a.length == 2) vandal = c.innerHTML.replace(/ \(.*/,'').replace(/.* /,'');
		// else vandal = c.innerHTML.replace(/ \(.*/, '').replace(/.*">/,'').replace(/<.*/,'');
		// (3. Version, von PDD)
		if (a.length == 4) // four anchors in contentSub -> registered  User
			vandal = a[0].innerHTML;
		else if (a.length == 3) // three  anchors in contentSub -> IP
			vandal = c.innerHTML.replace(/ \(.*/, '').replace(/^[\D]*/,''); //FIXME: need optimizing
		else // sonstige Fälle (sollte es aber eigentlich nicht geben)
			vandal = c.innerHTML.replace(/ \(.*/, '').replace(/.*>/,'').replace(/<.*/,'');
		if (!vandal) return showError(UNABLE_TO_DETERMINE_VANDAL);
		l = bodyContent.getElementsByTagName('li');
		for (i = 0; i < l.length; i++){
			var t = l[i].innerHTML;
			// If we are already a sysop on this wiki, abort
			if (t.indexOf('>' + rollbacklink + '<\/a>]') != -1) return;
			if (t.indexOf('<strong>(') != -1 || t.indexOf('<strong> (') != -1) {
			 article = l[i].getElementsByTagName('a')[0].href.split('&')[0].replace(/[^\/]*\/\/[^\/]*/, '');
			 this._appendLink(l[i].lastChild, article, vandal);
			}
		}
	}
	// Add 'revert' links to a diff page
	else if (location.href.indexOf('&diff=') != -1){
		l = bodyContent.getElementsByTagName('td');
		for (i = 0; i < l.length; i++){
			if (l[i].className == 'diff-otitle')
				article = l[i].getElementsByTagName('a')[0].href.split('&')[0].replace(/[^\/]*\/\/[^\/]*/, '');
			else if (l[i].className == 'diff-ntitle'){
				var toplink = l[i].getElementsByTagName('a')[0].href;
				// (href-innerHTML Version by  Olliminatore)
				vandal = l[i].getElementsByTagName('a')[3].innerHTML // fixed: [1]-[2] 31.05.2006 
				if (article != '' && toplink.indexOf('oldid=') == -1){
					this._appendLink(l[i].firstChild, article, vandal);
					if (!vandal) return showError(UNABLE_TO_DETERMINE_VANDAL);
				}
				else
					bodyContent.innerHTML += '<p style="color: RosyBrown;"><small>Godmode Info: ' + NOT_TOP_VERSION + '<\/small><\/p>';
				break;
			}
		}
	}
};
 
function showError(msg){ // show error message with red border
	msg = '<p style="background-color: Maroon; color: White; border: solid Red; padding: 1ex; font: bold 90% system">Godmode Warning: ' + msg + ' (' + ERROR_MESSAGE + ')<\/p>';
	bodyContent.innerHTML = msg + bodyContent.innerHTML;
}
// -----------------------------------------------------------------------------
// Modify the page once it is loaded
// -----------------------------------------------------------------------------
addOnloadHook(PerformRevert); // limited load possible?
addOnloadHook(AddRevertButtons);

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.