User:TheNozomi/global.js

window.UseCSS = { skin: '', init: function { if (window.location.href.indexOf('usesitecss=') == -1) return; var url = UseCSS.parseURL(window.location.href); if (url.query.usesitecss) { UseCSS.skin = (url.query.usewikicss || url.query.usesitecss); }		if (UseCSS.skin != '') { $(document.body).bind('click.usecss', UseCSS.clicEvent); $('form').bind('submit.usecss', UseCSS.submitEvent); }	},	parseURL: function(url) { var ret = {base:,qs:,query:{},hash:''}; var loc = url.indexOf('#'); if (loc != -1) { ret.hash = url.substr(loc+1); url = url.substr(0,loc); }		loc = url.indexOf('?'); if (loc != -1) { ret.qs = url.substr(loc+1); url = url.substr(0,loc); var paras = ret.qs.split('&'); for (var i = 0; i < paras.length; i++) { var p = paras[i].split('='); if (p.length == 2) { ret.query[p[0]] = p[1]; }			}		}		ret.base = url; return ret; },	getURL: function(url) { var nurl = url.base + '?'; for (var p in url.query) { nurl += p + '=' + url.query[p] + '&'; }		nurl = nurl.substr(0,nurl.length-1); if (url.hash != '') { nurl += '#'+ url.hash; }		return nurl; },	clicEvent: function(e) { if (e.target.tagName.toLowerCase != 'a') return; if (e.target.href.indexOf(window.wgServer) != 0) return; var url = UseCSS.parseURL(e.target.href); var thisloc = UseCSS.parseURL(window.location.href); if (url.base == thisloc.base && url.qs == thisloc.qs && url.hash != '') { return; }		if (url.query.usesitecss && url.query.usesitecss != UseCSS.skin) { url.query.usewikicss = UseCSS.skin; } else { url.query.usesitecss = UseCSS.skin; }		e.target.href = UseCSS.getURL(url); },	submitEvent: function(e) { if (this.action.indexOf(window.wgServer) != 0) return; if (this.method == 'post') { var url = UseCSS.parseURL(this.action); url.query.usesitecss = UseCSS.skin; this.action = UseCSS.getURL(url); } else { $(this).append(''); }	},	stop: function { $(document.body).unbind('click.usecss'); $('form').unbind('submit.usecss'); } }; $(UseCSS.init);

