ميډياويکي:Gadget-DefSideBoxes.js

يادښت: د غوره توبونو د خوندي کولو وروسته، خپل د کتنمل (بروزر) ساتل شوې حافظه تازه کړی.

  • فايرفاکس/ سفري: په دې کتنمل کې د Reload د ټکوهلو په وخت د Shift تڼۍ نيولې وساتی، او يا هم Ctrl-F5 يا Ctrl-Rتڼۍ کېښکاږۍ (په Apple Mac کمپيوټر باندې ⌘-R کېښکاږۍ)
  • گووگل کروم: په دې کتنمل کې د Ctrl-Shift-R تڼۍ کېښکاږۍ (د مک لپاره ⌘-Shift-R)
  • انټرنټ اېکسپلورر: په دې کتنمل کې د Refresh د ټکوهلو په وخت کې د Ctrl تڼۍ کېښکاږلې ونيسۍ، او يا هم د Ctrl-F5 تڼۍ کېښکاږۍ
  • اوپرا: په دې کتنمل کې د خپل براوزر ساتل شوې حافظه پدې توگه سپينولی شی Tools→Preferences
// 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.
**/

var autoTranslitScripts = {"Geor": true};

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,"Language"); //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', '+Add example sentence', {
				'click': function () {
					setupusexadder(q);
				}
			}), newNode('a', '+Add quotation', {
				'click': function () {
					setupquoteadder(q);
				}
			}), newNode('a', 'More ►', {
				'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', 'Edit gloss', {
				'click': function () {
					editgloss(q);
				}
			}) : newNode('a', 'Add gloss', {
				'click': function () {
					addgloss(q);
				}
			})), newNode('li', newNode('a', q.className ? undefined : {
				'class': 'DSBinactive',
				'title': 'Please add a gloss before adding synonyms.'
			}, {
				'click': function () {
					setupnymadder(q, "Synonyms");
				}
			}, 'Add synonyms')), newNode('li', newNode('a', q.className ? undefined : {
				'class': 'DSBinactive',
				'title': 'Please add a gloss before adding antonyms.'
			}, {
				'click': function () {
					setupnymadder(q, "Antonyms");
				}
			}, 'Add antonyms')), newNode('li', newNode('a', {
				'href': mw.config.get('wgScript') + '?title=User_talk:Yair_rand/editor2.js&action=edit&section=new'
			}, 'Give feedback on this tool')), newNode('li', newNode('a', {
				click: function () {
					$.cookie("DisableYREdit", 1, {
						path: '/'
					});
					location.href = location.href;
				}
			}, 'Disable this tool'))))), $('>dl,>ul,>ol', q)[0] || null);
		}
	}
	q.insertBefore(
	newNode('span', {
		'class': 'defEditButton'
	}, newNode('span', {
		'click': clickiconfunction,
		'title': 'Edit'
	})), 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': 'Example sentence',
					'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', "Preview ►")), newNode('input', {
					'type': 'submit',
					'style': 'visibility:hidden;width:0px;'
				}), newNode('dl', (findlang_ == "en" ? {
					'style': 'display:none;'
				} : ''), newNode('dd', 'Transliteration: ', ((findscript[0] == 'Latn' || !findscript[0]) ? {
					'style': 'display:none;'
				} : ''), newNode('input', {
					'size': '100px',
					name: 'transliteration'
				})), newNode('dd', 'Translation: ', 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) {
				var renderWikitext = "";
				if (findlang_ === "en")
					renderWikitext = "''" + values.examplesentence + "''";
				else
				{
					renderWikitext = "{" + "{ux|" + findlang_ + "|" + values.examplesentence + "|" + values.translation;
					
					if (values.script)
					{
						renderWikitext += "|sc=" + values.script;
						if (!(values.script in autoTranslitScripts) && values.transliteration)
							renderWikitext += "|tr=" + values.transliteration;
					}
					renderWikitext += "}}";
				}
				
				
				
				render(renderWikitext, 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) {
							
							var usexWikitext = renderWikitext;
							
							wikitext = wikitext.replace(RegExp(
							"(^[\\s\\S]*?((^|\n)=[\\s\\S]*?){" + findnumberofheaders + "}" + findnumberofdefs + "[\\s\\S]*?)\n(?!#" + findsubdef + ":)|$")
							, "$1\n#" + findsubdef + ":" + usexWikitext + "\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()
					}
				}, "Preview Changes ►"))))))
			},
			'fields': {
				'definition': function (txt, error) {
					return txt || error("Please specify a definition.")
				}
			},
			'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 == "Englishcontainer") return callback("en");
	} else {
		tosearchfrom_ = tosearchfrom;
		while (tosearchfrom_.nodeName.toLowerCase() != "h2")
		tosearchfrom_ = tosearchfrom_.previousSibling;
		if (tosearchfrom_.lastChild.innerHTML == "English") return callback("en");
	}
	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;'
				}, 'Year: ', newNode('input', {
					'name': 'year',
					'size': 4
				}), ' Author: ', newNode('input', {
					'name': 'author',
					'size': 20
				}), ' Source title: ', newNode('input', {
					'name': 'source',
					'size': 20
				}), ' Publisher: ', newNode('input', {
					'name': 'publisher',
					'size': 20
				}), ' Page(s): ', newNode('input', {
					'name': 'page',
					'size': 5
				}), newNode('dl', newNode('dd', 'Quotation: ', newNode('input', {
					'name': 'quotation',
					'size': 40
				}), newNode('div', {
					'class': "DSBRedButton",
					'click': function () {
						z.removeChild(zz)
					}
				}, newNode('div', 'Cancel')), newNode('div', {
					'class': "DSBGreenButton",
					'click': function () {
						quoteform.onsubmit()
					}
				}, newNode('div', "Preview ►")), newNode('input', {
					'type': 'submit',
					'style': 'visibility:hidden;width:0px;'
				}), newNode('dl', {
					'style': 'display:' + (findlang_ == "en" ? "none" : "block")
				}, newNode('dd', 'Translation: ', 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) ? "pages " + t : "page " + 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("|Template: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:'Template:'+ docName + '/doc'},function(r){docExists[docName] = !r.query.pages[-1];updateDocLink();})
		}
		
		var poslist = '\nNoun\nVerb\nAdjective\nAdverb\nPronoun\nConjunction\nInterjection\nPreposition\nProper noun\nArticle\nPrepositional phrase\nAcronym\nAbbreviation\nInitialism\nContraction\nPrefix\nSuffix\nSymbol\nLetter\nLigature\nIdiom\nPhrase\nNumber\nNumeral\nCardinal number\nOrdinal number\nCardinal numeral\nOrdinal numeral\nPersonal pronoun\nDeterminer\nDemonstrative determiner\nClitic\nInfix\nInterfix\nAffix\nCircumfix\nCircumposition\nCounter\nKanji\nKanji reading\nHanja reading\nHirigana letter\nKatakana letter\nPinyin\nHan character\nHanzi\nHanja\nProverb\nExpression\nParticle\nInfinitive particle\nPossesive adjective\nPostposition\nPhrasal verb\nParticiple\nGerund\nInterrogative auxiliary verb\nPronominal adverb\nAdnominal\nAbstract pronoun\nConjunction particle\nCombining form\nRoot\nPinyin syllable\nSyllable\nHirigana character\nKatakana character\nJyutping syllable\nGismu\nLujvo\nBrivla\nClassifier\nPredicative\nMeasure word\nCorrelative\nPreverb\nPrenoun\nNoun stem\nNoun class\nCombined-kana character\nCmavo\n';
		while (headerLevel.nextSibling) {
			if (/^h[34]$/i.test(headerLevel.nodeName) && !/Etymology|Pronunciation|Alternative\sforms/.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': 'Part of speech',
					'rows': 1,
					'name': 'pos',
					focus: function () {
						currentFocus = this
					}
				}), newNode('input', {
					'type': 'submit',
					'value': 'Preview'
				}), newNode('input', {
					'type': 'button',
					'value': 'Cancel',
					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'},"Help?"), newNode('ol', newNode('li', newNode('input', {
					'size': 100,
					'disabled': 'disabled'
				}))))
			},
			fields: {
				'pos': function (txt, error) {
					return poslist.indexOf('\n' + txt + '\n') > -1 ? txt : error('Please select a valid part of speech.')
				},
				'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 (!/^Etymology|Pronunciation|Alternative\sforms$/.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': 'Add'
				}), newNode('input', {
					'type': 'button',
					'value': 'Cancel',
					'click': function () {
						qq.removeChild(senseidform);
						qq.addinggloss = false
					}
				}), newNode('a', {
					href: '/wiki/Help:Glosses'
				}, '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 = 'Please add a gloss before adding synonyms.';
						nymB.nextSibling.firstChild.title = 'Please add a gloss before adding antonyms.'
					},
					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': 'Change'
				}), newNode('input', {
					'type': 'button',
					'value': 'Cancel',
					'click': function () {
						qq.editinggloss = false;
						qq.removeChild(senseidform);
					}
				}), newNode('a', {
					href: '/wiki/Help:Glosses'
				}, '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 = "Usage notes|Inflection|Conjugation|Declension|Quotations",
		nymtypelist = ["Synonyms", "Antonyms", "Hypernyms", "Hyponyms", "Meronyms", "Holonyms"]
	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("No glosses were found. Click \"Add gloss\" to attach a gloss to the definition before adding " + 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)
				}
			}

		}


}


jQuery(document).ready(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 = "Disable definition editing options."
				} else {
					$.cookie("DisableYREdit", 1, {
						expires: 30,
						path: "/"
					})
					toggle.innerHTML = "Enable definition editing options."
				}
			}
		}, ($.cookie("DisableYREdit") ? "Enable" : "Disable") + " definition editing options.")
		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(window.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()', 'Add part of speech');
		defsidebuttons = [0]
		defeditoptions = {
			addingPOS: false
		}
	}
})