MediaWiki:Gadget-DefSideBoxes.js

Daripada Wiktionary

Catatan: Selepas menyiarkan perubahan, anda mungkin perlu memintas cache pelayar untuk melihatnya.

  • Firefox / Safari: Tahan Shift sambil mengklik Reload, atau tekan sama ada Ctrl-F5 atau Ctrl-R (⌘-R pada Mac)
  • Google Chrome: Tekan Ctrl-Shift-R (⌘-Shift-R pada Mac)
  • Internet Explorer / Edge: Tahan Ctrl sambil mengklik Refresh, atau tekan Ctrl-F5
  • Opera: Tekan Ctrl-F5.
// Newer version of User:Yair rand/editor.js

/**
 * newNode from Mediawiki:Common.js
 * Create a new DOM node for the current document.
 *    Basic usage:  var mySpan = newNode('span', "Hello World!")
 *    Supports attributes and event handlers*: var mySpan = newNode('span', {style:"color: red", focus: function(){alert(this)}, id:"hello"}, "World, Hello!")
 *    Also allows nesting to create trees: var myPar = newNode('p', newNode('b',{style:"color: blue"},"Hello"), mySpan)
 *
 * *event handlers, there are some issues with IE6 not registering event handlers on some nodes that are not yet attached to the DOM,
 * it may be safer to add event handlers later manually.
**/
function newNode(tagname){
 
  var node = document.createElement(tagname);
 
  for( var i=1;i<arguments.length;i++ ){
 
    if(typeof arguments[i] == 'string'){ //Text
      node.appendChild( document.createTextNode(arguments[i]) );
 
    }else if(typeof arguments[i] == 'object'){ 
 
      if(arguments[i].nodeName){ //If it is a DOM Node
        node.appendChild(arguments[i]);
 
      }else{ //Attributes (hopefully)
        for(var j in arguments[i]){
          if(j == 'class'){ //Classname different because...
            node.className = arguments[i][j];
 
          }else if(j == 'style'){ //Style is special
            node.style.cssText = arguments[i][j];
 
          }else if(typeof arguments[i][j] == 'function'){ //Basic event handlers
            newNode.addEventHandler(node, j, arguments[i][j]);
          }else{
            node.setAttribute(j,arguments[i][j]); //Normal attributes
 
          }
        }
      }
    }
  }
 
  node.addEventHandler =
    function(eventName, handler)
      { newNode.addEventHandler(this, eventName, handler); };
 
  return node;
}
 
newNode.addEventHandler = function(node, eventName, handler)
{
  try{ node.addEventListener(eventName,handler,false); //W3C
  }catch(e){try{ node.attachEvent('on'+eventName,handler,"Bahasa"); //MSIE
  }catch(e){ node['on'+eventName]=handler; }} //Legacy
};

window.makedefsidebox = function (q) {
	function clickiconfunction() {
		var moreoptions, originalHeight, buttons;

		function uncollapse() {
			$(moreoptions).slideUp();
			$("body").off("click", uncollapse);
		}
		editdefinition(q);
		if( $('>.addusexbutton', q).length === 0 ) {
			buttons = q.insertBefore(newNode('div', {
				'class': 'addusexbutton'
			}, newNode('a', '+Tambah contoh ayat', {
				'click': function () {
					setupusexadder(q)
				}
			}), newNode('a', '+tambah petikan', {
				'click': function () {
					setupquoteadder(q)
				}
			}), newNode('a', 'Lagi ►', {
				'click': function () {
					$(moreoptions).slideDown();
					setTimeout(function () {
						$("body").click(uncollapse)
					}, 16);
				}
			}), newNode('span', {
				'style': 'display:inline-block;'
			}, moreoptions = newNode('ul', newNode('li', q.className ? newNode('a', 'Sunting padanan kata/gloss', {
				'click': function () {
					editgloss(q)
				}
			}) : newNode('a', 'Tambah padanan kata/gloss', {
				'click': function () {
					addgloss(q)
				}
			})), newNode('li', newNode('a', q.className ? undefined : {
				'class': 'DSBinactive',
				'title': 'Sila tambah padanan kata sebelum menambah sinonim.'
			}, {
				'click': function () {
					setupnymadder(q, "Sinonim")
				}
			}, 'Add synonyms')), newNode('li', newNode('a', q.className ? undefined : {
				'class': 'DSBinactive',
				'title': 'Sila tambah padanan kata sebelum menambah antonim'
			}, {
				'click': function () {
					setupnymadder(q, "Antonim")
				}
			}, 'Tambah antonim')), newNode('li', newNode('a', {
				'href': wgScript + 'en.wiktionary.org/wiki/User_talk:Yair_rand/editor2.js?action=edit&section=new'
			}, 'Memberi maklum balas tentang alat ini')), newNode('li', newNode('a', {
				click: function () {
					$.cookie("DisableYREdit", 1, {
						path: '/'
					});
					location.href = location.href
				}
			}, 'Nyahaktifkan alatan ini'))))), $('>dl,>ul,>ol', q)[0] || null);
		}
	}
	q.insertBefore(
	newNode('span', {
		'class': 'defEditButton'
	}, newNode('span', {
		'click': clickiconfunction,
		'title': 'Sunting'
	})), q.firstChild)
	return clickiconfunction;
}

