User:Bornhj/monobook.js

From Wikipedia, the free encyclopedia

If a message on your talk page led you here, please be wary of who left it. The code below could contain malicious content capable of compromising your account; if your account appears to be compromised, it will be blocked. If you are unsure whether the code is safe, you can ask at the appropriate village pump.
Note: After saving, you have to bypass your browser's cache to see the changes. In Internet Explorer and Firefox, hold down the Ctrl key and click the Refresh or Reload button. Opera users have to clear their caches through Tools→Preferences, see the instructions for Opera. Konqueror and Safari users can just click the Reload button.
/* <pre><nowiki>
|| My monobook.js
|| Based loosly upon [[User:Essjay]]'s monobook
|| Creates its own "WP" psuedo-namespace to avoid conflicts
|| Props to everyone whose code is in here somewhere
*/
 
// Declare our namespace - everyone loves namespaces
var WP = {
	// Function: addOnload
	// Add an onload function
	addOnload: function(eventLoad) {
		if (window.addEventListener) window.addEventListener("load", eventLoad, false);
		else if (window.attachEvent) window.attachEvent("onload", eventLoad);
	},
 
	// Function: addlilink
	// Preps a monobook tab link
	addlilink: function(tabs, url, name, id){
	    var na = document.createElement('a');
	    na.href = url;
	    na.appendChild(document.createTextNode(name));
	    var li = document.createElement('li');
	    li.id = id;
	    li.appendChild(na);
	    tabs.appendChild(li);
	    return li;
	},
 
	// Function: showtime
	// Displays UTC Time
	showtime: function() {
	    var timerID;
	    var now = new Date();
	    var timeValue = now.toUTCString().replace(/GMT/, "UTC");
	    document.getElementById('utcdate').firstChild.innerHTML = timeValue;
	    timerID = setTimeout('WP.showtime()', 100);
	},
 
	// Function: addTab
	// Wrapper for addlilink() to add to the monobook top tabs bar
	addTab: function(url, name, id, title, key){ 
	    var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
	    WP.addlilink(tabs, url, name, id, title, key);
	},
 
	// Function: inc
	// Includes a javascript file
	inc : function(file) {
	  var lt = String.fromCharCode(60);
	  var gt = String.fromCharCode(62);
	  document.writeln(lt+'script type="text/javascript" src="/w/index.php?title='+file+'&amp;action=raw&amp;ctype=text/javascript&amp;dontcountme=s"'+gt+lt+'/script'+gt);
	},
 
	// Function: stopRedlinksEditing
	// Removes &action=edit from redlinks 
	stopRedlinksEditing: function(){ 
	    var len=document.links.length;
	    for(var i=0; i<len; ++i) {
	        var l=document.links[i];
	        if (l.className=='new') {
	            l.href=l.href.replace('&action=edit', '');
	        }
	    }
	},
 
	// Function: addForceSummary
	// Adds the onclick event to force an edit summary
	addForceSummary: function() {
	    if(!/&action=edit/.test(window.location.href) && !/&action=submit/.test(window.location.href)) return;
	    if(/&section=new/.test(window.location.href)) return;
	    if(!document.forms.editform) return;
	    document.forms.editform.wpSave.onclick = WP.forceSummary;
	},
 
	// Function: forceSummary
	// Checks the summary and prompts if needed
	forceSummary: function() {
	    if(!document.forms.editform.wpSummary.value.replace(/^(?:\/\\*.*\\*\/)? *(.*) *$/,'$1'))
	    {
	        var r = prompt('Are you sure you want to submit without adding a summary?\nTo add a summary, type it in the box below:',document.forms.editform.wpSummary.value);
	        if(r == null) { return false; }
	        document.forms.editform.wpSummary.value = r;
	    }
	    return true;
	},
 
	// Function: warningTemplate
	// Inserts a specified test template
	warningTemplate: function(template, needsPage, alternate, prePage) {
		if ( !prePage ) {
			if ( needsPage ) {
				var page = prompt("Vandalism to which article?");
				if ( page == null || page == "" ) {
					var edit = "{{subst:" + alternate + "}} ~~" +  "~~";
					var summary = alternate;
				}
				else {
					var edit = "{{subst:" + template + "|" + page + "}} ~~" + "~~";
					var summary = template + " - [[" + page + "]]";
				}
			}
			else {
				var edit = "{{subst:" + template + "}} ~~" + "~~";
				var summary = template;
			}
		}
		else {
			var edit = "{{subst:" + template + "|" + unescape(prePage).replace(/_/g, ' ') + "}} ~~" + "~~";
			var summary = template + " - [[" + unescape(prePage).replace(/_/g, ' ') + "]] (using [[User:Bornhj/gm.js|GML]])";
		}
	  var f = document.editform, t = f.wpTextbox1;
	  if (t.value.length > 0)
	    t.value += '\n';
	  t.value += edit;
	  f.wpSummary.value = summary;
	  f.wpMinoredit.checked = "";
	},
 
	// Function: init
	// Initiates all the other JS
	initJS: function() {
		// Grab our tabs
		var thething = document.getElementById("column-one");
		var tabs = thething.getElementsByTagName('div')[0].getElementsByTagName('ul')[0];
		// Grab our username
		var userName = document.getElementById('pt-userpage').getElementsByTagName('a')[0].innerHTML;
 
		// Add tabs for editing user talk pages
		if ( wgNamespaceNumber == 3 && document.getElementById('wpTextbox1') ) {
			var queryParams = WP.getQueryParams(document.location.href);
			if ( queryParams['fakeaction'] == 'rbwarn' ) {
				// GML warnings
				var page = escape(queryParams['page']);
			}
			else {
				var page = null;
			}
			WP.addTab('javascript:WP.warningTemplate("test1-n", true, "test1", ' + (!page?'null':'"'+page+'"') + ')',"t1", 'ca-tmpl-t1');
			WP.addTab('javascript:WP.warningTemplate("test1a-n", true, "test1a", ' + (!page?'null':'"'+page+'"') + ')',"t1a", 'ca-tmpl-t1a');
			WP.addTab('javascript:WP.warningTemplate("test2-n", true, "test2", ' + (!page?'null':'"'+page+'"') + ')',"t2", 'ca-tmpl-t2');
			WP.addTab('javascript:WP.warningTemplate("test2a-n", true, "test2a", ' + (!page?'null':'"'+page+'"') + ')',"t2a", 'ca-tmpl-t2a');
			WP.addTab('javascript:WP.warningTemplate("test3-n", true, "test3", ' + (!page?'null':'"'+page+'"') + ')',"t3", 'ca-tmpl-t3');
			WP.addTab('javascript:WP.warningTemplate("test3a-n", true, "test3a", ' + (!page?'null':'"'+page+'"') + ')',"t3a", 'ca-tmpl-t3a');
			WP.addTab('javascript:WP.warningTemplate("test4-n", true, "test4", ' + (!page?'null':'"'+page+'"') + ')',"t4", 'ca-tmpl-t4');
			WP.addTab('javascript:WP.warningTemplate("bv-n", true, "bv", ' + (!page?'null':'"'+page+'"') + ')',"bv", 'ca-tmpl-bv');
			WP.addTab('javascript:WP.warningTemplate("spam1", true, "null", ' + (!page?'null':'"'+page+'"') + ')',"spam", 'ca-tmpl-spam');
			WP.addTab('javascript:WP.warningTemplate(prompt("Which template?"), true, "null", ' + (!page?'null':'"'+page+'"') + ')',"cus", 'ca-tmpl-cus');
		}
 
		// Add tabs for a User page FIXME: wgNamespace 2/3
		if ( document.title.indexOf("User") == 0 ) {
			// Work out their username
			if ( document.getElementById('ca-viewsource') ) {
				var editlk = document.getElementById('ca-viewsource').getElementsByTagName('a')[0].href;
			}
			else {
				var editlk = document.getElementById('ca-edit').getElementsByTagName('a')[0].href;
			}
			editlk = editlk.substring(editlk.indexOf('title=') + 6, editlk.lastIndexOf('&action=edit'));
			editlk = editlk.substring(editlk.indexOf(':') + 1);
			var slloc = editlk.indexOf('/');
			if(slloc > 0) editlk = editlk.substring(0, slloc);
 
			// Add "listusers" tab
			WP.addTab('/w/index.php?title=Special:Listusers&group=&username=' + editlk, 'list', '');
 
			// Add "contributions" tab
			WP.addTab('/wiki/Special:Contributions/' + editlk, 'contribs', '');
 
			// Add "userspace" tab
			WP.addTab('/w/index.php?title=Special:Prefixindex&namespace=2&from=' + editlk, 'userspace', '');
 
			// Add "edit count" tabs
			WP.addTab('http://en.wikipedia.org/wiki/User:Interiot/Tool2/code.js?username=' + editlk, 'count (js)', '');
			WP.addTab('http://tools.wikimedia.de/~essjay/edit_count/Count.php?username=' + editlk + '&submit=Count', 'count (ts)', '');
			// Add "whois" tab
			WP.addTab('http://tools.wikimedia.de/~essjay/nqt.php?queryType=arin&target=' + editlk, 'whois');
 
			// Add "blocklog" tab
			WP.addTab('/wiki/Special:Log/block?page=User:' + editlk, 'blocklog', 'ca-blocklog');
 
			// Rename the user tab
			document.getElementById('ca-nstab-user').getElementsByTagName('a')[0].innerHTML='user';
		}
 
		// Add the purge and last diff tabs
		if ( document.getElementById('ca-history') ) { // FIXME: use wgIsArticle + wgArticleId (non-existant articles set wgIsArticle to true but have an ID of 0
			var thething = document.getElementById("column-one");
			var tabs = thething.getElementsByTagName('div')[0].getElementsByTagName('ul')[0];
			WP.addTab(document.getElementById('ca-history').getElementsByTagName('a')[0].href.replace( /action=history/, 'diff=0' ), 'last diff', 'ca-diff');
			WP.addTab(document.getElementById('ca-history').getElementsByTagName('a')[0].href.replace( /action=history/, 'action=purge'), 'purge', 'ca-purge');
		}
 
		// Rename interface parts
		if ( document.getElementById('pt-mytalk') ) {
			document.getElementById('pt-mytalk').getElementsByTagName('a')[0].innerHTML='talk';
		}
		if ( document.getElementById('pt-preferences') ) {
			document.getElementById('pt-preferences').getElementsByTagName('a')[0].innerHTML='prefs';
		}
		if ( document.getElementById('pt-watchlist') ) {
			document.getElementById('pt-watchlist').getElementsByTagName('a')[0].innerHTML='w/list';
		}
		if ( document.getElementById('pt-mycontris') ) {
			document.getElementById('pt-mycontris').getElementsByTagName('a')[0].innerHTML='c/tribs';
		}
		if ( document.getElementById('pt-logout') ) {
			document.getElementById('pt-logout').getElementsByTagName('a')[0].innerHTML='logout';
		}
		if ( document.getElementById('pt-mycontris') ) {
			document.getElementById('pt-mycontris').getElementsByTagName('a')[0].href='http://en.wikipedia.org/w/index.php?title=Special:Contributions&target=' +userName + '&offset=0&limit=500';
		}
		if ( document.getElementById('ca-talk') ) {
			document.getElementById('ca-talk').getElementsByTagName('a')[0].innerHTML='talk';
		}
		if ( document.getElementById('ca-edit') ) {
			document.getElementById('ca-edit').getElementsByTagName('a')[0].innerHTML='<span style="padding-left: 50px; padding-right: 50px;">edit</span>';
		}
		if ( document.getElementById('ca-viewsource') ) {
			document.getElementById('ca-viewsource').getElementsByTagName('a')[0].innerHTML='<strike>protected</strike>';
		}
		//Show the UTC clock
		var toplinks = document.getElementById('p-personal').getElementsByTagName('ul')[0];
		WP.addlilink(toplinks, '#', '', 'utcdate');
		WP.showtime();
	},
 
	// Function: loadJS()
	// Loads all the other JS and includes needed files
	loadJS: function() {
		if ( navigator.appVersion.indexOf("MSIE") == -1 ) {
			//addOnload(rearrangeNodes);
			//WP.addOnload(WP.statusChanger);
			WP.addOnload(WP.stopRedlinksEditing); 
			WP.addOnload(WP.initJS);
			//WP.addOnload(WP.addForceSummary);
			popupRevertSummaryPrompt=true;
			popupEditCounterTool='custom';
			popupEditCounterUrl='http://en.wikipedia.org/wiki/Special:Watchlist?ectarget=$1';
			WP.inc('User:Lupin/popupsdev.js');
			WP.inc('User:Cacycle/wikEd.js');
			//WP.inc('User:Lupin/recent2.js');
			//WP.inc('User:Lupin/editcount.js');
			//WP.inc('User:Interiot/Tool2/code.js');
			//WP.inc('User:Bornhj/gm.js');
			//WP.inc('User:Zocky/SearchBox.js');
			//WP.inc('User:Lightdarkness/aiv.js');
		}
	},
 
	// Function: rearrangeNodes()
	// Experimental, adds an empty bar to the bottom of the page
	rearrangeNodes: function() {
		var newNode = document.createElement('div');
		newNode.style.position = "fixed";
		newNode.style.bottom = "0";
		newNode.style.left = "0";
		newNode.style.width = "100%";
		newNode.style.height = "20px";
		newNode.style.backgroundColor = "white";
		newNode.style.border = "1px solid #aaa";
		newNode.style.zIndex = "1000";
		var attachTo = document.getElementById('globalWrapper');
		attachTo.appendChild(newNode);
	},
 
	// Function: addlilinklcon(tabs, url, text, image, id)
	// Adds an li link to the tabs, with an icon
	addlilinkicon: function(tabs, linkURL, linkText, linkImage, linkId) {
	    var na = document.createElement('a');
	    na.href = linkURL;
	    na.appendChild(document.createTextNode(linkText));
	    var li = document.createElement('li');
	    li.id = linkId;
	    li.style.background = "url('" + linkImage + "') top left no-repeat";
	    li.style.paddingLeft = "14px";
	    li.style.textTransform = "none";
	    li.appendChild(na);
	    tabs.appendChild(li);
	    return li;
	},
 
	// Function: createAJAX()
	// Creates an XMLHTTPRequest!
	createAJAX: function() {
		var http = false;
		if (window.XMLHttpRequest) { // gecko, webkit, opera
			http = new XMLHttpRequest();
		} else if (window.ActiveXObject) { // ie
			try {
				http = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
			try {
				http = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
			}
		}
		return http;
	},
 
	// Function: statusChanger()
	// Loads up the status changer (obviously....)
	statusChanger: function() {
		var userName = document.getElementById('pt-userpage').getElementsByTagName('a')[0].innerHTML;
		var theTabs = document.getElementById('p-personal').getElementsByTagName('ul')[0];
		WP.addlilinkicon(theTabs, "javascript:WP.changeStatus('online', this)", "on", "http://upload.wikimedia.org/wikipedia/commons/thumb/9/94/Symbol_support_vote.svg/12px-Symbol_support_vote.svg.png", "p-status-online");
		WP.addlilinkicon(theTabs, "javascript:WP.changeStatus('busy', this)", "busy", "http://upload.wikimedia.org/wikipedia/commons/thumb/8/89/Symbol_delete_vote.svg/12px-Symbol_delete_vote.svg.png", "p-status-busy");
		WP.addlilinkicon(theTabs, "javascript:WP.changeStatus('offline', this)", "off", "http://upload.wikimedia.org/wikipedia/commons/thumb/7/7f/Symbol_oppose_vote.svg/12px-Symbol_oppose_vote.svg.png", "p-status-offline");
	},
 
	// Function: parseXML(XMLString)
	// Parses me some XML
	parseXML: function(XMLString) {
		if (document.implementation.createDocument) {
			var XMLParser = new DOMParser();
			return XMLParser.parseFromString(XMLString, "text/xml");
		}
		else if (window.ActiveXObject) {
			var XMLParser = new ActiveXObject("Microsoft.XMLDOM");
			XMLParser.async = "false";
			ret = XMLParser.loadXML(XMLString);      
			if (!ret)
				return null;
			return XMLParser.documentElement;
		}
		return null;
	},
 
	// Function: changeStatus(newStatus)
	// Does some AJAX voodoo to change status
	changeStatus: function(newStatus, newStatusLink) {
		var httpr = WP.createAJAX();
		httpr.open('GET', 'http://en.wikipedia.org/w/index.php?title=User:Bornhj/Status&action=edit', true);
		httpr.send(null);
		httpr.onreadystatechange = function() {
			if ( httpr.readyState == 4 ) {
				var POSTData = '';
				// Make an XML parser
				// Stolen from godmode-lite
				var editPage = WP.parseXML(httpr.responseText);
				var formElems = editPage.getElementById('editform').getElementsByTagName('input');
				for ( i=0; i<formElems.length; i++ ) {
					if ( formElems[i].name == 'wpSummary' ) {
						formElems[i].value = "Updating status: " + newStatus;
					}
					else if ( formElems[i].name == 'wpMinoredit' ) {
						formElems[i].value = '1';
					}
					else if ( formElems[i].name == 'wpWatchthis' ) {
						formElems[i].value = "on";
					}
					else if ( formElems[i].name == 'wpPreview' ) {
						continue;
					}
					else if ( formElems[i].name == 'wpDiff' ) {
						continue;
					}
					POSTData += escape(formElems[i].name) + '=' + escape(formElems[i].value) + '&';
				}
				POSTData += 'wpTextbox1=' + escape('{{' + 'User:Bornhj/StatusBar|' + newStatus + '|~~' + '~~' + '~}}');
				// POST it back!
				var httpr2 = WP.createAJAX();
				httpr2.open('POST', 'http://en.wikipedia.org/w/index.php?title=User:Bornhj/Status&action=submit', true);
				httpr2.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
				httpr2.send(POSTData);
				httpr2.onreadystatechange = function() {
					if ( httpr2.readyState == 4 ) {
						var responsePage = WP.parseXML(httpr2.responseText);
						if ( !responsePage.getElementById('editform') ) {
							// Hackish, I know, but it's an easy way to see whether it succeeded :)
							// FIXME: use wgIsArticle?
							alert('Status updated successfully.');
						}
					}
				}
			}
		}
	},
 
	// Function: getQueryParams
	// Returns a hash map of the query params in the specified url
	getQueryParams: function(theUrl) {
		var UrlS = theUrl.split('?')[1];
		var UrlPairs = UrlS.split('&');
		var urlParams = new Object;
		for ( pairId in UrlPairs ) {
			var thisPair = UrlPairs[pairId].split('=');
			urlParams[thisPair[0]] = thisPair[1];
		}
		return urlParams;
	}
}
 
// Start 'er up!
WP.loadJS();
 
/*
|| End of monobook.js
|| </nowiki></pre>
*/