Jump to content

User:Padenton/DelsortMenu.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Padenton (talk | contribs) at 03:33, 4 May 2015 (Changing US to A-M/N-Z.). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
/*********************************************************************
 **                ***WARNING: GLOBAL GADGET FILE***                 **
 **         any changes to this file will affect many users          **
 **          please discuss changes on the talk page or at           **
 **             [[Wikipedia talk:Gadget]] before editing             **
 **     (consider dropping the script author a note as well...)      **
 **********************************************************************
 **        SOURCED BY [[MediaWiki:Gadget-dropdown-menus.js]]         **
 *********************************************************************/
//<nowiki>
// Script:         MoreMenu.js
// Version:        4.1.7
// Author:         MusikAnimal
// Documentation:  [[User:MusikAnimal/MoreMenu]]
// GitHub:         https://github.com/MusikAnimal/MoreMenu
// Prerequisites:  MediaWiki version 1.8 or higher
//                 jStorage via ResourceLoader
//                 Any modern broswer or IE8+
//
// Text available under the Creative Commons Attribution-ShareAlike License (CC BY-SA 3.0)
//

		// Modifications to add delsort by [[User:Padenton]]
	function defineLink(category) {
		addPortletLink('p-delsort', 'javascript:doDelsort("' + category + '")', category, '', 'delsort XfD into ' + category + '.');
	}

	function delsortIt() {
		x = prompt("Category: ");
		if (x != null) {
			//TODO: Add check to make sure valid category
			doDelsort(x);
		}
		else {
			alert('Delsort cancelled!');
		}
	}

	function doDelsort(cat) {
			var url = "//en.wikipedia.org/w/api.php?action=tokens&format=json&type=edit";
			var xhr = new XMLHttpRequest();
			xhr.open("GET", url); //Code now working, was set to async
			xhr.send();
			xhr.onreadystatechange = function() {
				if (xhr.readyState == 4 && xhr.status == 200) {
					var resp = JSON.parse(xhr.responseText);
					console.log("Token first: ", resp.tokens.edittoken);
					$.each(resp, function(i, v) {
						console.log(i, "=", v);
					});
					var etoken = resp.tokens.edittoken;
					console.log("The token is: ", etoken);
					if (cat != null) {
						var editData = {
							action: "edit",
							format: "json",
							summary: "Listing at [[WP:DELSORT]] under " + cat + " ([[WP:FWDS|FWDS]])",
							token: etoken,
							title: mw.config.get('wgPageName'),
							appendtext: "\{\{subst:Delsort|" + cat + "|\~\~\~\~\}\}"
						};
						$.each(editData, function(i, v) {
							console.log(i, "=", v);
						});
						$.post('//en.wikipedia.org/w/api.php', editData, function(data) {
							jQuery.each(data, function(index, value) {
								console.log("index", index, "value", value);
							});
						});
						// Add to the Delsort page 
						//First, get the content
						$.post('//en.wikipedia.org/w/api.php', {
							action: 'query',
							format: 'json',
							prop: 'revisions',
							rvprop: 'content',
							rvlimit: '1',
							titles: 'Wikipedia:WikiProject Deletion sorting/' + cat
						}, function(data) {
							$.each(data.query.pages, function(i, v) {
								window.editContent = v.revisions[0]['*'].replace('directly below this line -->', 'directly below this line -->\n\{\{' + mw.config.get('wgPageName') + '\}\}');
							});
							var editData = {
								action: "edit",
								format: "json",
								token: etoken,
								summary: "Listing [[" + mw.config.get('wgPageName') + "]] ([[WP:FWDS|FWDS]])",
								title: 'Wikipedia:WikiProject Deletion sorting/' + cat,
								text: window.editContent
							};
							$.each(editData, function(i, v) {
								console.log(i, "=", v);
							});
							$.post('//en.wikipedia.org/w/api.php', editData, function(data) {
								jQuery.each(data, function(index, value) {
									console.log("index", index, "value", value);
								});
							});
							alert('Delsort complete.');
						});
					}
				}
			}
		}
		//end delsort functions


