Jump to content

User:Ashlux/peerreviewer.js

From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// ******************************************* //
 // See [[User:AndyZ/peerreviewer]] for details //
 // Quick installation -                        //
 // Add to your monobook.js:                    //
 // // Script from [[User:AndyZ/peerreviewer.js]]
importScript('User:AndyZ/peerreviewer.js'); //[[User:AndyZ/peerreviewer.js]]     //
 // ******************************************* //
 // Written by AndyZ, 2006                      //
 // ******************************************* //
 //Semi-automatic javascript peer reviewer 
 // note that this is NOT a [[WP:BOT]] 
 // though it may be considered a [[WP:SBOTS|semi-bot]]
// *-*-*-*-*-* start code *-*-*-*-*-*
// addlink script: [[User:Omegatron/monobook.js/addlink.js]]
document.write('<script type="text/javascript" src="' 
             + 'http://en.wikipedia.org/w/index.php?title=User:Omegatron/monobook.js/addlink.js' 
             + '&action=raw&ctype=text/javascript&dontcountme=s"></s'+'cript>');

    // *-*-*-*-*-*-*-*-*-*- //
    // configurable options //
    // details on talk page //
    // *-*-*-*-*-*-*-*-*-*- //
	// input_PR is the source id for the input
	// output_PR is the output id for the output
	
var input_PR, output_PR;
if(!input_PR) input_PR = "wpTextbox1";
if(!output_PR) output_PR = "theResponse";	
	
	//configurable options, see talk page for details
var allSpaces_PR, defaultView_PR, select_PR, popup_PR, sendTo_PR, toolbarLink_PR, toolbar_PR, directRef_PR, cat_PR, alpha_PR, userSandbox_PR, initMsg_PR, endMsg_PR, noXHR_PR, maintain_PR, maintain2_PR, spellcheck_PR, showHeading_PR, showInstaview_PR, instaview_PR, width_PR, imgCheck_PR, context_PR;             
if(!allSpaces_PR) allSpaces_PR = false; // if true, "peer review" link will appear on all article pages		  
if(!defaultView_PR) defaultView_PR = 0; // options: 0 - normal, in prose;  1 - template form;  2 - with references;  (for now)                          
if(!select_PR) select_PR = false; // selects text 				
if(!popup_PR) popup_PR = false; // feature not available yet				
if(!sendTo_PR) sendTo_PR = false; // if true, removes send to tab
if(!toolbarLink_PR) toolbarLink_PR = false; // accepted values = "personal", "cactions", "navigation", "tb"			
if(!toolbar_PR) toolbar_PR = "personal";
if(!directRef_PR) directRef_PR = false;
if(!cat_PR) cat_PR = false;
if(!alpha_PR) alpha_PR = false;
if(!userSandbox_PR) userSandbox_PR = "User:" + wgUserName + "/sandbox"
if(!initMsg_PR) initMsg_PR = "The following suggestions were generated by a semi-automatic [[User:AndyZ/peerreviewer|javascript program]], and might not be applicable for the article in question."
if(!endMsg_PR) endMsg_PR = "\nYou may wish to browse through [[User:AndyZ/Suggestions]] for further ideas. Thanks, ~~"+"~~\n\n\n";			
if(!noXHR_PR) noXHR_PR = false; // allow [[ajax]] ([[XMLHTTPrequest]]) or not			
if(!maintain_PR) maintain_PR = false; //for maintainers of [[WP:PR/A]] and its subpages		
if(!maintain2_PR) maintain2_PR = false; //for maintainers of [[WP:PR/A]] and its subpages	
 if(maintain2_PR) select_PR = true;
 if(maintain2_PR) showHeading_PR = true;
if(!spellcheck_PR) spellcheck_PR = false; //spell checker, takes long time though
if(!showHeading_PR) showHeading_PR = false;
if(!showInstaview_PR) showInstaview_PR = false;	
if(instaview_PR == undefined) instaview_PR = true; //instaview button!! released under BSD license by Pilaf
if(imgCheck_PR == undefined) imgCheck_PR = false;
if(context_PR == undefined) context_PR = false;
if(!width_PR) width_PR = 1200;
var width4_PR = width_PR + 4;
width_PR = width_PR.toString(); width4_PR = width4_PR.toString();
	//colors, style
var restoreText_PR, restoreStyle_PR, topBarColor_PR, botBarColor_PR;
if(!restoreText_PR) restoreText_PR = "[restore]"; // text for restoration button			
if(!restoreStyle_PR) restoreStyle_PR = "background:yellow; position:absolute; margin-left:5px; margin-top:120px;";	  
if(!topBarColor_PR) topBarColor_PR = "red"; // color of top bar of suggestions			  
if(!botBarColor_PR) botBarColor_PR = "#cccccc"; // color of bottom bar of suggestions
    // *-*-*-*-*-* end configurable options *-*-*-*-*-*

if(wgNamespaceNumber == 0 || wgNamespaceNumber == 4 || allSpaces_PR){		//only if namespace is main (or wp)
					//the actual output location of the suggestions
    //!!! needs cleanup for readability
					
	//feedbackid = "theFeedback";
	//drag_PR = 'onmousedown="StartDrag(document.getElementById('+feedbackid+'))" onmouseup="CancelDrag()" onmouseout="CancelDrag()"'
	
	var instaview_button_txt;
	if(instaview_PR)
		instaview_button_txt = '<input type="button" value="Instaview" name="instaview_button" id="instaview_button" style="width:150" onclick="instaPreview();" onMouseOver="window.status=\'Preview the suggestions using Live Preview ((C)2006 Pilaf, BSD) without having to copy+paste and using diff. button\'; return true;" onMouseOut="window.status=\'\'">' 	
	else
		instaview_button_txt = "";
					
					//add new button for <span onclick="addToPage()">move to</span> soon
document.write('<div id="theFeedback" style="position:absolute; width:'+width_PR+'px; margin-top:150px; margin-left:40px; border:2px solid #000000; background:55ff55; visibility:hidden; z-index:20;">' + 
    '<div id="topBar" style="background:'+topBarColor_PR+'; text-align:right; width:'+width4_PR+'px">' + 
    '<span onclick="popreview();" onMouseOver="window.status=\'Shows current suggestions in new window, so that they do not interfere with editing\'" onMouseOut="window.status=\'\'">new window</span> | ' +
    '<span onclick="hide_PR()" onMouseOver="window.status=\'Hides suggestions so you can continue editing\'" onMouseOut="window.status=\'\'">close</span>' + 
    '</div>' + 
    '<form name="theForm"><textarea style="width:'+width_PR+'px" rows="20" name="theResponse" id="theResponse">'+initMsg_PR+'</textarea>' +
    '<div style="background:'+botBarColor_PR+'; width:' + width4_PR + 'px">'+instaview_button_txt +
    ' <input type="button" value="Readonly" name="switch_readonly" onclick="determineReadonly()"> |' + 
    ' <input type="button" value="Autoformat article per MoS" name="MOSformatting" onclick="MOS_format();" onMouseOver="window.status=\'Combo of scripts (thx Bobblewik, Gimmetrow) that fix certain MoS issues in article. Be sure to carefully check diff\'" onMouseOut="window.status=\'\'">' +
	' <a href="http://en.wikipedia.org/wiki/User talk:AndyZ/peerreviewer.js" target="_blank" onMouseOver="window.status=\'All feedback is appreciated\'" onMouseOut="window.status=\'\'">Questions/comments/errors?</a><br>' + 
	'</div><div id="InstaViewResponse" style="background:white; visibility:hidden"></div>'
	+'</form></div>'
	+'<div id="restore" style="z-index:19; visibility:hidden;'+restoreStyle_PR+'" onclick="show_PR()" onMouseOver="window.status=\'Show suggestions\'" onMouseOut="window.status=\'\'">'+restoreText_PR+'</div>')	
}

if(toolbar_PR == "personal" || toolbar_PR == "navigation" || toolbar_PR == "cactions" || toolbar_PR == "tb"){
    if((wgNamespaceNumber == 0 || wgNamespaceNumber == 4 || allSpaces_PR) && !toolbarLink_PR){
    //adds peer review link to top bar (with your user + talk pgs, prefs., watchlist, etc.)
    addOnloadHook(function () {
        if(document.forms.editform) {
            addLink('p-'+toolbar_PR, 'javascript:JSpeerreview()', 'peer review', 'ca-peerreviewer', 'Semi-automatic peer reviewer by javascript', '', '');
        }
    });	
    }

    if((wgNamespaceNumber == 0 || allSpaces_PR) && toolbarLink_PR){
    addOnloadHook(function () {
        addLink('p-'+toolbar_PR, 'javascript:toJSpeerreview()', 'peer review', 'ca-peerreviewer', 'Semi-automatic peer reviewer by javascript', '', '');
    });	
    }
}

templateData_PR = new Array(
    ["lead","*Please expand the lead to conform with guidelines at [[Wikipedia:Lead]]. The article should have an appropriate number of paragraphs as is shown on [[WP:LEAD]], and should adequately summarize the article."],
    ["leadlong","*The lead of this article may be too long, or may contain too many paragraphs. Please follow guidelines at [[WP:LEAD]]; be aware that the lead should adequately summarize the article."],
    ["leaddetail","*The lead is for summarizing the rest of the article, and should not introduce new topics not discussed in the rest of the article, as per [[WP:LEAD]]. Please ensure that the lead adequately summarizes the article."],
    ["infobox","*There may be an applicable [[WP:INFOBOX|infobox]] for this article. For example, see [[Template:Infobox Biography]], [[Template:Infobox School]], or [[Template:Infobox City]]."],
    ["contxt","*Per [[Wikipedia:Only make links that are relevant to the context|Wikipedia:Context]] and [[Wikipedia:Manual of Style (dates and numbers)|Wikipedia:Manual of Style (dates)]], months and days of the week generally should not be linked. Years, decades, and centuries can be linked if they provide [[WP:CONTEXT|context]] for the article."],
    ["linkdate","*Per [[Wikipedia:Only make links that are relevant to the context|Wikipedia:Context]] and [[Wikipedia:Build the web]], years with full dates should be linked; for example, link [[January 15]], [[2006]]."],
    ["dateth","*As per [[Wikipedia:Manual of Style (dates and numbers)|Wikipedia:Manual of Style (dates)]], dates shouldn't use <sup>th</sup>; for example, instead of using ''[[January 30|January 30<sup>th</sup>]] was a great day'', use ''[[January 30]] was a great day''."], 
    ["nbsp","*Per [[Wikipedia:Manual of Style (dates and numbers)#Units of measurement|Wikipedia:Manual of Style (numbers)]], there should be a non-breaking space - <code>&amp;nbsp;</code> between a number and the unit of measurement. For example, instead of ''{{{1|18mm}}}'', use ''{{{2|18&nbsp;mm}}}'', which when you are editing the page, should look like: <tt>{{{3|18&amp;nbsp;mm}}}</tt>."], 
    ["spellnum","*Per [[Wikipedia:Manual of Style (dates and numbers)#Units of measurement|Wikipedia:Manual of Style (numbers)]], please spell out source units of measurements in text; for example, ''the Moon is 380,000 kilometres (240,000 mi) from Earth''."], 
    ["abbrev","*Per [[Wikipedia:Manual of Style (dates and numbers)#Units of measurement|Wikipedia:Manual of Style (numbers)]], when doing conversions, please use standard abbreviations: for example, miles -> mi, kilometers squared -> km<sup>2</sup>, and pounds -> lb."], 
    ["headingthe","*Per [[Wikipedia:Manual of Style (headings)]], headings generally do not start with articles ('the', 'a(n)'). For example, if there was a section called ''<nowiki>==The Biography==</nowiki>'', it should be changed to ''<nowiki>==Biography==</nowiki>''."], 
    ["headingre","*Per [[Wikipedia:Manual of Style (headings)]], headings generally should not repeat the title of the article. For example, if the article was [[Ferdinand Magellan]], instead of using the heading ''<nowiki>==Magellan's journey==</nowiki>'', use ''<nowiki>==Journey==</nowiki>''."], 
    ["headinglink","*As per [[Wikipedia:Manual of Style (headings)]], please do not [[WP:LINK|link]] words in headings."], 
    ["headingcap","*Per [[Wikipedia:Manual of Style (headings)]], avoid capitalizing words in section headings unless they are [[proper noun]]s or the first word of the heading."],
    ["gtl","*Please reorder/rename the last few sections to follow guidelines at [[Wikipedia:Guide to layout]]."], 
    ["overlink","*Consider removing links that add little to the article or that have been repeated in close proximity to other links to the same article, as per [[Wikipedia:Manual of Style (links)]] and [[WP:CONTEXT]]."], 
    ["underlink","*Consider adding more [[WP:LINK|links]] to the article; per [[Wikipedia:Manual of Style (links)]] and [[Wikipedia:Build the web]], create links to relevant articles."], 
    ["footspace","*As done in [[WP:FOOTNOTE]], footnotes usually are located right after a punctuation mark (as recommended by the [[The Chicago Manual of Style|CMS]], but not mandatory), such that there is no space in between. For example, ''the sun is larger than the moon [2].'' is usually written as ''the sun is larger than the moon.[2]''"], 
    ["alpha","*Please alphabetize the [[WP:IL|interlanguage links]]."], 
//    ["alpha|[[WP:CAT|categories]]","*Please alphabetize the [[WP:CAT|categories]]."],
//    ["alpha|[[WP:CAT|categories]] and [[WP:IL|interlanguage links]]","*Please alphabetize the [[WP:CAT|categories]] and [[WP:IL|interlanguage links]]."],
    ["ref","*The article will need references. See [[WP:CITE]] and [[WP:V]] for more information."], 
    ["foot","*This article needs [[WP:FOOTNOTE|footnotes]], preferably in the [http://meta.wikimedia.org/wiki/Cite/Cite.php cite.php] format recommended by [[WP:WIAFA]]. Simply, enclose inline citations, with [[WP:CITE]] or [[WP:CITE/ES]] information, with <nowiki><ref>THE FOOTNOTE</ref></nowiki>. At the bottom of the article, in a section named “References” or “Footnotes”, add <code><nowiki><div class=\"references-small\"><references/></div></nowiki></code>."], 
    ["noimg","*This article has no [[WP:IMAGE|images]]. Please see if there are any [[WP:IT|free use]] images that fall under the [[Wikipedia:Image use policy]] and fit under one of the [[Wikipedia:Image copyright tags]] that can be uploaded. To upload images on Wikipedia, go to [[Special:Upload]]; to upload non-[[WP:FU|fair use]] images on the [[Wikimedia Commons]], go to [[commons:special:upload]]."], 
    ["leadimg","*See if possible if there is a [[WP:IT|free use]] image that can go on the top right corner of this article."], 
    ["caption","*Per [[Wikipedia:What is a featured article?]], [[WP:IMAGE|Images]] should have concise captions."], 
    ["toc","*Per [[WP:WIAFA]], this article's table of contents (ToC) may be too long- consider shrinking it down by merging short sections or using a proper system of daughter pages as per [[Wikipedia:Summary style]]."], 
    ["expand","*This article is a bit too short, and therefore may not be as comprehensive as [[WP:WIAFA]] critera 1(b) is looking for. Please see if anything can be expanded upon."], 
    ["SS","*This article may need to undergo [[WP:SS|summary style]], where a series of appropriate subpages are used. For example, if the article is [[United States]], than an appropriate subpage would be [[History of the United States]], such that a summary of the subpage exists on the mother article, while the subpage goes into more detail."], 
    ["copyedit","*Please ensure that the article has gone through a thorough copyediting so that it exemplifies some of [[WP:WIAFA|Wikipedia's best work]]. See also [[User:Tony1/How to satisfy Criterion 1a]]."], 
    ["list","*This article may be a bit list-weighty; in other words, some of the lists should be converted to prose (paragraph form)."], 
    ["trivia","*Generally, trivia sections are looked down upon; please either remove the trivia section or incorporate any important facts into the rest of the article."],
    ["persondata","*If this article is about a person, please add <code><nowiki>{{persondata|PLEASE SEE [[WP:PDATA]]!}}</nowiki></code> along with the required parameters to the article - see [[Wikipedia:Persondata]] for more information."],
    ["how","*Please avoid including instruction manuals, tutorials, etc. or other 'how-to's per [[WP:NOT#Wikipedia is not an indiscriminate collection of information|WP:NOT]]."],
    ["ig","*Avoid including [[WP:IG|galleries]] in articles, as per [[Wikipedia:Galleries#Policy|Wikipedia:Galleries]]. Common solutions to this problem include moving the gallery to a separate page, like [[Gallery of "+wgTitle+"]]."],
    ["fact","*Please provide citations for all of the <code><nowiki>{{fact}}</nowiki></code>s."]
);

// *-*-*-*-*-* non-configurable global variable declarations *-*-*-*-*-*
var temp_mem, foot_mem;
var imgFU = false, imgFUstr = "";
var imgNT = false, imgNTstr = "";
var PRtemplateData, tempPRdata; // !!!
var outputText_PR = initMsg_PR;	//actual output text