function setupusexadder(qq) {
	var x, y;
	var usexform;
	var findsubdef = (qq.parentNode.parentNode.nodeName.toLowerCase() == "li" ? "#" : "") + (qq.parentNode.parentNode.parentNode.parentNode.nodeName.toLowerCase() == "li" ? "#" : "")
	editor = new Editor()
	findlang(qq.parentNode, function (findlang_) {
		var findscript = (new LangMetadata()).getScripts(findlang_),
			selectedscript = findscript[0] || "Latn";
		if (qq.getElementsByTagName('dl')[0] && qq.getElementsByTagName('dl')[0].parentNode == qq) x = qq.getElementsByTagName('dl')[0];
		else if ($(">ul", qq).length > 0) x = qq.insertBefore(newNode('dl'), $(">ul", qq)[0]);
		else x = qq.appendChild(newNode('dl'));


		x.appendChild(y = newNode('dd'))

		new AdderWrapper(new Editor(), {
			'createForm': function () {
				var x, i = 0,
					y = function () {
						selectedscript = this.value;
						usexform.getElementsByTagName('dd')[0].style.display = this.value == 'Latn' ? 'none' : 'block'
					}
				if (findscript.length > 1) {
					for (x = newNode('select', {
						'name': 'script',
						'change': y
					}); i < findscript.length; i++) {
						x.appendChild(newNode('option', {
							'value': findscript[i]
						}, findscript[i]))
					}
				} else {
					x = newNode('input', {
						'name': 'script',
						'value': findscript[0] || "Latn",
						'style': "width:50px;",
						'change': y
					})
				}
				return usexform = newNode('form', {
					'style': 'display:inline;'
				}, newNode('input', {
					'size': 100,
					'placeholder': 'Ayat contoh',
					'name': 'examplesentence'
				}), newNode('span', {
					'style': 'display:' + (findscript.length == 1 ? "none" : "inline") + ";"
				}, 'Script: ', x), newNode('div', {
					'class': "DSBRedButton",
					'click': function () {
						usexform.style.display = 'none'
					}
				}, newNode('div', 'Cancel')), newNode('div', {
					'class': "DSBGreenButton",
					'click': function () {
						usexform.onsubmit()
					}
				}, newNode('div', "Pralihat ►")), newNode('input', {
					'type': 'submit',
					'style': 'visibility:hidden;width:0px;'
				}), newNode('dl', (findlang_ == "en" ? {
					'style': 'display:none;'
				} : ''), newNode('dd', 'Transliterasi: ', ((findscript[0] == 'Latn' || !findscript[0]) ? {
					'style': 'display:none;'
				} : ''), newNode('input', {
					'size': '100px',
					name: 'transliteration'
				})), newNode('dd', 'Terjemahan: ', newNode('input', {
					'size': '100px',
					name: 'translation'
				}))))
			},
			'fields': {
				'examplesentence': function (txt, error) {
					return util.validateNoWikisyntax('example sentence', true)(txt, error)
				},
				'transliteration': function (txt, error) {
					return txt || '';
				},
				'translation': function (txt, error) {
					if (findlang_ != "en") {
						return util.validateNoWikisyntax('translation', true)(txt, error)
					};
					return ''
				},
				'script': util.validateNoWikisyntax('script', true)
			},
			'onsubmit': function (values, render) {
				render( ("{" + "{lang|" + findlang_ + "|''" + values.examplesentence + "''}}" + ( values.transliteration ? "\n:''" + values.transliteration + "''" : "" ) ) + (findlang_ !== "en" ? "\n:''" + values.translation + "''" : ''), function (newhtml) {

					var findnumberofheaders = findnumberofheaders_(qq)
					var findnumberofdefs = findnumberofdefs_(qq)
					var usextobeadded = newNode('span')
					usextobeadded.innerHTML = newhtml.replace(/<p>|<\/p>/g, '')
					editor.addEdit({
						edit: function (wikitext) {
							wikitext = wikitext.replace(RegExp("(^[\\s\\S]*?((^|\n)=[\\s\\S]*?){" + findnumberofheaders + "}" + findnumberofdefs + "[\\s\\S]*?)\n(?!#" + findsubdef + ":)|$"), "$1\n#" + findsubdef + ":" + (values.script === "Latn" ? "''" + values.examplesentence + "''" : "{"+"{lang|" + findlang_ + "|''" + values.examplesentence + "''}}" + ( values.transliteration ? "\n#" + findsubdef + "::''" + values.transliteration + "''" : "" ) ) + (findlang_ !== "en" ? "\n#" + findsubdef + "::''" + values.translation + "''" : '') + "\n");
							ccc = wikitext;
							return wikitext;
						},
						redo: function () {
							usexform.parentNode.appendChild(usextobeadded);
							usextobeadded.style.display = 'block';
							usexform.style.display = "none";
							y.style.display = 'block'
						},
						undo: function () {
							usexform.parentNode.removeChild(usextobeadded);
							usexform.style.display = "inline";
						},
						summary: "+usex: " + values.examplesentence
					}, usextobeadded)

				})
			}
		}, y)
		usexform.firstChild.focus()
	})
}


window.editdefinition = function (qq) {

	(new Editor).withCurrentText(function (wikitext) {
		if (qq.YREditing) {
			return
		}
		qq.YREditing = true;
		var findnumberofheaders = findnumberofheaders_(qq),
			findnumberofdefs = findnumberofdefs_(qq)
			var temporarydefholder = qq.insertBefore(newNode('span', {
			'style': 'display:none;'
		}), qq.childNodes[1].nodeName.toLowerCase() != "form" ? qq.childNodes[1] : qq.childNodes[2])
		while (qq.childNodes[3] && qq.childNodes[3].nodeName != "DL" && qq.childNodes[3].nodeName != "UL" && qq.childNodes[3].nodeName != "OL" && qq.childNodes[3].className != "HQToggle" && qq.childNodes[3].className != "addusexbutton")
		temporarydefholder.appendChild(qq.childNodes[3]);
		if (qq.childNodes[2] != temporarydefholder) temporarydefholder.insertBefore(qq.childNodes[2], temporarydefholder.firstChild);
		var defform
		var olddef = wikitext.replace(RegExp("(^[\\s\\S]*?((^|\n)=[\\s\\S]*?){" + findnumberofheaders + "}" + findnumberofdefs + "\\s?)"), '').match(/^(\{\{senseid\|[^\}]*\}\})?\s?(.*)/)[2]
		new AdderWrapper(new Editor(), {
			'createForm': function () {
				return defform = newNode('form', {
					'style': 'width:100%;display:inline-block;margin-bottom:-6px;'
				}, newNode('table', {
					'style': 'width:100%;'
				}, newNode('tr', newNode('td', newNode('input', {
					'style': 'height:17px;width:100%;',
					'name': 'definition',
					'size': 80,
					'value': olddef
				})
				// newNode('input',{type:'submit',value:'Preview'}),
				// newNode('input',{type:'button',value:'Cancel',click:function(){temporarydefholder.style.display='inline';defform.style.display='none';qq.YREditing = false}})
				), newNode('td', {
					'style': 'white-space:nowrap;'
				}, newNode('div', {
					'class': "DSBRedButton"
				}, newNode('div', {
					click: function () {
						temporarydefholder.style.display = 'inline';
						defform.style.display = 'none';
						qq.YREditing = false
					}
				}, "Discard Changes")), newNode('div', {
					'class': "DSBGreenButton"
				}, newNode('div', {
					click: function () {
						defform.onsubmit()
					}
				}, "Pralihat peruhanan ►"))))))
			},
			'fields': {
				'definition': function (txt, error) {
					return txt || error("Sila nyatakan definisi.")
				}
			},
			'onsubmit': function (values, render) {
				render(values.definition, function (newhtml) {

					editor = new Editor()
					var findnumberofdefs = findnumberofdefs_(qq) // apparently this is sometimes necessary
					var addedspan = newNode('span')
					addedspan.innerHTML = newhtml
					var updatecatscallback;
					editor.addEdit({
						edit: function (wikitext) {
							wikitext = wikitext.replace(RegExp("(^[\\s\\S]*?((^|\n)=[\\s\\S]*?){" + findnumberofheaders + "}" + findnumberofdefs + "\\s?(\{\{senseid\\|[^\}]*\}\})*?)(?!{"+"{senseid\\|).*"), "$1" + values.definition);
							ccc = wikitext;
							return wikitext
						},
						redo: function () {
							defform.parentNode.insertBefore(addedspan, defform);
							defform.style.display = temporarydefholder.style.display = 'none';
							updatecatscallback = window.tabbedLanguages && updateCategories(findtopli(defform.parentNode).parentNode.parentNode, values.definition, olddef)
							qq.YREditing = false;
						},
						undo: function () {
							defform.parentNode.removeChild(addedspan);
							defform.style.display = "inline";
							defform.firstChild.firstChild.firstChild.firstChild.value = olddef;
							updatecatscallback && updatecatscallback();
							qq.YREditing = true;
						},
						summary: "def: " + values.definition
					}, addedspan)


				})


			}
		}, qq, qq.childNodes[1].nodeName.toLowerCase() != "form" ? qq.childNodes[1] : qq.childNodes[2])

	})

}

