تفصیل کے لیے کھولیں کے بٹن پر کلک کریں یاددہانی: محفوظ کرنے کے بعد تازہ ترین تبدیلیوں کو دیکھنے کے لیے آپ کو اپنے براؤزر کا کیش صاف کرنا ہوگا۔

  • فائرفاکس/ سفاری: جب Reload پر کلک کریں تو Shift دبا کر رکھیں، یا Ctrl-F5 یا Ctrl-R دبائیں (Mac پر R- )
  • گوگل کروم: Ctrl-Shift-R دبائیں (Mac پر Shift-R-⌘)
  • انٹرنیٹ ایکسپلورر: جب Refresh پر کلک کریں تو Ctrl یا Ctrl-F5 دبائیں
  • اوپیرا: Tools → Preferences میں جائیں اور کیش صاف کریں

$(function () {
	'use strict';
	
	document.title = 'اجتماعی تخلیق کاری - آزاد دائرۃ المعارف، ویکیپیڈیا';
	
	if (mw.config.get('wgCanonicalSpecialPageName') !== 'Blankpage' ||
			mw.config.get('wgPageName').split('/')[1] !== 'tourwiki-conosle') {
		return;
	}
	
	if (mw.config.get('wgUserGroups').every(function (x) {
			return ['bot', 'autopatrolled', 'patroller', 'sysop', 'eliminator'].indexOf(x) === -1;
		})) {
		$('#content').empty().append('معذرت، اس سہولت کو مخصوص صارفین ہی استعمال کر سکتے ہیں۔');
		return;
	}

	window.onbeforeunload = function () {
		if ($('#tourwiki-main').width() && $('#tourwiki-main').val() === '') {
			return;
		}
		return 'تکمیل سے قبل یہ صفحہ بند نہ کریں';
	};
	
	var methods = {
		city: {
			title: 'شہر اور آباد مقامات',
			summary: 'Shuaib-bot',
			generateContent: function (request) {
				return $.getJSON(new mw.Uri('//tools.wmflabs.org/shuaib-bot/shehrsaz.php').extend({
					urwiki: request[0],
					enwiki: request[1]
				}));
			},
			extraInfo: $('<div>').append(
				'<div>در پنجرهٔ پایین نام فارسی و انگلیسی مقالهٔ ناموجود را بنویسید و دکمهٔ درخواست را بزنید. بعد از چند دقیقه ربات متن مقاله و پیش‌نمایش آنرا در اختیارتان می‌گذارد. بعد از اعمال تغییرات دکمهٔ ایجاد را بزنید. مانند:</div>',
				'<br><div>شیراز@Shiraz</div>',
				'<br><div>تهران@Tehran</div>',
				'<br><div>اصفهان@Isfahan</div>',
				'<br>شهرهای ناموجود مهم در ',
				'<b><a href="//fa.wikipedia.org/wiki/ویکی‌پدیا:گزارش_دیتابیس/شهرهای_ناموجود" target="_blank">اینجا</a></b>',
				' فهرست شده‌اند؛ با کلیک بر روی موضوع مقاله می‌توانید مقالات شهرها را مشاهده کنید.<br>'
			),
			placeholder: 'عنوان @ Title',
			enableCheckButton: true,
			enableFirstAidsButton: true
		},

		general: {
			title: 'اشخاص، آرایه‌های زیستی، فیلم، موسیقی، رود، ساختمان و بازی‌های ویدئویی',
			summary: 'Dexbot',
			generateContent: function (request) {
				return $.getJSON('//tourwiki.wmflabs.org/translate/enwiki/' + request[1] + '/' + request[0]);
			},
			extraInfo: $('<div>').append(
				'<div>در پنجرهٔ پایین نام فارسی و انگلیسی مقالهٔ ناموجود را بنویسید و دکمهٔ درخواست را بزنید. بعد از چند دقیقه ربات متن مقاله و پیش‌نمایش آنرا در اختیارتان می‌گذارد. بعد از اعمال تغییرات دکمهٔ ایجاد را بزنید.</div>',
				'<br>مقاله‌های ناموجود مهم در ',
				'<b><a href="//fa.wikipedia.org/wiki/ویکی‌پدیا:گزارش_دیتابیس/مقاله‌های_مهم_ایجادنشده" target="_blank">اینجا</a></b>',
				' فهرست شده‌اند؛ با کلیک بر روی موضوع مقاله می‌توانید برپایهٔ موضوع آنها را مرتب و انتخاب کنید.<br>'
			),
			placeholder: 'عنوان @ Title',
			enableCheckButton: true,
			enableFirstAidsButton: true
		},
		
		redirect: {
			title: 'رجوع مکرر',
			summary: '',
			generateContent: function (request) {
				return $.Deferred().resolve({
					page_content: '#' + 'رجوع_مکرر [' + '[' + request[1] + ']]'
				});
			},
			noLanguageLinks: true,
			extraInfo: '',
			placeholder: 'عنوان @ عنوان دوم',
			creationExtraTool: function () {
				var destination = location.hash.split('|')[1];

				if (!destination)
					return;

				destination = decodeURI(destination);
				
				var ns = 0;
				
				var pageNameParts = destination.split(/:/);
				if (pageNameParts.length > 1) {
					var possibleNs = mw.config.get('wgNamespaceIds')[pageNameParts[0]];

					if (possibleNs !== undefined) {
						ns = possibleNs;
						destination = pageNameParts.slice(1).join(':');
					}
				}
				
				var namespaces = {
					0: '',
					2: 'صارف:',
					4: ['وپ:', 'ویکیپیڈیا:'],
					6: 'فائل:',
					8: 'میڈیاویکی:',
					10: 'سانچہ:',
					12: 'معاونت:',
					14: 'زمرہ:',
					100: 'باب:',
					102: 'کتاب:',
					828: 'ماڈیول:'
				};
		
				var append = '@';
				var buttonText = '@';
				if (typeof namespaces[ns] === 'object') {
					append = namespaces[ns][0] + '@' + namespaces[ns][1] + destination;
					buttonText = namespaces[ns][0] + '@پچھلا صفحہ';
				} else if (typeof namespaces[ns] === 'string') {
					append = namespaces[ns] + '@' + namespaces[ns] + destination;
					buttonText = namespaces[ns] + '@' + destination;
				}

				return $('<span>', {
					text: buttonText,
					class: 'mw-ui-button mw-ui-constructive'
				}).click(function () {
					var value = $('#tourwiki-main').val().trim();
					if (value !== '')
						value = value + '\n';
					value = value + append;
					$('#tourwiki-main').val(value).focus();
				});
			},
			editBoxRows: 2,
			previewHeight: 60,
			autoCreate: true
		},

		category: {
			title: 'زمرہ',
			summary: '',
			generateContent: function (request) {
				var enlink = request[1].replace(/\_/g, ' ');
				return $.post('//tools.wmflabs.org/urlinktranslator/', { p: enlink }).then(function (result) {
					if (Object.keys(result).length) {
						return $.Deferred().reject('مساوی صفحہ پہلے سے موجود ہے');
					}
					return catParents(enlink);
				}).then(function (parents) {
					if (!parents) {
						return $.Deferred().reject('پیش نظر صفحہ بعنوان "' + enlink + '" اردو ویکیپیڈیا میں موجود نہیں ہے، چناں چہ آپ اس عنوان سے صفحہ بنا سکتے ہیں!');
					}
					return $.post('//tools.wmflabs.org/urlinktranslator/', {
						p: parents.join('|')
					})
				}).then(function (translatedParents) {
					return getWikidataEntity(enlink).then(function (entity) {
						var text = Object.keys(translatedParents).map(function (x) {
							return translatedParents[x];
						}).sort(function (x, y) {
							var keyX = dePersian(x),
								keyY = dePersian(y);
							if (keyX < keyY) { return -1; }
							if (keyX > keyY) { return 1; }
							return 0;
						}).map(function (x) {
							return '[[' + x + ']]';
						}).join('\n') + '\n\n[' + '[en:' + enlink + ']]';

						if (entity.claims && entity.claims.P373)
							text = '{' + '{زمرہ کومنز}}\n' + text;
						if (entity.claims && entity.claims.P301)
							text = '{' + '{اصل مضمون}}\n' + text;

						return { page_content: text };
					});
				});
			},
			afterSaveAction: function (pageTitle) {
				var defer = $.Deferred();
				var status = $('<span>', { text: 'درخواست ' + pageTitle + '…' });
				mw.notify(status, { autoHide: false });
				setTimeout(function () {
					return $.get('//tools.wmflabs.org/zumraband/zzumra.php', {
						title: pageTitle,
						urwiki: pageTitle.replace(/ /g, '_'),
						user: 'صارف:' + mw.config.get('wgUserName'),
						namespace: 14
					}).then(function () {
						status.text('درخواست ' + pageTitle + ' مکمل ہوئی۔');
						defer.resolve();
					}, defer.resolve);
				}, 2000);
				return defer;
			},
			extraInfo: $('<div>').append(
				'زمرہ جات تخلیق کرنے کے لیے درج ذیل مثالیں ملاحظہ فرمائیں:' +
				'<br>زمرہ1@Cateogry1<br>زمرہ2@Cateogry2<br>زمرہ3@Cateogry3<br><b>اہم نکات:</b><ol>' +
				'<li>نو تخلیق شدہ زمرے چند گھنٹوں کے بعد ویکیپیڈیا:روبہ جات کی مدد سے ویکیپیڈیا:ویکی ڈیٹا سے منسلک ہو جائیں گے، جس کے بعد ہی دوسرے خودکار ذرائع سے ان کو صفحات پر لگایا جائے گا؛ تاہم اگر آپ چاہیں تو فوری طور پر خود ان زمرہ جات کو ویکی ڈیٹا سے مربوط کر سکتے ہیں، اور انہیں صفحات پر استعمال کر سکتے ہیں۔' +
				'<li> جو زمرے انگریزی ویکی پر موجود نہیں وہ نہیں بنائے جا سکیں گے۔<br>' +
				'</ol>'
			),
			placeholder: 'زمرے کا اردو عنوان @ Title',
			editBoxRows: 7,
			previewHeight: 60
		},

		disambig: {
			title: 'ضد ابہام صفحات',
			summary: 'Shuaib-bot',
			generateContent: function (request) {
				return $.getJSON(new mw.Uri('//tools.wmflabs.org/shuaib-bot/disambig.php').extend({
					urwiki: request[0],
					enwiki: request[1]
				}));
			},
			extraInfo: $('<div>').append(
				'<div>ذیل میں اردو اور انگریزی عناوین درج کرکے درخواست پر کلک کریں، کچھ دیر بعد درخواست کردہ صفحات کی نمائش نظر آئے گی جس پر نظر ثانی کرنے کے بعد آپ تخلیق پر کر سکتے ہیں۔ درخواست دینے کا طریقہ حسب ذیل ہے:</div>',
				'<br><div>ناگپور@Nagpur</div>',
				'<br><div>ممبئی@Mumbai</div>',
				'<br><div>دہلی@Delhi</div>'
			),
			placeholder: 'عنوان @ Title',
			enableCheckButton: true,
			enableFirstAidsButton: true
		},

		custom: {
			title: 'شخصی',
			summary: 'شخصی سانچہ',
			generateContent: function (request) {
				return $.Deferred().resolve({
					page_content: '{{جا:' + $('#tourwiki-customtemplate').val() + '|' + request.map(function (x, i) {
						return (i + 1) + '=' + x;
					}).join('|') + '}}'
				});
			},
			afterSaveUtils: function (pageTitle) {
				return $('<button>', { style: 'font-size: 100%' }).text('درخواست برائے اضافہ نگارخانہ و زمرہ جات').click(function () {
					var button = $(this);
					button.text('جاری۔۔۔').attr('disabled', '');
					
					$.get('//tools.wmflabs.org/khanamalumat/khanamalumat.php', {
						title: pageTitle,
						urwiki: pageTitle.replace(/ /g,'_'),
						user: 'صارف:' + mw.config.get('wgUserName'),
						namespace: 0
					}).then(function(result) {
						return $.get('//tools.wmflabs.org/zumraband/zumra.php', {
							title: pageTitle,
							urwiki: pageTitle.replace(/ /g,'_'),
							user: 'صارف:' + mw.config.get('wgUserName'),
							namespace: 0
						});
					}).then(function () {
						button.text('مکمل');
					});
				});
			},
			extraInfo: $('<div>').append(
				'راهنمای <b><a href="//fa.wikipedia.org/wiki/راهنما:ساخت_مقاله_به_کمک_الگوی_شخصی_با_ابزار_به_ویکی‌فا_انبوه" target="_blank">ساخت مقاله به کمک الگوی شخصی با ابزار به ویکی‌فا انبوه</a></b> اطلاعات بسیار خوبی رابطه جهت استفاده از این قسمت می‌دهد.<br><br>',
				'به طور خلاصه برای استفاده از این ابزار کافی‌ست فایل اکسل را در جعبهٔ زیر کپی کنید و الگوی تراگنجایش را مشخص کنید.',
				'<br>',
				'<b>نکته:</b> متغیر۱ برابر با نام مقاله و متغیر۲ برابر با میان‌ویکی‌ست و سایر متغیرها هم برای معرفی بخش‌های تغییرپذیر مقاله کاربرد دارند.'
			),
			placeholder: 'متغیر۱ (نام مقاله)\tمتغیر۲ (ترجیحاً عنوان انگلیسی)\tمتغیر۳\tمتغیر۴\t…',
			enableCheckButton: true,
			enableFirstAidsButton: true
		}
	};
	
	// ابزارهای رده
	function catParents(title) {
		return new mw.Api({ ajax: { url: '//en.wikipedia.org/w/api.php' } }).get({
			action: 'query',
			prop: 'categories',
			titles: title,
			clshow: '!hidden',
			cllimit: 500,
			format: 'json',
			origin: window.location.protocol + '//' + window.location.hostname
		}).then(function (data) {
			return (data.query.pages[Object.keys(data.query.pages)[0]].categories || []).map(function (x) { return x.title; });
		});
	}
	
	function getWikidataEntity(entitle) {
		return new mw.Api({ ajax: { url: '//www.wikidata.org/w/api.php' } }).get({
			action: 'wbgetentities',
			format: 'json',
			sites: 'enwiki',
			titles: entitle,
			normalize: 'true',
			origin: window.location.protocol + '//' + window.location.hostname
		}).then(function (x) { return x.entities[Object.keys(x.entities)[0]]; });
	}

	function pageExists(page) {
		return new mw.Api({ ajax: { url: '//ur.wikipedia.org/w/api.php' } }).get({
			action: 'query',
			titles: page,
			format: 'json'
		}).then(function (data) { return data.query.pages['-1'] === undefined; });
	}
	
	function dePersian(text) {
		return text
			.replace(/ی/g, 'ی')
			.replace(/ک/g, 'ک')
			.replace(/گ/g, 'گ')
			.replace(/ژ/g, 'ژ')
			.replace(/چ/g, 'چ')
			.replace(/پ/g, 'پ');
	}
	////
	
	$('#content').empty().append($('<div>', { id: 'tourwiki-console' }).css({
		border: '2px solid #b3000b',
		padding: '1em',
		'background-color': '#fefce3',
		'margin-bottom': '8px',
		'border-radius': '15px'
	}).append($('<div>', { id: 'tourwiki-console-input' }).append(
		'نوع: ',
		$('<select>', { id: 'tourwiki-select', style: 'font-size: 120%' }).append(Object.keys(methods).map(function (id) {
			return $('<option>', { value: id }).text(methods[id].title);
		})).change(function () {
			if ($(this).val() === 'custom') {
				$('#tourwiki-custom').show();
				$('#tourwiki-delimiter').val('\t');
			} else {
				$('#tourwiki-custom').hide();
				$('#tourwiki-delimiter').val('@');
			}
			
			var method = methods[$(this).val()];
			$('#tourwiki-extrainfo').empty().append(method.extraInfo);
			$('#tourwiki-main').attr('placeholder', method.placeholder);
			$('#tourwiki-creationextratool').empty().append(method.creationExtraTool
				? method.creationExtraTool()
				: '');
			$('#tourwiki-checkbutton').toggle(method.enableCheckButton);
			$('#tourwiki-firstaidsbutton').toggle(method.enableFirstAidsButton);
		}),
		'<br>',
		'جدا کنندہ&nbsp;',
		$('<select>', { id: 'tourwiki-delimiter' }).append(
			$('<option>', { value: '@' }).text('@'),
			$('<option>', { value: '|' }).text('|'),
			$('<option>', { value: '\t' }).text('ٹیب')
		),
		'<br>',
		$('<div>', { id: 'tourwiki-custom' }).append(
			'الگو برای تراگنجایش: ',
			$('<input>', { id: 'tourwiki-customtemplate' })
		).hide(),
		'<br>',
		$('<div>', { id: 'tourwiki-extrainfo' }),
		'<br>',
		$('<div>', { id: 'tourwiki-creationextratool' }).css({ position: 'absolute', left: '2.5em' }),
		$('<textarea>', {
			id: 'tourwiki-main',
			style: 'font-size: 150%',
			rows: 10
		}),
		$('<button>', { style: 'font-size: 100%', text: 'درخواست' }).click(function () {
			var method = methods[$('#tourwiki-select').val()];
			var delimiter = $('#tourwiki-delimiter').val();

			var requests = resolveUserRequests(delimiter);
			$('#tourwiki-console-input').hide();
			$('#tourwiki-console').append(
				$('<div>', { id: 'tourwiki-progress' }),
				'<br><hr><br>'
			);
			var current = 1;
			var success = 0;
			requests.map(function (request) {
				var row = $('<div>', {
					'class': 'tourwiki-row',
					style: 'border-bottom: 1px solid; margin-bottom: 1em; padding-bottom:1em;'
				}).appendTo('#tourwiki-console');
				return function generateText() {
					var urwiki = request[0].replace(/ي/g, 'ی').replace(/ك/g, 'ک');
					var enwiki = request[1];
					
					var promise = method.generateContent(request).then(function (result) {
						return result.error
							? $.Deferred().reject(result.error)
							: preSavedTransform(result.page_content, urwiki);
					});

					$('#tourwiki-progress').text('جاری تلاش «' + urwiki
						+ '» (' + (current++).toLocaleString('ur') + ' از ' +
						requests.length.toLocaleString('ur') + ')');

					return promise.then(function (content) {
						if (window.persianWikiTools) {
							content = persianWikiTools.superTool(content);
						}
						var textarea = $('<textarea>', { cols: 80, rows: method.editBoxRows || 20, text: content });
						var summary = $('<input>', { style: 'width: 500px;' })
							.val('تخلیق بذریعہ اجتماعی تخلیق');
						var previewElement = $('<div>', { 'class': 'tourwiki-preview' });
						var preview = function () {
							return parseContent(textarea.val(), urwiki).then(function (result) {
								previewElement.css({
									'border': '1px solid grey',
									'padding': '1em',
									'height': method.previewHeight || 270,
									'overflow-y': 'scroll'
								}).html(result).append('<div style="clear: both">');
							});
						};
						preview();
						var againInput = $('<input>').val(request.join(delimiter));
						
						row.empty().append(
							$('<div>', { style: 'font-size: 150%;' }).text(urwiki),
							textarea,
							'<br>',
							summary,
							'<br><br>',
							previewElement,
							'<br>',
							$('<button>', { style: 'font-size: 100%', 'class': 'tourwiki-row-create-button', text: 'تخلیق' }).click(function () {
								var content = textarea.val();
								var summaryText = summary.val();
								row.empty().append('تخلیق جاری ' + urwiki + '۔۔۔');
								createPage(urwiki, content, summaryText).then(function () {
									pageExists(urwiki).then(function (exists) {
										if (!exists) {
											row.empty().append(
												'«', $('<a>', { text: urwiki, target: '_blank', href: mw.util.getUrl(urwiki) }), '» به دلیل خطا ایجاد نشد! (ممکن است خطای پالایه باشد)',
												method.afterSaveUtils ? method.afterSaveUtils(urwiki) : ''
											);
										} else {
											row.empty().append(
												'«', $('<a>', { text: urwiki, target: '_blank', href: mw.util.getUrl(urwiki) }), '»مکمل ',
												method.afterSaveUtils ? method.afterSaveUtils(urwiki) : ''
											);
										}
									})
									if (++success === requests.length) {
										window.onbeforeunload = undefined;
									}
									if (method.noLanguageLinks)
										return;

									return $.when(wikidataToken(), getWikidataId(enwiki)).then(function (token, id) {
										return addWikidataSitelink(token, id, urwiki, 'urwiki');
									}).then(undefined, function () { return $.Deferred().resolve(); }).then(function () {
										return $.get('//tools.wmflabs.org/shuaib-bot/interwikidata.php', { page: urwiki });
									}).then(undefined, function () { return $.Deferred().resolve(); }).then(function () {
										if (method.afterSaveAction) return method.afterSaveAction(urwiki);
									});
								}, function (error) {
									var retryInput = $('<input>').val(request.join(delimiter));
									row.empty().append(
										$('<span>', {
											style: 'color: red;',
											text: error === 'articleexists'
												? 'اس عنوان سے ایک صفحہ اردو ویکیپیڈیا میں موجود ہے'
												: error
										}),
										'<br>',
										retryInput,
										$('<button>').text('از سر نو تلاش').click(function () {
											request = retryInput.val().split(delimiter);
											row.empty().html('از سر نو تلاش جاری۔۔۔');
											generateText();
										})
									);
								});
							}),
							' ',
							$('<button>').css('font-size', '100%').text('تجدید نمائش').click(function () {
								var button = $(this);
								button.attr('disabled', '');
								preview().then(function () {
									button.prop('disabled', false);
								});
							}),
							' ',
							window.persianWikiTools ? $('<img>', {
								src: '//upload.wikimedia.org/wikipedia/fa/f/fc/Button_super_tool.png'
							}).click(function () {
								textarea.val(persianWikiTools.superTool(textarea.val()));
							}) : '',
							'<br><br>',
							againInput,
							$('<button>').text('تهیه مجدد').click(function () {
								request = againInput.val().split(delimiter);
								row.empty().html('تهیه مجدد…');
								generateText();
							})
						);
					}).then(undefined, function (error) {
						error = error || 'تخلیق ' + urwiki + ' نامکمل';
						parseContent(error).then(function (parsedError) {
							var retryInput = $('<input>').val(request.join(delimiter));
							row.empty().append(
								$('<span>', {
									style: 'color: red;',
									html: parsedError
								}),
								retryInput,
								$('<button>').text('از سر نو تلاش').click(function () {
									request = retryInput.val().split(delimiter);
									row.empty().html('از سر نو تلاش جاری۔۔۔');
									generateText();
								})
							);
						});
						return $.Deferred().resolve();
					});
				};
			}).reduce(function (defer, job) {
				return defer.then(job);
			}, $.Deferred().resolve()).then(function () {
				$('#tourwiki-progress').empty();
				
				function createAll() {
					var createAllButton = $('#tourwiki-createallbutton');
					createAllButton.prop('disabled', 'disabled');
					$('.tourwiki-row-create-button').get().map(function (button) {
						return function () {
							$(button).click();
							var defer = $.Deferred();
							setTimeout(defer.resolve, 1000);
							return defer;
						};
					}).reduce(function (defer, job) {
						return defer.then(job);
					}, $.Deferred().resolve()).then(function () {
						createAllButton.hide();
					});
				}
				
				if (mw.config.get('wgUserGroups').indexOf('bot') !== -1) {
					$('#tourwiki-progress').append($('<button>', {
						id: 'tourwiki-createallbutton',
						text: 'اجتماعی تخلیق'
					}).click(createAll));
				}
				if (method.autoCreate) {
					createAll();
				}
				$('#tourwiki-console').append('<brاصل درخواستیں: ', $('<div>', {
					style: 'margin: 1em; padding: 0.4em; border: 1px dotted; white-space: pre-wrap;',
					html: requests.map(function (x) { return x.join(delimiter); }).join('<br>')
				}));
			});
		}),
		' ',
		$('<button>', { style: 'font-size: 100%', id: 'tourwiki-checkbutton', text: 'جانچ' }).click(function () {
			var delimiter = $('#tourwiki-delimiter').val();
			var requests = resolveUserRequests(delimiter);
			if (requests.some(function (x) { return x.length !== requests[0].length; })) {
				mw.notify('❌ اندازه‌های ورودی‌ها در خطوط مختلف یکسان نیست! احتمالاً اشتباهی در ورودی وجود دارد.', { autoHide: false });
			}
			var button = $(this);
			button.text('جاری۔۔۔');
			$.post('//tools.wmflabs.org/linkstranslator/', {
				from: 'ur',
				to: 'ur',
				p: requests.map(function (x) { return x[0]; }).join('|')
			}).then(function (faPages) {
				faPages = Object.keys(faPages);
				$.post('//tools.wmflabs.org/linkstranslator/', {
					from: 'en',
					to: 'ur',
					p: requests.map(function (x) { return x[1]; }).join('|')
				}).then(function (enFaEqus) {
					button.text('جانچیں');
					//mw.notify('✔️ جانچ مکمل ہوئی!', { autoHide: false });
					mw.notify('تعداد متغییرهای ورودی '+requests[0].length.toString()+' است، مطمئن شوید که الگو تراگنجایش هم همین تعداد متغییر دارد.', { autoHide: false });
					enFaEqus = Object.keys(enFaEqus);
					$('#tourwiki-main').val(requests.map(function (x) {
						if (faPages.indexOf(x[0]) !== -1) {
							x[0] = 'نقص: صفحہ موجود > ' + x[0];
						}
						if (enFaEqus.indexOf(x[1]) !== -1) {
							x[1] = 'نقص: ترجمہ موجود > ' + x[1];
						}
						return x.join(delimiter);
					}).join('\n'));
				});
			});
		}),
		' ',
		window.persianWikiTools ? $('<img>', {
			src: '//upload.wikimedia.org/wikipedia/fa/f/fc/Button_super_tool.png'
		}).click(function () {
			$('#tourwiki-main').val(persianWikiTools.superToolMove($('#tourwiki-main').val()));
		}) : '',
		' ',
		$('<button>', {
			id: 'tourwiki-firstaidsbutton',
			text: 'اصلاح‌های اولیه ربات استخراج',
			style: 'font-size: 40%'
		}).click(function () {
			$('#tourwiki-main').val($('#tourwiki-main').val().split('\n').map(function (x) {
				var r = x.split('\t');
				if (!r[1]) return '';
				var row = r[1].trim().replace(/^en:/, '').replace(/\)$/, '').split('(⎘');
				if (!row[1]) return '';
				row[1] = persianWikiTools.superToolMove(row[1]
					.replace(/ي/g, 'ی').replace(/ك/g, 'ک').replace(/ة/g, 'ہ')
					.replace(/^en:/, '').replace(/أ/g, 'ا').replace(/اء/g, 'ا')
					.replace(/إ/g, 'ا')
					.replace(/عبدال/g, 'عبد ال')
					.replace(/([ \(\)])لاعب([ \(\)])/g, '$1کھلاڑی$2')
					.replace(/([ \(\)])كرة قدم([ \(\)])/g, '$1فٹ بال$2')
					.replace(/([ \(\)])موالید([ \(\)])/g, '$1پیدائشیں$2'));
				return row.reverse().join('@') + '\n';
			}).join(''));
		})
	)));
	
	function onHashChange() {
		if (location.hash === '#catmaker') {
			$('#tourwiki-select').val('category');
		}
		if (location.hash && location.hash.split('|')[0] === '#redirectmaker') {
			$('#tourwiki-select').val('redirect');
		}
		$('#tourwiki-select').change();
	}
	$(window).on('hashchange', onHashChange);
	onHashChange();

	function resolveUserRequests(delimiter) {
		return $('#tourwiki-main').val().trim().split('\n')
			.filter(function (x) {
				return x.indexOf(delimiter) !== -1;
			}).map(function (x) {
				if ($('#tourwiki-select').val() === 'category') {
					x = x.replace(/زمرہ:/, '').replace(/Category:/i, '');
				}

				x = x.split(delimiter);
				x[0] = x[0].split('>').slice(-1)[0].trim();
				x[1] = x[1].split('>').slice(-1)[0].trim();

				if ($('#tourwiki-select').val() === 'category') {
					x[0] = 'زمرہ:' + x[0];
					x[1] = 'Category:' + x[1];
				}
				return x;
			});
	}
	
	function parseContent(content, title) {
		return new mw.Api().post({
			action: 'parse',
			text: content,
			contentmodel: 'wikitext',
			prop: 'text',
			pst: '',
			title: title || 'API'
		}).then(function (data) { return data.parse.text['*']; });
	}

	function preSavedTransform(content, title) {
		return new mw.Api().post({
			action: 'parse',
			text: content,
			contentmodel: 'wikitext',
			prop: 'text',
			onlypst: '',
			title: title || 'API'
		}).then(function (data) { return data.parse.text['*']; });
	}
	
	function createPage(title, text, summary) {
		return new mw.Api().post({
			action: 'edit',
			title: title,
			text: text,
			summary: summary || '',
			createonly: '',
			bot: '',
			token: mw.user.tokens.get('csrfToken')
		}).then(function (response) {
			return response.error
				? $.Deferred().reject(response.error)
				: response;
		});
	}
	
	var wikidataTokenCache;
	function wikidataToken() {
		if (wikidataTokenCache) {
			return $.Deferred().resolve(wikidataTokenCache);
		}

		return $.ajax({
			url: '//www.wikidata.org/w/api.php',
			data: {
				action: 'query',
				meta: 'tokens',
				format: 'json',
				origin: location.protocol + '//' + location.hostname
			},
			xhrFields: { withCredentials: true }
		}).then(function (data) {
			var token = data.query.tokens.csrftoken;
			if (token === '+\\') {
				// not logged in
				return $.Deferred().reject('login');
			} else {
				wikidataTokenCache = token;
				return token;
			}
		});
	}

	function getWikidataId(enTitle) {
		return new mw.Api({ ajax: { url: '//www.wikidata.org/w/api.php' } }).get({
			action: 'wbgetentities',
			format: 'json',
			sites: 'enwiki',
			titles: enTitle,
			props: 'info',
			origin: location.protocol + '//' + location.hostname
		}).then(function (x) {
			return x.entities[Object.keys(x.entities)[0]].id;
		});
	}
	
	function addWikidataSitelink(token, wikidataId, title, site) {
		return $.ajax({
			url: '//www.wikidata.org/w/api.php',
			type: 'POST',
			data: {
				action: 'wbsetsitelink',
				format: 'json',
				id: wikidataId,
				linksite: site,
				linktitle: title,
				bot: '1',
				token: token,
				origin: location.protocol + '//' + location.hostname
			},
			xhrFields: { withCredentials: true }
		}).then(function (data) {
			return data.error ? $.Deferred().reject(data.error) : data;
		});
	}
});