மீடியாவிக்கி:Gadget-twinkleimage.js
// &lt;nowiki&gt;
 
 
 (function($) {
 
 
 /*
  ****************************************
  *** twinkleimage.js: Image CSD module
  ****************************************
  * Mode of invocation:     Tab (&quot;DI&quot;)
  * Active on:              Local nonredirect file pages (not on Commons)
  */
 
 Twinkle.image = function twinkleimage() {
 	if (mw.config.get('wgNamespaceNumber') === 6 &amp;&amp; mw.config.get('wgArticleId') &amp;&amp; !document.getElementById('mw-sharedupload') &amp;&amp; !Morebits.isPageRedirect()) {
 		Twinkle.addPortletLink(Twinkle.image.callback, 'DI', 'tw-di', 'Nominate file for delayed speedy deletion');
 	}
 };
 
 Twinkle.image.callback = function twinkleimageCallback() {
 	var Window = new Morebits.simpleWindow(600, 330);
 	Window.setTitle('File for dated speedy deletion');
 	Window.setScriptName('Twinkle');
 	Window.addFooterLink('Speedy deletion policy', 'WP:CSD#Files');
 	Window.addFooterLink('Image prefs', 'WP:TW/PREF#image');
 	Window.addFooterLink('Twinkle help', 'WP:TW/DOC#image');
 	Window.addFooterLink('Give feedback', 'WT:TW');
 
 	var form = new Morebits.quickForm(Twinkle.image.callback.evaluate);
 	form.append({
 		type: 'checkbox',
 		list: [
 			{
 				label: 'Notify original uploader',
 				value: 'notify',
 				name: 'notify',
 				tooltip: &quot;Uncheck this if you are planning to make multiple nominations from the same user, and don't want to overload their talk page with too many notifications.&quot;,
 				checked: Twinkle.getPref('notifyUserOnDeli')
 			}
 		]
 	}
 	);
 	var field = form.append({
 		type: 'field',
 		label: 'Type of action wanted'
 	});
 	field.append({
 		type: 'radio',
 		name: 'type',
 		event: Twinkle.image.callback.choice,
 		list: [
 			{
 				label: 'No source (CSD F4)',
 				value: 'no source',
 				checked: true,
 				tooltip: 'Image or media has no source information'
 			},
 			{
 				label: 'No license (CSD F4)',
 				value: 'no license',
 				tooltip: 'Image or media does not have information on its copyright status'
 			},
 			{
 				label: 'No source and no license (CSD F4)',
 				value: 'no source no license',
 				tooltip: 'Image or media has neither information on source nor its copyright status'
 			},
 			{
 				label: 'Orphaned fair use (CSD F5)',
 				value: 'orphaned fair use',
 				tooltip: 'Image or media is unlicensed for use on Wikipedia and allowed only under a claim of fair use per Wikipedia:Non-free content, but it is not used in any articles'
 			},
 			{
 				label: 'No fair use rationale (CSD F6)',
 				value: 'no fair use rationale',
 				tooltip: 'Image or media is claimed to be used under Wikipedia\'s fair use policy but has no explanation as to why it is permitted under the policy'
 			},
 			{
 				label: 'Disputed fair use rationale (CSD F7)',
 				value: 'disputed fair use rationale',
 				tooltip: 'Image or media has a fair use rationale that is disputed'
 			},
 			{
 				label: 'Replaceable fair use (CSD F7)',
 				value: 'replaceable fair use',
 				tooltip: 'Image or media may fail Wikipedia\'s first non-free content criterion ([[WP:NFCC#1]]) in that it illustrates a subject for which a free image might reasonably be found or created that adequately provides the same information'
 			},
 			{
 				label: 'No evidence of permission (CSD F11)',
 				value: 'no permission',
 				tooltip: 'Image or media does not have proof that the author agreed to licence the file'
 			}
 		]
 	});
 	form.append({
 		type: 'div',
 		label: 'Work area',
 		name: 'work_area'
 	});
 	form.append({ type: 'submit' });
 
 	var result = form.render();
 	Window.setContent(result);
 	Window.display();
 
 	// We must init the parameters
 	var evt = document.createEvent('Event');
 	evt.initEvent('change', true, true);
 	result.type[0].dispatchEvent(evt);
 };
 
 Twinkle.image.callback.choice = function twinkleimageCallbackChoose(event) {
 	var value = event.target.values;
 	var root = event.target.form;
 	var work_area = new Morebits.quickForm.element({
 		type: 'div',
 		name: 'work_area'
 	});
 
 	switch (value) {
 		case 'no source no license':
 		case 'no source':
 			work_area.append({
 				type: 'checkbox',
 				list: [
 					{
 						label: 'Non-free',
 						name: 'non_free',
 						tooltip: 'File is licensed under a fair use claim'
 					}
 				]
 			});
 		/* falls through */
 		case 'no license':
 			work_area.append({
 				type: 'checkbox',
 				list: [
 					{
 						name: 'derivative',
 						label: 'Derivative work which lacks a source for incorporated works',
 						tooltip: 'File is a derivative of one or more other works whose source is not specified'
 					}
 				]
 			});
 			break;
 		case 'no permission':
 			work_area.append({
 				type: 'input',
 				name: 'source',
 				label: 'Source: '
 			});
 			break;
 		case 'disputed fair use rationale':
 			work_area.append({
 				type: 'textarea',
 				name: 'reason',
 				label: 'Concern: '
 			});
 			break;
 		case 'orphaned fair use':
 			work_area.append({
 				type: 'input',
 				name: 'replacement',
 				label: 'Replacement: ',
 				tooltip: 'Optional file that replaces this one.  The &quot;File:&quot; prefix is optional.'
 			});
 			break;
 		case 'replaceable fair use':
 			work_area.append({
 				type: 'textarea',
 				name: 'reason',
 				label: 'Reason: '
 			});
 			break;
 		default:
 			break;
 	}
 
 	root.replaceChild(work_area.render(), $(root).find('div[name=&quot;work_area&quot;]')[0]);
 };
 
 Twinkle.image.callback.evaluate = function twinkleimageCallbackEvaluate(event) {
 
 	var input = Morebits.quickForm.getInputData(event.target);
 	if (input.replacement) {
 		input.replacement = (new RegExp('^' + Morebits.namespaceRegex(6) + ':', 'i').test(input.replacement) ? '' : 'File:') + input.replacement;
 	}
 
 	var csdcrit;
 	switch (input.type) {
 		case 'no source no license':
 		case 'no source':
 		case 'no license':
 			csdcrit = 'F4';
 			break;
 		case 'orphaned fair use':
 			csdcrit = 'F5';
 			break;
 		case 'no fair use rationale':
 			csdcrit = 'F6';
 			break;
 		case 'disputed fair use rationale':
 		case 'replaceable fair use':
 			csdcrit = 'F7';
 			break;
 		case 'no permission':
 			csdcrit = 'F11';
 			break;
 		default:
 			throw new Error('Twinkle.image.callback.evaluate: unknown criterion');
 	}
 
 	var lognomination = Twinkle.getPref('logSpeedyNominations') &amp;&amp; Twinkle.getPref('noLogOnSpeedyNomination').indexOf(csdcrit.toLowerCase()) === -1;
 	var templatename = input.derivative ? 'dw ' + input.type : input.type;
 
 	var params = $.extend({
 		templatename: templatename,
 		normalized: csdcrit,
 		lognomination: lognomination
 	}, input);
 
 	Morebits.simpleWindow.setButtonsEnabled(false);
 	Morebits.status.init(event.target);
 
 	Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
 	Morebits.wiki.actionCompleted.notice = 'Tagging complete';
 
 	// Tagging image
 	var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), 'Tagging file with deletion tag');
 	wikipedia_page.setCallbackParameters(params);
 	wikipedia_page.load(Twinkle.image.callbacks.taggingImage);
 
 	// Notifying uploader
 	if (input.notify) {
 		wikipedia_page.lookupCreation(Twinkle.image.callbacks.userNotification);
 	} else {
 		// add to CSD log if desired
 		if (lognomination) {
 			Twinkle.image.callbacks.addToLog(params, null);
 		}
 		// No auto-notification, display what was going to be added.
 		var noteData = document.createElement('pre');
 		noteData.appendChild(document.createTextNode('{{subst:di-' + templatename + '-notice|1=' + mw.config.get('wgTitle') + '}} ~~~~'));
 		Morebits.status.info('Notification', [ 'Following/similar data should be posted to the original uploader:', document.createElement('br'), noteData ]);
 	}
 };
 
 Twinkle.image.callbacks = {
 	taggingImage: function(pageobj) {
 		var text = pageobj.getPageText();
 		var params = pageobj.getCallbackParameters();
 
 		// remove &quot;move to Commons&quot; tag - deletion-tagged files cannot be moved to Commons
 		text = text.replace(/\{\{(mtc|(copy |move )?to ?commons|move to wikimedia commons|copy to wikimedia commons)[^}]*\}\}/gi, '');
 
 		var tag = '{{di-' + params.templatename + '|date={{subst:#time:j F Y}}';
 		switch (params.type) {
 			case 'no source no license':
 			case 'no source':
 				tag += params.non_free ? '|non-free=yes' : '';
 				break;
 			case 'no permission':
 				tag += params.source ? '|source=' + params.source : '';
 				break;
 			case 'disputed fair use rationale':
 				tag += params.reason ? '|concern=' + params.reason : '';
 				break;
 			case 'orphaned fair use':
 				tag += params.replacement ? '|replacement=' + params.replacement : '';
 				break;
 			case 'replaceable fair use':
 				tag += params.reason ? '|1=' + params.reason : '';
 				break;
 			default:
 				break;  // doesn't matter
 		}
 		tag += '|help=off}}\n';
 
 		pageobj.setPageText(tag + text);
 		pageobj.setEditSummary('This file is up for deletion, per [[WP:CSD#' + params.normalized + '|CSD ' + params.normalized + ']] (' + params.type + ').');
 		pageobj.setChangeTags(Twinkle.changeTags);
 		pageobj.setWatchlist(Twinkle.getPref('deliWatchPage'));
 		pageobj.setCreateOption('nocreate');
 		pageobj.save();
 	},
 	userNotification: function(pageobj) {
 		var params = pageobj.getCallbackParameters();
 		var initialContrib = pageobj.getCreator();
 
 		// disallow warning yourself
 		if (initialContrib === mw.config.get('wgUserName')) {
 			pageobj.getStatusElement().warn('You (' + initialContrib + ') created this page; skipping user notification');
 		} else {
 			var usertalkpage = new Morebits.wiki.page('User talk:' + initialContrib, 'Notifying initial contributor (' + initialContrib + ')');
 			var notifytext = '\n{{subst:di-' + params.templatename + '-notice|1=' + mw.config.get('wgTitle');
 			if (params.type === 'no permission') {
 				notifytext += params.source ? '|source=' + params.source : '';
 			}
 			notifytext += '}} ~~~~';
 			usertalkpage.setAppendText(notifytext);
 			usertalkpage.setEditSummary('Notification: tagging for deletion of [[:' + Morebits.pageNameNorm + ']].');
 			usertalkpage.setChangeTags(Twinkle.changeTags);
 			usertalkpage.setCreateOption('recreate');
 			usertalkpage.setWatchlist(Twinkle.getPref('deliWatchUser'));
 			usertalkpage.setFollowRedirect(true, false);
 			usertalkpage.append();
 		}
 
 		// add this nomination to the user's userspace log, if the user has enabled it
 		if (params.lognomination) {
 			Twinkle.image.callbacks.addToLog(params, initialContrib);
 		}
 	},
 	addToLog: function(params, initialContrib) {
 		var usl = new Morebits.userspaceLogger(Twinkle.getPref('speedyLogPageName'));
 		usl.initialText =
 			&quot;This is a log of all [[WP:CSD|speedy deletion]] nominations made by this user using [[WP:TW|Twinkle]]'s CSD module.\n\n&quot; +
 			'If you no longer wish to keep this log, you can turn it off using the [[Wikipedia:Twinkle/Preferences|preferences panel]], and ' +
 			'nominate this page for speedy deletion under [[WP:CSD#U1|CSD U1]].' +
 			(Morebits.userIsSysop ? '\n\nThis log does not track outright speedy deletions made using Twinkle.' : '');
 
 		var formatParamLog = function(normalize, csdparam, input) {
 			if (normalize === 'F5' &amp;&amp; csdparam === 'replacement') {
 				input = '[[:' + input + ']]';
 			}
 			return ' {' + normalize + ' ' + csdparam + ': ' + input + '}';
 		};
 
 		var extraInfo = '';
 
 		// If a logged file is deleted but exists on commons, the wikilink will be blue, so provide a link to the log
 		var fileLogLink = ' ([{{fullurl:Special:Log|page=' + mw.util.wikiUrlencode(mw.config.get('wgPageName')) + '}} log])';
 
 		var appendText = '# [[:' + Morebits.pageNameNorm + ']]' + fileLogLink + ': DI [[WP:CSD#' + params.normalized.toUpperCase() + '|CSD ' + params.normalized.toUpperCase() + ']] ({{tl|di-' + params.templatename + '}})';
 
 		['reason', 'replacement', 'source'].forEach(function(item) {
 			if (params[item]) {
 				extraInfo += formatParamLog(params.normalized.toUpperCase(), item, params[item]);
 				return false;
 			}
 		});
 
 		if (extraInfo) {
 			appendText += '; additional information:' + extraInfo;
 		}
 		if (initialContrib) {
 			appendText += '; notified {{user|1=' + initialContrib + '}}';
 		}
 		appendText += ' ~~~~~\n';
 
 		var editsummary = 'Logging speedy deletion nomination of [[:' + Morebits.pageNameNorm + ']].';
 
 		usl.changeTags = Twinkle.changeTags;
 		usl.log(appendText, editsummary);
 	}
 };
 
 Twinkle.addInitCallback(Twinkle.image, 'image');
 })(jQuery);