(function() {
	var api = new mw.Api(),
		namespaceNumber = mw.config.get('wgNamespaceNumber'),
		canonicalSpecialPageName = mw.config.get('wgCanonicalSpecialPageName'),
		isPageProtected = (!!mw.config.get('wgRestrictionEdit') && mw.config.get('wgRestrictionEdit').length) || (!!mw.config.get('wgRestrictionCreate') && mw.config.get('wgRestrictionCreate').length),
		serverName = mw.config.get('wgServerName'),
		siteName = mw.config.get('wgSiteName'),
		userGroups = mw.config.get('wgUserGroups'),
		contentLanguage = mw.config.get('wgContentLanguage'),
		noticeProject = mw.config.get('wgNoticeProject'),
		articleId = mw.config.get('wgArticleId'),
		mwDBname = mw.config.get('wgDBname'),
		pageName = mw.config.get('wgPageName'),
		userName = mw.config.get('wgRelevantUserName'),
		isUserSpace, metaUserGroups, userPermissions, currentDate = new Date();
	var escapedPageName = encodeURIComponent(pageName.replace(/[!'()*]/g, escape)),
		escapedUserName = encodeURIComponent(userName).replace(/[!'()*]/g, escape);
	$('#ca-protect,#ca-unprotect,#ca-delete,#ca-undelete').remove();
	var userMenuList = {
		'User': {
			'User logs': {
				'All logs': {
					url: mw.util.getUrl('Special:Log', {
						action: 'view',
						user: userName
					})
				},
				'Block log': {
					url: mw.util.getUrl('Special:Log', {
						action: 'view',
						user: userName,
						type: 'block'
					}),
					permissions: ['block']
				},
				'Deletion log': {
					url: mw.util.getUrl('Special:Log', {
						action: 'view',
						user: userName,
						type: 'delete'
					}),
					permissions: ['delete']
				},
				'Filter log': {
					url: mw.util.getUrl('Special:AbuseLog', {
						wpSearchUser: userName
					})
				},
				'Mass message log': {
					url: mw.util.getUrl('Special:Log', {
						action: 'view',
						user: userName,
						type: 'massmessage'
					}),
					permissions: ['massmessage']
				},
				'Move log': {
					url: mw.util.getUrl('Special:Log', {
						action: 'view',
						user: userName,
						type: 'move'
					}),
					permissions: ['move']
				},
				'Pending changes log': {
					url: mw.util.getUrl('Special:Log', {
						action: 'view',
						user: userName,
						type: 'stable'
					}),
					permissions: ['stablesettings']
				},
				'Protection log': {
					url: mw.util.getUrl('Special:Log', {
						action: 'view',
						user: userName,
						type: 'protect'
					}),
					permissions: ['protect']
				},
				'Review log': {
					url: mw.util.getUrl('Special:Log', {
						action: 'view',
						user: userName,
						type: 'review'
					}),
					permissions: ['review']
				},
				'Thanks log': {
					url: mw.util.getUrl('Special:Log', {
						action: 'view',
						user: userName,
						type: 'thanks'
					}),
					groups: ['user']
				},
				'Upload log': {
					url: mw.util.getUrl('Special:Log', {
						action: 'view',
						user: userName,
						type: 'upload'
					}),
					permissions: ['upload']
				},
				'User creation log': {
					url: mw.util.getUrl('Special:Log', {
						action: 'view',
						user: userName,
						type: 'newusers'
					}),
					groups: ['user'] // any user can create new accounts at [[Special:CreateAccount]]
				},
				'User rights log': {
					url: mw.util.getUrl('Special:Log', {
						action: 'view',
						user: userName,
						type: 'rights'
					}),
					addRemoveGroups: true
				}
			},
			'RfXs': {
				'RfAs': {
					url: mw.util.getUrl('Special:PrefixIndex/Wikipedia:Requests_for_adminship/' + userName),
					style: 'display:none',
					title: 'Requests for Adminship'
				},
				'RfBs': {
					url: mw.util.getUrl('Special:PrefixIndex/Wikipedia:Requests_for_bureaucratship/' + userName),
					style: 'display:none',
					title: 'Requests for Bureaucratship'
				},
				'RfArb': {
					url: mw.util.getUrl('Wikipedia:Arbitration/Requests/Case/' + userName),
					style: 'display:none',
					title: 'Requests for Arbitration'
				},
				'RfC': {
					url: mw.util.getUrl('Wikipedia:Requests_for_comment/' + userName),
					style: 'display:none',
					title: 'Requests for Comment'
				},
				'RfCU': {
					url: mw.util.getUrl('Wikipedia:Requests_for_checkuser/Case/' + userName),
					style: 'display:none',
					title: 'Request for Checkuser'
				},
				'CCI': {
					url: mw.util.getUrl('Wikipedia:Contributor_copyright_investigations/' + userName),
					style: 'display:none',
					title: 'Contributor copyright investigations'
				},
				'SPI': {
					url: mw.util.getUrl('Wikipedia:Sockpuppet_investigations/' + userName),
					style: 'display:none',
					title: 'Sockpuppet investigations (as the sockmaster)'
				}
			},
			'Blocks': {
				'Block user': {
					url: mw.util.getUrl('Special:Block/' + userName),
					userPermissions: 'block',
					blocked: false
				},
				'Block globally': {
					url: '//meta.wikimedia.org/wiki/Special:GlobalBlock/' + userName,
					userPermissions: 'globalblock',
					ipOnly: true
				},
				'Change block': {
					url: mw.util.getUrl('Special:Block/' + userName),
					userPermissions: 'block',
					blocked: true
				},
				'Central auth': {
					url: '//meta.wikimedia.org/wiki/Special:CentralAuth/' + userName,
					userPermissions: 'centralauth-lock'
				},
				'Unblock user': {
					url: mw.util.getUrl('Special:Unblock/' + userName),
					blocked: true,
					userPermissions: 'block'
				},
				'View block': {
					url: mw.util.getUrl('Special:BlockList', {
						wpTarget: userName
					}),
					blocked: true,
					style: 'color:#EE1111'
				},
				'View block log': {
					url: mw.util.getUrl('Special:Log', {
						action: 'view',
						page: userName,
						type: 'block'
					})
				}
			},
			'Analysis': {
				'Analysis – Supercount': {
					url: '//tools.wmflabs.org/supercount/index.php?project=' + serverName + '&user=' + escapedUserName,
					title: 'Cyberpower678s User Analysis Tool'
				},
				'Analysis – WikiChecker': {
					url: 'http://' + contentLanguage + '.wikichecker.com/user/?l=all&t=' + escapedUserName,
					databaseRestrict: ['enwiki', 'jawiki', 'frwiki', 'ruwiki'],
				},
				'Analysis – XTools': {
					url: '//tools.wmflabs.org/xtools-ec/?user=' + escapedUserName + '&project=' + serverName
				},
				'Articles created': {
					url: '//tools.wmflabs.org/xtools/pages/?user=' + escapedUserName + '&project=' + serverName + '&namespace=all&redirects=noredirects',
					groups: ['user']
				},
				'Autoblocks': {
					url: '//tools.wmflabs.org/xtools/autoblock/?user=' + escapedUserName + '&project=' + serverName
				},
				'Edit summary usage': {
					url: '//tools.wmflabs.org/xtools/editsummary/index.php?lang=en&wiki=' + siteName + '&name=' + escapedUserName
				},
				'Edit summary search': {
					url: '//tools.wmflabs.org/sigma/summary.py?name=' + escapedUserName
				},
				'Global contributions': {
					url: '//tools.wmflabs.org/guc/?user=' + escapedUserName + '&blocks=true'
				},
				'Pages created': {
					url: '//tools.wmflabs.org/xtools/pages/?user=' + escapedUserName + '&project=' + serverName + '&namespace=all'
				},
				'SUL': {
					url: mw.util.getUrl('Special:CentralAuth/' + userName),
					groups: ['user']
				}
			},
			'IP lookup': {
				'WHOIS': {
					url: 'http://whois.domaintools.com/' + escapedUserName,
					ipOnly: true
				},
				'rDNS': {
					url: 'https://www.robtex.com/ip/' + escapedUserName + '.html',
					ipOnly: true
				},
				'Traceroute': {
					url: 'http://www.domaintools.com/research/traceroute/?query=' + escapedUserName,
					ipOnly: true
				},
				'Geolocate': {
					url: 'http://whatismyipaddress.com/ip/' + escapedUserName,
					ipOnly: true
				}
			},
			'Change rights': {
				url: mw.util.getUrl('Special:UserRights', {
					user: 'User:' + userName
				}),
				groups: ['user'],
				userAddRemoveGroups: true
			},
			'Checkuser': {
				url: mw.util.getUrl('Special:CheckUser/' + userName),
				userPermissions: ['checkuser']
			},
			'Contributions': {
				url: mw.util.getUrl('Special:Contributions/' + userName)
			},
			'Deleted contributions': {
				url: mw.util.getUrl('Special:DeletedContributions/' + userName),
				userPermissions: ['deletedhistory', 'deletedtext']
			},
			'Suppressed contribs': {
				url: mw.util.getUrl('Special:Log/suppress', {
					offender: userName
				}),
				userPermissions: ['oversight']
			},
			'Email user': {
				url: mw.util.getUrl('Special:EmailUser/' + userName),
				groups: ['user']
			},
			'Uploads': {
				url: mw.util.getUrl('Special:ListFiles', {
					user: userName,
					ilshowall: '1'
				}),
				groups: ['user']
			},
			'User groups': {
				url: mw.util.getUrl('Special:ListUsers', {
					limit: 1,
					username: userName
				}),
				groups: ['user']
			},
			'User rights changes': {
				url: mw.util.getUrl('Special:Log', {
					user: '',
					page: 'User:' + userName,
					type: 'rights'
				}),
				groups: ['user']
			},
			'User thanks received': {
				url: mw.util.getUrl('Special:Log', {
					user: '',
					page: 'User:' + userName,
					type: 'thanks'
				}),
				groups: ['user']
			}
		}
	};
	var pageMenuList = {
		'Page': {
			'Page logs': {
				'All logs': {
					url: mw.util.getUrl('Special:Log', {
						action: 'view',
						page: pageName
					})
				},
				'Deletion log': {
					url: mw.util.getUrl('Special:Log', {
						action: 'view',
						page: pageName,
						type: 'delete'
					})
				},
				'Move log': {
					url: mw.util.getUrl('Special:Log', {
						action: 'view',
						page: pageName,
						type: 'move'
					})
				},
				'Pending changes log': {
					url: mw.util.getUrl('Special:Log', {
						action: 'view',
						page: pageName,
						type: 'stable'
					})
				},
				'Protection log': {
					url: mw.util.getUrl('Special:Log', {
						action: 'view',
						page: pageName,
						type: 'protect'
					})
				}
			},
			'Analysis': {
				'Analysis – WikiChecker': {
					url: 'http://' + contentLanguage + '.wikichecker.com/article/?a=' + pageName,
					databaseRestrict: ['enwiki', 'jawiki', 'frwiki', 'ruwiki'],
					pageExists: true
				},
				'Analysis – XTools': {
					url: '//tools.wmflabs.org/xtools-articleinfo/?article=' + escapedPageName + '&project=' + serverName,
					pageExists: true
				},
				'Basic statistics': {
					url: mw.util.getUrl(pageName, {
						action: 'info'
					}),
					pageExists: true
				},
				'Search by contributor': {
					url: '//tools.wmflabs.org/usersearch/index.html?page=' + escapedPageName,
					pageExists: true
				},
				'Search revision history': {
					url: 'http://wikipedia.ramselehof.de/wikiblame.php?lang=' + contentLanguage + '&project=' + noticeProject + '&article=' + escapedPageName,
					pageExists: true
				},
				'Traffic report': {
					url: 'http://stats.grok.se/' + contentLanguage + '/latest/' + decodeURIComponent(escapedPageName), // don't ask about the decode!
					pageExists: true,
					noticeProjectRestrict: ['wikipedia']
				}
			},
			'Tools': {
				'Check external links': {
					url: 'http://dispenser.homenet.org/~dispenser/cgi-bin/webchecklinks.py?page=' + escapedPageName,
					pageExists: true
				},
				'Copyright vio detector': {
					url: '//tools.wmflabs.org/copyvios?lang=' + contentLanguage + '&project=' + noticeProject + '&title=' + pageName.replace(/\"/g, '%22') + '&oldid=&action=search&use_engine=1&use_links=1',
					pageExists: true,
					title: 'Queries search engine for copyright violations. Could take a while, so be patient.'
				},
				'Disambiguate links': {
					url: 'http://dispenser.homenet.org/~dispenser/cgi-bin/dablinks.py?page=' + escapedPageName + '&lang=' + contentLanguage,
					pageExists: true
				},
				'Expand bare references': {
					url: '//tools.wmflabs.org/refill/result.php?page=' + escapedPageName + '&defaults=y&wiki=' + contentLanguage,
					pageExists: true,
					namespaceRestrict: [0, 2, 118]
				},
				'Peer reviewer': {
					url: 'http://dispenser.homenet.org/~dispenser/view/Peer_reviewer#page:' + escapedPageName,
					pageExists: true,
					databaseRestrict: ['enwiki'],
					namespaceRestrict: [0, 2, 118]
				}
			},
			'XfDs': {
				url: 'javascrit:void(0)'
			},
			'Change protection': {
				url: mw.util.getUrl(pageName, {
					action: 'protect'
				}),
				userPermissions: ['protect', 'stablesettings'],
				isProtected: true
			},
			'Delete page': {
				url: mw.util.getUrl(pageName, {
					action: 'delete'
				}) + ($('#delete-reason').text() ? '&wpReason=' + $('#delete-reason').text() : ''),
				userPermissions: ['delete'],
				pageExists: true
			},
			'Edit intro': {
				url: mw.util.getUrl(pageName, {
					action: 'edit',
					section: 0
				}),
				namespaceRestrict: [0, 1, 2, 3, 4, 5, 118],
				pageExists: true
			},
			'Latest diff': {
				url: mw.util.getUrl(pageName, {
					action: 'view',
					diff: mw.config.get('wgCurRevisionId')
				}),
				pageExists: true
			},
			'Merge page': {
				url: mw.util.getUrl('Special:MergeHistory', {
					target: pageName
				}),
				userPermissions: ['mergehistory'],
				pageExists: true
			},
			'Move page': {
				url: mw.util.getUrl('Special:MovePage/' + pageName),
				userPermissions: ['move'],
				pageExists: true
			},
			'Protect page': {
				url: mw.util.getUrl(pageName, {
					action: 'protect'
				}),
				userPermissions: ['protect', 'stablesettings']
			},
			'Purge cache': {
				url: mw.util.getUrl(pageName, {
					action: 'purge',
					forcelinkupdate: true
				}),
				pageExists: true
			},
			'Subpages': {
				url: mw.util.getUrl('Special:PrefixIndex/' + pageName),
			},
			'Undelete page': {
				url: mw.util.getUrl('Special:Undelete/' + pageName),
				userPermissions: ['undelete'],
				pageDeleted: true
			}
		}
	};
	var delsortMenuList = {
		'Delsort': {
			'Manual Entry': {
				url: "#\" onclick=\"delsortIt()"
			},
			'Africa': {
				'Africa': {
					url: "#\" onclick=\"doDelsort('Africa')"
				},
				'Egypt': {
					url: "#\" onclick=\"doDelsort('Egypt')"
				},
				'Ethiopia': {
					url: "#\" onclick=\"doDelsort('Ethiopia')"
				},
				'Kenya': {
					url: "#\" onclick=\"doDelsort('Kenya')"
				},
				'Maroc': {
					url: "#\" onclick=\"doDelsort('Maroc')"
				},
				'Mauritius': {
					url: "#\" onclick=\"doDelsort('Mauritius')"
				},
				'Nigeria': {
					url: "#\" onclick=\"doDelsort('Nigeria')"
				},
				'Somalia': {
					url: "#\" onclick=\"doDelsort('Somalia')"
				},
				'South Africa': {
					url: "#\" onclick=\"doDelsort('South Africa')"
				},
				'Zimbabwe': {
					url: "#\" onclick=\"doDelsort('Zimbabwe')"
				}
			},
			'Asia': {
				'Asia': {
					url: "#\" onclick=\"doDelsort('Asia')"
				},
				'Afghanistan': {
					url: "#\" onclick=\"doDelsort('Afghanistan')"
				},
				'Bangladesh': {
					url: "#\" onclick=\"doDelsort('Bangladesh')"
				},
				'Bahrain': {
					url: "#\" onclick=\"doDelsort('Bahrain')"
				},
				'Brunei': {
					url: "#\" onclick=\"doDelsort('Brunei')"
				},
				'Cambodia': {
					url: "#\" onclick=\"doDelsort('Cambodia')"
				},
				'China': {
					url: "#\" onclick=\"doDelsort('China')"
				},
				'Hong Kong': {
					url: "#\" onclick=\"doDelsort('Hong Kong')"
				},
				'India': {
					url: "#\" onclick=\"doDelsort('India')"
				},
				'Indonesia': {
					url: "#\" onclick=\"doDelsort('Indonesia')"
				},
				'Japan': {
					url: "#\" onclick=\"doDelsort('Japan')"
				},
				'Korea': {
					url: "#\" onclick=\"doDelsort('Korea')"
				},
				'Malaysia': {
					url: "#\" onclick=\"doDelsort('Malaysia')"
				},
				'Maldives': {
					url: "#\" onclick=\"doDelsort('Maldives')"
				},
				'Mongolia': {
					url: "#\" onclick=\"doDelsort('Mongolia')"
				},
				'Nepal': {
					url: "#\" onclick=\"doDelsort('Nepal')"
				},
				'Pakistan': {
					url: "#\" onclick=\"doDelsort('Pakistan')"
				},
				'Philippines': {
					url: "#\" onclick=\"doDelsort('Philippines')"
				},
				'Singapore': {
					url: "#\" onclick=\"doDelsort('Singapore')"
				},
				'Sri Lanka': {
					url: "#\" onclick=\"doDelsort('Sri Lanka')"
				},
				'Taiwan': {
					url: "#\" onclick=\"doDelsort('Taiwan')"
				},
				'Thailand': {
					url: "#\" onclick=\"doDelsort('Thailand')"
				},
				'Vietnam': {
					url: "#\" onclick=\"doDelsort('Vietnam')"
				}
			},
			'Central Asia': {
				'Central Asia': {
					url: "#\" onclick=\"doDelsort('Central Asia')"
				},
				'Kazakhstan': {
					url: "#\" onclick=\"doDelsort('Kazakhstan')"
				},
				'Kyrgyzstan': {
					url: "#\" onclick=\"doDelsort('Kyrgyzstan')"
				},
				'Tajikistan': {
					url: "#\" onclick=\"doDelsort('Tajikistan')"
				},
				'Turkmenistan': {
					url: "#\" onclick=\"doDelsort('Turkmenistan')"
				},
				'Uzbekistan': {
					url: "#\" onclick=\"doDelsort('Uzbekistan')"
				}
			},
			'Middle East': {
				'Middle East': {
					url: "#\" onclick=\"doDelsort('Middle East')"
				},
				'Iran': {
					url: "#\" onclick=\"doDelsort('Iran')"
				},
				'Iraq': {
					url: "#\" onclick=\"doDelsort('Iraq')"
				},
				'Israel': {
					url: "#\" onclick=\"doDelsort('Israel')"
				},
				'Lebanon': {
					url: "#\" onclick=\"doDelsort('Lebanon')"
				},
				'Palestine': {
					url: "#\" onclick=\"doDelsort('Palestine')"
				},
				'Saudi Arabia': {
					url: "#\" onclick=\"doDelsort('Saudi Arabia')"
				},
				'Syria': {
					url: "#\" onclick=\"doDelsort('Syria')"
				},
				'United Arab Emirates': {
					url: "#\" onclick=\"doDelsort('United Arab Emirates')"
				}
			},
			'Europe': {
				'Europe': {
					url: "#\" onclick=\"doDelsort('Europe')"
				},
				'Albania': {
					url: "#\" onclick=\"doDelsort('Albania')"
				},
				'Armenia': {
					url: "#\" onclick=\"doDelsort('Armenia')"
				},
				'Austria': {
					url: "#\" onclick=\"doDelsort('Austria')"
				},
				'Azerbaijan': {
					url: "#\" onclick=\"doDelsort('Azerbaijan')"
				},
				'Belarus': {
					url: "#\" onclick=\"doDelsort('Belarus')"
				},
				'Belgium': {
					url: "#\" onclick=\"doDelsort('Belgium')"
				},
				'Bosnia and Herzegovina': {
					url: "#\" onclick=\"doDelsort('Bosnia and Herzegovina')"
				},
				'Bulgaria': {
					url: "#\" onclick=\"doDelsort('Bulgaria')"
				},
				'Croatia': {
					url: "#\" onclick=\"doDelsort('Croatia')"
				},
				'Cyprus': {
					url: "#\" onclick=\"doDelsort('Cyprus')"
				},
				'Czech Republic': {
					url: "#\" onclick=\"doDelsort('Czech Republic')"
				},
				'Denmark': {
					url: "#\" onclick=\"doDelsort('Denmark')"
				},
				'Estonia': {
					url: "#\" onclick=\"doDelsort('Estonia')"
				},
				'Finland': {
					url: "#\" onclick=\"doDelsort('Finland')"
				},
				'France': {
					url: "#\" onclick=\"doDelsort('France')"
				},
				'Georgia (country)': {
					url: "#\" onclick=\"doDelsort('Georgia (country)')"
				},
				'Germany': {
					url: "#\" onclick=\"doDelsort('Germany')"
				},
				'Greece': {
					url: "#\" onclick=\"doDelsort('Greece')"
				},
				'Hungary': {
					url: "#\" onclick=\"doDelsort('Hungary')"
				},
				'Iceland': {
					url: "#\" onclick=\"doDelsort('Iceland')"
				},
				'Ireland': {
					url: "#\" onclick=\"doDelsort('Ireland')"
				},
				'Italy': {
					url: "#\" onclick=\"doDelsort('Italy')"
				},
				'Jersey': {
					url: "#\" onclick=\"doDelsort('Jersey')"
				},
				'Kosovo': {
					url: "#\" onclick=\"doDelsort('Kosovo')"
				},
				'Latvia': {
					url: "#\" onclick=\"doDelsort('Latvia')"
				},
				'Lithuania': {
					url: "#\" onclick=\"doDelsort('Lithuania')"
				},
				'Luxembourg': {
					url: "#\" onclick=\"doDelsort('Luxembourg')"
				},
				'Macedonia': {
					url: "#\" onclick=\"doDelsort('Macedonia')"
				},
				'Moldova': {
					url: "#\" onclick=\"doDelsort('Moldova')"
				},
				'Montenegro': {
					url: "#\" onclick=\"doDelsort('Montenegro')"
				},
				'Netherlands': {
					url: "#\" onclick=\"doDelsort('Netherlands')"
				},
				'Norway': {
					url: "#\" onclick=\"doDelsort('Norway')"
				},
				'Poland': {
					url: "#\" onclick=\"doDelsort('Poland')"
				},
				'Portugal': {
					url: "#\" onclick=\"doDelsort('Portugal')"
				},
				'Romania': {
					url: "#\" onclick=\"doDelsort('Romania')"
				},
				'Russia': {
					url: "#\" onclick=\"doDelsort('Russia')"
				},
				'Serbia': {
					url: "#\" onclick=\"doDelsort('Serbia')"
				},
				'Slovakia': {
					url: "#\" onclick=\"doDelsort('Slovakia')"
				},
				'Slovenia': {
					url: "#\" onclick=\"doDelsort('Slovenia')"
				},
				'Spain': {
					url: "#\" onclick=\"doDelsort('Spain')"
				},
				'Sweden': {
					url: "#\" onclick=\"doDelsort('Sweden')"
				},
				'Switzerland': {
					url: "#\" onclick=\"doDelsort('Switzerland')"
				},
				'Turkey': {
					url: "#\" onclick=\"doDelsort('Turkey')"
				},
				'Ukraine': {
					url: "#\" onclick=\"doDelsort('Ukraine')"
				},
				'Yugoslavia': {
					url: "#\" onclick=\"doDelsort('Yugoslavia')"
				}
			},
			'United Kingdom': {
				'United Kingdom': {
					url: "#\" onclick=\"doDelsort('United Kingdom')"
				},
				'England': {
					url: "#\" onclick=\"doDelsort('England')"
				},
				'Northern Ireland': {
					url: "#\" onclick=\"doDelsort('Northern Ireland')"
				},
				'Scotland': {
					url: "#\" onclick=\"doDelsort('Scotland')"
				},
				'Wales': {
					url: "#\" onclick=\"doDelsort('Wales')"
				}
			},
			'Oceania': {
				'Oceania': {
					action: "#\" onclick=\"doDelsort('Oceania')"
				},
				'Antarctica': {
					url: "#\" onclick=\"doDelsort('Antarctica')"
				},
				'Australia': {
					url: "#\" onclick=\"doDelsort('Australia')"
				},
				'New Zealand': {
					url: "#\" onclick=\"doDelsort('New Zealand')"
				}
			},
			'Canada': {
				'Canada': {
					url: "#\" onclick=\"doDelsort('Canada')"
				},
				'British Columbia': {
					url: "#\" onclick=\"doDelsort('British Columbia')"
				},
				'Manitoba': {
					url: "#\" onclick=\"doDelsort('Manitoba')"
				},
				'Nova Scotia': {
					url: "#\" onclick=\"doDelsort('Nova Scotia')"
				},
				'Ontario': {
					url: "#\" onclick=\"doDelsort('Ontario')"
				},
				'Quebec': {
					url: "#\" onclick=\"doDelsort('Quebec')"
				}
			},
			'United States A-M': {
				'United States of America': {
					url: "#\" onclick=\"doDelsort('United States of America')"
				},
				'Alabama': {
					url: "#\" onclick=\"doDelsort('Alabama')"
				},
				'Alaska': {
					url: "#\" onclick=\"doDelsort('Alaska')"
				},
				'Arkansas': {
					url: "#\" onclick=\"doDelsort('Arkansas')"
				},
				'Arizona': {
					url: "#\" onclick=\"doDelsort('Arizona')"
				},
				'California': {
					url: "#\" onclick=\"doDelsort('California')"
				},
				'Colorado': {
					url: "#\" onclick=\"doDelsort('Colorado')"
				},
				'Connecticut': {
					url: "#\" onclick=\"doDelsort('Connecticut')"
				},
				'Delaware': {
					url: "#\" onclick=\"doDelsort('Delaware')"
				},
				'Florida': {
					url: "#\" onclick=\"doDelsort('Florida')"
				},
				'Georgia (U.S. state)': {
					url: "#\" onclick=\"doDelsort('Georgia (U.S. state)')"
				},
				'Hawaii': {
					url: "#\" onclick=\"doDelsort('Hawaii')"
				},
				'Idaho': {
					url: "#\" onclick=\"doDelsort('Idaho')"
				},
				'Illinois': {
					url: "#\" onclick=\"doDelsort('Illinois')"
				},
				'Indiana': {
					url: "#\" onclick=\"doDelsort('Indiana')"
				},
				'Iowa': {
					url: "#\" onclick=\"doDelsort('Iowa')"
				},
				'Kansas': {
					url: "#\" onclick=\"doDelsort('Kansas')"
				},
				'Kentucky': {
					url: "#\" onclick=\"doDelsort('Kentucky')"
				},
				'Louisiana': {
					url: "#\" onclick=\"doDelsort('Louisiana')"
				},
				'Maine': {
					url: "#\" onclick=\"doDelsort('Maine')"
				},
				'Maryland': {
					url: "#\" onclick=\"doDelsort('Maryland')"
				},
				'Massachusetts': {
					url: "#\" onclick=\"doDelsort('Massachusetts')"
				},
				'Michigan': {
					url: "#\" onclick=\"doDelsort('Michigan')"
				},
				'Minnesota': {
					url: "#\" onclick=\"doDelsort('Minnesota')"
				},
				'Mississippi': {
					url: "#\" onclick=\"doDelsort('Mississippi')"
				},
				'Missouri': {
					url: "#\" onclick=\"doDelsort('Missouri')"
				},
				'Montana': {
					url: "#\" onclick=\"doDelsort('Montana')"
				}
			},
			'United States N-Z': {
				'United States of America': {
					url: "#\" onclick=\"doDelsort('United States of America')"
				},
				'Nebraska': {
					url: "#\" onclick=\"doDelsort('Nebraska')"
				},
				'Nevada': {
					url: "#\" onclick=\"doDelsort('Nevada')"
				},
				'New Hampshire': {
					url: "#\" onclick=\"doDelsort('New Hampshire')"
				},
				'New Jersey': {
					url: "#\" onclick=\"doDelsort('New Jersey')"
				},
				'New Mexico': {
					url: "#\" onclick=\"doDelsort('New Mexico')"
				},
				'New York': {
					url: "#\" onclick=\"doDelsort('New York')"
				},
				'North Carolina': {
					url: "#\" onclick=\"doDelsort('North Carolina')"
				},
				'North Dakota': {
					url: "#\" onclick=\"doDelsort('North Dakota')"
				},
				'Ohio': {
					url: "#\" onclick=\"doDelsort('Ohio')"
				},
				'Oklahoma': {
					url: "#\" onclick=\"doDelsort('Oklahoma')"
				},
				'Oregon': {
					url: "#\" onclick=\"doDelsort('Oregon')"
				},
				'Pennsylvania': {
					url: "#\" onclick=\"doDelsort('Pennsylvania')"
				},
				'Rhode Island': {
					url: "#\" onclick=\"doDelsort('Rhode Island')"
				},
				'South Carolina': {
					url: "#\" onclick=\"doDelsort('South Carolina')"
				},
				'South Dakota': {
					url: "#\" onclick=\"doDelsort('South Dakota')"
				},
				'Tennessee': {
					url: "#\" onclick=\"doDelsort('Tennessee')"
				},
				'Texas': {
					url: "#\" onclick=\"doDelsort('Texas')"
				},
				'Utah': {
					url: "#\" onclick=\"doDelsort('Utah')"
				},
				'Vermont': {
					url: "#\" onclick=\"doDelsort('Vermont')"
				},
				'Virginia': {
					url: "#\" onclick=\"doDelsort('Virginia')"
				},
				'Washington': {
					url: "#\" onclick=\"doDelsort('Washington')"
				},
				'Washington, D.C.': {
					url: "#\" onclick=\"doDelsort('Washington, D.C.')"
				},
				'West Virginia': {
					url: "#\" onclick=\"doDelsort('West Virginia')"
				},
				'Wisconsin': {
					url: "#\" onclick=\"doDelsort('Wisconsin')"
				},
				'Wyoming': {
					url: "#\" onclick=\"doDelsort('Wyoming')"
				}
			},
			'Latin America': {
				'Latin America': {
					url: "#\" onclick=\"doDelsort('Latin America')"
				},
				'Caribbean': {
					url: "#\" onclick=\"doDelsort('Caribbean')"
				},
				'South America': {
					url: "#\" onclick=\"doDelsort('South America')"
				},
				'Argentina': {
					url: "#\" onclick=\"doDelsort('Argentina')"
				},
				'Barbados': {
					url: "#\" onclick=\"doDelsort('Barbados')"
				},
				'Belize': {
					url: "#\" onclick=\"doDelsort('Belize')"
				},
				'Bolivia': {
					url: "#\" onclick=\"doDelsort('Bolivia')"
				},
				'Brazil': {
					url: "#\" onclick=\"doDelsort('Brazil')"
				},
				'Chile': {
					url: "#\" onclick=\"doDelsort('Chile')"
				},
				'Colombia': {
					url: "#\" onclick=\"doDelsort('Colombia')"
				},
				'Cuba': {
					url: "#\" onclick=\"doDelsort('Cuba')"
				},
				'Ecuador': {
					url: "#\" onclick=\"doDelsort('Ecuador')"
				},
				'El Salvador': {
					url: "#\" onclick=\"doDelsort('El Salvador')"
				},
				'Guatemala': {
					url: "#\" onclick=\"doDelsort('Guatemala')"
				},
				'Haiti': {
					url: "#\" onclick=\"doDelsort('Haiti')"
				},
				'Mexico': {
					url: "#\" onclick=\"doDelsort('Mexico')"
				},
				'Panama': {
					url: "#\" onclick=\"doDelsort('Panama')"
				},
				'Paraguay': {
					url: "#\" onclick=\"doDelsort('Paraguay')"
				},
				'Peru': {
					url: "#\" onclick=\"doDelsort('Peru')"
				},
				'Puerto Rico': {
					url: "#\" onclick=\"doDelsort('Puerto Rico')"
				},
				'Trinidad and Tobago': {
					url: "#\" onclick=\"doDelsort('Trinidad and Tobago')"
				},
				'Uruguay': {
					url: "#\" onclick=\"doDelsort('Uruguay')"
				},
				'Venezuela': {
					url: "#\" onclick=\"doDelsort('Venezuela')"
				}
			},
			'Arts': {
				'Arts': {
					url: "#\" onclick=\"doDelsort('Arts')"
				},
				'Food and drink': {
					url: "#\" onclick=\"doDelsort('Food and drink')"
				},
				'Wine': {
					url: "#\" onclick=\"doDelsort('Wine')"
				},
				'Language': {
					url: "#\" onclick=\"doDelsort('Language')"
				},
				'Literature': {
					url: "#\" onclick=\"doDelsort('Literature')"
				},
				'Poetry': {
					url: "#\" onclick=\"doDelsort('Poetry')"
				},
				'Albums and songs': {
					url: "#\" onclick=\"doDelsort('Albums and songs')"
				},
				'Television': {
					url: "#\" onclick=\"doDelsort('Television')"
				},
				'Music': {
					url: "#\" onclick=\"doDelsort('Music')"
				},
				'Film': {
					url: "#\" onclick=\"doDelsort('Film')"
				},
				'Radio': {
					url: "#\" onclick=\"doDelsort('Radio')"
				},
				'Video Games': {
					url: "#\" onclick=\"doDelsort('Video Games')"
				},
				'Visual arts': {
					url: "#\" onclick=\"doDelsort('Visual arts')"
				},
				'Architecture': {
					url: "#\" onclick=\"doDelsort('Architecture')"
				},
				'Fashion': {
					url: "#\" onclick=\"doDelsort('Fashion')"
				},
				'Photography': {
					url: "#\" onclick=\"doDelsort('Photography')"
				},
				'Comics and animation': {
					url: "#\" onclick=\"doDelsort('Comics and animation')"
				},
				'Anime and manga': {
					url: "#\" onclick=\"doDelsort('Anime and manga')"
				},
				'Webcomics': {
					url: "#\" onclick=\"doDelsort('Webcomics')"
				},
				'Fictional elements': {
					url: "#\" onclick=\"doDelsort('Fictional elements')"
				},
				'Science fiction': {
					url: "#\" onclick=\"doDelsort('Science fiction')"
				}
			},
			'Topical': {
				'Advertising': {
					url: "#\" onclick=\"doDelsort('Advertising')"
				},
				'Aviation': {
					url: "#\" onclick=\"doDelsort('Aviation')"
				},
				'Bibliographies': {
					url: "#\" onclick=\"doDelsort('Bibliographies')"
				},
				'Bilateral relations': {
					url: "#\" onclick=\"doDelsort('Bilateral relations')"
				},
				'Business': {
					url: "#\" onclick=\"doDelsort('Business')"
				},
				'Conservatism': {
					url: "#\" onclick=\"doDelsort('Conservatism')"
				},
				'Conspiracy theories': {
					url: "#\" onclick=\"doDelsort('Conspiracy theories')"
				},
				'Crime': {
					url: "#\" onclick=\"doDelsort('Crime')"
				},
				'Education': {
					url: "#\" onclick=\"doDelsort('Education')"
				},
				'Environment': {
					url: "#\" onclick=\"doDelsort('Environment')"
				},
				'Ethnic groups': {
					url: "#\" onclick=\"doDelsort('Ethnic groups')"
				},
				'Events': {
					url: "#\" onclick=\"doDelsort('Events')"
				},
				'Firearms': {
					url: "#\" onclick=\"doDelsort('Firearms')"
				},
				'Games': {
					url: "#\" onclick=\"doDelsort('Games')"
				},
				'Health and fitness': {
					url: "#\" onclick=\"doDelsort('Health and fitness')"
				},
				'History': {
					url: "#\" onclick=\"doDelsort('History')"
				},
				'Law': {
					url: "#\" onclick=\"doDelsort('Law')"
				},
				'Language': {
					url: "#\" onclick=\"doDelsort('Language')"
				},
				'Logic': {
					url: "#\" onclick=\"doDelsort('Logic')"
				},
				'Magic': {
					url: "#\" onclick=\"doDelsort('Magic')"
				},
				'Management': {
					url: "#\" onclick=\"doDelsort('Management')"
				},
				'Medicine': {
					url: "#\" onclick=\"doDelsort('Medicine')"
				},
				'Military': {
					url: "#\" onclick=\"doDelsort('Military')"
				},
				'News media': {
					url: "#\" onclick=\"doDelsort('News media')"
				},
				'Organisms': {
					url: "#\" onclick=\"doDelsort('Organisms')"
				},
				'Organizations': {
					url: "#\" onclick=\"doDelsort('Organizations')"
				},
				'Paranormal': {
					url: "#\" onclick=\"doDelsort('Paranormal')"
				},
				'Philosophy': {
					url: "#\" onclick=\"doDelsort('Philosophy')"
				},
				'Piracy': {
					url: "#\" onclick=\"doDelsort('Piracy')"
				},
				'Politics': {
					url: "#\" onclick=\"doDelsort('Politics')"
				},
				'Popular culture': {
					url: "#\" onclick=\"doDelsort('Popular culture')"
				},
				'Sexuality and gender': {
					url: "#\" onclick=\"doDelsort('Sexuality and gender')"
				},
				'Terrorism': {
					url: "#\" onclick=\"doDelsort('Terrorism')"
				},
				'Transportation': {
					url: "#\" onclick=\"doDelsort('Transportation')"
				}
			},
			'Science': {
				'Science': {
					url: "#\" onclick=\"doDelsort('Science')"
				},
				'Behavioural science': {
					url: "#\" onclick=\"doDelsort('Behavioural science')"
				},
				'Social science': {
					url: "#\" onclick=\"doDelsort('Social science')"
				}	
			},
			'Religion': {
				'Religion': {
					url: "#\" onclick=\"doDelsort('Religion')"
				},
				'Atheism': {
					url: "#\" onclick=\"doDelsort('Atheism')"
				},
				'Bible': {
					url: "#\" onclick=\"doDelsort('Bible')"
				},
				'Buddhism': {
					url: "#\" onclick=\"doDelsort('Buddhism')"
				},
				'Christianity': {
					url: "#\" onclick=\"doDelsort('Christianity')"
				},
				'Islam': {
					url: "#\" onclick=\"doDelsort('Islam')"
				},
				'Judaism': {
					url: "#\" onclick=\"doDelsort('Judaism')"
				},
				'Hinduism': {
					url: "#\" onclick=\"doDelsort('Hinduism')"
				},
				'Paganism': {
					url: "#\" onclick=\"doDelsort('Paganism')"
				},
				'Sikhism': {
					url: "#\" onclick=\"doDelsort('Sikhism')"
				},
				'Spirituality': {
					url: "#\" onclick=\"doDelsort('Spirituality')"
				}
			},
			'Technology': {
				'Technology': {
					url: "#\" onclick=\"doDelsort('Technology')"
				},
				'Computing': {
					url: "#\" onclick=\"doDelsort('Computing')"
				},
				'Internet': {
					url: "#\" onclick=\"doDelsort('Internet')"
				},
				'Software': {
					url: "#\" onclick=\"doDelsort('Software')"
				},
				'Websites': {
					url: "#\" onclick=\"doDelsort('Websites')"
				}
			},
			'Sports': {
				'Sports': {
					url: "#\" onclick=\"doDelsort('Sports')"
				},
				'American football': {
					url: "#\" onclick=\"doDelsort('American football')"
				},
				'Baseball': {
					url: "#\" onclick=\"doDelsort('Baseball')"
				},
				'Basketball': {
					url: "#\" onclick=\"doDelsort('Basketball')"
				},
				'Bodybuilding': {
					url: "#\" onclick=\"doDelsort('Bodybuilding')"
				},
				'Cricket': {
					url: "#\" onclick=\"doDelsort('Cricket')"
				},
				'Cycling': {
					url: "#\" onclick=\"doDelsort('Cycling')"
				},
				'Football': {
					url: "#\" onclick=\"doDelsort('Football')"
				},
				'Golf': {
					url: "#\" onclick=\"doDelsort('Golf')"
				},
				'Ice hockey': {
					url: "#\" onclick=\"doDelsort('Ice hockey')"
				},
				'Rugby union': {
					url: "#\" onclick=\"doDelsort('Rugby union')"
				},
				'Softball': {
					url: "#\" onclick=\"doDelsort('Softball')"
				},
				'Martial arts': {
					url: "#\" onclick=\"doDelsort('Martial arts')"
				},
				'Wrestling': {
					url: "#\" onclick=\"doDelsort('Wrestling')"
				},
			},
			'People': {
				'People': {
					url: "#\" onclick=\"doDelsort('People')"
				},
				'Academics and educators': {
					url: "#\" onclick=\"doDelsort('Academics and educators')"
				},
				'Actors and filmmakers': {
					url: "#\" onclick=\"doDelsort('Actors and filmmakers')"
				},
				'Authors': {
					url: "#\" onclick=\"doDelsort('Authors')"
				},
				'Bands and musicians': {
					url: "#\" onclick=\"doDelsort('Bands and musicians')"
				},
				'Businesspeople': {
					url: "#\" onclick=\"doDelsort('Businesspeople')"
				},
				'Politicians': {
					url: "#\" onclick=\"doDelsort('Politicians')"
				},
				'Sportspeople': {
					url: "#\" onclick=\"doDelsort('Sportspeople')"
				},
				'Lists of people': {
					url: "#\" onclick=\"doDelsort('Lists of people')"
				}
			},
			'Places': {
				'Shopping malls': {
					url: "#\" onclick=\"doDelsort('Shopping malls')"
				},
				'Museums and libraries': {
					url: "#\" onclick=\"doDelsort('Museums and libraries')"
				},
				'Schools': {
					url: "#\" onclick=\"doDelsort('Schools')"
				}
			},
			'Other': {
				'Disambiguations': {
					url: "#\" onclick=\"doDelsort('Disambiguations')"
				},
				'Lists': {
					url: "#\" onclick=\"doDelsort('Lists')"
				},
				'Islands': {
					url: "#\" onclick=\"doDelsort('Islands')"
				}
			}
		}
	};
	var dependencies = [];
	if (!$.jStorage) dependencies.push('jquery.jStorage');
	if (!Object.keys) dependencies.push('es5-shim');
	// initialize script
	mw.loader.using(dependencies, function() {
		var menus = [];
		if (wgPageName.indexOf('Wikipedia:Articles_for_deletion/') != -1 && wgPageName.indexOf('Wikipedia:Articles_for_deletion/Log/201') == -1) {
			menus.push(delsortMenuList)
		}
		if (namespaceNumber === 2 || namespaceNumber === 3 || canonicalSpecialPageName === 'Contributions' || !!mw.util.getParamValue("user")) {
			isUserSpace = true;
			menus.push(userMenuList);
		}
		if (namespaceNumber >= 0) {
			menus.push(pageMenuList)
		};
		init(menus, function(data) {
			completePageLinks();
			if (isUserSpace) completeUserLinks(data[0].query);
		});
	});
	// custom callback functions for these menus
	function completePageLinks() {
		$('#c2-page-xfds').hide();
		if (mwDBname === 'enwiki') {
			apiGet({
				titles: 'Wikipedia:Articles for deletion/' + pageName + '|Wikipedia:Miscellany for deletion/' + pageName,
				prop: 'info'
			}).done(function(data) {
				for (var i in data.query.pages) {
					if (i > -1) {
						if (data.query.pages[i].title.split('/')[0] === 'Wikipedia:Miscellany for deletion') {
							$('#c2-page-xfds').show().find('a').text('MfDs').prop('href', mw.util.getUrl('Special:PrefixIndex/Wikipedia:Miscellany_for_deletion/' + pageName));
						}
						else if (data.query.pages[i].title.split('/')[0] === 'Wikipedia:Articles for deletion') {
							$('#c2-page-xfds').show().find('a').text('AfDs').prop('href', mw.util.getUrl('Special:PrefixIndex/Wikipedia:Articles_for_deletion/' + pageName));
						}
						break;
					}
				}
			});
			if (mw.user.options.get('gadget-edittop') === '1') {
				$('#c2-page-edit_intro').remove();
			}
		}
		if (mwDBname !== 'commonswiki') {
			$('#ca-move').hide();
		}
		$('#p-views ul').on('beforeTabCollapse', function() {
			if ($('#ca-history').hasClass('collapsible')) {
				$('#p-page2').find('ul').append($('#ca-history').detach());
			}
		});
	}

	function completeUserLinks(query) {
			apiGet({
				list: 'logevents',
				letype: 'block',
				letitle: 'User:' + userName,
				lelimit: 1
			}).done(function(data) {
				if (data.query.logevents.length === 0) {
					$('#c2-user-blocks-view_block_log').remove();
				}
				if ($('#c2-user-blocks').find('li').length === 0) {
					$('#c2-user-blocks').remove();
				}
			});
			var rfxs = {
				'Wikipedia:Requests for adminship': 'rfas',
				'Wikipedia:Requests for bureaucratship': 'rfbs',
				'Wikipedia:Arbitration/Requests/Case': 'rfarb',
				'Wikipedia:Requests for comment': 'rfc',
				'Wikipedia:Requests for checkuser/Case': 'rfcu',
				'Wikipedia:Contributor copyright investigations': 'cci',
				'Wikipedia:Sockpuppet investigations': 'spi'
			};
			$('#c2-user-rfxs').hide();
			if (mwDBname === 'enwiki') {
				apiGet({
					titles: $.map(Object.keys(rfxs), function(rfx, i) {
						return rfx + '/' + userName;
					}).join('|'),
					prop: 'info'
				}).done(function(data) {
					var pages = data.query.pages;
					for (var id in pages) {
						if (id > 0) {
							$('#c2-user-rfxs').show();
							var key = pages[id].title.replace('/' + userName, '');
							$('#c2-user-rfxs-' + rfxs[key]).find('a').show();
						}
					}
				});
			}
		}

		// everything below is internal functions – should not need to be modified for any customization
	function addListeners() {
		$('.c2-hover-menu').each(function() {
			$(this).hover(function() {
				$el = $(this).find('.submenu');
				$el.css({
					left: $(this).outerWidth(),
					top: '-1px',
					'border-top-width': 1
				});
				$el.show();
			}, function() {
				$(this).find('.submenu').hide();
			});
		});
	}

	function apiGet(params) {
		return api.get($.extend(params, {
			action: 'query'
		}));
	}

	function canAddRemoveGroups(groups, permissions) {
			if (permissions && permissions.indexOf('userrights') >= 0) return true;
			var ret = false;
			for (var i = 0; i < groups.length; i++) {
				if (metaUserGroups[groups[i]].addRemoveGroups) {
					ret = true;
					break;
				}
			}
			return ret;
		}
		// scope is an array, returns true if all elements in 'array' exist in scope
	function containsArray(array, index, last) {
		if (!index) {
			index = 0;
			last = 0;
			this.sort();
			array.sort();
		}
		return index === array.length || (last = this.indexOf(array[index], last)) > -1 && containsArray.call(this, array, ++index, ++last);
	}

	function generateMenuContent(tabName, menuList, userData, userPermissions) {
		var html = '';
		$.each(menuList, function(name, action) {
			if (action) {
				var newHtml = '';
				if (!action.url) {
					newHtml += '<li style="position: relative;" id="' + linkId(tabName, name) + '" class="c2-hover-menu">' + '<a style="font-weight: bold">' + name + '&hellip;</a>' + '<div class="submenu menu" style="display: none; position: absolute;"><ul>';
					$.each(action, function(k, v) {
						newHtml += linkHtml(tabName, k, v, name, userData, userPermissions);
					});
					newHtml += '</ul></div></li>';
					if ($(newHtml).last().find('.submenu li').length === 0) {
						newHtml = '';
					}
				}
				else {
					newHtml += linkHtml(tabName, name, action, null, userData, userPermissions);
				}
				html += newHtml;
			}
		});
		return html;
	}

	function hasConditional(permitted, given) {
		permitted = $.makeArray(permitted);
		given = $.makeArray(given);
		if (!permitted.length) {
			return true;
		}
		else if (!given.length) {
			return false;
		}
		else {
			var valid = false;
			for (var i = 0; i < given.length; i++) {
				if ($.inArray(given[i], permitted) >= 0) {
					valid = true;
					break;
				}
			}
			return valid;
		}
	}

	function linkId(tabName, name, parent) {
		return 'c2-' + sanitize(tabName.toLowerCase()) + '-' + (parent ? sanitize(parent) + '-' : '') + sanitize(name);
	}

	function linkHtml(tabName, name, action, parent, userData, userPermissions) {
		var validations =
			/* namespace          */
			(hasConditional(action.namespaceRestrict, namespaceNumber) || !hasConditional(action.namespaceExclude, namespaceNumber)) &&
			/* existence          */
			((action.pageExists && articleId > 0) || (!action.pageExists)) &&
			/* deleted            */
			(action.pageDeleted ? articleId === 0 && mw.config.get('wgIsArticle') === false : true) &&
			/* protected          */
			(action.isProtected ? isPageProtected : true) &&
			/* database           */
			hasConditional(action.databaseRestrict, mwDBname) &&
			/* notice project     */
			hasConditional(action.noticeProjectRestrict, noticeProject) &&
			/* user's user groups */
			hasConditional(action.userGroups, userGroups) &&
			/* user's permissions */
			hasConditional(action.userPermissions, userPermissions) &&
			/* can change groups  */
			(action.userAddRemoveGroups ? canAddRemoveGroups(userGroups, userPermissions) : true);
		if (isUserSpace) {
			// FIXME: find something better than userData.invalid === '' for checking if IP
			validations &=
				/* their user groups  */
				hasConditional(action.groups, userData.groups) &&
				/* their permissions  */
				hasConditional(action.permissions, userData.rights) &&
				/* they're blocked    */
				(action.blocked !== undefined ? !!userData.blockid === action.blocked : true) &&
				/* can change groups  */
				(action.addRemoveGroups ? canAddRemoveGroups(userData.groups, userData.rights) : true) &&
				/* IP                 */
				(action.ipOnly ? userData.invalid === '' : true);
		}
		if (!!validations) {
			return '<li id=' + linkId(tabName, name, parent) + '><a href="' + action.url + '" title="' + (action.title || '') + '" ' + (action.style ? 'style="' + action.style + '"' : '') + '>' + name + '</a></li>';
		}
		else {
			return '';
		}
	}

	function sanitize(name) {
		return name.toLowerCase().replace(/ /g, '_');
	}

	function init(menus, fn) {
		var promises = new Array(3),
			cacheDate = $.jStorage.get('mmCacheDate'),
			expired = cacheDate < currentDate;
		if (isUserSpace) {
			promises[0] = apiGet({
				list: 'users|blocks',
				ususers: userName,
				bkusers: userName,
				usprop: 'blockinfo|groups|rights',
				bkprop: 'id'
			});
		}
		if (expired || !(userPermissions = $.jStorage.get('mmUserRights'))) {
			promises[1] = mw.user.getRights();
		}
		if (expired || !(metaUserGroups = $.jStorage.get('mmMetaUserGroups'))) {
			promises[2] = apiGet({
				meta: 'siteinfo',
				siprop: 'usergroups'
			});
		}
		$.when.apply(this, promises).done(function(data, userRightsData, metaData) {
			var userData;
			if (data) {
				userData = data[0].query.users[0];
				if (!userData) {
					// FIXME: add functionality to only show menu based on custom function;
					//    temporary fix so that script doesn't break on pages of users that don't exist
					isUserSpace = false;
					for (var j = 0; j < menus.length; j++) {
						if (!!menus[j].User) menus.splice(j, 1);
					}
				}
				else if (userData.invalid === '') {
					userData.groups = [];
					userData.rights = [];
					if (data[0].query.blocks.length) {
						userData.blockid = data[0].query.blocks[0].id;
					}
				}
			}
			if (userRightsData) {
				userPermissions = $.jStorage.set('mmUserRights', userRightsData);
			}
			if (metaData) {
				metaUserGroups = {};
				$.each(metaData[0].query.usergroups, function(i, el) {
					metaUserGroups[el.name] = {
						permissions: el.rights,
						addRemoveGroups: !!el.add || !!el.remove
					};
				});
				$.jStorage.set('mmMetaUserGroups', metaUserGroups);
			}
			if (expired) {
				var newDate = new Date();
				$.jStorage.set('mmCacheDate', newDate.setDate(newDate.getDate() + 7));
			}
			for (var i = 0; i < menus.length; i++) {
				var tabName = Object.keys(menus[i])[0];
				var html = '<div id="p-' + tabName.toLowerCase() + '2" class="vectorMenu" style="z-index: 100;">' + '<h3>' + '<span>' + tabName + '</span>' + '<a href="#"></a>' + '</h3>' + '<div class="menu"><ul>';
				html += generateMenuContent(tabName, menus[i][tabName], userData, userPermissions);
				html += '</ul></div></div>';
				if ($('#p-cactions')[0]) {
					$(html).insertAfter($('#p-cactions'));
				}
				else {
					$(html).insertAfter($('#p-views'));
				}
				addListeners();
			}
			if (typeof fn === 'function') fn(data, userPermissions);
		});
	}
})();
//</nowiki>