function findtopli(li) {
	for (; li.parentNode.parentNode.nodeName.toLowerCase() == "li";) {
		li = li.parentNode.parentNode;
	}
	return li;
}

function findnumberofheaders_(tosearchfrom) {
	tosearchfrom = findtopli(tosearchfrom).parentNode;
	while (!tosearchfrom.nodeName.match(/^h\d$/i))
	tosearchfrom = tosearchfrom.previousSibling;
	return Number(tosearchfrom.lastChild.getElementsByTagName('a')[0].href.match(/\d*$/))
}

function findnumberofdefs_(tosearchfrom) {
	var findnumberofdefs = [],
		tosearchfrom_, findnumberofpredefs = 0,
		result;
	// subdefinitions
	while (tosearchfrom.nodeName.toLowerCase() == "li") {
		tosearchfrom_ = tosearchfrom;
		findnumberofdefs.splice(0, 0, 0);
		while (tosearchfrom) {
			if (tosearchfrom.nodeName.toLowerCase() == "li") findnumberofdefs[0]++;
			tosearchfrom = tosearchfrom.previousSibling;
		}
		tosearchfrom = tosearchfrom_.parentNode.parentNode;
	}
	// in case of any def lists before the current def list under the same header
	for (tosearchfrom_ = tosearchfrom_.parentNode.previousSibling; !tosearchfrom_.nodeName.match(/^h\d$/i); tosearchfrom_ = tosearchfrom_.previousSibling) {
		if (tosearchfrom_.nodeName.toLowerCase() == "ol") findnumberofpredefs += 1;
	}
	result = "([\\s\\S]*?\n#[\\s\\S]*?\n(?!#)){" + findnumberofpredefs + "}";
	for (var i = 0; i < findnumberofdefs.length; i++) {
		result += "([\\s\\S]*?\n" + Array(i + 2).join("#") + "(?![:*#])){" + findnumberofdefs[i] + "}";
	}
	return result;
}


function findlang(tosearchfrom, callback) {
	var tosearchfrom_, findlang__
	if (tosearchfrom.parentNode.nodeName.toLowerCase() == "li") tosearchfrom = findtopli(tosearchfrom.parentNode).parentNode;
	if (tosearchfrom.parentNode.className == "languageContainer") {
		if (tosearchfrom.parentNode.id == "Malaycontainer") return callback("ms");
	} else {
		tosearchfrom_ = tosearchfrom;
		while (tosearchfrom_.nodeName.toLowerCase() != "h2")
		tosearchfrom_ = tosearchfrom_.previousSibling;
		if (tosearchfrom_.lastChild.innerHTML == "Melayu") return callback("ms");
	}
	tosearchfrom_ = tosearchfrom;
	while (tosearchfrom_ && !/^h\d$/i.test(tosearchfrom_.nodeName) && tosearchfrom_.className != "fakeheader")
	tosearchfrom_ = tosearchfrom_.previousSibling;
	while (tosearchfrom_ && tosearchfrom_.nodeName.toLowerCase() != "p" && tosearchfrom_.className != "fakeheader")
	tosearchfrom_ = tosearchfrom_.nextSibling;
	if (tosearchfrom_ && tosearchfrom_.className != "fakeheader" && tosearchfrom_.firstChild && (tosearchfrom_.firstChild.lang || (tosearchfrom_.firstChild.firstChild && tosearchfrom_.firstChild.firstChild.lang) || (tosearchfrom_.firstChild.firstChild && tosearchfrom_.firstChild.firstChild.firstChild && tosearchfrom_.firstChild.firstChild.firstChild.lang))) {
		return callback(tosearchfrom_.firstChild.lang || tosearchfrom_.firstChild.firstChild.lang || tosearchfrom_.firstChild.firstChild.firstChild.lang)
	}

	if (tosearchfrom.parentNode.className == "languageContainer") findlang__ = tosearchfrom.parentNode.id.split("container")[0];
	else {
		while (tosearchfrom.nodeName.toLowerCase() != "h2")
		tosearchfrom = tosearchfrom.previousSibling;
		findlang__ = (findlang__ = tosearchfrom.getElementsByTagName("span")[0]).innerText || findlang__.textContent
	}
	window.languagenametocode && languagenametocode[findlang__] && callback(languagenametocode[findlang__]);
}


function setupquoteadder(q) {
	findlang(q.parentNode, function (findlang_) {
		var z;
		if (!$(".HQToggle a", q)[0]) {
			z = q.appendChild(document.createElement("ul"))
			setupHiddenQuotes(q);
		} else {
			z = $(">ul", q)[0];
		}
		if (z.style.display == 'none') {
			$(".HQToggle a", q).click();
		}
		var zz = z.appendChild(document.createElement("li")),
			quoteform;
		var findsubdef = q.parentNode.parentNode.nodeName.toLowerCase() == "li" ? "#" : "",
			editor = new Editor();
		new AdderWrapper(editor, {
			'createForm': function () {
				return quoteform = newNode('form', {
					'style': 'display:inline;'
				}, 'Tahun: ', newNode('input', {
					'name': 'year',
					'size': 4
				}), ' Pengarang: ', newNode('input', {
					'name': 'author',
					'size': 20
				}), ' Tajuk sumber: ', newNode('input', {
					'name': 'source',
					'size': 20
				}), ' Penerbit: ', newNode('input', {
					'name': 'publisher',
					'size': 20
				}), ' Laman: ', newNode('input', {
					'name': 'page',
					'size': 5
				}), newNode('dl', newNode('dd', 'Petikan: ', newNode('input', {
					'name': 'quotation',
					'size': 40
				}), newNode('div', {
					'class': "DSBRedButton",
					'click': function () {
						z.removeChild(zz)
					}
				}, newNode('div', 'Batal')), newNode('div', {
					'class': "DSBGreenButton",
					'click': function () {
						quoteform.onsubmit()
					}
				}, newNode('div', "Pralihat ►")), newNode('input', {
					'type': 'submit',
					'style': 'visibility:hidden;width:0px;'
				}), newNode('dl', {
					'style': 'display:' + (findlang_ == "en" ? "none" : "block")
				}, newNode('dd', 'Terjemahan: ', newNode('input', {
					'size': 40,
					'name': 'translation'
				}))))))
			},
			'fields': {
				'quotation': util.validateNoWikisyntax('quotation', true),
				'year': util.validateNoWikisyntax('year', true),
				'author': function (t) {
					return t
				},
				'source': function (t) {
					return t ? ", ''" + t + "''" : ''
				},
				'publisher': function (t) {
					return t ? ", " + t : ''
				},
				'page': function (t) {
					return t ? (/\-/.test(t) ? "laman " + t : "laman " + t) : t
				},
				'translation': function (t) {
					return t
				}
			},
			'onsubmit': function (values, render) {
				var topline = "'''" + values.year + "'''" + (values.author ? ", " + values.author : '') + values.source + values.publisher + (values.page ? ", " + values.page : '')
				render(topline + "\n:" + values.quotation + (values.translation ? "\n:" + values.translation : ""), function (newhtml) {
					var findnumberofheaders = findnumberofheaders_(q),
						findnumberofdefs = findnumberofdefs_(q),
						quotetobeadded = newNode('span', {
							'style': 'display:block;'
						});
					quotetobeadded.innerHTML = newhtml.replace(/\<p\>|\<\/p\>/g, '');
					editor.addEdit({
						'edit': function (wikitext) {
							return ccc = wikitext.replace(RegExp("(^[\\s\\S]*?((^|\n)=[\\s\\S]*?){" + findnumberofheaders + "}" + findnumberofdefs + "[\\s\\S]*?)\n(?!#" + findsubdef + "[:\*])|$"), "$1\n#" + findsubdef + "*" + topline + "\n#" + findsubdef + "*:" + values.quotation + (values.translation ? "\n#" + findsubdef + "*:" + values.translation : '') + '\n')
						},
						'redo': function () {
							quoteform.style.display = 'none';
							quotetobeadded.style.display = 'block';
							zz.appendChild(quotetobeadded)
						},
						'undo': function () {
							quoteform.style.display = 'inline';
							zz.removeChild(quotetobeadded)
						},
						'summary': '+quote: "' + values.quotation + '"- ' + values.source
					}, quotetobeadded)
				})
			}
		}, zz)
	})
}


