Benutzer:Forrester/düp-monobook.js

In der heutigen Welt ist Benutzer:Forrester/düp-monobook.js für ein breites Spektrum von Menschen zu einem Thema von großer Relevanz und Interesse geworden. Ganz gleich, ob es sich um Profis auf einem bestimmten Gebiet, Hobby-Enthusiasten oder einfach nur Neugierige handelt, Benutzer:Forrester/düp-monobook.js hat in verschiedenen Bereichen Aufmerksamkeit erregt und leidenschaftliche Debatten ausgelöst. Mit fortschreitender Zeit wird immer deutlicher, wie wichtig es ist, Benutzer:Forrester/düp-monobook.js zu verstehen und zu erforschen. Aus diesem Grund ist es von entscheidender Bedeutung, das Studium und die Analyse zu vertiefen. In diesem Artikel werden wir uns mit den verschiedenen Facetten von Benutzer:Forrester/düp-monobook.js befassen und seine Auswirkungen in verschiedenen Kontexten untersuchen, mit dem Ziel, eine vollständige und bereichernde Sicht auf dieses heute so relevante Thema zu bieten.
/* mediawiki crap */
/*global importScript, wgPageName, wgScript, wgScriptPath, wgUserGroups, wgUserName, addOnloadHook, addPortletLink, wgCanonicalNamespace */

/* supportFuncs */
/*global SimpleAjax, SimpleUI, Join, TaskManager, copySlotsRecursively */
importScript('Benutzer:Codeispoetry/supportFuncs.js'); // ]

/* api.js */
/*global DOM, Actions */
importScript('Benutzer:D/monobook/api.js'); // ]

/* düp-helper */
/*global MiniWiki, MiniUtil */ /* Bei MiniWiki sind's nur noch pageURL und newSection, das sollte doch machbar sein? Wäre eh beides im API nützlich */
importScript('Benutzer:Forrester/düp-helperfunctions-monobook.js'); // ]

var duepAdmin = wgUserGroups.indexOf("sysop") !== -1;
if (duepAdmin) {
	/* admin.js */
	/*global AdminActions */
	importScript('Benutzer:Codeispoetry/admin.js'); // ]
}

/* User page */
/*global UserCfg */

