User:Wikinsbr/global.js

From Meta, a Wikimedia project coordination wiki

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
// [[File:Krinkle_RTRC.js]]
mw.loader.load('//meta.wikimedia.org/w/index.php?title=User:Krinkle/RTRC.js&action=raw&ctype=text/javascript');
/* Change language */
mw.loader.using( 'mediawiki.user', function() {
	if ( mw.user.options.get( 'language' ) !== 'pt' ) {
		( new mw.Api() ).postWithToken( 'csrf', {
			action: 'options',
			change: 'language=pt'
		} ).done( function() {
			mw.loader.using( [], function() {
				mw.notify( 'O idioma foi alterado para o português. Reinicie a página para a mudança.' );
			} );
		} );
	} else {
		console.log( 'O idioma foi alterado para o português!' );
	}
} );
// <nowiki>
/*#############################################
### Ajax sysop
### 	DO NOT COPY AND PASTE, instead see http://meta.wikimedia.org/wiki/User:Pathoschild/Scripts/Ajax_sysop#Installation
###	(it is occasionally updated with bug fixes and new features).
###	By [[user:Pathoschild]] (Jesse Plamondon-Willard)
##############################################*/
/*************
*** import required libraries
*************/
mw.loader.load('//meta.wikimedia.org/w/index.php?title=User:Pathoschild/Scripts/MooTools.js&action=raw&ctype=text/javascript&9');

/*************
*** initialize
*************/
// configuration options:
// 	disable_patrol:true
if(!ajax_sysop_config)
	var ajax_sysop_config = {};

// global for calling functions on user action
var ajax_sysop = {};

/*************
*** Debug function (never called by code)
*************/
function ajax_sysop_debug() {
	return 'Ajax sysop version: 0.2.10';
}