window.addPOSHeader = function (cancelhover) {
	var bodyContent = $(".mw-content-ltr")[0];
	if (!defeditoptions.addingPOS) {
		defeditoptions.addingPOS = true;
		editor = new Editor()
		var headerLevel = (window.languageContainers && languageContainers[currentLanguageTab] && languageContainers[currentLanguageTab].firstChild) || bodyContent.firstChild;
		var ii;
		var temp, temp_;
		var theform;
		var findnumberofheaders;
		var addedwikitext;
		var prefakeheaders;
		var currentFocus;
		var langNames = [], docLink, docExists = {};
		if(window.loadedTabs){
			langNames=tabbedLanguages;
		} else {
			mw.util.$content.find("h2>.mw-headline").each(function(){langNames.push($(this).text())})
		}
		var langNameCodes;
		JsMwApi()({action:'query',prop:'revisions',rvprop:'content',titles:"Template:langrev/"+langNames.join("|Templat:langrev/")},function(r){
			if(r&&r.query&&r.query.pages){langNameCodes={};for(var i in (r=r.query.pages)){langNameCodes[r[i].title.split("langrev/")[1]] = r[i].revisions[0]['*']}}})
		function updateDocLink(){
			var pos = theform.getElementsByTagName("input")[0].value;
                        pos = (({Adjective:"adj", Adverb:"adv", Interjection:"interj", Preposition:"prep", Pronoun:"pron", Conjunction:"con", Contraction:"cont", Determiner:"det"})[pos]||pos.toLowerCase());
			if(!langNameCodes || !pos || !theform.getElementsByTagName("input")[0].value){
				return;
			}
			var currentLang = window.loadedTabs?theform.parentNode.id.split("container")[0]:(function(){
				for(var s=theform;s&&s.nodeName!="H2";s=s.previousSibling);return s && s.lastChild && (s.lastChild.innerText || s.lastChild.textContent)})();
			var docName = langNameCodes[currentLang] + "-" + pos;
			if(docExists[docName] === false){
				return docLink.style.display = 'none';
			}
			if(docExists[docName] === true){
				docLink.style.display = 'inline'; docLink.href = mw.config.get("wgArticlePath").replace("$1", "Template:"+docName+"/doc"); return;
			}
			if(docExists[docName] === 'l'){
				docLink.style.display = 'none'; return;
			}
			docExists[docName] = 'l';
			JsMwApi()({action:'query',prop:'info',titles:'Templat:'+ docName + '/doc'},function(r){docExists[docName] = !r.query.pages[-1];updateDocLink();})
		}
		
		var poslist = '\nKata nama\nKatakerja\nKata sifat\nAdjektif\nAdverbs\nKata ganti nama\nKata hubung\nKata seru\nKata sendi nama\nKata sendi\nKata sendi nama depan\nKata nama khas\nRencana\nFrasa sendi nama\nAkronim\nKependekan\nKeparapan\nPemendekan\nAwalan\nAkiran\nSimbol\nHuruf\nPerangkai\nSimpulan bahasa\nFrasa\nNombor\nAngka\nNombor kardinal\nNombor ordinal\nAngka kardinal\nAngka  ordinal\nkata ganti diri\nPenentu\nPenentu demonstratif\nKlitik\nSisipan\nSimbol isyarat\nSisipan awal\nSirkumfiks\nKedudukan sirkum\nPembilang\nKanji\nBacaan kanji\nBacaan hanja\nHuruf Hirigana\nHuruf Katakana\nPinyin\nAskara Han\nHanzi\nHanja\nPeribahasa\nUngkapan\nPartikel\nPertikel infinitif\nKata sifat posesif\nAdjektif posesif\nKata sendi nama belakang\nFrasa kerja\nFrasa kata kerja\nPartisipel\nGerund\nKata kerja bantu tanya\nKata ganti adverba\nketerangan nama\nAdominal\nKata ganti nama abstark\nPertikel kata hubung\nBentuk gabungan\nKata dasar\nSuku kata Pinyin\nSuku kata\nAskara Hirigana\nAskara Katakana\nSuku kata Jyutping\nGismu\nLujvo\nBrivla\nPengelasan\nPredikat\nKata pengukur\nKata korelatif\nPrakerja\nPranama\nKata nama dasar\nKelas kata nama\nAskara gabungan kana\nCmavo\n';
		while (headerLevel.nextSibling) {
			if (/^h[34]$/i.test(headerLevel.nodeName) && !/Etimologi|Sebutan|Bentuk\salternatif/.test(headerLevel.innerHTML)) {
				headerLevel = headerLevel.nodeName.toLowerCase();
				break;
			}
			headerLevel = headerLevel.nextSibling
		}

		currentBoxToBeAdded = newNode('div', {
			'style': 'position:fixed;top:500px;'
		})
		new AdderWrapper(editor, {
			createForm: function () {
				return theform = newNode('form', currentFocus = newNode('input', {
					'style': 'font-size: 0.8em;font-size: ' + ((headerLevel == 'h3') ? '132%' : '116%') + ';font-weight: bold;font-family: sans-serif;width:auto;',
					'placeholder': 'Sebahagian dari ucapan',
					'rows': 1,
					'name': 'pos',
					focus: function () {
						currentFocus = this
					}
				}), newNode('input', {
					'type': 'submit',
					'value': 'Pralihat'
				}), newNode('input', {
					'type': 'button',
					'value': 'Batal',
					click: function () {
						theform.style.display = 'none';
						hoverNewPOS(null);
						defeditoptions.addingPOS = false;
						document.onmousemove = null;
						document.body.style.cursor = '';
					}
				}), newNode('br'), newNode('input', {
					'style': 'width:300px;font-family:monospace;',
					'placeholder': '{\{head}}',
					'name': 'inflline',
					focus: function () {
						currentFocus = this
					}
				}), docLink = newNode('a',{style:"margin-left:5px;display:none;",'target':'_blank'},"Bantuan?"), newNode('ol', newNode('li', newNode('input', {
					'size': 100,
					'disabled': 'disabled'
				}))))
			},
			fields: {
				'pos': function (txt, error) {
					return poslist.indexOf('\n' + txt + '\n') > -1 ? txt : error('Sila pilih bahagian yang sah dari ucapan.')
				},
				'inflline': function (txt, error) {
					return txt || "{" + "{head}}"
				}
			},
			onsubmit: function (values, render) {
				addedwikitext = '{' + '{subst:=}}==' + (headerLevel == 'h4' ? '=' : '') + values.pos + (headerLevel == 'h4' ? '=' : '') + '===\n' + values.inflline
				hoverNewPOS(null);
				document.onmousemove = null;
				defeditoptions.addingPOS = false;
				document.body.style.cursor = '';
				render(addedwikitext, function (res) {
					theform.style.display = 'none'
					temp = document.createDocumentFragment();
					temp.appendChild(temp_ = newNode('div', {
						'class': 'fakeheader'
					}));
					temp_.innerHTML = res;
					temp.appendChild(newNode('ol', newNode('li', ' ', newNode('span'))));
					theform.parentNode.insertBefore(temp, theform);

					prefakeheaders = 0
					findnumberofheaders = theform.previousSibling.previousSibling;
					while (true) {
						if (findnumberofheaders.previousSibling) {
							findnumberofheaders = findnumberofheaders.previousSibling;
							if (/h[2-6]/i.test(findnumberofheaders.nodeName)) {
								findnumberofheaders = Number(findnumberofheaders.lastChild.getElementsByTagName('a')[0].href.split("section=")[1]);
								break;
							}
							findnumberofheaders.className == 'fakeheader' && prefakeheaders++;
						} else {
							findnumberofheaders.parentNode.insertBefore(newNode('h2', languageHeaderEditButtons[currentLanguageTab].cloneNode(true), {
								'style': 'display:none;'
							}), findnumberofheaders);
						}
					}

					var updatecatscallback;
					editor.addEdit({
						'edit': function (wikitext) {
							return ccc = wikitext.replace(RegExp("(^[\\s\\S]*?((^|\n)=[\\s\\S]*?){" + findnumberofheaders + "}([\\s\\S]*?\n\\{\\{subst:\\=\\}\\}==" + (headerLevel == 'h4' ? '=' : '') + "[^=]){" + prefakeheaders + "}[\\s\\S]*?(?=(\n=|\n----|\n\\{\\{subst:\\=\\}\\}==" + (headerLevel == 'h4' ? '=' : '') + "[^=]|$)))"), "$1\n" + addedwikitext + "\n\n# {"+"{rfdef}}\n")
						},
						'redo': function () {
							theform.style.display = 'none';
							theform.parentNode.insertBefore(temp, theform);
							updatecatscallback = window.tabbedLanguages && updateCategories(theform.parentNode, addedwikitext)
						},
						'undo': function () {
							theform.style.display = 'block';
							temp.appendChild(temp_);
							temp.appendChild(theform.previousSibling);
							updatecatscallback && updatecatscallback()
						},
						'summary': '+pos ' + values.pos
					}, temp_)

					makedefsidebox(theform.previousSibling.firstChild)();

					editor.withCurrentText(function () {
						theform.previousSibling.getElementsByTagName('input')[0].value = '';
						theform.previousSibling.getElementsByTagName('input')[0].focus()
					})
				})
			}
		}, currentBoxToBeAdded)

		cancelhover || setUpBoxToBeAdded();
		theform.firstChild.focus()

		function hoverNewPOS(thefunction) {
			for (var ii = bodyContent.getElementsByTagName(headerLevel), i = 0; i < ii.length; i++) {
				if (!/^Etimologi|Sebutan|Bentuk\salternatif$/.test(ii[i].firstChild.innerHTML))(ii[i].parentNode.className == 'fakeheader' ? ii[i].parentNode : ii[i]).onmouseover = thefunction;
			}
			if (window.tabbedLanguages) {
				for (var i = 0; i < languageContainers.length; i++)
				languageContainers[i].lastChild.onmouseover = thefunction;
			} else {
				ii = bodyContent.getElementsByTagName('hr');
				for (var i = 0; i < ii.length; i++)
				ii[i].onmouseover = thefunction;
			}
		}

		function hoverNewPOS_() {
			currentBoxToBeAdded.style.display = 'none';
			this.parentNode.insertBefore(theform, this);
			currentFocus.focus();
			updateDocLink()
		}

		cancelhover || hoverNewPOS(hoverNewPOS_);

		// autocomplete pos field
		theform.firstChild.onkeydown = function (e) {
			if ((e || event).keyCode == 9) {
				theform.getElementsByTagName("input")[3].focus();
				return false
			}
		}
		theform.firstChild.onkeyup = function (e) {
			if (this.value[0] != this.value.charAt(0).toUpperCase()) this.value = this.value.charAt(0).toUpperCase() + this.value.substr(1);
			e = (e || event).keyCode;
			if (!(e >= 33 && e <= 40) && e != 8 && e != 46 && e != 27 && e != 16 && this.value) {
				if (poslist.indexOf('\n' + this.value) > -1) {
					if (this.setSelectionRange) this.setSelectionRange([this.value.length, this.value = poslist.match(RegExp(this.value + "[^\n]*"))][0], this.value.length);
					else if (this.createTextRange) {
						var z = this.createTextRange();
						z.moveEnd('character', 0 - z.move('character', [this.value.length, this.value = poslist.match(RegExp(this.value + "[^\n]*"))][0]) + this.value.length);
						z.select()
					}
				}
				updateDocLink()
			}
		}

	}
}

