Because it's your userscripts.org

By pw Last update Nov 5, 2009 — Installed 7,665 times. Daily Installs: 0, 2, 2, 0, 1, 0, 1, 0, 0, 0, 1, 10, 11, 6, 4, 2, 10, 17, 4, 11, 4, 11, 3, 3, 23, 6, 10, 6, 6, 183, 84, 30

There are 5 previous versions of this script.

Add Syntax Highlighting (this will take a few seconds, probably freezing your browser while it works)

// ==UserScript==
// @name           Because it's your userscripts.org
// @namespace      http://userscripts.org/users/31237
// @description    A POWERFUL AND EFFICIENT SCRIPT AND SITE MANAGER FOR USERSCRIPTS.ORG. (Version 20091105) Clean up script lists, by discarding scripts which meet your criteria; install scripts directly from the list; remove unwanted columns from the list; add author info; and more! Gets faster with each use!
// @include        http://userscripts.org/*scripts
// @include        http://userscripts.org/*scripts?page=*
// @include        http://userscripts.org/*scripts/search?*
// @include        http://userscripts.org/*scripts?sort=*
// @exclude        http://userscripts.org/articles/*
// @exclude        http://userscripts.org/forums/*
// @exclude        http://userscripts.org/users/*
// ==/UserScript==
// Allow disabling script entirely
var biyus = GM_getValue("biyus", true);
biyus == true ? biyusToggle = "On" : biyusToggle = "Off";
GM_registerMenuCommand("Toggle BIYUS (" + biyusToggle + ")", toggleBIYUS);
function toggleBIYUS() {
	biyus == true ? biyus = false : biyus = true;
	GM_setValue("biyus", biyus);
	document.location.reload();
}

if (!biyus) { return; }

/*
The more aggressive you are in rejecting scripts by title or
description, the less overhead will attach to initial rejection
by author or @include, which should improve script
performance, even on a slow connection.  Subsequent rejections, if
you have so configured the script, are very efficient, both 
because scripts which were earlier rejected are remembered, 
and because scripts which passed the @include inspection the 
first time are not re-examined.
*/

//SAVE FOR UPGRADE - begin
/*
IF YOU UPGRADE THIS SCRIPT, YOU SHOULD SAVE YOUR REJECT ARRAYS
FIRST SO THAT YOU CAN REPLACE THEM AFTER THE UPGRADE.

Once using this version of the script, you should no longer need to edit
hardcoded rejection criteria; for now, you still need to save the arrays.

Save everything between (and including) '//SAVE FOR UPGRADE' (above)
*/
// Rejected titles:
var rejects = new Array("amey", "automatic signature", "conquer club", "freerice", "hatena", "ogame", "orkut", "scrap", "travian", "tumblr", "wowhead");
/*
Be cautious about what you put in the rejected description field
as you may inadvertently exclude things of interest.
Remove 'no_description' from the list if you do NOT wish
to remove scripts which lack a description.  In my experience,
such scripts are usually worthless.  'not 8859-1' catches scripts
with descriptions containing any character outside the 8859-1
character set, if you've activated that option.
*/
// Rejected descriptions:
var rejdescs = new Array("no_description", "not 8859-1", "conquerclub", "conquer club",  "freerice","ogame", "orkut", "scrap");
/*
Nothing against damian and the PHURI project; it's just a useful
example with which most users must be familiar!  Or perhaps not 
any more....
*/
// Rejected authors:
var rejauths = new Array("damian");

// Rejected @includes
// 'noInclude' rejects scripts with no @include line, which are
// always bogus
var includes = new Array("noInclude");
//SAVE FOR UPGRADE - end

/*
You are, of course, free to do so, but you should not need to
change anything beyond here, unless it be to comment out
any function calls in the next blocks you don't want to use.
There are configuration options to do that and other things.
*/

// Add rejected title terms to hardcoded list
rejects=rejects.concat(GM_getValue('titleTerms',"").split(":"));
// Add rejected authors to hardcoded list
rejauths=rejauths.concat(GM_getValue('rejectByAuthor', "").split(":"));
// Add rejected descriptive terms to hardcoded list
rejdescs=rejdescs.concat(GM_getValue('descTerms',"").split(":"));
// Rejected @includes must still be hardcoded

