User:Dudemanfellabra/AssessNRHP.js

// global vars var Articles=[] var currentlyDisplayed="" var CheckDefaults={"autoload":false, "ignoreconfirm":false, "watchtarget":true}

function MaintenanceButton { var button=document.createElement("input") button.setAttribute("type", "button");

if (mw.config.get('wgPageName')=="Wikipedia:WikiProject_National_Register_of_Historic_Places/to_do") { button.setAttribute("value", "Assess quality/importance of unassessed articles"); button.setAttribute("id", "maintenancebutton"); button.setAttribute("onclick", "MaintenanceClick('maintenance')"); } else if ((mw.config.get('wgPageName').search("National_Register_of_Historic_Places_listings") != -1 || mw.config.get('wgPageName').search("National_Historic_Landmarks_in") != -1) && mw.config.get('wgNamespaceNumber')==0 && location.href.indexOf('action')==-1 && mw.config.get('wgArticleId')!=0) { button.setAttribute("value", "Assess quality/importance of unassessed articles"); button.setAttribute("id", "untaggedbutton"); button.setAttribute("onclick", "MaintenanceClick('untagged')"); } else if (mw.config.get('wgPageName')=="Category:Pages_using_infobox_NRHP_with_unknown_parameters") { button.setAttribute("value", "Clean up infoboxes"); button.setAttribute("id", "infoboxbutton"); button.setAttribute("onclick", "MaintenanceClick('infobox')"); } else { return; }

var content=document.getElementById('mw-content-text') content.parentNode.insertBefore(button, content) }

function MaintenanceClick(param) { var button = document.getElementById(param+'button') button.disabled = true

var DisplayDiv=document.createElement("div") var content=document.getElementById("mw-content-text") DisplayDiv.setAttribute('id', 'DisplayDiv') DisplayDiv.setAttribute("style", "width:100%; border:1px solid black; padding:5px") content.parentNode.insertBefore(DisplayDiv, content)

var UIDiv=document.createElement("div") UIDiv.setAttribute('id', 'UIDiv') UIDiv.setAttribute("style", "width:100%; height:280px; border:1px solid black; padding:5px; text-align:center; vertical-align:top") DisplayDiv.parentNode.insertBefore(UIDiv, DisplayDiv)

if (param=="maintenance") { QueryMaintenance } else if (param=="untagged") { QueryUntagged } else if (param=="infobox") { QueryInfoboxCleanup } else { return; } }

function QueryMaintenance { var NoQuality = JSON.parse(       $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', list: 'categorymembers', cmtitle: 'Category:Unassessed National Register of Historic Places articles', cmprop: 'title', cmtype: 'page', cmlimit: 'max' },           async:false })       .responseText    ); for (var c in NoQuality.query.categorymembers) { Articles[Articles.length]=NoQuality.query.categorymembers[c].title.replace("Talk:","") }   if (NoQuality["query-continue"]) { var cmcontinue = NoQuality["query-continue"].categorymembers.cmcontinue while (true) { var NoQuality = JSON.parse(               $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', list: 'categorymembers', cmtitle: 'Category:Unassessed National Register of Historic Places articles', cmprop: 'title', cmtype: 'page', cmlimit: 'max', cmcontinue: cmcontinue },                   async:false })               .responseText            ); for (var c in NoQuality.query.categorymembers) { Articles[Articles.length]=NoQuality.query.categorymembers[c].title.replace("Talk:","") }           if (NoQuality["query-continue"]) { cmcontinue = NoQuality["query-continue"].categorymembers.cmcontinue } else { break; }       }    }    // have all members of Unassessed category; now get unknown-importance var NoImportance = JSON.parse(       $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', list: 'categorymembers', cmtitle: 'Category:Unknown-importance National Register of Historic Places articles', cmprop: 'title', cmtype: 'page', cmlimit: 'max' },           async:false })       .responseText    ); for (var c in NoImportance.query.categorymembers) { Articles[Articles.length]=NoImportance.query.categorymembers[c].title.replace("Talk:","") }   if (NoImportance["query-continue"]) { var cmcontinue = NoImportance["query-continue"].categorymembers.cmcontinue while (true) { var NoImportance = JSON.parse(               $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', list: 'categorymembers', cmtitle: 'Category:Unknown-importance National Register of Historic Places articles', cmprop: 'title', cmtype: 'page', cmlimit: 'max', cmcontinue: cmcontinue },                   async:false })               .responseText            ); for (var c in NoImportance.query.categorymembers) { Articles[Articles.length]=NoImportance.query.categorymembers[c].title.replace("Talk:","") }           if (NoImportance["query-continue"]) { cmcontinue = NoImportance["query-continue"].categorymembers.cmcontinue } else { break; }       }    }    // have all articles; now remove duplicates (articles that are both unassessed AND unknown-importance    for (var i=0;i<Articles.length; i++) {        for (var j=i+1;j<Articles.length; j++) {            if (Articles[i]==Articles[j]) {Articles.splice(j,1);j--}        }    }    Articles.sort

UpdateUIDiv(-1, false, false, false) }

