Jump to content

User:NQ-test/script1.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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.3.3
// 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)
//

( 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 = pageName.replace( /[!'"()*]/g, escape ),
		encodedPageName = encodeURIComponent( pageName ),
		escapedUserName = userName.replace( /[?!'()*]/g, escape ),
		encodedUserName = encodeURIComponent( userName );

	$( '#ca-protect,#ca-unprotect,#ca-delete,#ca-undelete' ).remove();
	if ( mwDBname !== 'commonswiki' ) $( '#ca-move' ).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=' + encodedUserName,
					title : 'Cyberpower678s User Analysis Tool'
				},
				'Analysis – WikiChecker' : {
					url : 'http://' + contentLanguage + '.wikichecker.com/user/?l=all&t=' + encodedUserName,
					databaseRestrict : [ 'enwiki', 'jawiki', 'frwiki', 'ruwiki' ],
				},
				'Analysis – XTools' : {
					url : '//tools.wmflabs.org/xtools-ec/?user=' + encodedUserName + '&project=' + serverName
				},
				'Articles created' : {
					url : '//tools.wmflabs.org/xtools/pages/?user=' + encodedUserName + '&project='+ serverName + '&namespace=all&redirects=noredirects',
					groups : ['user']
				},
				'Autoblocks' : {
					url : '//tools.wmflabs.org/xtools/autoblock/?user=' + encodedUserName + '&project=' + serverName
				},
				'BLP edits' : {
					url : '//tools.wmflabs.org/musikanimal/blp_edits?username=' + encodedUserName + '&contribs=on',
					databaseRestrict : [ 'enwiki' ]
				},
				'Edit summary usage' : {
					url : '//tools.wmflabs.org/xtools/editsummary/index.php?lang=en&wiki=' + siteName + '&name=' + encodedUserName
				},
				'Edit summary search' : {
					url : '//tools.wmflabs.org/sigma/summary.py?name=' + encodedUserName
				},
				'Global contributions' : {
					url : '//tools.wmflabs.org/guc/?user=' + encodedUserName + '&blocks=true'
				},
				'Non-automated edits' : {
					url : '//tools.wmflabs.org/musikanimal/nonautomated_edits?username=' + encodedUserName + '&namespace=0&contribs=on&tools=on',
					databaseRestrict : [ 'enwiki' ]
				},
				'Pages created' : {
					url : '//tools.wmflabs.org/xtools/pages/?user=' + encodedUserName + '&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' ]
			},
			'PersonalJSCSS' : {         
					            'Common-js' : {
					              url : mw.util.getUrl( 'User:' + userName + '/common.js' ),
					                            style : 'display:none',
					              title : 'Common.js'
					            },
					            'Common-css' : {
					              url : mw.util.getUrl( 'User:' + userName + '/common.css' ),
					                            style : 'display:none',
					              title : 'Common.css'
					            },
					            'Vector-js' : {
					              url : mw.util.getUrl( 'User:' + userName + '/vector.js' ),
					                            style : 'display:none',
					              title : 'Vector.js'
					            },
					            'Vector-css' : {
					              url : mw.util.getUrl( 'User:' + userName + '/vector.css' ),
					                            style : 'display:none',
					              title : 'Vector.css'
					            },
					            'Monobook-js' : {
					              url : mw.util.getUrl( 'User:' + userName + '/monobook.js' ),
					                            style : 'display:none',
					              title : 'Monobook.js'
					            },
					            'Monobook-css' : {
					              url : mw.util.getUrl( 'User:' + userName + '/monobook.css' ),
					                        style : 'display:none',
					              title : 'Monobook.css'
					            },
					            'Modern-js' : {
					              url : mw.util.getUrl( 'User:' + userName + '/modern.js' ),
					                      style : 'display:none',
					              title : 'Modern.js'
					            },
					            'Modern-css' : {
					              url : mw.util.getUrl( 'User:' + userName + '/modern.css' ),
					                          style : 'display:none',
					              title : 'Modern.css'
					            },
					            'Cologneblue-js' : {
					              url : mw.util.getUrl( 'User:' + userName + '/cologneblue.js' ),
					                            style : 'display:none',
					              title : 'Cologneblue.js'
					            },
					            'Cologneblue-css' : {
					              url : mw.util.getUrl( 'User:' + userName + '/cologneblue.css' ),
					                          style : 'display:none',
					              title : 'Cologneblue.css'
					            }
        		}
		}
	};

	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=' + encodedPageName,
					databaseRestrict : [ 'enwiki', 'jawiki', 'frwiki', 'ruwiki' ],
					pageExists : true
				},
				'Analysis – XTools' : {
				  url : '//tools.wmflabs.org/xtools-articleinfo/?article=' + escapedPageName + '&project=' + serverName,
				  pageExists : true
				},
				'Analysis – WikiHistory' : {
					url : '//tools.wmflabs.org/xtools/wikihistory/wh.php?page_title=' + escapedPageName,
					namespaceRestrict : [ 0 ],
					pageExists : true
				},
				'Analysis – &#931;' : {
					url : 'https://tools.wmflabs.org/sigma/articleinfo.py?page=' + encodedPageName + '&server=' + mwDBname,
					pageExists : true
				},
				'Basic statistics' : {
					url : mw.util.getUrl( pageName, { action: 'info' } ),
					pageExists : true
				},
				'Search by contributor' : {
					url : '//tools.wmflabs.org/sigma/usersearch.py?page=' + encodedPageName + '&server=' + mwDBname,
					pageExists : true
				},
				'Search revision history' : {
					url : 'http://wikipedia.ramselehof.de/wikiblame.php?lang=' + contentLanguage + '&project=' + noticeProject + '&article=' + encodedPageName,
					pageExists : true
				},
				'Traffic report' : {
					url : '//tools.wmflabs.org/pageviews?project=' + serverName + '&pages=' + encodedPageName,
					pageExists : true,
					noticeProjectRestrict : [ 'wikipedia' ]
				},
				'Transclusions' : {
					url : '//' + serverName + '/w/index.php?title=Special:WhatLinksHere/' + encodedPageName + '&hidelinks=1&hideredirs=1',
					namespaceRestrict : [2, 4, 5, 10, 11, 12, 13, 100, 101]
				}
			},
			'Tools' : {
				'Check external links' : {
					url : 'http://dispenser.homenet.org/~dispenser/cgi-bin/webchecklinks.py?page=' + encodedPageName + '&lang=' + contentLanguage,
					pageExists : true,
					noticeProjectRestrict : [ 'wikipedia' ]
				},
				'Check redirects' : {
					url : 'http://dispenser.homenet.org/~dispenser/cgi-bin/rdcheck.py?page=' + encodedPageName + '&lang=' + contentLanguage,
					pageExists : true,
					noticeProjectRestrict : [ 'wikipedia' ]
				},
				'Copyright vio detector' : {
					url : '//tools.wmflabs.org/copyvios?lang='+  contentLanguage + '&project=' + noticeProject + '&title=' + encodedPageName + '&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=' + encodedPageName + '&lang=' + contentLanguage,
					pageExists : true,
					noticeProjectRestrict : [ 'wikipedia' ]
				},
				'Expand bare references' : {
					url : '//tools.wmflabs.org/refill/result.php?page=' + encodedPageName + '&defaults=y&wiki=' + contentLanguage,
					pageExists: true,
					namespaceRestrict : [ 0, 2, 118 ]
				},
				'Peer reviewer' : {
					url : 'http://dispenser.homenet.org/~dispenser/view/Peer_reviewer#page:' + encodedPageName,
					pageExists : true,
					databaseRestrict : [ 'enwiki' ],
					namespaceRestrict : [ 0, 2, 118 ]
				},
				'Transclusion count' : {
					url : '//tools.wmflabs.org/templatecount/index.php?lang=' + contentLanguage + '&name=' + encodedPageName + '&namespace=' + namespaceNumber,
					namespaceRestrict : [2, 4, 5, 10, 11, 12, 13, 100, 101],
					noticeProjectRestrict : [ 'wikipedia' ]
				}
			},
			'XfDs' : {
				url : 'javascrit:void(0)'
			},
			'Change model' : {
				url : mw.util.getUrl( 'Special:ChangeContentModel/' + pageName ),
				userPermissions : [ 'editcontentmodel' ],
				pageExists : true,
				namespaceRestrict : [ 2, 4, 8, 100, 108, 828 ]
			},
			'Change protection' : {
				url : mw.util.getUrl( pageName, { action: 'protect' } ),
				userPermissions : [ 'protect', 'stablesettings' ],
				isProtected : true
			},
			'Delete page' : {
				url : '//' + serverName + '/w/index.php?title=' + encodedPageName + '&action=delete' + ( $( '#delete-reason' ).text() ? '&wpReason=' + $( '#delete-reason' ).text() : ''),
				userPermissions : [ 'delete' ],
				pageExists : true
			},
			'Edit intro' : {
				url : '//' + serverName + '/w/index.php?title=' + encodedPageName + '&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 : '//' + serverName + '/w/index.php?title=' + encodedPageName + '&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 dependencies = [];

	if ( !$.jStorage ) dependencies.push( 'jquery.jStorage' );
	if ( !Object.keys ) dependencies.push( 'es5-shim' );

	// initialize script
	mw.loader.using( dependencies, function() {
		var menus = [];

		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();
			}
		}

		$( '#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 personaljscss = {
       		   'common.js' : 'common-js',
	           'vector.js' : 'vector-js',
	           'monobook.js' : 'monobook-js',
	           'modern.js' : 'modern-js',
	           'cologneblue.js' : 'cologneblue-js',
	           'common.css' : 'common-css',
	           'vector.css' : 'vector-css',
	           'monobook.css' : 'monobook-css',
	           'modern.css' : 'modern-css',
	           'cologneblue.css' : 'cologneblue-css'
    	};

	    $( '#c2-user-personaljscss' ).hide();
	    if ( mwDBname === 'enwiki' ) {
	      apiGet( {
	          titles : $.map( Object.keys( personaljscss ), function( randomname, i ) {
	        		  return  'User:' + userName +  '/' + randomname;
	    		   } ).join( '|' ),
	    		 prop: 'info'
	    	 } ).done( function( data ) {
	    		 var pages = data.query.pages;
		         for ( var id in pages ) {
				          if ( id > 0 ) {
				            $( '#c2-user-personaljscss' ).show();
				            var key = pages[id].title.replace( 'User:' + userName + '/', '' );
				            $( '#c2-user-personaljscss-' + personaljscss[key] ).find( 'a' ).show();
				 }
	    	  	}
	      	} );
	    }
    
		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]] && metaUserGroups[groups[i]].addRemoveGroups ) {
				ret = true;
				break;
			} else {
				// clear cache and fallback to false
				$.jStorage.deleteKey( 'metaUserGroups' );
				ret = false;
			}
		}
		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() + 1 ) );
			}

			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: 99;">' +
							'<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>