// Set up the menu and configure form
var body = document.getElementsByTagName('body')[0];
var configDiv = document.createElement('div');
var configForm = document.createElement('form');
configForm.innerHTML = "\
	<input type='checkbox' name='pr'> Discard previously discarded scripts<br>\
	<input type='checkbox' name='tr'> Discard scripts by rejected terms in title<br>\
	<input type='checkbox' name='dr'> Discard scripts by rejected terms in description<br>\
	<span id='tu'>&nbsp;&nbsp;<input type='checkbox' name='tu'> Reject non-8859-1 scripts<br></span>\
	<input type='checkbox' name='ai'> Show author information<br>\
	<span id='ar'>&nbsp;&nbsp;<input type='checkbox' name='ar'> Discard scripts by rejected authors<br></span>\
	<input type='checkbox' name='ir'> Discard scripts by rejected URLs in @include<br>\
	<input type='checkbox' name='sr'> Show discard information at top of page<br>\
	<input type='checkbox' name='lr'> Log information about discards in error console<br>\
	<input type='checkbox' name='db'> Log debugging messages in error console<br>\
	Reject scripts with this term in title:<br><input type='text' size='8' name='rt'><br>\
	Reject scripts with this term in description:<br><input type='text' size='8' name='rd'><br>\
	<span id='ta'><input type='checkbox' name='ta'> Enable rejection by author<br></span>\
	<input type='checkbox' name='ts'> Enable rejection by script<br>\
	<input type='checkbox' name='is'> Enable installation by script<br>\
	Change script listing:<br>\
	<input type='checkbox' name='Rating'> Hide 'Rating' Column<br>\
	<input type='checkbox' name='Posts'> Hide 'Posts' Column<br>\
	<input type='checkbox' name='Fans'> Hide 'Fans' Column<br>\
	<input type='checkbox' name='Installs'> Hide 'Installs' Column<br>\
	<input type='checkbox' name='Last&amp;nbsp;Updated'> Hide 'Last Updated' Column<br>\
	<input type='checkbox' name='Votes'> Hide 'Votes' Column<br>\
	<input type='button' name='apply' title='Saving changes will reload the page' value='Save Changes'>\
";
configDiv.appendChild(configForm);
configDiv.setAttribute('id','configForm');
var sp = GM_getValue("showPriors", false);
sp == true ? spToggle = "On" : spToggle = "Off";
GM_registerMenuCommand("Show Prior Rejects (" + spToggle + ")", showPriorReject);
function showPriorReject() {
	sp == true ? sp = false : sp = true;
	GM_setValue("showPriors", sp);
	document.location.reload();
}

body.appendChild(configDiv);
configForm.elements.namedItem("rt").addEventListener('change', rejectTitleAdd, false);
configForm.elements.namedItem("rd").addEventListener('change', rejectDescAdd, false);
configForm.elements.namedItem("apply").addEventListener('click', function() { document.location.reload() }, false);

GM_registerMenuCommand("Clear Prior Rejects", clearArrays);

// The rejectPriorRejects() function rejects scripts based on the stored
// script numbers of scripts which have been previously rejected
// or, alternatively, shows prior rejects
var pr = GM_getValue("priorReject", true);
if (!sp) {
	configForm.elements.namedItem("pr").checked = pr;
	configForm.elements.namedItem("pr").addEventListener('change', priorReject, false);
}
function priorReject() {
	pr == true ? pr = false : pr = true;
	GM_setValue("priorReject", pr);
}

var tr = GM_getValue("titleReject", true);
if (!sp) {
	configForm.elements.namedItem("tr").checked = tr;
	configForm.elements.namedItem("tr").addEventListener('change', titleReject, false);
}
function titleReject() {
	tr == true ? tr = false : tr = true;
	GM_setValue("titleReject", tr);
}

var dr = GM_getValue("descriptReject", true);
if (!sp) {
	configForm.elements.namedItem("dr").checked = dr;
	configForm.elements.namedItem("dr").addEventListener('change', descriptReject, false);
}
function descriptReject() {
	dr == true ? dr = false : dr = true;
	GM_setValue("descriptReject", dr);
	dr == false ? document.getElementById('tu').style.display='none' : document.getElementById('tu').style.display='inline';
}
dr == false ? document.getElementById('tu').style.display='none' : document.getElementById('tu').style.display='inline';
var tu = GM_getValue("trashUni", false);
if (!sp && dr) {
	configForm.elements.namedItem("tu").checked = tu;
	configForm.elements.namedItem("tu").addEventListener('change', trashUni, false);
}
function trashUni() {
	tu == true ? tu = false : tu = true;
	GM_setValue("trashUni", tu);
}

