User:NQ-test/script1.js
Appearance
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
Documentation for this user script can be added at User:NQ-test/script1. |
/*********************************************************************
** ***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 – Σ' : {
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§ion=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 + '…</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>