window.updateCategories = function (container, newvalue, oldvalue) {
	var addedCategories = [],
		removedCategories = []
		JsMwApi()({
			action: "parse",
			prop: "categorieshtml",
			title: mw.config.get('wgPageName'),
			text: newvalue
		}, function (r) {
			var e = r.parse.categorieshtml['*'].match(/\<li.*?\/li\>/g);
			var d = container.lastChild.lastChild;
			var f = document.createElement('ul');
			for (var i = 0; e && i < e.length; i++) {
				f.innerHTML = e[i];
				if (d.innerHTML.indexOf(f.firstChild.innerHTML) == -1) {
					addedCategories.push(d.insertBefore(f.lastChild, d.lastChild))
				}
			}
			oldvalue && JsMwApi()({
				action: "parse",
				prop: "categorieshtml",
				title: mw.config.get('wgPageName'),
				text: oldvalue
			}, function (o) {
				e = o.parse.categorieshtml['*'].match(/\<li.*?\/li\>/g)
				for (var i = 0; e && i < e.length; i++) {
					f.innerHTML = e[i];
					if (r.parse.categorieshtml['*'].indexOf(f.firstChild.innerHTML) == -1 && d.innerHTML.indexOf(f.firstChild.innerHTML) != -1) {
						var lis = d.getElementsByTagName('li')
						for (var ii = 0; ii < lis.length; ii++) {
							if (lis[ii].firstChild.innerHTML == f.firstChild.firstChild.innerHTML) {
								removedCategories.push(lis[ii]);
								lis[ii].style.display = 'none';
								break;
							}
						}
					}
				}
			})
		})
		return function () {
			for (var i = 0; i < addedCategories.length; i++) {
				container.lastChild.lastChild.removeChild(addedCategories[i])
			}
			for (var i = 0; i < removedCategories.length; i++) {
				removedCategories[i].style.display = '';
			}
		}
}