/*************
*** Main (run each page load)
*************/
function ajax_sysop_main() {
	/*****************
	** Error-checking
	*****************/
	// WikiMooTools not loaded yet
	if(!window.$chk) {
		setTimeout('ajax_sysop_main()', 500);
		return;
	}

	/*************
	*** Add CSS
	*************/
	mw.util.addCSS(
		// formatted box
		  '.as_box { position:relative; margin-top:2em; padding:0.5em; border:1px solid #CCC; background:#EEE; }\n'
		+ '.as_box_title { position:absolute; top:-1em; left:0.5em; padding:0 0.5em; border:1px solid #CCC; border-bottom:0; background:#EEE; }\n'
		// deletion form
		+ '.as_del_sublist li { font-weight:bold; }\n'
		+ '.as_del_sublist li ul { font-weight:normal; }\n'
		+ '.as_del_empty { color:gray; }\n'
		// fix shifting line-heights in lists
		+ '.smallloader img { height:16px; width:16px; }\n'
	);

	/*****************
	** variables
	*****************/
	var body = $('bodyContent');
	var path = mw.config.get('wgServer') + '/wiki/';

	// create trackers
	ajax_sysop.src_fail = '//upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Achtung.svg/32px-Achtung.svg.png';

	/*****************
	** AJAX patrolling
	** 	- one-click patrol link (on Special:Watchlist, Special:Recentchanges, and diff/newpage view with rcid)
	*****************/
	if(!ajax_sysop_config.disable_patrol) {
		/* get list of potential patrol links */
		var text;
		var links = [];
		if(mw.config.get('wgCanonicalSpecialPageName')=='Watchlist' || mw.config.get('wgCanonicalSpecialPageName')=='Recentchanges') {
			text  = 'patrol';
			links = body.getElements('a');
		}
		else if(location.href.match('rcid')) {
			text = 'AJAX';
			var box = body.getElements('.patrollink');
			if(box.length>0)
				links = box[0].getElements('a');
		}

		/* add ajax if patrol links */
		for(var len=links.length, i=0; i<len; i++) {
			var href = links[i].getProperty('href');
			if(href && href.match('rcid')) {
				var rcid = href.replace(/^.*rcid=(\d+).*$/, '$1');

				// add ajax patrol link
				var box = new Element('sup', {'id':'as_patrol_'+rcid});
				box.appendChild(
					new Element('a', {
						'html':'(' + text + ')',
						'href':'javascript:ajax_sysop.patrol("' + rcid + '");',
						'id':'as_patrol_link'
						}
					)
				);
				box.inject(links[i], 'after');
			}
		}

		/* patrol page on click of AJAX link */
		ajax_sysop.patrol = function(rcid) {
			/* get references */
			var span = $('as_patrol_'+rcid);

			// display error message
			function asp_error(text) {
				// re-add AJAX link
				span.text += '(';
				span.adopt(link);
				span.text += ')';

				// display error message
				span.adopt(new Element('br'));
				span.adopt(
					new Element('img', {
						'src':ajax_sysop.src_fail,
						'height':'16px',
						'width':'16px'
					})
				);
				span.text += 'AJAX patrol failed: ' + api.status + ', "' + api.statusText + '".';
			}

			/* show loading indicator */
			span.empty();
			span.adopt(wmt_loader({'class':'smallloader'}));

			/* get edit token */
			if(ajax_sysop.token)
				cPatrol();
			else
				wmt_token({onSuccess:cToken});
			function cToken(token) {
				ajax_sysop.token = token;
				cPatrol();
			}

			/* patrol page */
			function cPatrol() {
				var request = new Request({
					url: mw.config.get('wgServer')+mw.config.get('wgScriptPath')+'/api.php?format=xml&action=patrol&token='+encodeURIComponent(ajax_sysop.token)+'&rcid='+rcid,
					method: 'GET',
					onSuccess: function(responseText, responseXML) {
						// if API errors
						var errors = responseXML.getElementsByTagName('error');
						if(errors.length)
							asp_error('AJAX patrol error: "' + errors[0].getAttribute('info') + '".');
						// else success!
						else {
							span.empty();
							span.adopt(document.createTextNode(' (patrolled)'));
						}
					},
					onFailure: function(xhr) {
						asp_error('AJAX patrol error: ' + xhr.status + ' (' + xhr.statusText + ')');
					}
				});
				request.send();
			}
		};
	}

	/*****************
	** AJAX rollback
	** 	- one-click rollback (on Special:Contributions, action=history)
	*****************/
	if(mw.config.get('wgCanonicalSpecialPageName')=='Contributions' || mw.config.get('wgAction')=='history') {
		/* add links */
		var rbspans = ajax_sysop.rbspans = $$('#bodyContent .mw-rollback-link');
		for(var i=0; i<rbspans.length; i++) {
			rbspans[i].adopt(
				new Element('sup', {
					'id':'ass_rb_' + i
				}).adopt(
					new Element('a', {
						'text':'(AJAX)',
						'href':'javascript:ajax_sysop.rollback(' + i + ');'
					})
				)
			);
		}

		/* rollback functions */
		ajax_sysop.rollback = function(i) {
			/* generate query URL */
			var href  = ajax_sysop.rbspans[i].getElement('a').get('href');
			var query = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?format=xml&action=rollback'
			          + '&title='   + href.match(/title=([^&]+)/)[1]
			          + '&user='    + href.match(/from=([^&]+)/)[1]
			          + '&token='   + href.match(/token=([^&]+)/)[1]
			          + '&markbot=' + ($('bot') && $('bot').get('value') ? 1 : 0);

			/* add placeholder */
			var span = $('ass_rb_' + i);
			span.empty();
			span.adopt(wmt_loader({'class':'smallloader'}));

			/* send query */
			new Request({
				'url':query,
				'method':'POST',
				'onSuccess':function(responseText, responseXML) {
					span.empty();

					// API errors
					var errors = responseXML.getElementsByTagName('error');
					if(errors.length)
						span.set('text', 'AJAX patrol error: "' + errors[0].getAttribute('info') + '".');

					// success
					else
						span.set('text', '(rollbacked)');
				},
				onFailure: function(xhr) {
					span.empty();
					span.set('text', 'AJAX patrol error: ' + xhr.status + ' (' + xhr.statusText + ')');
				}
			}).send();
		};
	}

	/*****************
	** Special contributions
	**	- link to enable/disable bot mode
	*****************/
	if(mw.config.get('wgCanonicalSpecialPageName')=='Contributions') {
		var toggleTo = false;
		var form = $('newbie').getParent('form');

		/* if bot=1, note and remove hidden field */
		if(document.getElementsByName('bot').length) {
			toggleTo = true;
			var field = document.getElementsByName('bot')[0];
			$(field).getParent().removeChild(field);
		}

		/* add options box */
		var box;
		form.adopt(
			// main box
			box = ajax_sysop.formattedBox().adopt(
				// bot mode checkbox
				new Element('input', {
					'type':'checkbox',
					'id':'bot',
					'name':'bot',
					'checked':toggleTo,
					'events':{
						'click':function() {
							var enable = $('bot').get('checked');
							$$('#bodyContent .mw-rollback-link').each(function(link) {
								link.getElementsByTagName('a')[0].href += '&bot=' + (enable?1:0);
							});
						}
					}
				})
			).adopt(
				// bot mode label
				new Element('label', {
					'for':'bot',
					'text':'Bot rollback flag (hide rollbacks on watchlists and Special:RecentChanges)'
				})
			)
		);
	}

	/*****************
	** deletion form
	**	- list of subpages
	**	- block log (on user & user talk pages)
	*****************/
	if(mw.config.get('wgAction')=='delete') {
		var form;
		if(mw.config.get('wgNamespaceNumber')==6)
			form = $('mw-img-deleteconfirm');
		else
			form = $('deleteconfirm').getParent();

		/**********
		* Prepare output
		**********/
		var box = ajax_sysop.formattedBox();
		form.adopt(box);

		/**********
		* determine namespace
		**********/
		if((mw.config.get('wgNamespaceNumber')%2)==0)
			var ns_main = mw.config.get('wgNamespaceNumber');
		else
			var ns_main = mw.config.get('wgNamespaceNumber')-1;
		var ns_talk = ns_main+1;

		/**********
		* List subpages
		**********/
		// prepare output
		var e = {
			/* headers */
			// 'Subpages'
			'h_subpages':new Element('h2', {
				'text':'Subpages'
			}),
			// 'main pages'
			'sh_main':new Element('li', {
				'text':'main pages'
			}),
			// 'talk pages'
			'sh_talk':new Element('li', {
				'text':'talk pages'
			}),

			/* lists */
			// main list
			'ul':new Element('ul', {
				'class':'as_del_sublist'
			}),
			// main pages
			'ul_main':new Element('ul'),
			// talk pages
			'ul_talk':new Element('ul')
		};

		e.ul_main.adopt(wmt_loader({container:new Element('li')}));
		e.ul_talk.adopt(wmt_loader({container:new Element('li')}));
		e.ul.adopt(e.sh_main);
		e.ul.adopt(e.ul_main);
		e.ul.adopt(e.sh_talk);
		e.ul.adopt(e.ul_talk);

		box.adopt(e.box_label);
		box.adopt(e.h_subpages);
		box.adopt(e.ul);

		var list_main = e.ul_main;
		var list_talk = e.ul_talk;
		delete e;

		/* page list */
		function cListPages(titles, box) {
			box.empty();
			var length = titles.length;

			if(length==0)
				box.adopt(new Element('li', {'text':'None', 'class':'as_del_empty'}));
			else {
				for(var i=0; i<length; i++) {
					box.adopt(
						new Element('li').adopt(
							new Element('a', {
								'href':mw.config.get('wgServer') + mw.config.get('wgArticlePath').replace('$1', titles[i]), text:titles[i]
							})
						)
					);
				}
			}
		}
		function cListFailed(xhr, box) {
			box.empty();
			box.adopt(new Element('li', {'text':'error ' + xhr.status + ' (' + xhr.statusText + ').'}));
		}

		// send queries
		wmt_prefixindex({'namespace':ns_main, 'onSuccess':cListPages, 'onFailure':cListFailed, 'subpagesOnly':true, 'passOn':list_main});
		wmt_prefixindex({'namespace':ns_talk, 'onSuccess':cListPages, 'onFailure':cListFailed, 'subpagesOnly':true, 'passOn':list_talk});

		/**********
		* Block log
		**********/
		if(mw.config.get('wgNamespaceNumber')==2 || mw.config.get('wgNamespaceNumber')==3) {
			// prepare output
			box.adopt(new Element('h2', {'text':'Block log'}));
			var log = new Element('ul');
			box.adopt(log);
			log.adopt(new Element('li').adopt(wmt_loader()));

			// add block log after query
			function cBlockLog(responseText, responseXML) {
				log.empty();

				var entries = responseXML.getElementsByTagName('item');
				var length = entries.length;

				if(length==0)
					log.adopt(new Element('li', {'text':'Never blocked', 'class':'as_del_empty'}));

				else {
					// list entries
					var entry;
					for(var i=0; i<length; i++) {
						// alias values
						var blocker   = entries[i].getAttribute('user');
						var timestamp = entries[i].getAttribute('timestamp');
						var action    = entries[i].getAttribute('action');
						var reason    = entries[i].getAttribute('comment');
						if(action=='block') {
							var duration = entries[i].getElementsByTagName('block')[0].getAttribute('duration');
							var flags    = entries[i].getElementsByTagName('block')[0].getAttribute('flags');
						}

						// block details string
						var date = timestamp.replace(/^(\d+-\d+-\d+)T(\d+:\d+).+$/, '$1 $2') + ' ';
						var block_details = '';
						if(action=='block') {
							// block length
							if(duration=='indefinite')
								block_details += ' blocked indefinitely ';
							else
								block_details += ' blocked for ' + duration + ' ';

							// block flags
							if(flags!='')
								block_details += '[' + flags + '] ';
							else
								block_details += ' unblocked ';

							// output
							var item = new Element('li');
							item.adopt(document.createTextNode(' '));
							item.adopt(
								new Element('a', {
									'href':mw.config.get('wgServer') + mw.config.get('wgArticlePath') + 'user:' + blocker,
									'text':blocker
								})
							);
							item.adopt(document.createTextNode(block_details + '('));
							item.adopt(new Element('small', {'text':reason}));
							item.adopt(document.createTextNode(')'));

							log.adopt(item);
						}
					}
				}
			}
			function cBlockLogFailure(xhr) {
				log.empty();
				log.adopt(new Element('li', {'text':'error ' + xhr.status + ' (' + xhr.statusText + ').'}));
			}

			// send query
			new Request({
				'url':mw.config.get('wgServer')+mw.config.get('wgScriptPath')+'/api.php?format=xml&lelimit=500&action=query&list=logevents&letype=block&letitle=User:' + mw.config.get('wgTitle').match(/^[^\/]+/),
				'onSuccess':cBlockLog,
				'onFailure':cBlockLogFailure
			}).send();
		}
	}
}

