تێبینی: دوای پاشەکەوتکردن، پێویستە کاشی وێبگەڕەکەت پاک بکەیتەوە تا گۆڕانکارییەکان ببینیت. بۆ گووگڵ کڕۆم، فایەرفۆکس، مایکرۆسۆفت ئێج و سافاری: پەنجە لەسەر دوگمەی ⇧ Shift ڕاگرە و کرتە لەسەر Reload بکە. بۆ وردەکاری و ڕێنمایییەکان لەسەر وێبگەڕەکانی تر، بڕوانە ئێرە.
/*!
 * Developed by: [[User:Ebraminio]]
 */
/*jslint browser: true, regexp: true, white: true*/
/*global jQuery, mediaWiki*/
(function ($, mw) {
	'use strict';

	var spanCode = '<center><img src="//upload.wikimedia.org/wikipedia/commons/4/42/Loading.gif" /></center>';

	function displayProgress(message) {
		$('#stubForm').empty().append($('<div>', {
			style: 'text-align:center; margin:3em 0;',
			html: message + '<br/>' + spanCode
		}));
	}

	function displayError(error) {
		$('#stubForm').empty().append($('<div>', {
			style: 'color: #990000; margin-top: 0.4em;',
			html: 'Error: ' + error
		}));
	}

	function editThePage(summary, content) {
		return new mw.Api().post({
			action: 'edit',
			title: mw.config.get('wgPageName'),
			summary: summary,
			text: content,
			format: 'json',
			token: mw.user.tokens.get('csrfToken')
		});
	}

	function fetchThePage() {
		return new mw.Api().get({
			action: 'query',
			prop: 'revisions',
			titles: mw.config.get('wgPageName'),
			rvprop: 'content',
			format: 'json'
		}).then(function (data) {
			return $.map(data.query.pages, function (value) { return value; })[0].revisions[0]['*'];
		});
	}

	/**
	 * This will help on better sorting on Persian string array
	 */
	function dePersian(input) { // solve persian problem on sorting by replace characters in strings
		return input.replace(/ی/g, "ي")
			.replace(/ک/g, "ك")
			.replace(/گ/g, "كی")
			.replace(/ژ/g, "زی")
			.replace(/چ/g, "جی")
			.replace(/پ/g, "بی")
			.replace(/ڕ/g, "ری")
			.replace(/ڵ/g, "لی")
			.replace(/ڤ/g, "فی")
			.replace(/ۆ/g, "وی")
			.replace(/ێ/g, "یی")
			.replace(/ھ/g, "نی")
			.replace(/ە/g, "هی");
			
	}

	/**
	 * String comparator for Persian
	 */
	function customComparator(a, b) {
		var keyA = dePersian(a),
			keyB = dePersian(b);

		if (keyA < keyB) {
			return -1;
		}
		if (keyA > keyB) {
			return 1;
		}
		return 0;
	}

	/**
	 * Escape string for regex
	 */
	function escape(text) {
		return text.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&');
	}

	/**
	 * Is a recursive function to retrieve all stub templates consequently
	 */
	function getAllStubTemplates(array, eicontinue) {
		return new mw.Api().get({
			action: 'query',
			list: 'embeddedin',
			eititle: 'Template:Asbox',
			eilimit: 500,
			einamespace: 10,
			format: 'json',
			eicontinue: eicontinue,
			'continue': ''
		}).then(function (data) {
			if (!array) { array = []; }
			array = array.concat($.map(data.query.embeddedin, function (value) {
				return value.title;
			}));
			if (!data['continue']) {
				return array;
			}
			return getAllStubTemplates(array, data['continue'].eicontinue);
		});
	}

	function getParsedTemplate(template) {
		return new mw.Api().get({
			action: 'parse',
			text: '{{' + template + '}}',
			contentmodel: 'wikitext',
			prop: 'text'
		}).then(function (data) { return data.parse.text['*']; });
	}

	/**
	 * Will launch stub template adder
	 */
	function launchDialog() {
		$('#stubForm').remove();
		$('<div>', {
			id: 'stubForm',
			style: 'position: relative;'
		}).append($('<div>', {
			style: 'margin-top: 0.4em;',
			html: 'داڕێژەی کۆلکە ھەڵبژێرە: '
		}).append($('<select>', {
			id: 'stubselect',
			style: 'padding: 1px; vertical-align: baseline; font-family: inherit',
			html: '<option value="" selected="selected">بارکردن، تکایە ھەندێک چاوەڕێ بە</option>'
		}), $('<div>', { id: 'asboxpreview', style: 'padding-top: 1em' }))).dialog({
			width: 500,
			title: 'زیادکردنی داڕێژەی کۆلکە',
			modal: true,
			buttons: [{
				text: 'زیاد بکە',
				class: 'ui-button-green',
				click: function () {
					var template = $('#stubselect').val();
					if (!template) { return; }
					
					$('#stubForm').dialog({
						buttons: {}
					});
					displayProgress('زیادکردنی داڕێژەی کۆلکە...');
					fetchThePage().then(function (content) {
						content = content.replace(
							new RegExp('{{\\s*([^:}]*:)?(کۆلکە|کۆڵکە|کورت|' + escape(template) + ')\\s*}}\\n*', 'g'),
							''
						).replace(/\n+$/, '');
						if (!/کۆلکە\}\}$/.test(content)) {
							content = content + '\n\n';
						}
						return editThePage('زیادکردنی داڕێژەی کۆلکە بە یارمەتیی ئامراز', content + '\n' + '{{' + template + '}}');
					}).then(function (data) {
						if (data.edit.result === 'Success') {
							window.location.reload();
						} else {
							displayError('Unknown result from API.');
						}
					}, function () {
						displayError('Edit failed.');
					});
				}
			}],
			close: function () {
				$("#stubForm").remove();
			}
		});

		getAllStubTemplates().then(function (stubs) {
			stubs.push('');
			stubs.sort(customComparator);
			$('#stubselect').empty().change(function () {
				var template = $('#stubselect').val();
				if (!template) {
					$('#asboxpreview').html('');
					return;
				}
				$('#asboxpreview').html(spanCode);
				getParsedTemplate(template).then(function (html) {
					$('#asboxpreview').html(html);
				});
			}).append($.map(stubs, function (value) {
				return $('<option>', {
					html: value.replace(/^[^:]*:/, ""),
					val: value.replace(/^[^:]*:/, "")
				});
			}));
		});
	}

	function initialize() {
		$('#ca-stub-adder').remove();
		$(mw.util.addPortletLink('p-cactions', '#', 'کۆلکە', 'ca-stub-adder', 'زیادکردنی داڕێژەی کۆلکە')).click(function (e) {
			e.preventDefault();
			launchDialog();
		});
	}

	if (mw.config.get('wgNamespaceNumber') === 0
			&& mw.config.get('wgAction') === 'view') {
		$.when($.ready, mw.loader.using('jquery.ui')).then(initialize);
	}
}(jQuery, mediaWiki));