var ai = GM_getValue("authInsert", true);
if (!sp) {
	configForm.elements.namedItem("ai").checked = ai;
	configForm.elements.namedItem("ai").addEventListener('change', authInsert, false);
}
function authInsert() {
	ai == true ? ai = false : ai = true;
	GM_setValue("authInsert", ai);
	ai == false ? document.getElementById('ar').style.display='none' : document.getElementById('ar').style.display='inline';
	ai == false ? document.getElementById('ta').style.display='none' : document.getElementById('ta').style.display='inline';
	var author = document.evaluate("//div[@class='author']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
	for (var i=0; i<author.snapshotLength; i++) {
		if (ai == false) {
			author.snapshotItem(i).style.display='none';
			ta = false;
			imgAuth();
		} else {
			ta = GM_getValue("trashAuth", true);
			author.snapshotItem(i).style.display='block';
			ta == false ? ta = false : ta = true;
			imgAuth();
		}
	}
}
ai == false ? document.getElementById('ar').style.display='none' : document.getElementById('ar').style.display='inline';
ai == false ? document.getElementById('ta').style.display='none' : document.getElementById('ta').style.display='inline';
var ar = GM_getValue("authReject", true);
if (!sp && ai) {
	configForm.elements.namedItem("ar").checked = ar;
	configForm.elements.namedItem("ar").addEventListener('change', authReject, false);
}
function authReject() {
	ar == true ? ar = false : ar = true;
	GM_setValue("authReject", ar);
}

var ir = GM_getValue("inclReject", false);
if (!sp) {
	configForm.elements.namedItem("ir").checked = ir;
	configForm.elements.namedItem("ir").addEventListener('change', inclReject, false);
}
function inclReject() {
	ir == true ? ir = false : ir = true;
	GM_setValue("inclReject", ir);
}

var ta = GM_getValue("trashAuth", true);
if (!sp) {
	configForm.elements.namedItem("ta").checked = ta;
	configForm.elements.namedItem("ta").addEventListener('change', trashAuth, false);
}
function trashAuth() {
	ta == true ? ta = false : ta = true;
	GM_setValue("trashAuth", ta);
	imgAuth();
}
function imgAuth() {
//	remove delete author imgs + options div if empty
	var img_authors = document.evaluate("//img[@class='img_author']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
	for (var i=0; i<img_authors.snapshotLength; i++) {
		var img = img_authors.snapshotItem(i);
		ta == true ? img.style.display='inline' : img.style.display='none';
	}
	var options = document.evaluate("//div[@class='options']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
	for (var i=0; i<options.snapshotLength; i++) {
		if ((ta == false) && (ts == false) && (is == false)) {
			options.snapshotItem(i).style.display='none';
		} else {
			options.snapshotItem(i).style.display='block';
		}
	}
}

var ts = GM_getValue("trashScr", true);
if (!sp) {
	configForm.elements.namedItem("ts").checked = ts;
	configForm.elements.namedItem("ts").addEventListener('change', trashScr, false);
}
function trashScr() {
	ts == true ? ts = false : ts = true;
	GM_setValue("trashScr", ts);
//	remove delete script imgs + options div if empty
	var img_scripts = document.evaluate("//img[@class='img_script']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
	for (var i=0; i<img_scripts.snapshotLength; i++) {
		var img = img_scripts.snapshotItem(i);
		ts == true ? img.style.display='inline' : img.style.display='none';
	}
	var options = document.evaluate("//div[@class='options']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
	for (var i=0; i<options.snapshotLength; i++) {
		if ((ta == false) && (ts == false) && (is == false)) {
			options.snapshotItem(i).style.display='none';
		} else {
			options.snapshotItem(i).style.display='block';
		}
	}
}

var is = GM_getValue("installScr", true);
if (!sp) {
	configForm.elements.namedItem("is").checked = is;
	configForm.elements.namedItem("is").addEventListener('change', installScr, false);
}
function installScr() {
	is == true ? is = false : is = true;
	GM_setValue("installScr", is);
//	remove delete script imgs + options div if empty
	var img_install = document.evaluate("//img[@class='img_install']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
	for (var i=0; i<img_install.snapshotLength; i++) {
		var img = img_install.snapshotItem(i);
		is == true ? img.style.display='inline' : img.style.display='none';
	}
	var options = document.evaluate("//div[@class='options']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
	for (var i=0; i<options.snapshotLength; i++) {
		if ((ta == false) && (ts == false) && (is == false)) {
			options.snapshotItem(i).style.display='none';
		} else {
			options.snapshotItem(i).style.display='block';
		}
	}
}

var sr = GM_getValue("showReject", true);
if (!sp) {
	configForm.elements.namedItem("sr").checked = sr;
	configForm.elements.namedItem("sr").addEventListener('change', showReject, false);
}
function showReject() {
	sr == 1 ? sr = 0 : sr = 1;
	GM_setValue("showReject", sr);
	var rejects = document.getElementById('rejects');
	sr == 1 ? rejects.style.visibility='visible' : rejects.style.visibility='hidden';
}

var lr = GM_getValue("logReject", false);
if (!sp) {
	configForm.elements.namedItem("lr").checked = lr;
	configForm.elements.namedItem("lr").addEventListener('change', logReject, false);
}
function logReject() {
	lr == true ? lr = false : lr = true;
	GM_setValue("logReject", lr);
}

var db = GM_getValue("logDebug", false);
configForm.elements.namedItem("db").checked = db;
configForm.elements.namedItem("db").addEventListener('change', logDebug, false);
function logDebug() {
	db == true ? db = false : db = true;
	GM_setValue("logDebug", db);
}

// The columns of unnecessary data on the scripts listing page
var sh1 = GM_getValue("Rating", false);
configForm.elements.namedItem("Rating").checked = sh1;
configForm.elements.namedItem("Rating").addEventListener('change', showhide, false);
var sh2 = GM_getValue("Posts", false);
configForm.elements.namedItem("Posts").checked = sh2;
configForm.elements.namedItem("Posts").addEventListener('change', showhide, false);
var sh3 = GM_getValue("Fans", false);
configForm.elements.namedItem("Fans").checked = sh3;
configForm.elements.namedItem("Fans").addEventListener('change', showhide, false);
var sh4 = GM_getValue("Installs", false);
configForm.elements.namedItem("Installs").checked = sh4;
configForm.elements.namedItem("Installs").addEventListener('change', showhide, false);
var sh5 = GM_getValue("Last&nbsp;Updated", false);
configForm.elements.namedItem("Last&nbsp;Updated").checked = sh5;
configForm.elements.namedItem("Last&nbsp;Updated").addEventListener('change', showhide, false);
var sh6 = GM_getValue("Votes", false);
configForm.elements.namedItem("Votes").checked = sh6;
configForm.elements.namedItem("Votes").addEventListener('change', showhide, false);

// End menu and form set up

var m = 0; // count scripts rejected
var n = 0; // total scripts reviewed
var script_no;
// Take snapshots before hiding columns
var headers = document.evaluate("//tr/th", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
var rows = document.evaluate("id('content')//tr", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
var cells = document.evaluate("id('content')//td", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);

// The first few functions are in order from least overhead to
// most.  The functions are executed by array so that an exception
// thrown by one will not prevent the next from running.
functions = new Array(createOptionsBar, hideColumns, rejectTrashArray, rejectPriorRejects, rejectTitles, rejectDescriptions, rejectIncludes, insertAuthors, trashScripts, showRejectInfo, cleanArrays);
for (f=0; f<functions.length; f++) {
	try { functions[f](); }
	catch(e) { debug("Trying " + functions[f] + " caused error: " + e); }
}

function createOptionsBar() {
	if (sp) { return; }
	var head = document.getElementsByTagName('head')[0];
	var style = document.createElement('style');
	style.type = 'text/css';
	style.innerHTML = "\
		th a:visited { color:white; }\
		div.options { visibility:visible;background-color:lightblue;text-align:right; }\n\
		#rejects { cursor:default;text-align:right;color:white; };\n\
		img { margin:2px; }\n\
		#configForm { visibility:hidden; position:fixed; top:175px; left:5px; background-color:lightgray; }\n\
	";
	head.appendChild(style);
	var optall = document.createElement('div');
	optall.setAttribute('style','cursor:pointer;position:fixed;top:150px;left:5px');
	optall.setAttribute('id','optall');
	optall.innerHTML = "<span title=\"Because It's Your Usercripts.org Script Manager\"><u>Show BIYUS options</u><span><br/>";
	body.appendChild(optall);
	optall.addEventListener("click", configBIYUS, false);
	var script = document.evaluate("//td[@class='script-meat']//a[@class='title']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
	for (var i=0; i<script.snapshotLength; i++) {
		var a=script.snapshotItem(i).parentNode;
		var s=script.snapshotItem(i).href;
		var d=document.createElement("div");
		script_no=s.match(/\/(\d+)/)[1];
		d.style.display='none'; // hide until populated
		if (script_no) {
			d.setAttribute("class", "options");
			d.setAttribute("id", "options-"+script_no);
			a.appendChild(d);
			installScripts(script_no);
			trashScripts(script_no);
			// The author delete function is handled separately
		}
	}
}

function hideColumns() {
	if (sh1) hide('Rating');
	if (sh2) hide('Posts');
	if (sh3) hide('Fans');
	if (sh4) hide('Installs');
	if (sh5) hide('Last&nbsp;Updated');
	if (sh6) hide('Votes');
}

function rejectTrashArray() {
	if (sp||pr) { return; } // if 'pr' these get rejected there
	var rows = document.evaluate("//tr/td[@class='script-meat']/a[@class='title']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
	for (var i = 0; i<rows.snapshotLength; i++) {
		var trow = rows.snapshotItem(i);
		script_no = trow.href.match(/(\d+)/)[1];
		var trashed = GM_getValue("trashArray","").split(":");
		for (var j = 0; j<trashed.length; j++) {
			if (trashed[j]==script_no) {
				m++;
				rejrow=document.getElementById("scripts-"+script_no);
				rejrow.parentNode.removeChild(rejrow);
				log('Rejected Script #' + script_no + ' from trashArray');
				break;
			}
		}
	}
}

function rejectPriorRejects() {
	var links = document.evaluate("//tr/td[@class='script-meat']/a[1]", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
	n = links.snapshotLength;
	if (!sp && !pr) { return; }
	var canData = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFuSURBVBgZBcG/S1RxAADwz3teyp3XFUUWNVSoRGQR3dLQIESBbUZt9gekm9XW2lRbNDv0gxbJWoJoCcT+ABskTgcDDwLpOD19d+/73rfPJ4kAANaejUx03t5eBZIIgKe34r3JB7OTVVvZuzf9lderiKIoip7MLba+xY24H4v4N36PC635uSgFIJ2/Pz7ppH19w66aHk/nqQCfk8LU1BWJAyMyo3Y1bV2nwpeh8nxxthg+Vm+ZUFVKHDjhK1UqlJeK52E61LOkasOhRDAic8EWKp/qxaupmdOO6Fi3bVyiEAQdA6Th7tjMGYcyDTcdtWlUoqYtypHmjy/atadrX6JpU5QaMhDlSPNTFX9kMj0H6rr+gYFCjnSw3XNZ2y9dPfT1lUq5UkA6+Phb3TU3NJArHFeKhtTkSBc+rC//0NBQVbNmwphzGu5oCztUGDz8udydbSrlVmI9eSkIirzYKZokESw+yl+EdtgL75eWAID/yIWfXhcZhKEAAAAASUVORK5CYII=";
	var rejectArrays = new Array('TitleRejects','DescriptionRejects','AuthorRejects','IncludeRejects','trashArray');
	for (var a=0; a<rejectArrays.length; a++) {
	var r = rejectArrays[a];
	var priorRejects = GM_getValue(r, "");
	debug("Reading " + r + " array");
	if (priorRejects) {
		var priors = priorRejects.split(":");
		debug(priors.length + " scripts have been previously deleted in " + r + "!");
		for (var i = 0; i<links.snapshotLength; i++) {
			var link = links.snapshotItem(i);
			debug("Processing " + link);
			var script_no = link.href.match(/(\d+)/)[1];
			for (var j = 0; j<priors.length; j++) {
				if (script_no == priors[j]) {
					debug("Script " + priors[j] + " on prior reject list");
					if (sp) {
						var can = document.createElement('img');
						can.title = "Click to untrash script #" + script_no + " from " + r + " array!";
						can.src = canData;
						can.setAttribute('id', script_no);
						can.setAttribute('class', r);
						can.addEventListener("click", untrash, false);
						link.parentNode.appendChild(can);
						break;
					} else {
						if (!pr) { return; }
						m++;
						rejrow=document.getElementById("scripts-"+script_no);
						rejrow.parentNode.removeChild(rejrow);
						log('Rejected prior reject, script #' + script_no + ' ('+r+')');
						break;
					}
				}
			}
		}
	}
	} // end for loop
}

function rejectTitles() {
	if (sp||!tr) { return; }
	var rows = document.evaluate("//tr/td[@class='script-meat']/a[@class='title']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
	for (var i = 0; i<rows.snapshotLength; i++) {
		var trow = rows.snapshotItem(i);
		var title = trow.textContent.toString();
		for (var j = 0; j<rejects.length; j++) {
			test = new RegExp(rejects[j],"gi");
			if (rejects[j] && title.match(test)) {
				m++;
				script_no = trow.href.match(/(\d+)/)[1];
				rejrow=document.getElementById("scripts-"+script_no);
				rejrow.parentNode.removeChild(rejrow);
				log('Rejected Script #' + script_no + ', Titled: "' + title + '"');
				var tmpTR = GM_getValue('TitleRejects', "");
				arrayTR = (tmpTR + ":" + script_no).split(":");
				GM_setValue('TitleRejects', arrayTR.join(":")); //}
				break;
			}
		}
	}
}

function rejectDescriptions() {
	if (sp||!dr) { return; }
	var rows = document.evaluate("//tr/td[@class='script-meat']/a[@class='title']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
	var descs = document.evaluate("//tr/td[@class='script-meat']/p[@class='desc']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
	for (var i = 0; i<descs.snapshotLength; i++) {
		var desc = descs.snapshotItem(i);
		var details = desc.textContent.toString();
		details = rejectByUnicode(details);
		details ? details = details : details = "no_description";
		for (var j = 0; j<rejdescs.length; j++) {
			test = new RegExp(rejdescs[j],"gi");
			if (rejdescs[j] && details.match(test)) {
				m++;
				script_no = rows.snapshotItem(i).href.match(/(\d+)/)[1];
				rejrow=document.getElementById("scripts-"+script_no);
				rejrow.parentNode.removeChild(rejrow);
				log('Rejected Script #' + script_no + ', Described: "' + details + '"');
				var tmpDR = GM_getValue('DescriptionRejects', "");
				arrayDR = (tmpDR + ":" + script_no).split(":");
				GM_setValue('DescriptionRejects', arrayDR.join(":"));
				break;
			}
		}
	}
}

function rejectByUnicode(str) {
	if (!tu) { return str; }
// Reject if ANY character in description is outside the
// 8859-1 charset
	if (str.match(/[^\u0000-\u0255]/)) { str = "not 8859-1"; }
	return str;
}

function insertAuthors() {
	if (!ai) { return; }
	var script = document.evaluate("//td[@class='script-meat']//a[@class='title']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
	debug("There are " + rejauths.length + " authors in the reject list");
	for (var i=0; i<script.snapshotLength; i++) {
		var a=script.snapshotItem(i).parentNode;
		var s=script.snapshotItem(i).href;
		insertAuthorInfo(a,s);
	}
}

// This function uses asynchronous HTTP and so is much faster
// than it was.
function insertAuthorInfo(a,s) {
	var request = new XMLHttpRequest();
	script_no = s.match(/\/(\d+)/)[1];
	request.open("GET", s, true);
	request.send(null);
	request.onreadystatechange = function() {
		if(request.readyState == 4) {
			if (request.status == 200) {
				var aName = request.responseText.match(/<.+?author.+?>.+?(<a.+?>(.+?)<\/a>)/m);
				if (!aName) { aName = new Array("","unkn0wn",""); }
				rejectAuthor(aName[1],a,s);
				var authText = document.createElement('div');
				authText.setAttribute("class", "author");
				authText.setAttribute("id", aName[2]+"_"+script_no);
				authText.setAttribute('style', 'background-color:lightgray;color:white;');
				authText.innerHTML = "Scriptwright: " + aName[1];
				a.appendChild(authText);
				if (ta && !sp) {
					delauthor = document.createElement('img');
					delauthor.title = "Delete all scripts by " + aName[2];
					delauthor.src ='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKRSURBVDjLpZNrSNNRGIeVuaSLrW2NCozlSsrCvqifKrG1vyznRDLQMi9TsamsUCzvSWJKC0Ms0/I2hratmVbi3bLIysRZlgh9qFGuCKOF5KaonV9n+yAGokIHHs7hhd/zvofDcQHg8j8sW0wN2FpQJuVNl8u2QC3loEDMtUX7CYrXJDjrx8u6FcYlNVE83KbciOCiNISD9MDNRHaQf3lVQZWMgwYaVNNQqcwBF1dCBbhwlIczfpypVQWlgZvQVZUPS6cag7XpOBckQIZkB9IYEZIPcee02XL3FQU1scKfM98/YOpFFb72XseooRDm9quwmk3QKXdPvdOkrltRUBG9f8A6dBeTw0bY3+ooeufZatLhToLv8IpX2CZrYnsfTtXqVP6YHa7FzFirE/ubJrRk+sM3UHlfwNSsX1YgCNG586WNKZ7SPox9mYYhLwz6PLkTx/n5+G94Bj8BT1x3ni+u3vCPgH/c4OoRbIgXhg5g3GJHowXIGANSXgOJT4G4DkBTXolnMT7oFbPxgNlo7WDYuYuCAxH14ZKTahgHF1A9CqheESj7CZK6CWIfElwrqsRI5hHMtJeBjHfBps/AUJrvn55jbiqnYCR/38JkWzZu1rchvpN2pR0VjwhimglONREYw/fATsOokANZXKDECz/UQeiWsD45BaMFPsTaU4So5AYU99oQ3Qyc1hNEagkiagn66NjE1IKl61fhdlp3I07Be60qx5TjPa9QlMwHxPdDQUdPWELrCSGm6xIBGpq96AIr5bOShW6GZVl8BbM+xeNSbjF/V3hbtTBIMyFi7tlEwc1zIolxLjM0bv5l4l58y/LCZA4bH5Nc8VjuttDFsHLX/G0HIndm045mx9h0n3CEHfW/dpehdpL0UXsAAAAASUVORK5CYII=';
					delauthor.setAttribute('class','img_author');
					delauthor.setAttribute('id', aName[2]);
					delauthor.addEventListener("click", trashAuthor, false);
					script_no=s.match(/\/(\d+)/)[1];
					document.getElementById("options-"+script_no).appendChild(delauthor);
					document.getElementById("options-"+script_no).style.display='block';
				}
			}
		}
	}
}

function rejectAuthor(link,a,s) {
	if (sp||!ai||!ar) { return; }
	var author = link.match(/<a.+?>(.+?)<\/a>/)[1];
	var user = link.match(/\/(.+[^\/])$/)[1];
	var script_no = s.match(/\/(\d+)/)[1];
	debug("Script #" + script_no + " was written by " + author);
	var r=0;
	for (var l = 0; l<rejauths.length; l++) {
		test = new RegExp("\\b" + rejauths[l] + "\\b","gi");
// An empty array member matches everything so make sure it's not
		if (rejauths[l] && author.match(test)) {
			r++; m++;
			rejrow=document.getElementById("scripts-"+script_no);
			rejrow.parentNode.removeChild(rejrow);
			log('Rejected Script #' + script_no + ' By: ' + author);
			var tmpAR = GM_getValue('AuthorRejects', "");
			arrayAR = (tmpAR + ":" + script_no).split(":");
			GM_setValue('AuthorRejects', arrayAR.join(":"));
			break;
		}
	}
}

/*
This is a last resort to catch those scripts which are ill-titled
and ill-described and whose authors contribute non-rejectable
scripts in addition to their rejectable ones.

It saves the # of any script which passes the @include test,
and gives it a free pass in future; that saves a good bit of
overhead, but allows a script to be smuggled through (not a great
danger)!
*/

function rejectIncludes() {
	if (!ir||sp) { return; }
	var script = document.evaluate("//td[@class='script-meat']//a[@class='title']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
	var include;
	goodIncArray = cleanArray('goodIncludes');
	debug("Checking @include in " + script.snapshotLength + " scripts");
	for (var i=0; i<script.snapshotLength; i++) {
		br = 0; // loop breaker
		var s = script.snapshotItem(i).href.replace(/show/, "review");
		var script_no = s.match(/(\d+)/)[1];
		if (inArray(script_no,goodIncArray)) { debug("Gave script #" + script_no + " @include pass"); continue; }
		s += "?format=txt";
		var sc = script.snapshotItem(i);
		rejectInclude(script_no,s,sc);
	}
}

function rejectInclude(script_no,s,sc) {
	var request = new XMLHttpRequest();
	request.open("GET", s, true);
	request.send(null);
	request.onreadystatechange = function() {
		if(request.readyState == 4) {
			if (request.status == 200) {
				debug("Getting info from " + s);
				include = request.responseText.match(/\@include\s+\S+/g);
				debug("include = " + include);
				// If include has no properties, the script is bogus so we'll get rid of it!
				if (!include) { include = new Array (" noInclude "); }
				debug("Script #" + script_no + " includes " + include[0]);
				for (var j=0; j<include.length; j++) {
					for (var k=0; k<includes.length; k++) {
						if (include[j].split(/\s+/)[1].match(includes[k])) {
							rejrow=document.getElementById("scripts-"+script_no);
							rejrow.parentNode.removeChild(rejrow);
							m++;
							log("Rejected Script #" + script_no + " which @includes " + include[j].split(/\s+/)[1]);
							var tmpIR = GM_getValue('IncludeRejects', "");
							arrayIR = (tmpIR + ":" + script_no).split(":");
							GM_setValue('IncludeRejects', arrayIR.join(":"));
							br++;
							break;
						}
					}
					if (br) { break; }
					goodInc = GM_getValue('goodIncludes', "");
					arrayGI = (goodInc + ":" + script_no).split(":");
					GM_setValue('goodIncludes', arrayGI.join(":"));
				}
			}
		}
	}
}

function installScripts(script_no) {
	if (!is||sp) { return; }
	var a = document.createElement('a');
	inscript = document.createElement('img');
	inscript.title = "Install this script (#" + script_no + ")";
	inscript.src ='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAALvSURBVBgZBcFNaNUFAADw3//jbe/t6d6cc2/kUpeXsEgUsSSiKIzAQxDdvCgdulgagmBXLx4K7BgRWamnOgSDIj3EusRangwlbVvOyba25tvH23v/z36/oCxLcOr7uaO48sxA9Vg7LbTTQloUtrKihXUsI8cqVvAtfo4Biix78eDItmPnX90FADaTotFOisZqJx9NUta7udnlDT/+vXkc52KAIsua/T0BmHuSqwSBOCCK6a2E9vSGojBUiTg0WvNUoz74xeTjT0OAPE376zFZwXoSaKU86dLq0OqwssXSRg4uXn/o2Fjd80OVXTFAnqaD23tCm102O7kwDMSIIsKISCAKKBDka36bXnX7YetxDJAnSbNRi7S2Mu1uKQxLUUiYB6KQSCmKUEYW17o+u/lgDadigCxJ9jb7K1qdUgYlUR4IS+RsPfhFliaeGzkhr+SyJBv74aOX/wsB8qS7d6TRazMpBSFREAjWH0lmflV21lR7e/T19fl3acmbAw+9MzT7CQRlWXrr0k+1OArb3104bvKfVKEE6fSEffv2mZ+f12w2hWFodnbW6Oio8fFxRVHUY8i6ya56vSoMKKAkCAi279bpdCwvL5uYmFCr1Rw4cEC73Vav1786c+ZMO4Q86fbFCnFIFAYEoY17tzSiTcPDw+7fv+/1kxe9e/q8R/PzRkZG7N+///Tly5fL+JVz14dw6eizeyyslWYXc/UqnVZLFEWazabh4WG1Kv19lGVgfX3d3Nyc6elpcZ4kb+DEH3dnrG7FNrqlNC8V2UEjG/MGBxeMjY2ZHP/aVFDa8/RuKysr7ty58yUuxHmaHn77tRdqH598CQDkJde+mcKAhYUFRw4f1Ol0zMzMaDQa8F6tVns/ztN0ZmG55drNuwa21Qz0Vw3UezXqvQYGh1y9etUHH5419fukxcVFy2XTrVufl1mW3bxx40YeHDp5ZQjnsBc7sRM7sAONak+lUq1WHKrds7S05M/yyF84efva2Sn4HxcNUm7wsX3qAAAAAElFTkSuQmCC';
	inscript.setAttribute('class','img_install');
	a.href="/scripts/source/"+script_no+".user.js";
	a.appendChild(inscript);
	document.getElementById("options-"+script_no).appendChild(a);
	document.getElementById("options-"+script_no).style.display='block';
}

function trashScripts(script_no) {
	if (!ts||sp) { return; }
	delscript = document.createElement('img');
	delscript.title = "Delete this script (#" + script_no + ")";
	delscript.src ='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAK9SURBVBgZBcFLiFVlAADg7//PuXdmGp3xMeIokk1USG8jKmlRYJJU1K6NRILQopXVImoVFBGBpLteu2gVLYyiUALFRSVk0aKC0nyE5uA43pm598495/zn7/tCzhns//LSQzh867rxXYO6NahbddsaNm0Py7iGhEUs4DMcKwHapnn4vtk1u157bBMA6Fft9KBqpxdX07aqZnmUnL+24tuz/T04WAK0TbN5qhvApRtJJwRloCgZ60Q3j0VFjDoFO7dN2Do9ueGT05cPRYBU11OTJU3LchX0am6M6K3SW2VhyPxKAm98ftGuuUl3z3Q2lQCprjes7Ub9Ef3VJMagRFEQCwpBEWgR0pIfzy06c7F3uQRIVbV5eqLQGzYGoyzGrIjEFBSRQlYUyIWrSyNHjv+9hP0lQFNV2zdPdfRWswYyRQpiRqKQlTlqM6mTNFUzd/SVR69HgFSNts9Oj+lXWYgUIYiICICQyZlmNJKqUYIS9r793URZxO5YJ6pSEmVkGUkAATFSp2SlP2iwBCU0o2rT5OS4GGghEwJRkDMh4ORHhic/9MO/f3lpfF1YU11/nea9ElI1uqmc7CojRQxSG8hZixBw4mNTf37hjucPGJu7y/C3Y8Xvp46/c/yJTr/4/sbtM21Kh3Y/uOPOua0zfjnfSG2WBUXMioLRpy+6/9kXTJw9IZz6QGd4XnfDlnjl3IUdZaqq3Xj65z/+sTgsrYyyOmWjOqiaVpNaB65eMD47x1OvAijf2qJowy1lqusHnnv83ok39z0CAFKmTlnVcOanrQa/fmPyq5eNhv8ZYHmpkAqXi9l79t62fnrymYXl2sX5vvmlVUuDWt1kRYy6naAbWv+cOip2grro6y1k567ElBrvh537Ds/gILZjIzZiPdZjerzb6YyPd+xJp+248rW1/QVVGeeL3Bx58ljz7v/pCEpK8wRGcAAAAABJRU5ErkJggg==';
	delscript.setAttribute('id', script_no);
	delscript.setAttribute('class','img_script');
	delscript.addEventListener("click", trash, false);
	document.getElementById("options-"+script_no).appendChild(delscript);
	document.getElementById("options-"+script_no).style.display='block';
}

function configBIYUS() {
	var cf = document.getElementById('configForm');
	cf.style.visibility == 'visible' ? cf.style.visibility='hidden' : cf.style.visibility='visible';
	cf.style.visibility == 'hidden' ? sh = "Show" : sh = "Hide";
	document.getElementById('optall').innerHTML = "<span title=\"Because It's Your Usercripts.org Script and Site Manager\"><u>" + sh + " BIYUS options</u><span><br/>";
}

function rejectTitleAdd() {
	var rj=this.value;
	if (rj) {
		var array = GM_getValue('titleTerms',"").split(":");
		array.push(rj);
		GM_setValue('titleTerms',array.join(":"));
	}
}

function rejectDescAdd() {
	var rj=this.value;
	if (rj) {
		var array = GM_getValue('descTerms',"").split(":");
		array.push(rj);
		GM_setValue('descTerms',array.join(":"));
	}
}

function showRejectInfo() {
//	if (!sr||sp) { return; }
	if (sp) { return; } // insert even if !sr
	var header = document.evaluate("//div[@id='nav']", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
	var rejectText = document.createElement('div');
	var scripts;
	m==1 ? scripts = "script" : scripts = "scripts";
	if (lr) {
		rejectText.title = m + " " + scripts + " rejected (see Messages in Error Console (Alt-T,C) for details)";
	} else {
		rejectText.title = m + " " + scripts + " rejected";
	}
	rejectText.setAttribute('id', 'rejects');
	rejectText.setAttribute('count', m);
	rejectText.innerHTML = "[*" + (n-m) + "/" + n + "*]";
	header.appendChild(rejectText);
	sr == false ? document.getElementById('rejects').style.visibility='hidden' : document.getElementById('rejects').style.visibility='visible';
}

function cleanArrays() {
	arrays = new Array ('TitleRejects','DescriptionRejects','AuthorRejects','IncludeRejects','trashArray','goodIncludes','rejectByAuthor');
	for (var i=0; i<arrays.length; i++) {
		var r = arrays[i];
		cleanArray(r);
	}
}

function cleanArray(r) {
	array = GM_getValue(r,"").split(":");
	if (array.length == 1) { return; }
	array.sort(byNumber);
	for (var j=0; j<array.length; j++) {
		if (array[j] == array[j-1]) { array.splice(j-1,1); }
	}
	array = array.join(":");
	GM_setValue(r,array);
	return array;
}

function clearArrays() {
	if (confirm("If you prefer to EDIT rather than CLEAR the arrays of rejected scripts,\nopen 'about:config' in the Location Bar, and go to 'greasemonkey'.\nOtherwise, click 'OK' to proceed.")) {
		arrays = new Array ('TitleRejects','DescriptionRejects','AuthorRejects','IncludeRejects','trashArray','goodIncludes');
		for (var i=0; i<arrays.length; i++) {
			var r = arrays[i];
			array = GM_getValue(r,"").split(":");
			if (array.length==1) { continue; }
			if (confirm("Clear array " + r + "?")) {
				GM_setValue(r,"");
			}
		}
	}
}

function inArray(n,r) {
	if (!r) { return 0; }
	array = r.split(":");
	for (var j=0; j<array.length; j++) {
		if (n == array[j]) { debug(n+"=="+array[j]); return 1; }
	}
	return 0;
}

function trashAuthor() {
	author = this.getAttribute('id');
	if (confirm("Really delete all scripts by " + author + "?")) {
		var array = GM_getValue('rejectByAuthor', "").split(":");
		array.push(author);
		GM_setValue('rejectByAuthor', array.join(":"));
		document.location.reload();
	}
}

function trash() {
	script_no = this.getAttribute('id');
	if (confirm("Really delete script #" + script_no + " from the list?")) {
		script_row = document.getElementById("scripts-"+script_no);
		script_row.parentNode.removeChild(script_row);
		array = GM_getValue('trashArray', "").split(":");
		array.push(script_no);
		GM_setValue('trashArray', array.join(":"));
	}
}

function untrash() {
	script_no = this.getAttribute('id');
	var r = this.getAttribute('class');
	if (confirm("Untrashing a script does not protect it from future\nrejection unless you change the rejection criteria!\n\nUntrash script #" + script_no + " from array " + r + "?")) {
			array = GM_getValue(r,"").split(":");
			for (var j=0; j<array.length; j++) {
				if (array[j] == script_no) {
					array.splice(j,1);
					break;
				}
			}
	GM_setValue(r,array.join(":"));
	this.setAttribute('style','visibility:hidden');
	}
}

function log(msg) {
	if (!lr) { return; }
	GM_log(msg);
}

function debug(msg) {
	if (!db) { return; }
	GM_log("(db)" + msg);
}

function byNumber(a,b) {
	return a-b;
}

function showhide() { // show or hide data columns on script list page
	GM_setValue(this.getAttribute('name'), this.checked);
	this.checked == true ? hide(this.getAttribute('name')) : show(this.getAttribute('name'));
}
var thname;
function hide(col) {
	var k;
	for (var i=0; i<headers.snapshotLength; i++) {
		var th = headers.snapshotItem(i);
		if (th.innerHTML.match(col)) {
			k=i;
			th.parentNode.removeChild(th);
		}
		if (th.innerHTML.match("Name")) { thname=i; }
	}
	var j=0;
	for (var i=0; i<cells.snapshotLength; i++) {
		var td = cells.snapshotItem(i);
		if (j == k) { td.parentNode.removeChild(td); }
		j++; j == headers.snapshotLength ? j=0 : j=j;
	}
}
function show(col) {
	var k;
	for (var i=0; i<headers.snapshotLength; i++) {
		var th = headers.snapshotItem(i);
		if (th.innerHTML.match(col)) {
			k=i;
			headers.snapshotItem(thname).parentNode.appendChild(th);
		}
	}
	var j=0;
	for (var i=0; i<cells.snapshotLength; i++) {
		var td = cells.snapshotItem(i);
		if (j == k) { cells.snapshotItem(i-j+thname).parentNode.appendChild(td); }
		j++; j == headers.snapshotLength ? j=0 : j=j;
	}
}