/*****************
** Return formatted box to make ajax sysop options stand out
*****************/
ajax_sysop.formattedBox = function(o) {
	/* defaults */
	if(!o) var o = {};
	if(!o.id) o.id = '';
	if(!o.tag) o.tag = 'div';
	if(!o.box_styles) o.box_styles = {};
	
	/* create & return element */
	return new Element(o.tag, {
		'id':o.id,
		'class':'as_box',
		'styles':o.box_styles
	}).adopt(
		new Element('div', {
			'text':'Ajax sysop',
			'class':'as_box_title'
		})
	);
}
$(ajax_sysop_main);
// </nowiki>
/* Warning! Global gadget file! */
$( function($) {
	$( '.mw-rollback-link a' ).click( function(e) {
		e.preventDefault();
		var $el = $(this);
		$.ajax({
			url: $el.attr('href'),
			success: function() {	
				// [[phab:T29606]]
				var user = mw.util.getParamValue( 'from', $el.attr('href') ).replace(/\+/g, '_');
				location.href = mw.util.getUrl( 'Special:Contributions/' + user );
			},
			error: function(){
				$el.text(function( i, val ) {
					return val + ' [failed]';
				} );		
			}
		});
	} );
});
/** userRights (for Bureaucrats only) **/
$( function() {
	if ( wgNamespaceNumber != 2 && wgNamespaceNumber != 3 ) { // User or User talk
		return;
	}
	var user = wgTitle.split( '/' )[0];
	var url = wgScript + '?title=Special:UserRights&user=' + encodeURIComponent( user );
	mw.util.addPortletLink( 'p-tb', url, 'User rights', 't-userrights', 'List of user groups for ' + user );
});
mw.loader.load( '//commons.wikimedia.org/w/index.php?title=MediaWiki:Gadget-HotCat.js&action=raw&ctype=text/javascript' );
/**
 * Nom : DeluxeHistory
 * Implémentation originale de Dake, basée sur du code Ajax de GôTô
 * Réécriture complète par Dr Brains et Od1n, avec améliorations de Ltrlg
 * Dépendances :
 *  — les habituelles implicites 'mediawiki' & 'jquery' ;
 *  — 'user' (chargement du common.js).
 * {{Catégorisation JS|DeluxeHistory}}
 */

