ഉപയോക്താവ്:മാതൃകാ ഉപയോക്താവ്/twinklexfd.js

വിക്കിപീഡിയ, ഒരു സ്വതന്ത്ര വിജ്ഞാനകോശം.

ശ്രദ്ധിക്കുക: സേവ് ചെയ്തശേഷം മാറ്റങ്ങൾ കാണാനായി താങ്കൾക്ക് ബ്രൗസറിന്റെ കാഷെ ഒഴിവാക്കേണ്ടി വന്നേക്കാം.

  • ഫയർഫോക്സ് / സഫാരി: Reload ബട്ടൺ അമർത്തുമ്പോൾ Shift കീ അമർത്തി പിടിക്കുകയോ, Ctrl-F5 അല്ലെങ്കിൽ Ctrl-R (മാക്കിന്റോഷിൽ ⌘-R ) എന്ന് ഒരുമിച്ച് അമർത്തുകയോ ചെയ്യുക
  • ഗൂഗിൾ ക്രോം: Ctrl-Shift-R (മാക്കിന്റോഷിൽ ⌘-Shift-R ) അമർത്തുക
  • ഇന്റർനെറ്റ് എക്സ്പ്ലോറർ: Refresh ബട്ടൺ അമർത്തുമ്പോൾ Ctrl കീ അമർത്തിപിടിക്കുക. അല്ലെങ്കിൽ Ctrl-F5 അമർത്തുക
  • ഓപ്പറ: Menu → Settings എടുക്കുക (മാക്കിൽ Opera → Preferences) എന്നിട്ട് Privacy & security → Clear browsing data → Cached images and files ചെയ്യുക.
// If TwinkleConfig aint exist.
if (typeof(TwinkleConfig) == 'undefined') {
	TwinkleConfig = {};
}

/**
 TwinkleConfig.xfdWatchDiscussion (string)
 The watchlist setting of the newly created XfD page. Either "yes", "no", or "default". Default is "default" (Duh).
 */
if (typeof(TwinkleConfig.xfdWatchDiscussion) == 'undefined') {
	TwinkleConfig.xfdWatchDiscussion = "default";
}

/**
 TwinkleConfig.xfdWatchPage (string)
 The watchlist setting of the page listed for XfD. Either "yes", "no", or "default". Default is "default" (Duh).
 */
if (typeof(TwinkleConfig.xfdWatchPage) == 'undefined') {
	TwinkleConfig.xfdWatchPage = "default";
}

/**
 TwinkleConfig.xfdWatchUser (string)
 The watchlist setting of the user if he receives a notification. Either "yes", "no", or "default". Default is "default" (Duh).
 */
if (typeof(TwinkleConfig.xfdWatchUser) == 'undefined') {
	TwinkleConfig.xfdWatchUser = "default";
}

/**
 TwinkleConfig.xfdWatchList (string)
 The watchlist setting of xfd list page, *if* the discussion is on a separate page. Either "yes", "no", or "default". Default is "no" (Hehe. Seriously though, who wants to watch it? Sorry in advance for any false positives.).
 */
if (typeof(TwinkleConfig.xfdWatchList) == 'undefined') {
	TwinkleConfig.xfdWatchList = "no";
}

/**
 TwinkleConfig.xfdWatchUsages (string)
 The watchlist setting of usages of the tagged page (image, usually). Either "yes", "no", or "default". Default is "no".
 */
if (typeof(TwinkleConfig.xfdWatchUsages) == 'undefined') {
	TwinkleConfig.xfdWatchUsages = "no";
}


/**
 TwinkleConfig.summaryAd (string)
 If ad should be added or not to summary, default [[WP:TWINKLE|TWINKLE]]
 */
if (typeof(TwinkleConfig.summaryAd) == 'undefined') {
	TwinkleConfig.summaryAd = " using [[WP:TW|TW]]";
}

function getForm(responseText) {
	var doc = document.implementation.createHTMLDocument("twinkle");
	doc.documentElement.innerHTML = responseText;

	return doc.getElementById('editform');
}

function num2order(num) {
	switch (num) {
	case 1:
		return '';
	case 2:
		return '2nd';
	case 3:
		return '3rd';
	default:
		return num + 'th';
	}
}

function twinklexfd() {
	if (wgNamespaceNumber < 0 || wgCurRevisionId == false) {
		return;
	}
	if (twinkleConfigExists) {
		mw.util.addPortletLink('p-cactions', "javascript:twinklexfd.callback()", "XFD", "tw-xfd", "Anything for deletion", "");
	} else {
		mw.util.addPortletLink('p-cactions', 'javascript:alert("Your account is too new to use Twinkle.");', 'XFD', 'tw-xfd', 'Anything for deletion', '');
	}
}
$(twinklexfd);

twinklexfd.callback = function twinklexfdCallback() {

	var Window = new SimpleWindow(600, 325);
	Window.setTitle("നീക്കം ചെയ്യാനുള്ളതെന്തും");
	var form = new QuickForm(twinklexfd.callback.evaluate);
	var categories = form.append({
		type: 'select',
		name: 'category',
		label: 'Select wanted type of category: ',
		tooltip: 'When activated, a default choice is made, based on what namespace you are in. This default should be the most appropriate',
		event: twinklexfd.callback.change_category
	});
	categories.append({
		type: 'option',
		label: 'Afd',
		selected: wgNamespaceNumber == Namespace.MAIN,
		value: 'afd'
	});
	categories.append({
		type: 'option',
		label: 'Tfd',
		selected: wgNamespaceNumber == Namespace.TEMPLATE,
		value: 'tfd'
	});
	categories.append({
		type: 'option',
		label: 'Ffd/PUF',
		selected: wgNamespaceNumber == Namespace.IMAGE,
		value: 'ifd'
	});
	categories.append({
		type: 'option',
		label: 'Cfd',
		selected: wgNamespaceNumber == Namespace.CATEGORY,
		value: 'cfd'
	});
	categories.append({
		type: 'option',
		label: 'Mfd',
		selected: [Namespace.IMAGE, Namespace.MAIN, Namespace.TEMPLATE, Namespace.CATEGORY].indexOf(wgNamespaceNumber) == -1,
		value: 'mfd'
	});
	categories.append({
		type: 'option',
		label: 'Rfd',
		selected: QueryString.equals('redirect', 'no'),
		value: 'rfd'
	});
	categories.append({
		type: 'option',
		label: 'Sfd',
		disabled: true,
		value: 'sfd'
	});
	form.append({
		type: 'checkbox',
		list: [{
			label: 'Notify if possible',
			value: 'notify',
			name: 'notify',
			tooltip: 'If a notification if defined in the configuration, then notify if this is true, else no notify',
			checked: true
		}]
	});
	form.append({
		type: 'field',
		label: 'Work area',
		name: 'work_area'
	});

	var result = form.render();
	Window.setContent(result);
	Window.display();

	// We must init the
	var evt = document.createEvent("Event");
	evt.initEvent('change', true, true);
	result.category.dispatchEvent(evt);

}

