User:Gary/article assessment.js

var linkColor = "#002BB8"; var linkLead = '';

var asTalkPage; //"as" to reduce name conflict - wikicode of talkpage var addingNewTemplate = true; var parametersChanged = 0; var talkpagehtml; //html of talkpage var categoryText = null; //result of query.php request var existingTemplateCodeArray; //those on the talk page var TemplateArray = new Array; var templateSelect; var prioritySelect; var workGroupSelect; var livingSelect; var milHistTaskForceSelect; var livingArray = ["", "yes", "no"]; var priorityArray = ["", "Low", "Mid", "High", "Top"]; var bioWorkGroupArray = ["", "a&e-work-group", "baronets-work-group", "british-royalty", "filmbio-work-group", "military-work-group", "musician-work-group", "peerage-work-group", "politician-work-group", "royalty-work-group", "s&a-work-group", "sports-work-group"]; var filmTaskForceArray = ["", "Awards-task-force", "Festival-task-force", "Filmmaking-task-force", "War-task-force", "Argentine-task-force", "Chinese-task-force", "French-task-force", "Indian-task-force", "Italian-task-force", "Persian-task-force", "Spanish-task-force"]; var milHistTaskForceArray = ["", "———General", "Aviation-task-force", "Historiography-task-force", "Maritime-task-force", "Memorials-task-force", "Science-task-force", "Technology-task-force", "Weaponry-task-force", "———Nations/Regions", "African-task-force", "Australian-task-force", "Balkan-task-force", "British-task-force", "Canadian-task-force", "Chinese-task-force", "Dutch-task-force","French-task-force", "German-task-force", "Indian-task-force", "Italian-task-force", "Japanese-task-force", "Korean-task-force", "Middle-Eastern-task-force", "New-Zealand-task-force","Nordic-task-force","Ottoman-task-force","Polish-task-force","Russian-task-force","South-American-task-force","Southeast-Asian-task-force","Spanish-task-force","US-task-force","———Periods/Conflicts","Ancient-Near-Eastern-task-force","Classical-task-force","Medieval-task-force","Early-Modern-task-force","Napoleonic-task-force","ACW-task-force","WWI-task-force","WWII-task-force"]; function aTemplate { this.name = ""; this.code = ""; this.existsGrade = ""; this.existsPriority = ""; this.isUsers = ""; }

function TemplateSort(a,b) { if ( a.name > b.name ) return 1 else if ( a.name < b.name ) return -1 else return 0; }

addOnloadHook(begin);

function begin { if ( wgNamespaceNumber==0 && !location.pathname.match('/w/index.php') && !document.body.innerHTML.match('id="disambig"') ) {   if ( Cookie.read("wpasStatus") >= "1" || Cookie.read("wpasStatus") === null ) {     if ( $("ca-talk").className == "new" ) {       asTalkPage = ""; update("#000000", "An " + linkLead + "unassessed article", ""); }     else {       var url = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + "/index.php?title=Talk:" + encodeURIComponent(wgTitle) + "&action=raw"; loadTalkPageRaw(url); }   }    else if (Cookie.read("wpasStatus") == "0" && !$("siteSub").innerHTML.match(writeActivations) ) {     $("siteSub").innerHTML += writeActivations; } } }