/*global document, localStorage, mw, $ */
/*jslint vars: true, plusplus: true */

mw.loader.using(['mediawiki.util', 'user', 'user.options'], function () {
    'use strict';

    if (!mw.user.options.get('gadget-DeluxeHistory')) {
        importStylesheet('MediaWiki:Gadget-DeluxeHistory.css');
    }

    var botMembers, sysopMembers;

    /////////////////////////////////////// DÉTECTION SUPPORT LOCALSTORAGE ///////////////////////////////////////

    var supportLocalStorage, dateNow, dateNowUTC;
    try {
        localStorage.setItem('modernizr', 'modernizr');
        localStorage.removeItem('modernizr');
        supportLocalStorage = true;
    } catch (e) {
        supportLocalStorage = false;
    }

    if (supportLocalStorage) {
        dateNow = new Date();
        dateNowUTC = dateNow.getTime() + dateNow.getTimezoneOffset() * 60000;
    }

    /////////////////////////////////////// FONCTIONS DE TRAITEMENT DES LIENS ///////////////////////////////////////

    var nsSpecial = mw.config.get('wgFormattedNamespaces')[-1] + ':';
    var watcherName = mw.config.get('wgUserName');

    function isUserIP(jUserlink) {
        // Les liens des IP sont de la forme « Spécial:Contributions/<IP> »
        return jUserlink[0].title.indexOf(nsSpecial) === 0;
    }

    function getUserClass(jUserlink) {
        var UserName = jUserlink.text();
        if (UserName === watcherName) { return 'UserIs-Self'; }
        if (botMembers.indexOf(UserName) > -1) { return 'UserIs-Bot'; }
        if (sysopMembers.indexOf(UserName) > -1) { return 'UserIs-Sysop'; }
        if (isUserIP(jUserlink)) { return 'UserIs-IP'; }
        return 'UserIs-User';
    }

    // Renvoie 'UserIs-…' si un seul type, 'UserIs-Mixed' sinon (RC "améliorée").
    // Colore les liens vers les utilisateurs pour disposer de la différentiation même si historique mixte.
    function getMultipleClassName(jUserlinks) {
        var className = '';
        var localClassName;
        jUserlinks.each(function() {
            var $this = $(this);
            localClassName = getUserClass($this);
            $this.addClass(localClassName);
            if (className === '') {
                className = localClassName;
            } else if (className !== localClassName) {
                className = 'UserIs-Mixed';
            }
        });
        return className;
    }

    function userGroupClassName(Li) {
        var jLi = $(Li);
        var jUserlink = jLi.find('a.mw-userlink');
        if (jUserlink.length > 0) {
            if (jLi.find('.changedby').length === 0) {  // groupe des RC "améliorées"
                jLi.addClass(getUserClass(jUserlink));
            } else {
                jLi.addClass(getMultipleClassName(jUserlink) + ' UserIs-Multiple');
            }
        }
    }

    /////////////////////////////////////// FONCTIONS DE PARCOURS DES ÉLÉMENTS ///////////////////////////////////////

    function get_bodyContent() {
        var Content = document.getElementById('bodyContent');
        if (!Content) { Content = document.getElementById('mw_contentholder'); }
        if (!Content) { Content = document.getElementById('article'); }
        return Content;
    }

    function scan_first_ul() {
        var Content = get_bodyContent();
        $(Content).find('ul').eq(0).find('li').each(function () {
            userGroupClassName(this);
        });
    }

    function scan_ul_special_li() {
        $('ul.special li').each(function () {
            userGroupClassName(this);
        });
    }

    function scan_td() {
        $('td').each(function () {
            userGroupClassName(this);
        });
    }

    /////////////////////////////////////// FONCTIONS DE SÉLECTION DES FILTRES ///////////////////////////////////////

    function process_History() {
        $('#pagehistory, .flow-board-history').find('li').each(function () {
            userGroupClassName(this);
        });
    }

    function process_Watchlist() {
        scan_ul_special_li(); // Liste de suivi normale
        scan_td(); // Liste de suivi "améliorée"
    }

    function process_Recentchanges() {
        scan_ul_special_li(); // RC normale
        scan_td(); // RC "améliorées"
    }

    function process_Recentchangeslinked() {
        scan_ul_special_li(); // RC liées normales
        scan_td(); // RC liées "améliorées"
    }

    function process_Newpages() {
        scan_first_ul();
    }

    function process_Log() {
        scan_first_ul();
    }

    function process_AbuseLog() {
        scan_first_ul();
    }

    function process_OtherPages() {
        scan_ul_special_li();
    }

    /////////////////////////////////////// LANCEMENTS ///////////////////////////////////////

    var DeluxeHistory_ClassesApplied = false;
    var DeluxeHistory_Enabled = $.extend({
        "history": true,
        "watchlist": true,
        "recentchanges": true,
        "recentchangeslinked": true,
        "newpages": true,
        "log": true,
        "abuseLog": true,
        "other": true
    }, window.DeluxeHistory_Enabled);

    function enabled(pageType) {
        switch( $.type(DeluxeHistory_Enabled[pageType]) ) {
            case 'boolean':
                return DeluxeHistory_Enabled[pageType];
            case 'function':
                return DeluxeHistory_Enabled[pageType]();
            default:
                return false;
        }
    }

    function applyClasses() {
        if (botMembers && sysopMembers && !DeluxeHistory_ClassesApplied) {
            DeluxeHistory_ClassesApplied = true;

            var paramAction = mw.config.get('wgAction');
            var paramCanonicalSpecialPageName = mw.config.get('wgCanonicalSpecialPageName');

            if ( paramAction === 'history' ) {
                if( enabled("history") ) {
                    $(document).ready(process_History);
                }
            } else if ( paramCanonicalSpecialPageName === 'Watchlist' ) {
                if( enabled("watchlist") ) {
                    $(document).ready(process_Watchlist);
                }
            } else if ( paramCanonicalSpecialPageName === 'Recentchanges' ) {
                if( enabled("recentchanges") ) {
                    $(document).ready(process_Recentchanges);
                }
            } else if ( paramCanonicalSpecialPageName === 'Recentchangeslinked' ) {
                if( enabled("recentchangeslinked") ) {
                    $(document).ready(process_Recentchangeslinked);
                }
            } else if ( paramCanonicalSpecialPageName === 'Newpages' ) {
                if( enabled("newpages") ) {
                    $(document).ready(process_Newpages);
                    mw.util.addCSS('.not-patrolled { text-decoration: underline !important; }');
                }
            } else if ( paramCanonicalSpecialPageName === 'Log' ) {
                if( enabled("log") ) {
                    $(document).ready(process_Log);
                }
            } else if ( paramCanonicalSpecialPageName === 'AbuseLog' ) {
                if( enabled("abuseLog") ) {
                    $(document).ready(process_AbuseLog);
                }
            } else {
                if( enabled("other") ) {
                    $(document).ready(process_OtherPages);
                }
            }
        }
    }

    /////////////////////////////////////// RÉCUPÉRATION DE LA LISTE DES BOTS ET SYSOPS ///////////////////////////////////////

    var validCache;

    function updateUserList(Group, UserList, UserContinue) {
        if (!UserList) { UserList = []; }

        var paramUserGroups = mw.config.get('wgUserGroups');
        var APILimit = paramUserGroups.indexOf('sysop') > -1 || paramUserGroups.indexOf('bot') > -1
            ? 5000 : 500;
        var params = {
            'format'   : 'json',
            'action'   : 'query',
            'list'     : 'allusers',
            'aulimit'  : APILimit,
            'augroup'  : Group,
            'continue' : '' // https://www.mediawiki.org/wiki/API:Query#Continuing_queries
        };
        if (UserContinue) {
            $.extend(params, UserContinue);
        }

        $.get(mw.util.wikiScript('api'), params, function (data) {
            $.each(data.query.allusers, function () {
                UserList.push(this.name);
            });
            if (data['continue']) {
                updateUserList(Group, UserList, data['continue']);
            } else {
                if (supportLocalStorage) {
                    var storedValue = UserList.join('|');
                    localStorage.setItem('HistoryDeluxe_' + Group, storedValue);
                    localStorage.setItem('HistoryDeluxe_lastUpdate', dateNowUTC);
                }
                if (Group === 'bot') {
                    botMembers = UserList;
                } else if (Group === 'sysop') {
                    sysopMembers = UserList;
                }
                applyClasses();
            }
        });
    }

    function testCacheValidity() {
        var lastUpdate;
        if (supportLocalStorage) {
            lastUpdate = localStorage.getItem('HistoryDeluxe_lastUpdate');
            validCache = lastUpdate && dateNowUTC - lastUpdate < 1000 * 3600 * 24 && dateNowUTC - lastUpdate > 0;
        } else {
            validCache = false;
        }
    }

    // Exécutée si validCache, ie. si (supportLocalStorage && lastUpdate pas trop loin)
    function getUserList(Group) {
        var storedValue;
        storedValue = localStorage.getItem('HistoryDeluxe_' + Group);
        return storedValue ? storedValue.split('|') : null;
    }

    /////////////////////////////////////// INITIALISATION ///////////////////////////////////////

    testCacheValidity();

    if (validCache) {
        botMembers = getUserList('bot');
        sysopMembers = getUserList('sysop');
        applyClasses();
    } else {
        updateUserList('bot');
        updateUserList('sysop');
    }

});
window.LiveRC_getSiteCustom = function (){
	// Here comes the configuration
}
mw.loader.load( '//fr.wikipedia.org/w/index.php?title=MediaWiki:Gadget-LiveRC.js&action=raw&ctype=text/javascript' );
/** subpages **/
$( function () {
	var NSWithoutSubpages = [ -1, 6, 8, 12, 13, 14, 15, 104, 105 ];
	if ( NSWithoutSubpages.indexOf( mw.config.get( 'wgNamespaceNumber' ) ) === -1 ) {
		var subpagesLink = mw.util.getUrl( 'Special:PrefixIndex/' + mw.config.get( 'wgPageName' ) + '/' );
		mw.util.addPortletLink( 'p-tb', subpagesLink, 'Subpages', 't-subpages', 'Subpages of this page' );
	}
} );