function addgloss(qq) {
	var senseidform;
	findlang(qq.parentNode, function (findlang_) {
		if (qq.addinggloss) {
			return
		}
		qq.addinggloss = true;
		editor = new Editor();
		new AdderWrapper(editor, {
			'createForm': function () {
				return senseidform = newNode('form', {
					'style': 'display:inline; padding-right:20px;'
				}, newNode('input', {
					'size': 30,
					'name': 'senseid'
				}), newNode('input', {
					'type': 'submit',
					'value': 'Tambah'
				}), newNode('input', {
					'type': 'button',
					'value': 'Batal',
					'click': function () {
						qq.removeChild(senseidform);
						qq.addinggloss = false
					}
				}), newNode('a', {
					href: '/wiki/Bantuan:Padanan kata'
				}, 'Help?!'))
			},
			'fields': {
				'senseid': util.validateNoWikisyntax('gloss', true)
			},
			'onsubmit': function (values) {
				var findnumberofheaders = findnumberofheaders_(qq)
				var findnumberofdefs = findnumberofdefs_(qq)
				senseidform.lastChild.innerHTML = '';
				var nymB = qq.getElementsByTagName('li')[1]
				editor.addEdit({
					edit: function (wikitext) {
						wikitext = wikitext.replace(RegExp("(^[\\s\\S]*?((^|\n)=[\\s\\S]*?){" + findnumberofheaders + "}" + findnumberofdefs + ") ?"), "$1{" + "{senseid|" + findlang_ + "|" + values.senseid + "}}");
						return ccc = wikitext;
					},
					redo: function () {
						senseidform.style.display = "none";
						$([nymB.firstChild, nymB.nextSibling.firstChild]).removeClass('DSBinactive');
						nymB.firstChild.title = nymB.nextSibling.firstChild.title = ''
					},
					undo: function () {
						senseidform.style.display = "inline";
						$([nymB.firstChild, nymB.nextSibling.firstChild]).addClass('DSBinactive');
						nymB.firstChild.title = 'Sila tambah padanan kata sebelum menambah sinonim.';
						nymB.nextSibling.firstChild.title = 'Sila tambah padanan kata sebelum menambah antonim.'
					},
					summary: "+senseid: " + values.senseid
				})
			}
		}, qq, qq.childNodes[1])
		senseidform.firstChild.focus()
		editor.withCurrentText(function (wikitext) {
			wikitext = wikitext.match("==" + (window.loadedTabs ? tabbedLanguages[currentLanguageTab] : $(findtopli(qq).parentNode).prevUntil("h2").eq(-1).prev().find(".mw-headline").text()) + "==\n[\\s\\S]+?(----|$)")[0];
			if (!wikitext) return;
			var senses = '',
				matches = wikitext.match(/(\{\{sense\||\{\{trans-top\|)[^\}]+(?=\}\})/g)
				if (!matches) return;
			for (var ms = 0; ms < matches.length; ms++) {
				senses += "\n" + matches[ms].split("|")[1]
			}
			if (!senses) return;
			senseidform.firstChild.onkeyup = function (e) {
				e = (e || event).keyCode;
				if (!(e >= 33 && e <= 40) && e != 8 && e != 46 && e != 27 && e != 16 && this.value) {
					if (senses.indexOf('\n' + this.value) > -1) {
						if (this.setSelectionRange) this.setSelectionRange([this.value.length, this.value = senses.match(RegExp("\n" + this.value + "[^\n]*")).toString().substr(1)][0], this.value.length);
						else if (this.createTextRange) {
							var z = this.createTextRange();
							z.moveEnd('character', 0 - z.move('character', [this.value.length, this.value = senses.match(RegExp("\n" + this.value + "[^\n]*")).toString().substr(1)][0]) + this.value.length);
							z.select()
						}
					}
				}
			}
		})
	})
}

function editgloss(qq) {

	editor = new Editor()
	editor.withCurrentText(function (wikitext) {
		if (qq.editinggloss) {
			return
		}
		qq.editinggloss = true;
		var findnumberofheaders = findnumberofheaders_(qq)
		var findnumberofdefs = findnumberofdefs_(qq)
		var senseidform;
		var oldsenseid;
		new AdderWrapper(editor, {
			'createForm': function () {
				var thisId = "a" + String(Math.random()).replace(".", "")
				oldsenseid = wikitext.replace(RegExp("(^[\\s\\S]*?((^|\n)=[\\s\\S]*?){" + findnumberofheaders + "}" + findnumberofdefs + "\\s?)"), '').match(/^\{\{senseid\|[^\\|]*\|([^\}]*)/)[1]
				return senseidform = newNode('form', {
					'style': 'display:inline; padding-right:20px; '
				}, newNode('input', {
					'size': 30,
					'name': 'senseid',
					'value': oldsenseid
				}), newNode('input', {
					'type': 'checkbox',
					'id': thisId,
					'name': 'changematching',
					style: 'display:' + (window.tabbedLanguages ? 'inline' : 'none')
				}), newNode('label', {
					'for': thisId,
					style: 'display:' + (window.tabbedLanguages ? 'inline' : 'none')
				}, 'Edit matching glosses'), newNode('input', {
					'type': 'submit',
					'value': 'Ubah'
				}), newNode('input', {
					'type': 'button',
					'value': 'Batal',
					'click': function () {
						qq.editinggloss = false;
						qq.removeChild(senseidform);
					}
				}), newNode('a', {
					href: '/wiki/Bantuan:Padanan kata'
				}, 'Help?!'))
			},
			'fields': {
				'senseid': util.validateNoWikisyntax('gloss', true),
				'changematching': 'checkbox'
			},
			'onsubmit': function (values) {
				var ttables = [],
					sensetemps = [],
					backups = [];
				if (values.changematching) {
					ttables = jQuery(".NavHead", languageContainers[currentLanguageTab]).filter(function () {
						if (this.parentNode.getElementsByTagName("table")[0].className != "translations") return false;
						for (var i = 0; i < this.childNodes.length; i++) {
							if (this.childNodes[i].nodeType == 3 || this.childNodes[i].className == 'wt-edit-recurse') {
								return (this.childNodes[i].nodeValue || this.childNodes[i].innerHTML) == oldsenseid;
							}
						}
					})
					sensetemps = jQuery(".qualifier-content", languageContainers[currentLanguageTab]).filter(function () {
						return this.parentNode.nextSibling.nextSibling.className == "ib-colon" && this.innerHTML == oldsenseid;
					})
				}
				editor.addEdit({
					edit: function (wikitext) {
						wikitext = wikitext.replace(RegExp("(^[\\s\\S]*?((^|\n)=[\\s\\S]*?){" + findnumberofheaders + "}" + findnumberofdefs + "\\s?(\{\{senseid\\|[^\\|]*\\|))[^\}]*"), "$1" + values.senseid);
						if (values.changematching) {
							var asd = wikitext.match('==' + tabbedLanguages[currentLanguageTab] + '==\n[\\s\\S]+?(\n==[^=]|$)');
							wikitext = wikitext.replace(asd[0], asd[0].replace(RegExp("\\{\\{(sense|trans-top)\\|" + oldsenseid + "\\}\\}", "g"), "{\{$1\|" + values.senseid + "}}"))
						}
						return ccc = wikitext
					},
					redo: function () {
						senseidform.style.display = "none";
						for (var i = 0; i < ttables.length; i++) {
							backups.push(document.createDocumentFragment());
							while (ttables[i].childNodes[1]) {
								backups[backups.length - 1].appendChild(ttables[i].childNodes[1]);
							}
							ttables[i].appendChild(document.createTextNode(values.senseid))
						}
						for (var i = 0; i < sensetemps.length; i++) {
							backups.push(document.createDocumentFragment());
							backups[backups.length - 1].appendChild(sensetemps[i].firstChild);
							sensetemps[i].appendChild(document.createTextNode(values.senseid))
						}
					},
					undo: function () {
						senseidform.style.display = "inline";
						for (var i = 0; i < ttables.length; i++) {
							ttables[i].removeChild(ttables[i].childNodes[1]);
							ttables[i].appendChild(backups.shift())
						}
						for (var i = 0; i < sensetemps.length; i++) {
							sensetemps[i].removeChild(sensetemps[i].firstChild)
							sensetemps[i].appendChild(backups.shift())
						}
					},
					summary: "senseid: " + values.senseid
				})
			}
		}, qq, qq.childNodes[1])
		senseidform.firstChild.focus()
	})
}


function setupnymadder(qq, nymtype) {
	var passtheseheaders = "Nota penggunaan|Infleksi|Kata hubung|Tasrif nama|Petikan",
		nymtypelist = ["Sinonim", "Antonim", "Hipernim", "Hiponim", "Meronim", "Holonim"]
	for (var x = 0; nymtypelist[x] != nymtype; x++)
	passtheseheaders += "|" + nymtypelist[x];
	if (qq.parentNode.parentNode.nodeName.toLowerCase() == "li") qq = qq.parentNode.parentNode;
	var findnumberofheaders = findnumberofheaders_(qq)
	var findnumberofdefs = findnumberofdefs_(qq.parentNode.getElementsByTagName('li')[0])
	for (var findheaderlevel = qq.parentNode; !/^h\d$/i.test(findheaderlevel.nodeName); findheaderlevel = findheaderlevel.previousSibling);
	findheaderlevel = Number(findheaderlevel.nodeName.match(/\d/));
	var senseidencoded = []
	editor = new Editor()
	editor.withCurrentText(function (wikitext) {

		// Find nym header, or add it if it doesn't exist
		var qqq = qq.parentNode;

		while (!((qqq.className == "fakesubheader" || /h\d/i.test(qqq.nodeName)) && !qqq.innerHTML.match(passtheseheaders) || qqq.className == "printfooter" || qqq.className == "fakeheader" || qqq.className == "catlinks")) {
			qqq = qqq.nextSibling
		}
		if (!qqq.innerHTML.match(nymtype)) {
			qqq = qqq.parentNode.insertBefore(newNode('div', {
				'class': 'fakesubheader'
			}, newNode('h' + (findheaderlevel + 1), nymtype)), qqq);
		}
		// relevant vars: 
		//  findheaderlevel is the the headerlevel of the most recent header above the ol
		//  qq is still the li itself
		//  qqq is the (possibly newly added) nym header
		// find all relevant senseids, make an array of them, the whole template in each
		var senseid = wikitext.replace(
		RegExp("(^[\\s\\S]*?((^|\n)=[\\s\\S]*?){" + findnumberofheaders + "}" + findnumberofdefs + ")"), '').replace(/\n\n[\s\S]*$/, '').match(/\{\{senseid\|[^\\|]*\|[^\}]*/g)

		if (!senseid) {
			alert("Tiada padanan kata ditemui. Klik \"Tambah padanan kata\" untuk melampirkan padanan kata untuk definisi sebelum menambah " + nymtype.toLowerCase() + ".");
			return
		}

		// run through senseids, checking for a corresponding span id'd nymtype-langcode-id, adding them encased in an li in a soon-to-be-parsed temp variable if not found, otherwise suppressing new form creation
		temp = ""
		var nymformexists = []
		for (var i = 0; i < senseid.length; i++) {
			if (document.getElementById(senseidencoded[i] = nymtype + "-" + encodeURIComponent(senseid[i].split("|")[1] + "-" + senseid[i].split("|")[2]).replace(/%20/g, '_').replace(/%3A/g, ':').replace(/%/g, '.'))) {
				nymformexists[i] = true
			} else {
				temp += "* {" + "{sense|" + senseid[i].split("|")[2] + "}} <span id='" + nymtype + "-" + senseid[i].split("|")[1] + "-" + senseid[i].split("|")[2] + "'></span>\n"
			}

		}
		JsMwApi().page(mw.config.get('wgPageName')).parseFragment(temp, function (res) {
			var qqqq = newNode('span')
			qqqq.innerHTML = res
			qqqq = qqq.parentNode.insertBefore(qqqq.firstChild, qqq.nextSibling) // the ul containing the form-holder spans, right below the nym header
			for (var i = 0; i < senseid.length; i++) {
				if (!nymformexists[i]) {
					setupnymadder2(i, senseid, wikitext)
				}
			}
			if (qqqq.getElementsByTagName && qqqq.getElementsByTagName('li').length == 0) {
				qqqq.parentNode.removeChild(qqqq)
			}
			scroll(0, jQuery(qqq).offset().top)
		})

	})

	function setupnymadder2(i, senseid, wikitext) {

			var nymtype2 = nymtype.slice(0, -1).toLowerCase()
			var x = document.getElementById(senseidencoded[i]);

			var theform
			new AdderWrapper(editor, {
				'createForm': function () {
					return theform = newNode('form', {
						'style': 'display:inline;'
					}, newNode('input', {
						'name': 'nym'
					}), newNode('input', {
						'value': 'Add',
						'type': 'submit'
					}))
				},
				'fields': {
					'nym': util.validateNoWikisyntax(nymtype2, true)
				},
				'onsubmit': function (values, render) {
					theform.getElementsByTagName('input')[0].value = ""
					var firstnym = !theform.parentNode.parentNode.getElementsByTagName('a')[0]
					var addedwikitext = (firstnym ? '' : ', ') + "{" + "{l|" + senseid[i].split("|")[1] + "|" + values.nym + "}}"
					render(addedwikitext, function (res2) {
						var nodeToInsert = newNode('span')
						nodeToInsert.innerHTML = res2
						editor.addEdit({
							edit: function (wikitext) {
								// unindent
								findnumberofdefs = findnumberofdefs_(qq.parentNode.getElementsByTagName('li')[0])

								if (wikitext.substr(wikitext.length - 1, 1) != "\n") {
									wikitext += "\n"
								}

								if (!wikitext.replace(RegExp("(^[\\s\\S]*?((^|\n)=[\\s\\S]*?){" + findnumberofheaders + "}" + findnumberofdefs + ")"), '').replace(RegExp("(\n(=|\\{\\{subst:=\\}\\})={" + (findheaderlevel - 1) + "}[^=][\\s\\S]*$)"), '').match(RegExp(nymtype + "={" + findheaderlevel + "}"))) {
									wikitext = wikitext.replace(RegExp("(^[\\s\\S]*?((^|\n)=[\\s\\S]*?){" + findnumberofheaders + "}" + findnumberofdefs + "[\\s\\S]*?(\n(?=(\\{\\{subst:=\\}\\}|=)=+(?=[^=])(?!(" + passtheseheaders + ")))|$))"), "$1{" + "{subst:=}}===" + (findheaderlevel == 4 ? "=" : "") + nymtype + (findheaderlevel == 4 ? "=" : "") + "====\n\n")
								}



								if (firstnym) {
									var passthesesenseids = [];
									for (var ii = 0; ii < i; ii++) {
										passthesesenseids.push("\\* \\{\\{sense\\|" + senseid[ii].split("|")[2] + "\\}\\}")
									}
									wikitext = wikitext.replace(RegExp("(^[\\s\\S]*?((^|\n)=[\\s\\S]*?){" + findnumberofheaders + "}" + findnumberofdefs + "[\\s\\S]*?=" + nymtype + "=+[\\s\\S]*?\n" + (passthesesenseids.length > 0 ? "(?!(" + passthesesenseids.join("|") + ")))" : ")")), "$1* {" + "{sense|" + senseid[i].split("|")[2] + "}} " + addedwikitext + "\n")
								} else {
									wikitext = wikitext.replace(RegExp("(^[\\s\\S]*?((^|\n)=[\\s\\S]*?){" + findnumberofheaders + "}[\\s\\S]*?=" + nymtype + "=+[\\s\\S]*?\\{\\{sense\\|" + senseid[i].split("|")[2] + "\\}\\}.*)"), "$1" + addedwikitext)
								}



								return ccc = wikitext;

							},
							redo: function () {
								theform.parentNode.parentNode.insertBefore(nodeToInsert, theform.parentNode)
							},
							undo: function () {
								theform.parentNode.parentNode.removeChild(nodeToInsert)
							},
							summary: "+" + nymtype2 + " [[" + values.nym + "]]"
						}, nodeToInsert)
					})
				}
			}, x)


			// sort the lis
			var passthesesenseids = [];
			for (var ii = 0; ii < i; ii++) {
				passthesesenseids.push(senseid[ii].split("|")[2])
			}
			for (var xx = x.parentNode.parentNode.nextSibling; xx.nextSibling && !/h\d/i.test(xx.nodeName) && xx.className != "fakesubheader" && xx.nodeName.toUpperCase() != "UL"; xx = xx.nextSibling);
			if (xx.nodeName.toUpperCase() == "UL") {
				var xxx = xx.getElementsByTagName('li')
				for (var xxxx = xxx.length; xxxx--;) {
					var xxxxx = xxx[xxxx].getElementsByTagName("span")[3]
					if (xxxxx && xxxxx.innerHTML == senseid[i].split("|")[2]) {
						x.parentNode.parentNode.removeChild(x.parentNode);
						xxx[xxxx].appendChild(x);
						break;
					}
					if (xxxxx && passthesesenseids.length && RegExp(passthesesenseids.join("|")).test(xxxxx.innerHTML)) {
						xxx[xxxx + 1] ? xx.insertBefore(x.parentNode, xxx[xxxx]) : xx.appendChild(x.parentNode);
						break;
					}
				}
				if (xxxx == -1) {
					xx.insertBefore(x.parentNode, xx.firstChild)
				}
			}
		}
}


$.when($.ready, mw.loader.using('mediawiki.util')).then(function () {
	var disablebutton = document.getElementById('YRDefsideboxes-disable-button');
	if (disablebutton) {
		disablebutton.innerHTML = "";
		var toggle = newNode('span', {
			click: function () {
				if ($.cookie("DisableYREdit")) {
					$.cookie("DisableYREdit", null, {
						path: "/"
					})
					toggle.innerHTML = "Nyahaktifkan pilihan menyunting definisi."
				} else {
					$.cookie("DisableYREdit", 1, {
						expires: 30,
						path: "/"
					})
					toggle.innerHTML = "Aktifkan pilihan menyunting definisi."
				}
			}
		}, ($.cookie("DisableYREdit") ? "Aktifkan" : "Nyahaktifkan") + " pilihan menyunting definisi.")
		disablebutton.appendChild(toggle);
	}
	if (mw.config.get('wgAction') == 'view' && (mw.config.get('wgNamespaceNumber') == 0 || mw.config.get('wgPageName') == "Wiktionary:Sandbox") && !/&printable=yes|&diff=|&oldid=/.test(location.search) && !$.cookie("DisableYREdit") && !window.DisableYREdit && !window.loadedYREdit) {
		window.loadedYREdit = true;
		for (var ols = document.getElementsByTagName('ol'), ii = 0; ii < ols.length; ii++) {
			if (ols[ii].className != "references") {
				for (var lis = ols[ii].getElementsByTagName('li'), i = 0; i < lis.length; i++) {
					if (lis[i].parentNode == ols[ii] && ols[ii].parentNode.parentNode.nodeName != "UL") makedefsidebox(lis[i]);
				}
			}
		}

		mw.util.addPortletLink('p-tb', 'javascript:addPOSHeader()', 'Tambah sebahagian daripada ucapan');
		defsidebuttons = [0]
		defeditoptions = {
			addingPOS: false
		}
	}
})