function QueryUntagged { var wikitext=getAssessmentWikitext(mw.config.get('wgPageName')) if (wikitext=="error") { alert("Could not retrieve wikitext! Assessment script aborted!") return; }   var TableStartIndex=0 var currentTable=0 while (1) { var Rows=[]; TableStartIndex=wikitext.search(/{{NRHP (former )?header/) // find next table if (TableStartIndex==-1) { break; }       wikitext=wikitext.substr(TableStartIndex+1,wikitext.length-TableStartIndex)  // get rid everything before current table

var UnassessedStr = "" var UntaggedStr = ""

var tabletext=wikitext.substr(0,wikitext.indexOf("\n|}")) tabletext=tabletext.replace(/\<\!\-\-(.|[\r\n])*?\-\-\>/g, "") // get rid of commented out rows

var index, RowLocations = []; var str = "{{NRHP row" var skip = str.length var StartIndex = 0 while ((index = tabletext.indexOf(str, StartIndex)) > -1) { RowLocations.push(index); StartIndex = index + skip; }       RowLocations.push(tabletext.length) // last row ends at end of table

for (var i=0; i<RowLocations.length-1; i++) { Rows.push(tabletext.substr(RowLocations[i],RowLocations[i+1]-RowLocations[i])) }

var TitlesArray = [];

for (var j=0; j<Rows.length; j++) { var link=Rows[j].match(/\|[ ]*?article[ ]*?=[ ]*?.*?[\n|\|]/g) var blank=Rows[j].match(/\|[ ]*?article[ ]*?=[ ]*?[\n|\|]/g)                        // default to name param if article if (link==null||blank!=null) link=Rows[j].match(/\|[ ]*?name[ ]*?=[ ]*?.*?[\n|\|]/g) // blank or missing

link=link[0].replace(/\|[ ]*?(article|name)[ ]*?=[ ]*?/g,"").replace(/[\n|\|]/g,"") // strip param name, final line break link=decodeURIComponent(link.split("#")[0].trim)    // corrections for weird titles

TitlesArray.push(link) }       for (var i=0;i50) { var TempTitlesArray = TitlesArray.slice(50*loops,50*(loops+1)) } else { var TempTitlesArray = TitlesArray.slice(50*loops) }           TempTitlesArray.sort  // query below returns results in alphabetical order

var temptitle=TempTitlesArray[0] for (var k=1; k<TempTitlesArray.length; k++) { temptitle+="|"+TempTitlesArray[k] }

var dabs=JSON.parse(               $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', prop: 'categories', clcategories: 'Category:All disambiguation pages', cllimit: 'max', titles: temptitle, redirects: 'true' },                   async:false })               .responseText            );

if (dabs.query.normalized) { // normalize any weird titles for (var n in dabs.query.normalized) { for (var k=0; k<TempTitlesArray.length; k++) { if (TempTitlesArray[k]==dabs.query.normalized[n].from) TempTitlesArray[k]=dabs.query.normalized[n].to                   } }           }

if (dabs.query.redirects) { // resolve any redirects for (var r in dabs.query.redirects) { for (var k=0; k<TempTitlesArray.length; k++) { if (TempTitlesArray[k]==dabs.query.redirects[r].from) TempTitlesArray[k]=dabs.query.redirects[r].to                   } }           }

for (var i=0;i<TempTitlesArray.length; i++) { for (var j=i+1;j<TempTitlesArray.length; j++) { if (TempTitlesArray[i]==TempTitlesArray[j]) {TempTitlesArray.splice(j,1);j--} }           }            TempTitlesArray.sort

for (var page in dabs.query.pages) { if (typeof dabs.query.pages[page].missing!="undefined") { // if unarticled, get rid of it in preparation for for (var l=0; l<TempTitlesArray.length; l++) {        // querying talk pages if (TempTitlesArray[l]==dabs.query.pages[page].title) {TempTitlesArray.splice(l,1); l--} }               }                if (dabs.query.pages[page].categories) { for (var category in dabs.query.pages[page].categories) { for (var l=0; l0) { var temptalktitle="Talk:"+TempTitlesArray[0] for (var k=1; k<TempTitlesArray.length; k++) { temptalktitle+="|Talk:"+TempTitlesArray[k] }

var QualityList=["Unassessed", "Stub", "Start", "C", "B", "GA", "A", "FA", "FL", "List", "Redirect", "Category", "Disambig", "File", "Project", "Template", "NA"] var ImportanceList=["Unknown", "Top", "High", "Mid", "Low", "Related", "NA"]

var catlist="Category:Unassessed National Register of Historic Places articles" for (var i=1; i<QualityList.length; i++) { // start at 1 to skip unassessed catlist+="|Category:"+QualityList[i]+"-Class National Register of Historic Places articles" }               for (var i=0; i<ImportanceList.length; i++) { catlist+="|Category:"+ImportanceList[i]+"-importance National Register of Historic Places articles" }

var talkpages=JSON.parse(                   $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', prop: 'categories', clcategories: catlist, cllimit: 'max', titles: temptalktitle },                       async:false })                   .responseText                ); for (var page in talkpages.query.pages) { var tagged = false if (talkpages.query.pages[page].categories) { for (var category in talkpages.query.pages[page].categories) { tagged = true var CatTitle=talkpages.query.pages[page].categories[category].title if (CatTitle.indexOf("Unassessed")!=-1||CatTitle.indexOf("Redirect")!=-1) { Articles[Articles.length]=talkpages.query.pages[page].title.replace("Talk:","") }                       }                    }                    if (!tagged) { Articles[Articles.length]=talkpages.query.pages[page].title.replace("Talk:","") }               }            }            if (toQuery>50) { toQuery = toQuery-50 loops++ } else { done = "yes" }       }        currentTable++ }

for (var i=0;i<Articles.length; i++) { for (var j=i+1;j<Articles.length; j++) { if (Articles[i]==Articles[j]) {Articles.splice(j,1);j--} }   }    Articles.sort

UpdateUIDiv(-1, false, false, false) }

function QueryInfoboxCleanup { var Infoboxes = JSON.parse(       $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', list: 'categorymembers', cmtitle: 'Category:Pages using infobox NRHP with unknown parameters', cmsort: 'sortkey', cmprop: 'title', cmtype: 'page', cmlimit: 'max' },           async:false })       .responseText    ); for (var c in Infoboxes.query.categorymembers) { Articles[Articles.length]=Infoboxes.query.categorymembers[c].title }   if (Infoboxes["query-continue"]) { var cmcontinue = Infoboxes["query-continue"].categorymembers.cmcontinue while (true) { var Infoboxes = JSON.parse(               $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', list: 'categorymembers', cmtitle: 'Category:Pages using infobox NRHP with unknown parameters', cmprop: 'title', cmtype: 'page', cmlimit: 'max', cmcontinue: cmcontinue },                   async:false })               .responseText            ); for (var c in Infoboxes.query.categorymembers) { Articles[Articles.length]=Infoboxes.query.categorymembers[c].title }           if (Infoboxes["query-continue"]) { cmcontinue = Infoboxes["query-continue"].categorymembers.cmcontinue } else { break; }       }    }

UpdateInfoboxUIDiv(-1, false, false, false) }

function UpdateUIDiv(selected, autoload, ignoreconfirm, watchtarget) { var DisplayDiv=document.getElementById("DisplayDiv") var UIDiv=document.getElementById("UIDiv") UIDiv.innerHTML=""

if (Articles.length==0) { UIDiv.style.verticalAlign="middle" UIDiv.innerHTML="There are no more articles to tag/assess. Good job!" DisplayDiv.innerHTML="" return; }

var ListDiv=document.createElement("div") ListDiv.setAttribute("style","width:39.5%; float:left; text-align:left") ListDiv.innerHTML=" "+Articles.length+" articles need to be tagged/assessed "

var select=document.createElement("select") select.setAttribute("size",15) select.setAttribute("id","ArticlesList") select.setAttribute("style","width:300px") for (var i=0; i<Articles.length; i++) { var option=document.createElement("option") option.innerHTML=Articles[i] select.appendChild(option) }   select.selectedIndex=selected ListDiv.appendChild(select) var buttondiv=document.createElement("div") buttondiv.setAttribute("style","width:300px; text-align:center") var prevbutton=document.createElement("input") prevbutton.setAttribute("type", "button") prevbutton.setAttribute("value", "Load previous") prevbutton.setAttribute("style","margin-top:7px") prevbutton.setAttribute("onclick", "LoadWrapper('prev')"); buttondiv.appendChild(prevbutton) var selectbutton=document.createElement("input") selectbutton.setAttribute("type", "button") selectbutton.setAttribute("value", "Load selected") selectbutton.setAttribute("style","margin-top:7px") selectbutton.setAttribute("onclick", "LoadWrapper('selected')"); buttondiv.appendChild(selectbutton) var nextbutton=document.createElement("input") nextbutton.setAttribute("type", "button") nextbutton.setAttribute("value", "Load next") nextbutton.setAttribute("style","margin-top:7px") nextbutton.setAttribute("onclick", "LoadWrapper('next')"); buttondiv.appendChild(nextbutton) ListDiv.appendChild(buttondiv) UIDiv.appendChild(ListDiv)

var AssessmentDiv=document.createElement("div") AssessmentDiv.setAttribute("id","AssessmentDiv") AssessmentDiv.setAttribute("style","width:59.5%; float:right; text-align:center") UIDiv.appendChild(AssessmentDiv)

if (currentlyDisplayed=="") { AssessmentDiv.innerHTML="Select an article from the list to the left and click \"Load selected\" to begin assessment." } else { AssessmentDiv.innerHTML="Loading..."

var QualityList=["Unassessed", "Stub", "Start", "C", "B", "GA", "A", "FA", "FL", "List", "Redirect", "Category", "Disambig", "File", "Project", "Template", "NA"] var ImportanceList=["Unknown", "Top", "High", "Mid", "Low", "Related", "NA"]

var catlist="Category:Unassessed National Register of Historic Places articles" for (var i=1; i<QualityList.length; i++) { // start at 1 to skip unassessed catlist+="|Category:"+QualityList[i]+"-Class National Register of Historic Places articles" }       for (var i=0; i<ImportanceList.length; i++) { catlist+="|Category:"+ImportanceList[i]+"-importance National Register of Historic Places articles" }

var cats=JSON.parse(           $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', prop: 'categories', clcategories: catlist, cllimit: 'max', titles: "Talk:"+currentlyDisplayed },               async:false })           .responseText        ); var tagged=false var quality = "Unassessed" var importance = "Unknown" for (var page in cats.query.pages) { if (cats.query.pages[page].categories) { tagged=true for (var category in cats.query.pages[page].categories) { var CatTitle=cats.query.pages[page].categories[category].title CatTitle=CatTitle.replace("Category:","").replace(" National Register of Historic Places articles","") if (CatTitle.indexOf("importance")!=-1) importance=CatTitle.replace("-importance","") if (CatTitle.indexOf("Class")!=-1||CatTitle.indexOf("Unassessed")!=-1) quality=CatTitle.replace("-Class","") }           }        }        var TitleDiv=document.createElement("div") TitleDiv.setAttribute("style","width:100%; text-align:center; font-size:125%; font-weight:bold; white-space:nowrap; overflow:hidden") TitleDiv.innerHTML=currentlyDisplayed

if (tagged) { var talkpage=JSON.parse(               $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', prop: 'revisions', rvprop: 'content', rvlimit: 1, redirects: 'true', titles: "Talk:"+currentlyDisplayed, rvsection: 0 },                   async:false })               .responseText            ); for (var page in talkpage.query.pages) { var talkpagetext=talkpage.query.pages[page].revisions[0]['*'] }       } else { var talkpagetext="" }       var templateRedirects="WikiProject NRHP|Wikiproject NRHP|WPNRHP" var regex=new RegExp("{"+"{( |\\n)*?(WikiProject National Register of Historic Places|"+templateRedirects+")(.|\\n)*?}}","gi") existingTemplate=talkpagetext.match(regex) if (existingTemplate==null) { existingTemplate="{"+"{WikiProject National Register of Historic Places"+"|class=|importance=}}" // split to avoid transcluding } else { existingTemplate=existingTemplate[0] }       regex=new RegExp("("+templateRedirects+")","gi") var newTemplate=existingTemplate.replace(regex, "WikiProject National Register of Historic Places") regex=/\|( |\n)*?class[ ]*?=(.|\n)*?(?=\||}})/gi if (newTemplate.match(regex)==null) { newTemplate=newTemplate.substr(0,newTemplate.length-2)+"|class="+"}}" } else { if (quality!="Unassessed") newTemplate=newTemplate.replace(regex,"|class="+quality) }       regex=/\|( |\n)*?importance[ ]*?=(.|\n)*?(?=\||}})/gi if (newTemplate.match(regex)==null) { newTemplate=newTemplate.substr(0,newTemplate.length-2)+"|importance="+"}}" } else { if (importance!="Unknown") newTemplate=newTemplate.replace(regex,"|importance="+importance) }

AssessmentDiv.style.textAlign="left" AssessmentDiv.innerHTML="" AssessmentDiv.appendChild(TitleDiv)

AssessmentDiv.innerHTML+="Current assessment: Quality: "+quality+" Importance: "+importance+" " var existingAssessTextarea=document.createElement("textarea") if (tagged) { existingAssessTextarea.innerHTML=existingTemplate existingAssessTextarea.value=existingTemplate } else { existingAssessTextarea.innerHTML="Talk page is not tagged with NRHP project banner." existingAssessTextarea.value="Talk page is not tagged with NRHP project banner." }       existingAssessTextarea.readOnly=true existingAssessTextarea.setAttribute("style","width:500px; height:60px") existingAssessTextarea.setAttribute("id","existingAssessTextarea") AssessmentDiv.appendChild(existingAssessTextarea)

AssessmentDiv.innerHTML+="Your assessment: " var span=document.createElement("span") span.setAttribute("style","display:inline-block; width:175px") span.innerHTML="Quality: " var QualitySelect=document.createElement("select") QualitySelect.setAttribute("id","QualitySelect") QualitySelect.setAttribute("onchange","UpdateNewAssessTextarea") for (var i=0; i<QualityList.length; i++) { var option=document.createElement("option") option.innerHTML=QualityList[i] if (QualityList[i]==quality) option.setAttribute("selected","selected") QualitySelect.appendChild(option) }       span.appendChild(QualitySelect) AssessmentDiv.appendChild(span)

AssessmentDiv.innerHTML+="Importance: " var ImportanceSelect=document.createElement("select") ImportanceSelect.setAttribute("id","ImportanceSelect") ImportanceSelect.setAttribute("onchange","UpdateNewAssessTextarea") for (var i=0; i<ImportanceList.length; i++) { var option=document.createElement("option") option.innerHTML=ImportanceList[i] if (ImportanceList[i]==importance) option.setAttribute("selected","selected") ImportanceSelect.appendChild(option) }       AssessmentDiv.appendChild(ImportanceSelect) AssessmentDiv.innerHTML+=" " var NewAssessTextarea=document.createElement("textarea") NewAssessTextarea.value=newTemplate NewAssessTextarea.setAttribute("style","width:500px; height:60px") NewAssessTextarea.setAttribute("id","NewAssessTextarea") AssessmentDiv.appendChild(NewAssessTextarea)

var EditButton=document.createElement("input") EditButton.setAttribute("type", "button"); EditButton.setAttribute("value", "Apply assessment"); EditButton.setAttribute("id", "EditButton"); EditButton.setAttribute("style","margin-top:7px") EditButton.setAttribute("onclick", "EditPageWithAssessment"); AssessmentDiv.appendChild(EditButton)

var CheckDiv=document.createElement("div") CheckDiv.setAttribute("style","display:inline-block; vertical-align:middle; margin-left:15px")

var autoloadcheck=document.createElement("input") autoloadcheck.setAttribute("type","checkbox") autoloadcheck.setAttribute("id","autoloadcheck") if (CheckDefaults.autoload) autoloadcheck.setAttribute("checked","checked") var autoloadlabel=document.createElement("label") autoloadlabel.setAttribute("for", "autoloadcheck") autoloadlabel.innerHTML="Automatically load next page after successful edit" CheckDiv.appendChild(autoloadcheck) CheckDiv.appendChild(autoloadlabel) CheckDiv.innerHTML+=" "

var ignoreconfirmcheck=document.createElement("input") ignoreconfirmcheck.setAttribute("type","checkbox") ignoreconfirmcheck.setAttribute("id","ignoreconfirmcheck") if (CheckDefaults.ignoreconfirm) ignoreconfirmcheck.setAttribute("checked","checked") var ignoreconfirmlabel=document.createElement("label") ignoreconfirmlabel.setAttribute("for", "ignoreconfirmcheck") ignoreconfirmlabel.innerHTML="Ignore confirmation prompt" CheckDiv.appendChild(ignoreconfirmcheck) CheckDiv.appendChild(ignoreconfirmlabel) CheckDiv.innerHTML+=" "

var watchtargetcheck=document.createElement("input") watchtargetcheck.setAttribute("type","checkbox") watchtargetcheck.setAttribute("id","watchtargetcheck") if (CheckDefaults.watchtarget) watchtargetcheck.setAttribute("checked","checked") var watchtargetlabel=document.createElement("label") watchtargetcheck.setAttribute("for", "watchtargetcheck") watchtargetlabel.innerHTML="Watch target page" CheckDiv.appendChild(watchtargetcheck) CheckDiv.appendChild(watchtargetlabel)

AssessmentDiv.appendChild(CheckDiv) } }

function UpdateNewAssessTextarea { var NewAssessTextarea=document.getElementById("NewAssessTextarea") var QualitySelect=document.getElementById("QualitySelect") var ImportanceSelect=document.getElementById("ImportanceSelect")

var regex=/\|( |\n)*?class[ ]*?=(.|\n)*?(?=\||}})/gi var newQuality="" if (QualitySelect.selectedIndex!=0) newQuality=QualitySelect.options[QualitySelect.selectedIndex].innerHTML NewAssessTextarea.value = NewAssessTextarea.value.replace(regex, "|class=" + newQuality)

var regex=/\|( |\n)*?importance[ ]*?=(.|\n)*?(?=\||}})/gi var newImportance="" if (ImportanceSelect.selectedIndex!=0) newImportance=ImportanceSelect.options[ImportanceSelect.selectedIndex].innerHTML NewAssessTextarea.value = NewAssessTextarea.value.replace(regex, "|importance=" + newImportance) }

function UpdateInfoboxUIDiv(selected, autoload, ignoreconfirm, watchtarget) { var DisplayDiv=document.getElementById("DisplayDiv") var UIDiv=document.getElementById("UIDiv") UIDiv.innerHTML=""

if (Articles.length==0) { UIDiv.style.verticalAlign="middle" UIDiv.innerHTML="There are no more articles with infoboxes needing cleanup. Good job!" DisplayDiv.innerHTML="" return; }

var ListDiv=document.createElement("div") ListDiv.setAttribute("style","width:39.5%; float:left; text-align:left") ListDiv.innerHTML=" "+Articles.length+" articles have infoboxes that need to be cleaned "

var select=document.createElement("select") select.setAttribute("size",15) select.setAttribute("id","ArticlesList") select.setAttribute("style","width:300px") for (var i=0; i<Articles.length; i++) { var option=document.createElement("option") option.innerHTML=Articles[i] select.appendChild(option) }   select.selectedIndex=selected ListDiv.appendChild(select) var buttondiv=document.createElement("div") buttondiv.setAttribute("style","width:300px; text-align:center") var prevbutton=document.createElement("input") prevbutton.setAttribute("type", "button") prevbutton.setAttribute("value", "Load previous") prevbutton.setAttribute("style","margin-top:7px") prevbutton.setAttribute("onclick", "LoadInfoboxWrapper('prev')"); buttondiv.appendChild(prevbutton) var selectbutton=document.createElement("input") selectbutton.setAttribute("type", "button") selectbutton.setAttribute("value", "Load selected") selectbutton.setAttribute("style","margin-top:7px") selectbutton.setAttribute("onclick", "LoadInfoboxWrapper('selected')"); buttondiv.appendChild(selectbutton) var nextbutton=document.createElement("input") nextbutton.setAttribute("type", "button") nextbutton.setAttribute("value", "Load next") nextbutton.setAttribute("style","margin-top:7px") nextbutton.setAttribute("onclick", "LoadInfoboxWrapper('next')"); buttondiv.appendChild(nextbutton) ListDiv.appendChild(buttondiv) UIDiv.appendChild(ListDiv)

var AssessmentDiv=document.createElement("div") AssessmentDiv.setAttribute("id","AssessmentDiv") AssessmentDiv.setAttribute("style","width:59.5%; float:right; text-align:center") UIDiv.appendChild(AssessmentDiv)

if (currentlyDisplayed=="") { AssessmentDiv.innerHTML="Select an article from the list to the left and click \"Load selected\" to begin cleanup." } else { AssessmentDiv.innerHTML="Loading..."

var TitleDiv=document.createElement("div") TitleDiv.setAttribute("style","width:100%; text-align:center; font-size:125%; font-weight:bold; white-space:nowrap; overflow:hidden") TitleDiv.innerHTML=currentlyDisplayed

var pagetext=JSON.parse(           $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', prop: 'revisions', rvprop: 'content', rvlimit: 1, redirects: 'true', titles: currentlyDisplayed },               async:false })           .responseText        ); for (var page in pagetext.query.pages) { pagetext=pagetext.query.pages[page].revisions[0]['*'] }

var regex=new RegExp("{"+"{( |\\n)*?Infobox( |_)NRHP( |\\n)*?(?=\\|)","gi") var str = pagetext.match(regex)[0] var start=pagetext.indexOf(str) var open=1 var index=start+str.length while (open!=0 && index<pagetext.length) { if (pagetext.substr(index,2)=="}}") { open-- index++ } else if (pagetext.substr(index,2)=="{{") { open++ index++ }           index++ }       var existingInfobox=pagetext.substr(start,index-start)

AssessmentDiv.style.textAlign="left" AssessmentDiv.innerHTML="" AssessmentDiv.appendChild(TitleDiv)

var OldInfoboxDiv=document.createElement("div") OldInfoboxDiv.setAttribute("style","width:300px; height:200px; float:left") OldInfoboxDiv.innerHTML+="Old infobox:"

var existingInfoboxTextarea=document.createElement("textarea") existingInfoboxTextarea.innerHTML=existingInfobox existingInfoboxTextarea.value=existingInfobox existingInfoboxTextarea.readOnly=true existingInfoboxTextarea.setAttribute("style","width:295px; height:180px") existingInfoboxTextarea.setAttribute("id","existingInfoboxTextarea") OldInfoboxDiv.appendChild(existingInfoboxTextarea) AssessmentDiv.appendChild(OldInfoboxDiv)

var NewInfoboxDiv=document.createElement("div") NewInfoboxDiv.setAttribute("style","width:300px; height:200px; float:right") NewInfoboxDiv.innerHTML+="New infobox: " var previewLink=document.createElement("a") previewLink.setAttribute("id","previewLink") previewLink.setAttribute("onclick","PreviewInfoboxHTML") previewLink.innerHTML="(preview)" NewInfoboxDiv.appendChild(previewLink)

var NewInfoboxTextarea=document.createElement("textarea") NewInfoboxTextarea.value=existingInfobox NewInfoboxTextarea.setAttribute("style","width:295px; height:180px; float:right") NewInfoboxTextarea.setAttribute("id","NewInfoboxTextarea") NewInfoboxDiv.appendChild(NewInfoboxTextarea) AssessmentDiv.appendChild(NewInfoboxDiv)

var EditButton=document.createElement("input") EditButton.setAttribute("type", "button"); EditButton.setAttribute("value", "Update infobox"); EditButton.setAttribute("id", "EditButton"); EditButton.setAttribute("style","margin-top:7px") EditButton.setAttribute("onclick", "EditPageWithInfobox"); AssessmentDiv.appendChild(EditButton)

var CheckDiv=document.createElement("div") CheckDiv.setAttribute("style","display:inline-block; vertical-align:middle; margin-left:15px")

var autoloadcheck=document.createElement("input") autoloadcheck.setAttribute("type","checkbox") autoloadcheck.setAttribute("id","autoloadcheck") if (CheckDefaults.autoload) autoloadcheck.setAttribute("checked","checked") var autoloadlabel=document.createElement("label") autoloadlabel.setAttribute("for", "autoloadcheck") autoloadlabel.innerHTML="Automatically load next page after successful edit" CheckDiv.appendChild(autoloadcheck) CheckDiv.appendChild(autoloadlabel) CheckDiv.innerHTML+=" "

var ignoreconfirmcheck=document.createElement("input") ignoreconfirmcheck.setAttribute("type","checkbox") ignoreconfirmcheck.setAttribute("id","ignoreconfirmcheck") if (CheckDefaults.ignoreconfirm) ignoreconfirmcheck.setAttribute("checked","checked") var ignoreconfirmlabel=document.createElement("label") ignoreconfirmlabel.setAttribute("for", "ignoreconfirmcheck") ignoreconfirmlabel.innerHTML="Ignore confirmation prompt" CheckDiv.appendChild(ignoreconfirmcheck) CheckDiv.appendChild(ignoreconfirmlabel) CheckDiv.innerHTML+=" "

var watchtargetcheck=document.createElement("input") watchtargetcheck.setAttribute("type","checkbox") watchtargetcheck.setAttribute("id","watchtargetcheck") if (CheckDefaults.watchtarget) watchtargetcheck.setAttribute("checked","checked") var watchtargetlabel=document.createElement("label") watchtargetcheck.setAttribute("for", "watchtargetcheck") watchtargetlabel.innerHTML="Watch target page" CheckDiv.appendChild(watchtargetcheck) CheckDiv.appendChild(watchtargetlabel)

AssessmentDiv.appendChild(CheckDiv) } }

function LoadWrapper(direction) { var DisplayDiv=document.getElementById('DisplayDiv') var select=document.getElementById('ArticlesList') if (direction=="selected"&&select.selectedIndex!=-1) { var article=select.options[select.selectedIndex].text if (currentlyDisplayed!=article) LoadHTML(article) } else if (direction=="next") { select.selectedIndex++ if (select.selectedIndex==-1||select.selectedIndex>=Articles.length) select.selectedIndex=0 var article=select.options[select.selectedIndex].text if (currentlyDisplayed!=article) LoadHTML(article) } else if (direction=="prev") { select.selectedIndex-- if (select.selectedIndex<0) select.selectedIndex=select.options.length-1 var article=select.options[select.selectedIndex].text if (currentlyDisplayed!=article) LoadHTML(article) } }

function LoadInfoboxWrapper(direction) { var DisplayDiv=document.getElementById('DisplayDiv') var select=document.getElementById('ArticlesList') if (direction=="selected"&&select.selectedIndex!=-1) { var article=select.options[select.selectedIndex].text if (currentlyDisplayed!=article) LoadInfoboxHTML(article) } else if (direction=="next") { select.selectedIndex++ if (select.selectedIndex==-1||select.selectedIndex>=Articles.length) select.selectedIndex=0 var article=select.options[select.selectedIndex].text if (currentlyDisplayed!=article) LoadInfoboxHTML(article) } else if (direction=="prev") { select.selectedIndex-- if (select.selectedIndex<0) select.selectedIndex=select.options.length-1 var article=select.options[select.selectedIndex].text if (currentlyDisplayed!=article) LoadInfoboxHTML(article) } }

function LoadHTML(article) { // loads parsed HTML content of article into innerHTML of DisplayDiv var DisplayDiv=document.getElementById('DisplayDiv') var AssessmentDiv=document.getElementById("AssessmentDiv") var autoload=document.getElementById("autoloadcheck") if (autoload!=null) CheckDefaults.autoload=autoload.checked autoload=CheckDefaults.autoload var ignoreconfirm=document.getElementById("ignoreconfirmcheck") if (ignoreconfirm!=null) CheckDefaults.ignoreconfirm=ignoreconfirm.checked ignoreconfirm=CheckDefaults.ignoreconfirm var watchtarget=document.getElementById("watchtargetcheck") if (watchtarget!=null) CheckDefaults.watchtarget=watchtarget.checked watchtarget=CheckDefaults.watchtarget AssessmentDiv.style.textAlign="center" AssessmentDiv.innerHTML="Loading..." var HTMLpage=JSON.parse(       $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', prop: 'revisions', rvprop: 'content', rvparse: true, rvlimit: 1, titles: article, redirects: 'true' },           async:false })       .responseText    ); currentlyDisplayed=article for (var i in HTMLpage.query.pages) { DisplayDiv.innerHTML="" + currentlyDisplayed + " " + HTMLpage.query.pages[i].revisions[0]['*'] + ' ' }   UpdateUIDiv(document.getElementById("ArticlesList").options.selectedIndex, autoload, ignoreconfirm, watchtarget) }

function LoadInfoboxHTML(article) { // loads parsed HTML content of article into innerHTML of DisplayDiv var DisplayDiv=document.getElementById('DisplayDiv') var AssessmentDiv=document.getElementById("AssessmentDiv") var autoload=document.getElementById("autoloadcheck") if (autoload!=null) CheckDefaults.autoload=autoload.checked autoload=CheckDefaults.autoload var ignoreconfirm=document.getElementById("ignoreconfirmcheck") if (ignoreconfirm!=null) CheckDefaults.ignoreconfirm=ignoreconfirm.checked ignoreconfirm=CheckDefaults.ignoreconfirm var watchtarget=document.getElementById("watchtargetcheck") if (watchtarget!=null) CheckDefaults.watchtarget=watchtarget.checked watchtarget=CheckDefaults.watchtarget AssessmentDiv.style.textAlign="center" AssessmentDiv.innerHTML="Loading..." $.ajax({       dataType: "json",        url: mw.util.wikiScript('api'),        data: {            format: 'json',            action: 'parse',            prop: 'text',            page: article,            preview: 'true',            redirects: 'true'        },        error: function (xhr,status,error) {xhr.errorThrown=error},        complete: function (xhr,status) {InfoboxHTMLFetched(xhr,status,article,DisplayDiv,autoload,ignoreconfirm,watchtarget)}    }) }

function InfoboxHTMLFetched(xhr,status,article,DisplayDiv,autoload,ignoreconfirm,watchtarget) { if (status!="success") { alert(status+": "+xhr.errorThrown) return; }

var HTMLpage=JSON.parse(xhr.responseText) currentlyDisplayed=article

DisplayDiv.innerHTML="" + currentlyDisplayed + " " + HTMLpage.parse.text['*'] + ' '

UpdateInfoboxUIDiv(document.getElementById("ArticlesList").options.selectedIndex, autoload, ignoreconfirm, watchtarget) }

function PreviewInfoboxHTML { // loads parsed HTML content of currentlyDisplayed article into innerHTML of DisplayDiv var DisplayDiv=document.getElementById('DisplayDiv') var NewInfoboxTextarea=document.getElementById("NewInfoboxTextarea") var link=document.getElementById('previewLink') link.setAttribute("onclick","") link.innerHTML="(Loading...)"

var pagetext=getAssessmentWikitext(currentlyDisplayed) if (pagetext=="error") { alert("Could not retrieve preview!") return; }

var regex=new RegExp("{"+"{( |\\n)*?Infobox( |_)NRHP( |\\n)*?(?=\\|)","gi") var str = pagetext.match(regex)[0] var start=pagetext.indexOf(str) var open=1 var index=start+str.length while (open!=0 && index<pagetext.length) { if (pagetext.substr(index,2)=="}}") { open-- index++ } else if (pagetext.substr(index,2)=="{{") { open++ index++ }       index++ }   var existingInfobox=pagetext.substr(start,index-start) pagetext=pagetext.replace(existingInfobox, NewInfoboxTextarea.value)

$.ajax({       dataType: "json",        method: "POST",        url: mw.util.wikiScript('api'),        data: {            format: 'json',            action: 'parse',            text: pagetext,            contentmodel: 'wikitext'        },        error: function (xhr,status,error) {xhr.errorThrown=error},        complete: function (xhr,status) {PreviewFetched(xhr,status,DisplayDiv,link)}    }) }

function PreviewFetched(xhr,status,DisplayDiv,link) { if (status!="success") { alert(status+": "+xhr.errorThrown) return; }

var HTMLpage=JSON.parse(xhr.responseText)

DisplayDiv.innerHTML="" + currentlyDisplayed + " " + HTMLpage.parse.text['*'] + ' '

link.setAttribute("onclick","PreviewInfoboxHTML") link.innerHTML="(preview)" }

function EditPageWithAssessment { var existingAssessTextarea=document.getElementById("existingAssessTextarea") var NewAssessTextarea=document.getElementById("NewAssessTextarea") var QualitySelect=document.getElementById("QualitySelect") var ImportanceSelect=document.getElementById("ImportanceSelect") var autoload=document.getElementById("autoloadcheck").checked CheckDefaults.autoload=autoload var ignoreconfirm=document.getElementById("ignoreconfirmcheck").checked CheckDefaults.ignoreconfirm=ignoreconfirm var watchtarget=document.getElementById("watchtargetcheck").checked CheckDefaults.watchtarget=watchtarget

if (QualitySelect.selectedIndex==0||ImportanceSelect.selectedIndex==0) { alert("Please choose a quality AND an importance rating in order to apply the assessment.") return; }   if (existingAssessTextarea.innerHTML==NewAssessTextarea.value) return;

if (!ignoreconfirm) { var confirmstring="Are you sure you want to assess this article as " confirmstring+=QualitySelect.options[QualitySelect.selectedIndex].innerHTML+"-class, " confirmstring+=ImportanceSelect.options[ImportanceSelect.selectedIndex].innerHTML+"-importance?"

var confirmtest=confirm(confirmstring)

if (!confirmtest) return; }   document.getElementById("EditButton").value="Editing..." document.getElementById("EditButton").disabled=true

var talkpage=JSON.parse(       $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', prop: 'revisions', rvprop: 'content', rvlimit: 1, redirects: 'true', titles: "Talk:"+currentlyDisplayed, rvsection: 0 },           async:false })       .responseText    ); for (var page in talkpage.query.pages) { if (typeof talkpage.query.pages[page].missing!="undefined") { var talkpagetext="" } else { var talkpagetext=talkpage.query.pages[page].revisions[0]['*'] }   }

if (talkpagetext=="") { talkpagetext=NewAssessTextarea.value } else { if (existingAssessTextarea.innerHTML=="Talk page is not tagged with NRHP project banner.") { talkpagetext+="\n"+NewAssessTextarea.value } else { talkpagetext=talkpagetext.replace(existingAssessTextarea.innerHTML, NewAssessTextarea.value) }   }    var summary="Assessing article as "+QualitySelect.options[QualitySelect.selectedIndex].innerHTML+"-class, " summary+=ImportanceSelect.options[ImportanceSelect.selectedIndex].innerHTML+"-importance for WP:NRHP " summary+="using script."

var watch="watch" if (!watchtarget) watch="unwatch"

var api = new mw.Api;

api.postWithToken( "edit", {       action: "edit",        section:0,        title: "Talk:"+currentlyDisplayed,        summary: summary,        watchlist: watch,        text: talkpagetext        }    ) .done( function( data ) {       document.getElementById("EditButton").value="Apply assessment"        document.getElementById("EditButton").disabled=false        if (data && data.edit && data.edit.result && data.edit.result == 'Success') {            alert("Edit success!")            for (var i=0; i=Articles.length) currentSelection--            if (autoload==true) {                currentSelection++                if (currentSelection>=Articles.length) {                    currentSelection=0                    document.getElementById("ArticlesList").options.selectedIndex=0                }                LoadHTML(document.getElementById("ArticlesList").options[currentSelection].innerHTML) } else { UpdateUIDiv(currentSelection, autoload, ignoreconfirm, watchtarget) }       } else { alert('Edit query error:\n'+data.error.code+': '+data.error.info); }   })    .fail( function { document.getElementById("EditButton").value="Apply assessment" document.getElementById("EditButton").disabled=false alert('Ajax failure.'); }); }

function EditPageWithInfobox { var existingInfoboxTextarea=document.getElementById("existingInfoboxTextarea") var NewInfoboxTextarea=document.getElementById("NewInfoboxTextarea") var autoload=document.getElementById("autoloadcheck").checked CheckDefaults.autoload=autoload var ignoreconfirm=document.getElementById("ignoreconfirmcheck").checked CheckDefaults.ignoreconfirm=ignoreconfirm var watchtarget=document.getElementById("watchtargetcheck").checked CheckDefaults.watchtarget=watchtarget

var testInfobox=NewInfoboxTextarea.value.substr(1,NewInfoboxTextarea.value.length-2).replace(/{\{(.|\n)*?}}/g,"")

var allowedParamsArray=["added", "alt", "architect", "architecture", "area", "borderless", "builder", "built", "caption"] allowedParamsArray.push("coord_display", "coord_format", "coord_parameters", "coordinates", "customarchitect_title") allowedParamsArray.push("customarchitect", "decrease", "decrease_refnum", "decrease1", "decrease1_refnum", "decrease2") allowedParamsArray.push("decrease2_refnum", "decrease3", "decrease3_refnum", "delisted", "delisted_nrhp_type") allowedParamsArray.push("delisted_nrhp_type2", "delisted_nrhp_type3", "delisted_nrhp_type4", "delisted_other1_date") allowedParamsArray.push("delisted_other2_date", "delisted_other3_date", "demolished", "designated_nrhp_type") allowedParamsArray.push("designated_nrhp_type2", "designated_nrhp_type3", "designated_nrhp_type4", "designated_other1") allowedParamsArray.push("designated_other1_abbr", "designated_other1_color", "designated_other1_date") allowedParamsArray.push("designated_other1_link", "designated_other1_name", "designated_other1_num_position") allowedParamsArray.push("designated_other1_number", "designated_other1_textcolor", "designated_other2") allowedParamsArray.push("designated_other2_abbr", "designated_other2_color", "designated_other2_date") allowedParamsArray.push("designated_other2_link", "designated_other2_name", "designated_other2_num_position") allowedParamsArray.push("designated_other2_number", "designated_other2_textcolor", "designated_other3") allowedParamsArray.push("designated_other3_abbr", "designated_other3_color", "designated_other3_date") allowedParamsArray.push("designated_other3_link", "designated_other3_name", "designated_other3_num_position") allowedParamsArray.push("designated_other3_number", "designated_other3_textcolor", "district_map", "embed", "engineer") allowedParamsArray.push("governing_body", "image", "image_size", "increase", "increase_refnum", "increase1") allowedParamsArray.push("increase1_refnum", "increase2", "increase2_refnum", "increase3", "increase3_refnum") allowedParamsArray.push("label_background", "label_position", "label_size", "lat_degrees", "lat_direction", "lat_minutes") allowedParamsArray.push("lat_seconds", "latitude", "location", "locmap_label", "locmap_label_position", "locmap_relief") allowedParamsArray.push("locmapin", "long_degrees", "long_direction", "long_minutes", "long_seconds", "longitude", "map_alt") allowedParamsArray.push("map_caption", "map_label", "map_width", "mpsub", "name", "nearest_city", "nocat", "nrhp_type") allowedParamsArray.push("nrhp_type2", "nrhp_type3", "nrhp_type4", "partof", "partof_refnum", "refnum", "restored") allowedParamsArray.push("restored_by", "sigdate", "sigdate_label", "sigdate1", "sigdate1_label", "sigdate2", "sigdate2_label") allowedParamsArray.push("sigdate3", "sigdate3_label", "visitation_num", "visitation_ref", "visitation_year", "website")

regex=/\|( |\n)*?.*?=/gi var usedParams=testInfobox.match(regex) var badParams=[] for (var i=0; i0) { alert('There are still unknown parameters in the infobox!\nUnknown params: "'+badParams.join('", "')+'"') return; }

if (existingInfoboxTextarea.innerHTML==NewInfoboxTextarea.value) return;

if (!ignoreconfirm) { var confirmstring="Are you sure you want to edit this article?" var confirmtest=confirm(confirmstring) if (!confirmtest) return; }   document.getElementById("EditButton").value="Editing..." document.getElementById("EditButton").disabled=true

var pagetext=JSON.parse(       $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', prop: 'revisions', rvprop: 'content', rvlimit: 1, redirects: 'true', titles: currentlyDisplayed },           async:false })       .responseText    ); for (var page in pagetext.query.pages) { pagetext=pagetext.query.pages[page].revisions[0]['*'] }

var regex=new RegExp("{"+"{( |\\n)*?Infobox( |_)NRHP( |\\n)*?(?=\\|)","gi") var str = pagetext.match(regex)[0] var start=pagetext.indexOf(str) var open=1 var index=start+str.length while (open!=0 && index<pagetext.length) { if (pagetext.substr(index,2)=="}}") { open-- index++ } else if (pagetext.substr(index,2)=="{{") { open++ index++ }       index++ }   var existingInfobox=pagetext.substr(start,index-start) pagetext=pagetext.replace(existingInfobox, NewInfoboxTextarea.value)

var summary="Script-assisted infobox cleanup; remove unsupported parameters."

var watch="watch" if (!watchtarget) watch="unwatch"

var api = new mw.Api;

api.postWithToken( "edit", {       action: "edit",        title: currentlyDisplayed,        summary: summary,        watchlist: watch,        text: pagetext        }    ) .done( function( data ) {       document.getElementById("EditButton").value="Update infobox"        document.getElementById("EditButton").disabled=false        if (data && data.edit && data.edit.result && data.edit.result == 'Success') {            alert("Edit success!")            for (var i=0; i=Articles.length) currentSelection--            if (autoload==true) {                currentSelection++                if (currentSelection>=Articles.length) {                    currentSelection=0                    document.getElementById("ArticlesList").options.selectedIndex=0                }                LoadInfoboxHTML(document.getElementById("ArticlesList").options[currentSelection].innerHTML) } else { UpdateInfoboxUIDiv(currentSelection, autoload, ignoreconfirm, watchtarget) }       } else { alert('Edit query error:\n'+data.error.code+': '+data.error.info); }   })    .fail( function { document.getElementById("EditButton").value="Apply assessment" document.getElementById("EditButton").disabled=false alert('Ajax failure.'); }); }

function getAssessmentWikitext(title) { try { var output=JSON.parse(           $.ajax({ dataType: "json", url: mw.util.wikiScript('api'), data: { format: 'json', rawcontinue: '', action: 'query', prop: 'revisions', rvprop: 'content', titles: title, indexpageids: true, redirects: 'true' },               async:false })           .responseText        ); for (page in output.query.pages) { wikitext = output.query.pages[page].revisions[0]['*']; }       return wikitext }   catch(err) { return "error" } }

$(window).load(MaintenanceButton);