function loadTalkPageRaw(url) { if (window.XMLHttpRequest) { // branch for native XMLHttpRequest object var tpreq = new XMLHttpRequest; }   else if (window.ActiveXObject) { // branch for IE/Windows ActiveX version var tpreq = new ActiveXObject("Microsoft.XMLHTTP"); }   if (tpreq) { tpreq.onreadystatechange = function { if (tpreq.readyState==4) { // if "OK" if (tpreq.status==200) { getAssessment(tpreq); }      }     };     tpreq.open("GET", url, true); tpreq.send(""); } }

function getAssessment(myreq) { asTalkPage = myreq.responseText; var otherInfo = ""; if ( asTalkPage.match( /\{\{ganominee/i ) ) { otherInfo='. Currently a Good Article candidate.'; } else if ( asTalkPage.match(/\{\{fac[\|}]/i ) ) { otherInfo='. Currently a Featured Article candidate.'; } else if (asTalkPage.match(/\{\{peerreview}/i ) ) { otherInfo='. Currently in peer review.'; }

if ( $("featured-star") ) { if (document.body.innerHTML.match('Featured List', ""); }   else { update("#0066CC", 'A Featured Article', ""); } }  // should get the match once instead of checking repeatedly: else if ( asTalkPage.match(/class *= *a[ \|\n}]/i) ) { update("#007BFF", "An " + linkLead + "A-class article", otherInfo);} else if ( asTalkPage.match(/\{\{ga[|}]/i ) || asTalkPage.match(/currentstatus *= *(ffa\/)?ga/i) ) { update("#007700", 'A Good Article', otherInfo);} else if ( asTalkPage.match(/class *= *b[ \|\n}]/i) ) { update("#999933", "A " + linkLead + "B-class article", otherInfo);} else if ( asTalkPage.match(/class *= *start[ \|\n}]/i) ) { update("#BB6600", "A " + linkLead + "Start-class</a> article", otherInfo);} else if ( asTalkPage.match(/class *= *stub[ \|\n}]/i) ) { update("#990011", "A " + linkLead + "Stub-class</a> article", otherInfo);} else { update("#000000", "An " + linkLead + "unassessed</a> article", otherInfo);} }

function update(color, slogan, info) { if ( typeof document.getElementsByTagName("h1")[0] != "undefined" ) { // see WPdiff:114016002 document.getElementsByTagName("h1")[0].style.cssText = "color: " + color + ";"; } t = $("siteSub").innerHTML;

if (!$("siteSub").innerHTML.match('writeActivations')) { writeActivations = writeActivations; }	else { writeActivations = ''; }

$("siteSub").innerHTML = slogan + " " + t.charAt(0).toLowerCase + t.substring(1) + info + writeActivations; if ( Cookie.read("wpasStatus") == "2" || Cookie.read("wpasStatus") === null) { if ( typeof assessmentMyTemplateCode != "undefined" ) { existingTemplateCodeArray = getTemplatesInString(assessmentMyTemplateCode.join('\n'), true); }   existingTemplateCodeArray = existingTemplateCodeArray.concat( getTemplatesInString(asTalkPage, false) ); for (y = 0; y < existingTemplateCodeArray.length ; y++) { z = 0; notFound = true; while (z < TemplateArray.length && notFound ) { if ( existingTemplateCodeArray[y].name == TemplateArray[z].name ) { TemplateArray[z] = existingTemplateCodeArray[y]; notFound = false; }       z++; }     if ( notFound ) { TemplateArray.push(existingTemplateCodeArray[y]); }   }    TemplateArray.sort(TemplateSort); templateSelect = document.createElement("select"); templateSelect.style.fontSize = '11px'; templateSelect.style.paddingRight = '5px'; for (x = 0; x < TemplateArray.length ; x++) { templateSelect.options[x] = new Option(TemplateArray[x].name, TemplateArray[x].name); if ( TemplateArray[x].existsGrade != "" && !TemplateArray[x].isUsers ) { existingGrade = TemplateArray[x].existsGrade; templateSelect.options[x].style.backgroundColor = getAssessmentBackgroundColor(existingGrade); templateSelect.options[x].text += " → " + existingGrade; }     if (TemplateArray[x].existsPriority != "" && !TemplateArray[x].isUsers ) { templateSelect.options[x].text += "/" + TemplateArray[x].existsPriority; }     if ( typeof assessmentDefaultProject != "undefined" && TemplateArray[x].name.toLowerCase == assessmentDefaultProject.toLowerCase ) { templateSelect.selectedIndex = x;     } }   templateSelect.onchange = projectChange; projectChange; } //more kludge; repaint for imgs $('content').style.zIndex = '3'; window.setTimeout("$('content').style.zIndex = '2'",1);

}

function projectChange { var index = templateSelect.selectedIndex; var templateChoice = templateSelect.options[index].value; myDiv = document.createElement("div"); myDiv.appendChild(templateSelect); if ( TemplateArray[index].code.match(/(priority|importance) *=/) ) {   prioritySelect = document.createElement("select"); prioritySelect.style.fontSize = '11px'; for (x = 0; x < priorityArray.length ; x++) {     prioritySelect.options[x] = new Option(priorityArray[x], priorityArray[x]); if (TemplateArray[index].existsPriority.toLowerCase == priorityArray[x].toLowerCase ) { 						prioritySelect.selectedIndex = x; 					} else if (typeof assessmentDefaultPriority != "undefined" && priorityArray[x] == assessmentDefaultPriority && prioritySelect.selectedIndex < 1) {	   			prioritySelect.selectedIndex = x;	  			} }   		myDiv.appendChild(prioritySelect); }	 		if ( "WPBiography" == templateChoice || "Film" == templateChoice || "FilmsWikiProject" == templateChoice) {   		myWorkGroupArray = ("WPBiography" == templateChoice) ? bioWorkGroupArray : filmTaskForceArray; workGroupSelect = document.createElement("select"); for (x = 0; x < myWorkGroupArray.length ; x++) {     		workGroupSelect.options[x] = new Option(myWorkGroupArray[x], myWorkGroupArray[x]); if (typeof assessmentDefaultWorkGroup != "undefined" && myWorkGroupArray[x] == assessmentDefaultWorkGroup ) {	   			workGroupSelect.selectedIndex = x;	  			} }				myDiv.appendChild(workGroupSelect); } 		if ( "WPBiography" == templateChoice ) { 				livingSelect = document.createElement("select"); var livingFlag = ""; if ( document.body.innerHTML.match("Category:Living_people") ) {	 			livingFlag = "yes"; }				else if ( document.body.innerHTML.match(/Category:\d+ (BC )?deaths/i) ) {	 			livingFlag = "no"; }				else if ( typeof assessmentDefaultLiving != "undefined" ) { 	 			livingFlag = assessmentDefaultLiving; } 				for (x = 0; x < livingArray.length ; x++) {     		livingSelect.options[x] = new Option(livingArray[x], livingArray[x]); if ( livingArray[x] == livingFlag) { 						livingSelect.selectedIndex = x; 					} }				myDiv.appendChild(livingSelect); } 		else if ( "WPMILHIST" == templateChoice ) {   		milHistTaskForceSelect = document.createElement("select"); for (x = 0; x < milHistTaskForceArray.length ; x++) {     		milHistTaskForceSelect.options[x] = new Option(milHistTaskForceArray[x], milHistTaskForceArray[x]); if (typeof assessmentDefaultMilHistTaskForce != "undefined" && milHistTaskForceArray[x] == assessmentDefaultMilHistTaskForce ) {	   			milHistTaskForceSelect.selectedIndex = x;	  			} }   		myDiv.appendChild(milHistTaskForceSelect); } 		writeGradeLinks(templateChoice, myDiv); if ( $("selectionDiv") === null ) { //order of ops is important for IE   		$("contentSub").appendChild(myDiv) } 		else {   		$("contentSub").replaceChild(myDiv, $("selectionDiv")); } 		myDiv.id = "selectionDiv"; }

function writeGradeLinks(template, theDiv) { 		var grades = document.createElement("span"); var count = ( Cookie.read("wpasCount") === null ) ? "0" : Cookie.read("wpasCount") ; filmGrades = (template=="Film") ? ' &bull; <a href="javascript:addAssessment(\'Future\')">Future</a>' : "" ; grades.style.paddingLeft = '5px'; grades.innerHTML = '<a href="javascript:addAssessment(\'Stub\')" title="Assess as Stub using above template [1]" accesskey="1">Stub</a> &bull; <a href="javascript:addAssessment(\'Start\')" title="Assess as Start using above template [2]" accesskey="2">Start</a> &bull; <a href="javascript:addAssessment(\'B\')" title="Assess as B using above template [3]" accesskey="3">B</a> &bull; <a href="javascript:addAssessment(\'GA\')">GA</a> &bull; <a href="javascript:addAssessment(\'A\')">A</a> &bull; <a href="javascript:addAssessment(\'List\')" title="Not applicable to all projects">List</a>' + filmGrades; theDiv.appendChild(grades); }

function addAssessment(grade) { 		var thisTemplateMatch, newLines, textToReplace, template, ti; var priority = null; template = templateSelect.value; ti = templateSelect.selectedIndex; if (asTalkPage == null) { asTalkPage = "";} else if ( asTalkPage.match(new RegExp("\{\{" + template + "[ \n]*[\|}]", "i") ) ) {    		addingNewTemplate = false; } 		else if ( asTalkPage.match(/((^[ \r\n]*\{\{[^\{}]*}}[ \n]*){1,3})/mi ) ) { // there are templates, but not mine replaced = RegExp.$1; replacement = RegExp.$1; if (replaced.match(/(\n{2,}$)/)) { replaced = replaced.replace(RegExp.$1, "\n"); } else { replaced += "\n"; } asTalkPage = asTalkPage.replace(replacement, replaced + TemplateArray[ti].code ); } 		else { 				asTalkPage = TemplateArray[ti].code + "\n" + asTalkPage; } // no templates, so add before rest of talk page asTalkPage.match(new RegExp("(\{\{"+template+"[ \n]*[\|}][^}]*}}?)([ \n]?)", "i" ) ); thisTemplateMatch = RegExp.$1; newLines = RegExp.$2; textToReplace = thisTemplateMatch; thisTemplateMatch = updateTemplate(thisTemplateMatch, "class", grade); if (TemplateArray[ti].code.match(/((priority|importance)) *=/) && prioritySelect.options[prioritySelect.selectedIndex].value != "" ) {    		priority = prioritySelect.options[prioritySelect.selectedIndex].value thisTemplateMatch = updateTemplate(thisTemplateMatch, RegExp.$1, priority ); } 		thisTemplateMatch = thisTemplateMatch.replace(/\| *auto *= *yes(\n)?/i, ""); //wpdiff 122608658 if (template=="WPBiography" || template=="Film" || template=="FilmsWikiProject") {       thisTemplateMatch = thisTemplateMatch.replace("importance", "priority"); if ( workGroupSelect.options[workGroupSelect.selectedIndex].value != "" ) {					thisTemplateMatch = updateTemplate(thisTemplateMatch, workGroupSelect.options[workGroupSelect.selectedIndex].value, "yes" ); } 		}  		if (template=="WPBiography") {				if ( livingSelect.options[livingSelect.selectedIndex].value != "" ) {					thisTemplateMatch = updateTemplate(thisTemplateMatch, "living", livingSelect.options[livingSelect.selectedIndex].value ); }       if ( !thisTemplateMatch.match(/listas *= *\w+/i) ) {       	var sortKey = getSortKey; if ( sortKey != null ) { thisTemplateMatch = updateTemplate(thisTemplateMatch, "listas", sortKey); }       }  		}	  		else if ( template=="WPMILHIST" ) {   		thisTemplateMatch = updateTemplate(thisTemplateMatch, milHistTaskForceSelect.options[milHistTaskForceSelect.selectedIndex].value, "yes" ); } 		asTalkPage = asTalkPage.replace(textToReplace, thisTemplateMatch + ((newLines == "") ? "\n" : newLines) ); asTalkPage = asTalkPage.replace( /\{\{stubclass[^}]}}/i, "" ); // wpdiff 122730502 loadTalkPageHTML(grade, priority, mw.config.get('wgServer') + mw.config.get('wgScriptPath') + "/index.php?title=Talk:" + encodeURIComponent(wgTitle) + "&action=edit", template); }

function updateTemplate(templateCode, parameter, val) { var s = templateCode; if ( s.match(/\n/) ) { addCr ="\n"; } else {addCr = ""}; if ( s.match(" =") ) { addSp =" = "; } else {addSp = "="}; if ( s.match(new RegExp('(' + parameter + ' *= *([^|}\n]*))'))) { if (RegExp.$2 != val) { s = s.replace(RegExp.$1, parameter + addSp + val ); parametersChanged++; }	 }	  else { s = s.replace(/}}/, '|' + parameter + addSp + val + addCr + "}}"); parametersChanged++; }	 return s;	}

function getSortKey { loadCategories(mw.config.get('wgServer') + mw.config.get('wgScriptPath') + "/query.php?what=categories&titles=" + encodeURIComponent(wgTitle) +   	"&clextended&format=yaml"); if ( categoryText != null && categoryText.match(/sortkey: (.+)[\n]/) ) {return RegExp.$1;  } else { return null; } }

function loadCategories(url) { if (window.XMLHttpRequest) { var catReq = new XMLHttpRequest; }   else if (window.ActiveXObject) { var catReq = new ActiveXObject("Microsoft.XMLHTTP"); }  if (catReq) { catReq.onreadystatechange = function { if (catReq.readyState==4) { if (catReq.status==200) { categoryText = catReq.responseText; }      }     };     catReq.open("GET", url, false); catReq.send(""); } }

function loadTalkPageHTML(grade, priority, url, template) { if (window.XMLHttpRequest) { var tphreq = new XMLHttpRequest; }   else if (window.ActiveXObject) { var tphreq = new ActiveXObject("Microsoft.XMLHTTP"); }  if (tphreq) { tphreq.onreadystatechange = function { if (tphreq.readyState==4) { if (tphreq.status==200) { postAssessment(grade, priority, tphreq, template); }      }     };     tphreq.open("GET", url, true); tphreq.send(""); } }

function postAssessment(grade, priority, myreq, template) { var count; var watchPageHTML; var minorEditHTML = '<input name="wpMinoredit" value="1" id="wpMinoredit" />'; talkpagehtml = myreq.responseText; if ( Cookie.read("wpasCount") === null ) { count = 0; } else { count = parseInt(Cookie.read("wpasCount")); } Cookie.create("wpasCount", String(count + 1), 180); if (typeof assessmentMarkAsMinor != "undefined" && !assessmentMarkAsMinor) { minorEditHTML = ""; } if ( talkpagehtml.match(/<input type=.hidden. value="([\w\d]+)." name="wpEditToken"/i) ) { var editToken = RegExp.$1; } if ( talkpagehtml.match(/<input name=.wpAutoSummary. type="hidden" value="([\w\d]+)"/i) ) { var autoSummary = RegExp.$1; } if ( talkpagehtml.match(/<input type=.hidden. value="([\d]+)" name="wpStarttime"/i) ) { var startTime = RegExp.$1; } if ( talkpagehtml.match(/<input type=.hidden. value="([\d]+)" name="wpEdittime"/i) ) { var editTime = RegExp.$1; } if ( document.body.innerHTML.match('id="ca-unwatch"') ) { watchPageHTML = '<input name="wpWatchthis" value="1" id="wpWatchthis" />'; } else if ( talkpagehtml.match(/<input name=.wpWatchthis. type="checkbox" value="1" checked="checked"/i) ) { if ( ( typeof assessmentOverrideWatchPref == "undefined" ) || ( typeof assessmentOverrideWatchPref != "undefined" && !assessmentOverrideWatchPref ) ) { watchPageHTML = '<input name="wpWatchthis" value="1" id="wpWatchthis" />'; } }  mydiv = document.createElement("div"); mydiv.innerHTML = '<form style="visibility: hidden;" id="editform" name="editform" method="post" action="/w/index.php?title=Talk:' + encodeURIComponent(mw.config.get('wgPageName')) + '&action=submit" enctype="multipart/form-data"><textarea name="wpTextbox1" id="wpTextbox1"> <input type="text" name="wpSummary" id="wpSummary"/>' + minorEditHTML + '<input id="wpDiff" name="wpDiff" value="Show changes" type="submit"/><input value="' + startTime + '" name="wpStarttime" /><input value="' + editTime + '" name="wpEdittime" /><input value="'+ editToken + '\" name="wpEditToken" /><input name="wpAutoSummary"  value="' + autoSummary + '" />' + watchPageHTML + ' '; document.body.appendChild(mydiv); document.editform.wpTextbox1.value = asTalkPage; priorityText = ( priority != null ) ? "/"+priority : ""; document.editform.wpSummary.value = ((addingNewTemplate) ? 'added ' : 'updated ') + 'wikiproject ' + template + ' «' + grade + priorityText + '»'; document.editform.submit; }

function getAssessmentBackgroundColor(grade) { var s = grade.toLowerCase; switch (s) { case "none": return "#DDD" break case "stub": return "#FCC" break case "start": return "#FC9" break case "b": return "#FF9" break case "ga": return "#9C9" break case "a": return "#CFF" break case "fa": return "#9BE" break default: return "" } }

function getTemplatesInString(s, isUsers) { var a = new Array; while (s.match(/(\{\{ *([\w\d\.\- ]+)[^\{}]*[^\-]class *= *(\w+)?[^}]*}})/mi) ) { code = RegExp.$1; name = RegExp.$2.charAt(0).toUpperCase + RegExp.$2.substring(1); grade = ( RegExp.$3.length == 1 ? RegExp.$3.toUpperCase : RegExp.$3 ); t = new aTemplate; t.name = name.replace(/ +$/, ""); t.code = code; t.existsGrade = ((grade == "") ? "none" : grade); if ( code.match(/(priority|importance) *= *(\w+)/i) ) { t.existsPriority = RegExp.$2; }   t.isUsers = ( isUsers ) ? true : false; a.push(t); s = s.replace(code, ""); } return a; }

function writeActivations {	status = Cookie.read('wpasStatus'); switch (status) {		case '0': onoff = 'On'; showhide = 'Show'; break; case '1': onoff = 'On'; showhide = 'Show'; break; case '2': onoff = 'Off'; showhide = 'Hide'; break; case '3': onoff = 'Off'; showhide = 'Hide'; break; default: onoff = 'Off'; showhide = 'Hide'; break; } return '   ' + '<small id="writeActivations">' + '	[<a href="javascript:switchActivation(\'onoff\')" id="onoff">' + onoff + '</a>]' + ' &bull;	[<a href="javascript:switchActivation(\'showhide\')" id="showhide">' + showhide + '</a>] ' + ' '; }

function switchActivation(option) {	if (option == 'onoff') {		if ($('onoff').innerHTML == 'On') { $('onoff').innerHTML = 'Off'; $('showhide').innerHTML = 'Hide'; level = '2'; }		else { $('onoff').innerHTML = 'On'; $('showhide').innerHTML = 'Show'; level = '0'; }	}	else if (option == 'showhide') {		if ($('showhide').innerHTML == 'Show') { $('showhide').innerHTML = 'Hide'; level = '3'; }		else { $('showhide').innerHTML = 'Show'; level = '1'; }	} Cookie.create("wpasStatus", level,180); if ((level == "2" || level == '3') && ($("selectionDiv") === null)) { begin; } else if ((level == "1" || level == "0" ) && $("selectionDiv") != null ) { $("selectionDiv").style.display = "none"; } }

var Cookie= { 	create: function(name,value,days) {		var expires; if (days) {			var date = new Date; date.setTime(date.getTime+(days*24*60*60*1000)); expires = "; expires="+date.toGMTString; }		else { expires = ""; } document.cookie = name+"="+value+expires+"; path=/"; },

read: function(name) {		var nameEQ = name + "="; var ca = document.cookie.split(';'); for(var i=0;i < ca.length;i++) {			var c = ca[i]; while (c.charAt(0)==' ') { c = c.substring(1,c.length); } if (c.indexOf(nameEQ) === 0) { return c.substring(nameEQ.length,c.length); } }		return null; },

erase: function(name) {		Cookie.create(name,"",-1); } };