// 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;i<TitlesArray.length; i++) {
for (var j=i+1;j<TitlesArray.length; j++) {
if (TitlesArray[i]==TitlesArray[j]) {TitlesArray.splice(j,1);j--}
}
}
toQuery=TitlesArray.length
var done = "no"
var loops = 0
while (done=="no") {
if (toQuery>50) {
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; l<TempTitlesArray.length; l++) {
if (TempTitlesArray[l]==dabs.query.pages[page].title) {TempTitlesArray.splice(l,1);l--}
}
}
}
}
// Now look at talk pages to find quality stats
if (TempTitlesArray.length>0) {
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="<div style='width:270px; text-align:center'><b>"+Articles.length+" articles need to be tagged/assessed</b></div>"
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+="<b>Current assessment:</b><br><span style='display:inline-block; width:175px'><b>Quality: </b>"+quality+"</span><b>Importance: </b>"+importance+"<br>"
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+="<b>Your assessment:</b><br>"
var span=document.createElement("span")
span.setAttribute("style","display:inline-block; width:175px")
span.innerHTML="<b>Quality: </b>"
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+="<b>Importance: </b>"
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+="<br>"
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+="<br>"
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+="<br>"
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="<div style='width:270px; text-align:center'><b>"+Articles.length+" articles have infoboxes that<br>need to be cleaned</b></div>"
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+="<b>Old infobox:</b>"
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+="<b>New infobox: </b>"
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+="<br>"
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+="<br>"
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="<h1 style='white-space:nowrap; overflow:hidden'><a href='//en.wikipedia.org/wiki/" + encodeURIComponent(currentlyDisplayed).replace(/\'/g,"%27") + "' target='_blank'>" + currentlyDisplayed + "</a></h1>" + HTMLpage.query.pages[i].revisions[0]['*'] + '<div style="clear:both;"></div>'
}
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="<h1 style='white-space:nowrap; overflow:hidden'><a href='//en.wikipedia.org/wiki/" + encodeURIComponent(currentlyDisplayed).replace(/\'/g,"%27") + "' target='_blank'>" + currentlyDisplayed + "</a></h1>" + HTMLpage.parse.text['*'] + '<div style="clear:both;"></div>'
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="<h1 style='white-space:nowrap; overflow:hidden'><a href='//en.wikipedia.org/wiki/" + encodeURIComponent(currentlyDisplayed).replace(/\'/g,"%27") + "' target='_blank'>" + currentlyDisplayed + "</a></h1>" + HTMLpage.parse.text['*'] + '<div style="clear:both;"></div>'
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 [[User:Dudemanfellabra/AssessNRHP.js|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; i++) {
if (Articles[i]==currentlyDisplayed) Articles.splice(i,1)
}
currentlyDisplayed=""
var currentSelection=document.getElementById("ArticlesList").options.selectedIndex
if (currentSelection>=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; i<usedParams.length; i++) {
var allowed=false
for (var j=0; j<allowedParamsArray.length; j++) {
if (usedParams[i].replace(/[\| =]/g,"")==allowedParamsArray[j]) {allowed=true; break}
}
if (!allowed) badParams.push(usedParams[i].replace(/[\| =]/g,""))
}
if (badParams.length>0) {
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="[[User:Dudemanfellabra/AssessNRHP.js|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; i++) {
if (Articles[i]==currentlyDisplayed) Articles.splice(i,1)
}
currentlyDisplayed=""
var currentSelection=document.getElementById("ArticlesList").options.selectedIndex
if (currentSelection>=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);