MediaWiki:Gadget-start.js

Ji Wîkîferhengê

Zanibe: Piştî weşandinê, ji bo dîtina guhartinan dibe ku hewce be "cache"ya geroka xwe paqij bikî.

  • Firefox / Safari: Pê li Shift û Reload bike an jî Ctrl-F5 an Ctrl-R bike (ji bo Mac: ⌘-R)
  • Google Chrome: Pê li Ctrl-Shift-R (ji bo Mac: ⌘-Shift-R) bike
  • Internet Explorer / Edge: Pê li Ctrl û Refresh bike, an jî Ctrl-F5 bike
  • Opera: Pê li Ctrl-F5 bike.
// Çavkanî [[vi:MediaWiki:Gadget-start.js]]
//<nowiki>
$(function () {
	var ns = mw.config.get("wgNamespaceNumber");
	if (ns &&
		!(ns === 2 && mw.config.get("wgPageName").match(/\/ceribandin$|\/test$/))) {
		return;
	}
	var action = mw.config.get("wgAction");
	if (!(action === "edit" || action === "submit") ||
		!$(".mw-newarticletext, .mw-newarticletextanon").length) {
		return;
	}

    if (window.location.href.includes("editintro=User:Balyozxane/creation/intro")) {
        return; // Do not run the script
    }
	
	String.prototype.wiktviCapitalize = function () {
		return this[0].toUpperCase() + this.substr(1);
	};
	
	var pageName = mw.config.get("wgPageName").replace(/_/g, " ");
	var rowsNimune = [];
	if (ns) pageName = pageName.replace(/.*\//, "");
	var userLang = mw.config.get("wgUserLanguage");
	var chosenOptions = {
		width: "20em",
		disable_search_threshold: 20,
		placeholder_text_single: "Yek hilbijêre",
		placeholder_text_multiple: "Hilbijêre",
		no_results_text: "Nehat dîtin",
		enable_split_word_search: false,
		search_contains: true };
	var langsByCode = {};
	var trRequired = ["ckb", "sdh", "ar", "akk", "fa", "ja", "zh", "ru", "ko", "el", "hy", "ka"];
	var steps = {
		lang: {
			id: "lang",
			required: true,
			name: "ziman",
			question_fmt: "“{{PAGENAME}}” bi çi zimanî ye?",
			choices: [
				// Languages with 100 or more entries are loaded immediately.
				// The rest come in through ext.gadget.headers.
				["ku", "kurmancî"],
				["de", "almanî"],
				["ar", "erebî"],
				["fa", "farisî"],
				["fr", "fransî"],
				["fi", "fînî"],
				["en", "îngilîzî"],
				["sv", "swêdî"],
				["tr", "tirkî"] ],
			output: function (values) {
				return "== {{ziman|" + values.lang + "}} ==\n\n";
			} },
		pron: {
			id: "pron",
			name: "bilêvkirin",
			question_fmt: "“{{PAGENAME}}” çawa tê bilêvkirin?",
			visible: function (values) {
				return false;
			},
			output: function (values) {
				if (values.lang === "ku") {
					return "=== Bilêvkirin ===\n* {{ku-IPA}}\n* {{ku-kîte}}\n\n";
				}
				return "";
			} },
		pos: {
			id: "pos",
			required: true,
			name: "Cureyê rêzimanî",
			question_fmt: "Cureyê rêzimanî ya “{{PAGENAME}}” çi ye?",
			visible: function (values) {
				return values.lang;
			},
			choices: [
				["navdêr", "Navdêr"],
				["navdêr/m", "Navdêra mê"],
				["navdêr/n", "Navdêra nêr"],
				["navdêr/mn", "Navdêra mê û nêr"],
				["navdêr/nt", "Navdêra nêtar"],
				["lêker", "Lêker"],
				["lêker/gh", "Lêkera gerguhêz"],
				["lêker/ngh", "Lêkera negerguhêz"],
				["lêker/x", "Lêkera xwerû"],
				["lêker/x-gh", "Lêkera xwerû û gerguhêz"],
				["lêker/x-ngh", "Lêkera xwerû û nergerguhêz"],
				["lêker/p", "Lêkera pêkhatî"],
				["lêker/p-gh", "Lêkera pêkhatî û gerguhêz"],
				["lêker/p-ngh", "Lêkera pêkhatî û negerguhêz"],
				["lêker/b", "Lêkera biwêjî"],
				["lêker/b-gh", "Lêkera biwêjî û gerguhêz"],
				["lêker/b-ngh", "Lêkera biwêjî û negerguhêz"],
				["rengdêr", "Rengdêr"],
				["hoker", "Hoker"],
				["serenav", "Serenav"],
				["serenav/m", "Serenava mê"],
				["serenav/n", "Serenava nêr"],
				["serenav/mn", "Serenava mê û nêr"],
				["serenav/nt", "Serenava nêtar"],
				["artîkel", "Artîkel"],
				["baneşan", "Baneşan"],
				["bazinedaçik", "Bazinedaçek"],
				["biwêj", "Biwêj"],
				["cînav", "Cînav"],
				["daçek", "Daçek"],
				["girêdek", "Girêdek"],
				["gotineke pêşiyan", "Gotineke pêşiyan"],
				["hejmar", "Hejmar"],
				["hevok", "Hevok"],
				["kurtenav", "Kurtenav"],
				["navgir", "Navgir"],
				["paşdaçek", "Paşdaçek"],
				["paşgir", "Paşgir"],
				["pêşdaçek", "Pêşdaçek"],
				["pêşgir", "Pêşgir"],
				["pirtik", "Pirtik"],
				["reh", "Reh"],
				["sembol", "Sembol"],
				["tîp", "Tîp"] ],

			output: function (values) {
			    // Split values.pos based on hyphen
			    var posParts = values.pos.split("/");
			    
			    // Extract the part without gender
			    var posWithoutGender = posParts[0];
			
			    // Extract the gender part
			    var gender = posParts.length > 1 ? posParts[1] : "";
			
			    // Capitalize the first letter of the extracted part
			    var capitalizedPos = posWithoutGender.wiktviCapitalize();
			
			    var outputString = "=== " + capitalizedPos + " ===\n";

				const genders = {
				  'm': 'mê',
				  'n': 'nêr',
				  'mn': 'mê û nêr',
				};

			    // Check the conditions for adding "{{ku-tewîn-nav}}"
			    if (!pageName.includes(" ") && gender && genders[gender] && (posWithoutGender === "navdêr" || posWithoutGender === "serenav") && values.lang === "ku") {
			    	const genderName = genders[gender];
			        outputString += "{{ku-tewîn-nav|" + pageName + "|" + genderName + "}}\n";
			    }			    
			    
			    outputString += "{{" + posWithoutGender + "|" + values.lang;
				if (gender === "nt" && values.lang === "ku") {
					gender = "mn";
				}
			    // Add gender to the output string
			    if (gender) {
			    	if (posWithoutGender === "navdêr" || posWithoutGender === "serenav") {
			        	outputString += "|z=" + gender;
			    	}else if (posWithoutGender === "lêker") {
			        	outputString += "|c=" + gender;
			    	}	
			    }

			    // Check the conditions for adding "|z=?"
			    if ((values.pos === "navdêr" || values.pos === "serenav") && values.lang === "ku") {
			        outputString += "|z=?";
			    }
			
				// Add values from values.tr to the output string
				if (values.tr) {
				    outputString += "|tr=" + values.tr;
				}
				
			    // Complete the output string
			    outputString += "}}\n";
			
			    return outputString;
			}

 },
		tr: {
			id: "tr",
			name: "transkrîpsiyon",
			question_fmt: "Transkrîpsiyona peyvê",
			multiple: false,
			narrow: true,
			visible: function (values) {
			    return values.lang && values.pos && trRequired.includes(values.lang);
			},
			output: function (values) {
	        // Store values in the global rowsNimune array
	        rowsNimune = values.tr;
			} },
		dfn: {
			id: "dfn",
//			required: true, ger mane tinebe [[Şablon:mane?]] bi kar bîne
			name: "Mane",
			question_fmt: "Maneya peyvê di nivîsa sade de bi kurmancî binivîse. Ji bo tercimeyan beşa Wergerê bi kar bîne.",
			multiple: true,
			ordered: true,
			visible: function (values) {
				return values.lang && values.pos;
			},
			example: function (values) {
				var examples = {
				    "navdêr": "Peyvên ji bo tiştan (sêv, heywan, qedeh) yan têgihan (dilşadî, bextiyarî hwd.) di rêzimanê de.",
				    "lêker": "Peyvên ji bo kirin an bûyînê wekî 'nivîsîn' yan 'xeber dan'.",
				    "rengdêr": "Peyvên yên ku çawaniya navdêran nîşan didin wekî 'sêva sor' yan 'xwarina şîrîn'.",
				    "hoker": "Peyvên ku dem, cih yan awayê kirinê diyar dikin wekî 'bi vî awayî' yan 'demkî'.",
				    "daçek": "Peyvên ku cih, dem yan tevgerê diyar dikin wekî 'di.. de' yan 'ji'.",
				    "cînav": "Peyvên ku li şûna navdêran tên bikaranîn daku navdêr neyên dubarekirin wekî 'ew' yan 'em'.",
				    "baneşan": "Peyvên ku hest, deng hwd. derdibirin wekî 'noşî!' yan 'aferîn'.",
				    "serenav": "Navdêrên ku kesayetiyên ferdî nîşan didin, wek navên kes, cih an rêxistinan nimûne 'London' yan 'Diyarbekir'.",
				    "gp": "Nimûne 'serê neêşe ne hewceyî destmalê ye'." 
				};
				
				var transExamples = {
				    "navdêr": "Peyvên ji bo tiştan (sêv, heywan, qedeh) yan têgihan (dilşadî, bextiyarî hwd.) di rêzimanê de.",
				    "lêker": "Peyvên ji bo kirin an bûyînê wekî 'nivîsîn' yan 'xeber dan'.",
				    "rengdêr": "Peyvên yên ku çawaniya navdêran nîşan didin wekî 'sêva sor' yan 'xwarina şîrîn'.",
				    "hoker": "Peyvên ku dem, cih yan awayê kirinê diyar dikin wekî 'bi vî awayî' yan 'demkî'.",
				    "daçek": "Peyvên ku cih, dem yan tevgerê diyar dikin wekî 'di.. de' yan 'ji'.",
				    "cînav": "Peyvên ku li şûna navdêran tên bikaranîn daku navdêr neyên dubarekirin wekî 'ew' yan 'em'.",
				    "baneşan": "Peyvên ku hest, deng hwd. derdibirin wekî 'noşî!' yan 'aferîn'!",
				    "pêşgir": "ne-.",
				    "paşgir": "-van.",
				    "serenav": "Navdêrên ku kesayetiyên ferdî nîşan didin, wek navên kes, cih an rêxistinan nimûne 'London' yan 'Diyarbekir'.",
				    "gp": "Serê neêşe ne hewceyî destmalê ye." 
				};
				var pos = values.pos;
				return values.lang === "ku" ? examples[pos] : transExamples[pos];
			},
			getOutput: function (values, callback) {
			    var text = $.map(values.dfn, function (dfn, i) {
			        dfn = $.trim(dfn);
			        if (!dfn) return undefined;
			
			        // Capitalize the first word.
			        if (dfn[0] !== dfn[0].toUpperCase()) {
			            dfn = dfn.wiktviCapitalize();
			        }
			
			        // Punctuate the definition.
			        if (!dfn.match(/[.…?!)\]]$/)) dfn += ".";
			
			        // Generate the output for dfn
			        var output = "# " + dfn;
			
					// Get the corresponding nimunes for the current dfn
					var nimunes = i === 0 && values.nimune ? values.nimune : [];
					
					// Trim each nimune
					nimunes = nimunes.map(function(nimune) {
					    return $.trim(nimune);
					});
					
					if (nimunes && Array.isArray(nimunes) && nimunes.length > 0) {
					    // Add nimunes
					    $.each(nimunes, function (index, nimune) {
					        if (nimune !== "") {
					            output += "\n#: {{mk|" + values.lang + "|" + nimune.replace(new RegExp("(" + pageName + "([^( |,|;|\?|\.|\!)]+)?)", "ig"), "'''$1'''") + "}}";
					        }
					    });
					}
					
					
// Add bêmînak if nimunes is not available or contains only empty strings
					if (!nimunes || (Array.isArray(nimunes) && nimunes.every(function(nimune) {
					    return nimune.trim() === "";
					}))) {
					
					    output += "\n#* {{bêmînak|" + values.lang + "}}";
					}

					
			        return output;
			    }).join("\n") + "\n\n";
			
			    // Check if dfn is not empty before calling $.wiktviLinkify
			    if ($.trim(values.dfn.join("")) !== "") {
			        var didTryToLoad = function () {
			            $.wiktviLinkify(text, callback);
			        };
			        mw.loader.using("ext.gadget.linkify", didTryToLoad, didTryToLoad);
			    } else {
			        // Use the default value if dfn is empty
			        text = "# {{mane?|" + values.lang + "}}";
			
			        // Get the corresponding nimunes for the current dfn
			        var nimunes = values.nimune ? values.nimune : [];
					
					// Trim each nimune
					nimunes = nimunes.map(function(nimune) {
					    return $.trim(nimune);
					});
					
			        // Add nimunes if available
			        if (nimunes && nimunes.length > 0) {
			            $.each(nimunes, function (index, nimune) {
			                if (nimune !== "") {
			                    text += "\n#: {{mk|" + values.lang + "|" + nimune.replace(new RegExp("(" + pageName + "([^( |,|;|\?|\.|\!)]+)?)", "ig"), "'''$1'''") + "}}";
			                }
			            });
			        }
					// Add bêmînak if nimunes is not available or contains only empty strings
					if (!nimunes || (Array.isArray(nimunes) && nimunes.every(function(nimune) {
					    return nimune.trim() === "";
					}))) {
					
					    text += "\n#* {{bêmînak|" + values.lang + "}}";
					}

			        text += "\n\n";
			
			        callback(text);
			    }
			} },
		nimune: {
			id: "nimune",
			name: "nimûne",
			question_fmt: "Nimûneyên bikaranîna peyvê binivîse (hemû ji bo maneya yekê)",
			multiple: true,
			ordered: true,
			visible: function (values) {
				return values.lang && values.pos;
			},
			output: function (values) {
	        // Store values in the global rowsNimune array
	        rowsNimune = values.nimune;
			} },
		variant: {
			id: "variant",
			name: "herwiha",
			question_fmt: "Guhartoyên peyvê binivîse",
			multiple: true,
			narrow: true,
			visible: function (values) {
				return values.lang && values.pos;
			},
			output: function (values) {
				if (!values.variant.join("").length) return "";
				return "==== Herwiha ====\n" + $.map(values.variant, function (variant, i) {
					return variant ? "* {{g|" + values.lang + "|" + variant + "}}" : undefined;
				}).join("\n") + "\n\n";
			} },
		syn: {
			id: "syn",
			name: "hevmane",
			multiple: true,
			narrow: true,
			visible: function (values) {
				return values.lang && values.pos;
			},
			output: function (values) {
				if (!values.syn.join("").length) return "";
				return "==== Hevmane ====\n" + $.map(values.syn, function (syn, i) {
					return syn ? "* {{g|" + values.lang + "|" + syn + "}}" : undefined;
				}).join("\n") + "\n\n";
			} },
		ant: {
			id: "ant",
			name: "dijmane",
			multiple: true,
			narrow: true,
			visible: function (values) {
				return values.lang && values.pos;
			},
			output: function (values) {
				if (!values.ant.join("").length) return "";
				return "==== Dijmane ====\n" + $.map(values.ant, function (ant, i) {
					return ant ? "* {{g|" + values.lang + "|" + ant + "}}" : undefined;
				}).join("\n") + "\n\n";
			} },
		je: {
			id: "je",
			name: "jê",
			question_fmt: "Peyvên jê çêbûyî binivîse",
			multiple: true,
			narrow: true,
			visible: function (values) {
				return values.lang && values.pos;
			},
			output: function (values) {
				if (!values.je.join("").length) return "";
				return "==== Jê ====\n" + $.map(values.je, function (je, i) {
					return je ? "* {{g|" + values.lang + "|" + je + "}}" : undefined;
				}).join("\n") + "\n\n";
			} },
		tekildar: {
			id: "tekildar",
			name: "têkildar",
			question_fmt: "Peyvên têkildarî vê peyvê binivîse",
			multiple: true,
			narrow: true,
			visible: function (values) {
				return values.lang && values.pos;
			},
			output: function (values) {
				if (!values.tekildar.join("").length) return "";
				return "==== Têkildar ====\n" + $.map(values.tekildar, function (tekildar, i) {
					return tekildar ? "* {{g|" + values.lang + "|" + tekildar + "}}" : undefined;
				}).join("\n") + "\n\n";
			} },
		etym: {
			id: "etym",
			name: "etîmolojî",
			visible: function (values) {
				return false;
			},
			output: function (values) {
				if (values.lang === "ku") {
					return "==== Etîmolojî ====\n{{ji?|ku}}";
				}
				return "";
			} },
		trans: {
			id: "trans",
			name: "werger",
			multiple: true,
			narrow: true,
			keyName: "ziman",
			visible: function (values) {
				return values.lang === "ku" && values.pos;
			},
			disabledKeys: {
				"navz": true,
				"ku": true },
			example: function (values) {
				var examples = 'Di navbera peyvan de bêhnok "," bi kar bîne.';
				return examples;
			},
			output: function (values) {
		    var rows = [];
		    $.each(values.trans, function (lang, words) {
		        if (words) rows.push([lang, words]);
		    });
			var outputString;
		    if (values.lang === "ku") {
			    outputString = "\n\n==== Werger ====\n{{werger-ser}}";
			
			    // Check if there are translations
			    if (rows.length) {
				    outputString += "\n";
	
			        // Sort the rows
			        rows.sort(function (a, b) {
			            var aLang = langsByCode[a[0]] || [];
			            var bLang = langsByCode[b[0]] || [];
			            return (aLang[2] || "").localeCompare(bLang[2] || "", "ku");
			        });
			
			        // Add the translations
			        outputString += $.map(rows, function (row, i) {
			            var words = row[1].replace(/(\s*[,;()]+\s*)/g, "}}$1{{W|" + row[0] + "|");
			            return "* {{Z|" + row[0] + "}}: {{W|" + row[0] + "|" + words + "}}";
			        }).join("\n");
			    }
			
			    // Add the closing section header
			    outputString += "\n{{werger-bin}}\n\n";
		    }else {
		    	outputString = "";
		    }
		    
		    return outputString;
		} },
		};
	steps.trans.keys = steps.lang.choices;
	var ordered_steps = [
		steps.lang, steps.pron, steps.pos, steps.tr, 
		steps.dfn, steps.nimune, steps.variant, steps.syn, steps.ant, steps.je, steps.tekildar,
		steps.etym, steps.trans];
	
	var continueBtn;
	
	function getValuesForStep(stepId) {
		var fields = $("#wiktvi-start-" + stepId + " .wiktvi-start-step-field");
		var step = steps[stepId];
		if (step.keys) {
			var values = {};
			fields.each(function (i, field) {
				var key = $(field).prevAll(".wiktvi-start-step-keyfield").val();
				if (key) values[key] = $(field).val();
			});
			return values;
		}
		else if (step.multiple) {
			return fields.map(function (i) {
				return $(this).val();
			}).get();
		}
		return fields.val();
	}
	
	function getValues() {
		var values = {};
		$.each(steps, function (stepId) {
			values[stepId] = getValuesForStep(stepId);
		});
		return values;
	}

	function getWikitext(callback) {
		var values = getValues();

		
		var entry = steps.lang.output(values);
		entry += steps.pron.output(values);
		entry += steps.pos.output(values);
		steps.dfn.getOutput(values, function (output) {
			entry += output;
			
			entry += steps.variant.output(values);
			entry += steps.syn.output(values);
			entry += steps.ant.output(values);
			entry += steps.je.output(values);
			entry += steps.tekildar.output(values);
			entry += steps.etym.output(values);
			entry += steps.trans.output(values);
			
			var summary = "([[Mediawiki:Gadget-start.js|WF:Nû]]) +" + values.lang + ":" + values.pos + ":" + output;
			document.getElementById("wpSummary").value = summary;
			
			/* Tag the entry as having come from this tool.
			entry += "{{mẫu}}\n"
			
			// Add categories.
			var langChoice = $.grep(steps.lang.choices, function (choice, i) {
				return choice[0] === values.lang;
			})[0];
			var posChoice = $.grep(steps.pos.choices, function (choice, i) {
				return choice[0] === values.pos;
			})[0];
			if (langChoice && posChoice) {
				entry += "{{catname|" + posChoice[1].wiktviCapitalize() + "|" + langChoice[1] + "}}\n";
			}
			*/
			
			callback(entry);
		});
	}
	
	function populateMenus(inputs, choices, disabledValues) {
		if (!disabledValues) disabledValues = {};
		var vals = inputs.map(function (i, input) {
			return $(input).val();
		});
		inputs.empty();
		inputs.append($("<option></option>"));
		$.each(choices, function (j, choice) {
			var option = $(mw.html.element("option", {
				value: choice[0] }, choice[1].wiktviCapitalize()));
			if (disabledValues[choice[0]]) option.prop("disabled", true);
			inputs.append(option);
		});
		inputs.val(function (i) {
			return vals[i];
		});
	}
	
	/**
	 * Returns a bitmap containing the keys that should be disabled for a key
	 * menu in the given step because they are disabled or already taken by
	 * another key menu.
	 */
	function getDisabledKeys(step) {
		var occupiedKeys = {};
		$("#wiktvi-start-" + step.id + " .wiktvi-start-step-keyfield").each(function (i, select) {
			occupiedKeys[$(this).val()] = true;
		});
		if (step.disabledKeys) $.extend(occupiedKeys, step.disabledKeys);
		return occupiedKeys;
	}
	
	function buildKeyInput(step) {
		if (!step.keys) return undefined;
		
		var input = $(mw.html.element("select", {
			"class": "wiktvi-start-step-keyfield wiktvi-start-narrow" }));
		input.attr("data-placeholder", "Hilbijêre " + step.keyName);
		input.on("chosen:showing_dropdown", function (evt, context) {
			$(this).data("wiktvi-defaultValue", $(this).val());
		});
		input.change(function (evt, context) {
			var inputs = $("#wiktvi-start-" + step.id + " .wiktvi-start-step-keyfield").not(this);
			var oldValue = $(this).data("wiktvi-defaultValue");
			var newValue = context.selected;
			inputs.find("option[value='" + oldValue + "']").prop('disabled', false);
			inputs.find("option[value='" + newValue + "']").prop('disabled', true);
			inputs.trigger("chosen:updated");
		});
		populateMenus(input, step.keys, getDisabledKeys(step));
		
		return input;
	}
	
	/**
	 * If the current text field has text and there are no more text fields after
	 * the current text field in the list, add another text field to the list.
	 */
	function refreshForTextField(currentInput, step) {
		currentInput = $(currentInput);
		var value = currentInput.val();
		var item = currentInput.parent();
		if (value && !item.next("li").length) {
			var nextInput = $(mw.html.element("input", {
				type: "text",
				"class": currentInput.attr("class") }));
			nextInput.on("input", function (evt) {
				refreshForTextField(evt.target, step);
			});
			
			var nextKeyInput = buildKeyInput(step);
			var nextItem = $("<li></li>").append(nextKeyInput).append(nextInput);
			item.parent().append(nextItem);
			
			if (nextKeyInput) nextKeyInput.chosen(chosenOptions);
		}
		
		var canContinue = !continueBtn.prop("disabled");
		if ((value && !canContinue) || (!value && canContinue)) {
			refresh(step);
		}
	}
	
	function prepareInput(input, step) {
		if (!input) return;
		if (step.required) input.prop('required', true);
		input.change(step, refresh);
	}
	
	/**
	 * Shows and hides all the steps based on whether their prerequisites are met,
	 * and updates placeholders where applicable.
	 */
	function refresh(evt) {
		var values = getValues();
		var changedStep = evt && evt.data;
		var didFocus = false;
		var canContinue = true;
		
		$.each(steps, function (stepId, step) {
			if (typeof(step.visible) === "function" && !step.visible(values)) {
				$("#wiktvi-start-" + stepId).slideUp();
//				$("#wiktvi-start-" + stepId + " .wiktvi-start-step-field").val("");
			}
			else {
				var stepDiv = $("#wiktvi-start-" + stepId);
				
				if (changedStep !== step && typeof(step.build) === "function") {
					prepareInput(step.build(stepDiv, values), step);
				}
				
				var input = stepDiv.find(".wiktvi-start-step-field");
				if (typeof(step.example) === "function") {
					input.attr("placeholder", step.example(values) || "");
				}
				
				var didSlideDown;
				if (!didFocus && stepDiv.css("display") === "none" && step.required) {
					didSlideDown = function (evt) {
						input.focus();
					};
					didFocus = true;
				}
				stepDiv.slideDown(didSlideDown);
			}
			
			if (step.required &&
				(values[stepId] === "" ||
				(step.multiple && values[stepId].join("") === ""))) {
				canContinue = false;
			}
		});
		
		continueBtn.button(canContinue ? "enable" : "disable");
	}
	
	function destroy() {
		$("#wiktvi-start-form, .noafterwizard").slideUp(function () {
			$(this).remove();
		});
		$(".noarticletext .nowizard, #editform").slideDown();
		
		$("#ca-edit").removeClass("selected");
		$("#ca-wiktvi-nowizard").addClass("selected");
	}
	
	function build() {
		$(".nowizard, .nowizard .noafterwizard").hide();
		
		var callToAction = $("#wiktvi-calltoaction");
		var origCallToActionText = callToAction.text();
		$(mw.util.addPortletLink("p-views", "#", "Edîtora çavkaniyê veke",
			"ca-wiktvi-nowizard", "Vê rûpelê bi edîtora çavkaniyê çêke",
			undefined, "#ca-watch")).click(function (evt) {
			evt.preventDefault();
			callToAction.text(origCallToActionText);
			destroy();
		});
		callToAction.text(origCallToActionText +
			" Forma li jêr ji bo çêkirina gotareke nû bi kar bîne.");
		
		var startForm = $("<form id='wiktvi-start-form'></form>");
		var spinner;
		startForm.submit(function (evt) {
			evt.preventDefault();
			
			continueBtn.button("disable");
			spinner.show();
			
			getWikitext(function (wikitext) {
				$("#wpTextbox1").val(wikitext);
				$("html, body").animate({scrollTop: 0});
				callToAction.text("Hindik ma!");
				destroy();
			});
		});
		$.each(ordered_steps, function (i, step) {
			var stepDiv = $(mw.html.element("div", {
				"class": "wiktvi-start-step",
				id: "wiktvi-start-" + step.id }));
			var name = step.name.wiktviCapitalize();
			stepDiv.append($(mw.html.element("h3", {
				"class": "wiktvi-start-step-name" }, new mw.html.Raw(mw.html.element("label", {
				"for": "wiktvi-start-" + step.id + "-field" }, name)))));
			
			if (step.question_fmt) {
				var question = step.question_fmt.replace(/\{\{PAGENAME\}\}/g, pageName);
				stepDiv.append($(mw.html.element("label", {
					"class": "wiktvi-start-step-question",
					"for": "wiktvi-start-" + step.id + "-field" }, question)));
			}
			
			var input;
			// Menu
			if (step.choices) {
				input = $(mw.html.element("select", {
					"class": "wiktvi-start-step-field",
					id: "wiktvi-start-" + step.id + "-field" }));
				input.attr("data-placeholder",
					step.name.wiktviCapitalize() + " hilbijêre ");
				populateMenus(input, step.choices);
				if (step.multiple) input.attr("multiple", true);
				stepDiv.append(input);
			}
			// Custom
			else if (typeof(step.build) === "function") {
				input = step.build(stepDiv);
			}
			// Text field(s)
			else {
				input = $(mw.html.element("input", {
					type: "text",
					"class": "wiktvi-start-step-field",
					id: "wiktvi-start-" + step.id + "-field" }));
				if (step.narrow) input.addClass("wiktvi-start-narrow");
				if (step.multiple) {
					input.on("input", function (evt) {
						refreshForTextField(evt.target, step);
					});
					var keyInput = buildKeyInput(step);
					var list = $(step.ordered ? "<ol></ol>" : "<ul></ul>")
						.append($("<li></li>").append(keyInput).append(input));
					stepDiv.append(list);
				}
				else stepDiv.append(input);
			}
			
			prepareInput(input, step);
			stepDiv.hide();
			startForm.append(stepDiv);
		});
		
		var footer = $("<div id='wiktvi-start-footer'></div>");
		
		spinner = $(mw.html.element("img", {
			id: "wiktvi-start-spinner",
			src: "//upload.wikimedia.org/wikipedia/commons/d/de/Ajax-loader.gif",
			alt: "Tê barkirin…",
			title: "Tê barkirin…" }));
		footer.append(spinner.hide());
		
		continueBtn = $(mw.html.element("button", {
			id: "wiktvi-unhide-editform",
			type: "submit" }, "Bişîne"));
		footer.append(continueBtn);
		
		startForm.append(footer);
		
		$("#editform").hide().before(startForm);
		startForm.find("select").chosen(chosenOptions);
		continueBtn.button();
		refresh();
		
		$.wiktviHeaders.get(function (allHeaders) {
			// Replace the initial language list with the complete list.
			var headers = $.extend({}, allHeaders);
			delete headers.vie;
			if (headers.mul) headers.mul.name = "navzimanî";
			steps.lang.choices = steps.trans.keys = [];
			$.each(headers, function (code, header) {
				var match;
				if (header.level === 1 && (match = header.name.match(/^(.+)| zimanê$/i))) {
					var name = header.name;
					if (!name.indexOf("Zimanê ")) name = "zimanê " + match[1];
					var choice = [code, name, (match[1] || name)];
					steps.lang.choices.push(choice);
					langsByCode[code] = choice;
				}
			});
			
			// Alphabetize the language list by sort key.
			steps.lang.choices.sort(function (a, b) {
				return a[2].localeCompare(b[2], userLang);
			});
			
			// Vietnamese goes first in language lists but is disabled in the
			// translation section.
			var choice = ["ku", "Kurmancî"];
			steps.lang.choices.unshift(choice);
			langsByCode.vie = choice;
			
			var langMenu = $("#wiktvi-start-lang-field");
			populateMenus(langMenu, steps.lang.choices);
			langMenu.trigger("chosen:updated");
			
			var transMenus = $("#wiktvi-start-trans .wiktvi-start-step-keyfield");
			populateMenus(transMenus, steps.trans.keys, getDisabledKeys(steps.trans));
			transMenus.trigger("chosen:updated");
		});
	}
	
	mw.loader.using(["jquery.chosen", "jquery.ui", "mediawiki.api", "ext.gadget.headers"],
		build);
});
//</nowiki>