(function {   if ($('.mw-rollback-link').length || $('.mw-custom-rollback-link').length) {        return;    }    var config = mw.config.get([ 'wgAction', 'wgPageName', 'wgContentLanguage', 'wgCanonicalSpecialPageName' ]),   i18n = {        'en': {            title: '"Rollback" reverts edit(s) to this page of the last contributor in one click',            failGeneral: 'Unable to rollback',            failRevisions: 'Failed to get revisions',            failContent: 'Failed to get page content',            failEditor: 'No different editor found',            failPublish: 'Failed to publish edit',            success: 'Rollback successful',            rollback: 'rollback',            summary1: 'Reverted edits by',            summary2: 'to last version by',            script: 'script',            talk: 'talk',            block: 'block'        },        'be': {            title: 'Адкат дазваляе прыбраць змены, занесеныя апошнім рэдактарам, у адзін клік',            failGeneral: 'Не ўдалося адкаціць',            failRevisions: 'Не ўдалося зрабіць змены',            failContent: 'Не ўдалося атрымаць змесціва старонкі', failEditor: 'Рэдактар не знойдзены', failPublish: 'Не ўдалося апублікаваць змены', success: 'Адкат паспяхова завершаны', rollback: 'адкат', summary1: 'Адкочаныя змены:', summary2: 'да апошняй версіі ад', script: 'скрыпт', talk: 'сцяна', block: 'заблакаваць' },       'de': { title: 'Macht alle letzten Änderungen der Seite, die vom gleichen Benutzer vorgenommen worden sind, durch nur einen Klick rückgängig.', failGeneral: 'Zurücksetzten ist nicht möglich', failRevisions: 'Versionsgeschichten konnten nicht geladen werden', failContent: 'Seiteninhalt konnte nicht geladen werden', failEditor: 'Es wurde kein anderer Bearbeiter gefunden', failPublish: 'Bearbeitung konnte nicht veröffentlicht werden', success: 'Erfolgreich zurückgesetzt', rollback: 'Zurücksetzen', summary1: 'Rückgängig machen von Änderungen durch', summary2: 'zu der letzten Version von', script: 'Skript', talk: 'Diskussion', block: 'Sperren' },       'es': { title: '«Revertir» revierte todas las ediciones del último usuario con un solo clic', failGeneral: 'No se ha podido revertir', failRevisions: 'Error al obtener revisiones', failContent: 'Error al obtener contenido de la página', failEditor: 'No se han encontrado editores diferentes', failPublish: 'Error al publicar la edición', success: 'Revertido correctamente', rollback: 'revertir', summary1: 'Revertidos los cambios de ', summary2: 'a la última edición de', script: 'script', talk: 'disc.', block: 'bloquear' },       'fr': { title: 'Rollback révoque la/le(s) modification(s) du dernier contributeur de cette page en un clic', failGeneral: 'Impossible de révoquer', failRevisions: 'Échec de l\'obtention des révisions', failContent: 'Échec de l\'obtention du contenu de la page', failEditor: 'Aucun éditeur différent n\'a été trouvé', failPublish: 'Échec de la publication de la modification', success: 'Révocation(s) réussie(s) !', rollback: 'révocation', summary1: 'Révocation des modifications de', summary2: 'à la dernière version de', script: 'script', talk: 'discussion', block: 'bloquer' },       'it': { title: '"Rollback" annulla le modifiche a questa pagina dell\'ultimo contributore con un solo clic', failGeneral: 'Impossibile eseguire il rollback', failRevisions: 'Impossibile ottenere le modifiche', failContent: 'Impossibile ottenere il contenuto della pagina', failEditor: 'Nessun editor diverso trovato', failPublish: 'Impossibile pubblicare la modifica', success: 'Rollback eseguito correttamente', rollback: 'rollback', summary1: 'Annullate le modifiche di', summary2: ', riportata alla versione precedente di', script: 'script', talk: 'discussione', block: 'blocca' },       'ko': { title: '롤백은 한 클릭안에 편집들을 전 사용자의 개정으로 되돌립니다', failGeneral: '롤백을 할수가 없습니다', failRevisions: '수정을 찾을수가 없었습니다', failContent: '패이지 내용을 찾을수가 없었습니다', failEditor: '다른 편집자를 찾을수가 없었습니다', failPublish: '편집을 올릴수가 없었습니다', success: '롤백 성공', rollback: '롤백', summary1: '사용자의 편집들이 되돌려졌습니다:', summary2: '이 사용자의 개정으로:', script: '스크립트', talk: '톡', block: '블록' },       'pl': { title: 'Rollback pozwala cofać edycje do wersji poprzedniego autora jednym kliknięciem', failGeneral: 'Nie udało się zrewertować edycji', failRevisions: 'Nie udało się pobrać wersji', failContent: 'Nie udało się pobrać zawartości strony', failEditor: 'Strona ma tylko jednego edytora', failPublish: 'Nie udało się opublikować edycji', success: 'Rewert udany', rollback: 'rewert', summary1: 'Wycofano ostatnie edycje użytkownika', summary2: 'do poprzedniej wersji autorstwa', script: 'skrypt', talk: 'dyskusja', block: 'blokada' },       'ru': { title: 'Откат позволяет убрать изменения, внесённые последним редактором, в один клик', failGeneral: 'Не удалось откатить', failRevisions: 'Не удалось сделать изменения', failContent: 'Не удалось получить содержимое страницы', failEditor: 'Редактор не найден', failPublish: 'Не удалось опубликовать изменения', success: 'Откат успешно завершён', rollback: 'откатить', summary1: 'Откаченные изменения:', summary2: 'к последней версии от', script: 'скрипт', talk: 'стена', block: 'заблокировать' },       'tr': { title: 'Geri alma işlemi, son katılımcının bu sayfasını tek bir tıklamayla değiştirir', failGeneral: 'Geri alınamıyor', failRevisions: 'Düzeltmeler alınamadı', failContent: 'Sayfa içeriği alınamadı', failEditor: 'Farklı bir editör bulunamadı', failPublish: 'Düzenleme yayınlanamadı', success: 'Geri alma başarılı', rollback: 'rollback', summary1: 'Yapılan düzenlemeler', summary2: 'son versiyona göre', script: 'komut', talk: 'tartışma', block: 'engelle' },       'uk': { title: 'Відкат дозволяє прибрати зміни, внесені останнім редактором, в один клік', failGeneral: 'Не вдалося відкотити', failRevisions: 'Не вдалося зробити зміни', failContent: 'Не вдалося отримати вміст сторінки', failEditor: 'Редактор не знайдено', failPublish: 'Не вдалося опублікувати зміни', success: 'Відкат успішно завершено', rollback: 'відкинути', summary1: 'Відкочені зміни:', summary2: 'до останньої версії від', script: 'скрипт', talk: 'обговорення', block: 'заблокувати' },       'zh': { title: '回退能一键恢复本页面最后一位编辑者的贡献', failGeneral: '无法回退', failRevisions: '无法获取修订版本', failContent: '无法获取页面内容', failEditor: '无法找到另一位编辑者', failPublish: '发布编辑失败', success: '回退成功', rollback: '回退', summary1: '已恢复由', summary2: '的编辑至最后一个修订版本由', script: '脚本', talk: '讨论', block: '封禁' },       'zh-hant': { title: '回退能一鍵恢復本頁面最後一位編輯者的貢獻', failGeneral: '無法回退', failRevisions: '無法讀取修訂版本', failContent: '無法讀取頁面內容', failEditor: '無法找到另一位編輯者', failPublish: '發布編輯失敗', success: '回退成功', rollback: '回退', summary1: '已恢復由', summary2: '的編輯至最後一個修訂版本由', script: '腳本', talk: '討論', block: '封禁' }   },    lang = i18n[config.wgContentLanguage] || i18n[config.wgContentLanguage.split('-')[0]] || i18n.en; function init { var rollbackLinkParams = { style: 'cursor: pointer', title: lang.title };       if (            config.wgAction === 'history' &&            $('#pagehistory li').length > 1        ) { rollbackLinkParams['data-id'] = config.wgPageName; $('#pagehistory li:first .mw-history-undo a').before(               $(' ', { class: 'mw-custom-rollback-link' }).html( buildElement('a', lang.rollback, rollbackLinkParams) + ' | ' )           );        } else if (            config.wgCanonicalSpecialPageName === 'Contributions'        ) { rollbackLinkParams['data-id'] = $('#mw-content-text ul').find('a:first').attr('title'); $('#mw-content-text ul').find('li').each(               function {                    if ($(this).find('.mw-uctop').length) {                        $(this).append( $(' ', {                               class: 'mw-custom-rollback-link'                            }).html(                                '[' + buildElement('a', lang.rollback, rollbackLinkParams) + ']'                            ) );                   }                }            );        } else if (            $('#differences-nextlink').length === 0 &&            ( $.getUrlVar('diff') || $.getUrlVar('oldid') )       ) {            rollbackLinkParams['data-id'] = config.wgPageName; $('.mw-usertoollinks:last').after(               '    ' +                '[' + buildElement('a', lang.rollback, rollbackLinkParams) + '] '            ); }       $('.mw-custom-rollback-link a').click(            function {                getRevisionIdAndContent($(this).attr('data-id'), handleData);                $(this).parent.remove;            }        ); }   function buildElement(tag, html, attrs) { if (typeof(html) !== 'string') { attrs = html; html = null; }       var h = '<' + tag; for (var attr in attrs) { if (attrs[attr] === false) { continue; }           h += ' ' + attr + '="' + mw.html.escape(attrs[attr]) + '"'; }       return h += html ? ">" + mw.html.escape(html) + "" : "/>"; }   function getRevisionIdAndContent(title, callback) { new mw.Api.get({           action: 'query',            prop: 'revisions',            titles: title,            rvprop: 'user|ids',            rvlimit: 500,            cb: new Date.getTime        }).done(            function(d) {                if (!d.error) {                    callback(title, d);                } else {                    new BannerNotification( lang.failGeneral + ' (' + lang.failRevisions + '): ' + d.error.code, 'error' ).show;               }            }        ).fail(            function {                new BannerNotification( lang.failGeneral + ' (' + lang.failRevisions + ')', 'error' ).show;           }        ); }   function handleData(title, data) { var revisions; for (var i in data.query.pages) { revisions = data.query.pages[i].revisions; }       var currentUser = revisions[0].user, lastUser, revId; for (var i in revisions) { if (revisions[i].user != currentUser) { lastUser = revisions[i].user; revId = revisions[i].revid; break; }       }        if (lastUser) { new mw.Api.get({               action: 'query',                prop: 'revisions',                rvprop: 'content',                revids: revId,                cb: new Date.getTime            }).done(                function(d) {                    if (!d.error) {                        var content = "";                        for (var i in d.query.pages) {                            if (d.query.pages[i].revisions) {                                content = d.query.pages[i].revisions[0]["*"];                            }                        }                        performRollback(title, content, currentUser, lastUser);                    } else {                        new BannerNotification( lang.failGeneral + ' (' + lang.failContent + '): ' + d.error.code,'error' ).show;                   }                }            ).fail(                function {                    new BannerNotification( lang.failGeneral + ' (' + lang.failContent + ')','error' ).show;               }            ); } else { new BannerNotification(               lang.failGeneral + ' (' + lang.failEditor + ')','error'            ).show; }   }    function performRollback(page, text, user, user2) { var summary = lang.summary1 + ' ' + user + ' (' + lang.talk +               ' | ' + lang.block + ') ' + lang.summary2 + user2; if (summary.length > 150) { summary = lang.summary1 + ' ' + user +; }       new mw.Api.post({            action: 'edit',            title: page,            text: text,            summary: summary,            token: mw.user.tokens.values.editToken        }).done(            function(d) {                if (!d.error) {                    new BannerNotification( lang.success + '!', 'confirm' ).show;               } else {                    new BannerNotification( lang.failGeneral + ' (' + lang.failPublish + '): ' + d.error.code,'error' ).show;               }            }        ).fail(            function {                new BannerNotification( lang.failGeneral + ' (' + lang.failPublish + ')', 'error' ).show;           }        ); }   init; });

/* Resize image lightbox dynamically based on browser width */ $(function {   LightboxLoader.lightboxSettings.width = Math.round($(window).width * 0.85);    $(window).resize(function { LightboxLoader.lightboxSettings.width = Math.round($(window).width * 0.85); }); });

// Script imports var WHAMDelay = 100; importArticles({   type: 'script',    articles: [        'u:dev:PortableCSSPad/code.js',        'u:dev:WHAM/code.2.js',        'u:dev:AjaxRedirect/code.js',        'u:dev:FindAndReplace/code.js',        'u:dev:ListFiles/code.js',        'u:dev:Thread Inspection/code.js',        'u:dev:Nuke/code.js',        'u:dev:HoverEditCount.js',        'u:dev:UnhideUserMasthead/code.js',        'u:dev:MastheadGender/code.js',        'u:dev:DupImageList/code.js',        'u:dev:QuickDiff/code.js'    ] });