function JSpeerreview(){
    //wpTxt is the variable for the text of a document, input_PR is the id
if(document.getElementById(input_PR))
    wpTxt = document.getElementById(input_PR).value;
else{
    alert("Error: Could not locate text\n" + input_PR); return;
}

if(!document.getElementById(output_PR)){
    alert("Error: Unable to access output location\n" + output_PR); return;	
}

//current date variables
    var current_date = new Date(), cur_month = current_date.getMonth(), cur_year = current_date.getFullYear();
    var y_abbrev = cur_year.toString().substring(2,4);
    var m_abbrev = new Array("J","F","M","A","MY","JN","JL","AU","S","O","N","D");
    var m_full = new Array("January","February","March","April","May","June","July","August","September","October","November","December");

// --------------------	
//<nowiki> Messages on WP:PR 
// --------------------	
if(wgTitle.indexOf("Peer review") != -1 && wgTitle.indexOf("/Automated") == -1
 && wgNamespaceNumber == 4 		//WP namespace
 && document.editform.wpTextbox1.value.indexOf("User:AndyZ/peerreviewer") == -1){
document.editform.wpTextbox1.value += "\n*Please see [[User:AndyZ/peerreviewer|automated]] peer review suggestions [[Wikipedia:Peer review/Automated/"+m_full[cur_month]+" "+cur_year+"#"+ wgTitle.split("Peer review/")[1] +"|here]]. Thanks, ~~~~"

// Add a tag to the summary box - ''stolen'' from [[User:Bobblewik]] 
    var txt = document.editform.wpSummary;
    var summary = "Automated peer review at [[WP:PRA/"+m_abbrev[cur_month]+y_abbrev+"#"+wgTitle.split("Peer review/")[1]+"]]";
	if (txt.value.indexOf(summary) == -1) {
		if (txt.value.match(/[^\*\/\s][^\/\s]?\s*$/)) {
			txt.value += " | ";
		}
		txt.value += summary;
	}

return;
} // </nowiki>    
// |%|%|%|%|%|%|%|%|%|%|%|%|%|%|%|%|%|%| //
// |%|%|%|%|%| START  OUTPUT |%|%|%|%|%| //
// |%|%|%|%|%|%|%|%|%|%|%|%|%|%|%|%|%|%| //
if(outputText_PR.indexOf("~~"+"~~")!=-1){
    var existingPR = confirm("There are already suggestions here.\nContinuing will cause the old suggestions to be overwritten.\nDo you wish to proceed?");	
    if(!existingPR) return;
    else{
        outputText_PR = initMsg_PR;		//reset global variables
        imgFU = false; imgFUstr = ""; imgNT = false; imgNTstr = "";
    }
}

if(showHeading_PR) //heading on output (at top)
    outputText_PR = "===[["+wgTitle+"]]===\n"+outputText_PR;

//----------* [[WP:LEAD|lead]] - determine number of paragraphs
wpTxt_lead = wpTxt.substring(0,wpTxt.indexOf("=="))

if(/^([A-Z]|'{3})/gm.test(wpTxt_lead)){
	NumPara = wpTxt_lead.match(/^([A-Z]|'{3})/gm).length;
}
else NumPara=1;

if(NumPara==1)
    outputText_PR+="\n";
*Please expand the lead to conform with guidelines at [[Wikipedia:Lead]]. The article should have an appropriate number of paragraphs as is shown on [[WP:LEAD]], and should adequately summarize the article.<sup>[[User:AndyZ/G#lead|[?]]]</sup>";
if(NumPara==2 && wpTxt.length>=30000)
    outputText_PR+="\n
*Please expand the lead to conform with guidelines at [[Wikipedia:Lead]]. The article should have an appropriate number of paragraphs as is shown on [[WP:LEAD]], and should adequately summarize the article.<sup>[[User:AndyZ/G#lead|[?]]]</sup>";
if(NumPara==3 && wpTxt.length<=15000)
    outputText_PR+="\n
*The lead of this article may be too long, or may contain too many paragraphs. {{#if:{{{1|}}}|For an article of this length, the lead should contain {{{1}}}-{{{2}}} paragraphs.|}} Please follow guidelines at [[WP:LEAD]]; be aware that the lead should adequately summarize the article.";
if(NumPara==4 && wpTxt.length<=30000)
    outputText_PR+="\n
*The lead of this article may be too long, or may contain too many paragraphs. {{#if:{{{1|}}}|For an article of this length, the lead should contain {{{1}}}-{{{2}}} paragraphs.|}} Please follow guidelines at [[WP:LEAD]]; be aware that the lead should adequately summarize the article.";
if(NumPara>=5){
    outputText_PR+="\n
*The lead of this article may be too long, or may contain too many paragraphs. {{#if:{{{1|}}}|For an article of this length, the lead should contain {{{1}}}-{{{2}}} paragraphs.|}} Please follow guidelines at [[WP:LEAD]]; be aware that the lead should adequately summarize the article.";
    outputText_PR+="\n
*The lead is for summarizing the rest of the article, and should not introduce new topics not discussed in the rest of the article, as per [[WP:LEAD]]. Please ensure that the lead adequately summarizes the article.<ref name="leaddetail">See footnote</ref>";
}

//----------* Links compared to # of words (see [[WP:MOS-L]])
words = wpTxt.split(" ").length; links = wpTxt.split("[[").length;
if(.03 * words >= links) outputText_PR+="\n
*Consider adding more [[WP:LINK|links]] to the article; per [[Wikipedia:Manual of Style (links)]] and [[Wikipedia:Build the web]], create links to relevant articles.";
if(.10 * words <= links) outputText_PR+="\n
*Consider removing links that add little to the article or that have been repeated in close proximity to other links to the same article, as per [[Wikipedia:Manual of Style (links)]] and [[WP:CONTEXT]].";

//----------* WP:CONTEXT / WP:MOSDATE
//looks for linked years, days of weeks, or months
if(/[^,\]]\s\[\[\d{4}\]\]/.test(wpTxt)
 || /\[\[((Mon|Tues|Wednes|Thurs|Fri|Satur|Sun)day|January|February|March|April|May|June|July|August|September|October|November|December)\]\]/.test(wpTxt))
    outputText_PR+="\n
*Per [[Wikipedia:Only make links that are relevant to the context|Wikipedia:Context]] and [[Wikipedia:Manual of Style (dates and numbers)|Wikipedia:Manual of Style (dates)]], months and days of the week generally should not be linked. Years, decades, and centuries can be linked if they provide [[WP:CONTEXT|context]] for the article."

//----------* [[WP:MOS#Time]] !!!
/*
var mostime = new Array(["recently", /recently/gi], ["soon", /\ssoon\s/g]);	check_mostime = true; mostimestring = "";	
for(i=0;i<mostime.length;i++){
    if(mostime[i][1].test(wpTxt)){
        check_mostime = false; mostimestring += "|" + mostime[i][0];		//add parameters
    }
}
if(!check_mostime) outputText_PR+="\n{{subst:User:AndyZ/PR/time"+mostimestring+"}}";
*/

//----------* Images (in article/lead)
if(!/\[\[image:/gi.test(wpTxt)) outputText_PR+="\n
*This article has no [[WP:IMAGE|images]]. Please see if there are any [[WP:IT|free use]] images that fall under the [[Wikipedia:Image use policy]] and fit under one of the [[Wikipedia:Image copyright tags]] that can be uploaded. To upload images on Wikipedia, go to [[Special:Upload]]; to upload non-[[WP:FU|fair use]] images on the [[Wikimedia Commons]], go to [[commons:special:upload]].<ref name="noimg">See footnote</ref>";
if(!/image:/gi.test(wpTxt.substring(0,500))) outputText_PR+="\n
*See if possible if there is a [[WP:IT|free use]] image that can go on the top right corner of this article.<ref name="leadimg">See footnote</ref>";

//----------* Images without captions
if(/\|(\d{2,3}px|none|left|center|right|thumb|thumbnail|frame|\.(jpg|gif|png|svg))\]\]/i
    .test(wpTxt.replace(/\n\s*\|.+/gi,""))) outputText_PR+="\n
*Per [[Wikipedia:What is a featured article?]], [[WP:IMAGE|Images]] should have concise captions.<ref name="caption">See footnote</ref>";
	
//----------* Discourage galleries, per [[WP:IG]]
if(/<\/?gallery>/i.test(wpTxt)) outputText_PR+="\n
*Avoid including [[WP:IG|galleries]] in articles, as per [[Wikipedia:Galleries#Policy|Wikipedia:Galleries]]. Common solutions to this problem include moving the gallery to a separate page{{#if:{{{1|}}}|, like [[{{{1}}}]]|}}.";

//----------* Discourage <table> syntax -> {| [[Help:Table]] |}
if(/<\/table>/.test(wpTxt)) outputText_PR+="\n*Please convert tables from [[HTML]] syntax to [[Help:Table]] wiki-markup."; 

//----------* Image licensing: cannot check licensing of WikiMedia Commons images
var imgCode = /\[\[image:(.+?)(\||\])/gi
var imgList = new Array();
if(imgCode.test(wpTxt) && !noXHR_PR && imgCheck_PR){
	imgList = wpTxt.match(imgCode);
	for(i=0;i<imgList.length;i++) {
		imgList[i] = imgList[i].replace(/\[\[image:(.+?)(\||\])/gi,"Image:$1");
		wpajax.download({url:'http://en.wikipedia.org/w/index.php?title='+imgList[i]+'&action=raw',
	    		onSuccess: checkImgLicense, onFailure: wikiImg, message: "raw," + imgList[i] });
	}
}
		//output for image licensing prolems
if(imgNT) outputText_PR+="\n{{subst:User:AndyZ/PR/imgtag"+imgNTstr+"}} <!--Listed images do not have licensing information-->";
if(imgFU) outputText_PR+="\n{{subst:User:AndyZ/PR/imgfu"+imgFUstr+"}} <!--List images are fair use without rationale-->";

//----------* Searches for infobox
if(!/\{\{.*(taxo|info)box/gi.test(wpTxt))
    outputText_PR+="\n
*There may be an applicable [[WP:INFOBOX|infobox]] for this article.{{#if:{{{1|}}}|&nbsp;{{[[Template:{{{1}}}|{{{1}}}]]}} may be useful.|&nbsp;For example, see [[Template:Infobox Biography]], [[Template:Infobox School]], or [[Template:Infobox City]].}}<ref name="infobox">See footnote</ref> (Note that there might not be an applicable infobox; remember that these suggestions are not generated manually)";

//----------* Searches for [[Template:Persondata]]
if((/\[\[Category\:\d{1,}\s(BC\s)?(birth|death)s/gi.test(wpTxt) 	               //category:xxxx births/deaths
 || /\{\{Infobox(\_|\s)(biography|philosopher|Military\sPerson)/gi.test(wpTxt)) //person infobox
 && !/\{\{persondata/gi.test(wpTxt)) 	                	                   //persondata metadata template
	outputText_PR+="\n
*If this article is about a person, please add <code><nowiki>{{persondata}}</nowiki></code> along with the required parameters to the article - see [[Wikipedia:Persondata]] for more information.";

// -------------------- --------------------
// [[WP:MOSNUM]] and [[WP:MOSDATE]]:
// -------------------- --------------------
//----------* checks for & nbsp;
list_unitnbsp = /((\d+)\s?((kilo|hecta|deca|deci|centi|milli|micro|nano)?(meter|metre|liter|litre|gram)s?|(k|d|c|m|n|µ)(g|l|m)|inch(es)?|f(oo|ee)?t|y(ar)?ds?|mi(les?)?|lbs?|pounds?|tons?|ounces?|ozs?|pints?|quarts?|gallons?|in<sup>2<\/sup>|squared inches|ft<sup>2<\/sup>|squared feet|m<sup>2<\/sup>|squared meter|km<sup>2<\/sup>|squared kilo|cm<sup>2<\/sup>|squared centi|mi<sup>2<\/sup>|squared mile|in<sup>3<\/sup>|cubic inch|ft<sup>3<\/sup>|cubic feet|m<sup>3<\/sup>|cubic meter|km<sup>3<\/sup>|cubic kilo|cm<sup>3<\/sup>|cubic centi|mi<sup>3<\/sup>|cubic mile))\W/gi;
if(list_unitnbsp.test(wpTxt)){
	temp_unitnbsp = wpTxt.match(list_unitnbsp);	
	outputText_PR+="\n
*Per [[Wikipedia:Manual of Style (dates and numbers)#Units of measurement|Wikipedia:Manual of Style (numbers)]], there should be a non-breaking space - <code>&amp;nbsp;</code> between a number and the unit of measurement. For example, instead of ''"+RegExp.$1+"'', use ''"+RegExp.$2+"&nbsp;"+RegExp.$3+"'', which when you are editing the page, should look like: <tt>"+RegExp.$2+"&amp;nbsp;"+RegExp.$3+"</tt>.<ref name="nbsp">See footnote</ref>";
}

//----------* Checks for usage of standard abbreviations in parentheses (for conversions)
if(/((kilo|hecta|deca|deci|centi|milli|micro|nano)?(meter|metre|liter|litre|gram)s?|inch(es)?|f(oo|ee)t|yards?|miles?)\)/gi
    .test(wpTxt))
    outputText_PR+="\n
*Per [[Wikipedia:Manual of Style (dates and numbers)#Units of measurement|Wikipedia:Manual of Style (numbers)]], when doing conversions, please use standard abbreviations: for example, miles -> mi, kilometers squared -> km<sup>2</sup>, and pounds -> lb.";

//----------* Checks that units are spelled out in text
var list_SN_PR = /([\d\.]+\s(kms?|mi|yds?|fts?|in\.|cms?|dms?|nms?|oz|lbs?|kgs?|mgs?|dag|dg|ng|(in|ft|yd|mi|m|km|cm|mm|dm|nm)<sup>[23]<\/sup>|ha|hl|dl|cl|ml)\s)/gi;
if(list_SN_PR.test(wpTxt)){
    temp_SN = wpTxt.match(list_SN_PR);
    outputText_PR+="\n
*Per [[Wikipedia:Manual of Style (dates and numbers)#Units of measurement|Wikipedia:Manual of Style (numbers)]], please spell out source units of measurements in text; for example, ''"the Moon is 380,000 kilometres (240,000 mi) from Earth''.<ref name="spellnum">See footnote</ref> " + "Specifically, an example is " + RegExp.$1.substring(0,RegExp.$1.length-1) + ".";
}

//----------* Checks for usage of standard abbreviations in parentheses (without 's') (for conversions) !!!
if(/(\s|nbsp;)((k|d|c|m|n|µ)(g|l|m)|ft|yd|mi|lb|oz)s(\W)/gi.test(wpTxt))
    outputText_PR+="\n*When writing standard abbreviations, the abbreviations should not have a 's' to demark plurality (for example, change kms to km and lbs to lb).";

//----------* Does not work; may fix soon - looks for conversions
//original logic: follow pattern: /(\d* )(\s|&nbsp;)?(UNIT)[^\}\s][^\(]//i
/* !!! ex
area2 = /\d(\s|)((in|ft|mi|(|k|c|m)m)<sup>2<\/sup>|squared (inches|feet|meter|(|kilo|centi|milli)(meter|metre)|mile))[^\}\s][^\(]/gi
vol2 = /\d(\s|)((in|ft|mi|(|m|c|k)m)<sup>3<\/sup>|cubic (inch|feet|meter|(|kilo|centi|milli)(metre|meter)))[^\}\s][^\(]/gi
if(area2.test(wpTxt) || vol2.test(wpTxt))
    outputText_PR+="\n
*Per [[WP:MOSNUM]], at [[WP:MOSNUM#Units of measurement|Units of measurement]], numbers with [[SI units]] of measure should have conversions in [[US customary units]] and vice versa. These conversions should keep to similar values of precision. For example, "the Moon is 380,000&nbsp;kilometres (240,000&nbsp;mi) from Earth". Note that the converted unit of measure uses a standard abbreviation, while the source unit is spelled out in the text.";*/

//----------* Unlinked dates
if(/\s(january|february|march|april|may|june|july|august|september|october|november|december)\s(\d\d?\D)/gi
    .test(wpTxt)) outputText_PR+="\n
*Per [[Wikipedia:Only make links that are relevant to the context|Wikipedia:Context]] and [[Wikipedia:Build the web]], years with full dates should be linked; for example, link {{{1|[[January 15]], [[2006]]}}}.<ref name="linkdate">See footnote</ref>";

//----------* Dateth
var dateth = new Array(2); var check_th = false;
dateth[0] = /(\[\[)?(january|february|march|april|may|june|july|august|september|october|november|december)\s\d\d?(\]\])?(<sup>)?(th|st|nd|rd)/gi
dateth[1] = /\d\d?(<sup>)?(th|st|nd|rd)(<\/sup>)?\s(of\s)?(january|february|march|april|may|june|july|august|september|october|november|december)/gi
		
for(i=0;i<dateth.length;i++){if(dateth[i].test(wpTxt)) check_th = true;}
if(check_th) outputText_PR+="\n
*As per [[Wikipedia:Manual of Style (dates and numbers)|Wikipedia:Manual of Style (dates)]], dates shouldn't use <sup>th</sup>; for example, instead of using ''[[January 30|January 30<sup>th</sup>]] was a great day'', use ''[[January 30]] was a great day''.";

// -------------------- --------------------
// checks for correct MOS heading styles ([[WP:MSH]])
// -------------------- --------------------
//----------* Articles ("the", "a", "an") at beginning of heading
if(wpTxt.indexOf("==The ") != -1 || wpTxt.indexOf("== The ") != -1 || wpTxt.indexOf("==the ") != -1 || wpTxt.indexOf("== the ") != -1 || 
   wpTxt.indexOf("== A ") != -1 || wpTxt.indexOf("==A ") != -1 || wpTxt.indexOf("==a ") != -1 || wpTxt.indexOf("==a ") != -1 || 
   wpTxt.indexOf("==An ") != -1 || wpTxt.indexOf("== An ") != -1 || wpTxt.indexOf("==an ") != -1 || wpTxt.indexOf("== an ") != -1)
    outputText_PR+="\n
*Per [[Wikipedia:Manual of Style (headings)]], headings generally do not start with the word "The". For example, ''<nowiki>==The Biography==</nowiki>'' would be changed to ''<nowiki>==Biography==</nowiki>''.";

//----------* Link in headings
if(/==.{0,}\[\[.{1,}\]\].{0,}==/gi.test(wpTxt))
    outputText_PR+="\n
*As per [[Wikipedia:Manual of Style (headings)]], please do not [[WP:LINK|link]] words in headings.";

//----------* Title repeated in headings
var regex_headre = new RegExp("==.{0,}" + wgTitle.replace(/\s\(.*\)/,"") + ".{0,}==","gi")
if(regex_headre.test(wpTxt)) outputText_PR+="\n
*Per [[Wikipedia:Manual of Style (headings)]], headings generally should not repeat the title of the article. For example, if the article was [[Ferdinand Magellan]], instead of using the heading ''<nowiki>==Magellan's journey==</nowiki>'', use ''<nowiki>==Journey==</nowiki>''.";
	
//----------* Special characters in headings
if(/==.*([^\[]\[[^\[]|[^\]]\][^\]]|&|\+|\{|\}).*==/gi.test(wpTxt))
    outputText_PR+="\n*Per [[Wikipedia:Manual of Style (headings)]], avoid using special characters (ex: &+{}[]) in headings.";

//----------* Capitalization for common headings
if(/==\s?(See\sAlso|External\sLinks?|Works?\sCited|Further\sReadings?|History\sOf\s.{2,}|.{2,}\sAnd\s.{2,})\s?==/g
    .test(wpTxt))
	outputText_PR+="\n
*Per [[WP:MOS#Headings|WP:MOS]], the first letters of words in heading should not be capitalized unless: 1) it is a [[proper noun]] or 2) it is the first word of the heading.";

//----------* How to, Trivia section
if(/==\s?(how[\s\-]to\s.*)\s?==/gi.test(wpTxt)) outputText_PR+="\n
*Please avoid including instruction manuals, tutorials, etc. or other 'how-to's per [[Wikipedia:What Wikipedia is not#Wikipedia is not an indiscriminate collection of information|WP:NOT]].";
if(/==\s?(trivia|other\sfact|miscellaneous|interesting\s)/gi.test(wpTxt)) outputText_PR+="\n
*Generally, trivia sections are looked down upon; please either remove the trivia section or incorporate any important facts into the rest of the article.";

//----------* Order of last sections (WP:LAYOUT) (see also - references - external links)
var refsection_s = new Array("==Reference","==Source","==Footnote","==Cit","==Note","== Reference","== Source","== Footnote","== Cit","== Note"), 
    extlink_s = new Array("==External link","==External Link","== External Link","== External link"),
    seealso_s = new Array("==See also","== See also","==See Also","== See Also"),
    refsection = 0, extlink = 0, seealso = 0, check_gtl = true;
     //find sections
for(i=0;i<seealso_s.length;i++){if(wpTxt.indexOf(seealso_s[i])!=-1)       seealso = wpTxt.indexOf(seealso_s[i]);}
for(i=0;i<refsection_s.length;i++){if(wpTxt.indexOf(refsection_s[i])!=-1) refsection = wpTxt.indexOf(refsection_s[i]);}
for(i=0;i<extlink_s.length;i++){if(wpTxt.indexOf(extlink_s[i])!=-1)       extlink = wpTxt.indexOf(extlink_s[i]);}
if(seealso && refsection && (refsection < seealso)) check_gtl = false;
if(seealso && extlink && (extlink < seealso)) check_gtl = false;
if(refsection && extlink && (extlink < refsection)) check_gtl = false;

if(!check_gtl) outputText_PR+="\n
*Please reorder/rename the last few sections to follow guidelines at [[Wikipedia:Guide to layout]]. {{{1|}}}"

//----------* "List of..."					//not in use due to inaccuracy
/*if(/==\s?list/gi.test(wpTxt))
	outputText_PR+="\n
*This article may be a bit list-weighty; in other words, some of the lists should be converted to prose (paragraph form). {{#if:{{{1|}}}|For example, see "{{{1}}}".}}<ref name="list">See footnote</ref>";*/

//----------* Checks if categories are in alphabetical order !!!
self_alphabetic = [
    'aa','af','ak','als','am','ang','ab','ar','an','roa-rup','frp','as','ast','gn',
    'av','ay','az','bm','bn','zh-min-nan','map-bms','ba','be','bh','bi','bar','bo',
    'bs','br','bg','bxr','ca','cv','ceb','cs','ch','cbk-zam','ny','sn','tum','cho',
    'co','za','cy','da','pdc','de','dv','arc','nv','dz','mh','et','el','eml','en',
    'es','eo','eu','ee','fa','fo','fr','fy','ff','fur','ga','gv','gd','gl','ki',
    'glk','gu','got','zh-classical','xal','ko','ha','haw','hy','hi','ho','hsb','hr',
    'io','ig','ilo','bpy','id','ia','ie','iu','ik','os','xh','zu','is','it','he',
    'jv','kl','kn','kr','ka','ks','csb','kk','kw','rw','ky','rn','sw','kv','kg',
    'ht','kj','ku','lad','lbe','lo','la','lv','lb','lt','lij','li','ln','jbo','lg',
    'lmo','hu','mk','mg','ml','mt','mi','mr','mzn','ms','cdo','mo','mn','mus','my',
    'nah','na','fj','nl','nds-nl','cr','ne','new','ja','nap','ce','pih','no','nn',
    'nrm','nov','oc','or','om','ng','hz','ug','pa','pi','pam','pag','pap','ps','km',
    'pms','nds','pl','pt','ty','ksh','ro','rmy','rm','qu','ru','war','se','sm','sa',
    'sg','sc','sco','st','tn','sq','ru-sib','scn','si','simple','sd','ss','sk','cu',
    'sl','so','sr','sh','su','fi','sv','tl','ta','roa-tara','tt','te','tet','th',
    'vi','ti','tg','tpi','to','chr','chy','ve','tr','tk','tw','udm','bug','uk','ur',
    'uz','vec','vo','fiu-vro','wa','vls','wo','wuu','ts','ii','yi','yo','zh-yue',
    'diq','zea','bat-smg','zh','zh-tw','zh-cn']

/*cat1 = /\[\[Category:.{1,}\]\]/gi
alphed = true; check_il = true;				 //first for [[WP:CAT]]s, [[WP:IL]]s
if(cat1.test(wpTxt)){
	theCats = wpTxt.match(cat1)				 //array to hold categories
	for(i=0;i<theCats.length;i++)
		theCats[i]=theCats[i].toLowerCase(); //moves categories to lower case
	
	//compares all cats to see if in alphabetical order
	for(i=0;i<theCats.length-1;i++){	     //compares all of the categories
		if(!(theCats[i+1]>theCats[i]))
			alphed = false					 //if any categories out of order
	}										 //set variable to false
}
else{										
outputText_PR+="\n*This article does not have any [[WP:CAT|categories]]. Please categorize it with relevant <code><nowiki>[[Category:Categories]]</nowiki></code>."	 //if no categories
}
					
list_il = /\[\[(aa|af|ak|als|am|ang|ab|ar|an|roa\-rup|frp|as|ast|gn|av|ay|az|bm|bn|zh\-min\-nan|map\-bms|ba|be|bh|bi|bar|bo|bs|br|bg|bxr|ca|cv|ceb|cs|ch|cbk\-zam|ny|sn|tum|cho|co|za|cy|da|pdc|de|dv|arc|nv|dz|mh|et|el|eml|en|es|eo|eu|ee|fa|fo|fr|fy|ff|fur|ga|gv|gd|gl|ki|glk|gu|got|zh\-classical|xal|ko|ha|haw|hy|hi|ho|hsb|hr|io|ig|ilo|bpy|id|ia|ie|iu|ik|os|xh|zu|is|it|he|jv|kl|kn|kr|ka|ks|csb|kk|kw|rw|ky|rn|sw|kv|kg|ht|kj|ku|lad|lbe|lo|la|lv|lb|lt|lij|li|ln|jbo|lg|lmo|hu|mk|mg|ml|mt|mi|mr|mzn|ms|cdo|mo|mn|mus|my|nah|na|fj|nl|nds\-nl|cr|ne|new|ja|nap|ce|pih|no|nn|nrm|nov|oc|or|om|ng|hz|ug|pa|pi|pam|pag|pap|ps|km|pms|nds|pl|pt|ty|ksh|ro|rmy|rm|qu|ru|war|se|sm|sa|sg|sc|sco|st|tn|sq|ru\-sib|scn|si|simple|sd|ss|sk|cu|sl|so|sr|sh|su|fi|sv|tl|ta|roa\-tara|tt|te|tet|th|vi|ti|tg|tpi|to|chr|chy|ve|tr|tk|tw|udm|bug|uk|ur|uz|vec|vo|fiu\-vro|wa|vls|wo|wuu|ts|ii|yi|yo|zh\-yue|diq|zea|bat\-smg|zh|zh\-tw|zh\-cn):/gi		//interlanguage links 

if(list_il.test(wpTxt)){
	theIL = wpTxt.match(list_il)				 //array to hold ILs
	for(i=0;i<theIL.length-1;i++){
		if(theIL[i+1] <= theIL[i])			 //compares all categories
			check_il = false					
	}
}

if(!alphed && alphed2 && cat_PR)
	outputText_PR+="\n
*Please alphabetize the [[WP:CAT|categories]].<ref name="alpha">See footnote</ref>"
if(!alphed2 && alphed && alpha_PR)
	outputText_PR+="\n
*Please alphabetize the {{{1|[[WP:IL|interlanguage links]]}}}.<ref name="alpha">See footnote</ref>"
if(!alphed && !alphed2 && !cat_PR && alpha_PR)
	outputText_PR+="\n
*Please alphabetize the {{{1|[[WP:IL|interlanguage links]]}}}.<ref name="alpha">See footnote</ref>"
if(!alphed && !alphed2 && cat_PR && !alpha_PR)
	outputText_PR+="\n
*Please alphabetize the [[WP:CAT|categories]]"+" and [[WP:IL|interlanguage links]]"+".<ref name="alpha">See footnote</ref>"
if(!alphed && !alphed2 && cat_PR && alpha_PR)
	outputText_PR+="\n
*Please alphabetize the [[WP:CAT|categories]] and [[WP:IL|interlanguage links]].<ref name="alpha">See footnote</ref>"*/

//----------* Summary style -ToC and entire article-
if(/\n==/g.test(wpTxt)) theSections = wpTxt.match(/\n==/g).length;
else theSections = 0;
    
if(theSections <= 5 || wpTxt.length <= 7500)
    outputText_PR+="\n
*This article is a bit too short, and therefore may not be as comprehensive as [[WP:WIAFA]] critera 2(b) is looking for. Please see if anything can be expanded upon. {{{1|}}}";
if(theSections >= 24)
    outputText_PR+="\n
*Per [[WP:WIAFA]], this article's table of contents (ToC) may be too long- consider shrinking it down by merging short sections or using a proper system of daughter pages as per [[Wikipedia:Summary style]].<ref name="toc">See footnote</ref>";

if(!/\{\{main/gi.test(wpTxt)){ if(wpTxt.length >= 50000)
	outputText_PR+="\n
*{{#if:{{{1|}}}|At {{{1}}}kb, this|This}} article may need to undergo [[WP:SS|summary style]], where a series of appropriate subpages are used. For example, if the article is [[United States]], than an appropriate subpage would be [[History of the United States]], such that a summary of the subpage exists on the mother article, while the subpage goes into more detail. {{{2|}}}";}
else if(wpTxt.match(/\{\{main/gi).length <= 2 && wpTxt.length >= 50000)
	outputText_PR+="\n
*{{#if:{{{1|}}}|At {{{1}}}kb, this|This}} article may need to undergo [[WP:SS|summary style]], where a series of appropriate subpages are used. For example, if the article is [[United States]], than an appropriate subpage would be [[History of the United States]], such that a summary of the subpage exists on the mother article, while the subpage goes into more detail. {{{2|}}}";

//----------* Section-stub template
if(/\{\{(sect(ion)?(\-|\s)?stub|stub(\-|\s)?section)\}\}/i.test(wpTxt))
    outputText_PR+="\n
*There are a few sections that are too short and that should be either expanded or merged. {{#if:{{{1|}}}|For example, {{{1}}}}}{{#if:{{{2|}}}|, {{{2}}}}}{{#if:{{{3|}}}|, {{{3}}}}}{{#if:{{{4|}}}|, {{{4}}}}}{{#if:{{{5|}}}|, {{{5}}}}}{{#if:{{{6|}}}|, and {{{6}}}}} {{#if:{{{1|}}}|is/are a bit short.}}";
//	
var wpTxt_noquotes = wpTxt.replace(/"(.+?)"/gi,"").replace(/\[\[.{4,50}?\|/gi,"")
//----------* Weasel words
var ww = new Array("some people sa","it has been","many people have","many scientists believe","allege","many people sa","many people believe","arguably","it is claimed","correctly","apparently","people considered","many considered","is considered","are considered"); var ww2 = new Array();
isww = false; awtstring = ""; wpTxtawt = wpTxt_noquotes; wwref = 500;
for(i=0;i<ww.length;i++) ww2[i] = new RegExp(ww[i],"gi")

for(i=0;i<ww.length;i++){
	while(ww2[i].test(wpTxtawt)){
		wpTxtawt = wpTxtawt.substring(wpTxtawt.indexOf(ww[i])+1,wpTxtawt.length);
		if(!(/(<ref|\{\{ref|\{\{fn|\{\{harv)/gi.test(wpTxtawt.substring(0,wwref)))){
			isww = true;
			if(awtstring.indexOf(ww[i]) == -1) awtstring=awtstring+"|''"+ww[i]+"''"
		}
	}
}

if(isww)
    outputText_PR+="\n{{subst:User:AndyZ/PR/awt"+awtstring+"}} <!--This javascript cannot determine if a citation is provided; if all weasel terms are covered by citations, please strike this-->"

//----------* American/British English spellings (ize/ise, ization/isation, or/our, er/re, etc)
// ?!!!
var check_amer = 0, check_brit = 0, ab_ex = "";

AmSpell = new Array("flavor","honor","armor","behavior","harbor","neighbor","favorite","aluminum","mustache","tidbit","meter","fiber","saber","defense","offense","pretense","organize","recognize","realize","colonize","criticize","categorize","ization","analyze","catalyze","hydrolyze","paralyze","anemia","anesthesia","cesium","diarrhea","gynecology","hemophilia","leukemia","esophagus","estrogen","orthopedic","pediatric","counterattack","counselor","equaling","modeling","quarreled","signaling","traveled","enrollment","fulfillment","installment","skillful"," aging","routing","anymore","paycheck","cozy"," gray","jewelry","curb","licorice","mold","molt","pajamas","program ","skeptic","sulfur");
BrSpell = new Array("flavour","honour","armour","behaviour","harbour","neighbour","favourite","aluminium","moustache","titbit","metre","fibre","sabre","defence","offence","pretence","organise","recognise","realise","colonise","criticise","categorise","isation","analyse","catalyse","hydrolyse","paralyse","anaemia","anaesthesia","caesium","diarrhoea","gynaecology","haemophilia","leukaemia","oesophagus","oestrogen","orthopaedic","paediatric","counter-attack","counsellor","equalling","modelling","quarrelled","signalling","travelled","enrolment","fulfilment","instalment","skilful"," ageing","routeing","any more","pay cheque","cosy"," grey","jewellery","kerb","liquorice","mould","moult","pyjamas","programme","sceptic","sulphur");

for(i=0;i<AmSpell.length;i++){
	if(wpTxt_noquotes.indexOf(AmSpell[i]) != -1 && wgTitle.indexOf(AmSpell[i]) == -1){
		check_amer++;
		ab_ex += "''" + AmSpell[i] + "'' (A) (British: ''" + BrSpell[i] + "''), "; 	
	}
	if(wpTxt_noquotes.indexOf(BrSpell[i]) != -1 && wgTitle.indexOf(BrSpell[i]) == -1){
		check_brit++;
		ab_ex += "''" + BrSpell[i] + "'' (B) (American: ''" + AmSpell[i] + "''), ";	
	}
}

if(check_amer >= 2 && check_brit >= 2) outputText_PR+="\n*Please make the spelling of English words consistent with either [[American and British English spelling differences|American or British spelling]], depending upon the subject of the article. Examples include: " + ab_ex.substring(0,ab_ex.length-2) + ".";

//----------* Spellcheck - load [[Wikipedia:Lists of common misspellings/For machines]]
if(!noXHR_PR && spellcheck_PR && wgTitle.indexOf("Peer review") == -1){
	wpajax.download({url:'http://en.wikipedia.org/w/index.php?title=Wikipedia:Lists_of_common_misspellings/For_machines&action=raw',
			onSuccess: spellCheckReview, OnFailure: spellCheckReview_fail, message: 'Wikipedia:Lists of common misspellings/For machines'});
}

//----------* Common redundancies - based on [[User:Tony1/How_to_satisfy_Criterion_1a#Redundancy]]
// !!! more if possible, also general cleanup
redun_PR = new Array(0,0,0,0,0)
redun_regex = /(also|in\saddition|additionally|moreover|furthermore)/gi
if(redun_regex.test(wpTxt_noquotes)){
	theaddnum = wpTxt_noquotes.match(redun_regex)
	if((theaddnum.length>=8)&&(theaddnum.length >= wpTxt.length/1800)) redun_PR[0] = 1;
}

redun_regex = /(some\s|a\svariety\sof|a\snumber\sof|a\smajority\sof|several|a\sfew|\smany|\sany\s|\sall\s)/gi
if(redun_regex.test(wpTxt_noquotes)){
	thevsnum = wpTxt_noquotes.match(redun_regex)
	if((thevsnum.length>=8)&&(thevsnum.length >= wpTxt.length/1800)) redun_PR[1] = 1;
}

redun_regex = /(over\sthe\syears|currently|\snow\s|from\stime\sto\stime)/gi
if(redun_regex.test(wpTxt_noquotes)){
	thetempnum = wpTxt_noquotes.match(redun_regex)
	if(thetempnum.length>=6 && thetempnum.length >= wpTxt.length/2300) redun_PR[2] = 1;
}

redun_regex = /(in\sthe\syear|in\sthe\syear\sof)\s(\[\[|)(\d\d\d\d)/gi
if(redun_regex.test(wpTxt_noquotes)){wpTxt_noquotes.match(redun_regex); exyear = RegExp.$3; redun_PR[3] = 1;}	

redun_regex = /(thereupon|thereupon|notwithstanding|in\sorder\s(to|for))/gi
if(redun_regex.test(wpTxt_noquotes)){
	if(wpTxt_noquotes.match(redun_regex).length > 2) redun_PR[4] = 1;	
}

if(redun_PR[0] || redun_PR[1] || redun_PR[2] || redun_PR[3]){
	outputText_PR+="\n*Watch for [[User:Tony1/How_to_satisfy_Criterion_2a#Redundancy|redundancies]] that make the article too wordy instead of being crisp and concise. (You may wish to try Tony1's [[User:Tony1/How to satisfy Criterion 1a: redundancy exercises|redundancy exercises]].)";	
	
if(redun_PR[0])
	outputText_PR+="\n**While additive terms like “also”, “in addition”, “additionally”, “moreover”, and “furthermore” may sometimes be useful, overusing them when they aren't necessary can instead detract from the brilliancy of the article. This article has "+theaddnum.length+" additive terms, a bit too much.";
if(redun_PR[1])
	outputText_PR+="\n**Vague terms of size often are unnecessary and redundant -  “some”, “a variety/number/majority of”, “several”, “a few”, “many”, “any”, and “all”. For example, “<font color='red'><s>All</s></font> pigs are pink, so we thought of <font color='red'><s>a number of</s></font> ways to turn them green.”";
if(redun_PR[2])
	outputText_PR+="\n**Temporal terms like “over the years”, “currently”, “now”, and “from time to time” often are too vague to be useful, but occasionally may be helpful. “I am <font color='red'><s>now</s></font> using a semi-bot to generate your peer review.”";
if(redun_PR[3])
	outputText_PR+="\n**“In <font color='red'><s>the year [of]</s></font> "+exyear+"”";
if(redun_PR[4])
	outputText_PR+="\n**Avoid misplaced formality: “in order to/for” (-> to/for), “thereupon”, “notwithstanding”, [[User:Tony1/How to satisfy Criterion 1a#Saying good-bye to misplaced formality|etc]].";
}

//----------* Contractions
if(/((is|are|was|were|have|has|had|wo|would|do|does|did|ca|could|should|might|must)n't|(would|should|could|might|must)'ve)/gi
    .test(wpTxt_noquotes)){
	list_contraction = wpTxt_noquotes.match(/((is|are|was|were|have|has|had|wo|would|do|does|did|ca|could|should|might|must)n't|(would|should|could|might|must)'ve)/gi).join(", ");
    outputText_PR+="\n*Avoid using contractions like (outside of quotations): ''" + list_contraction + "''.";
}

//----------* Footnotes
var check_ref = 0;
if (/<ref/g.test(wpTxt)) check_ref=1;
else if (/\{\{(ref|fn|harv)/gi.test(wpTxt)) check_ref=2;

if (!check_ref)						// no footnotes
	outputText_PR+="\n{{#if:{{{1|}}}|*The article has a few or too many inline external links, which hamper the readibility of the article. Please convert them to [[WP:FOOTNOTE|footnotes]], preferably in the [http://meta.wikimedia.org/wiki/Cite/Cite.php cite.php] format recommended by [[WP:WIAFA]].|*This article needs [[WP:FOOTNOTE|footnotes]], preferably in the [http://meta.wikimedia.org/wiki/Cite/Cite.php cite.php] format recommended by [[WP:WIAFA]]. Simply, enclose inline citations, with [[WP:CITE]] or [[WP:CITE/ES]] information, with <nowiki><ref>THE FOOTNOTE</ref></nowiki>. At the bottom of the article, in a section named “References” or “Footnotes”, add <code><nowiki><div class="references-small"><references/></div></nowiki></code>.}}<ref name="foot">See footnote</ref>"
else if (check_ref==2)				//a method outside of the cite.php
	outputText_PR+="\n*You may wish to convert your form of references to the cite.php footnote system that [[WP:WIAFA]] 1(c) highly recommends."


//----------* Footnote spacing following a period
var list_sref = new Array(/(<\/ref>|\{\{(fn|ref)(\|.+)?\}\})\s?\./, /\.\s(<ref>|{\{(ref|fn))/, /<\/ref>(\s|\n)<ref/), check_sref = false;
for(i=0;i<list_sref.length;i++){
	if(list_sref[i].test(wpTxt)){check_sref=true; break;}
}

if(check_sref) outputText_PR+="\n{{subst:User:AndyZ/PR/footspace}}"

//----------* Reference section
if(!/==\s?(reference|source|cit|works cit|footnote|note)/gi.test(wpTxt))
    outputText_PR+="\n{{subst:User:AndyZ/PR/ref}}"

//----------* [citation needed]	
if(/\{\{(fact|citation\sneeded|cn)\}\}/gi.test(wpTxt))
    outputText_PR+="\n{{subst:User:AndyZ/PR/fact}}";

//----------* Copyediting reminder (default):
outputText_PR+="\n{{subst:User:AndyZ/PR/copyedit}}"

//----------* closing + signature
outputText_PR+=endMsg_PR;

document.getElementById(output_PR).value = outputText_PR;

//----------* replacing template format with actual words
temp_mem = document.getElementById(output_PR).value;
if(defaultView_PR == 0)
    replaceTemp();
document.getElementById('instaview_button').style.width = 150;
document.theForm.switch_readonly.style.width = 150;
//----------* 

//show feedback
document.getElementById("theFeedback").style.visibility = "visible";

if(select_PR)				//selects suggestions, for easy copy+pasting
	document.getElementById(output_PR).select();

// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
}// ending brace for function %%
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// image licensing check functions:
// --------------------
// XMLHTTPrequest function by [[User:Zocky]], on [[WP:US]]
wpajax={
    download:function(bundle) {
// mandatory: bundle.url || optional: bundle.onSuccess (xmlhttprequest, bundle), bundle.onFailure (xmlhttprequest, bundle), bundle.otherStuff OK too, passed to onSuccess and onFailure
        var x = window.XMLHttpRequest ? new XMLHttpRequest() : window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : false;
        if (x) {
            x.onreadystatechange=function() {
                x.readyState==4 && wpajax.downloadComplete(x,bundle);
            };
            x.open("GET",bundle.url,true);
            x.send(null);
        }
        return x;
    },
      downloadComplete:function(x,bundle) {
            x.status==200 && (bundle.onSuccess && bundle.onSuccess(x,bundle) || true)
            || ( bundle.onFailure && bundle.onFailure(x,bundle) || checkpage(x,bundle));
      }
};

function wikiImg(xmlreq,data){}	//empty function
function checkImgLicense(xmlreq, data) {
	 var imgTxt = xmlreq.responseText;
	 imgData = data.message.split(",");
	 if(imgData.length > 2){
	       for(i=2;i<imgData.length;i++) imgData[1] += imgData[i];
	 }
	 if(imgData[0] == "raw"){
		   imgNTtemplates = /\{\{(nolicense|nosource|no\ssource|no\slicense|nld|nsd|untagged)/gi
		 
	       if(imgTxt.indexOf("{{") == -1 || imgNTtemplates.test(imgTxt)){
	            imgNT = true; imgNTstr += "|" + imgData[1];
       	   }
	       
	       templFU = /\{\{.{0,}(Music sample|Speech|Sheet music|Albumcover|Boardgamecover|Book cover|Comiccover|DVDcover|Gamecover|Softwarecover|Magazinecover|Time|Newspapercover|Video tape cover|Logo|Computer hardware logo|Disneylogo|PreK12\-logo|Restaurant|Radiologo|Schoolboard\-logo|Scoutlogo|Sports\-logo|Hqfl logo|Olympics\-logo|Tv\-logo|Tv\-program\-logo|Univ\-logo|Symbol|Seal|Icon|Game\-icon|Wayfinding|Stamp|USPSstamp|Money|Promotional|DisneyAttractionPoster|Eventposter|Sportsposter|Movie poster|Political poster|Film\-screenshot|Machinima\-screenshot|Musicpromo\-screenshot|Tv\-screenshot|Video\-screenshot|Game\-screenshot|Cvg\-titlescreen|screen|photo|sign|cover|artwork|Digimonimage|DisneyCharacter|Pokeimage|Yugiohimage|Comicpanel|comicscene|Public Library images|Otto Perry image|Robert Richardson image|Parody|Smithsonian|Standard test|Fair use in|Fairusein\d|no\srationale|nrd|Replaceable\sfair\suse|refu|orfud|or\-fu\-re)/gi
		   FUrat = /(rationale|fair\suse)/gi
		   
		   if(templFU.test(imgTxt) && !FUrat.test(imgTxt)){
				imgFU = true; imgFUstr += "|" + imgData[1];
		   }
 	 }
 	 else if(imgData[0] == "htm"){
	 	 if(imgTxt.indexOf("Template:") == -1){
		 	alert(imgData[1] + "\n" + "\nNo licensing information (HTML check)");	 
	 	 }
 	 }
}

function checkpage(xmlreq, data){
	if(xmlreq.statusText != "Not Found")
		alert(xmlreq.statusText + "\n" + data.url);	
}
// --------------------
// END img license checking
// --------------------
// START spellcheck, based on [[Wikipedia:Lists of common misspellings/For machines]]
// --------------------
function spellCheckReview(xmlreq, data){
	var spell_string = "";
	list_wordpairs = xmlreq.responseText.substring(0,xmlreq.responseText.lastIndexOf("zebra")+5)	// remove category
	list_wordpairs = list_wordpairs.split("\n");			// find all pairs of mispellings + actual words
	var misspelled_words = new Array(); var spellchecked_words = new Array();
	for(i=0;i<list_wordpairs.length;i++){
		list_wordpairs[i] = list_wordpairs[i].substring(1,list_wordpairs[i].length);
																// remove spaces
		try{
			temp_spellarray = list_wordpairs[i].split("->");
			misspelled_words[i] = temp_spellarray[0];
			spellchecked_words[i] = temp_spellarray[1];
		}
		catch(e){
			misspelled_words[i] = list_wordpairs[i].substring(0,list_wordpairs[i].indexOf("->"));
			spellchecked_words[i] = list_wordpairs[i].substring(list_wordpairs[i].indexOf("->")+2,list_wordpairs[i].length);
		}
		
		if(document.getElementById(input_PR).value.indexOf(" " + misspelled_words[i] + " ") != -1){
			spell_string += "''" + misspelled_words[i] + "'' (" + spellchecked_words[i] + ")" + ",";
		}
	}
												
	if(spell_string.length > 2)		//if mispelled_list exists																		
		outputText_PR+="\n*Please check through the article for possible misspellings (see [[WP:SPELL]]). Examples of possible misspellings include: " + spell_string.substring(0,spell_string.length-1) + ".";
}

function spellCheckReview_fail(xmlreq,data){
	alert("Error: Unable to start spellcheck");
}
// --------------------
// END spellcheck
// --------------------
// START output configuring (template <-> prose, readonly, instaview, etc.)
// --------------------	
function replaceTemp(){// ----------* replace templates with actual contents (use ajax?)
	for(i = 0; i < templateData_PR.length; i++){		//templates are listed above with global variables
		templateData_PR[i][1] += "<sup>[[User:AndyZ/G#" + templateData_PR[i][0] + "|[?]]]</sup>";	//appending footnotes
		document.getElementById(output_PR).value = document.getElementById(output_PR).value.replace(new RegExp("{{sub"+"st:User:AndyZ/PR/"+templateData_PR[i][0]+"}}","g"),templateData_PR[i][1]);
	}

    if(/\{\{subst:User:AndyZ\/PR\/.*\}\}/i.test(document.getElementById(output_PR).value))
        replaceTemplatesWithParams();	//continue by replacing templates w/ parameters
}

function replaceTemplatesWithParams(){
 output_txt = document.getElementById(output_PR).value;
 list_utemps = output_txt.match(/\{\{subst:User:AndyZ\/PR\/(.*)\}\}/gi);
 var list_params = new Array();
 for(i=0;i<list_utemps.length;i++){
    list_utemps[i] = list_utemps[i].substring(22,list_utemps[i].length-2);
    list_params = list_utemps[i].split("|");
    if(list_params.length == 1) continue;
    uTN_PR = list_params[0];
	
    list_paramsStr = "";
    for(j=1;j<list_params.length;j++){
        if(j==list_params.length-1) list_paramsStr += list_params[j];
        else list_paramsStr += list_params[j] + ",,";	
    }
		
        //if statements
    if(uTN_PR == "time")
        document.getElementById(output_PR).value = document.getElementById(output_PR).value.replace(/\{\{subst:User:AndyZ\/PR\/time.*\}\}/gi,"*Per [[WP:MOS#Time|WP:MOS]], avoid using words/phrases that indicate time periods relative to the current day. For example, ''" + list_paramsStr.replace(/\,\,/g,"'', ''") + "'' might be terms that should be replaced with specific dates/times.<sup>[[User:AndyZ/G#time|[?]]]</sup>");
    if(uTN_PR == "awt")
        document.getElementById(output_PR).value = document.getElementById(output_PR).value.replace(/\{\{subst:User:AndyZ\/PR\/awt.*\}\}/gi,"*There are a few occurrences of [[weasel word]]s in this article- please observe [[WP:AWT]]. Certain phrases should specify exactly who supports, considers, believes, etc., such a view.\n**" + list_paramsStr.replace(/\,\,/g,"\n**") + "\n**might be weasel words, and should be provided with proper [[WP:FOOTNOTE|citations]] (if they already do, or are not weasel terms, please <strike>strike</strike> this comment).<sup>[[User:AndyZ/G#awt|[?]]]</sup>");
    if(uTN_PR == "nbsp")
        document.getElementById(output_PR).value = document.getElementById(output_PR).value.replace(/\{\{subst:User:AndyZ\/PR\/nbsp.*\}\}/gi,"*Per [[Wikipedia:Manual of Style (dates and numbers)#Units of measurement|Wikipedia:Manual of Style (numbers)]], there should be a non-breaking space - <code>&amp;nbsp;</code> between a number and the unit of measurement. For example, instead of ''"+list_params[1]+"'', use ''"+list_params[2]+"'', which when you are editing the page, should look like: <tt>"+list_params[3]+"</tt>.<sup>[[User:AndyZ/G#nbsp|[?]]]</sup>");
	/*if(uTN_PR == "imgfu")
		document.getElementById(output_PR).value = document.getElementById(output_PR).value.replace(/\{\{subst:User:AndyZ\/PR\/imgfu.*\}\}/gi,"*Images with [[fair use]] tags need [[WP:FU|fair use rationales]] - please see [[WP:FUC]]. Specifically, [[:" + list_paramsStr.replace(/\,\,/gi,"]], [[:") + "]] need(s) proper fair use rationales.");
	if(uTN_PR == "imgtag")
		document.getElementById(output_PR).value = document.getElementById(output_PR).value.replace(/\{\{subst:User:AndyZ\/PR\/imgtag.*\}\}/gi,"*Images need proper [[WP:IMAGE|image]] [[WP:IT|copyright tags]] and source information. Specifically, [[:" + list_paramsStr.replace(/\,\,/gi,"]], [[:") + "]] need(s) proper image copyright tags.");
	*/
 }	
}

function determineReadonly(){		//readonly, to prevent accidental editing of the text
	if(document.getElementById(output_PR).readOnly) {
		document.getElementById(output_PR).readOnly = false; 	
		document.theForm.switch_readonly.value = "Readonly";		//button properties 
		document.theForm.switch_readonly.style.width = 150;
	}
	else {
		document.getElementById(output_PR).readOnly = true; 
		document.theForm.switch_readonly.value = "Edit-able";		//button properties 
		document.theForm.switch_readonly.style.width = 150;
	}
}

function popreview(){
	PRresult = "<script>wgUserName = '" + wgUserName + "';</s" + "cript><script type='text/javascript' src='http://en.wikipedia.org/w/index.php?title=User:AndyZ/peerreviewer.js&action=raw&ctype=text/javascript&dontcountme=s'></s" + "cript>Return to <a href='http://en.wikipedia.org/wiki/" + wgPageName + "'>" + wgTitle + "</a> (<a href='http://en.wikipedia.org/w/index.php?title="+wgPageName+"&action=edit'>edit</a> | <a href='http://en.wikipedia.org/w/index.php?title="+wgPageName+"&action=history'>history</a>) <br><br><form name='theForm'> <input type='button' value='Readonly' name='switch_readonly' onclick='determineReadonly()' style='width:150'><br><textarea id='theResponse' name='theResponse' cols='120' rows='50'>" + document.getElementById(output_PR).value + "</textarea></form>";
	var newPage_PR = window.open("http://en.wikipedia.org/","winName");
	newPage_PR.document.write(PRresult);
	newPage_PR.document.close();
}

// --------------------	
// show and hide results 
// --------------------	
function hide_PR(){var d=document;
	d.getElementById("theFeedback").style.visibility = "hidden";
	d.getElementById("restore").style.visibility = "visible";
}
function show_PR(){var d=document;
	d.getElementById("theFeedback").style.visibility = "visible";
	d.getElementById("restore").style.visibility = "hidden";
}

function toJSpeerreview(){
	if(document.title.indexOf("Editing ") == 0) JSpeerreview();
	else window.open('http://en.wikipedia.org/w/index.php?title='+wgPageName+'&action=edit&fakeaction=displayPR','Edit');	
}

// STARTFILE: autopr.js
function pr()
{
  var pagename = document.editform.action.substring(pagename.indexOf('title=') + 6,pagename.lastIndexOf('&action=submit'));

  window.open('http://en.wikipedia.org/w/index.php?title=Talk:' + unescape(pagename) + '&action=edit&fakeaction=prtemp','Talk', 'status,toolbar,location,menubar,directories,resizeable,scrollbars');          
  window.open('/w/index.php?title=Wikipedia:Peer_review/' + unescape(pagename) + '&action=edit&fakeaction=prsub&faketarget=' + unescape(pagename),'PRnom', 'status,toolbar,location,menubar,directories,resizeable,scrollbars');
  window.open('/w/index.php?title=Wikipedia:Peer_review&action=edit&fakeaction=prlist&faketarget=' + unescape(pagename), 'PRlisting', 'status,toolbar,location,menubar,directories,resizeable,scrollbars');
}

function autopr()
{
  if (document.title.indexOf('Editing ') == 0)
    {
      var theaction = '';
      var target = '';
      if (location.search)
        {
          var l = location.search.substring(1).split('&');
          for (var i = 0; i < l.length; ++i)
            {
              var eq = l[i].indexOf('=');
              var name = l[i].substring(0, eq);
              if (name == 'fakeaction')
                theaction = l[i].substring(eq + 1);
              else if (name == 'faketarget')
                target = unescape(l[i].substring(eq + 1)).replace(/_/g, ' ');
            }
        }
      if (theaction == 'prlist')
        {
          req = document.editform.wpTextbox1.value.indexOf("{{Wikipedia:Peer review/");
          document.editform.wpTextbox1.value = document.editform.wpTextbox1.value.substring(0,req) + '{{Wikipedia:Peer review/' + target + '}}\n' + document.editform.wpTextbox1.value.substring(req,document.editform.wpTextbox1.value.length);
          document.editform.wpSummary.value = '[[Wikipedia:Peer review/' + target + ']]';
        }
      else if (theaction == 'prsub'){
          if (document.editform.wpTextbox1.value.length > 0)
              window.alert("There's an old peer review at the default location already.\n\n" +
                           'Please either move it out of the way (and update existing links to it), or file the PR by hand in another location (such as [[Wikipedia:Peer review/' + wgTitle.split("/")[1] + ' 2]]).');
          else
            document.editform.wpTextbox1.value += '===[[' + target + ']]===\n' +
              '<!--Reason for nomination.--> ~~' + '~~';
      }
      else if (theaction == 'prtemp'){
          if (document.editform.wpTextbox1.value.indexOf('{{peerreview}}') != -1)     
              window.alert("There has already been a peer review.");
          else{
              document.editform.wpTextbox1.value = '{{peerreview}}\n\n' + document.editform.wpTextbox1.value;
              document.editform.wpSummary.value = 'peer reviewing - [[Wikipedia:Peer review/' + target + ']]';
            }
        }
      else if (theaction == 'displayPR')
	    	    JSpeerreview();
      else
        pr();
    }
}

if(sendTo_PR){
	addOnloadHook(function () {
	    if(document.forms.editform) addLink('p-cactions', 'javascript:autopr()', 'send to WP:PR', 'ca-peerreview', 'Submits article for peer review', '', '');
	});
}

if(document.location.href.indexOf("fakeaction") != -1) addOnloadHook(autopr);

// ENDFILE autopr.js </pre>
// <pre>STARTFILE maintainPRA.js
var mem;
if(wgUserName == "AZPR" || maintain_PR){
	if(wgTitle.indexOf("Peer review/") != -1 && wgTitle.indexOf("Automated") == -1 && wgNamespaceNumber == 4 && document.title.indexOf("Editing ") == 0){
		addOnloadHook(function () {
		    mem = document.getElementById("wpTextbox1").value;
		    JSpeerreview();
		    if(mem != document.getElementById("wpTextbox1").value) document.getElementById('wpSave').click();
		});
	}

	if(wgPageName.indexOf("Wikipedia:Peer_review/Automated/") != -1 && document.title.indexOf("Editing ") == 0){
		addOnloadHook(function () {
		    document.getElementById('wpSummary').value += "new automated PR requests";
		});
	}
	
	if((document.location.href.indexOf("action=edit")!=-1) && (wgNamespaceNumber == 0)){
		addOnloadHook(JSpeerreview);
	}
	
	if(wgNamespaceNumber == 4 && wgTitle.indexOf("Peer review/Automated/") != -1 && /\d{4}/.test(wgTitle) && document.editform){
		if(document.getElementById("wpTextbox1").value == ""){
			document.getElementById("wpTextbox1").value = "{"+"{Wikipedia:Peer review/Automated/header}}\n==Requests==\n{"+"{Wikipedia:Peer review/Automated/foot}}";
			document.getElementById('wpSummary').value += "Starting new subpage for automated peer reviews";
			document.getElementById('wpSave').click();
		}
	}
	
	if(wgNamespaceNumber == 5 && wgTitle.indexOf("Peer review/Automated/") != -1 && /\d{4}/.test(wgTitle) && document.editform){
		if(document.getElementById("wpTextbox1").value == ""){
			document.getElementById("wpTextbox1").value = "#redirect [[Wikipedia talk:Peer review/Automated]]";
			document.getElementById('wpSummary').value += "Redirect to [[Wikipedia talk:Peer review/Automated]]";
			document.getElementById('wpSave').click();
		}
	}
}

if(maintain2_PR){
	if(wgTitle.indexOf("Peer review/") != -1 && wgTitle.indexOf("Automated") == -1 && wgNamespaceNumber == 4){
		addOnloadHook(function () {
		    mem = document.getElementById("wpTextbox1").value;
		    JSpeerreview();
		    if(mem != document.getElementById("wpTextbox1").value) document.getElementById('wpSave').click();
		});
	}

	if(wgPageName.indexOf("Wikipedia:Peer_review/Automated/") != -1 && document.title.indexOf("Editing ") == 0){
		addOnloadHook(function () {
		    document.getElementById('wpSummary').value += "new automated PR requests";
		});
	}
	
	if(wgNamespaceNumber == 4 && wgTitle.indexOf("Peer review/Automated/") != -1 && /\d{4}/.test(wgTitle) && document.editform){
		if(document.getElementById("wpTextbox1").value == ""){
			document.getElementById("wpTextbox1").value = "{"+"{Wikipedia:Peer review/Automated/header}}\n==Requests==\n{"+"{Wikipedia:Peer review/Automated/foot}}";
			document.getElementById('wpSummary').value += "Starting new subpage for automated peer reviews";
			document.getElementById('wpSave').click();
		}
	}
}
// ENDFILE maintainPRA.js

// ************************* ///_///_/// 
// END PEER REVIEWING SCRIPT //|_)/|_)//
// ************************* //|///| \//
function instaPreview(){
	if(document.getElementById('InstaViewResponse').style.visibility == "hidden"){
		InstaViewPR.dump(output_PR, 'InstaViewResponse');
		document.getElementById('instaview_button').style.width = 150;
		document.getElementById('instaview_button').value = "Hide instaview";
		document.getElementById('InstaViewResponse').style.visibility = "visible";
		document.getElementById('InstaViewResponse').style.background = "white";
		document.getElementById('InstaViewResponse').style.border = "2px solid orange";
		document.getElementById('theFeedback').style.width = width4_PR+"px"
	}
	else{
		document.getElementById('instaview_button').style.width = 150;
		document.getElementById('instaview_button').value = "Instaview";
		document.getElementById('InstaViewResponse').innerHTML = "";
		document.getElementById('InstaViewResponse').style.visibility = "hidden";
	}
}
if(showInstaview_PR){
	addOnloadHook(function(){
	  if (document.getElementById('editpage-copywarn')) {
	    var oldPreview = document.getElementById('wpPreview');
	    var newPreview = document.createElement('input');
	    newPreview.setAttribute('type', 'button');
	    newPreview.setAttribute('style', 'font-style: italic');
	    newPreview.setAttribute('value', 'InstaView');
	    newPreview.setAttribute('onclick', "InstaViewPR.dump('wpTextbox1', 'InstaViewDump')");
	    oldPreview.parentNode.insertBefore(newPreview, oldPreview);
	    oldPreview.parentNode.innerHTML += '<div style="margin: 5px 0 5px 0; padding: 5px; border: 2px solid orange;" id="InstaViewDump"></div>';
	    oldPreview.value = 'Classic Preview';
	    }
	});
}

// STARTFILE: livepreview.js

/*
 * InstaView - a Mediawiki to HTML converter in JavaScript
 * Version 0.6.1
 * Copyright (C) Pedro Fayolle 2005-2006
 * http://en.wikipedia.org/wiki/User:Pilaf
 * Distributed under the BSD license
 *----------* For full comments/documentation, see [[User:Pilaf/instaview.js]]
*/

var InstaViewPR = {}

// options
InstaViewPR.conf =
{
	user: {},
	wiki: {
		lang: 'en',
		interwiki: 'ab|aa|af|ak|sq|als|am|ang|ar|an|arc|hy|roa-rup|as|ast|av|ay|az|bm|ba|eu|be|bn|bh|bi|bs|br|bg|my|ca|ch|ce|chr|chy|ny|zh|zh-tw|zh-cn|cho|cv|kw|co|cr|hr|cs|da|dv|nl|dz|en|eo|et|ee|fo|fj|fi|fr|fy|ff|gl|ka|de|got|el|kl|gn|gu|ht|ha|haw|he|hz|hi|ho|hu|is|io|ig|id|ia|ie|iu|ik|ga|it|ja|jv|kn|kr|csb|ks|kk|km|ki|rw|rn|tlh|kv|kg|ko|kj|ku|ky|lo|la|lv|li|ln|lt|jbo|nds|lg|lb|mk|mg|ms|ml|mt|gv|mi|minnan|mr|mh|zh-min-nan|mo|mn|mus|nah|na|nv|ne|se|no|nn|oc|or|om|pi|fa|pl|pt|pa|ps|qu|ro|rm|ru|sm|sg|sa|sc|gd|sr|sh|st|tn|sn|scn|simple|sd|si|sk|sl|so|st|es|su|sw|ss|sv|tl|ty|tg|ta|tt|te|th|bo|ti|tpi|to|tokipona|ts|tum|tr|tk|tw|uk|ur|ug|uz|ve|vi|vo|wa|cy|wo|xh|ii|yi|yo|za|zu',
		default_thumb_width: 180
	},
	paths: {
		articles: '/wiki/',
		math: '/math/',
		images: '',
		images_fallback: 'http://upload.wikimedia.org/wikipedia/commons/',
		magnify_icon: 'skins/common/images/magnify-clip.png'
	},
	locale: {
		user: 'User',
		image: 'Image',
		category: 'Category',
		months: ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
	}
}

// options with default values or backreferences
with (InstaViewPR.conf) {
	user.name = user.name || wgUserName || 'Wikipedian'
	user.signature = '[['+locale.user+':'+user.name+'|'+user.name+']]'
	paths.images = 'http://upload.wikimedia.org/wikipedia/' + wiki.lang + '/'
}

// define constants
InstaViewPR.BLOCK_IMAGE = new RegExp('^\\[\\['+InstaViewPR.conf.locale.image+':.*?\\|.*?(?:frame|thumbnail|thumb|none|right|left|center)', 'i');

InstaViewPR.dump = function(from, to)
{
	if (typeof from == 'string') from = document.getElementById(from)
	if (typeof to == 'string') to = document.getElementById(to)
	to.innerHTML = this.convert(from.value)
}

InstaViewPR.convert = function(wiki)
{
	var 	ll = (typeof wiki == 'string')? wiki.replace(/\r/g,'').split(/\n/): wiki, // lines of wikicode
		o='',	// output
		p=0,	// para flag
		$r	// result of passing a regexp to $()
	
	// some shorthands
	function remain() { return ll.length }
	function sh() { return ll.shift() }
	function ps(s) { o+=s } // push
	
	function f()
	{
		var i=1,a=arguments,f=a[0],o='',c,p
		for (;i<a.length; i++) if ((p=f.indexOf('?'))+1) {
			// allow character escaping
			i -= c=f.charAt(p+1)=='?'?1:0
			o += f.substring(0,p)+(c?'?':a[i])
			f=f.substr(p+1+c)
		} else break;
		return o+f
	}
	
	function html_entities(s) { return s.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;") }
	
	function max(a,b) { return (a>b)?a:b }
	function min(a,b) { return (a<b)?a:b }

	function str_imatch(a, b)
	{
		for (var i=0, l=min(a.length, b.length); i<l; i++) if (a.charAt(i)!=b.charAt(i)) break
		return i
	}

	function $(c) { return (typeof c == 'string') ? (ll[0].substr(0,c.length)==c) : ($r = ll[0].match(c)) }
	
	function $$(c) { return ll[0]==c } // compare current line against a string
	function _(p) { return ll[0].charAt(p) } // return char at pos p
	
	function endl(s) { ps(s); sh() }
	
	function parse_list()
	{
		var prev='';
		
		while (remain() && $(/^([*#:;]+)(.*)$/)) {
			
			var l_match = $r;
			sh();
			var ipos = str_imatch(prev, l_match[1]);

			for (var i=prev.length-1; i >= ipos; i--) {
				
				var pi = prev.charAt(i)
				
				if (pi=='*') ps('</ul>')
				else if (pi=='#') ps('</ol>')
				// close a dl only if the new item is not a dl item (:, ; or empty)
				else switch (l_match[1].charAt(i)) { case'':case'*':case'#': ps('</dl>') }
			}

			for (var i=ipos; i<l_match[1].length; i++) {
				
				var li = l_match[1].charAt(i)
				
				if (li=='*') ps('<ul>')
				else if (li=='#') ps('<ol>')
				// open a new dl only if the prev item is not a dl item (:, ; or empty)
				else switch(prev.charAt(i)) { case'':case'*':case'#': ps('<dl>') }
			}
			
			switch (l_match[1].charAt(l_match[1].length-1)) {
			
				case '*': case '#':
					ps('<li>' + parse_inline_nowiki(l_match[2])); break
					
				case ';':
					ps('<dt>')
					
					var dt_match
					
					// handle ;dt :dd format
					if (dt_match = l_match[2].match(/(.*?) (:.*?)$/)) {
						
						ps(parse_inline_nowiki(dt_match[1]))
						ll.unshift(dt_match[2])
						
					} else ps(parse_inline_nowiki(l_match[2]))
					
					break
					
				case ':':
					ps('<dd>' + parse_inline_nowiki(l_match[2]))
			}
			
			prev=l_match[1]
		}

		for (var i=prev.length-1; i>=0; i--)
			ps(f('</?>', (prev.charAt(i)=='*')? 'ul': ((prev.charAt(i)=='#')? 'ol': 'dl')))
	}
	
	function parse_table()
	{
		endl(f('<table?>', $(/^\{\|( .*)$/)? $r[1]: ''))
		
		for (;remain();) if ($('|')) switch (_(1)) {
			case '}': endl('</table>'); return
			case '-': endl(f('<tr ?>', $(/\|-*(.*)/)[1])); break
			default: parse_table_data()
		}
		else if ($('!')) parse_table_data()
		else sh()
	}
	
	function parse_table_data()
	{
		var td_line, match_i
		var td_match = sh().match(/^(\|\+|\||!)((?:([^[|]*?)\|(?!\|))?(.*))$/)
		if (td_match[1] == '|+') ps('<caption');
		else ps('<t' + ((td_match[1]=='|')?'d':'h'))
		if (typeof td_match[3] != 'undefined') {
			ps(' ' + td_match[3])
			match_i = 4
		} else match_i = 2
		
		ps('>')
		
		if (td_match[1] != '|+') {
			td_line = td_match[match_i].split((td_match[1] == '|')? '||': /(?:\|\||!!)/)
			
			ps(parse_inline_nowiki(td_line.shift()))
			
			while (td_line.length) ll.unshift(td_match[1] + td_line.pop())
			
		} else ps(td_match[match_i])
		
		var tc = 0, td = []
		
		for (;remain(); td.push(sh()))
		if ($('|')) {
			if (!tc) break // we're at the outer-most level (no nested tables), skip to td parse
			else if (_(1)=='}') tc--
		}
		else if (!tc && $('!')) break
		else if ($('{|')) tc++
		
		if (td.length) ps(InstaViewPR.convert(td))
	}
	
	function parse_pre()
	{
		ps('<pre>')
		do endl(parse_inline_nowiki(ll[0].substring(1)) + "\n"); while (remain() && $(' '))
		ps('</pre>')
	}
	
	function parse_block_image()
	{
		ps(parse_image(sh()))
	}

	function parse_image(str)
	{
		var tag = str.substring(InstaViewPR.conf.locale.image.length + 3, str.length - 2);
		
		var width;
		var attr = [], filename, caption = '';
		var thumb=0, frame=0, center=0;
		var align='';
		
		if (tag.match(/\|/)) {
			// manage nested links
			var nesting = 0;
			var last_attr;
			for (var i = tag.length-1; i > 0; i--) {
				if (tag.charAt(i) == '|' && !nesting) {
					last_attr = tag.substr(i+1);
					tag = tag.substring(0, i);
					break;
				} else switch (tag.substr(i-1, 2)) {
					case ']]':
						nesting++;
						i--;
						break;
					case '[[':
						nesting--;
						i--;
				}
			}
			
			attr = tag.split(/\s*\|\s*/);
			attr.push(last_attr);
			filename = attr.shift();
			
			var w_match;
			
			for (;attr.length; attr.shift())
			if (w_match = attr[0].match(/^(\d*)px$/)) width = w_match[1]
			else switch(attr[0]) {
				case 'thumb':
				case 'thumbnail':
					thumb=true;
				case 'frame':
					frame=true;
					break;
				case 'none':
				case 'right':
				case 'left':
					center=false;
					align=attr[0];
					break;
				case 'center':
					center=true;
					align='none';
					break;
				default:
					if (attr.length == 1) caption = attr[0];
			}
			
		} else filename = tag;
		
		
		var o='';
		if (frame) {
			if (align=='') align = 'right';
			o += f("<div class='thumb t?'>", align);
			
			if (thumb) {
				if (!width) width = InstaViewPR.conf.wiki.default_thumb_width;
				
				o += f("<div style='width:?px;'>?", 2+width*1, make_image(filename, caption, width)) +
					f("<div class='thumbcaption'><div class='magnify' style='float:right'><a href='?' class='internal' title='Enlarge'><img src='?'></a></div>?</div>",
						InstaViewPR.conf.paths.articles + InstaViewPR.conf.locale.image + ':' + filename,
						InstaViewPR.conf.paths.magnify_icon,
						parse_inline_nowiki(caption)
					)
			} else {
				o += '<div>' + make_image(filename, caption) + f("<div class='thumbcaption'>?</div>", parse_inline_nowiki(caption))
			}
			
			o += '</div></div>';
			
		} else if (align != '') {
			o += f("<div class='float?'><span>?</span></div>", align, make_image(filename, caption, width));
		} else {
			return make_image(filename, caption, width);
		}
		
		return center? f("<div class='center'>?</div>", o): o;
	}
	
	function parse_inline_nowiki(str)
	{
		var start, lastend=0
		var substart=0, nestlev=0, open, close, subloop;
		var html='';
		
		while (-1 != (start = str.indexOf('<nowiki>', substart))) {
			html += parse_inline_wiki(str.substring(lastend, start));
			start += 8;
			substart = start;
			subloop = true;
			do {
				open = str.indexOf('<nowiki>', substart);
				close = str.indexOf('</nowiki>', substart);
				if (close<=open || open==-1) {
					if (close==-1) {
						return html + html_entities(str.substr(start));
					}
					substart = close+9;
					if (nestlev) {
						nestlev--;
					} else {
						lastend = substart;
						html += html_entities(str.substring(start, lastend-9));
						subloop = false;
					}
				} else {
					substart = open+8;
					nestlev++;
				}
			} while (subloop)
		}
		
		return html + parse_inline_wiki(str.substr(lastend));
	}
	
	function make_image(filename, caption, width)
	{
		// uppercase first letter in file name
		filename = filename.charAt(0).toUpperCase() + filename.substr(1);
		// replace spaces with underscores
		filename = filename.replace(/ /g, '_');
		
		caption = strip_inline_wiki(caption);
		
		var md5 = hex_md5(filename);
		
		var source = md5.charAt(0) + '/' + md5.substr(0,2) + '/' + filename;
		
		if (width) width = "width='" + width + "px'";
		
		var img = f("<img onerror=\"this.onerror=null;this.src='?'\" src='?' ? ?>", InstaViewPR.conf.paths.images_fallback + source, InstaViewPR.conf.paths.images + source, (caption!='')? "alt='" + caption + "'" : '', width);
		
		return f("<a class='image' ? href='?'>?</a>", (caption!='')? "title='" + caption + "'" : '', InstaViewPR.conf.paths.articles + InstaViewPR.conf.locale.image + ':' + filename, img);
	}
	
	function parse_inline_images(str)
	{
		var start, substart=0, nestlev=0;
		var loop, close, open, wiki, html;
		
		while (-1 != (start=str.indexOf('[[', substart))) {
			if(str.substr(start+2).match(RegExp('^' + InstaViewPR.conf.locale.image + ':','i'))) {
				loop=true;
				substart=start;
				do {
					substart+=2;
					close=str.indexOf(']]',substart);
					open=str.indexOf('[[',substart);
					if (close<=open||open==-1) {
						if (close==-1) return str;
						substart=close;
						if (nestlev) {
							nestlev--;
						} else {
							wiki=str.substring(start,close+2);
							html=parse_image(wiki);
							str=str.replace(wiki,html);
							substart=start+html.length;
							loop=false;
						}
					} else {
						substart=open;
						nestlev++;
					}
				} while (loop)
				
			} else break;
		}
		
		return str;
	}

	function parse_inline_formatting(str)
	{
		var em,st,i,li,o='';
		while ((i=str.indexOf("''",li))+1) {
			o += str.substring(li,i);
			li=i+2;
			if (str.charAt(i+2)=="'") {
				li++;
				st=!st;
				o+=st?'<strong>':'</strong>';
			} else {
				em=!em;
				o+=em?'<em>':'</em>';
			}
		}
		return o+str.substr(li);
	}
	
	function parse_inline_wiki(str)
	{
		var aux_match;
		
		str = parse_inline_images(str);
		str = parse_inline_formatting(str);

		while (aux_match = str.match(/<(?:)math>(.*?)<\/math>/i)) {
			var math_md5 = hex_md5(aux_match[1]);
			str = str.replace(aux_match[0], f("<img src='?.png'>", InstaViewPR.conf.paths.math+math_md5));
		}
		
		var date = new Date;
		var minutes = date.getUTCMinutes();
		if (minutes < 10) minutes = '0' + minutes;
		var date = f("?:?, ? ? ? (UTC)", date.getUTCHours(), minutes, date.getUTCDate(), InstaViewPR.conf.locale.months[date.getUTCMonth()], date.getUTCFullYear());

		return str.
			// signatures
			replace(/~{5}(?!~)/g, date).
			replace(/~{4}(?!~)/g, InstaViewPR.conf.user.name+' '+date).
			replace(/~{3}(?!~)/g, InstaViewPR.conf.user.name).
			
			// [[:Category:...]], [[:Image:...]], etc...
			replace(RegExp('\\[\\[:((?:'+InstaViewPR.conf.locale.category+'|'+InstaViewPR.conf.locale.image+'|'+InstaViewPR.conf.wiki.interwiki+'):.*?)\\]\\]','gi'), "<a href='"+InstaViewPR.conf.paths.articles+"$1'>$1</a>").
			replace(RegExp('\\[\\[(?:'+InstaViewPR.conf.locale.category+'|'+InstaViewPR.conf.wiki.interwiki+'):.*?\\]\\]','gi'),'').
			
			// [[/Relative links]]
			replace(/\[\[(\/[^|]*?)\]\]/g, f("<a href='?$1'>$1</a>", location)).
			
			// [[/Replaced|Relative links]]
			replace(/\[\[(\/.*?)\|(.+?)\]\]/g, f("<a href='?$1'>$2</a>", location)).
			
			// [[Common links]]
			replace(/\[\[([^|]*?)\]\](\w*)/g, f("<a href='?$1'>$1$2</a>", InstaViewPR.conf.paths.articles)).
			
			// [[Replaced|Links]]
			replace(/\[\[(.*?)\|([^\]]+?)\]\](\w*)/g, f("<a href='?$1'>$2$3</a>", InstaViewPR.conf.paths.articles)).
			
			// [[Stripped:Namespace|Namespace]]
			replace(/\[\[([^\]]*?:)?(.*?)( *\(.*?\))?\|\]\]/g, f("<a href='?$1$2$3'>$2</a>", InstaViewPR.conf.paths.articles)).
			
			// External links
			replace(/\[(https?|news|ftp|mailto|gopher|irc):(\/*)([^\]]*?) (.*?)\]/g, "<a href='$1:$2$3'>$4</a>").
			replace(/\[http:\/\/(.*?)\]/g, "<a href='http://$1'>[#]</a>").
			replace(/\[(news|ftp|mailto|gopher|irc):(\/*)(.*?)\]/g, "<a href='$1:$2$3'>$1:$2$3</a>").
			replace(/(^| )(https?|news|ftp|mailto|gopher|irc):(\/*)([^ $]*)/g, "$1<a href='$2:$3$4'>$2:$3$4</a>").
			
			replace('__NOTOC__','').
			replace('__NOEDITSECTION__','');
	}
	
	function strip_inline_wiki(str)
	{
		return str
			.replace(/\[\[[^\]]*\|(.*?)\]\]/g,'$1')
			.replace(/\[\[(.*?)\]\]/g,'$1')
			.replace(/''(.*?)''/g,'$1');
	}

	for (;remain();) if ($(/^(={1,6})(.*)\1(.*)$/)) {
		p=0
		endl(f('<h?>?</h?>?', $r[1].length, parse_inline_nowiki($r[2]), $r[1].length, $r[3]))
		
	} else if ($(/^[*#:;]/)) {
		p=0
		parse_list()
		
	} else if ($(' ')) {
		p=0
		parse_pre()
		
	} else if ($('{|')) {
		p=0
		parse_table()
		
	} else if ($(/^----+$/)) {
		p=0
		endl('<hr>')
		
	} else if ($(InstaViewPR.BLOCK_IMAGE)) {
		p=0
		parse_block_image()
		
	} else {
		
		// handle paragraphs
		if ($$('')) {
			if (p = (remain()>1 && ll[1]==(''))) endl('<p><br>')
		} else {
			if(!p) {
				ps('<p>')
				p=1
			}
			ps(parse_inline_nowiki(ll[0]) + ' ')
		}
		
		sh();
	}
	
	return o
}


/*
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.2-alpha Copyright (C) Paul Johnston 1999 - 2005
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */

var hexcase = 0;
var b64pad  = "";

function hex_md5(s)    { return rstr2hex(rstr_md5(str2rstr_utf8(s))); }
function b64_md5(s)    { return rstr2b64(rstr_md5(str2rstr_utf8(s))); }
function any_md5(s, e) { return rstr2any(rstr_md5(str2rstr_utf8(s)), e); }
function hex_hmac_md5(k, d)
  { return rstr2hex(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }
function b64_hmac_md5(k, d)
  { return rstr2b64(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }
function any_hmac_md5(k, d, e)
  { return rstr2any(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)), e); }

function rstr_md5(s)
{
  return binl2rstr(binl_md5(rstr2binl(s), s.length * 8));
}

function rstr_hmac_md5(key, data)
{
  var bkey = rstr2binl(key);
  if(bkey.length > 16) bkey = binl_md5(bkey, key.length * 8);

  var ipad = Array(16), opad = Array(16);
  for(var i = 0; i < 16; i++)
  {
    ipad[i] = bkey[i] ^ 0x36363636;
    opad[i] = bkey[i] ^ 0x5C5C5C5C;
  }

  var hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
  return binl2rstr(binl_md5(opad.concat(hash), 512 + 128));
}

function rstr2hex(input)
{
  var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
  var output = "";
  var x;
  for(var i = 0; i < input.length; i++)
  {
    x = input.charCodeAt(i);
    output += hex_tab.charAt((x >>> 4) & 0x0F)
           +  hex_tab.charAt( x        & 0x0F);
  }
  return output;
}

function rstr2b64(input)
{
  var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  var output = "";
  var len = input.length;
  for(var i = 0; i < len; i += 3)
  {
    var triplet = (input.charCodeAt(i) << 16)
                | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0)
                | (i + 2 < len ? input.charCodeAt(i+2)      : 0);
    for(var j = 0; j < 4; j++)
    {
      if(i * 8 + j * 6 > input.length * 8) output += b64pad;
      else output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F);
    }
  }
  return output;
}

function rstr2any(input, encoding)
{
  var divisor = encoding.length;
  var remainders = Array();
  var i, q, x, quotient;

  var dividend = Array(input.length / 2);
  for(i = 0; i < dividend.length; i++)
  {
    dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
  }

  while(dividend.length > 0)
  {
    quotient = Array();
    x = 0;
    for(i = 0; i < dividend.length; i++)
    {
      x = (x << 16) + dividend[i];
      q = Math.floor(x / divisor);
      x -= q * divisor;
      if(quotient.length > 0 || q > 0)
        quotient[quotient.length] = q;
    }
    remainders[remainders.length] = x;
    dividend = quotient;
  }

  var output = "";
  for(i = remainders.length - 1; i >= 0; i--)
    output += encoding.charAt(remainders[i]);

  return output;
}

function str2rstr_utf8(input)
{
  var output = "";
  var i = -1;
  var x, y;

  while(++i < input.length)
  {
    x = input.charCodeAt(i);
    y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;
    if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF)
    {
      x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
      i++;
    }

    if(x <= 0x7F)
      output += String.fromCharCode(x);
    else if(x <= 0x7FF)
      output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F),
                                    0x80 | ( x         & 0x3F));
    else if(x <= 0xFFFF)
      output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
                                    0x80 | ((x >>> 6 ) & 0x3F),
                                    0x80 | ( x         & 0x3F));
    else if(x <= 0x1FFFFF)
      output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
                                    0x80 | ((x >>> 12) & 0x3F),
                                    0x80 | ((x >>> 6 ) & 0x3F),
                                    0x80 | ( x         & 0x3F));
  }
  return output;
}

function str2rstr_utf16le(input)
{
  var output = "";
  for(var i = 0; i < input.length; i++)
    output += String.fromCharCode( input.charCodeAt(i)        & 0xFF,
                                  (input.charCodeAt(i) >>> 8) & 0xFF);
  return output;
}

function str2rstr_utf16be(input)
{
  var output = "";
  for(var i = 0; i < input.length; i++)
    output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF,
                                   input.charCodeAt(i)        & 0xFF);
  return output;
}

function rstr2binl(input)
{
  var output = Array(input.length >> 2);
  for(var i = 0; i < output.length; i++)
    output[i] = 0;
  for(var i = 0; i < input.length * 8; i += 8)
    output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (i%32);
  return output;
}

function binl2rstr(input)
{
  var output = "";
  for(var i = 0; i < input.length * 32; i += 8)
    output += String.fromCharCode((input[i>>5] >>> (i % 32)) & 0xFF);
  return output;
}

function binl_md5(x, len)
{
  x[len >> 5] |= 0x80 << ((len) % 32);
  x[(((len + 64) >>> 9) << 4) + 14] = len;

  var a =  1732584193;
  var b = -271733879;
  var c = -1732584194;
  var d =  271733878;

  for(var i = 0; i < x.length; i += 16)
  {
    var olda = a;
    var oldb = b;
    var oldc = c;
    var oldd = d;
    a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
    d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
    c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);
    b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
    a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
    d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);
    c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
    b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
    a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
    d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
    c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
    b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
    a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);
    d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
    c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
    b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);
    a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
    d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
    c = md5_gg(c, d, a, b, x[i+11], 14,  643717713);
    b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
    a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
    d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);
    c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
    b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
    a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
    d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
    c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
    b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);
    a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
    d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
    c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);
    b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
    a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
    d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
    c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562);
    b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
    a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
    d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);
    c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
    b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
    a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);
    d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
    c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
    b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);
    a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
    d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
    c = md5_hh(c, d, a, b, x[i+15], 16,  530742520);
    b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
    a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
    d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);
    c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
    b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
    a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);
    d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
    c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
    b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
    a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
    d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
    c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
    b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649);
    a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
    d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
    c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);
    b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);

    a = safe_add(a, olda);
    b = safe_add(b, oldb);
    c = safe_add(c, oldc);
    d = safe_add(d, oldd);
  }
  return Array(a, b, c, d);
}

function md5_cmn(q, a, b, x, s, t){
  return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
}
function md5_ff(a, b, c, d, x, s, t){
  return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
}
function md5_gg(a, b, c, d, x, s, t){
  return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
}
function md5_hh(a, b, c, d, x, s, t){
  return md5_cmn(b ^ c ^ d, a, b, x, s, t);
}
function md5_ii(a, b, c, d, x, s, t){
  return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
}

function safe_add(x, y)
{
  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return (msw << 16) | (lsw & 0xFFFF);
}

function bit_rol(num, cnt)
{
  return (num << cnt) | (num >>> (32 - cnt));
}

// </nowiki>
// ENDFILE: livepreview.js

// <pre> STARTFILE: mos.js
function MOS_format(){
    var qt = String.fromCharCode(34), closetag = "(([^<]|<[^/]|</[^r]|</r[^e]|</re[^f]|</ref[^>])*?)</ref>", facttags = "({{[ ]*fact[ ]*}}|{{[ ]*citequote[ ]*}}|{{[ ]*citation needed[ ]*}}|{{[ ]*cn[ ]*}}|{{[ ]*verification needed[ ]*}}|{{[ ]*verify source[ ]*}}|{{[ ]*GR[ ]*[\|][ ]*[^ ]+[ ]*}}|{{[ ]*[c]?r[e]?f[ ]*[\|][^}]*}}|{{[ ]*ref[ _]label[ ]*[\|][^}]*}})";
    var txt = document.editform.wpTextbox1;
    
    // *-*-*-*-*-*-*-*-*-*-*- // specifically: unitformatter.js, units_nbsp.js, and dates.js 
    // scripts from Bobblewik //
    // *-*-*-*-*-*-*-*-*-*-*- // 
    if(context_PR){
	    txt.value = txt.value
	    // century without AD,BC etc
	    .replace(/\[\[(\d{1,2}(?:st|nd|rd|th))[ \-]century\]\]/gi, '$1 century')
	    .replace(/\[\[\d{1,2}(?:st|nd|rd|th)[ \-]century\|(\d{1,2}(?:st|nd|rd|th))\]\]/gi, '$1')
	    .replace(/\[\[\d{1,2}(?:st|nd|rd|th)[ \-]century\|(\d{1,2}(?:st|nd|rd|th))[ \-]century\]\]/gi, '$1 century')
	    .replace(/\[\[\d{1,2}(?:st|nd|rd|th)[ \-]century\|(\d{1,2}(?:st|nd|rd|th))[ \-]centuries\]\]/gi, '$1 centuries')
	    // century with AD,BC etc
	    .replace(/\[\[(\d{1,2}(?:st|nd|rd|th))[ \-]century\s(AD|BC|CE|BCE)\]\]/gi, '$1 century $2')
	    .replace(/\[\[\d{1,2}(?:st|nd|rd|th)[ \-]century\|(\d{1,2}(?:st|nd|rd|th))[ \-]century\s(AD|BC|CE|BCE)\]\]/gi, '$1 century $2')
	    .replace(/\[\[\d{1,2}(?:st|nd|rd|th)[ \-]century\|(\d{1,2}(?:st|nd|rd|th))[ \-]centuries\s(AD|BC|CE|BCE)\]\]/gi, '$1 centuries $2')
	        //year:text on left, text on right
	    .replace(/([\w\(\)=:.'\*\|\&]\s?,?\-?\s?)\[\[(\d{1,4})\]\](\s?,?\-?\s?[\w\(\)=:.'\*\|\&])/gi, '$1$2$3')
	        //year:avoid links on left, text on right
	    .replace(/([^\]]{4})\[\[(\d{1,4})\]\](\s?,?\-?\s?[\w\(\)=:.'\*\|\&])/gi, '$1$2$3')
	        //year pair: avoid links on left, text on right
	    .replace(/([^\]]{4})\[\[(\d{1,4})\]\](.?.?.?.?.?.?)\[\[(\d{1,4})\]\](\s?,?\-?\s?[\w\(\)=:.'\*\|\&])/gi, '$1$2$3$4$5')
	        //year:avoid links on both sides    
	    .replace(/([^\]]{4})\[\[(\d{1,4})\]\]([^\[]{4})/gi, '$1$2$3')
	    .replace(/([^\]]{4})\[\[(\d{1,4})\]\](\s?,?\-?\s?\[\[(?:[^jfmasond\d]|.[^aepuco\d\s]|..[^jfmasondbrylgptvc \s\-]))/gi, '$1$2$3')
	    //year: examine characters in link on left for date, avoid links on right
	    .replace(/((?:[^yhletramub\s]..|[^rcianlse\d\s].|[^yhletr\d])\]\]\s?,?\-?\s?)\[\[(\d{1,4})\]\]([^\[]{4})/gi, '$1$2$3')
	    .replace(/([\w\(\)=:.'\*\|\&]\s?,?\-?\s?|\n)\[\[(\d{1,4})\]\]([^\[]{4}|\n)/gi, '$1$2$3')
	    .replace(/([\w\(\)=:.'\*\|\&]\s?,?\-?\s?|\n)\[\[(\d{1,4})\]\]([^\[]{4}|\n)/gi, '$1$2$3');
	}
    
    txt.value = txt.value
    .replace(/(\d(?:st|nd|rd|th))[ \-]Century/gi, '$1 century')

    // piped decades and years
    .replace(/\[\[(\d{1,4}\'?s)\]\]/gi, '$1')
    .replace(/\[\[(\d{1,4}s? (?:AD|BC|CE|BCE))\]\]/gi, '$1')
    .replace(/\[\[\d{1,4}s? (?:AD|BC|CE|BCE)\|(\d{1,4})\]\]/gi, '$1')
    .replace(/\[\[\d{1,4}s? (?:AD|BC|CE|BCE)\|(\d{1,4}s? (?:AD|BC|CE|BCE))\]\]/gi, '$1')
    .replace(/\[\[\d{1,4}s?\|(\d{1,4}s? (?:AD|BC|CE|BCE))\]\]/gi, '$1')
    .replace(/\[\[\d{1,4}s?\|(\d{1,2}s?)\]\]/gi, '$1')

    // months
    .replace(/\[\[(January|February|March|April|May|June|July|August|September|October|November|December)\]\]/gi, '$1')
    .replace(/\[\[January\|(Jan)\]\]/gi, '$1')
    .replace(/\[\[February\|(Feb)\]\]/gi, '$1')
    .replace(/\[\[March\|(Mar)\]\]/gi, '$1')
    .replace(/\[\[April\|(Apr)\]\]/gi, '$1')
    .replace(/\[\[May\|(May)\]\]/gi, '$1')
    .replace(/\[\[June\|(Jun)\]\]/gi, '$1')
    .replace(/\[\[July\|(Jul)\]\]/gi, '$1')
    .replace(/\[\[August\|(Aug)\]\]/gi, '$1')
    .replace(/\[\[September\|(Sep)\]\]/gi, '$1')
    .replace(/\[\[October\|(Oct)\]\]/gi, '$1')
    .replace(/\[\[November\|(Nov)\]\]/gi, '$1')
    .replace(/\[\[December\|(Dec)\]\]/gi, '$1')

    //month+year
    .replace(/\[\[((?:January|February|March|April|May|June|July|August|September|October|November|December) \d{3,4})\]\]/gi, '$1')
    //Month+day_number "March 7th" -> "March 7"
    .replace(/\[\[(January|February|March|April|May|June|July|August|September|October|November|December) (\d?\d)(?:th|st|nd|rd)\]\]/gi, '\[\[$1 $2\]\]')
    .replace(/\[\[((?:January|February|March|April|May|June|July|August|September|October|November|December) \d?\d)\]\](?:th|st|nd|rd)/gi, '\[\[$1\]\]')
    .replace(/\[\[(\d?\d)(?:th|st|nd|rd) (January|February|March|April|May|June|July|August|September|October|November|December)\]\]/gi, '\[\[$1 $2\]\]')
    //Month+day_number piped into number. Preferences do not work. They don't work in sequence because digits in the two dates must be adjacent
    .replace(/([^\[]{4})\[\[((?:January|February|March|April|May|June|July|August|September|October|November|December) \d?\d)\]\](\s?\-?\s?)\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}\|(\d{1,2})\]\]/gi, '$1$2$3$4')
    //same again but with ndash or mdash instead of hyphen
    .replace(/([^\[]{4})\[\[((?:January|February|March|April|May|June|July|August|September|October|November|December) \d?\d)\]\](\s?&[nm]dash\s?)\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}\|(\d{1,2})\]\]/gi, '$1$2$3$4')
    //same again but with slash instead of hyphen
    .replace(/([^\[]{4})\[\[((?:January|February|March|April|May|June|July|August|September|October|November|December) \d?\d)\]\](\/)\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}\|(\d{1,2})\]\]/gi, '$1$2$3$4')

    .replace(/([^\[]{4})\[\[((?:January|February|March|April|May|June|July|August|September|October|November|December) \d?\d)\]\](\s?\-?\s?)\[\[(\d{1,2})\]\]/gi, '$1$2$3$4')
    //same again but with ndash instead of hyphen
    .replace(/([^\[]{4})\[\[((?:January|February|March|April|May|June|July|August|September|October|November|December) \d?\d)\]\](\s?&[nm]dash\s?)\[\[(\d{1,2})\]\]/gi, '$1$2$3$4')
    //same again but with slash instead of hyphen
    .replace(/([^\[]{4})\[\[((?:January|February|March|April|May|June|July|August|September|October|November|December) \d?\d)\]\](\/)\[\[(\d{1,2})\]\]/gi, '$1$2$3$4')

    .replace(/([^\[]{4})\[\[(\d?\d) (?:January|February|March|April|May|June|July|August|September|October|November|December)\]\](\s?\-?\s?)\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}\|(\d{1,2})\]\]/gi, '$1$2$3$4')
    //same again but with ndash instead of hyphen
    .replace(/([^\[]{4})\[\[(\d?\d) (?:January|February|March|April|May|June|July|August|September|October|November|December)\]\](\s?&[nm]dash\s?)\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}\|(\d{1,2})\]\]/gi, '$1$2$3$4')
    //same again but with slash instead of hyphen
    .replace(/([^\[]{4})\[\[(\d?\d) (?:January|February|March|April|May|June|July|August|September|October|November|December)\]\](\/)\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}\|(\d{1,2})\]\]/gi, '$1$2$3$4')

    .replace(/([^\[]{4})\[\[(\d?\d) (?:January|February|March|April|May|June|July|August|September|October|November|December)\]\](\s?\-?\s?)\[\[(\d{1,2})\]\]/gi, '$1$2$3$4')
    //same again but with ndash instead of hyphen
    .replace(/([^\[]{4})\[\[(\d?\d) (?:January|February|March|April|May|June|July|August|September|October|November|December)\]\](\s?&[nm]dash\s?)\[\[(\d{1,2})\]\]/gi, '$1$2$3$4')
    //same again but with slash instead of hyphen
    .replace(/([^\[]{4})\[\[(\d?\d) (?:January|February|March|April|May|June|July|August|September|October|November|December)\]\](\/)\[\[(\d{1,2})\]\]/gi, '$1$2$3$4')

    .replace(/\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}\|(\d{1,2})\]\]/gi, '$1')
    .replace(/\[\[\d{1,2} (?:January|February|March|April|May|June|July|August|September|October|November|December)\|(\d{1,2})\]\]/gi, '$1')

    .replace(/\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}\|((?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{1,2})\]\]/gi, '$1')

    // solitary day_numbers
    .replace(/\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}\|(\d{1,2}(?:th|st|nd|rd))\]\]/gi, '$1')
    .replace(/\[\[\d{1,2} (?:January|February|March|April|May|June|July|August|September|October|November|December)\|(\d{1,2}(?:th|st|nd|rd))\]\]/gi, '$1')
    .replace(/\[\[(\d{1,2}(?:st|nd|rd|th))\]\]/gi, '$1')

    // days of the week in full. Optional plurals
    .replace(/\[\[(Mondays?|Tuesdays?|Wednesdays?|Thursdays?|Fridays?|Saturdays?|Sundays?)\]\]/gi, '$1')
    // days of the week abbreviated. Leave out 'Sun' as potentially valid link to the Sun. Leave out 'SAT' in upper case as potential link to 'Scholastic achievement/aptitude test'.
    .replace(/\[\[(Mon|Tue|Tues|Wed|Thu|Thur|Thurs|Fri)\]\]/gi, '$1')
    .replace(/\[\[(Sat)\]\]/g, '$1')
    .replace(/\[\[Mondays?\|(Mondays?)\]\]/gi, '$1')
    .replace(/\[\[Tuesdays?\|(Tuesdays?)\]\]/gi, '$1')
    .replace(/\[\[Wednesdays?\|(Wednesdays?)\]\]/gi, '$1')
    .replace(/\[\[Thursdays?\|(Thursdays?)\]\]/gi, '$1')
    .replace(/\[\[Fridays?\|(Fridays?)\]\]/gi, '$1')
    .replace(/\[\[Saturdays?\|(Saturdays?)\]\]/gi, '$1')
    .replace(/\[\[Sundays?\|(Sundays?)\]\]/gi, '$1')

    //4 digit years piped into 2
    .replace(/\[\[\d{1,4}\|(\d{1,2})\]\]/gi, '$1')

    //year pair: examine characters in link on left for date, examine characters in link on right for date
    .replace(/((?:[^yhletramub\s]..|[^rcianlse\d\s].|[^yhletr\d])\]\]\s?,?\-?\s?)\[\[(\d{1,4})\]\](.?.?.?.?.?.?)\[\[(\d{1,4})\]\](\s?,?\-?\s?\[\[(?:[^jfmasond\d]|.[^aepuco\d\s]|..[^jfmasondbrylgptvc\s\-]))/gi, '$1$2$3$4$5')
    //year pair: examine characters in link on left for date, avoid links on right
    .replace(/((?:[^yhletramub\s]..|[^rcianlse\d\s].|[^yhletr\d])\]\]\s?,?\-?\s?)\[\[(\d{1,4})\]\](.?.?.?.?.?.?)\[\[(\d{1,4})\]\]([^\[]{4})/gi, '$1$2$3$4$5')
    //year pair: check for line-ends, text on left, avoid links on right
    .replace(/([\w\(\)=:.'\*\|\&]\s?,?\-?\s?)\[\[(\d{1,4})\]\](.?.?.?.?.?.?)\[\[(\d{1,4})\]\]([^\[]{4}|\n)/gi, '$1$2$3$4$5')
    //year pair: avoid links on left, examine characters in link on right for date
    .replace(/([^\]]{4})\[\[(\d{1,4})\]\](.?.?.?.?.?.?)\[\[(\d{1,4})\]\](\s?,?\-?\s?\[\[(?:[^jfmasond\d]|.[^aepuco\d\s]|..[^jfmasondbrylgptvc \s\-]))/gi, '$1$2$3$4$5')
    //year pair: avoid links on left, text on right
    .replace(/([\w\(\)=:.'\*\|\&]\s?,?\-?\s?)\[\[(\d{1,4})\]\](.?.?.?.?.?.?)\[\[(\d{1,4})\]\](\s?,?\-?\s?[\w\(\)=:.'\*\|\&])/gi, '$1$2$3$4$5')
    //year:avoid links on left, hyphen but no digits (to avoid ISO date) in link on right. Currently suspended because it isn't fully tested.
    //year pair: avoid links on both sides
    .replace(/([^\]]{4})\[\[(\d{1,4})\]\](.?.?.?.?.?.?)\[\[(\d{1,4})\]\]([^\[]{4})/gi, '$1$2$3$4$5')
    //'present'
    .replace(/\[\[Present \(time\)\|(Present)\]\]/gi, '$1')
    //Eliminate 'surprise links' also known as 'easter egg links'
    .replace(/\[\[\d{1,4}s?\sin\s[^\|]{1,30}\|(\d{1,4}s?)\]\]/gi, '$1')
    // Convert degree symbols into ° symbol, ensure preceding space
    .replace(/&deg;/g, '°')
    .replace(/º/g, '°')
    // Celsius spelling errors
    .replace(/celsius/gi, 'Celsius')
    .replace(/celcius/gi, 'Celsius')
    //Fix common naming error (be careful with this one)
    .replace(/centigrade/gi, 'Celsius')
    //Celsius
    //.replace(/\[\[(celsius)\]\]/gi, '$1')
    //.replace(/\[\[celsius\|([^\]]{1,30})\]\]/gi, '$1')
    //Fahrenheit
    //.replace(/\[\[(Fahrenheit)\]\]/gi, '$1')
    //.replace(/\[\[Fahrenheit\|([^\]]{1,30})\]\]/gi, '$1')
    //Celsius or Fahrenheit
    .replace(/°\s([CF])/g, '°$1')
    .replace(/°\s?(celsius)/gi, '°C')
    .replace(/(\d)\s?(°[CF])/g, '$1 $2')
    .replace(/deg[^\(]([CF])/gi, '°$1')
    .replace(/deg\s([CF])/gi, '°$1')
    .replace(/deg\.?\s?([CF])/gi, '°$1')
    .replace(/degrees?\s([CF])(\W)/gi, '°$1$2')
    .replace(/(\d)\s?°&nbsp;([CF])/g, '$1 °$2')
    // Convert &sup to superscript
    .replace(/&sup2;/g, '²')
    .replace(/&sup3;/g, '³')
    // Convert micro symbol to actual micro symbol, make sure it's spaced
    .replace(/(\d)\s?(&mu;|µ|&micro;)(g|s|m|A|K|mol|cd|rad|sr|Hz|N|J|W|Pa|lm|lx|C|V|O|F|Wb|T|H|S|Bq|Gy|Sv|kat|M)(\W)/g, '$1 µ$3$4')
    //metre
    //.replace(/\[\[(metres?)\]\]/gi, '$1')
    //.replace(/\[\[(meters?)\]\]/gi, '$1')
    //.replace(/\[\[metres?\|([^\]]{1,30})\]\]/gi, '$1')
    //space before 'm' only when lower case
    .replace(/(\d)\s?m(\W)/g, '$1 m$2')
    .replace(/(\d)\-m(\W)/g, '$1 m$2')
    .replace(/(\d)\s?sq\.?\s?m(\W)/gi, '$1 m²$2')
    .replace(/(\d)\-?sq\-?m(\W)/gi, '$1 m²$2')
    .replace(/m²\.\)/gi, 'm²)')
    // millimetre
    //.replace(/\[\[(mm)\]\]/gi, '$1')
    //.replace(/\[\[(millimetres?)\]\]/gi, '$1')
    //.replace(/\[\[(millimeters?)\]\]/gi, '$1')
    //.replace(/\[\[millimetres?\|([^\]]{1,30})\]\]/gi, '$1')
    //.replace(/\[\[millimeters?\|([^\]]{1,30})\]\]/gi, '$1')
    .replace(/(\d)\s?mm(\W)/g, '$1 mm$2')
    .replace(/(\d)\-mm(\W)/g, '$1 mm$2')
    // centimetre
    //.replace(/\[\[(cm)\]\]/gi, '$1')
    //.replace(/\[\[(centimetres?)\]\]/gi, '$1')
    //.replace(/\[\[(centimeters?)\]\]/gi, '$1')
    //.replace(/\[\[centimetres?\|([^\]]{1,30})\]\]/gi, '$1')
    //.replace(/\[\[centimeters?\|([^\]]{1,30})\]\]/gi, '$1')
    // kilometre
    //.replace(/\[\[(km)\]\]/gi, '$1')
    //.replace(/\[\[(kilometres?)\]\]/gi, '$1')
    //.replace(/\[\[(kilometers?)\]\]/gi, '$1')
    //.replace(/\[\[kilometres?\|([^\]]{1,30})\]\]/gi, '$1')
    //.replace(/\[\[kilometers?\|([^\]]{1,30})\]\]/gi, '$1')
    .replace(/(\d)\s?kms?(\W)/gi, '$1 km$2')
    .replace(/(\d)\-kms?(\W)/gi, '$1 km$2')
    .replace(/(\d)&nbsp;kms?(\W)/gi, '$1&nbsp;km$2')
    //square kilometre
    //.replace(/\[\[square kilometres?\|([^\]]{1,30})\]\]/gi, '$1')
    .replace(/(\d)\s?sq\.?\s?kms?/gi, '$1 km²')
    .replace(/sq\.?\s?kms?/gi, 'km²')
    // kilometre per hour
    .replace(/km\/hr(\W)/gi, 'km/h$1')
    .replace(/kph(\W)/gi, 'km/h$1')
    .replace(/kmph(\W)/gi, 'km/h$1')
    .replace(/(\d)\s?kmh/gi, '$1 km/h')
    .replace(/km\/h/gi, 'km/h')
    .replace(/(\d)\s?km\/h/gi, '$1 km/h')
    .replace(/(\d)\-km\/h/gi, '$1 km/h')
    .replace(/(\d)&nbsp;km\/h/gi, '$1&nbsp;km/h')
    // cubic centimetre
    .replace(/(\d)\s?cm(\W)/gi, '$1 cm$2')
    .replace(/(\d)\s?cc(\W)/gi, '$1 cc$2')
    .replace(/(\d)\-cc(\W)/gi, '$1 cc$2')
    // millilitre
    .replace(/(\d)\s?ml(\W)/g, '$1 ml$2')
    .replace(/(\d)\-ml(\W)/g, '$1 ml$2')
    // second
    .replace(/\[\[(s)\]\]/gi, '$1')
    .replace(/\[\[(seconds?)\]\]/gi, '$1')
    .replace(/\[\[seconds?\|([^\]]{1,30})\]\]/gi, '$1')
    .replace(/\/sec(\W)/gi, '/s$1')
    .replace(/\/sec\)/gi, '/s)$1')
    .replace(/(\d)\s?ft\/second/gi, '$1 ft/s')
    .replace(/(\d)\s?m\/second/gi, '$1 m/s')
    .replace(/(\d)\s?km\/sec(\W)/gi, '$1 km/s$2')
    .replace(/frames\/s(\W)/gi, 'frame/s$1')
    //minute
    .replace(/\[\[(min)\]\]/gi, '$1')
    .replace(/\[\[(minutes?)\]\]/gi, '$1')
    .replace(/\[\[minutes?\|([^\]]{1,30})\]\]/gi, '$1')
    // hour
    .replace(/\[\[(h)\]\]/gi, '$1')
    .replace(/\[\[(hours?)\]\]/gi, '$1')
    .replace(/\[\[hours?\|([^\]]{1,30})\]\]/gi, '$1')
    .replace(/\/hr(\W)/gi, '/h$1')
    //day
    .replace(/\[\[(d)\]\]/gi, '$1')
    .replace(/\[\[(days?)\]\]/gi, '$1')
    .replace(/\[\[days?\|([^\]]{1,30})\]\]/gi, '$1')
    // kilogram
    .replace(/(kilogram)me/gi, '$1')
    .replace(/(\W)(gram)mes?(\W)/gi, '$1$2$3')
    //.replace(/\[\[(grams?)\]\]/gi, '$1')
    //.replace(/\[\[grams?\|([^\]]{1,30})\]\]/gi, '$1')
    //.replace(/\[\[(kg)\]\]/gi, '$1')
    //.replace(/\[\[(kilograms?)\]\]/gi, '$1')
    //.replace(/\[\[kilograms?\|([^\]]{1,30})\]\]/gi, '$1')
    .replace(/(\d)\s?kg(\W)/gi, '$1 kg$2')
    .replace(/(\d)\-kg(\W)/gi, '$1 kg$2')
    // newton metre
    //.replace(/(\W)N[-.·•\/]m(\W)/gi, '$1N·m$2')
    // kilowatt
    .replace(/(\d)\s?kW(\W)/gi, '$1 kW$2')
    .replace(/(\d)\-kW(\W)/gi, '$1 kW$2')
    // Hertz
    .replace(/(\d)\s?(G|M|k)?hz/gi, '$1 $2Hz')
    .replace(/(\d)\-(G|M|k)?hz/gi, '$1 $2Hz')
    .replace(/khz/gi, 'kHz')
    // ohm
    .replace(/(\d)\s?(Y|Z|E|P|T|G|M|k|K|h|da|d|c|m|µ|µ|µ|n|p|f|a|z|y)?\s?(&Omega|ohm|Ohm)s?(\W)/g, '$1 $2O$4')
    // pound weight
    //.replace(/(\d)\s?(\[\[lbs?\]\])/gi, '$1 lb')
    //.replace(/\[\[\pound\s\(mass\)\|([^\]]{1,30})\]\]/gi, '$1')
    .replace(/(\d)\s?lbs?/gi, '$1 lb')
    .replace(/(\d\+?)\s?lbs?/gi, '$1 lb')
    .replace(/(\d)&nbsp;lbs?/gi, '$1&nbsp;lb')
    .replace(/(\d)\slb.\)/gi, '$1 lb)')
    //inch
    //.replace(/\[\[(inch)\]\]/gi, '$1')
    //.replace(/\[\[(inches)\]\]/gi, '$1')
    //.replace(/\[\[inch\|([^\]]{1,30})\]\]/gi, '$1')
    //.replace(/\[\[inches\|([^\]]{1,30})\]\]/gi, '$1')
    //foot
    //.replace(/\[\[foot\s\(unit\sof\slength\)\|([^\]]{1,30})\]\]/gi, '$1')
    .replace(/(\d)\s?ft(\W)/gi, '$1 ft$2')
    .replace(/(\d)\-ft(\W)/gi, '$1 ft$2')
    .replace(/(\W)ft\.\)/gi, '$1ft)')
    // square foot
    .replace(/sq\.?\s?ft(\W)/gi, 'sq ft$1')
    // foot and inch
    //.replace(/([^°h]{1,4})(\d{1,4})\s?['’]\s?(\d{1,3})\s?["”]([^NESW])/g, '$1$2 ft $3 in$4')
    .replace(/(ength[.]{1,3})(\d{1,4})\s?['’]\s?(\d{1,3})\s?["”]/gi, '$1$2 ft $3 in')
    .replace(/(idth[.]{1,3})(\d{1,4})\s?['’]\s?(\d{1,3})\s?["”]/gi, '$1$2 ft $3 in')
    .replace(/([\(\|:]\s?\d{1,4})\s?['’]\s?(\d{1,3})\s?["”]([^NESW])/g, '$1 ft $2 in$3')
    .replace(/(\d)\s?ft\s?(\d{1,3})\s?in/gi, '$1 ft $2 in')
    // yard
    .replace(/(\d)\s?yds(\W)/gi, '$1 yd$2')
    .replace(/(\d)&nbsp;yds(\W)/gi, '$1&nbsp;yd$2')
    .replace(/sq\.?\s?yds?/gi, 'sq yd')
    .replace(/yd\.\)/gi, 'yd)')
    // mile and mile per hour
    //.replace(/\[\[miles?\|([^\]]{1,30})\]\]/gi, '$1')
    //.replace(/\[\[(miles?)\]\]/gi, '$1')
    .replace(/m\.p\.h\.(\W)/g, 'mph$1')
    .replace(/(\W)mph(\W)/gi, '$1mph$2')
    .replace(/(\d)\s?mph/gi, '$1 mph')
    .replace(/(\d)\-mph/gi, '$1 mph')
    // square mile
    .replace(/sq\.?\s?mi/gi, 'sq mi')
    // foot pound
    .replace(/ftlbs?(\W)/gi, 'ft·lbf$1')
    .replace(/ft[ -.·•\/]lb(\W)/gi, 'ft·lbf$1')
    .replace(/ft[ -.·•\/]lbs/gi, 'ft·lbf')
    .replace(/ft[ -.·•\/]lbf/gi, 'ft·lbf')
    .replace(/ft[ -.·•\/]lbff/gi, 'ft·lbf')
    // Give digital value a percent symbol '%' instead of word
    .replace(/(\d)\s?per ?cent([^aei])/gi, '$1%$2')
    .replace(/(\d)\-per ?cent([^aei])/gi, '$1%$2')
    // knot
    .replace(/(\d)\s?kts(\W)/gi, '$1 knots$2')
    .replace(/(\d)\s?knt(\W)/gi, '$1 knots$2')
    // horsepower
    .replace(/(\d)\s?hp(\W)/gi, '$1 hp$2')
    .replace(/(\d)\s?bhp/gi, '$1 bhp')
    .replace(/(\d)\s?shp/gi, '$1 shp')
    // rpm
    .replace(/(\d)\s?rpm/gi, '$1 rpm')
    .replace(/(\d)\-rpm/gi, '$1 rpm')
    // decibel
    .replace(/(\d)\s?(dB)\b/g, '$1 $2')
    // bits per second
    .replace(/([KkMmGg])(bps|bits?\/s|b\/s)/g, '$1bit/s')
    .replace(/(\d)\s?(bps)/gi, '$1 bit/s')
    .replace(/(\d)&nbsp;bps/gi, '$1&nbsp;bit/s')
    .replace(/bits?\/sec(\W)/gi, 'bit/s$1')
    // bytes per second
    .replace(/([KkMmGg])(Bps|bytes?\/s)/g, ' $1B/s')
    .replace(/bytes?\/s(\W)/gi, 'B/s$1')
    // capitalization of prefix with bits and bytes
    .replace(/K(bit|B)\/s/g, 'k$1/s')
    .replace(/m(bit|B)\/s/g, 'M$1/s')
    .replace(/g(bit|B)\/s/g, 'G$1/s')
    // space with bits and bytes
    .replace(/(\d)\s?(k|M|G)(bit|B)/g, '$1 $2$3')
    // Common error with bits and bytes
    .replace(/mibi(bit|byte)/g, 'mebi$1')
    //Remove 'Easter egg' diversions (linking unit name to orders of magnitude articles)
    .replace(/\[\[1\s?_?E\s?\-?\d{1,2}\s?..?\|([^\]]{1,50})\]\]/gi, '$1')
    .replace(/\[\[Orders\sof\smagnitude\s\([^\)]{1,30}\)\|([^\]]{1,50})\]\]/gi, '$1')
     // Convert degree symbols into ° symbol, ensure preceding space
    .replace(/&deg;/g, '°')
    .replace(/º/g, '°')
    .replace(/°\s?([CF])/g, '°$1')
    .replace(/°\s?(celsius)/gi, '°C')
    .replace(/(\d)\s?(°[CF])/g, '$1&nbsp;$2')
    //Fix spelling errors
    .replace(/celsius/gi, 'Celsius')
    .replace(/celcius/gi, 'Celsius')
    //Fix common naming error (be careful with this one)
    .replace(/centigrade/gi, 'Celsius')
    // Convert &sup into superscript ² symbol
    .replace(/&sup2;/g, '²')
    .replace(/&sup3;/g, '³')
    // Convert the word ohm(s) or the html entity into the actual O symbol (Omega, not the actual ohm symbol &#8486) and make sure it is spaced
    .replace(/(\d)\s?(Y|Z|E|P|T|G|M|k|K|h|da|d|c|m|µ|µ|µ|n|p|f|a|z|y)?\s?(&Omega|ohm|Ohm)s?([\s,.:\)\(\\/)])/g, '$1&nbsp;$2O$4')
    // Convert various micro symbols into the actual micro symbol, make sure it's spaced
    .replace(/(\d)\s?(&mu;|µ|&micro;)(g|s|m|A|K|mol|cd|rad|sr|Hz|N|J|W|Pa|lm|lx|C|V|O|F|Wb|T|H|S|Bq|Gy|Sv|kat|M)([\s,.:\)\(\\/)])/g, '$1&nbsp;µ$3$4')
    // Convert capital K to lowercase k in units
    .replace(/(\d)\s?K(g|s|m|A|K|mol|cd|rad|sr|Hz|N|J|W|Pa|lm|lx|C|V|O|F|Wb|T|H|S|Bq|Gy|Sv|kat|M)([\s,.:\)\(\\/)])/g, '$1&nbsp;k$2$3')
    .replace(/(\d)\-K(g|s|m|A|K|mol|cd|rad|sr|Hz|N|J|W|Pa|lm|lx|C|V|O|F|Wb|T|H|S|Bq|Gy|Sv|kat|M)([\s,.:\)\(\\/)])/g, '$1&nbsp;k$2$3')
    .replace(/(\d)&nbsp;K(g|s|m|A|K|mol|cd|rad|sr|Hz|N|J|W|Pa|lm|lx|C|V|O|F|Wb|T|H|S|Bq|Gy|Sv|kat|M)([\s,.:\)\(\\/)])/g, '$1&nbsp;k$2$3')
    // Hertz
    .replace(/(\d)\s?(Y|Z|E|P|T|G|M|k|K|h|da|d|c|m|µ|µ|µ|n|p|f|a|z|y)?hz/gi, '$1&nbsp;$2Hz')
    .replace(/(\d)\-(Y|Z|E|P|T|G|M|k|K|h|da|d|c|m|µ|µ|µ|n|p|f|a|z|y)?hz/gi, '$1&nbsp;$2Hz')
    // Fix kilometres
    .replace(/(\d)\s?kms?([\s,.:\)\(\\/)])/gi, '$1&nbsp;km$2')
    .replace(/(\d)\-kms?([\s,.:\)\(\\/)])/gi, '$1&nbsp;km$2')
    .replace(/(\d)&nbsp;kms?([\s,.:\)\(\\/)])/gi, '$1&nbsp;km$2')
    .replace(/(\d)\s?sq\.?\s?kms?/gi, '$1&nbsp;km²')
    .replace(/sq\.?\s?kms?/gi, 'km²')
    .replace(/(\d)\s?sq\.?\s?m([^i])/gi, '$1&nbsp;m²$2')
    .replace(/m²\.\)/gi, 'm²)')
    // Standardise kilometres per hour
    .replace(/km\/hr/gi, 'km/h')
    .replace(/kph/gi, 'km/h')
    .replace(/kmph/gi, 'km/h')
    .replace(/(\d)\s?kmh/gi, '$1&nbsp;km/h')
    .replace(/km\/h/gi, 'km/h')
    .replace(/(\d)\s?km\/h/gi, '$1&nbsp;km/h')
    .replace(/(\d)\-km\/h/gi, '$1&nbsp;km/h')
    .replace(/(\d)&nbsp;km\/h/gi, '$1&nbsp;km/h')
    // Standardise 'per second'
    .replace(/(\d)\s?ft\/second/gi, '$1&nbsp;ft/s')
    .replace(/(\d)\s?ft\/sec/gi, '$1&nbsp;ft/s')
    .replace(/(\d)\s?m\/second/gi, '$1&nbsp;m/s')
    .replace(/(\d)\s?m\/sec/gi, '$1&nbsp;m/s')
    .replace(/(\d)\s?km\/sec/gi, '$1&nbsp;km/s')
    // Space before horsepower symbol
    .replace(/(\d)\s?hp/gi, '$1&nbsp;hp')
    .replace(/(\d)\s?bhp/gi, '$1&nbsp;bhp')
    .replace(/(\d)\s?shp/gi, '$1&nbsp;shp')
    // miles per hour
    .replace(/m\.p\.h\./gi, 'mph')
    .replace(/mph([\s,.:\)\(\\/)])/gi, 'mph$1')
    .replace(/(\d)\s?mph/gi, '$1&nbsp;mph')
    .replace(/(\d)\-mph/gi, '$1&nbsp;mph')
    // Standardise symbol for pounds
    .replace(/(\d)\s?lbs?/gi, '$1&nbsp;lb')
    .replace(/(\d\+?)\s?lbs?/gi, '$1&nbsp;lb')
    .replace(/(\d)&nbsp;lbs?/gi, '$1&nbsp;lb')
    .replace(/(\d)\s?(\[\[lbs\]\])/gi, '$1&nbsp;\[\[Pound (mass)|lb\]\]')
    // Standardise symbol for newton metres
    //.replace(/(N•m)/gi, 'N·m')
    // Standardise symbol for kilowatts
    .replace(/(\d)\s?kW([\s,.:\)\(\\/)])/g, '$1&nbsp;kW$2')
    .replace(/(\d)\-kW([\s,.:\)\(\\/)])/g, '$1&nbsp;kW$2')
    // Standardise symbol for foot pounds
    .replace(/ft[ -.·•\/]lb[fs]/gi, 'ft·lbf')
    .replace(/ft[ -.·•\/]lbf/gi, 'ft·lbf')
    .replace(/ft[ -.·•\/]lbff/gi, 'ft·lbf')
    .replace(/ft[ -.·•\/]lb\s/gi, 'ft·lbf ')
    //the next two suspended until solution is found for wing loading (i.e. pounds per square foot)
    //.replace(/lb[fs][ -.•\/]ft/gi, 'ft·lbf')
    //.replace(/lb[ -.•\/]ft/gi, 'ft·lbf')
    // Symbols for feet and inches
    .replace(/([^°][^°]\s)(\d{1,4})\s?['’]\s?(\d{1,2})\s?["”][^NESW]/g, '$1$2&nbsp;ft $3&nbsp;in')
    .replace(/([\(\|]\d{1,4})\s?['’]\s?(\d{1,2})\s?["”][^NESW]/g, '$1&nbsp;ft $2&nbsp;in')
    .replace(/(\d)\s?ft\s(\d)\s?in/gi, '$1&nbsp;ft $2&nbsp;in')
    .replace(/(\d)\s?feet/gi, '$1&nbsp;feet')
    .replace(/(\d)\s?foot/gi, '$1&nbsp;foot')
    .replace(/(\d)\s?knots/gi, '$1&nbsp;knots')
    .replace(/(\d)\s?nmi/gi, '$1&nbsp;nmi')
    .replace(/(\d)\s?nm/gi, '$1&nbsp;nm')
    //Symbols for square feet
    .replace(/sq\.?\s?ft?/gi, 'sq ft')
    .replace(/ft\.\)/gi, 'ft)')
    // Give digital value a percent symbol '%' instead of word
    .replace(/(\d)\s?per ?cent([^aei])/gi, '$1%$2')
    .replace(/(\d)\-per ?cent([^aei])/gi, '$1%$2')
    // Add a space before dB
    .replace(/(\d)\s?(dB)\b/g, '$1&nbsp;$2')
    // Add a space before several units that were missed before
    //.replace(/(\d)\s?(G|M|k|K|h|da|d|c|m|µ|n)?(g|m|Hz|N|W|Pa|V|O|F|)([\s,.:\)\(\\/)])/g, '$1&nbsp;$2$3$4')
    // bps or b/s or bits/s --> bit/s
    .replace(/([KkMmGg])(bps|bits?\/s|b\/s)/g, '$1bit/s')
    .replace(/(\d)\s?(bps)/gi, '$1&nbsp;bit/s')
    // Bps or byte/s or bytes/s --> B/s
    .replace(/([KkMmGg])(Bps|bytes?\/s)/g, ' $1B/s')
    // Make capitalization correct
    .replace(/K(bit|B)\/s/g, 'k$1/s')
    .replace(/m(bit|B)\/s/g, 'M$1/s')
    .replace(/g(bit|B)\/s/g, 'G$1/s')
    // Ensure space is used
    .replace(/(\d)\s?(k|M|G)(bit|B)/g, '$1&nbsp;$2$3')
    // Space before units
    .replace(/(\d)\s?cc([\s,.:\)\(\\/)])/gi, '$1&nbsp;cc$2')
    .replace(/(\d)\-cc([\s,.:\)\(\\/)])/gi, '$1&nbsp;cc$2')
    .replace(/(\d)\s?ft([\s,.:\)\(\\/)])/gi, '$1&nbsp;ft$2')
    .replace(/(\d)\-ft([\s,.:\)\(\\/)])/gi, '$1&nbsp;ft$2')
    .replace(/(\d)\s?rpm/gi, '$1&nbsp;rpm')
    .replace(/(\d)\-rpm/gi, '$1&nbsp;rpm')
    .replace(/(\d)\s?kg([\s,.:\)\(\\/)])/gi, '$1&nbsp;kg$2')
    .replace(/(\d)\-kg([\s,.:\)\(\\/)])/gi, '$1&nbsp;kg$2')
    //space before 'm' only when lower case
    .replace(/(\d)\s?m([\s,.:\)\(\\/)])/g, '$1&nbsp;m$2')
    .replace(/(\d)\-m([\s,.:\)\(\\/)])/g, '$1&nbsp;m$2')
    //.replace(/(\d)\s?ml([\s,.:\)\(\\/)])/g, '$1&nbsp;ml$2')
    //.replace(/(\d)\-ml([\s,.:\)\(\\/)])/g, '$1&nbsp;ml$2')
    .replace(/(\d)\s?m(\W)/g, '$1&nbsp;m$2')
    .replace(/(\d)\s?m(\w?\W)/g, '$1&nbsp;m$2');
    
   // *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- // 
   // Written by myself (AndyZ), from no specific script //
   // random formatting issues from MoS                  //
   // *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- //   
   var cur_d = new Date(), cur_m = (cur_d.getMonth() + 1).toString(); if(cur_m.length == 1) cur_m = '0' + cur_m; //month
                            var cur_t = (cur_d.getDate()).toString(); if(cur_t.length == 1) cur_t = '0' + cur_t; //date
   var cur_accessdate = '|accessdate=' + cur_d.getFullYear() + '-' + cur_m + '-' + cur_t;
   
   txt.value = txt.value
   //MOSNUM more nbsp stuff
    .replace(/(\d)\s?(|kilo|hecto|deca|deci|centi|milli|micro|nano)(meter|metre|liter|litre|gram|byte)(s?\W])/gi, '$1&nbsp;$2$3$4')
    .replace(/(\d)\s?(k|d|c|m|µ|µ|µ)(g|l|m)s?(\W)/gi, '$1&nbsp;$2$3$4')
    .replace(/(\d)\s?(inche?|foot|feet|yard|mile|acre|pound|ounce|ton|gallon|quart|pint|cup|angstrom)(s?\W)/gi, '$1&nbsp;$2$3')
    .replace(/(\d)\s?(lb|ft|yd|mi|oz)s?(\W)/gi, '$1&nbsp;$2$3')
    
   //MOSNUM, first ones are currency fixes
    .replace(/\$US(\d)/gi, '[[United States dollar|US$]]$1')
    .replace(/(\W)EU€/gi, '$1€')
   //add leading zero to decimals
    .replace(/\s(\-?)\.(\d+)\s/g, ' $10.$2 ') 
   //times fixing
    .replace(/\s(\d\d?)\s?(a|p)m\s/gi, ' $1 $2.m. ')
    .replace(/\s(\d\d?)[\.:](\d\d)\s?(a|p)m\s/gi, ' $1:$2 $3.m. ')
    .replace(/\s12\snoon(\W)/g, ' noon$1')

   //MOSDATE remove th in dates followed by -th, others
    .replace(/([^\[])(January|February|March|April|May|June|July|August|September|October|November|December)\s(\d\d?)th/gi, '$1[[$2 $3]]')
    .replace(/\[\[(January|February|March|April|May|June|July|August|September|October|November|December)\s(\d\d?)\]\](<sup>)?th(<\/sup>)?/gi, '[[$1 $2]]') 
    .replace(/(\D\d\d?)(<sup>)?th(<\/sup>)?\s(January|February|March|April|May|June|July|August|September|October|November|December)/gi, '$1 $4')
    .replace(/\s(\d{4})'s(\W)/gi, ' $1s$2')
    .replace(/the\s(January|February|March|April|May|June|July|August|September|October|November|December)\sof\s(\d{4})/gi, '$1 $2')
    .replace(/(January|February|March|April|May|June|July|August|September|October|November|December)\sof\s(\d{4})/gi, '$1 $2')
    .replace(/the\s(\d\d?)th\sof\s(January|February|March|April|May|June|July|August|September|October|November|December)/gi, '$2 $1')
    .replace(/(\d\dth\s)Century/g, '$1century')
    
   //MSH to fix captalization issues in headings
    .replace(/\n(={2,3})(\s?)See\sAlso\s?={2,3}/g, '\n$1$2See also$2$1')
   	.replace(/\n(={2,3})(\s?)Further\sReading\s?={2,3}/g, '\n$1$2Further reading$2$1') 
   	.replace(/\n(={2,3})(\s?)Works\sCited\s?={2,3}/g, '\n$1$2Works cited$2$1')
    .replace(/\n(={2,3})(\s?)External\slink(s?)\s?={2,3}/g, '\n$1$2External link$3$2$1')
    .replace(/\n(={2,3})(\s?)Foot\s[Nn]otes\s?={2,3}/g, '\n$1$2Footnotes$2$1')
   //miscellaneous in headings (remove special characters)
    .replace(/\n(={2,4})(.*)\s&\s(.*)={2,4}/g , '\n$1$2 and $3$1')
 
   //dashes
    .replace(/&#x2012;/g, '-')
    .replace(/&#(x201[45]|151|8212);/g, '&mdash;')  
    .replace(/&#(150|8211|x2013);/g, "&ndash;")
    
   //ellipses
    .replace(/\s(&hellip;|…)\s/g, '&nbsp;$1 ')
    .replace(/\s\.\s\.\s\.\s/g, '&nbsp;.&nbsp;.&nbsp;. ')
    .replace(/\s\.\.\.\s/g, '&nbsp;... ')

   //contractions (be careful!)
    .replace(/(could|did|do|does|had|has|have|is|might|must|should|was|were|would)n't/gi, '$1 not')
    .replace(/can't/gi, 'cannot').replace(/won't/gi, 'will not')
    .replace(/(could|might|must|should|would)'ve/gi, '$1 have')
    .replace(/(\WI|you|he|she|it|we|they|that|who|what|where|when|why|how)'ll/gi, '$1 will')  
    .replace(/(\WI|you|he|she|it|we|they|that|who|what|where|when|why|how)'d/gi, '$1 had')
  
   //expand [[WP:PDATA]], auto-fill in name blank
   /* <nowiki> */
    .replace(/\{\{persondata\}\}/gi, '{{Persondata\n|NAME='+wgTitle.replace(/\s\(.*\)/,'').substring(wgTitle.replace(/\s\(.*\)/,'').lastIndexOf(' '),wgTitle.replace(/\s\(.*\)/,'').length) + ', ' + wgTitle.replace(/\s\(.*\)/,'').substring(0,wgTitle.replace(/\s\(.*\)/,'').lastIndexOf(' '))+'\n|ALTERNATIVE NAMES=\n|SHORT DESCRIPTION=\n|DATE OF BIRTH=\n|PLACE OF BIRTH=\n|DATE OF DEATH=\n|PLACE OF DEATH=\n}}') 
   /* </nowiki> */

   //spacing, XHTML
    .replace(/<([bh])r\s*\/?\s*>/gi, '<$1r />') 
    .replace(/<(\/?)TABLE/g, '<$1table')
    .replace(/<(\/?)DIV/g, '<$1div')
    .replace(/<(\/?)SPAN/g, '<$1span')

   //Template:Cite web
    //TODO: !1! DD Month instead of Month DD, !2! accessed instead of retrieved
    //take care of news
    /*convert <nowiki><ref>s</nowiki> in style:
     <ref( name=)?>[?url.pdf]?</ref>
     <ref( name=)?>[url.pdf title]</ref>
     <ref( name=)?>[url title (YYYY)].?</ref>
     <ref( name=)?>[url title]</ref>
     <ref( name=)?>[url]</ref> (w/o brackets)
     <ref( name=)?>url</ref> (w/o brackets)
     <ref( name=)?>[url title].? Retrieved on? YYYY-MM-DD.?</ref>
     <ref( name=)?>LAST, FIRST. [?url]?</ref>
     <ref( name=)?>LAST, FIRST. [url title]</ref>
     <ref( name=)?>FIRST LAST. [?url]?</ref>
     <ref( name=)?>FIRST LAST. [url title]</ref>
     <ref( name=)?>[url title] (?YYYY)?.?</ref>
     <ref( name=)?>LAST, FIRST (YYYY). [url title].?</ref>
     <ref( name=)?>LAST, FIRST. [url title].? (?YYYY)?.?</ref>
     <ref( name=)?>LAST, FIRST. [url title]. retrieved on? YYYY-MM-DD.?</ref>
     <ref( name=)?>LAST, FIRST (YYYY). [url title]. retrieved on? YYYY-MM-DD.?</ref>        !2!
     <ref( name=)?>LAST, FIRST. [url title]. retrieved on? Month DD, YYYY.?</ref>       !1! !2!
     <ref( name=)?>LAST, FIRST (YYYY). [url title]. retrieved Month DD, YYYY.?</ref>    !1! !2!
     <ref( name=)?>LAST, FIRST (YYYY). [url title]. retrieved on Month DD, YYYY.?</ref> !1! !2!
     <ref( name=)?>LAST, FIRST MIDDLE. [url title].?</ref>
     <ref( name=)?>LAST, FIRST MIDDLE (YYYY). [url title].?</ref>
     <ref( name=)?><url></ref>
     <ref( name=)?>LAST, FIRST. <url></ref>
     <ref( name=)?>LAST, FIRST. "~~". <url></ref>
     <ref( name=)?>LAST, FIRST. "~~". [url]</ref>
     <ref( name=)?>[url title] (YYYY). retrieved on Month DD, YYYY.</ref>
     <sup>[url]</sup>
  to Cite web format, respectively*/
   .replace(/<ref(\sname=.+?)?>\s*\[?(http:\/\/[^\s]+?\.pdf)\]?\s*<\/ref>/gi, '<ref$1>{{cite web|url=$2|title=INSERT TITLE|format=PDF'+cur_accessdate+'}}</ref>')
   .replace(/<ref(\sname=.+?)?>\s*\[([^\s]+?\.pdf)\s([^\]]+?)\]\s*<\/ref>/gi, '<ref$1>{{cite web|url=$2|title=$3|format=PDF'+cur_accessdate+'}}</ref>')
   .replace(/<ref(\sname=.+?)?>\s*\[([^\[\]]+?)\s([^\]]+?)\]\s*<\/ref>/gi, '<ref$1>{{cite web|url=$2|title=$3'+cur_accessdate+'}}</ref>')
   .replace(/<ref(\sname=.+?)?>\s*\[(.+?)\s([^\]]+?)\s\(\[{0,2}(\d{4})\]{0,2}\)\]\.?\s\s*<\/ref>/gi, '<ref$1>{{cite web|url=$2|title=$3|year=$3'+cur_accessdate+'}}</ref>')
   .replace(/<ref(\sname=.+?)?>\s*\[([^\s]+?)\]\s*<\/ref>/gi, '<ref$1>{{cite web|url=$2|title=INSERT TITLE'+cur_accessdate+'}}</ref>')
   .replace(/<ref(\sname=.+?)?>\s*(http:\/\/[^\s]+?)\s*<\/ref>/gi, '<ref$1>{{cite web|url=$2|title=INSERT TITLE'+cur_accessdate+'}}</ref>')
   .replace(/<ref(\sname=.+?)?>\s*\[([^\s]+?)\s([^\]]+?)\][\.\,]?\s(retrieved|accessed|reached)\s(on\s)?\[{0,2}(\d{4}\-\d{1,2}\-\d{1,2})\]{0,2}\.?\s*<\/ref>/gi, '<ref$1>{{cite web|url=$2|title=$3|accessdate=$6}}</ref>')
   .replace(/<ref(\sname=.+?)?>\s*(\w+)\,\s(\w+)\.\s\[?([^\s]+?)\]?\.?\s*<\/ref>/gi, '<ref$1>{{cite web|url=$4|title=INSERT TITLE|last=$2|first=$3'+cur_accessdate+'}}</ref>')
   .replace(/<ref(\sname=.+?)?>\s*(\w+)\,\s(\w+)\.\s\[([^\s]+?)\s([^\]]+?)\]\.?\s*<\/ref>/gi, '<ref$1>{{cite web|url=$4|title=$5|last=$2|first=$3'+cur_accessdate+'}}</ref>')
   .replace(/<ref(\sname=.+?)?>\s*(\w+)\s(\w+)\.\s\[?([^\s]+?)\]?\.?\s*<\/ref>/gi, '<ref$1>{{cite web|url=$4|title=INSERT TITLE|last=$3|first=$2'+cur_accessdate+'}}</ref>')
   .replace(/<ref(\sname=.+?)?>\s*(\w+)\s(\w+)\.\s\[?(http:\/\/.+?)\s(.+?)\]?\.?\s*<\/ref>/gi, '<ref$1>{{cite web|url=$4|title=$5|last=$3|first=$2'+cur_accessdate+'}}</ref>')
   .replace(/<ref(\sname=.+?)?>\s*\[(.+?)\s([^\]]+?)\]\.?\s\(?\[{0,2}(\d{4})\]{0,2}\)?\.?\s*<\/ref>/gi, '<ref$1>{{cite web|url=$2|title=$3|year=$3'+cur_accessdate+'}}</ref>')
   .replace(/<ref(\sname=.+?)?>\s*(\w+)\,\s(\w+)\s\(\[{0,2}(\d{4})\]{0,2}\)\.\s\[([^\s]+?)\s([^\]]+?)\]\.?\s*<\/ref>/gi, '<ref$1>{{cite web|url=$5|title=$6|last=$2|first=$3|year=$4'+cur_accessdate+'}}</ref>')
   .replace(/<ref(\sname=.+?)?>\s*(\w+)\,\s(\w+)\.\s\[([^\s]+?)\s([^\]]+?)\]\.?\s\(?\[{0,2}(\d{4})\]{0,2}\)?\.?\s*<\/ref>/gi, '<ref$1>{{cite web|url=$5|title=$6|last=$2|first=$3|year=$4'+cur_accessdate+'}}</ref>')
   .replace(/<ref(\sname=.+?)?>\s*(\w+)\,\s(\w+)\.\s\[([^\s]+?)\s([^\]]+?)\][\.\,]?\s(retrieved|accessed|reached)\s(on\s)?\[{0,2}(\d{4}\-\d{1,2}\-\d{1,2})\]{0,2}\.?\s*<\/ref>/gi, '<ref$1>{{cite web|url=$4|title=$5|last=$2|first=$3|accessdate=$8}}</ref>')
   .replace(/<ref(\sname=.+?)?>\s*(\w+)\,\s(\w+)\s\(\[{0,2}(\d{4})\]{0,2}\)\.\s\[([^\s]+?)\s([^\]]+?)\][\.\,]?\s(retrieved|accessed|reached)\s(on\s)?\[{0,2}(\d{4}\-\d{1,2}\-\d{1,2})\]{0,2}\.?\s*<\/ref>/gi, '<ref$1>{{cite web|url=$5|title=$6|last=$2|first=$3|accessdate=$9|year=$4}}</ref>')
   .replace(/<ref(\sname=.+?)?>\s*(\w+)\,\s(\w+)\.\s\[([^\s]+?)\s([^\]]+?)\][\.\,]?\sretrieved\s(on\s)?\[{0,2}(January|February|March|April|May|June|July|August|September|October|November|December)\s(\d{1,2})\]{0,2}\,?\s\[{0,2}(\d{4})\]{0,2}\.?\s*<\/ref>/gi, '<ref$1>{{cite web|url=$4|title=$5|last=$2|first=$3|accessmonthday=[[$7 $8]]|accessyear=[[$9]]}}</ref>')
   .replace(/<ref(\sname=.+?)?>\s*(\w+)\,\s(\w+)\s\((\d{4})\)\.\s\[([^\s]+?)\s([^\]]+?)\][\.\,]?\sretrieved\s\[{0,2}(January|February|March|April|May|June|July|August|September|October|November|December)\s(\d{1,2})\]{0,2}\,?\s\[{0,2}(\d{4})\]{0,2}\.?\s*<\/ref>/gi, '<ref$1>{{cite web|url=$5|title=$6|last=$2|first=$3|accessmonthday=[[$7 $8]]|accessyear=[[$9]]|year=$4}}</ref>')
   .replace(/<ref(\sname=.+?)?>\s*(\w+)\,\s(\w+)\s\((\d{4})\)\.\s\[([^\s]+?)\s([^\]]+?)\][\.\,]?\sretrieved\son\s\[{0,2}(January|February|March|April|May|June|July|August|September|October|November|December)\s(\d{1,2})\]{0,2}\,?\s\[{0,2}(\d{4})\]{0,2}\.?\s*<\/ref>/gi, '<ref$1>{{cite web|url=$5|title=$6|last=$2|first=$3|accessmonthday=[[$7 $8]]|accessyear=[[$9]]|year=$4}}</ref>')
   .replace(/<ref(\sname=.+?)?>\s*(\w+)\,\s(\w+\.?\s\w+)\.\s\[([^\s]+?)\s([^\]]+?)\]\s*<\/ref>/gi, '<ref$1>{{cite web|url=$4|title=$5|last=$2|first=$3'+cur_accessdate+'}}</ref>')
   .replace(/<ref(\sname=.+?)?>\s*(\w+)\,\s(\w+\.?\s\w+)\s\(\[{0,2}(\d{4})\]{0,2}\)\.\s\[([^\s]+?)\s([^\]]+?)\]\s*<\/ref>/gi, '<ref$1>{{cite web|url=$5|title=$6|last=$2|first=$3|year=$4'+cur_accessdate+'}}</ref>')
   .replace(/<ref(\sname=.+?)?>\s*<(http:\/\/.+?)>\s*<\/ref>/gi, '<ref$1>{{cite web|url=$2|title=INSERT TITLE'+cur_accessdate+'}}</ref>')
   .replace(/<ref(\sname=.+?)?>\s*(\w+)\,\s(\w+)\.\s<(http:\/\/.+?)>\s*<\/ref>/gi, '<ref$1>{{cite web|url=$4|title=INSERT TITLE|last=$2|first=$3'+cur_accessdate+'}}</ref>')
   .replace(/<ref(\sname=.+?)?>\s*(\w+)\,\s(\w+)\.\s"(.+?)"\.?\s<(http:\/\/.+?)>\s*<\/ref>/gi, '<ref$1>{{cite web|url=$5|title=$4|last=$2|first=$3'+cur_accessdate+'}}</ref>')
   .replace(/<ref(\sname=.+?)?>\s*(\w+)\,\s(\w+)\.\s"(.+?)"\.?\s\[(http:\/\/.+?)\]\s*<\/ref>/gi, '<ref$1>{{cite web|url=$5|title=$4|last=$2|first=$3'+cur_accessdate+'}}</ref>')
   .replace(/<sup>\[(http:\/\/.+?)\]<\/sup>/gi, '<ref>{{cite web|url=$1|title=INSERT TITLE'+cur_accessdate+'}}</ref>')
   .replace(/<ref(\sname=.+?)?>\s*\[([^\s]+?)\s([^\]]+?)\]\s\(\[{0,2}(\d{4})\]{0,2}\)[\.\,]\sretrieved\s(on\s)?\[{0,2}(January|February|March|April|May|June|July|August|September|October|November|December)\s(\d{1,2})\]{0,2}\,\s\[{0,2}(\d{4})\]{0,2}\.?\s*<\/ref>/gi, '<ref$1>{{cite web|url=$2|title=$3|accessmonthday=$6 $7|accessyear=$8|year=$4}}</ref>')
   
   //replace "|url=~~|title=INSERT TITLE" with url doubled
   .replace(/\|url=(http:\/\/)(.+?)\|title=INSERT\sTITLE/g, '|url=$1$2|title=$2<'+'!'+'--INSERT TITLE--'+'>')
   
   //miscellaneous, minor, obvious, or not explicitly stated in style guidelines
   //replace w/ main article template, minor 
    .replace(/\{\{main\s?article\|/gi, '{{main|')  
    .replace(/\[\[User:AndyZ\/peerreviewer\.js([\]\|])/gi, '[[User:AndyZ/peerreviewer$1');
   
   //continue replacing more complex versions to Template:Cite web
    //array for converting: <nowiki><refs></nowiki> in style: <ref( name=)?>[url title].? Retrieved on? [[?month DD]]?, [[?YYYY]]?.?</ref> to Cite web format
    var cw_retrieval = new Array(
    /<ref(\sname=.+?)?>\[([^\s]+?)\s([^\]]+?)\][\.\,]?\s(retrieved|accessed|reached)\s(on\s)?\[{0,2}(Jan(uary|\.)?)\s(\d{1,2})\]{0,2}, \[{0,2}(\d{4})\]{0,2}\.?\s*<\/ref>/gi,
    /<ref(\sname=.+?)?>\[([^\s]+?)\s([^\]]+?)\][\.\,]?\s(retrieved|accessed|reached)\s(on\s)?\[{0,2}(Feb(ruary|\.)?)\s(\d{1,2})\]{0,2}, \[{0,2}(\d{4})\]{0,2}\.?\s*<\/ref>/gi,
    /<ref(\sname=.+?)?>\[([^\s]+?)\s([^\]]+?)\][\.\,]?\s(retrieved|accessed|reached)\s(on\s)?\[{0,2}(Mar(ch|\.)?)\s(\d{1,2})\]{0,2}, \[{0,2}(\d{4})\]{0,2}\.?\s*<\/ref>/gi,
    /<ref(\sname=.+?)?>\[([^\s]+?)\s([^\]]+?)\][\.\,]?\s(retrieved|accessed|reached)\s(on\s)?\[{0,2}(Apr(il|\.)?)\s(\d{1,2})\]{0,2}, \[{0,2}(\d{4})\]{0,2}\.?\s*<\/ref>/gi,
    /<ref(\sname=.+?)?>\[([^\s]+?)\s([^\]]+?)\][\.\,]?\s(retrieved|accessed|reached)\s(on\s)?\[{0,2}(May(\.)?)\s(\d{1,2})\]{0,2}, \[{0,2}(\d{4})\]{0,2}\.?\s*<\/ref>/gi,
    /<ref(\sname=.+?)?>\[([^\s]+?)\s([^\]]+?)\][\.\,]?\s(retrieved|accessed|reached)\s(on\s)?\[{0,2}(Jun(e|\.)?)\s(\d{1,2})\]{0,2}, \[{0,2}(\d{4})\]{0,2}\.?\s*<\/ref>/gi,
    /<ref(\sname=.+?)?>\[([^\s]+?)\s([^\]]+?)\][\.\,]?\s(retrieved|accessed|reached)\s(on\s)?\[{0,2}(Jul(y|\.)?)\s(\d{1,2})\]{0,2}, \[{0,2}(\d{4})\]{0,2}\.?\s*<\/ref>/gi,
    /<ref(\sname=.+?)?>\[([^\s]+?)\s([^\]]+?)\][\.\,]?\s(retrieved|accessed|reached)\s(on\s)?\[{0,2}(Aug(ust|\.)?)\s(\d{1,2})\]{0,2}, \[{0,2}(\d{4})\]{0,2}\.?\s*<\/ref>/gi,
    /<ref(\sname=.+?)?>\[([^\s]+?)\s([^\]]+?)\][\.\,]?\s(retrieved|accessed|reached)\s(on\s)?\[{0,2}(Sept?(ember|\.)?)\s(\d{1,2})\]{0,2}, \[{0,2}(\d{4})\]{0,2}\.?\s*<\/ref>/gi,
    /<ref(\sname=.+?)?>\[([^\s]+?)\s([^\]]+?)\][\.\,]?\s(retrieved|accessed|reached)\s(on\s)?\[{0,2}(Oct(ober|\.)?)\s(\d{1,2})\]{0,2}, \[{0,2}(\d{4})\]{0,2}\.?\s*<\/ref>/gi,
    /<ref(\sname=.+?)?>\[([^\s]+?)\s([^\]]+?)\][\.\,]?\s(retrieved|accessed|reached)\s(on\s)?\[{0,2}(Nov(ember|\.)?)\s(\d{1,2})\]{0,2}, \[{0,2}(\d{4})\]{0,2}\.?\s*<\/ref>/gi,
    /<ref(\sname=.+?)?>\[([^\s]+?)\s([^\]]+?)\][\.\,]?\s(retrieved|accessed|reached)\s(on\s)?\[{0,2}(Dec(ember|\.)?)\s(\d{1,2})\]{0,2}, \[{0,2}(\d{4})\]{0,2}\.?\s*<\/ref>/gi);
    
    for(i=0;i<12;i++) txt.value = txt.value.replace(cw_retrieval[i],'<ref$1>{{cite web|url=$2|title=$3|accessmonthday=$6 $8|accessyear=$9}}</ref>');
    
   // spell checker, based on [[WP:SPELL]]: (requires ajax) !!!
    if(!noXHR_PR){}
     
   // *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* // 
   // from [[Wikipedia:WikiProject User scripts/Scripts/Formatter]] //
   // *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* // 
    txt.value = txt.value               //whitespace
    .replace(/\t/g, " ")
    .replace(/^ ? ? \n/gm, "\n")
    .replace(/(\n\n)\n+/g, "$1")
    .replace(/== ? ?\n\n==/g, "==\n==")
    .replace(/\n\n(\* ?\[?http)/g, "\n$1")
    .replace(/^ ? ? \n/gm, "\n")
    .replace(/\n\n\*/g, "\n*")
    .replace(/[ \t][ \t]+/g, " ")
    .replace(/([=\n]\n)\n+/g, "$1")
    .replace(/ \n/g, "\n")              //ending sections 
    .replace(/(== ?)(external links:?|outside links|web ?links:?|exterior links:?)( ?==)/gi, "$1External links$3")
    .replace(/(== ?)(external link:?|web ?link:?|exterior link:?)( ?==)/gi, "$1External link$3")
    .replace(/(== ?)(reference:?)(s? ?==)/gi, "$1Reference$3")
    .replace(/(== ?)(source:?)(s? ?==)/gi, "$1Source$3")
    .replace(/(== ?)(further readings?:?)( ?==)/gi, "$1Further reading$3")
    .replace(/\[\[ ?[Cc]ategory ?: ?/g, "[[Category:")  //categories 
   //repair bad internal links
    .replace(/([^\[]|^)\[?\[([^\]]*?)\]\]?([^\]]|$)/gm, "$1[[$2]]$3")
    .replace(/\[\[ ?([^\]]*?) ?\]\]/g, "[[$1]]")
    .replace(/\[\[([^\]]*?)( |_)#([^\]]*?)\]\]/g, "[[$1#$3]]")
   //repair bad external links
    .replace(/\[?\[http:\/\/([^\]]*?)\]\]?/gi, "[http://$1]")
    .replace(/\[http:\/\/([^\]]*?)\|([^\]]*?)\]/gi, "[http://$1 $2]")
    .replace(/\[\[([^\]\|]+)\|([^\]\|]+)\]\]([A-Za-z\'][A-Za-z]*)([\.\,\;\:\"\!\?\s\n])/g, "[[$1|$2$3]]$4");
    
   // *-*-*-*-*-*-*-*-*-*-*-*-*-*-*- // for full documentation, see
   // FROM User:Gimmetrow/replace.js //  User:Gimmetrow/fixRefs.js
   // *-*-*-*-*-*-*-*-*-*-*-*-*-*-*- // 
    txt.value = txt.value
    .replace(new RegExp("[\n\r\f\t ]+?"+facttags, "gi"), "$1")
    .replace(new RegExp("[\n\r\f\t ]+?<ref([ >])", "gi"), "<ref$1")
    .replace(new RegExp("<ref ([^>]*[^> ])[ ]*>", "gi"), "<ref $1>")
    .replace(new RegExp("(</ref>|<ref[^>]*?/>)<sup>[ ]*[,;-]?[ ]*</sup><ref", "gi"), "$1<ref");
    for (var j=0; j<10; j++){
      txt.value = txt.value.replace(new RegExp("([^\.,;:!\?"+qt+"'’])([" + qt + "'’]*)"+facttags+"[ ]*([\.,;:!\?])", "gi"), "$1$2$4$3")
      .replace(new RegExp("([!\?])([" + qt + "'’]*)"+facttags+"[ ]*([,;:!\?])", "gi"), "$1$2$4$3")
      .replace(new RegExp("([\.,;:])([" + qt + "'’]*)"+facttags+"[ ]*([\.,;:!\?])", "gi"), "$2$4$3")
      .replace(new RegExp("([!\?])([" + qt + "'’]*)"+facttags+"[ ]*([\.])", "gi"), "$1$2$3")
      .replace(new RegExp("([^\.,;:!\?"+qt+"'’])([" + qt + "'’]*)<ref>"+closetag+"[ ]*([\.,;:!\?])", "gi"), "$1$2$5<ref>$3</ref>")
      .replace(new RegExp("([!\?])([" + qt + "'’]*)<ref>"+closetag+"[ ]*([,;:!\?])", "gi"), "$1$2$5<ref>$3</ref>")
      .replace(new RegExp("([\.,;:])([" + qt + "'’]*)<ref>"+closetag+"[ ]*([\.,;:!\?])", "gi"), "$2$5<ref>$3</ref>")
      .replace(new RegExp("([!\?])([" + qt + "'’]*)<ref>"+closetag+"[ ]*([\.])", "gi"), "$1$2<ref>$3</ref>")
      .replace(new RegExp("([^\.,;:!\?"+qt+"'’])([" + qt + "'’]*)<ref([^>]*?[^/])>"+closetag+"[ ]*([\.,;:!\?])", "gi"), "$1$2$6<ref$3>$4<\/ref>")
      .replace(new RegExp("([!\?])([" + qt + "'’]*)<ref([^>]*?[^/])>"+closetag+"[ ]*([,;:!\?])", "gi"), "$1$2$6<ref$3>$4<\/ref>")
      .replace(new RegExp("([\.,;:])([" + qt + "'’]*)<ref([^>]*?[^/])>"+closetag+"[ ]*([\.,;:!\?])", "gi"), "$2$6<ref$3>$4<\/ref>")
      .replace(new RegExp("([!\?])([" + qt + "'’]*)<ref([^>]*?[^/])>"+closetag+"[ ]*([\.])", "gi"), "$1$2<ref$3>$4<\/ref>")
      .replace(new RegExp("([^\.,;:!\?"+qt+"'’])([" + qt + "'’]*)<ref([^>]*?)/> *?([\.,;:!\?])", "gi"), "$1$2$4<ref$3/>")
      .replace(new RegExp("([!\?])([" + qt + "'’]*)<ref([^>]*?)/>[ ]*?([,;:!\?])", "gi"), "$1$2$4<ref$3/>")
      .replace(new RegExp("([\.,;:])([" + qt + "'’]*)<ref([^>]*?)/>[ ]*?([\.,;:!\?])", "gi"), "$2$4<ref$3/>")
      .replace(new RegExp("([!\?])([" + qt + "'’]*)<ref([^>]*?)/>[ ]*?([\.])", "gi"), "$1$2<ref$3/>");
    }
   
    var summary_txt = document.editform.wpSummary, summary = "[[User:AndyZ/peerreviewer|JS]]: fixing [[WP:MOS|MoS]] and other miscellaneous style problems";
	if (summary_txt.value.indexOf(summary) == -1) {
		if (summary_txt.value.match(/[^\*\/\s][^\/\s]?\s*$/))
			summary_txt.value += " | ";
		summary_txt.value += summary;
	}
	
	document.getElementById('wpDiff').click();	//click "View changes" button
}
//</pre> ENDFILE: mos.js