Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.

  • Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
  • Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
  • Internet Explorer/Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
  • Opera: Strg+F5
//Dokumentation unter [[Benutzer:Schnark/js/extratabs]] <nowiki>
/*global mediaWiki*/
(function ($, mw) {
"use strict";
var data = {
	//Variablen
	action: '', //Aktion
	script: '', //URL zum Skript
	labs: 'https://tools.wmflabs.org/',
	xtools: 'https://xtools.wmflabs.org/',
	user: '', //Benutzername
	realPage: { //tatsächliche Seite
		page: '', //Titel mit Namensraum (Unterstriche)
		title: '', //Titel ohne Namensraum (Leerzeichen)
		href: '', //URL
		ns: 0, //Namensraum (Nummer)
		id: '' //ID der Seite / kanonischer Spezialseitenname
	},
	relevantPage: { //evt. abweichend Seite, auf die sich aktuelle Spezialseite bezieht
		page: '',
		title: '',
		user: '', //Benutzername (falls sich Seite auf einen Benutzer bezieht)
		ns: 0,
		id: ''
	},
	project: {
		server: '', //Hostname
		lang: '', //Sprachecode des Projekts oder commons/meta
		project: '', //Typ des Projekts (wikipedia, wikibooks, ..., wikimedia/wikidata/mediawiki)
		projectShort: '', //Typ des Projekts (wiki, wikibooks, ...), dbname ist lang + projectShort
		dbname: '', //Datenbankname (ohne _p)
		special: false //Spezialwiki: Commons, Meta, Wikidata, Mediawiki
	},
	lang: {
		user: '',
		userFallback: '',
		site: '',
		page: '',
		model: ''
	},
	targets: {
		primary: '', //ID des primären Ziels
		secondary: '', //ID des sekundären Ziels
		map: {} //Standard-ID -> abweichende ID für aktuellen Skin
	}
},
/*jshint camelcase: false*/
//jscs:disable requireCamelCaseOrUpperCaseIdentifiers

//entfernt, in der Hoffnung, dass es irgendwann Ersatz gibt:

//commonsuploadsum: https://tools.wmflabs.org/commonsuploadsum/uploadsum.php
//familiar: http://toolserver.org/~cyroxx/familiar/familiar.php
//gallery: https://tools.wmflabs.org/wikisense/Gallery.php
//geburtstag: http://toolserver.org/~luxo/Geburtstag.php
//grep: https://tools.wmflabs.org/addshore/grep/
//languagetool: http://community.languagetool.org/wikiCheck/pageCheck/index
//mediaviews: https://tools.wmflabs.org/mediaviews
//orphanimages: https://tools.wmflabs.org/wikisense/OrphanImages.php
//rcbytes: https://tools.wmflabs.org/hoo/rcBytes.php
//reverselanglinks: http://toolserver.org/~merl/reverselanglinks/query.php
//revstat: https://tools.wmflabs.org/revertstat
//smallwikisrc: http://toolserver.org/smallwikisrc/rcs
//stats: http://stats.grok.se
//untaggedimages: https://tools.wmflabs.org/wikisense/UntaggedImages.php
//userpages: http://toolserver.org/~merl/UserPages/Changes/
//userregfinder: http://toolserver.org/userregfinder/finder
//wikiviewstats: https://tools.wmflabs.org/wikiviewstats/index.php

tools = {
accounteligibility: function () {
	return {
		url: data.labs + 'meta/accounteligibility/',
		param: {user: data.relevantPage.user},
		example: 'user',
		name: {de: 'Stimmberechtigung (global)', en: 'Eligibility (global)'},
		tooltip: {de: 'Überprüft die Stimmberechtigung für globale Wahlen',
			en: 'Checks account eligibility for global votes'}
	};
},
adminstats: function () {
	return {
		url: data.xtools + 'adminstats/',
		param: [data.project.dbname, {uselang: data.lang.user}],
		example: 'simple',
		name: {de: 'Adminstatistiken', en: 'Admin stats'},
		tooltip: {de: 'Statistiken zur Adminaktivität in diesem Projekt',
			en: 'Statistics for admin activity in this project'}
	};
},
afterUpload: function () {
	return {
		url: 'http://kijewski.github.io/wp-afterUpload/', //https mit mixed content
		param: {lang: chooseUserLang(['en', 'de']), project: data.project.server,
			image: data.relevantPage.title.replace(/ /g, '_')},
		example: 'image',
		name: {en: 'AfterUpload'},
		tooltip: {de: 'Versucht herauszufinden, wo das Bild nach dem Hochladen eingebunden wurde',
			en: 'Try to find out where the image was used after upload'}
	};
},
articleinfo: function () {
	return {
		url: data.xtools + 'articleinfo/',
		param: [data.project.dbname, data.relevantPage.page, {uselang: data.lang.user}],
		example: 'article',
		name: {de: 'Bearbeitungsstatistik (X!)', en: 'Article info'},
		tooltip: {de: 'Statistiken zur Versionsgeschichte', en: 'Statistics about the version history'}
	};
},
artniw: function () {
	return {
		only: !data.project.special,
		url: data.labs + 'joanjoc/artniw.php',
		param: {l1: data.project.lang, pr: data.project.projectShort, ns: 0,
			cat: data.relevantPage.title, dpt: 3, tpl: '', go: 'Proceed'},
		example: 'category',
		name: {de: 'Keine andere Sprachen', en: 'No other languages'},
		tooltip: {de: 'Ermittelt alle Artikel in dieser Kategorie samt Unterkategorien, die keine Sprachlinks haben',
			en: 'Show all articles in this category including subcategories which don\'t have any links to other languages'}
	};
},
autoedits: function () {
	return {
		url: data.xtools + 'autoedits/',
		param: [data.project.dbname, data.relevantPage.user, {uselang: data.lang.user}],
		example: 'user',
		name: {de: 'Automatische Bearbeitungen', en: 'Autoedits'},
		tooltip: {de: 'Zählt die automatischen Bearbeitungen', en: 'Count the automated edits'}
	};
},
blame: function () {
	return {
		url: data.xtools + 'blame/',
		param: [data.project.server, data.relevantPage.page, {q: ''}],
		selection: true,
		example: 'article',
		name: {en: 'Wikiblame (X!)'},
		tooltip: {de: 'Ermittelt, wann die markierte Textstelle eingefügt wurde',
			en: 'Find out when the selected text was inserted'}
	};
},
blankpages: function () {
	return {
		url: data.labs + 'blankpages/',
		param: {p: data.project.server.slice(0, -4)},
		example: 'simple',
		name: {de: 'Leere Seiten', en: 'Blank pages'},
		tooltip: {de: 'Findet leere Seiten in diesem Wiki', en: 'Find blank pages on this wiki'}
	};
},
cat: function () {
	return {
		only: data.project.dbname === 'commonswiki' || data.project.dbname === 'dewiki',
		url: data.labs + 'wikihistory/dewiki/newincategory/index.php',
		param: {cat: data.relevantPage.title, project: data.project.lang},
		example: 'category',
		name: {de: 'Neue Einträge', en: 'New entries'},
		tooltip: {de: 'Zeigt alle neu in diese Kategorie einsortierten Seiten an',
			en: 'Show all entries which were recently added to this category'}
	};
},
catanalysis: function () {
	return {
		url: data.labs + 'meta/catanalysis/',
		param: {wiki: data.project.dbname, title: data.relevantPage.title, cat: 1},
		example: 'category',
		name: {de: 'Beitrags-Analyse', en: 'Contribution analysis'},
		tooltip: {de: 'Ermittelt die Bearbeiter der Seiten dieser Kategorie',
			en: 'Get the editors of the pages in this category'}
	};
},
categoryedits: function () {
	return {
		url: data.xtools + 'categoryedits/',
		param: [data.project.dbname, data.user, data.relevantPage.title, {uselang: data.lang.user}],
		example: 'category',
		name: {de: 'Eigene Bearbeitungen', en: 'Own edits'},
		tooltip: {de: 'Zeigt eigene Bearbeitungen in dieser Kategorie', en: 'Show own edits in this category'}
	};
},
catgraph: function () {
	return {
		url: data.labs + 'vcat/render',
		param: {wiki: data.project.dbname, rel: 'category', title: data.relevantPage.page, format: 'svg', links: 'wiki'},
		example: 'category',
		name: {de: 'Kategorien-Graph', en: 'Category graph'},
		tooltip: {de: 'Zeigt die Oberkategorien als Baumstruktur', en: 'Show the supercategories as tree'}
	};
},
catnap: function () {
	return {
		url: data.labs + 'catnap/',
		param: {language: data.project.lang, project: data.project.project,
			category: data.relevantPage.title, doit: 'Do it'},
		example: 'category',
		name: {en: 'Catnap'},
		tooltip: {de: 'Zeigt Seiten dieser Kategorie, gruppiert nach anderen Kategorien',
			en: 'Show pages in this category grouped by other categories'}
	};
},
catscan: function () {
	return {
		disabled: 'defekt',
		url: data.labs + 'catscan3/catscan2.php',
		param: {language: data.project.lang, project: data.project.project, depth: 12,
			interface_language: data.lang.user, categories: data.relevantPage.title},
		example: 'category',
		name: {en: 'CatScan'},
		tooltip: {de: 'CatScan für diese Kategorie', en: 'CatScan for this category'}
	};
},
catscan_quick: function () {
	return {
		disabled: 'defekt',
		url: data.labs + 'catscan3/quick_intersection.php',
		param: {lang: data.project.lang, project: data.project.project, cats: data.relevantPage.title, ns: 0,
			depth: -1, max: 30000, start: 0, format: 'html', norun: ''},
		example: 'category',
		name: {de: 'CatScan (schnell)', en: 'CatScan (quick)'},
		tooltip: {de: 'CatScan für diese Kategorie (schnell)', en: 'CatScan for this category (quick)'}
	};
},
checkwiki: function () {
	return {
		url: data.labs + 'checkwiki/cgi-bin/checkwiki.cgi',
		param: {project: data.project.dbname, view: 'detail', title: data.relevantPage.title},
		example: 'article',
		name: {de: 'Syntaxfehler', en: 'Checkwiki'},
		tooltip: {de: 'Überprüft auf Fehler der Wikisyntax', en: 'Check for syntax errors'}
	};
},
commonshelper: function () {
	return {
		only: data.project.dbname !== 'commonswiki',
		url: data.labs + 'commonshelper/',
		param: {'interface': data.lang.user, language: data.project.lang, image: data.relevantPage.title,
			project: data.project.project, commonsense: 1, reallydirectupload: 1},
		example: 'image',
		name: {en: '→ Commons'},
		tooltip: {de: 'Nach Commons verschieben', en: 'Move to Commons'}
	};
},
contributions: function () {
	return {
		url: data.script,
		param: {title: 'Special:Contributions/' + data.relevantPage.user},
		example: 'user',
		name: {de: 'Beiträge', en: 'Contributions'},
		tooltip: {de: 'Benutzerbeiträge', en: 'Contributions by this user'}
	};
},
contributors: function () {
	return {
		url: data.labs + 'hgztools/contributors/index.php',
		param: {lang: data.project.lang, project: data.project.project, page: data.relevantPage.page, format: 'wiki_int'},
		example: 'article',
		name: {de: 'Versionsgeschichte', en: 'History'},
		tooltip: {de: 'Versionsgeschichte als HTML zum Kopieren', en: 'History as HTML to copy'}
	};
},
copyvios: function () {
	return {
		url: data.labs + 'copyvios',
		param: {lang: data.project.lang, project: data.project.project, title: data.relevantPage.page},
		example: 'article',
		name: {de: 'URV-Test', en: 'Copyvio test'},
		tooltip: {de: 'Prüft, ob die Seite eine Urheberrechtsverletzung aus dem Internet sein könnte',
			en: 'Test whether this page could be a copyright violation from the internet'}
	};
},
created: function () {
	return {
		url: data.labs + 'sigma/created.py',
		param: {name: data.relevantPage.user, server: data.project.dbname, max: 500, ns: 0, redirects: 'coalball'},
		example: 'user',
		name: {de: 'Artikelanlagen', en: 'New articles'},
		tooltip: {de: 'Artikel, die von diesem Benutzer angelegt wurden', en: 'Show all articles created by this user'}
	};
},
croptool: function () {
	return {
		url: data.labs + 'croptool/',
		param: {site: data.project.server, title: data.relevantPage.title},
		example: 'image',
		name: {de: 'Zuschneiden', en: 'Crop image'},
		tooltip: {de: 'Dieses Bild beschneiden', en: 'Crop this image'}
	};
},
crossactivity: function () {
	return {
		url: data.labs + 'meta/crossactivity/',
		param: [data.relevantPage.user],
		example: 'user',
		name: {de: 'Letzte Aktion', en: 'Latest action'},
		tooltip: {de: 'Letzte Aktion dieses Benutzers in allen Wikis', en: 'Latest action of this user in every wiki'}
	};
},
crosswatch: function () {
	return {
		disabled: 'defekt',
		url: data.labs + 'crosswatch/',
		example: 'simple',
		name: {de: 'Globale Beobachtungsliste', en: 'Global wachtlist'},
		tooltip: {de: 'Globale Beobachtungsliste', en: 'Global wachtlist'}
	};
},
dab_solver: function () {
	return {
		only: data.project.project === 'wikipedia',
		url: 'http://69.142.160.183/~dispenser/cgi-bin/dab_solver.py',
		param: {commonfixes: 'on', page: data.project.lang + ':' + data.relevantPage.page},
		example: 'article',
		name: {de: 'BKL', en: 'DAB'},
		tooltip: {de: 'Links auf Begriffklärungsseiten auflösen', en: 'Solve links to disambiguation pages'}
	};
},
deep_ins: function () {
	return {
		only: data.project.dbname === 'dewiki',
		url: data.labs + 'sighting/deep_insight.php',
		param: {language: data.project.lang, project: data.project.project,
			category: data.relevantPage.title, depth: 0, mode: 'web', doit: 'Do it'},
		example: 'category',
		name: {de: 'Erstzusichtende', en: 'Insight'},
		tooltip: {de: 'Noch nie gesichtete Artikel in dieser Kategorie',
			en: 'Pages in this category that were never sighted before'}
	};
},
deep_oos: function () {
	return {
		only: data.project.dbname === 'dewiki',
		url: data.labs + 'sighting/deep_out_of_sight.php',
		param: {language: data.project.lang, depth: 7, category: data.relevantPage.title, doit: 'Los!'},
		example: 'category',
		name: {de: 'Nachzusichtende', en: 'Out of sight'},
		tooltip: {de: 'Gerade nicht gesichtete Artikel in dieser Kategorie',
			en: 'Pages in this category that need to be sighted again'}
	};
},
edit0: function () {
	return {
		url: data.script,
		param: {title: data.relevantPage.page, action: 'edit', section: 0},
		example: 'article',
		name: {de: 'Einleitung bearbeiten', en: 'Edit lead section'},
		tooltip: {de: 'Einleitung bearbeiten', en: 'Edit lead section'}
	};
},
editcount: function () {
	return {
		url: data.xtools + 'ec/',
		param: [data.project.dbname, data.relevantPage.user, {uselang: data.lang.user}],
		example: 'user',
		name: {de: 'Bearbeitungszähler', en: 'Edit counter'},
		tooltip: {de: 'Einfacher Bearbeitungszähler', en: 'Simple edit counter'}
	};
},
editsummary: function () {
	return {
		url: data.xtools + 'editsummary/',
		param: [data.project.dbname, data.relevantPage.user, {uselang: data.lang.user}],
		example: 'user',
		name: {de: 'Bearbeitungskommentare', en: 'Edit summary'},
		tooltip: {de: 'Statistik zur Benutzung der Zusammenfassungszeile',
			en: 'Statistics about the usage of edit summaries'}
	};
},
fist: function () {
	return {
		disabled: 'there was an error running the query',
		url: data.labs + 'fist/fist.php',
		param: {doit: 1, language: data.project.lang, project: data.project.project,
			data: data.relevantPage.page, datatype: 'articles',
			params: {catdepth: 0, random: 50, ll_max: 5, free_only: 1, commons_max: 5,
				commonsense: 'on', flickr_max: 5, flickr_new_name_from_article: 1,
				wts_max: 5, gimp_max: 5, esp_max: 5, esp_skip_flickr: 1, forarticles: 'all',
				lessthan_images: 3, jpeg: 1, png: 1, gif: 1, svg: 1, min_width: 80, min_height: 80},
			sources: {languagelinks: 1, commons: 1, flickr: 1, wst: 1, gimp: 1, everystockphoto: 1}},
		example: 'article',
		name: {en: 'Fist'},
		tooltip: {de: 'Suche nach freien Bildern', en: 'Search for free images'}
	};
},
flagged: function () {
	return {
		//disabled: 'kein CSS',
		only: data.project.dbname === 'dewiki',
		url: data.labs + 'hroest/flagged.php',
		param: {language: data.project.lang, depth: 7, category: data.relevantPage.title, doit: 'Los!'},
		example: 'category',
		name: {de: 'Nachzusichtende', en: 'Out of sight'},
		tooltip: {de: 'Gerade nicht gesichtete Artikel in dieser Kategorie',
			en: 'Pages in this category that need to be sighted again'}
	};
},
glamtree: function () {
	return {
		only: data.project.project === 'wikipedia',
		url: data.labs + 'glamtools/treeviews/',
		param: {q: JSON.stringify({
			lang: data.project.lang, rows: [{
				title: data.relevantPage.title
			}]
		})},
		example: 'category',
		name: {de: 'Seitenaufrufe', en: 'Page views'},
		tooltip: {de: 'Zeigt die Anzahl der Seitenaufrufe für Seiten in dieser Kategorie',
			en: 'Show the number of page views for pages in this category'}
	};
},
globalcontribs: function () {
	return {
		url: data.xtools + 'globalcontribs/',
		param: [data.relevantPage.user, {uselang: data.lang.user}],
		example: 'user',
		name: {de: 'Bearbeitungszähler (global)', en: 'Edit counter (global)'},
		tooltip: {de: 'Bearbeitungszähler für alle Wikimedia-Projekte', en: 'Edit counter for all Wikimedia projects'}
	};
},
globalusers: function () {
	return {
		url: data.script,
		param: {title: 'Special:GlobalUsers', limit: 1, username: data.relevantPage.user},
		example: 'user',
		name: {de: 'Globale Rechte', en: 'Global rights'},
		tooltip: {de: 'globale Rechte dieses Benutzers anzeigen', en: 'Show the global rights of this user'}
	};
},
globalwpsearch: function () {
	return {
		only: data.project.project === 'wikipedia',
		url: 'http://vs.aka-online.de/globalwpsearch/',
		example: 'simple',
		name: {de: 'Globale Suche', en: 'Global search'},
		tooltip: {de: 'Suche in allen Sprachen', en: 'Search in all languages'}
	};
},
google: function () {
	return {
		only: !data.project.special,
		url: 'https://www.google.com/search',
		param: {q: 'site:' + data.project.project + '.org "' + data.relevantPage.title.replace(/"/g, '') + '"'},
		example: 'article',
		name: {en: 'Google'},
		tooltip: {de: 'Google-Suche (' + data.project.project + '.org)',
			en: 'Google search (' + data.project.project + '.org)'}
	};
},
grep: function () {
	return {
		url: data.labs + 'grep/',
		param: {lang: data.project.lang, project: data.project.project, namespace: 0},
		example: 'simple',
		name: {de: 'Regulärer Ausdruck', en: 'Regular expression'},
		tooltip: {de: 'Titelsuche mit regulärem Ausdruck', en: 'Search for titles using a regular expression'}
	};
},
guc: function () {
	return {
		url: data.labs + 'guc/index.php',
		param: {blocks: 'true', user: data.relevantPage.user},
		example: 'user',
		name: {de: 'Bearbeitungszähler (global)', en: 'Edit counter (global)'},
		tooltip: {de: 'Bearbeitungszähler für alle Wikimedia-Projekte', en: 'Edit counter for all Wikimedia projects'}
	};
},
herding_sheep: function () {
	return {
		url: data.labs + 'magnustools/herding_sheep.php',
		param: {language: data.project.lang, roject: data.project.project, category: data.relevantPage.title, doit: 'Do it'},
		example: 'usercat',
		name: {de: 'Aktive Benutzer', en: 'Active users'},
		tooltip: {de: 'Zeigt aktive Benuter an, die in dieser Kategorie einsortiert sind',
			en: 'Shows active users listed in this category'}
	};
},
intersectcontribs: function () {
	return {
		only: data.user !== data.relevantPage.user,
		url: data.labs + 'intersect-contribs/',
		param: {project: data.project.dbname, users: [data.user, data.relevantPage.user]},
		example: 'ip',
		name: {de: 'Gemeinsame Bearbeitungen', en: 'Intersect Contributions'},
		tooltip: {de: 'Zeigt gemeinsam bearbeitete Seiten an', en: 'Show pages where we both edited'}
	};
},
intersectcontribs1: function () {
	return {
		disabled: 'defekt',
		url: data.labs + 'intersect-contribs/',
		param: {project: data.project.dbname, users: [data.relevantPage.user, data.relevantPage.user], sort: 1},
		example: 'user',
		name: {de: 'Bearbeitete Seiten', en: 'Edited pages'},
		tooltip: {de: 'Zeigt alle Seiten an, die dieser Benutzer bearbeitet hat', en: 'Show all pages edited by this user'}
	};
},
isbncheck: function () {
	return {
		url: data.labs + 'isbn/IsbnCheckAndFormat',
		param: {ISBN: data.relevantPage.id, Test: 'http://swb.bsz-bw.de/DB=2.1/CMD?ACT=SRCHA&IKT=1007&TRM=MAGIC'},
		example: 'isbn',
		name: {en: 'ISBN-Check'},
		tooltip: {de: 'Überprüft und formatiert die ISBN', en: 'Check and format the ISBN'}
	};
},
isbn2wiki: function () {
	return {
		url: data.labs + 'isbn2wiki/',
		param: {isbn: data.relevantPage.id},
		example: 'isbn',
		name: {de: 'Literaturangabe', en: 'Format as reference'},
		tooltip: {de: 'Liefert Autor, Titel etc.', en: 'Get author, title, etc.'}
	};
},
itemsByCat: function () {
	return {
		disabled: 'defekt',
		url: data.labs + 'bene/itemsbycat/',
		param: {wiki: data.project.dbname, category: data.relevantPage.title},
		example: 'category',
		name: {en: 'Wikidata'},
		tooltip: {de: 'Zeigt alle Wikidata-Einträge ohne Bezeichnung', en: 'Show all Wikidata items without label'}
	};
},
lagging: function () {
	return {
		disabled: 'defekt',
		only: data.project.dbname === 'dewiki',
		url: data.labs + 'hroest/cgi-bin/lagging_users.py',
		example: 'simple',
		name: {de: 'Nachzusichtende', en: 'Lagging users'},
		tooltip: {de: 'Nachzusichtende Änderungen sortiert nach Benutzern',
			en: 'Changes that need to be sighted sorted by users'}
	};
},
listen: function () {
	return {
		only: data.project.project === 'wikipedia',
		url: 'http://listen.hatnote.com/',
		param: ['#' + data.project.lang],
		example: 'simple',
		name: {en: 'Listen to Wikipedia'},
		tooltip: {de: 'Klanguntermalung der letzten Änderungen', en: 'Listen to recent changes'}
	};
},
listfiles: function () {
	return {
		url: data.script,
		param: {title: 'Special:Listfiles', user: data.relevantPage.user},
		example: 'user',
		name: {de: 'Dateien', en: 'Files'},
		tooltip: {de: 'Dateien, die dieser Benutzer hochgeladen hat', en: 'Files uploaded by this user'}
	};
},
listpages: function () {
	return {
		url: data.labs + 'listpages/listpages.pl',
		param: {pattern: '', database: data.project.dbname},
		example: 'simple',
		name: {de: 'Wildcard-Suche', en: 'Wildcard search'},
		tooltip: {de: 'Suche mit Wildcard', en: 'Search using wildcard'}
	};
},
listusers: function () {
	return {
		url: data.script,
		param: {title: 'Special:Listusers', limit: 1, username: data.relevantPage.user},
		example: 'user',
		name: {de: 'Rechte', en: 'User rights'},
		tooltip: {de: 'Rechte dieses Benutzers anzeigen', en: 'Show rights of this user'}
	};
},
lkozma: function () {
	return {
		only: data.project.dbname === 'dewiki',
		url: 'http://www.lkozma.net/wpv/index_de.html',
		example: 'simple',
		name: {en: 'Geo'},
		tooltip: {de: 'Zeigt geografische Herkunft der letzten Änderungen an',
			en: 'Show geografic origin of recent changes'}
	};
},
log: function () {
	return {
		url: data.script,
		param: {title: 'Special:Log', page: data.relevantPage.page},
		example: 'article',
		name: {de: 'Logbuch', en: 'Log'},
		tooltip: {de: 'Logbuch für diese Seite', en: 'Log for this page'}
	};
},
log_aktiv: function () {
	return {
		url: data.script,
		param: {title: 'Special:Log', user: data.relevantPage.user},
		example: 'user',
		name: {de: 'aktives Log', en: 'Active log'},
		tooltip: {de: 'Zeigt Logbuch für Aktionen dieses Benutzers',
			en: 'Show the log for actions by this user'}
	};
},
log_create: function () {
	return {
		url: data.script,
		param: {title: 'Special:Log', type: 'create', user: data.relevantPage.user},
		example: 'user',
		name: {de: 'Neuanlagen', en: 'New pages'},
		tooltip: {de: 'Zeigt Logbuch für Neuanlagen dieses Benutzers',
			en: 'Show the log for new pages by this user'}
	};
},
mainAuthors: function () {
	return {
		url: data.labs + 'mstools/index.php',
		param: {tool: 'MainAuthors', run: 0, category: data.relevantPage.title,
			projectlang: data.project.lang, project: data.project.project},
		example: 'category',
		name: {de: 'Hauptautoren', en: 'Main authors'},
		tooltip: {de: 'Ermittelt die Hauptautoren in dieser Kategorie',
			en: 'Determine the main authors in this category'}
	};
},
massviews_category: function () {
	return {
		url: data.labs + 'massviews',
		param: {source: 'category', target: 'https://' + data.project.server + '/wiki/' + data.relevantPage.page,
			range: 'latest-30', subcategories: 1},
		example: 'category',
		name: {de: 'Seitenaufrufe', en: 'Page views'},
		tooltip: {de: 'Zeigt die Anzahl der Seitenaufrufe für Seiten in dieser Kategorie',
			en: 'Show the number of page views for pages in this category'}
	};
},
massviews_subpage: function () {
	return {
		url: data.labs + 'massviews',
		param: {source: 'subpages', target: 'https://' + data.project.server + '/wiki/' + data.relevantPage.page,
			range: 'latest-30'},
		example: 'user',
		name: {de: 'Abrufstatistik (Unterseiten)', en: 'Traffic stats (SUB)'},
		tooltip: {de: 'Zahl der Seitenabrufe, einschließlich Unterseiten',
			en: 'Number of views for this page, including subpages'}
	};
},
metronom: function () {
	var month, date = new Date();
	date.setMonth(date.getMonth() - 1);
	month = date.getMonth() + 1;
	if (month < 10) {
		month = '0' + String(month);
	}
	month = String(date.getFullYear()) + String(month);
	return {
		only: data.project.project === 'wikipedia',
		url: data.labs + 'magnustools/metronom.php',
		param: {language: data.project.lang, month: month, user: data.relevantPage.user, doit: 'Do+it!'},
		example: 'user',
		name: {de: 'Artikelaufrufe', en: 'Article views'},
		tooltip: {de: 'Zeigt an, wie oft Artikel dieses Benutzers aufgerufen wurden (langsam)',
			en: 'Show how often articles created by this user have been viewed (slow)'}
	};
},
missingtopics: function () {
	return {
		url: data.labs + 'missingtopics/',
		param: {language: data.project.lang, project: data.project.project, category: data.relevantPage.title,
			depth: 1, wikimode: 0, nosingles: 1, limitnum: 1, doit: 'Run'},
		example: 'category',
		name: {de: 'Fehlende Artikel', en: 'Missing articles'},
		tooltip: {de: 'Findet noch zu schreibende Artikel zum Thema dieser Kategorie',
			en: 'Find articles still to write on the topic of this category'}
	};
},
mw2latex: function () {
	return {
		only: data.lang.model === 'wikitext',
		url: 'https://mediawiki2latex.wmflabs.org/fill/',
		param: ['https%3A%2F%2F' + data.project.server + '%2Fwiki%2F' +
			encodeURIComponent(data.relevantPage.page)],
		example: 'article',
		name: {en: 'MediaWiki2LaTeX'},
		tooltip: {de: 'Aufwändig gerenderte PDF-Datei', en: 'Complexly rendered PDF file'}
	};
},
mydiff: function () {
	return {
		url: 'http://wikipedia.ramselehof.de/diff2me.php',
		param: {project: data.project.project, lang: data.project.lang, user: data.user, article: data.relevantPage.page},
		example: 'article',
		name: {de: 'Diff zu mir', en: 'MyDiff'},
		tooltip: {de: 'Zeigt alle Änderungen nach meiner letzten', en: 'Show all changes following my most recent'}
	};
},
newpages: function () {
	return {
		url: data.script,
		param: {title: 'Special:NewPages', namespace: 0, username: data.relevantPage.user},
		example: 'user',
		name: {de: 'Artikelanlagen (letzter Monat)', en: 'New articles (last month)'},
		tooltip: {de: 'Artikel, die von diesem Benutzer im letzten Monat angelegt wurden',
			en: 'Show all articles created by this user in the last month'}
	};
},
onemillion: function () {
	return {
		only: data.project.dbname === 'dewiki',
		url: data.labs + 'steinsplitter/Meilensteine',
		example: 'simple',
		name: {de: 'Nächster Meilenstein', en: 'Next milestone'},
		tooltip: {de: 'Schätzt den Zeitpunkt des nächsten Meilensteins', en: 'Estimates the time of the next milestone'}
	};
},
orphantalk: function () {
	return {
		url: data.labs + 'orphantalk/',
		param: {wikidb: data.project.dbname + '_p', hidesubpages: 1},
		example: 'simple',
		name: {de: 'Verwaiste Diskussionsseiten', en: 'Orphan talk pages'},
		tooltip: {de: 'Findet Diskussionsseiten ohne Inhaltsseite', en: 'Find talk pages without content page'}
	};
},
pageconjunction: function () {
	return {
		url: data.labs + 'hgztools/pageconjunction/index.php',
		param: {lang: data.project.lang, project: data.project.project, page: data.relevantPage.page},
		example: 'article',
		name: {de: 'Linkvergleich', en: 'Page conjunction'},
		tooltip: {de: 'Vergleicht ein- und ausgehende Links', en: 'Compare links to and from this page'}
	};
},
pagehiststat: function () {
	return {
		only: !data.project.special || data.project.project === 'wikimedia',
		url: 'http://vs.aka-online.de/cgi-bin/wppagehiststat.pl',
		param: {lang: data.project.lang + '.' + data.project.project, page: data.relevantPage.page},
		example: 'article',
		name: {de: 'Artikelstatistik', en: 'Article statistics'},
		tooltip: {de: 'Artikelstatistik (aka)', en: 'Article statistics (aka)'}
	};
},
pages: function () {
	return {
		url: data.xtools + 'pages/',
		param: [data.project.dbname, data.relevantPage.user, {uselang: data.lang.user}],
		example: 'user',
		name: {de: 'Artikelanlagen', en: 'New articles'},
		tooltip: {de: 'Artikel, die von diesem Benutzer angelegt wurden', en: 'Show all articles created by this user'}
	};
},
pages_in_cats: function () {
	return {
		disabled: 'defekt',
		url: data.labs + 'catscan3/pages_in_cats.php',
		param: {project: data.project.project, language: data.project.lang,
			category: data.relevantPage.title, depth: 100, doit: 'Run'},
		example: 'category',
		name: {de: 'Seitenanzahl', en: 'Category count'},
		tooltip: {de: 'Anzahl der Seiten in dieser Kategorie (einschließlich Unterkategorien)',
			'de-ch': 'Anzahl der Seiten in dieser Kategorie (einschliesslich Unterkategorien)',
			en: 'Number of pages in this category (including subcategories)'}
	};
},
pageviews: function () {
	return {
		url: data.labs + 'pageviews',
		param: {project: data.project.server, pages: data.relevantPage.page, range: 'latest-30'},
		example: 'article',
		name: {de: 'Abrufstatistik', en: 'Traffic stats'},
		tooltip: {de: 'Zahl der Seitenabrufe', en: 'Number of views for this page'}
	};
},
pdfehler: function () {
	return {
		only: data.project.dbname === 'dewiki',
		url: data.labs + 'checkpersondata/cgi-bin/pd.cgi',
		param: {view: 'detail', pageid: data.relevantPage.id},
		example: 'article',
		name: {de: 'Fehler in Personendaten', en: 'Errors in persondata'},
		tooltip: {de: 'Überprüft auf Fehler in Personendaten', en: 'Check for errors in persondata'}
	};
},
personensuche: function () {
	return {
		only: data.project.dbname === 'dewiki',
		url: data.labs + 'persondata/',
		example: 'simple',
		name: {de: 'Personensuche', en: 'Persons'},
		tooltip: {de: 'Suche nach Personen', en: 'Search for persons'}
	};
},
petscan: function () {
	return {
		url: 'https://petscan.wmflabs.org/',
		param: {language: data.project.lang, project: data.project.project, depth: 12,
			interface_language: data.lang.user, categories: data.relevantPage.title, ns: {0: 1}},
		example: 'category',
		name: {en: 'PetScan'},
		tooltip: {de: 'PetScan für diese Kategorie', en: 'PetScan for this category'}
	};
},
prefixindex: function () {
	return {
		url: data.script,
		param: {title: 'Special:Prefixindex/User:' + data.relevantPage.user + '/'},
		example: 'user',
		name: {de: 'Alle Seiten', en: 'All pages'},
		tooltip: {de: 'Zeigt alle Seiten des Benutzers an', en: 'Show all pages of this user'}
	};
},
purge: function () {
	return {
		url: data.script,
		param: {title: data.relevantPage.page, action: 'purge'},
		onclick: function (e) {
			e.preventDefault();
			$.post(mw.util.wikiScript('api'), {
				action: 'purge',
				titles: data.relevantPage.page,
				format: 'json', formatversion: 2
			}).then(function () {
				location.reload(false);
			});
		},
		example: 'article',
		name: {en: 'Purge'},
		tooltip: {de: 'Server-Cache leeren', en: 'Clear server cache'}
	};
},
quick_counter: function () {
	return {
		disabled: 'actor table',
		url: data.labs + 'magnustools/quick_counter.php',
		param: {user: data.relevantPage.user, project: data.project.server.replace(/\.org$/, '')},
		example: 'user',
		name: {de: 'Bearbeitungszähler (schnell)', en: 'Edit counter (quick)'},
		tooltip: {de: 'Schneller Bearbeitungszähler', en: 'Quick edit counter'}
	};
},
randomarticle: function () {
	return {
		url: data.labs + 'erwin85/randomarticle.php',
		param: {lang: data.project.lang, family: data.project.project, namespaces: -1,
			categories: data.relevantPage.title, subcats: 10, d: 0, action: 0, submit: 'Submit'},
		example: 'category',
		name: {de: 'Zufälliger Artikel', en: 'Random article'},
		tooltip: {de: 'Zufälliger Artikel aus dieser Kategorie (einschließlich Unterkategorien)',
			'de-ch': 'Zufälliger Artikel aus dieser Kategorie (einschliesslich Unterkategorien)',
			en: 'Random article from this category (including subcategories)'}
	};
},
randomincategory: function () {
	return {
		url: data.script,
		param: {title: 'Special:RandomInCategory/' + data.relevantPage.title},
		example: 'category',
		name: {de: 'Zufälliger Artikel', en: 'Random article'},
		tooltip: {de: 'Zufälliger Artikel aus dieser Kategorie',
			en: 'Random article from this category'}
	};
},
randomoos: function () {
	return {
		only: data.project.dbname === 'dewiki',
		url: data.labs + 'sighting/random_out_of_sight.php',
		param: {limit: 5, out: 20, language: data.project.lang, project: data.project.project},
		example: 'simple',
		name: {de: 'Zufällige nachzusichtende Artikel', en: 'Random out of sight'},
		tooltip: {de: 'Liste mit 20 zufälligen Artikeln, die auf eine Sichtung warten',
			en: 'List containing 20 random articles waiting to be sighted'}
	};
},
redirectviews: function () {
	return {
		url: data.labs + 'redirectviews',
		param: {project: data.project.server, page: data.relevantPage.page, range: 'latest-30'},
		example: 'article',
		name: {de: 'Abrufstatistik (WL)', en: 'Traffic stats (RED)'},
		tooltip: {de: 'Zahl der Seitenabrufe, einschließlich Weiterleitungen',
			en: 'Number of views for this page, including redirects'}
	};
},
relatedchanges: function () {
	return {
		disabled: 'not functional',
		url: data.labs + 'erwin85/relatedchanges.php',
		param: {lang: data.project.lang, family: data.project.project, category: data.relevantPage.title,
			d: 10, submit: 'Submit'},
		example: 'category',
		name: {de: 'Änderungen', en: 'Related changes'},
		tooltip: {de: 'Zeigt Änderungen an Seiten aus dieser Kategorie (einschließlich Unterkategorien)',
			'de-ch': 'Zeigt Änderungen an Seiten aus dieser Kategorie (einschliesslich Unterkategorien)',
			en: 'Show changes to articles from this category (including subcategories)'}
	};
},
reverse_tree: function () {
	return {
		url: data.labs + 'catscan2/reverse_tree.php',
		param: {language: data.project.lang, project: data.project.project, title: data.relevantPage.title,
			namespace: data.relevantPage.ns, doit: 1},
		example: 'category',
		name: {de: 'Kategorien-Baum', en: 'Category tree'},
		tooltip: {de: 'Zeigt die Oberkategorien als Liste', en: 'Show the supercategories as list'}
	};
},
rfa: function () {
	return {
		disabled: 'The ini file could not be read',
		only: (
			data.project.dbname === 'dewiki' && (
				data.relevantPage.page.indexOf('Wikipedia:Adminkandidaturen/') === 0 ||
				data.relevantPage.page.indexOf('Wikipedia:Bürokratenkandidaturen/') === 0)
			) || (
			data.project.dbname === 'enwiki' && (
				data.relevantPage.page.indexOf('Wikipedia:Request_for_adminship/') === 0 ||
				data.relevantPage.page.indexOf('Wikipedia:Request_for_bureaucratship/') === 0)
			),
		url: data.labs + 'xtools/rfa/',
		param: {project: data.project.dbname, p: data.relevantPage.page},
		example: 'wp',
		name: {de: 'Abstimmung überprüfen', en: 'Check votes'},
		tooltip: {de: 'Diese Kandidatur auf Doppelabstimmungen etc. prüfen', en: 'Check this poll for double votes etc.'}
	};
},
rfap: function () {
	return {
		disabled: 'The ini file could not be read',
		only: data.project.dbname === 'dewiki' || data.project.dbname === 'enwiki',
		url: data.labs + 'xtools/rfap/',
		param: {project: data.project.dbname, user: data.relevantPage.user},
		example: 'user',
		name: {de: 'Abstimmverhalten', en: 'Votes'},
		tooltip: {de: 'Stimmen dieses Benutzers in Adminkandidaturen', en: 'Votes by this user in polls for adminship'}
	};
},
simplecount: function () {
	return {
		url: data.xtools + 'sc/',
		param: [data.project.dbname, data.relevantPage.user, {uselang: data.lang.user}],
		example: 'user',
		name: {de: 'Bearbeitungszähler (einfach)', en: 'Edit counter (simple)'},
		tooltip: {de: 'Sehr einfacher Bearbeitungszähler', en: 'Very simple edit counter'}
	};
},
stimmberechtigung: function () {
	return {
		only: data.project.dbname === 'dewiki',
		url: data.labs + 'stimmberechtigung',
		param: {user: data.relevantPage.user},
		example: 'user',
		name: {de: 'Stimmberechtigung', en: 'Eligibility'},
		tooltip: {de: 'Überprüft die Stimmberechtigung', en: 'Check for eligibility'}
	};
},
sugart: function () {
	return { //mixed content
		only: !data.project.special && data.project.lang !== data.lang.userFallback,
		url: data.labs + 'joanjoc/sugart.php',
		param: {l1: data.project.lang, pr: data.project.projectShort, l2: data.lang.userFallback,
			cat: data.relevantPage.title, dpt: 3, tpl: '', go: 'Proceed'},
		example: 'en',
		name: {de: 'Fehlende Artikel in ' + data.lang.userFallback, en: 'Missing articles in ' + data.lang.userFallback},
		tooltip: {
			de: 'Ermittelt alle Artikel in dieser Kategorie samt Unterkategorien, die es in ' +
				data.lang.userFallback + '.' + data.project.project + ' nicht gibt',
			en: 'Show all articles in this category including subcategories which don\'t exist in ' +
				data.lang.userFallback + '.' + data.project.project
		}
	};
},
sulutil: function () {
	return {
		disabled: 'defekt',
		url: data.labs + 'quentinv57-tools/tools/sulinfo.php',
		param: {username: data.relevantPage.user},
		example: 'user',
		name: {de: 'Kontenübersicht', en: 'SUL util'},
		tooltip: {de: 'Globales Benutzerkonto', en: 'Global account'}
	};
},
summary: function () {
	return {
		url: data.labs + 'sigma/summary.py',
		param: {name: data.relevantPage.user, search: '', max: 100, server: data.project.dbname},
		example: 'user',
		name: {de: 'Zusammenfassungen durchsuchen', en: 'Search edit comments'},
		tooltip: {de: 'Durchsucht alle Bearbeitungskommentare dieses Benutzers',
			en: 'Search through all edit comments of this user'}
	};
},
supercount: function () {
	return {
		url: data.labs + 'supercount/index.php',
		param: {user: data.relevantPage.user, project: data.project.server},
		example: 'user',
		name: {de: 'Bearbeitungszähler (ausführlich)', en: 'Edit counter (extended)'},
		tooltip: {de: 'Ausführlicher Bearbeitungszähler', en: 'Extended edit counter'}
	};
},
svgcheck: function () {
	return {
		url: data.labs + 'svgcheck/index.php',
		example: 'simple',
		name: {en: 'SVG-Check'},
		tooltip: {de: 'SVG-Datei vor dem Hochladen überprüfen', en: 'Check SVG file before uploading'}
	};
},
templatetiger: function () {
	return {
		disabled: 'keine Daten mehr',
		url: data.labs + 'templatetiger/template-parameter.php',
		param: {lang: data.project.dbname, template: data.relevantPage.title.replace(/ /g, '_')},
		example: 'template',
		name: {en: 'Templatetiger'},
		tooltip: {de: 'Vorlagenauswertung', en: 'Template evaluation'}
	};
},
topedits: function () {
	return {
		url: data.xtools + 'topedits/',
		param: [data.project.dbname, data.user, data.relevantPage.ns, data.relevantPage.title, {uselang: data.lang.user}],
		example: 'article',
		name: {de: 'Eigene Beiträge', en: 'My contributions'},
		tooltip: {de: 'Zeigt die eigenen Bearbeitungen auf dieser Seite', en: 'Show your own contributions to this page'}
	};
},
topviews: function () {
	return {
		url: data.labs + 'topviews',
		param: {project: data.project.server},
		example: 'simple',
		name: {de: 'Abrufstatistik', en: 'Traffic stats'},
		tooltip: {de: 'Liste der am häufigsten aufgerufenen Seiten', en: 'List of top viewed pages'}
	};
},
translate: function () {
	var text = '→ ' + data.lang.userFallback;
	if (data.lang.userFallback === 'de') {
		text = 'Deutsch';
	}
	return {
		only: data.lang.page !== data.lang.userFallback && data.lang.model === 'wikitext',
		url: 'https://translate.google.com/translate',
		param: {u: data.realPage.href, sl: data.lang.page,
			tl: data.lang.userFallback, hl: data.lang.userFallback, ie: 'UTF-8'},
		example: 'commons',
		name: {en: text},
		tooltip: {de: 'Google-Übersetzung (' + text + ')', en: 'Google translation (' + text + ')'}
	};
},
url2commons: function () {
	return {
		only: data.project.dbname === 'commonswiki',
		url: data.labs + 'url2commons/index.html',
		example: 'commons',
		name: {de: 'von URL hochladen', en: 'Upload via URL'},
		tooltip: {de: 'Dateien direkt über eine URL hochladen', en: 'Upload files directly via URL'}
	};
},
urlshortener: function () {
	return {
		url: 'https://meta.wikimedia.org/wiki/Special:UrlShortener',
		param: {url: data.realPage.href},
		example: 'article',
		name: {de: 'Kurz-URL', en: 'Short URL'},
		tooltip: {de: 'Kurz-URL erstellen', en: 'Create short URL'}
	};
},
userpages: function () {
	return {
		url: data.labs + 'meta/userpages/',
		param: [data.relevantPage.user],
		example: 'user',
		name: {de: 'Benutzerseiten', en: 'User pages'},
		tooltip: {de: 'Benutzerseiten in allen Wikis', en: 'User pages in all wikis'}
	};
},
usersearch: function () {
	return {
		url: data.labs + 'sigma/usersearch.py',
		param: {name: data.user, page: data.relevantPage.page, server: data.project.dbname},
		example: 'article',
		name: {de: 'Eigene Beiträge', en: 'My contributions'},
		tooltip: {de: 'Zeigt die eigenen Bearbeitungen auf dieser Seite', en: 'Show your own contributions to this page'}
	};
},
userviews: function () {
	return {
		url: data.labs + 'userviews',
		param: {project: data.project.server, user: data.relevantPage.user, range: 'latest-30'},
		example: 'user',
		name: {de: 'Artikelaufrufe', en: 'Article views'},
		tooltip: {de: 'Zeigt an, wie oft Artikel dieses Benutzers aufgerufen wurden',
			en: 'Show how often articles created by this user have been viewed'}
	};
},
utrace: function () {
	return {
		//disabled: 'Karte defekt',
		url: 'http://www.utrace.de/',
		param: {query: data.relevantPage.user},
		example: 'ip',
		name: {en: 'Geo-IP'},
		tooltip: {de: 'Zeigt die geografische Herkunft dieser IP', en: 'Show the geografic location of this IP'}
	};
},
videoconvert: function () {
	return {
		disabled: 'Service Unavailable',
		url: data.labs + 'videoconvert/index.php',
		example: 'simple',
		name: {de: 'Video konvertieren', en: 'Convert video'},
		tooltip: {de: 'Video konvertieren und hochladen', en: 'Convert and upload video'}
	};
},
visualeditor: function () {
	return {
		url: data.script,
		param: {title: data.relevantPage.page, veaction: 'edit'},
		onclick: function (e) {
			if (
				mw.config.get('wgIsArticle') && mw.util.getParamValue('diff') === null &&
				mw.libs.ve && mw.libs.ve.onEditTabClick
			) {
				mw.libs.ve.onEditTabClick('visual', e);
			}
		},
		example: 'article',
		name: {en: 'VisualEditor'},
		tooltip: {de: 'Mit dem VisualEditor bearbeiten', en: 'Edit with VisualEditor'}
	};
},
webchecklinks: function () {
	return {
		only: data.project.project === 'wikipedia',
		url: 'http://69.142.160.183/~dispenser/cgi-bin/webchecklinks.py',
		param: {page: data.project.lang + ':' + data.relevantPage.page},
		example: 'article',
		name: {de: 'Weblink-Checker', en: 'Webchecklinks'},
		tooltip: {de: 'Überprüft Weblinks auf Verfügbarkeit', en: 'Check all weblinks'}
	};
},
whatismyipaddress: function () {
	return {
		url: 'https://whatismyipaddress.com/ip/',
		param: [data.relevantPage.user + '#Geolocation-Map'],
		example: 'ip',
		name: {en: 'Geo-IP'},
		tooltip: {de: 'Zeigt die geografische Herkunft dieser IP', en: 'Show the geografic location of this IP'}
	};
},
whois: function () {
	return {
		url: data.labs + 'whois/gateway.py',
		param: {lookup: 'true', ip: data.relevantPage.user},
		example: 'ip',
		name: {en: 'WhoIs'},
		tooltip: {de: 'Informationen über diese IP', en: 'Information about this IP'}
	};
},
wikiapiary: function () {
	var project;
	switch (data.project.project) {
	case 'wikimedia':
		project = data.project.lang === 'commons' ? 'Wikimedia_Commons' : 'Meta-Wiki';
		break;
	case 'wikidata':
		project = 'Wikidata';
		break;
	case 'mediawiki':
		project = 'MediaWiki.org';
		break;
	default: project = data.project.project + '_(' + data.project.lang + ')';
	}
	return {
		url: 'https://wikiapiary.com/wiki/',
		param: [project + '#tab=Usage'],
		example: 'simple',
		name: {en: 'Wikiapiary'},
		tooltip: {de: 'Allgemeine Informationen und Grafiken', en: 'General information and diagramms'}
	};
},
wikiblame: function () {
	return {
		url: 'http://wikipedia.ramselehof.de/wikiblame.php',
		param: {user_lang: data.lang.user, lang: data.project.lang, project: data.project.project,
			article: data.relevantPage.page, searchmethod: 'int', order: 'desc', needle: ''},
		selection: true,
		example: 'article',
		name: {en: 'Wikiblame (Flo)'},
		tooltip: {de: 'Ermittelt, wann die markierte Textstelle eingefügt wurde',
			en: 'Find out when the selected text was inserted'}
	};
},
wikibu: function () {
	return {
		only: data.project.dbname === 'dewiki',
		url: 'http://wikibu.ch/search.php',
		param: {search: data.relevantPage.page},
		example: 'article',
		name: {en: 'Wikibu.ch'},
		tooltip: {de: 'Automatische Bewertung', en: 'Automatic assessment'}
	};
},
wikihistory: function () {
	return {
		only: data.project.dbname === 'dewiki',
		url: data.labs + 'wikihistory/wh.php',
		param: {page_title: data.relevantPage.page},
		example: 'article',
		name: {de: 'Bearbeitungsstatistik (WH)', en: 'WikiHistory'},
		tooltip: {de: 'Statistiken zur Versionsgeschichte', en: 'Statistics about the version history'}
	};
},
wikilint: function () {
	return {
		disabled: 'Service Unavailable',
		only: (data.project.project === 'wikipedia' && (data.project.lang === 'de' || data.project.lang === 'en')),
		url: data.labs + 'wikilint/cgi-bin/wikilint',
		param: {l: data.project.lang, do_typo_check: 'ON', remove_century: 'ON',
			url: 'http://' + data.project.lang + '.wikipedia.org/wiki/' + data.relevantPage.page},
		example: 'article',
		name: {en: 'WikiLint'},
		tooltip: {de: 'Fehlerüberprüfung mit WikiLint', en: 'Check for common errors using WikiLint'}
	};
},
wikimediacounter: function () {
	return {
		url: data.labs + 'wmcounter/index.php',
		example: 'simple',
		name: {de: 'Gesamtzahl aller Bearbeitungen', en: 'Wikimediacounter'},
		tooltip: {de: 'Bearbeitungszähler für alle Wikimedia-Projekte',
			en: 'Show the number of edits in all Wikimedia projects'}
	};
},
wikishootme: function () {
	return {
		url: data.labs + 'wikishootme/',
		param: {language: data.project.lang},
		example: 'simple',
		name: {en: 'Wikishootme'},
		tooltip: {de: 'Fotowünsche in einer bestimmten Gegend',
			en: 'Wanted photos in a specified region'}
	};
},
wikitodo: function () {
	return {
		only: data.project.project === 'wikipedia',
		url: data.labs + 'wiki-todo/',
		param: {language: data.project.lang},
		example: 'simple',
		name: {en: 'ToDo'},
		tooltip: {de: 'Zufälliger Artikel mit Verbesserungsvorschlägen',
			en: 'Random article with suggestions to improve it'}
	};
}
},

filters = {
	disabled: function () {
		return false;
	},

	action: function (a) {
		return data.action === a;
	},
	action_edit: function () {
		return data.action === 'edit' || data.action === 'submit';
	},

	special: function (s) {
		return data.realPage.ns === -1 &&
			(s === undefined || data.realPage.id.toString().toLowerCase() === s);
	},
	special_booksources: function () {
		return data.realPage.id.toString().toLowerCase() === 'booksources' && !!data.relevantPage.id;
	},
	special_contributions: function () {
		return data.realPage.id.toString().toLowerCase() === 'contributions' && !!data.relevantPage.user;
	},
	special_upload: function () {
		return data.realPage.id.toString().toLowerCase() === 'upload' ||
			data.realPage.id.toString().toLowerCase() === 'uploadwizard';
	},

	ns: function (ns) {
		return String(data.relevantPage.ns) === ns;
	},
	ns_special: function () {
		return data.relevantPage.ns === -1;
	},
	ns_main: function () {
		return data.relevantPage.ns === 0 || data.relevantPage.ns === 1;
	},
	ns_user: function () {
		return data.relevantPage.ns === 2 || data.relevantPage.ns === 3;
	},
	ns_project: function () {
		return data.relevantPage.ns === 4 || data.relevantPage.ns === 5;
	},
	ns_file: function () {
		return data.relevantPage.ns === 6 || data.relevantPage.ns === 7;
	},
	ns_mediawiki: function () {
		return data.relevantPage.ns === 8 || data.relevantPage.ns === 9;
	},
	ns_template: function () {
		return data.relevantPage.ns === 10 || data.relevantPage.ns === 11;
	},
	ns_help: function () {
		return data.relevantPage.ns === 12 || data.relevantPage.ns === 13;
	},
	ns_category: function () {
		return data.relevantPage.ns === 14 || data.relevantPage.ns === 15;
	},
	ns_portal: function () {
		return data.relevantPage.ns === 100 || data.relevantPage.ns === 101;
	},
	ns_talk: function () {
		return data.relevantPage.ns % 2 === 1;
	},

	is_user: function () {
		return !!data.relevantPage.user;
	},
	is_ip: function () {
		return mw.util.isIPAddress(data.relevantPage.user);
	}
},

config = [
	//[Bedingung, Tool, Ziel]
	['', 'translate'],
	['disabled', 'urlshortener', 1],
	['!special', ['wikiblame', 'blame'], 1],
	['!ns_0', 'pageviews', 1],
	[['disabled', '!ns_special'], 'edit0'],
	[['disabled', 'ns_0'], 'visualeditor'],
	[['disabled', 'ns_2'], 'visualeditor'],
	[['disabled', '!ns_special'], 'purge'],
	['action_history', 'mydiff'],
	[['disabled', 'action_history'], 'log'],
	['action_history', ['usersearch', 'topedits']],
	['action_history', 'contributors'],
	['special_watchlist', 'crosswatch'],
	['special_booksources', 'isbncheck'],
	['special_booksources', 'isbn2wiki'],
	['special_statistics', 'wikimediacounter'],
	['special_statistics', 'onemillion'],
	['special_statistics', 'wikiapiary'],
	['special_statistics', 'topviews'],
	['special_statistics', 'adminstats'],
	['special_search', 'personensuche'],
	['special_search', ['grep', 'listpages']],
	['special_search', 'globalwpsearch'],
	['special_upload', 'svgcheck'],
	['special_upload', 'url2commons'],
	['special_upload', 'videoconvert'],
	['special_recentchanges', 'lkozma'],
	['special_recentchanges', 'randomoos'],
	['special_recentchanges', 'lagging'],
	['special_recentchanges', 'wikitodo'],
	[['disabled', 'special_recentchanges'], 'listen'],
	[['disabled', 'special_recentchanges'], 'blankpages'],
	[['disabled', 'special_recentchanges'], 'orphantalk'],
	[['disabled', 'special_recentchanges'], 'wikishootme'],
	['special_contributions', 'editsummary'],
	['special_contributions', ['pages', 'created', 'log_create', 'newpages']],
	['special_contributions', 'intersectcontribs1'],
	['special_contributions', 'editcount'],
	['special_contributions', 'supercount'],
	['special_contributions', 'simplecount'],
	['special_contributions', 'quick_counter'],
	[['disabled', 'special_contributions'], 'autoedits'],
	['special_contributions', ['guc', 'globalcontribs']],
	[['special_contributions', '!is_ip'], 'sulutil'],
	['special_contributions', 'summary'],
	['ns_0', 'google'],
	['ns_0', 'wikihistory'],
	['ns_0', 'articleinfo'],
	['ns_0', 'pagehiststat'],
	['ns_0', 'pageviews'],
	[['disabled', 'ns_0'], 'redirectviews', 1],
	['ns_0', 'wikilint'],
	['ns_0', ['catgraph', 'reverse_tree']],
	['ns_0', 'webchecklinks'],
	['ns_0', 'mw2latex', 'p-coll-print_export'],
	['ns_0', 'checkwiki', 1],
	['ns_0', 'pdfehler', 1],
	['ns_0', 'wikibu', 1],
	['ns_0', 'copyvios', 1],
	['ns_0', 'pageconjunction', 1],
	[['disabled', 'ns_0'], 'dab_solver'],
	[['disabled', 'ns_0'], 'fist'],
	[['is_user', 'is_ip'], 'whois'],
	[['is_user', 'is_ip'], ['whatismyipaddress', 'utrace']],
	['ns_user', 'prefixindex'],
	[['is_user', '!special_contributions'], 'contributions'],
	[['disabled', 'ns_user'], 'listfiles'],
	['ns_user', 'intersectcontribs'],
	[['is_user', '!is_ip'], 'listusers', 1],
	[['is_user', '!is_ip'], 'globalusers', 1],
	[['is_user', '!is_ip'], 'stimmberechtigung', 1],
	[['is_user', '!is_ip'], 'accounteligibility', 1],
	['is_user', ['userviews', 'metronom'], 1],
	['is_user', 'userpages', 1],
	[['disabled', 'is_user', '!is_ip'], 'rfap', 1],
	['is_user', 'crossactivity', 1],
	[['disabled', 'ns_user'], 'log_aktiv'],
	[['disabled', 'ns_2'], 'massviews_subpage', 1],
	['ns_4', 'rfa'],
	['ns_6', 'commonshelper'],
	['ns_6', 'afterUpload'],
	['ns_6', 'croptool'],
	['ns_10', 'templatetiger'],
	['ns_14', 'catscan_quick'],
	['ns_14', ['catscan', 'petscan']],
	['ns_14', 'catnap'],
	[['disabled', 'ns_14'], 'catanalysis'],
	['ns_14', 'cat'],
	['ns_14', ['catgraph', 'reverse_tree']],
	['ns_14', 'categoryedits'],
	['ns_14', 'mainAuthors'],
	['ns_14', ['randomarticle', 'randomincategory']],
	['ns_14', 'deep_ins'],
	['ns_14', ['deep_oos', 'flagged']],
	['ns_14', 'missingtopics'],
	['ns_14', 'relatedchanges'],
	['ns_14', 'pages_in_cats'],
	['ns_14', ['massviews_category', 'glamtree'], 1],
	['ns_14', 'itemsByCat', 1],
	['ns_14', 'sugart', 1],
	['ns_14', 'artniw', 1],
	['ns_14', 'herding_sheep', 1]
],

examples = {
	article: {
		lang: {
			model: 'wikitext'
		},
		realPage: {
			page: 'Internationale_Mathematik-Olympiade',
			title: 'Internationale Mathematik-Olympiade',
			href: 'https://de.wikipedia.org/wiki/Internationale_Mathematik-Olympiade',
			ns: 0,
			id: 225232
		},
		relevantPage: {
			page: 'Internationale_Mathematik-Olympiade',
			title: 'Internationale Mathematik-Olympiade',
			user: '',
			ns: 0,
			id: 225232
		},
		selection: 'Lisa'
	},
	category: {
		realPage: {
			page: 'Kategorie:Unicode',
			title: 'Unicode',
			href: 'https://de.wikipedia.org/wiki/Kategorie:Unicode',
			ns: 14,
			id: 1360298
		},
		relevantPage: {
			page: 'Kategorie:Unicode',
			title: 'Unicode',
			user: '',
			ns: 14,
			id: 1360298
		}
	},
	commons: {
		project: {
			server: 'commons.wikimedia.org',
			lang: 'commons',
			project: 'wikimedia',
			projectShort: 'wiki',
			dbname: 'commonswiki'
		},
		lang: {
			user: 'en',
			site: 'en',
			page: 'en',
			userFallback: 'de',
			model: 'wikitext'
		},
		realPage: {
			page: 'User:Schnark',
			title: 'Schnark',
			href: 'https://commons.wikimedia.org/wiki/User:Schnark',
			ns: 2,
			id: 4273713
		},
		relevantPage: {
			page: 'User:Schnark',
			title: 'Schnark',
			user: 'Schnark',
			ns: 2,
			id: 4273713
		}
	},
	en: {
		project: {
			server: 'en.wikipedia.org',
			lang: 'en',
			project: 'wikipedia',
			projectShort: 'wiki',
			dbname: 'enwiki'
		},
		lang: {
			user: 'en',
			site: 'en',
			page: 'en',
			userFallback: 'de',
			model: 'wikitext'
		},
		realPage: {
			page: 'Category:Unicode',
			title: 'Unicode',
			href: 'https://en.wikipedia.org/wiki/Category:Unicode',
			ns: 14,
			id: 720904
		},
		relevantPage: {
			page: 'Category:Unicode',
			title: 'Unicode',
			user: '',
			ns: 14,
			id: 720904
		}
	},
	image: {
		realPage: {
			page: 'Datei:Sichten1.png',
			title: 'Sichten1.png',
			href: 'https://de.wikipedia.org/wiki/Datei:Sichten1.png',
			ns: 6,
			id: 6472532
		},
		relevantPage: {
			page: 'Datei:Sichten1.png',
			title: 'Sichten1.png',
			user: '',
			ns: 6,
			id: 6472532
		}
	},
	ip: {
		realPage: {
			page: 'Spezial:Beiträge/193.47.104.38',
			title: 'Beiträge/193.47.104.38',
			href: 'https://de.wikipedia.org/wiki/Spezial:Beiträge/193.47.104.38',
			ns: -1,
			id: 'Contributions'
		},
		relevantPage: {
			page: 'Benutzer:193.47.104.38', //stimmt zwar nicht, macht aber nichts
			title: '193.47.104.38',
			user: '193.47.104.38',
			ns: 2,
			id: 188076
		}
	},
	isbn: {
		realPage: {
			page: 'Spezial:ISBN-Suche/3895520004',
			title: 'ISBN-Suche/3895520004',
			href: 'https://de.wikipedia.org/wiki/Spezial:ISBN-Suche/3895520004',
			ns: -1,
			id: 'Booksources'
		},
		relevantPage: {
			page: 'Spezial:ISBN-Suche/3895520004',
			title: 'ISBN-Suche/3895520004',
			user: '',
			ns: -1,
			id: '3895520004'
		}
	},
	simple: {},
	template: {
		realPage: {
			page: 'Vorlage:Personendaten',
			title: 'Personendaten',
			href: 'https://de.wikipedia.org/wiki/Vorlage:Personendaten',
			ns: 10,
			id: 393916
		},
		relevantPage: {
			page: 'Vorlage:Personendaten',
			title: 'Personendaten',
			user: '',
			ns: 10,
			id: 393916
		}
	},
	user: {
		realPage: {
			page: 'Spezial:Beiträge/Schnark',
			title: 'Beiträge/Schnark',
			href: 'https://de.wikipedia.org/wiki/Spezial:Beiträge/Schnark',
			ns: -1,
			id: 'Contributions'
		},
		relevantPage: {
			page: 'Benutzer:Schnark', //stimmt zwar nicht, macht aber nichts
			title: 'Schnark',
			user: 'Schnark',
			ns: 2,
			id: 8464673
		}
	},
	usercat: {
		realPage: {
			page: 'Kategorie:User_la-4',
			title: 'User la-4',
			href: 'https://de.wikipedia.org/wiki/Kategorie:User_la-4',
			ns: 14,
			id: 865318
		},
		relevantPage: {
			page: 'Kategorie:User_la-4',
			title: 'User la-4',
			user: '',
			ns: 14,
			id: 865318
		}
	},
	wp: {
		realPage: {
			page: 'Wikipedia:Adminkandidaturen/Umherirrender_(2012)',
			title: 'Adminkandidaturen/Umherirrender (2012)',
			href: 'https://de.wikipedia.org/wiki/Wikipedia:Adminkandidaturen/Umherirrender_(2012)',
			ns: 4,
			id: 6711389
		},
		relevantPage: {
			page: 'Wikipedia:Adminkandidaturen/Umherirrender_(2012)',
			title: 'Adminkandidaturen/Umherirrender (2012)',
			user: '',
			ns: 4,
			id: 6711389
		}
	}
},

hasOwn = Object.prototype.hasOwnProperty;

/*jshint camelcase: true*/
//jscs:enable requireCamelCaseOrUpperCaseIdentifiers

function initvars () {
	data.action = mw.config.get('wgAction');
	data.script = mw.config.get('wgServer') + mw.config.get('wgScript');
	data.user = mw.config.get('wgUserName');
	data.realPage = {
		page: mw.config.get('wgPageName'),
		title: mw.config.get('wgTitle'),
		href: location.href,
		ns: mw.config.get('wgNamespaceNumber'),
		id: mw.config.get('wgCanonicalSpecialPageName') || mw.config.get('wgArticleId')
	};
	data.relevantPage.page = mw.config.get('wgRelevantPageName');
	data.relevantPage.user = mw.config.get('wgRelevantUserName', '');
	data.relevantPage.id = mw.config.get('wgRelevantArticleId') || data.realPage.id;
	if (data.relevantPage.page.indexOf(':') === -1) {
		data.relevantPage.ns = 0;
	} else {
		data.relevantPage.ns = mw.config.get('wgNamespaceIds')[
			data.relevantPage.page.replace(/:.*/, '').toLowerCase()
		] || 0;
	}
	data.relevantPage.title = data.relevantPage.page.replace(/_/g, ' ');
	if (data.relevantPage.ns !== 0) {
		data.relevantPage.title = data.relevantPage.title.replace(/.*?:/, '');
	}
	if (data.realPage.id === 'Booksources') {
		data.relevantPage.id = (
			(data.realPage.title.indexOf('/') > -1 ? data.realPage.title.replace(/.*\//, '') : '') ||
				mw.util.getParamValue('isbn') ||
				''
			).toUpperCase().replace(/[^0-9X]/g, '');
	}
	data.project.server = location.hostname;
	data.project.dbname = mw.config.get('wgDBname');
	var match = (/^(.*)(wiki(?:books|news|quote|source|versity|voyage)?|wiktionary)$/).exec(data.project.dbname);
	if (match) {
		data.project.lang = match[1].replace(/_/g, '-');
		data.project.projectShort = match[2];
	} else { //sollte nicht passieren
		mw.log.warn('Unerkannter Datenbankname: ' + data.project.dbname);
		data.project.lang = data.project.dbname.replace(/wik.+$/, '').replace(/_/g, '-');
		data.project.projectShort = data.project.dbname.replace(/^.+wik/, 'wik');
	}
	data.project.project = data.project.projectShort;
	if (data.project.project === 'wiki') {
		switch (data.project.lang) {
		case 'commons':
		case 'meta':
			data.project.project = 'wikimedia';
			data.project.special = true;
			break;
		case 'mediawiki':
		case 'wikidata':
			data.project.project = data.project.lang;
			data.project.lang = 'en';
			data.project.special = true;
			break;
		default:
			data.project.project = 'wikipedia';
		}
	}
	data.lang = {
		user: mw.config.get('wgUserLanguage'),
		site: mw.config.get('wgContentLanguage'),
		page: mw.config.get('wgPageContentLanguage') || mw.config.get('wgContentLanguage'),
		model: mw.config.get('wgPageContentModel', 'wikitext'),
		userFallback: data.lang.userFallback //kann schon durch Benutzer gesetzt sein
	};
	if (data.lang.site === 'simple') {
		data.lang.site = 'en';
	}
	if (data.lang.page === 'simple') {
		data.lang.page = 'en';
	}
	if (!data.lang.userFallback) { //kann schon durch Benutzer gesetzt sein
		if (data.lang.user.indexOf('de-') === 0) {
			data.lang.userFallback = 'de'; //de-AT etc.
		} else {
			data.lang.userFallback = data.lang.user;
		}
	}
	data.targets.primary = getUsableTarget([
		'p-pageactions', //timeless alt
		'p-cactions', //fast alle Skins
		'p-pagemisc' //timeless fallback
	]);
	data.targets.secondary = getUsableTarget([
		'p-pagemisc',
		'p-tb'
	]);
	return data.realPage.id !== 'ContentTranslation'; //Spezialseite mit eigenem Layout
}

//Hilfsfunktionen
function getUsableTarget (ids) {
	var i;
	for (i = 0; i < ids.length; i++) {
		if ($('#' + ids[i]).length) {
			return ids[i];
		}
	}
	mw.log.warn('Keine passende ID gefunden: ' + ids.join(', '));
	return ids[0];
}

function getTarget (target) {
	if (!target) {
		return data.targets.primary;
	}
	if (target === 1) {
		return data.targets.secondary;
	}
	return data.targets.map[target] || target;
}

function addPortlet (target, data) {
	if (data.only === false || data.disabled) {
		return false;
	}
	var url = getUrl(data.url, data.param),
		name = getTranslation(data.name),
		tooltip = getTranslation(data.tooltip),
		portlet = mw.util.addPortletLink(target, url, name, 'ca-' + name.replace(/[^a-zA-Z0-9]/g, '-'), tooltip);
	if (data.selection) {
		//nur per Maus erreichbar, da sonst Auswahl ohnehin verloren geht
		$(portlet).on('mouseenter', updateWithSelection);
	}
	if (data.onclick) {
		$(portlet).on('click', data.onclick);
	}
	return true;
}

function check (cond) {
	var not = false, ret = false, fun, par;
	if (cond === '') {
		return true;
	}
	if (cond.charAt(0) === '!') {
		not = true;
		cond = cond.slice(1);
	}
	if (filters[cond]) {
		ret = filters[cond]();
	} else {
		fun = cond.replace(/_.*$/, '');
		par = cond.replace(/^[^_]*_/, '');
		if (filters[fun]) {
			ret = filters[fun](par);
		}
	}
	return not ? !ret : ret;
}
function checkAll (cond) {
	if (typeof cond === 'string') {
		return check(cond);
	}
	for (var i = 0; i < cond.length; i++) {
		if (!check(cond[i])) {
			return false;
		}
	}
	return true;
}

function addTool (tool) {
	var i, t;
	if (checkAll(tool[0])) {
		t = Array.isArray(tool[1]) ? tool[1] : [tool[1]];
		for (i = 0; i < t.length; i++) {
			if (tools[t[i]] && addPortlet(getTarget(tool[2]), tools[t[i]]())) {
				return true;
			}
		}
	}
	return false;
}
function addTools () {
	var i;
	for (i = 0; i < config.length; i++) {
		addTool(config[i]);
	}
	$(window).trigger('resize'); //für collapsibleTabs.js im Vector-Skin
	fixArtikelStatistik();
}

function fixArtikelStatistik () {
	//ich will den zusätzlichen Eintrag aus [[Benutzer:Schnark/js/artikel-statistik.js]] ganz am Ende
	var $li = $('#ca-schnark-articleStat');
	if ($li.length === 1 && !$li.is(':last-child')) {
		$li.parent().append($li);
	}
}

//bestimmt die beste Sprache für den Benutzer aus einer Liste
function chooseUserLang (from) {
	var all = [
		data.lang.user,
		data.lang.userFallback
	].concat(mw.language.getFallbackLanguageChain()), i;
	for (i = 0; i < all.length; i++) {
		if (from.indexOf(all[i]) !== -1) {
			return all[i];
		}
	}
	return from[0];
}

function getTranslation (l10n) {
	var i, chain = mw.language.getFallbackLanguageChain();
	for (i = 0; i < chain.length; i++) {
		if (hasOwn.call(l10n, chain[i])) {
			return l10n[chain[i]];
		}
	}
	return l10n.en || '???';
}

function getUrl (path, query) {
	var q;
	if (!query) {
		return path;
	}
	if (Array.isArray(query)) {
		if ($.isPlainObject(query[query.length - 1])) {
			q = query.pop();
		}
		return getUrl(path + query.join('/'), q);
	}
	return path + '?' + $.param(query).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29')
		.replace(/\*/g, '%2A').replace(/~/g, '%7E').replace(/%3A/g, ':').replace(/%2F/g, '/');
}

function updateWithSelection () {
	/*jshint validthis: true*///Event-Handler
	var $a = $(this), href;
	if (!$a.is('a')) {
		$a = $a.find('a').first();
	}
	href = $a.attr('href') || '';
	if (/^(?:https?:)?\/\//.test(href)) {
		//\= statt =, um JSHint glücklich zu machen
		$a.attr('href', href.replace(/\=[^=]*$/, function () {
			return '=' + encodeURIComponent(getSelection()); //Funktion, nötig falls markierter Text $$ enthält
		}));
	}
	return;
}

function getSelection () {
	var selectedText = '';
	if (window.getSelection) {
		selectedText = window.getSelection();
	}
	if (!selectedText && document.activeElement && document.activeElement.selectionEnd) {
		selectedText = document.activeElement.value.slice(document.activeElement.selectionStart,
			document.activeElement.selectionEnd);
	}
	return selectedText;
}

function getExample (tool) {
	var name = mw.html.element('code', {}, tool), example, orig, result;
	if (!tools[tool]) {
		return name + ' nicht vorhanden';
	}
	example = examples[tools[tool]().example];
	if (!example) {
		return name + ' ohne Beispiel';
	}
	orig = $.extend(true, {}, data);
	$.extend(true, data, example);
	tool = tools[tool]();
	if (tool.only === false) {
		result = name + ' nicht anwendbar';
	} else {
		result = getUrl(tool.url, tool.param);
		if (tool.selection) {
			result += (example.selection || '');
		}
		result = mw.html.element('a', {href: result}, new mw.html.Raw(name));
		if (tool.disabled) {
			result += ' deaktiviert: ' + tool.disabled;
		}
	}
	data = orig;
	return result;
}

function getExamples () {
	var tool, list = [];
	for (tool in tools) {
		if (hasOwn.call(tools, tool)) {
			list.push('<li>' + getExample(tool) + '</li>');
		}
	}
	return '<ul>' + list.join('') + '</ul>';
}

function maintain () {
	var allDefinedTools = [], allToolsNeedingMaint = [], allUsedTools = [],
		allMissingTools = [], allUnusedTools = [], name, tool, i, msg;

	function format (list, text) {
		if (list.length === 0) {
			return '';
		}
		return text + ':\n* ' + list.join('\n* ') + '\n';
	}

	for (name in tools) {
		if (hasOwn.call(tools, name)) {
			allDefinedTools.push(name);
			tool = tools[name]();
			if (tool.disabled) {
				allToolsNeedingMaint.push(name + ' (' + tool.disabled + ')');
			}
		}
	}
	for (i = 0; i < config.length; i++) {
		if (Array.isArray(config[i][1])) {
			allUsedTools = allUsedTools.concat(config[i][1]);
		} else {
			allUsedTools.push(config[i][1]);
		}
	}
	for (i = 0; i < allDefinedTools.length; i++) {
		if (allUsedTools.indexOf(allDefinedTools[i]) === -1) {
			allUnusedTools.push(allDefinedTools[i]);
		}
	}
	for (i = 0; i < allUsedTools.length; i++) {
		if (allDefinedTools.indexOf(allUsedTools[i]) === -1) {
			allMissingTools.push(allUsedTools[i]);
		}
	}

	msg = [
		format(allToolsNeedingMaint, 'Tools, die Wartung benötigen'),
		format(allMissingTools, 'Fehlende Tools'),
		format(allUnusedTools, 'Unbenutzte Tools')
	].join('\n');
	window.alert(msg);
	return msg;
}

function add (tool, cond, place) {
	var entry = [cond || '', tool];
	if (place) {
		entry.push(place);
	}
	config.push(entry);
}

function doForTool (tool, func) {
	var i, j;
	for (i = 0; i < config.length; i++) {
		if (Array.isArray(config[i][1])) {
			j =  config[i][1].indexOf(tool);
			if (j > -1) {
				func(i, j);
			}
		} else {
			if (config[i][1] === tool) {
				func(i);
			}
		}
	}
}

function enable (tool) {
	doForTool(tool, function (i) {
		if (Array.isArray(config[i][0])) {
			if (config[i][0][0] === 'disabled') {
				config[i][0].shift();
			}
		} else {
			if (config[i][0] === 'disabled') {
				config[i][0] = '';
			}
		}
	});
}

function remove (tool) {
	doForTool(tool, function (i, j) {
		if (j !== undefined) {
			config[i][1][j] = '';
		} else {
			config[i][1] = '';
		}
	});
}

function replace (tool1, tool2) {
	doForTool(tool1, function (i, j) {
		if (j !== undefined) {
			config[i][1].unshift(tool2);
		} else {
			config[i][1] = [tool2, config[i][1]];
		}
	});
}

function defineTool (name, tool) {
	tools[name] = tool;
}

function setLang (lang) {
	data.lang.userFallback = lang;
}

mw.hook('userjs.load-script.extratabs').fire({
	add: add, enable: enable, remove: remove, replace: replace,
	defineTool: defineTool, setLang: setLang,
	maintain: maintain, getExamples: getExamples
});

$.when($.ready, mw.loader.using('mediawiki.util')).then(function () {
	var enabled = initvars();
	if (enabled) {
		mw.loader.using('mediawiki.language').then(addTools);
	}
});

})(jQuery, mediaWiki);
//</nowiki>