// <pre>
//------------------------------------------------------------------------------
var Duep = {

	users: ,

	/** replace the first DUEP-template in a text with some replacement String */
	replaceTemplate: function(text, replacement) {
		var	re	= new RegExp('{{Dateiüberprüfung/benachrichtigt (Kategorie)'.escapeRE() + '\\s*\\|*\\}\\}');
		return text.replace(re, replacement);
	},

	getUploader: function() {
		var tables = DOM.fetch(document, 'table', 'filehistory');
		for (var n in tables) {
			var links = tables.lastChild.getElementsByTagName('a');
			for (var i = (links.length - 1) ; i >= 0 ; --i) {
				if (!links.title) {
					continue;
				}
				var regmatch = links.title.match(/^Benutzer:(.+?)( \(Seite nicht vorhanden\))?$/);
				if (regmatch) {
					return regmatch;
				}
			}
		}
		return null;
	},

	/** 
	called on an image description page.
	parse uploader, datum and tageskategorie,
	callback is called after the user has chosen some files
	passes Infos to callback 
	*/
	getInfo: function(callback, Info) {

		/** displays Info.Dateien to the user so he may select some of them. */
		function showImageSelection() {
			var checksdatei = ;
			for (var i = 0; i < Info.Dateien.length ; ++i) {
				checksdatei.push([
					Info.Dateien.encName, 
					Info.Dateien.name, 
					{	
						checked: Info.Dateien.selected
					},
					'<a href="https://wikifreehand.com/de/Datei:' + encodeURIComponent(Info.Dateien.name) + '">' + Info.Dateien.name + '</a>'
				]);
			}

			/** determines the selected files and heads to callback */
			function parseDateien() {
				var filediv = DOM.get('duep_dateien');
				if (filediv === null) {
					showImageSelection();
				}

				var inputs = filediv.getElementsByTagName('input');
				Info.Dateien = ;
				for (var n in inputs) {
					Info.Dateien.push({
						name: inputs.title, 
						encName: inputs.id, 
						selected: inputs.checked
					});
				}

				if (Info.Dateien.length === 0) {
					showImageSelection();
				} 
				else {
					Info.MehrereDateien = (Info.getSelectedFiles().length > 1);
					callback(Info);
				}
			}

			SimpleUI.CheckboxBox('Zu bearbeitende Dateien auswählen:', 'duep_dateien', checksdatei,
				 ],
				'duep');
		}

		if (typeof Info !== 'undefined') {
			showImageSelection();
		} 
		else {
			Info = {
				Uploader:		'',
				MailEnabled:	false,
				Disku:			false,

				/**
				Array of files:
				
				*/
				Dateien:		null,
				MehrereDateien:	false, /* not necessary, but rather handy */

				getSelectedFiles: function() {
					return this.Dateien.filter(
							function(item) { return item.selected; });
				}
			};
		}

		/* First task, very easy - get the first uploader from file history */

		SimpleUI.Box('Uploader wird bestimmt &hellip;', 'duep');
		Info.Uploader = Duep.getUploader();
		if (!Info.Uploader) {
			/* if this fails, we are not even on an image description page */
			SimpleUI.Box('Uploader wird bestimmt &hellip; Fehler!', 'duep');
			return false;
		}
		
		// TODO simplify
		Info.MailEnabled	= ds_emailtest( Info.Uploader );
		Info.Disku			= ds_diskutest( Info.Uploader );
		
		/** checks whether user has email enabled */
		function ds_emailtest( user ) {
			// TODO async
			var xhr = sajax_init_object();
			if( !xhr ) return false;
			xhr.open('POST', wgScriptPath + '/api.php', false);  
			xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
			xhr.send( 'action=query&format=json&list=users&usprop=emailable&ususers=' +  encodeURIComponent( user ) );
			var query = eval( '(' + xhr.responseText + ')' ).query;
			return ( typeof( query.users.emailable ) != 'undefined' );
		}
		
		/**	checks whether user's talk page is editable	*/
		function ds_diskutest( user ) {
			// TODO async
			var xhr = sajax_init_object();
			if( !xhr ) return false;
			xhr.open('POST', wgScriptPath + '/api.php', false);  
			xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
			xhr.send( 'action=query&format=json&prop=info&inprop=protection&titles=Benutzer_Diskussion:' +  encodeURIComponent( user ) );
			var query = eval( '(' + xhr.responseText + ')' ).query;
			var canedit = true;
			var pageid;
			for( pageid in query.pages ) {
				if( query.pages.protection ) {
					for( var i = 0; i <  query.pages.protection.length; i++ )
					if( query.pages.protection.type == 'edit' &&
							query.pages.protection.level == 'sysop' ) {
						canedit= false;
					}
				}
			}
			return canedit;
		}

		/* complicated stuff starts - we want other files of this user */

		/**
		finds the date of the DUEP-template on an image description page
		calls failfunc with okfunc as param if date not found,
		else okfunc with date as param 
		*/
		function getDatum(parent, failfunc, okfunc) {
			var links = DOM.fetch(parent.getElementById('catlinks'), 'a');
			for (var i in links) {
				if (!links.title) {
					continue;
				}
				var regmatch = links.title.match(/^Kategorie:Wikipedia:Dateiüberprüfung \((\d{4}-\d{2}-\d{2})\)/);
				if (regmatch) {
					return okfunc(regmatch);
				}
			}
			return failfunc(okfunc);
		}

		/** 
		is called with a page history's request and an okfunc
		tries to get the tageskategorie via old revisions 
		*/
		function parseHistory(okfunc, req) {

			/* pushes every revisions created by DUEP-Mitarbeitern into revisionlinks */
			var revisionlinks = ;
			var parent = SimpleAjax.getResponseXML(req);
			var revs = parent.getElementById('pagehistory').getElementsByTagName('li');
			for (var rev in revs) {	// TODO don't use in here
				if (typeof revs !== 'object') {
					continue;
				}
				var user = DOM.fetch(revs, 'span', 'history-user', 0).getElementsByTagName('a').innerHTML;
				if (!user) {
					continue;
				}
				if (Duep.users.indexOf(user) > -1) {
					var as = revs.getElementsByTagName('a');
					for (var a in as) {
						if (as.innerHTML && as.innerHTML.search(/\d\d:\d\d, \d{1,2}\. + \d{4}/) > -1) {
							revisionlinks.push(as.getAttribute('href'));
							break;
						}
					}
				}
			}

			/** calls getDatum for each revision recursively until found a date */
			function nextPage() {
				if (revisionlinks.length > 0) {
					SimpleAjax.get(
							revisionlinks.shift(),
							null, 
							function(req) { 
								getDatum(SimpleAjax.getResponseXML(req), nextPage, okfunc); 
							});
				} 
				else {
					SimpleUI.Box('Es konnte kein DÜP-Baustein in der Versionsgeschichte gefunden werden!', 'duep');
				}
			}

			nextPage();
		}
		
		/** parses the tageskategorie and sets user settings, then makes the user choose files */
		function parseCat(req) {
			Info.Dateien	= ;
			// $1 is the name of the File, $2 is the Uploader, $3 contains the mail flag in $4 and the talk flag in $5
			// $3..$5 are there for historical reasons and are ignored completely afterwards
			var	itemRE	= /^\{\{Dateiüberprüfung \(Liste\)\|Datei:(*)\|(*)(\|(*)\|(*))?\}\}$/gm;
			req.responseText.replace(itemRE, function($0, $1, $2, $3, $4, $5) {
				if ($2 === Info.Uploader) {
					var	name	= $1.replace(/_/g, " ");
					Info.Dateien.push({
						name:		name,
						encName:	encodeURIComponent(name),
						selected:	true
					});
				}
			});
			if (Info.Dateien.length === 0) {
				SimpleUI.Box('Andere Dateien des Benutzers ' + Info.Uploader + ' werden bestimmt &hellip; Fehler!', 'duep');
				return;
			}

			/**
			checks Info.Dateien if it contains only one element,
			then heading to callback,
			else heading to elsefunc 
			*/
			function checkForSingleFile(elsefunc) {
				if (Info.Dateien.length === 1) {
					Info.MehrereDateien = false;
					callback(Info);
				}
				else {
					return elsefunc();
				}
			}

			/**
			receives a json api answer
			checks if these files really exist 
			*/
			function parseAPIAnswer(req) {
				var json = req.responseText.parseJSON();
				if (!json || !json.query || !json.query.pages) {
					checkForSingleFile(showImageSelection);
					return;
				}

				var filtered = ;
				for (var i = 0 ; i < Info.Dateien.length ; ++i) {
					for (var n in json.query.pages) {
						var item = json.query.pages;
						if (item.title && item.pageid && item.title.match(/Datei:(.+)/) === Info.Dateien.name) {
							filtered.push(Info.Dateien);
							break;
						}
					}
				}

				Info.Dateien = filtered;
				checkForSingleFile(showImageSelection);
			}

			checkForSingleFile(
				function() { // elsefunc - multiple files. let's check if none of them is deleted
					SimpleAjax.get(
							wgScriptPath + '/api.php?action=query&format=json&' + 'titles=' + encodeURIComponent('Datei:' + Info.Dateien.map(function(item) { return item.name; }).join('|Datei:')),
							null,
							parseAPIAnswer);
				}
			);
		}
		
		SimpleUI.Box('Datum wird bestimmt &hellip;', 'duep');

		/**
		we are trying to get the date from the current document;
		if it fails, we are requesting the file's history and calling parseHistory
		if it succeeds, we are requesting the cat and calling parseCat 
		*/
		getDatum(document,
			function(okfunc) { // failfunc
				SimpleUI.Box('DÜP-Baustein in der Versionsgeschichte wird gesucht &hellip;', 'duep');
				SimpleAjax.get(
						wgScript + '?action=history&title=' + encodeURIComponent(mw.config.get('wgPageName')),
						null,
						function(req) { parseHistory(okfunc, req); });
			},
			function(Datum) { // okfunc
				SimpleUI.Box('Andere Dateien des Benutzers ' + Info.Uploader + ' werden bestimmt &hellip;', 'duep');
				SimpleAjax.get(
						wgScript + '?action=raw&title=' + encodeURIComponent('Kategorie:Wikipedia:Dateiüberprüfung_(' + Datum + ')'),
						null,
						parseCat);
			}
		);
	},

	//------------------------------------------------------------------------------

	Aufschub: function(Info) {
		var Texte = {
			WebMail: function(raeb) {
				var dateienstr = "http://de.wikipedia.orghttps://wikifreehand.com/de/Datei:" + Info.getSelectedFiles().map(function(item) { return item.encName;}).join('\nhttp://de.wikipedia.orghttps://wikifreehand.com/de/Datei:');
				var dateistr = (Info.MehrereDateien ? "Dateien" : "Datei");
				
				return "Sehr geehrte Damen und Herren,\n\n" +
				"ich bin in der freien Enzyklopädie Wikipedia auf folgende " + dateistr + " gestoßen:\n\n" + dateienstr + "\n\nIch vermute, dass Sie nähere Informationen dazu haben und wäre daher froh, wenn Sie, um die Situation zu klären, mir bei der Beantwortung der folgenden Fragen helfen könnten:\n\n" +
				"1. Sind Sie der alleinige Urheber- bzw. Nutzungsrechtsinhaber der " + dateistr + "?\n\n" +
				"2. Damit die " + dateistr + " in der Wikipedia bleiben " + (Info.MehrereDateien ? "können, müssen" : "kann, muss") + " sie unter eine freie Lizenz gestellt werden. Das wäre z. B. die Lizenz „Creative Commons - Namensnennung-Weitergabe unter gleichen Bedingungen 3.0 Deutschland“. Sind Sie mit dieser Lizenz für die " + (Info.MehrereDateien ? "angegebenen " : "angegebene ") + dateistr + " einverstanden?\n\n" +
				"3. Wie wollen Sie als Urheber genannt werden?\n\n" + (raeb ?
				"4. Ist die abgebildete Person mit der Veröffentlichung und der Zurschaustellung der " + dateistr + " einverstanden? Wenn Sie das nicht wissen, würde mir eine Kontaktmöglichkeit zu dieser Person auch sehr helfen.\n\n" : '') +
				"Es würde mir sehr viel Arbeit abnehmen, wenn Sie so freundlich wären, auch nach diesem Schema zu antworten. Nähere und leicht verständliche Informationen zu der Lizenz gibt es auf http://creativecommons.org/licenses/by-sa/3.0/de/. Vereinfacht gesagt ermöglicht sie es für jedermann, die Datei (auch kommerziell) zu nutzen und zu verändern. Allerdings ist dies dann an eine Pflicht zur Urhebernennung und zur Weitergabe unter gleichen Bedingungen gebunden.\n\n" +
				"Ich kann Ihnen leider nicht garantieren, dass die " + dateistr + " in der Wikipedia verbleiben " + (Info.MehrereDateien ? "werden" : "wird") + ", ich gehe aber davon aus, da wir stets Bedarf an guten Medien haben.\n\n" +
				"Es kommt leider vor, dass unerfahrene Benutzer in die Wikipedia Dateien einfügen, über deren Urheberrechte sie nicht verfügen, was natürlich nicht von der Wikipedia akzeptiert wird. Sollten Sie mit der Veröffentlichung der Datei nicht einverstanden sein, wird sie natürlich umgehend gelöscht werden.\n\n" +
				"Mit freundlichen Grüßen,\n\n" + wgUserName + ", ein ehrenamtlicher Mitarbeiter an der freien Enzyklopädie Wikipedia\n\n" +
				"PS: Falls Ihnen Wikipedia unbekannt ist, können Sie sich auf http://de.wikipedia.orghttps://wikifreehand.com/de/Wikipedia näher informieren. Ihre Antwort wird im Falle einer Freigabe an das Support-Team der Wikipedia weitergeleitet, sofern Sie nichts dagegen haben. Bitte löschen Sie beim Beantworten dieser E-Mail nicht den bisherigen Verlauf unserer Korrespondenz, damit der Zusammenhang erhalten bleibt.";
			},

			WebMailEn: function(raeb) {
				var dateienstr = "http://de.wikipedia.orghttps://wikifreehand.com/de/Datei:" + Info.getSelectedFiles().map(function(item) { return item.encName;}).join('\nhttp://de.wikipedia.orghttps://wikifreehand.com/de/Datei:');
				var dateistr = (Info.MehrereDateien ? "files" : "file");
				
				return "Dear Sir or Madam:\n\n" +
				"I have detected the following " + dateistr + " inside the free encyclopedia Wikipedia:\n\n" + dateienstr + "\n\nIn order to clarify the situation, I would appreciate it if you could respond to the following questions to the best of your knowledge:\n\n" +
				"1. Are you the exclusive copyright owner of the " + dateistr + "?\n\n" +
				"2. In order for the " + dateistr + " to remain on Wikipedia, " + (Info.MehrereDateien ? "they" : "it") + " must be published under a free license, e.g. the license \"Creative Commons - Attribution-ShareAlike 3.0 Unported\". Do you agree to this license for the " + dateistr + "?\n\n" +
				"3. How do you want to be credited?\n\n" + (raeb ?
				"4. Does the person shown on the " + dateistr + " agree with its publication and display? If you cannot answer this you cold help me a lot by providing me with information to contact this person\n\n" : '') +
				"It would help me a lot if you reply using this form. Further information about the license is available at http://creativecommons.org/licenses/by-sa/3.0/. In essence, the license allows publication for commercial use and modifications inside and outside Wikipedia for everyone. However, every user of this image will be required to duly credit the copyright owner.\n\n" +
				"I cannot guarantee that the " + dateistr + " will be kept on Wikipedia. However, due to the strong demand for high quality images, I would assume that " + (Info.MehrereDateien ? "they" : "this one") + " will be kept.\n\n" +
				"Unfortunately, it often happens that inexperienced and unsuspecting contributors to Wikipedia upload files whose copyright they do not hold. Such uploads are typically a violation of copyright regulations and thus not accepted by Wikipedia. If you do not agree to the publication of this file, it will be deleted immediately.\n\n" +
				"Yours sincerely,\n\n" + wgUserName + ", a voluntary contributor to the free encyclopedia Wikipedia\n\n" +
				"PS: If you do not know Wikipedia, feel free to take a look at http://en.wikipedia.orghttps://wikifreehand.com/de/Wikipedia. In case of a permission your response will be forwarded to the Support-Team of Wikipedia unless you do not disagree. Please do not remove the previous course of our conversation in your response of this e-mail so that the context remains comprehensible.";
			},

			MailSubject: function() {
				return "Es gibt leider noch Probleme mit deine" + (Info.MehrereDateien ? "n" : "r") + " Datei" + (Info.MehrereDateien ? "en" : "") + " auf Wikipedia";
			},

			Mail: function() {
				var dateienstr = "http://de.wikipedia.orghttps://wikifreehand.com/de/Datei:" + Info.getSelectedFiles().map(function(item) { return item.encName;}).join('\nhttp://de.wikipedia.orghttps://wikifreehand.com/de/Datei:');
				var dateistr = (Info.MehrereDateien ? "Dateien" : "Datei");
				
				return "Hallo " + Info.Uploader + ",\n\nBei " + (Info.MehrereDateien ? "den" : "der") + " nachstehenden von dir hochgeladenen " + dateistr + " gibt es Probleme, die du leider noch nicht behoben hast:\n\n" + dateienstr +
				"\n\nKonkret besteht noch folgendes Problem:\n\n\n\n" +
				"Du hast jetzt zwei Wochen Zeit, um die fehlenden Informationen nachzutragen. Wenn dann die Probleme weiterhin bestehen, " + (Info.MehrereDateien ? "müssen" : "muss") + " die " + dateistr + " leider gelöscht werden.\n\nFalls du Fragen hast, würde ich mich freuen, dir helfen zu dürfen.\n\nMit freundlichen Grüßen,\n\n" + wgUserName + "\n\nPS: Bitte lösche beim Beantworten dieser E-Mail nicht den bisherigen Verlauf unserer Korrespondenz, damit der Zusammenhang erhalten bleibt.";
			},

			DiskuSubject: function() {
				return "Es gibt leider noch Probleme mit deine" + (Info.MehrereDateien ? "n" : "r") + " Datei" + (Info.MehrereDateien ? "en" : "");
			},

			Disku: function() {
				var dateistr = (Info.MehrereDateien ? "Dateien" : "Datei");
				
				return "Hallo {{subst:PAGENAME}},\n\nBei " + (Info.MehrereDateien ? "den" : "der") + " nachstehenden von dir hochgeladenen " + dateistr + " gibt es Probleme, die du leider noch nicht behoben hast:\n\n" +
				"* ]\n* ]\n\n" +
				"Konkret besteht noch folgendes Problem:\n\n\n\n" +
				"Du hast jetzt zwei Wochen Zeit, um die fehlenden Informationen nachzutragen. Wenn dann die Probleme weiterhin bestehen, " + (Info.MehrereDateien ? "müssen" : "muss") + " die " + dateistr + " leider gelöscht werden. Solltest du noch Fragen haben, würde ich dich gern unterstützen." + (Info.MailEnabled ? '' : '\n\nSchön wäre es übrigens, wenn du ] deine E-Mail-Adresse hinterlassen könntest, damit man dich auch ] erreichen kann.') + " -- ~~~~";
			}
		};

		var Disku = {
			name: 'disku',
			checkbox: 'Uploader auf seiner Diskussionsseite bescheidgeben',
			params: { 
				checked: Info.Disku,
                                disabled: !Info.Disku
			},

			phase1: function(prev, next) {
				function part2() {
					Disku.Text = document.getElementById('simpleEdit').value;
					next();
				}

				SimpleUI.EditBoxWithHints('Diskussionsseitenbeitrag eingeben:', Texte.Disku(), 'Das Aufschieben ist unsere individuellste Hilfe. Du solltest dem Uploader so konkret wie möglich das Problem erläutern und diese Defaulttexte nur wenn sie passen nutzen und ggf. anpassen.' , 'UPLOADER != URHEBER\n\nAus ' + (Info.MehrereDateien ? 'den Dateibeschreibungen' : 'der Dateibeschreibung') + ' wird leider nicht deutlich, ob du (also der Wikipedia-Benutzer {{subst:PAGENAME}}) auch der mit bürgerlichem Namen angegebene Urheber bist. Wenn das tatsächlich so ist, solltest du das am besten so kenntlich machen: |Urheber= <nowiki>]. Andernfalls müsste ich wissen, ob der angegebene Urheber der Veröffentlichung der ' + (Info.MehrereDateien ? "Dateien" : "Datei") + ' zugestimmt hat.\n\nLIZENZ VERGESSEN\n\nLeider hast du deiner Datei keine ] gegeben, was aber sehr wichtig für den Verbleib der Datei in der Wikipedia wäre. Wenn du der Urheber der Datei bist, kannst du eine der ] gelisteten Lizenzen aussuchen. Gehe dann auf ' + (Info.MehrereDateien ? "die Dateilinks" : "den Dateilink") + ' oben und klicke auf "Seite bearbeiten". Dann kannst du die Lizenz einfügen.', ,  ], 'duep');
			},

			phase2: function(checkfunc) {
				MiniWiki.newSection('Benutzer_Diskussion:' + Info.Uploader, Disku.Text, Texte.DiskuSubject(), checkfunc);
				return 1;
			}
		};

		var Mail = {
			name: 'mail',
			checkbox: 'Uploader anmailen',
			params: { 
				checked: Info.MailEnabled, 
				disabled: !Info.MailEnabled
			},

			phase1: function(prev, next) {
				function part2 () {
					Mail.Text = document.getElementById('simpleEdit').value;
					next();
				}

				SimpleUI.EditBoxWithHints('E-Mail-Text eingeben:', Texte.Mail(), 'Das Aufschieben ist unsere individuellste Hilfe. Du solltest dem Uploader so konkret wie möglich das Problem erläutern und diese Defaulttexte nur wenn sie passen nutzen und ggf. anpassen.' , 'UPLOADER != URHEBER\n\nAus ' + (Info.MehrereDateien ? 'den Dateibeschreibungen' : 'der Dateibeschreibung') + ' wird leider nicht deutlich, ob du (also der Wikipedia-Benutzer ' + Info.Uploader + ') auch der mit bürgerlichem Namen angegebene Urheber bist. Wenn das tatsächlich so ist, solltest du das am besten so kenntlich machen: |Urheber= ]. Andernfalls müsste ich wissen, ob der angegebene Urheber der Veröffentlichung der ' + (Info.MehrereDateien ? "Dateien" : "Datei") + ' zugestimmt hat.\n\nLIZENZ VERGESSEN\n\nLeider hast du deiner Datei keine Lizenz (http://de.wikipedia.orghttps://wikifreehand.com/de/WP:FAQB#Rechtliches) gegeben, was aber sehr wichtig für den Verbleib der Datei in der Wikipedia wäre. Wenn du der Urheber der Datei bist, kannst du eine der auf http://de.wikipedia.orghttps://wikifreehand.com/de/WP:LFB gelisteten Lizenzen aussuchen. Gehe dann auf ' + (Info.MehrereDateien ? "die Dateilinks" : "den Dateilink") + ' oben und klicke auf "Seite bearbeiten". Dann kannst du die Lizenz einfügen. Bitte vergiss aber nicht, dich vorher anzumelden.', ,  ], 'duep');
			},

			phase2: function(checkfunc) {
				Actions.sendEmail (null, Info.Uploader, Texte.MailSubject(), Mail.Text, false, checkfunc);
				return 1;
			}
		};

		var ExternMailEn = {
			name: 'externmail-en',
			checkbox: 'Jemanden aus dem Web anmailen (englisch)',
			raeb: null,
			params: {
				checked: false
			},

			phase1: function(prev, next) {
				function part2(raeb) {
					ExternMailEn.raeb = raeb;
					SimpleUI.EditBox('Mailtext (zum Rauskopieren für die Webmail):', Texte.WebMailEn(raeb), ,  ], 'duep');
				}

				if (ExternMailEn.raeb !== null) {
					part2(ExternMailEn.raeb);
				} 
				else {
					SimpleUI.AlertBox ('Ist das Recht am eigenen Bild betroffen?', , ,  ], 'duep');
				}
			},

			phase2: function() {
				return 0;
			}
		};

		var ExternMail = {
			name: 'externmail',
			checkbox: 'Jemanden aus dem Web anmailen',
			params: {
				checked: false
			},

			phase1: function(prev, next) {
				function part2(raeb) {
					ExternMailEn.raeb = raeb;
					SimpleUI.EditBox('Mailtext (zum Rauskopieren für die Webmail):', Texte.WebMail(raeb), ,  ], 'duep');
				}
				SimpleUI.AlertBox ('Ist das Recht am eigenen Bild betroffen?', , ,  ], 'duep');
			},

			phase2: function() {
				return 0;
			}
		};

		var Aufschub = {
			name: 'aufschub',
			checkbox: 'Aufschub auf Dateibeschreibungsseiten eintragen',
			params: { 
				checked: true,
				disabled: false
			},

			phase1: function(prev, next) {
				function part2 () {
					Aufschub.Grund = document.getElementById('duep_grund').value;
					if (Aufschub.Grund) {
						next();
					} // Ohne Grund darfste gleich noch mal
				}
				SimpleUI.InputBox( ], ,  ], 'duep');
			},

			phase2: function(checkfunc) {
				function change (text) {
					var aufschub = "{{Dateiüberprüfung/benachrichtigt (Kategorie)|{{subst:LOCALYEAR}}|{{subst:LOCALMONTH}}|{{subst:LOCALDAY2}}}}\n " + "Aufschub, " + Aufschub.Grund + " -- ~~~~\n";
					var out = Duep.replaceTemplate(text, aufschub);
					return out !== text ? out : '{{Dateiüberprüfung/benachrichtigt (Vermerk)|' + Info.Uploader + '|' + ((Info.Disku) ? 'Disk' : '') + ((Info.MailEnabled) ? ((Info.Disku) ? '+' : '') + 'Mail' : '') + '|-- ~~~~ (unter Annahme, dass BLUbot das erledigt hat)}}{{Dateiüberprüfung/benachrichtigt (Text)}}' + aufschub + "\n" + text;
				}

				var count = 0;
				for (var n = 0 ; n < Info.Dateien.length ; n++) {
					if (Info.Dateien.selected === true) {
						Actions.replaceText(null, 'Datei:' + Info.Dateien.name, change, "Aufschub", false, false, checkfunc);
						count++;
					}
				}
				return count;
			}
		};

		var Tasks = new TaskManager(,
			function() { Duep.getInfo(Duep.Aufschub, Info); });
	},

	//------------------------------------------------------------------------------

	Loeschen: function(Info) {
		var strDatei = (Info.MehrereDateien ? "Dateien" : "Datei");
		
		var Texte = {
			DiskuSubject: function() {
				return "Deine " + strDatei + " musste" + (Info.MehrereDateien ? "n" : "") + " leider gelöscht werden";
			},

			Disku: function() {
				return "Hallo {{subst:PAGENAME}},\n\nDa du die benötigten Informationen nicht nachgetragen hast, musste" + (Info.MehrereDateien ? "n" : "") + " die folgende" + (Info.MehrereDateien ? "n" : "") + " Datei" + (Info.MehrereDateien ? "en" : "") + " leider gelöscht werden:\n\n" +
						"* ]\n* ]\n\n" + "Die " + strDatei + (Info.MehrereDateien ? " können" : " kann") + " aber mit deiner Hilfe wiederhergestellt werden: Ich müsste bspw. wissen, wer der Urheber der " + strDatei + " ist, woher du sie hast und unter welcher Lizenz sie " + (Info.MehrereDateien ? "stehen." : "steht.") + (Info.MailEnabled ? '' : '\n\nSchön wäre es übrigens, wenn du ] deine E-Mail-Adresse hinterlassen könntest, damit man dich auch ] erreichen kann.') + " -- ~~~~";
			},

			MailSubject: function() {
				return "Deine " + strDatei + " bei Wikipedia musste" + (Info.MehrereDateien ? "n" : "") + " leider gelöscht werden";
			},

			Mail: function(raeb) {
				var dateienstr = "http://de.wikipedia.orghttps://wikifreehand.com/de/Datei:" + Info.getSelectedFiles().map(function(item) { return item.encName;}).join('\nhttp://de.wikipedia.orghttps://wikifreehand.com/de/Datei:');
				
				return "Hallo " + Info.Uploader + ",\n\nDa du die benötigten Informationen nicht nachgetragen hast, musste" + (Info.MehrereDateien ? "n" : "") + " die folgende" + (Info.MehrereDateien ? "n" : "") + " Datei" + (Info.MehrereDateien ? "en" : "") + " leider gelöscht werden:\n\n" + dateienstr + "\n\nDurch Beantworten der folgenden Fragen kannst du beim Klären der Situation mithelfen, sodass die Datei" + (Info.MehrereDateien ? "en" : "") + " möglicherweise wiederhergestellt werden " + (Info.MehrereDateien ? "können:" : "kann:") + "\n\n1. Bist du der alleinige Urheber- bzw. Nutzungsrechtsinhaber der " + strDatei + "?\n\n" +
						"2. Damit die " + strDatei + " in der Wikipedia bleiben " + (Info.MehrereDateien ? "können, müssen" : "kann, muss") + " sie unter eine freie Lizenz gestellt werden. Das wäre z. B. die Lizenz „Creative Commons - Namensnennung-Weitergabe unter gleichen Bedingungen 3.0 Deutschland“. Bist du mit dieser Lizenz für die " + (Info.MehrereDateien ? "angegebenen " : "angegebene ") + strDatei + " einverstanden?\n\n" +
						"3. Wie willst du als Urheber genannt werden: mit deinem bürgerlichen Namen oder mit deinem Benutzernamen?\n\n" + (raeb ?
						"4. Ist die abgebildete Person mit der Veröffentlichung und der Zurschaustellung der " + strDatei + " einverstanden? Wenn du das nicht weißt, würde mir eine Kontaktmöglichkeit zu dieser Person auch sehr helfen.\n\n" : '') +
						"Es würde mir sehr viel Arbeit abnehmen, wenn du so freundlich wärst, auch nach diesem Schema zu antworten. Nähere und leicht verständliche Informationen zu der Lizenz gibt es auf http://creativecommons.org/licenses/by-sa/3.0/de/. Vereinfacht gesagt ermöglicht sie es für jedermann, die Datei (auch kommerziell) zu nutzen und zu verändern. Allerdings ist dies dann an eine Pflicht zur Urhebernennung und zur Weitergabe unter gleichen Bedingungen gebunden.\n\n" + "Ich kann dir leider nicht garantieren, dass die " + strDatei + " in der Wikipedia verbleiben wird, ich gehe aber davon aus, da wir stets Bedarf an guten Medien haben.\n\n" +
						"Falls du Fragen hast, würde ich mich freuen, dir helfen zu dürfen.\n\n" + "Mit freundlichen Grüßen,\n\n" + wgUserName + "\n\nPS: Deine Antwort wird im Falle einer Freigabe an das Support-Team der Wikipedia weitergeleitet, sofern du nichts dagegen hast. Bitte lösche beim Beantworten dieser E-Mail nicht den bisherigen Verlauf unserer Korrespondenz, damit der Zusammenhang erhalten bleibt.";
			},
		};

		var Disku = {
			name: 'disku',
			checkbox: 'Uploader auf seiner Diskussionsseite bescheidgeben',
			params: { 
				checked: Info.Disku,
                                disabled: !Info.Disku
			},

			phase1: function(prev, next) {
				function part2() {
					Disku.Text = document.getElementById('simpleEdit').value;
					next();
				}
				SimpleUI.EditBox('Diskussionsseitenbeitrag eingeben:', Texte.Disku(), ,  ], 'duep');
			},

			phase2: function(checkfunc) {
				MiniWiki.newSection(
					'Benutzer_Diskussion:' + Info.Uploader,
					Disku.Text,
					Texte.DiskuSubject(),
					checkfunc);
				return 1;
			}
		};

		var Mail = {
			name: 'mail',
			checkbox: 'Uploader anmailen',
			params: { 
				checked: Info.MailEnabled, 
				disabled: !Info.MailEnabled
			},

			phase1: function(prev, next) {
				function part2(raeb) {
					SimpleUI.EditBox('E-Mail-Text eingeben:', Texte.Mail(raeb), [
						,
						
					], 'duep');
				}

				SimpleUI.AlertBox ('Ist das Recht am eigenen Bild betroffen?', , ,  ], 'duep');
			},

			phase2: function(checkfunc) {
				Actions.sendEmail(null,
					Info.Uploader,
					Texte.MailSubject(),
					Mail.Text, false, checkfunc);
				return 1;
			}
		};

		var SLA = {
			name: 'sla',
			checkbox: 'Schnelllöschanträge stellen',
			params: {
				checked: !duepAdmin, 
				disabled: false
			},

			phase1: function(prev, next) {
				function part2 () {
					SLA.Grund = document.getElementById('duep_grund').value;
					if (SLA.Grund) {
						next();
					} // Ohne Grund darfste gleich noch mal
				}

				SimpleUI.InputBox(
					 ],
					,  ],
					'duep');
			},

			phase2: function(checkfunc) {
				function change(text) {
					var sla  = "\n{{Löschen}} ''" + SLA.Grund + "'' {{#ifexist: {{TALKPAGENAME}} | {{Achtung|An den löschenden Admin: Es existiert die ] zu dieser Dateibeschreibungsseite. Sie ist auch zu löschen.}}|}} -- ~~~~\n----\n";
					return sla + "\n" + Duep.replaceTemplate(text, '');
				}

				var count = 0;
				for (var n = 0 ; n < Info.Dateien.length ; n++) {
					if (Info.Dateien.selected === true) {
						Actions.replaceText (null, 'Datei:' + Info.Dateien.name, change, "SLA+", false, false, checkfunc);
						count++;
					}
				}
				return count;
			}
		};

		var Loeschen = {
			name: 'loeschen',
			checkbox: 'Dateien löschen',
			params: { 
				checked: duepAdmin, 
				disabled: !duepAdmin
			},

			phase1: function(prev, next) {
				function part2 () {
					Loeschen.Grund = document.getElementById('duep_grund').value;
					if (Loeschen.Grund) {
						next();
					} // Ohne Grund darfste gleich noch mal
				}

				SimpleUI.InputBox(
					 ],
					,  ],
					'duep');
			},

			phase2: function(checkfunc) {
				function talkDel (req) {
					var json = req.responseText.parseJSON();
					if (json && json.query && json.query.pages && json.query.pages.title && json.query.pages.pageid) {
						AdminActions.deletePage('Datei gelöscht', checkfunc, json.query.pages.title);
					} 
					else {
						checkfunc();
					}
				}

				var count = 0;
				for (var n = 0 ; n < Info.Dateien.length ; n++) {
					if (Info.Dateien.selected === true) {
						AdminActions.deletePage(Loeschen.Grund, checkfunc, 'Datei:' + Info.Dateien.name);
						SimpleAjax.get(
							wgScriptPath + '/api.php?' + 'action=query&format=json&' + 'titles=' + encodeURIComponent('Datei Diskussion:') + Info.Dateien.encName,
							null,
							talkDel
						);
						count += 2;
					}
				}
				return count;
			}
		};

		var Tasks = new TaskManager(
				,
				function() { Duep.getInfo(Duep.Loeschen, Info); });
	},

	/** automatic (-Cat)+SF */
	SF: function(Info) {
		var doSF = {
			name: 'doSF',
			checkbox: 'Dateien bei den schweren Fällen eintragen',
			params: {
				checked: true, 
				disabled: true
			},

			phase1: function(prev, next) {
				function part2() {
					doSF.Reason = DOM.get('simpleEdit').value;
					if (doSF.Reason) {
						next();
					}
				}
				SimpleUI.EditBox('Begründung für Schwierige Fälle:', '', [
					,
					
				], 'duep');
			},

			phase2: function(checkfunc) {
				var selectedfiles = Info.getSelectedFiles();
				var filelist = selectedfiles.map(function(item) {return "]";}).join(', ');

				var sectiontext = doSF.Reason + " -- ~~~~";
				var sectiontitle = '';
				if (filelist.length < 200) {
					sectiontitle = filelist;
				}
				else {
					sectiontitle = selectedfiles.length + " Dateien von ]";
					sectiontext = ":''" + filelist + "''\n" + sectiontext;
				}

				MiniWiki.newSection(
					"Wikipedia:Dateiüberprüfung/Schwierige Fälle",
					sectiontext,
					sectiontitle,
					checkfunc);

				function change(text) {
					var sf  = "{{Dateiüberprüfung (Schwierige Fälle)|1=" + doSF.Reason + " -- ~~~~}}\n\n";
					var out = Duep.replaceTemplate(text, sf);
					return out !== text ? out : sf + "\n" + text;
				}

				var count = 1; // newSection oben
				for (var n = 0 ; n < Info.Dateien.length ; n++) {
					if (Info.Dateien.selected === true) {
						Actions.replaceText(null,
							'Datei:' + Info.Dateien.name,
							change,
							"Schwieriger Fall+", false, false,
							checkfunc);
						count++;
					}
				}
				return count;
			}
		};
		var Tasks = new TaskManager (
				,
				function() { Duep.getInfo(Duep.SF, Info); });
	},

	/** add Information template to the textbox */
	Information: function() {
		var tb = DOM.get('wpTextbox1');
		if (!tb)	return;
		tb.value	= "{{Information\n|Beschreibung =\n|Quelle =\n|Urheber =\n|Datum =\n|Genehmigung =\n|Andere Versionen =\n|Anmerkungen =\n}}\n\n" + tb.value;
	},

	/** set DUEP status on "benachrichtigt" */
	Informed: function() {
		function part2() {
			var reason = DOM.get('simpleEdit').value;
			if (!reason) {
				return;
			}
			
			function change(text) {
				var duepmatch = /\{\{(?:*(?:Template|Vorlage)*:)?*(?:ÜP|ateiüberprüfung)*(\|+)*\}\}/;
				if (text.search(duepmatch) === -1) {
					SimpleUI.Box('Keine DÜP-Vorlage gefunden.');
					return text;
				}
				var temp = text.replace(duepmatch,
					'{{Dateiüberprüfung/benachrichtigt (Text)$1}}\n\n' +
					'{{Dateiüberprüfung/benachrichtigt (Kategorie)|{{subst:LOCALYEAR}}|{{subst:LOCALMONTH}}|{{subst:LOCALDAY2}}}}\n\n' + " " + reason + " -- ~~~~");

				var usage = DOM.fetch(DOM.get('mw-imagepage-section-linkstoimage'), 'a');
				if (usage !== null && usage.length > 0) {
					temp += '{{Dateiüberprüfung/benachrichtigt (Verwendung)|~~~~~|\n';
					for (var i = 0 ; i < usage.length ; ++i) {
						temp += '{{Dateiüberprüfung/benachrichtigt (einzelne Verwendung)|' + usage.title + '}}\n';
					}
					temp += '}}';
				}
				return temp;
			}
			MiniWiki.changeText(wgPageName, change, "Benutzer benachrichtigt", MiniUtil.reloader());
		}

		SimpleUI.InputBox(
			],
			],
			'duep');
	},

	/** Opens a new tab to search at tineye.com */
	TinEye: function() {
		var fl = document.getElementById('file');
		if (!fl) return;
		var links = fl.getElementsByTagName('a');
		if (!links.length) return;
		var imageurl = links.href; //imageboxes adds links _before_, so we get the last link
		var img = fl.getElementsByTagName('img');
		if(!img || !img) return;
		img = img;
		if (img.getAttribute("width") <= 300) {
			imageurl = img.src; //Image smaller than 300px width
		} else { //Get thumb url
			var urlparts = /^(http:\/\/upload.wikimedia.org\/+\/+\/)(.*\/)(+)$/.exec(imageurl);
			imageurl = urlparts + "thumb/" + urlparts + urlparts + "/300px-" + urlparts; 
		}
		window.open('http://tineye.com/search?url=' + encodeURIComponent(imageurl), '_blank');
		return false;
	},

	/** Add DÜP-Buttons and Links, recolor talklink */
	changeUI: function() {
		// Dateiüberprüfung-Portletlink
		mw.util.addPortletLink(
			"p-personal",
			MiniWiki.scriptURL({
				title: "Kategorie:Wikipedia:Dateiüberprüfung (Tageskategorien, aktuell)",
				action: "purge"
			}),
			"Dateiüberprüfung",
			"pt-duep-kats",
			"Dateiüberprüfung",
			"b",
			DOM.get("pt-userpage")
		);

		if (MiniUtil.imageView() || MiniUtil.imageEdit()) {
			if (MiniUtil.imageView()) {
				MiniUtil.addJsTab("Aufschub",		function() { Duep.getInfo(Duep.Aufschub); });
				MiniUtil.addJsTab("SF",				function() { Duep.getInfo(Duep.SF); });
				MiniUtil.addJsTab("SLA",			function() { Duep.getInfo(Duep.Loeschen); });
				MiniUtil.addJsTab("Benachrichtigt",	Duep.Informed);
                                MiniUtil.addJsTab("TinEye",	Duep.TinEye);
			}
			else if (MiniUtil.imageEdit()) {
				MiniUtil.addJsTab("Info",		Duep.Information);
			}

			var talklink = DOM.get('ca-talk');
			if (talklink .className !== 'new') {
				talklink.firstChild.style.backgroundColor = '#00FF00';
			}
		}
	}
};

//------------------------------------------------------------------------------

if (typeof UserCfg === 'object' && typeof UserCfg.Duep === 'object') {
	copySlotsRecursively(Duep, UserCfg.Duep);
}

// Add DÜP-Buttons and Links
$(Duep.changeUI);

// </pre>

// DÜP-Setzen-Tab
importScript('Benutzer:Forrester/düp-setzen-monobook.js'); // ]

// checkDupes
if (wgCanonicalNamespace === 'File' && document.URL.match(/index\.php.+action=/) === null) {
	importScript('Benutzer:Codeispoetry/checkDupes.js'); // ]
}