twinklexfd.callback.change_category = function twinklexfdCallbackChangeCategory(e) {
	var value = e.target.value;
	var root = e.target.form;
	var old_area;
	var childNodes = root.childNodes;
	for (var i = 0; i < childNodes.length; ++i) {
		var node = childNodes[i];
		if (
		node instanceof Element && node.getAttribute('name') == 'work_area') {
			old_area = node;
			break;
		}
	}
	var work_area = null;

	switch (value) {
	case 'afd':
		work_area = new QuickForm.element({
			type: 'field',
			label: 'Articles for deletion',
			name: 'work_area'
		});
		work_area.append({
			type: 'checkbox',
			list: [{
				label: 'Wrap <noinclude>',
				value: 'noinclude',
				name: 'noinclude',
				tooltip: 'Will wrap the template in <noinclude> tags, so that it won\'t transclude'
			}]
		});
		var afd_category = work_area.append({
			type: 'select',
			name: 'xfdcat',
			label: 'Choose what category this nomination belongs in'
		});

		afd_category.append({
			type: 'option',
			label: 'Unknown',
			value: '?',
			selected: true
		});
		afd_category.append({
			type: 'option',
			label: 'Media and music',
			value: 'M'
		});
		afd_category.append({
			type: 'option',
			label: 'Organisation, corporation, or product',
			value: 'O'
		});
		afd_category.append({
			type: 'option',
			label: 'Biographical',
			value: 'B'
		});
		afd_category.append({
			type: 'option',
			label: 'Society topics',
			value: 'S'
		});
		afd_category.append({
			type: 'option',
			label: 'Web or internet',
			value: 'W'
		});
		afd_category.append({
			type: 'option',
			label: 'Games or sports',
			value: 'G'
		});
		afd_category.append({
			type: 'option',
			label: 'Science and technology',
			value: 'T'
		});
		afd_category.append({
			type: 'option',
			label: 'Fiction and the arts',
			value: 'F'
		});
		afd_category.append({
			type: 'option',
			label: 'Places and transportation',
			value: 'P'
		});
		afd_category.append({
			type: 'option',
			label: 'Indiscernible or unclassifiable topic',
			value: 'I'
		});
		afd_category.append({
			type: 'option',
			label: 'Debate not yet sorted',
			value: 'U'
		});

		work_area.append({
			type: 'textarea',
			name: 'xfdreason',
			label: 'Reason: '
		});
		work_area.append({
			type: 'submit'
		});
		work_area = work_area.render();
		old_area.parentNode.replaceChild(work_area, old_area);
		break;
	case 'tfd':
		work_area = new QuickForm.element({
			type: 'field',
			label: 'Templates for discussion',
			name: 'work_area'
		});
		work_area.append({
			type: 'checkbox',
			list: [{
				label: 'Wrap <noinclude>',
				value: 'noinclude',
				name: 'noinclude',
				tooltip: 'Will wrap the template in <noinclude> tags, so that it won\'t transclude',
				disabled: true,
				checked: false
			}]
		});
		work_area.append({
			type: 'checkbox',
			list: [{
				label: 'Inline template',
				value: 'tfdinline',
				name: 'tfdinline',
				tooltip: 'Use \{\{tfd-inline\}\} to tag the page instead of \{\{tfd\}\}.',
				checked: false
			}]
		});
		work_area.append({
			type: 'textarea',
			name: 'xfdreason',
			label: 'Reason: '
		});
		work_area.append({
			type: 'submit'
		});
		work_area = work_area.render();
		old_area.parentNode.replaceChild(work_area, old_area);
		break;
	case 'mfd':
		work_area = new QuickForm.element({
			type: 'field',
			label: 'Miscellany for deletion',
			name: 'work_area'
		});
		work_area.append({
			type: 'checkbox',
			list: [{
				label: 'Wrap <noinclude>',
				value: 'noinclude',
				name: 'noinclude',
				tooltip: 'Will wrap the template in <noinclude> tags, so that it won\'t transclude'
			}]
		});
		work_area.append({
			type: 'textarea',
			name: 'xfdreason',
			label: 'Reason: '
		});
		work_area.append({
			type: 'submit'
		});
		work_area = work_area.render();
		old_area.parentNode.replaceChild(work_area, old_area);
		break;
	case 'ifd':
		work_area = new QuickForm.element({
			type: 'field',
			label: 'Files for deletion',
			name: 'work_area'
		});
		work_area.append({
			type: 'checkbox',
			name: 'puf',
			list: [{
				label: 'Possibly unfree file',
				value: 'puf',
				tooltip: 'File has disputed source or licensing information'
			}]
		});
		work_area.append({
			type: 'textarea',
			name: 'xfdreason',
			label: 'Reason: '
		});
		work_area.append({
			type: 'submit'
		});
		work_area = work_area.render();
		old_area.parentNode.replaceChild(work_area, old_area);
		break;
	case 'cfd':
		work_area = new QuickForm.element({
			type: 'field',
			label: 'Categories for discussion',
			name: 'work_area'
		});
		var cfd_category = work_area.append({
			type: 'select',
			label: 'Choose type of action wanted: ',
			name: 'xfdcat',
			event: function(e) {
				var value = e.target.value;
				var target = e.target.form.xfdtarget;
				if (value == 'cfd') {
					target.disabled = true;
				} else {
					target.disabled = false;
				}
			}
		});
		cfd_category.append({
			type: 'option',
			label: 'Deletion',
			value: 'cfd',
			selected: true
		});
		cfd_category.append({
			type: 'option',
			label: 'Merge',
			value: 'cfm'
		});
		cfd_category.append({
			type: 'option',
			label: 'Renaming',
			value: 'cfr'
		});
		cfd_category.append({
			type: 'option',
			label: 'Convert into article',
			value: 'cfc'
		});

		work_area.append({
			type: 'input',
			name: 'xfdtarget',
			label: 'Target page: ',
			disabled: true,
			value: ''
		});
		work_area.append({
			type: 'textarea',
			name: 'xfdreason',
			label: 'Reason: '
		});
		work_area.append({
			type: 'submit'
		});
		work_area = work_area.render();
		old_area.parentNode.replaceChild(work_area, old_area);
		break;
	case 'rfd':
		work_area = new QuickForm.element({
			type: 'field',
			label: 'Redirects for discussion',
			name: 'work_area'
		});
		work_area.append({
			type: 'textarea',
			name: 'xfdreason',
			label: 'Reason: '
		});
		work_area.append({
			type: 'submit'
		});
		work_area = work_area.render();
		old_area.parentNode.replaceChild(work_area, old_area);
		break;
	default:
		work_area = new QuickForm.element({
			type: 'field',
			label: 'Nothing for anything',
			name: 'work_area'
		});
		work_area = work_area.render();
		old_area.parentNode.replaceChild(work_area, old_area);
		break;
	}
}

twinklexfd.callbacks = {
	afd: {
		main: function(self) {
			var xmlDoc = self.responseXML;
			var titles = xmlDoc.evaluate('//allpages/p/@title', xmlDoc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

			// There has been no earlier entries with this prefix, just go on.
			if (titles.snapshotLength <= 0) {
				self.params.numbering = self.params.number = '';
				numbering = number = '';
			} else {
				var number = 0;
				for (var i = 0; i < titles.snapshotLength; ++i) {
					var title = titles.snapshotItem(i).value;

					// First, simple test, is there an instance with this exact name?
					if (title == 'Wikipedia:ഒഴിവാക്കാൻ സാദ്ധ്യതയുള്ള ലേഖനങ്ങൾ') {
						number = Math.max(number, 1);
						continue;
					}

					var order_re = new RegExp('^' + RegExp.escape('Wikipedia:ഒഴിവാക്കാൻ സാദ്ധ്യതയുള്ള ലേഖനങ്ങൾ', true) + '\\s*\\(\\s*(\\d+)(?:(?:th|nd|rd|st) nom(?:ination)?)?\\s*\\)\\s*$');
					var match = order_re.exec(title);

					// No match; A non-good value
					if (match == null) {
						continue;
					}

					// A match, set number to the max of current
					number = Math.max(number, Number(match[1]));
				}
				self.params.number = num2order(parseInt(number) + 1);
				self.params.numbering = number > 0 ? ' (' + self.params.number + ' nomination)' : '';
			}

			Status.info('Next discussion page","[[Wikipedia:ഒഴിവാക്കാൻ സാദ്ധ്യതയുള്ള ലേഖനങ്ങൾ' + self.params.numbering + ']]');

			// Tagging article
			var query = {
				'title': wgPageName,
				'action': 'submit'
			};
			var wikipedia_wiki = new Wikipedia.wiki('Adding deletion tag to article', query, twinklexfd.callbacks.afd.article);
			wikipedia_wiki.params = self.params;
			wikipedia_wiki.get();
			/*
			// Discussion page
			query = {
				'title': 'Wikipedia:ഒഴിവാക്കാൻ സാദ്ധ്യതയുള്ള ലേഖനങ്ങൾ'  + self.params.numbering,
				'action': 'submit'
			};

			// Updating data for the action completed event
			Wikipedia.actionCompleted.redirect = query['title'];
			Wikipedia.actionCompleted.notice = "Nomination completed, now redirecting to the discussion page";

			var wikipedia_wiki = new Wikipedia.wiki( 'Creating article deletion discussion page', query, twinklexfd.callbacks.afd.discussionPage );
			wikipedia_wiki.params = self.params;
			wikipedia_wiki.get();
*/
			// Today's list
			// var date = new Date();

			query = {
				'title': 'Wikipedia:ഒഴിവാക്കാൻ സാദ്ധ്യതയുള്ള ലേഖനങ്ങൾ' + self.params.numbering,
				'action': 'submit'
			};
			Wikipedia.actionCompleted.redirect = query['title'];
			Wikipedia.actionCompleted.notice = "Nomination completed, now redirecting to the discussion page";

			var wikipedia_wiki = new Wikipedia.wiki('Adding discussion to today\'s list', query, twinklexfd.callbacks.afd.todaysList);
			wikipedia_wiki.params = self.params;
			wikipedia_wiki.get();

			// Notification to first contributor

			var query = {
				'action': 'query',
				'prop': 'revisions',
				'titles': wgPageName,
				'rvlimit': 1,
				'rvprop': 'user',
				'rvdir': 'newer'
			}
			var callback = function(self) {
					var xmlDoc = self.responseXML;
					var user = xmlDoc.evaluate('//rev/@user', xmlDoc, null, XPathResult.STRING_TYPE, null).stringValue;
					var query = {
						'title': 'User talk:' + user,
						'action': 'submit'
					};
					var wikipedia_wiki = new Wikipedia.wiki('Notifying initial contributor (' + user + ')', query, twinklexfd.callbacks.afd.userNotification);
					wikipedia_wiki.params = self.params;
					wikipedia_wiki.get();
				}

			if (self.params.usertalk) {
				var wikipedia_api = new Wikipedia.api('Grabbing data of initial contributor', query, callback);
				wikipedia_api.params = self.params;
				wikipedia_api.post();
			}
		},
		article: function(self) {
			var form = getForm(self.responseText)
			var postData = {
				'wpMinoredit': undefined, // Per memo
				'wpWatchthis': (TwinkleConfig.xfdWatchPage == "yes" || (TwinkleConfig.xfdWatchPage == "default" && form.wpWatchthis.checked) ? '' : undefined),
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': form.wpSection.value,
				'wpSummary': "Nominated for deletion; see [[Wikipedia:ഒഴിവാക്കാൻ സാദ്ധ്യതയുള്ള ലേഖനങ്ങൾ" + self.params.numbering + ']].' + TwinkleConfig.summaryAd,
				'wpTextbox1': "\{\{AFD\}\}\n" + form.wpTextbox1.value
			};
			self.post(postData);
		},
		discussionPage: function(self) {
			var form = getForm(self.responseText)
			var postData = {
				'wpMinoredit': form.wpMinoredit.checked ? '' : undefined,
				'wpWatchthis': (TwinkleConfig.xfdWatchDiscussion == "yes" || (TwinkleConfig.xfdWatchDiscussion == "default" && form.wpWatchthis.checked) ? '' : undefined),
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': form.wpSection.value,
				'wpSummary': "Creating deletion discussion page for \[\[" + wgPageName + '\]\].' + TwinkleConfig.summaryAd
			};
			self.post(postData);
		},
		todaysList: function(self) {
			var form = getForm(self.responseText)
			var postData = {
				'wpMinoredit': form.wpMinoredit.checked ? '' : undefined,
				'wpWatchthis': (TwinkleConfig.xfdWatchList == "yes" || (TwinkleConfig.xfdWatchList == "default" && form.wpWatchthis.checked) ? '' : undefined),
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': form.wpSection.value,
				'wpSummary': "Adding \[\[വിക്കിപീഡിയ:ഒഴിവാക്കാൻ സാദ്ധ്യതയുള്ള ലേഖനങ്ങൾ\u200e#" + wgPageName + self.params.numbering + '\]\].' + TwinkleConfig.summaryAd,
				'wpTextbox1': form.wpTextbox1.value + "\n\{\{subst:മായ്ക്കുക/നിർദ്ദേശം|ലേഖനം=" + wgPageName + "|കാരണം=" + self.params.reason + "\}\} \~\~\~\~"
			};
			self.post(postData);
		},
		userNotification: function(self) {
			var form = getForm(self.responseText)
			var text = form.wpTextbox1.value;
			text += "\n\{\{subst:മായ്ക്കുക/അറിയിപ്പ്|ലേഖനം=" + wgPageName + "\}\} \~\~\~\~";
			var postData = {
				'wpMinoredit': form.wpMinoredit.checked ? '' : undefined,
				'wpWatchthis': (TwinkleConfig.xfdWatchUser == "yes" || (TwinkleConfig.xfdWatchUser == "default" && form.wpWatchthis.checked) ? '' : undefined),
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': form.wpSection.value,
				'wpSummary': 'AfD nomination of \[\[' + wgPageName + '\]\].' + TwinkleConfig.summaryAd,
				'wpTextbox1': text
			};
			self.post(postData);
		}
	},

	tfd: {
		taggingTemplate: function(self) {
			var form = getForm(self.responseText)
			var postData = {
				'wpMinoredit': undefined, // Per memo
				'wpWatchthis': (TwinkleConfig.xfdWatchPage == "yes" || (TwinkleConfig.xfdWatchPage == "default" && form.wpWatchthis.checked) ? '' : undefined),
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': form.wpSection.value,
				'wpSummary': "Nominated for deletion; see \[\[Wikipedia:Templates for discussion#" + wgPageName + '\]\].' + TwinkleConfig.summaryAd,
				'wpTextbox1': "\{\{tfd" + (self.params.tfdinline ? "-inline" : "") + "|" + wgTitle + "\}\}\n" + form.wpTextbox1.value
			};
			self.post(postData);
		},
		todaysList: function(self) {
			var form = getForm(self.responseText)
			var old_text = form.wpTextbox1.value;
			text = old_text.replace('-->', "-->\n\{\{subst:tfd2|" + wgTitle + "|text=" + self.params.reason + " \~\~\~\~\}\}");
			if (text == old_text) {
				self.statelem.error('failed to find target spot for the discussion');
				return;
			}
			var postData = {
				'wpMinoredit': form.wpMinoredit.checked ? '' : undefined,
				'wpWatchthis': (TwinkleConfig.xfdWatchDiscussion == "yes" || (TwinkleConfig.xfdWatchDiscussion == "default" && form.wpWatchthis.checked) ? '' : undefined),
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': form.wpSection.value,
				'wpSummary': "Adding [[Template:" + wgTitle + ']].' + TwinkleConfig.summaryAd,
				'wpTextbox1': text
			};
			self.post(postData);
		},
		userNotification: function(self) {
			var form = getForm(self.responseText)
			var text = form.wpTextbox1.value;
			text += "\n\{\{subst:tfdnotice|1=" + wgTitle + "\}\} \~\~\~\~";
			var postData = {
				'wpMinoredit': form.wpMinoredit.checked ? '' : undefined,
				'wpWatchthis': (TwinkleConfig.xfdWatchUser == "yes" || (TwinkleConfig.xfdWatchUser == "default" && form.wpWatchthis.checked) ? '' : undefined),
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': form.wpSection.value,
				'wpSummary': 'TfD nomination of \[\[Template:' + wgTitle + '\]\].' + TwinkleConfig.summaryAd,
				'wpTextbox1': text
			};
			self.post(postData);
		}
	},
	mfd: {
		main: function(self) {
			var xmlDoc = self.responseXML;
			var titles = xmlDoc.evaluate('//allpages/p/@title', xmlDoc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

			// There has been no earlier entries with this prefix, just go on.
			if (titles.snapshotLength <= 0) {
				self.params.numbering = self.params.number = '';
				numbering = number = '';
			} else {
				var number = 0;
				for (var i = 0; i < titles.snapshotLength; ++i) {
					var title = titles.snapshotItem(i).value;

					// First, simple test, is there an instance with this exact name?
					if (title == 'Wikipedia:Miscellany for deletion/' + wgPageName) {
						number = Math.max(number, 1);
						continue;
					}

					var order_re = new RegExp('^' + RegExp.escape('Wikipedia:Miscellany for deletion/' + wgPageName, true) + '\\s*\\(\\s*(\\d+)(?:(?:th|nd|rd|st) nom(?:ination)?)?\\s*\\)\\s*$');
					var match = order_re.exec(title);

					// No match; A non-good value
					if (match == null) {
						continue;
					}

					// A match, set number to the max of current
					number = Math.max(number, Number(match[1]));
				}
				self.params.number = num2order(parseInt(number) + 1);
				self.params.numbering = number > 0 ? ' (' + self.params.number + ' nomination)' : '';
			}


			self.statelem.info('next in order is [[Wikipedia:Miscellany for deletion/' + wgPageName + self.params.numbering + ']]');

			// Tagging article
			var query = {
				'title': wgPageName,
				'action': 'submit'
			};

			var wikipedia_wiki = new Wikipedia.wiki('Tagging page with deletion tag', query, twinklexfd.callbacks.mfd.taggingPage);
			wikipedia_wiki.params = self.params;
			wikipedia_wiki.get();

			// Discussion page
			var query = {
				'title': 'Wikipedia:Miscellany for deletion/' + wgPageName + this.params.numbering,
				'action': 'submit'
			};

			// Updating data for the action completed event
			Wikipedia.actionCompleted.redirect = query['title'];
			Wikipedia.actionCompleted.notice = "Nomination completed, now redirecting to the discussion page";

			wikipedia_wiki = new Wikipedia.wiki('Creating page deletion discussion page', query, twinklexfd.callbacks.mfd.discussionPage);
			wikipedia_wiki.params = self.params;
			wikipedia_wiki.get();

			// Today's list
			var query = {
				'title': 'Wikipedia:Miscellany for deletion',
				'action': 'submit',
				'section': 2
			};

			wikipedia_wiki = new Wikipedia.wiki('Adding deletion discussion to today\'s list', query, twinklexfd.callbacks.mfd.todaysList);
			wikipedia_wiki.params = self.params;
			wikipedia_wiki.get();

			// Notification to first contributor
			var query = {
				'action': 'query',
				'prop': 'revisions',
				'titles': wgPageName,
				'rvlimit': 1,
				'rvprop': 'user',
				'rvdir': 'newer'
			}
			var callback = function(self) {
					var xmlDoc = self.responseXML;
					var user = xmlDoc.evaluate('//rev/@user', xmlDoc, null, XPathResult.STRING_TYPE, null).stringValue;
					var query = {
						'title': 'User talk:' + user,
						'action': 'submit'
					};
					var wikipedia_wiki = new Wikipedia.wiki('Notifying initial contributor (' + user + ')', query, twinklexfd.callbacks.mfd.userNotification);
					wikipedia_wiki.params = self.params;
					wikipedia_wiki.get();
				}

			if (self.params.usertalk) {
				var wikipedia_api = new Wikipedia.api('Grabbing data of initial contributor', query, callback);
				wikipedia_api.params = self.params;
				wikipedia_api.post();
			}
		},
		taggingPage: function(self) {
			var form = getForm(self.responseText)
			var postData = {
				'wpMinoredit': undefined, // Per memo
				'wpWatchthis': (TwinkleConfig.xfdWatchPage == "yes" || (TwinkleConfig.xfdWatchPage == "default" && form.wpWatchthis.checked) ? '' : undefined),
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': form.wpSection.value,
				'wpSummary': "Nominated for deletion; see [[Wikipedia:Miscellany for deletion/" + wgPageName + self.params.numbering + ']].' + TwinkleConfig.summaryAd,
				'wpTextbox1': (self.params.noinclude ? "<noinclude>" : "") + "\{\{" + (self.params.number == '' ? "mfd\}\}\n" : 'mfdx|' + self.params.number + "}}\n") + (self.params.noinclude ? "</noinclude>" : "") + form.wpTextbox1.value
			};
			self.post(postData);
		},
		discussionPage: function(self) {
			var form = getForm(self.responseText)
			var postData = {
				'wpMinoredit': form.wpMinoredit.checked ? '' : undefined,
				'wpWatchthis': (TwinkleConfig.xfdWatchDiscussion == "yes" || (TwinkleConfig.xfdWatchDiscussion == "default" && form.wpWatchthis.checked) ? '' : undefined),
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': form.wpSection.value,
				'wpSummary': "Creating deletion discussion page for \[\[" + wgPageName + '\]\].' + TwinkleConfig.summaryAd,
				'wpTextbox1': "\{\{subst:mfd2|pg=" + wgPageName + "|text=" + self.params.reason + " \~\~\~\~\}\}\n"
			};
			self.post(postData);
		},
		todaysList: function(self) {
			var form = getForm(self.responseText)

			var text = form.wpTextbox1.value;
			var date = new Date();

			var month = new Number(date.getUTCMonth() + 1);
			var day = new Number(date.getUTCDate());
			var year = new Number(date.getUTCFullYear());
			var today_date = year.zeroFill(4) + '-' + month.zeroFill(2) + '-' + day.zeroFill(2);
			var today_regex = new RegExp("(\\=\\=\\=\\[\\[" + RegExp.escape(today_date) + "\\]\\]\\=\\=\\=)");
			var new_data = "\n\{\{subst:mfd3|pg=" + wgPageName + self.params.numbering + "\}\}";

			if (today_regex.test(text)) { // we have a section allready
				self.statelem.info('Found today\'s section, proceeding to add new entry');
				text = text.replace(today_regex, "$1\n" + new_data);
			} else { // we need to create a new section
				self.statelem.info('No section for today found, proceeding to create one');
				text = "===\[\[" + today_date + "\]\]===" + new_data + "\n\n" + text;
			}

			var postData = {
				'wpMinoredit': form.wpMinoredit.checked ? '' : undefined,
				'wpWatchthis': (TwinkleConfig.xfdWatchList == "yes" || (TwinkleConfig.xfdWatchList == "default" && form.wpWatchthis.checked) ? '' : undefined),
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': form.wpSection.value,
				'wpSummary': "Adding \[\[Wikipedia:Miscellany for deletion/" + wgPageName + self.params.numbering + '\]\].' + TwinkleConfig.summaryAd,
				'wpTextbox1': text
			};
			self.post(postData);
		},
		userNotification: function(self) {
			var form = getForm(self.responseText)
			var text = form.wpTextbox1.value;
			text += "\n\{\{subst:MFDWarning|1=" + wgPageName + (self.params.numbering != '' ? '|order=&#32;' + this.params.numbering : '') + "\}\} \~\~\~\~";
			var postData = {
				'wpMinoredit': form.wpMinoredit.checked ? '' : undefined,
				'wpWatchthis': (TwinkleConfig.xfdWatchUser == "yes" || (TwinkleConfig.xfdWatchUser == "default" && form.wpWatchthis.checked) ? '' : undefined),
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': form.wpSection.value,
				'wpSummary': 'MfD nomination of \[\[' + wgPageName + '\]\].' + TwinkleConfig.summaryAd,
				'wpTextbox1': text
			};
			self.post(postData);
		}
	},
	ifd: {
		main: function(self) {
			var xmlDoc = self.responseXML;
			var user = xmlDoc.evaluate('//rev/@user', xmlDoc, null, XPathResult.STRING_TYPE, null).stringValue;
			self.params.uploader = user;
			var query = {
				'title': 'Wikipedia:ഒഴിവാക്കാൻ സാദ്ധ്യതയുള്ള പ്രമാണങ്ങൾ',
				'action': 'submit'
			};

			wikipedia_wiki = new Wikipedia.wiki('Adding deletion discussion to today\'s list', query, twinklexfd.callbacks.ifd.todaysList);
			wikipedia_wiki.params = self.params;
			wikipedia_wiki.get();

			// Updating data for the action completed event
			Wikipedia.actionCompleted.redirect = query['title'];
			Wikipedia.actionCompleted.notice = "Nomination completed, now redirecting to the discussion page";

			// Notification to first contributor

			if (self.params.usertalk) {
				var query = {
					'title': 'User talk:' + self.params.uploader,
					'action': 'submit'
				};
				wikipedia_wiki = new Wikipedia.wiki('Notifying initial contributor (' + self.params.uploader + ')', query, twinklexfd.callbacks.ifd.userNotification);
				wikipedia_wiki.get();
			}
		},
		taggingImage: function(self) {
			var form = getForm(self.responseText)
			var postData = {
				'wpMinoredit': undefined, // Per 
				'wpWatchthis': (TwinkleConfig.xfdWatchPage == "yes" || (TwinkleConfig.xfdWatchPage == "default" && form.wpWatchthis.checked) ? '' : undefined),
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': form.wpSection.value,
				'wpSummary': "This file is being considered for deletion in accordance with Wikipedia's [[Wikipedia:Deletion policy|Deletion policy]]; See \[\[Wikipedia:Files for deletion#" + wgPageName + '\]\].' + TwinkleConfig.summaryAd,
				'wpTextbox1': "\{\{ifd|log=" + self.params.date + "\}\}\n" + form.wpTextbox1.value
			};
			self.post(postData);
		},
		todaysList: function(self) {
			var form = getForm(self.responseText)
			var postData = {
				'wpMinoredit': form.wpMinoredit.checked ? '' : undefined,
				'wpWatchthis': (TwinkleConfig.xfdWatchDiscussion == "yes" || (TwinkleConfig.xfdWatchDiscussion == "default" && form.wpWatchthis.checked) ? '' : undefined),
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': form.wpSection.value,
				'wpSummary': "Adding discussion for \[\[:" + wgPageName + '\]\].' + TwinkleConfig.summaryAd,
				'wpTextbox1': form.wpTextbox1.value + "\n\{\{subst:മായ്ക്കുക/നിർദ്ദേശം-പ്രമാണം|പ്രമാണം=" + wgTitle + "|Uploader=" + self.params.uploader + "|കാരണം=" + self.params.reason + "\}\} \~\~\~\~"
			};
			self.post(postData);
		},
		userNotification: function(self) {
			var form = getForm(self.responseText)
			var text = form.wpTextbox1.value;
			text += "\n\{\{subst:മായ്ക്കുക/അറിയിപ്പ്-പ്രമാണം|പ്രമാണം=" + wgTitle + "\}\} \~\~\~\~ ";
			var postData = {
				'wpMinoredit': form.wpMinoredit.checked ? '' : undefined,
				'wpWatchthis': (TwinkleConfig.xfdWatchUser == "yes" || (TwinkleConfig.xfdWatchUser == "default" && form.wpWatchthis.checked) ? '' : undefined),
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': form.wpSection.value,
				'wpSummary': 'Notification: FfD nomination of \[\[' + wgPageName + '\]\].' + TwinkleConfig.summaryAd,
				'wpTextbox1': text
			};
			self.post(postData);
		},
		tagInstancesMain: function(self) {
			var xmlDoc = self.responseXML;
			var nsResolver = xmlDoc.createNSResolver(xmlDoc.ownerDocument == null ? xmlDoc.documentElement : xmlDoc.ownerDocument.documentElement);
			var snapshot = xmlDoc.evaluate('//imageusage/iu/@title', xmlDoc, nsResolver, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

			if (snapshot.snapshotLength == 0) {
				return;
			}

			var statusIndicator = new Status('Tagging file instances ', '0%');
			var total = snapshot.snapshotLength * 2;

			var date = new Date();
			var dateString = date.getUTCFullYear() + ' ' + date.getUTCMonthName() + ' ' + date.getUTCDate();

			imageTaggingCounter = 0;
			var onsuccess = function(self) {
					var obj = self.params.obj;
					var total = self.params.total;
					var now = parseInt(100 * ++imageTaggingCounter / total) + '%';
					obj.update(now);
					self.statelem.unlink();
					if (imageTaggingCounter == total) {
						obj.info(now + ' (completed)');
						Wikipedia.removeCheckpoint();
					}
				}

			var onloaded = onsuccess;

			var onloading = function(self) {}


			Wikipedia.addCheckpoint();
			for (var i = 0; i < snapshot.snapshotLength; ++i) {
				var title = snapshot.snapshotItem(i).value;
				var query = {
					'title': title,
					'action': 'submit'
				}
				var wikipedia_wiki = new Wikipedia.wiki("Tagging of " + title, query, twinklexfd.callbacks.ifd.tagInstances);
				wikipedia_wiki.params = {
					title: title,
					total: total,
					obj: statusIndicator,
					date: dateString
				};
				wikipedia_wiki.onloading = onloading;
				wikipedia_wiki.onloaded = onloaded;
				wikipedia_wiki.onsuccess = onsuccess;
				wikipedia_wiki.get();
			}
		},
		tagInstances: function(self) {
			var form = getForm(self.responseText)
			var text = form.wpTextbox1.value;
			var old_text = text;
			var wikiPage = new Mediawiki.Page(text);

			var tag = "\{\{ifdc|1=" + wgTitle + "|log=" + self.params.date + "\}\}";
			wikiPage.addToImageComment(wgTitle, tag);

			text = wikiPage.getText();
			if (text == old_text) {
				// Nothing to do, return
				self.onsuccess(self);
				Wikipedia.actionCompleted();
				return;
			}
			var postData = {
				'wpMinoredit': form.wpMinoredit.checked ? '' : undefined,
				'wpWatchthis': (TwinkleConfig.xfdWatchUsages == "yes" || (TwinkleConfig.xfdWatchUsages == "default" && form.wpWatchthis.checked) ? '' : undefined),
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': form.wpSection.value,
				'wpSummary': 'Tagging [[:File:' + wgTitle + "]] which is up for deletion at [[WP:FFD|Files for deletion]]" + TwinkleConfig.summaryAd,
				'wpTextbox1': text
			};
			self.post(postData);
		}
	},
	puf: {
		taggingImage: function(self) {
			var form = getForm(self.responseText)
			var postData = {
				'wpMinoredit': undefined, // Per 
				'wpWatchthis': (TwinkleConfig.xfdWatchPage == "yes" || (TwinkleConfig.xfdWatchPage == "default" && form.wpWatchthis.checked) ? '' : undefined),
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': form.wpSection.value,
				'wpSummary': "This file has been listed on [[Wikipedia:Possibly unfree files]] because the information on its source or copyright status is disputed; See \[\[Wikipedia:Possibly unfree files#" + wgPageName + '\]\].' + TwinkleConfig.summaryAd,
				'wpTextbox1': "\{\{puf|log=" + self.params.date + "\}\}\n" + form.wpTextbox1.value
			};
			self.post(postData);
		},
		todaysList: function(self) {
			var form = getForm(self.responseText)
			var postData = {
				'wpMinoredit': form.wpMinoredit.checked ? '' : undefined,
				'wpWatchthis': (TwinkleConfig.xfdWatchDiscussion == "yes" || (TwinkleConfig.xfdWatchDiscussion == "default" && form.wpWatchthis.checked) ? '' : undefined),
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': form.wpSection.value,
				'wpSummary': "Adding discussion for \[\[:" + wgPageName + '\]\].' + TwinkleConfig.summaryAd,
				'wpTextbox1': form.wpTextbox1.value + "\n\{\{subst:puf2|image=" + wgTitle + "|reason=" + self.params.reason + "\}\} \~\~\~\~"
			};
			self.post(postData);
		},
		userNotification: function(self) {
			var form = getForm(self.responseText)
			var text = form.wpTextbox1.value;
			text += "\n\{\{subst:idw-puf|1=" + wgTitle + "\}\} --\~\~\~\~";
			var postData = {
				'wpMinoredit': form.wpMinoredit.checked ? '' : undefined,
				'wpWatchthis': (TwinkleConfig.xfdWatchUser == "yes" || (TwinkleConfig.xfdWatchUser == "default" && form.wpWatchthis.checked) ? '' : undefined),
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': form.wpSection.value,
				'wpSummary': 'Notification: PUF posting of \[\[' + wgPageName + '\]\].' + TwinkleConfig.summaryAd,
				'wpTextbox1': text
			};
			self.post(postData);
		},
		tagInstancesMain: function(self) {
			var xmlDoc = self.responseXML;
			var nsResolver = xmlDoc.createNSResolver(xmlDoc.ownerDocument == null ? xmlDoc.documentElement : xmlDoc.ownerDocument.documentElement);
			var snapshot = xmlDoc.evaluate('//imageusage/iu/@title', xmlDoc, nsResolver, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

			if (snapshot.snapshotLength == 0) {
				return;
			}
			var statusIndicator = new Status('Tagging file instances', '0%');
			var total = snapshot.snapshotLength * 2;

			var date = new Date();
			var dateString = date.getUTCFullYear() + ' ' + date.getUTCMonthName() + ' ' + date.getUTCDate();

			imageTaggingCounter = 0;
			var onsuccess = function(self) {
					var obj = self.params.obj;
					var total = self.params.total;
					var now = parseInt(100 * ++imageTaggingCounter / total) + '%';
					obj.update(now);
					self.statelem.unlink();
					if (imageTaggingCounter == total) {
						obj.info(now + ' (completed)');
						Wikipedia.removeCheckpoint();
					}
				}
			var onloaded = onsuccess;

			var onloading = function(wikipedia_wiki) {}


			Wikipedia.addCheckpoint();
			for (var i = 0; i < snapshot.snapshotLength; ++i) {
				var title = snapshot.snapshotItem(i).value;
				var query = {
					'title': title,
					'action': 'submit'
				}
				var wikipedia_wiki = new Wikipedia.wiki("Tagging " + title, query, twinklexfd.callbacks.puf.tagInstances);
				wikipedia_wiki.params = {
					title: title,
					total: total,
					obj: statusIndicator,
					date: dateString
				};
				wikipedia_wiki.onloading = onloading;
				wikipedia_wiki.onloaded = onloaded;
				wikipedia_wiki.onsuccess = onsuccess;
				wikipedia_wiki.get();
			}
		},
		tagInstances: function(self) {
			var form = getForm(self.responseText)
			var text = form.wpTextbox1.value;
			var old_text = text;
			var wikiPage = new Mediawiki.Page(text);

			var tag = "\{\{pufc|1=" + wgTitle + "|log=" + self.params.date + "\}\}";
			wikiPage.addToImageComment(wgTitle, tag);

			text = wikiPage.getText();
			if (text == old_text) {
				// Nothing to do, return
				self.onsuccess(self);
				Wikipedia.actionCompleted();
				return;
			}
			var postData = {
				'wpMinoredit': form.wpMinoredit.checked ? '' : undefined,
				'wpWatchthis': (TwinkleConfig.xfdWatchUsages == "yes" || (TwinkleConfig.xfdWatchUsages == "default" && form.wpWatchthis.checked) ? '' : undefined),
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': form.wpSection.value,
				'wpSummary': 'Tagging [[:File:' + wgTitle + "]] which has been listed on [[WP:PUF|Possible unfree files]]" + TwinkleConfig.summaryAd,
				'wpTextbox1': text
			};
			self.post(postData);
		}

	},
	cfd: {
		taggingCategory: function(self) {
			var form = getForm(self.responseText)
			var added_data = "";
			var summary = "";
			switch (self.params.xfdcat) {
			case 'cfd':
				added_data = "\{\{subst:cfd\}\}";
				summary = "This category is being considered for deletion in accordance with [[WP:CDP|CDP]];" + TwinkleConfig.summaryAd;
				break;
			case 'cfm':
				added_data = "\{\{subst:cfm|" + self.params.target.replace('Category:', '') + "\}\}";
				summary = "This category is being considered for merging in accordance with [[WP:CDP|CDP]];" + TwinkleConfig.summaryAd;
				break;
			case 'cfr':
				added_data = "\{\{subst:cfr|" + self.params.target.replace('Category:', '') + "\}\}";
				summary = "This category is being considered for renaming in accordance with [[WP:CDP|CDP]];" + TwinkleConfig.summaryAd;
				break;
			case 'cfc':
				added_data = "\{\{subst:cfc|" + self.params.target + "\}\}";
				summary = "This category is being considered for conversion in accordance with [[WP:CDP|CDP]];" + TwinkleConfig.summaryAd;
				break;
			}
			var postData = {
				'wpMinoredit': undefined, // Per the cabal
				'wpWatchthis': (TwinkleConfig.xfdWatchPage == "yes" || (TwinkleConfig.xfdWatchPage == "default" && form.wpWatchthis.checked) ? '' : undefined),
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': form.wpSection.value,
				'wpSummary': summary,
				'wpTextbox1': added_data + "\n" + form.wpTextbox1.value
			};
			self.post(postData);
		},
		todaysList: function(self) {
			var form = getForm(self.responseText)
			var added_data = "";
			var summary = "";
			switch (this.params.xfdcat) {
			case 'cfd':
				added_data = "\{\{subst:cfd2|1=" + wgTitle + "|text=" + self.params.reason + " \~\~\~\~\}\}";
				summary = "Added delete nomination of [[:" + wgPageName + "]];" + TwinkleConfig.summaryAd;
				break;
			case 'cfm':
				added_data = "\{\{subst:cfm2|1=" + wgTitle + "|2=" + self.params.target + "|text=" + self.params.reason + " \~\~\~\~\}\}";
				summary = "Added merge nomination of [[:" + wgPageName + "]];" + TwinkleConfig.summaryAd;
				break;
			case 'cfr':
				added_data = "\{\{subst:cfr2|1=" + wgTitle + "|2=" + self.params.target + "|text=" + self.params.reason + " \~\~\~\~\}\}";
				summary = "Added rename nomination of [[:" + wgPageName + "]];" + TwinkleConfig.summaryAd;
				break;
			case 'cfc':
				added_data = "\{\{subst:cfc2|1=" + wgTitle + "|2=" + self.params.target + "|text=" + self.params.reason + " \~\~\~\~\}\}";
				summary = "Added convert nomination of [[:" + wgPageName + "]];" + TwinkleConfig.summaryAd;
				break;
			}
			var old_text = form.wpTextbox1.value;

			text = old_text.replace('-->', "-->\n" + added_data);
			if (text == old_text) {
				self.statelem.error('failed to find target spot for the discussion');
				return;
			}
			var postData = {
				'wpMinoredit': form.wpMinoredit.checked ? '' : undefined,
				'wpWatchthis': (TwinkleConfig.xfdWatchDiscussion == "yes" || (TwinkleConfig.xfdWatchDiscussion == "default" && form.wpWatchthis.checked) ? '' : undefined),
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': form.wpSection.value,
				'wpSummary': summary,
				'wpTextbox1': text
			};
			self.post(postData);
		},
		userNotification: function(self) {
			var form = getForm(self.responseText)
			var text = form.wpTextbox1.value;
			var intext = "";
			switch (self.params.xfdcat) {
			case 'cfd':
				intext = 'for deletion';
				break;
			case 'cfm':
				intext = 'for merging into \{\{lc|' + self.params.target + "\}\}";
				break;
			case 'cfr':
				intext = 'for renaming to \{\{lc|' + self.params.target + "\}\}";
				break;
			case 'cfc':
				intext = 'for converting into an article named \{\{lc|' + self.params.target + "\}\}";
				break;
			}
			text += "\n==CfD nomination of [[:" + wgPageName + "]]==\nI have nominated \{\{lc|" + wgTitle + "\}\} " + intext + ". Your opinions on the matter are welcome; please participate in the discussion by adding your comments at [[" + self.params.todaysPage + "#" + wgPageName + "|the discussion page]]. Thank you. \~\~\~\~";

			var postData = {
				'wpMinoredit': form.wpMinoredit.checked ? '' : undefined,
				'wpWatchthis': (TwinkleConfig.xfdWatchUser == "yes" || (TwinkleConfig.xfdWatchUser == "default" && form.wpWatchthis.checked) ? '' : undefined),
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': form.wpSection.value,
				'wpSummary': 'Notification: CfD nomination of \[\[:' + wgPageName + '\]\].' + TwinkleConfig.summaryAd,
				'wpTextbox1': text
			};
			self.post(postData);
		}
	},
	rfd: {
		main: function(self) {
			var xmlDoc = self.responseXML;
			var target = xmlDoc.evaluate('//redirects/r/@to', xmlDoc, null, XPathResult.STRING_TYPE, null).stringValue;
			if (!target) {
				self.statelem.error('no target of this redirect, aborting');
				return;
			}
			self.params.target = target;

			// Tagging redirect
			var query = {
				'title': wgPageName,
				'action': 'submit'
			};

			wikipedia_wiki = new Wikipedia.wiki('Tagging redirect with rfd tag', query, twinklexfd.callbacks.rfd.taggingRedirect);
			wikipedia_wiki.followRedirect = false;
			wikipedia_wiki.get();

			var date = new Date();
			var today = date.getUTCFullYear() + ' ' + date.getUTCMonthName() + ' ' + date.getUTCDate();
			var query = {
				'title': 'Wikipedia:Redirects for discussion/Log/' + today,
				'action': 'submit'
			};

			wikipedia_wiki = new Wikipedia.wiki('Adding deletion discussion to today\'s list', query, twinklexfd.callbacks.rfd.todaysList);
			wikipedia_wiki.params = self.params;
			wikipedia_wiki.get();

			// Updating data for the action completed event
			Wikipedia.actionCompleted.redirect = query['title'];
			Wikipedia.actionCompleted.notice = "Nomination completed, now redirecting to the discussion page";

			self.params.todaysPage = query['title'];

			// Notifying initial contributor
			var query = {
				'action': 'query',
				'prop': 'revisions',
				'titles': wgPageName,
				'rvlimit': 1,
				'rvprop': 'user',
				'rvdir': 'newer'
			}
			var callback = function(self) {
					var xmlDoc = self.responseXML;
					var user = xmlDoc.evaluate('//rev/@user', xmlDoc, null, XPathResult.STRING_TYPE, null).stringValue;
					var query = {
						'title': 'User talk:' + user,
						'action': 'submit'
					};
					var wikipedia_wiki = new Wikipedia.wiki('Notifying initial contributor (' + user + ')', query, twinklexfd.callbacks.rfd.userNotification);
					wikipedia_wiki.params = self.params;
					wikipedia_wiki.get();
				}

			if (self.params.usertalk) {
				var wikipedia_api = new Wikipedia.api('Grabbing data of initial contributor', query, callback);
				wikipedia_api.params = self.params;
				wikipedia_api.post();
			}
		},
		taggingRedirect: function(self) {
			var form = getForm(self.responseText)
			var postData = {
				'wpMinoredit': undefined, // Per 
				'wpWatchthis': (TwinkleConfig.xfdWatchPage == "yes" || (TwinkleConfig.xfdWatchPage == "default" && form.wpWatchthis.checked) ? '' : undefined),
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': form.wpSection.value,
				'wpSummary': "This redirect has been listed on \[\[Wikipedia:Redirects for discussion\]\]." + TwinkleConfig.summaryAd,
				'wpTextbox1': "\{\{rfd\}\}\n" + form.wpTextbox1.value
			};
			self.post(postData);
		},
		todaysList: function(self) {
			var form = getForm(self.responseText)
			var old_text = form.wpTextbox1.value;
			var text = old_text.replace(/(<\!-- Add new entries directly below this line -->\n+)/, "$1\{\{subst:rfd2|redirect=" + wgPageName + "|target=" + self.params.target + "|text=" + self.params.reason.toUpperCaseFirstChar() + "\}\} \~\~\~\~\n");
			if (text == old_text) {
				self.statelem.error('failed to find target spot for the discussion');
				return;
			}

			var postData = {
				'wpMinoredit': form.wpMinoredit.checked ? '' : undefined,
				'wpWatchthis': (TwinkleConfig.xfdWatchDiscussion == "yes" || (TwinkleConfig.xfdWatchDiscussion == "default" && form.wpWatchthis.checked) ? '' : undefined),
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': form.wpSection.value,
				'wpSummary': "Adding [[" + wgPageName + ']].' + TwinkleConfig.summaryAd,
				'wpTextbox1': text
			};
			self.post(postData);
		},
		userNotification: function(self) {
			var form = getForm(self.responseText)
			var text = form.wpTextbox1.value;
			text += "\n==RfD nomination of [[:" + wgPageName + "]]==\nI have nominated " + ln(wgNamespaceNumber, wgTitle) + " for discussion. Your opinions on the matter are welcome; please participate in the discussion by adding your comments at [[" + self.params.todaysPage + "#" + wgPageName + "|the discussion page]]. Thank you. \~\~\~\~";
			var postData = {
				'wpMinoredit': form.wpMinoredit.checked ? '' : undefined,
				'wpWatchthis': (TwinkleConfig.xfdWatchUser == "yes" || (TwinkleConfig.xfdWatchUser == "default" && form.wpWatchthis.checked) ? '' : undefined),
				'wpStarttime': form.wpStarttime.value,
				'wpEdittime': form.wpEdittime.value,
				'wpAutoSummary': form.wpAutoSummary.value,
				'wpEditToken': form.wpEditToken.value,
				'wpSection': form.wpSection.value,
				'wpSummary': 'Notification: RFD posting of \[\[' + wgPageName + '\]\].' + TwinkleConfig.summaryAd,
				'wpTextbox1': text
			};
			self.post(postData);
		}
	}
}

twinklexfd.callback.evaluate = function(e) {

	wgPageName = wgPageName.replace(/_/g, ' '); // for queen/king/whatever and country!

	var type = e.target.category.value;
	var usertalk = e.target.notify.checked;
	var reason = e.target.xfdreason.value;
	if (type in {
		'afd': '',
		'cfd': ''
	}) {
		var xfdcat = e.target.xfdcat.value;
	}
	if (type == 'ifd') {
		var puf = e.target.puf.checked;
	}
	if (type in {
		'afd': '',
		'mfd': ''
	}) {
		var noinclude = e.target.noinclude.checked;
	}
	if (type == 'tfd') {
		var tfdinline = e.target.tfdinline.checked;
	}

	Status.init(e.target);

	if (type == null) {
		Status.error('Error', 'no action given');
		return;
	}

	switch (type) {
	case 'afd':
		// AFD
		var query = {
			'action': 'query',
			'list': 'allpages',
			'apprefix': 'Articles for deletion/' + wgPageName,
			'apnamespace': 4,
			'apfilterredir': 'nonredirects',
			'aplimit': userIsInGroup('sysop') ? 5000 : 500
		};
		var wikipedia_api = new Wikipedia.api('Tagging article with deletion tag', query, twinklexfd.callbacks.afd.main);
		wikipedia_api.params = {
			usertalk: usertalk,
			reason: reason,
			noinclude: noinclude,
			xfdcat: xfdcat
		};
		wikipedia_api.post();
		break;
	case 'tfd':
		// TFD
		Wikipedia.addCheckpoint();
		// Tagging article
		var query = {
			'title': wgPageName,
			'action': 'submit'
		};
		wikipedia_wiki = new Wikipedia.wiki('Tagging template with deletion tag', query, twinklexfd.callbacks.tfd.taggingTemplate);
		wikipedia_wiki.params = {
			tfdinline: tfdinline
		};
		wikipedia_wiki.get();

		// Adding discussion
		var date = new Date();

		query = {
			'title': 'Wikipedia:Templates for discussion/Log/' + date.getUTCFullYear() + ' ' + date.getUTCMonthName() + ' ' + date.getUTCDate(),
			'action': 'submit',
			'section': 1
		};

		// Updating data for the action completed event
		Wikipedia.actionCompleted.redirect = query['title'];
		Wikipedia.actionCompleted.notice = "Nomination completed, redirecting now to the list of today";

		wikipedia_wiki = new Wikipedia.wiki('Adding discussion to today\'s list', query, twinklexfd.callbacks.tfd.todaysList);
		wikipedia_wiki.params = {
			reason: reason
		};
		wikipedia_wiki.get();

		var query = {
			'action': 'query',
			'prop': 'revisions',
			'titles': wgPageName,
			'rvlimit': 1,
			'rvprop': 'user',
			'rvdir': 'newer'
		}
		var callback = function(self) {
				var xmlDoc = self.responseXML;
				var user = xmlDoc.evaluate('//rev/@user', xmlDoc, null, XPathResult.STRING_TYPE, null).stringValue;
				var query = {
					'title': 'User talk:' + user,
					'action': 'submit'
				};
				var wikipedia_wiki = new Wikipedia.wiki('Notifying initial contributor (' + user + ')', query, twinklexfd.callbacks.tfd.userNotification);
				wikipedia_wiki.params = self.params;
				wikipedia_wiki.get();
			}
		if (usertalk) {
			var wikipedia_api = new Wikipedia.api('Grabbing data of initial contributor', query, callback);
			wikipedia_api.params = self.params;
			wikipedia_api.post();
		}

		Wikipedia.removeCheckpoint();
		break;
	case 'mfd':
		// MFD

		var query = {
			'action': 'query',
			'list': 'allpages',
			'apprefix': 'Miscellany for deletion/' + wgPageName,
			'apnamespace': 4,
			'apfilterredir': 'nonredirects',
			'aplimit': userIsInGroup('sysop') ? 5000 : 500
		};
		var wikipedia_api = new Wikipedia.api('Querying allpages', query, twinklexfd.callbacks.mfd.main);
		wikipedia_api.params = {
			usertalk: usertalk,
			reason: reason,
			noinclude: noinclude,
			xfdcat: xfdcat
		};
		wikipedia_api.post();
		break;
	case 'ifd':
		// IFD

		var date = new Date();
		var dateString = date.getUTCFullYear() + ' ' + date.getUTCMonthName() + ' ' + date.getUTCDate();
		var params = {
			usertalk: usertalk,
			reason: reason,
			date: dateString
		};

		Wikipedia.addCheckpoint();
		if (puf) {
			// Tagging file
			var query = {
				'title': wgPageName,
				'action': 'submit'
			};

			var wikipedia_wiki = new Wikipedia.wiki('Tagging file with PUF tag', query, twinklexfd.callbacks.puf.taggingImage);
			wikipedia_wiki.params = params;
			wikipedia_wiki.get();
			// Adding discussion

			query = {
				'title': 'Wikipedia:Possibly unfree files/' + dateString,
				'action': 'submit'
			};

			// Updating data for the action completed event
			Wikipedia.actionCompleted.redirect = query['title'];
			Wikipedia.actionCompleted.notice = "Nomination completed, now redirecting to today\'s list";

			wikipedia_wiki = new Wikipedia.wiki('Adding discussion to today\'s list', query, twinklexfd.callbacks.puf.todaysList);
			wikipedia_wiki.params = params;
			wikipedia_wiki.get();

			var query = {
				'action': 'query',
				'prop': 'revisions',
				'titles': wgPageName,
				'rvlimit': 1,
				'rvprop': 'user',
				'rvdir': 'newer'
			}
			var callback = function(self) {
					var xmlDoc = self.responseXML;
					var user = xmlDoc.evaluate('//rev/@user', xmlDoc, null, XPathResult.STRING_TYPE, null).stringValue;
					var query = {
						'title': 'User talk:' + user,
						'action': 'submit'
					};
					var wikipedia_wiki = new Wikipedia.wiki('Notifying initial contributor (' + user + ')', query, twinklexfd.callbacks.puf.userNotification);
					wikipedia_wiki.params = self.params;
					wikipedia_wiki.get();
				}
			if (usertalk) {
				var wikipedia_api = new Wikipedia.api('Grabbing data of initial contributor', query, callback);
				wikipedia_api.params = params;
				wikipedia_api.post();
			}

			Wikipedia.removeCheckpoint();

			// adding tag to captions
			var query = {
				'action': 'query',
				'list': 'imageusage',
				'iutitle': wgPageName,
				'iulimit': userIsInGroup('sysop') ? 5000 : 500 // 500 is max for normal users, 5000 for bots and sysops
			};

			//Disabled, we let [[User:Sambot]] do that now. Also see [[WP:TW/BUG#333]] and [[WP:TW/BUG#285]]:
			//var wikipedia_api = new Wikipedia.api( 'Grabbing file links', query, twinklexfd.callbacks.puf.tagInstancesMain );
			//wikipedia_api.post();

		} else {
			// Tagging file
			var query = {
				'title': wgPageName,
				'action': 'submit'
			};

			var wikipedia_wiki = new Wikipedia.wiki('Tagging file with deletion tag', query, twinklexfd.callbacks.ifd.taggingImage);
			wikipedia_wiki.params = params;
			wikipedia_wiki.get();

			// Contributor specific edits
			var query = {
				'action': 'query',
				'prop': 'revisions',
				'titles': wgPageName,
				'rvlimit': 1,
				'rvprop': 'user',
				'rvdir': 'newer'
			}
			var wikipedia_api = new Wikipedia.api('Grabbing data of initial contributor', query, twinklexfd.callbacks.ifd.main);
			wikipedia_api.params = params;
			wikipedia_api.post();

			// adding tag to captions
			var query = {
				'action': 'query',
				'list': 'imageusage',
				'iutitle': wgPageName,
				'iulimit': userIsInGroup('sysop') ? 5000 : 500 // 500 is max for normal users, 5000 for bots and sysops
			};

			//Disabled, we let [[User:Sambot]] do that now. Also see [[WP:TW/BUG#333]] and [[WP:TW/BUG#285]]:
			//var wikipedia_api = new Wikipedia.api( 'Grabbing file links', query, twinklexfd.callbacks.ifd.tagInstancesMain );
			//wikipedia_api.post();
		}
		Wikipedia.removeCheckpoint();
		break;
	case 'cfd':
		Wikipedia.addCheckpoint();
		if (e.target.xfdtarget) {
			var target = e.target.xfdtarget.value.replace(/^\:?Category\:/, '');
		} else {
			var target = '';
		}

		var date = new Date();
		var todaysPage = 'Wikipedia:Categories for discussion/Log/' + date.getUTCFullYear() + ' ' + date.getUTCMonthName() + ' ' + date.getUTCDate();

		// Updating data for the action completed event
		Wikipedia.actionCompleted.redirect = todaysPage;
		Wikipedia.actionCompleted.notice = "Nomination completed, now redirecting to the discussion page";

		// Tagging category

		var query = {
			'title': wgPageName,
			'action': 'submit'
		};
		var params = {
			reason: reason,
			xfdcat: xfdcat,
			target: target
		};

		var wikipedia_wiki = new Wikipedia.wiki('Tagging category with tag', query, twinklexfd.callbacks.cfd.taggingCategory);
		wikipedia_wiki.params = params;
		wikipedia_wiki.get();

		// Today's list
		var query = {
			'title': todaysPage,
			'action': 'submit',
			'section': 2
		};

		var wikipedia_wiki = new Wikipedia.wiki('Adding discussion to today\'s list', query, twinklexfd.callbacks.cfd.todaysList);
		wikipedia_wiki.params = params;
		wikipedia_wiki.get();

		// Notification to first contributor
		var query = {
			'action': 'query',
			'prop': 'revisions',
			'titles': wgPageName,
			'rvlimit': 1,
			'rvprop': 'user',
			'rvdir': 'newer'
		}
		var callback = function(self) {
				var xmlDoc = self.responseXML;
				var user = xmlDoc.evaluate('//rev/@user', xmlDoc, null, XPathResult.STRING_TYPE, null).stringValue;
				var query = {
					'title': 'User talk:' + user,
					'action': 'submit'
				};
				var wikipedia_wiki = new Wikipedia.wiki('Notifying initial contributor (' + user + ')', query, twinklexfd.callbacks.cfd.userNotification);
				wikipedia_wiki.params = self.params;
				wikipedia_wiki.get();
			}
		if (usertalk) {
			var wikipedia_api = new Wikipedia.api('Grabbing data of initial contributor', query, callback);
			wikipedia_api.params = {
				xfdcat: xfdcat,
				target: target,
				todaysPage: todaysPage
			};
			wikipedia_api.post();
		}

		Wikipedia.removeCheckpoint();
		break;
	case 'rfd':
		var query = {
			'action': 'query',
			'titles': wgPageName,
			'redirects': true
		};
		var wikipedia_api = new Wikipedia.api('Querying redirect', query, twinklexfd.callbacks.rfd.main);
		wikipedia_api.params = {
			usertalk: usertalk,
			reason: reason
		};
		wikipedia_api.post();
		break;
	}
}