Greasy Fork is available in English.

Hide Threads and Replies by Poster

Hides threads based on the player(s) that posted the thread or replied. Applies to all sub-forums, your Clan forum and your Mail. Also appplies to individual threads.

您查看的为 2017-05-21 提交的版本。查看 最新版本

// ==UserScript==
// @name	Hide Threads and Replies by Poster
// @namespace	daniel.church@btinternet.com
// @description	Hides threads based on the player(s) that posted the thread or replied. Applies to all sub-forums, your Clan forum and your Mail. Also appplies to individual threads.
// @include	https://www.warlight.net/*
// @version	1
// @grant	none
// @license	n/a
// ==/UserScript==
/*
First released on 8/12/2016 see https://www.warlight.net/Forum/222938-dans-userscript-hide-threads-replies-poster for evidence.

Copyright 2017 Daniel Church

Terms and Conditions:
Terms
i) Software. Software means this Userscript.
ii) You. You is the person who is or has or wanting to use this software.

Conditions
1) THIS SOFTWARE AND OTHER VARIATIONS MAY NOT BE USED FOR COMMERCIAL PURPOSES UNDER ANY CIRCUMSTANCES.
2)
2.1) THIS SOFTWARE MAY NOT BE DISTRIBUTED UNDER ANY CIRCUMSTANCES.
2.2) IF YOU DISTRIBUTE THIS SOFTWARE, YOU MAY NOT REBRAND THIS SOFTWARE.
3)
3.1) THIS SOFTWARE MAY NOT BE MODIFIED UNDER ANY CIRCUMSTANCES.
3.2) YOU MUST NOT SAVE ANY MODIFICATIONS THAT YOU HAVE DONE TO THIS SOFTWARE.
4) THIS SOFTWARE DOES NOT GRANT ANY RIGHTS IN THE PATENTS OF CONTRIBUTORS.
5) THIS SOFTWARE MAY ONLY BE USED IN PRIVATE.
6) THIS SOFTWARE IS SUBJECT TO CHANGE AT ANYTIME WITH OR WITHOUT WARNING.
7) THIS SOFTWARE DOES NOT GRANT TRADEMARK RIGHTS UNDER ANY CIRCUMSTANCES.
8) THIS SOFTWARE DOES NOT PROVIDE ANY WARRANTY.
9) TERMS AND CONDITIONS ARE SUBJECT TO CHANGE AT ANYTIME WITHOUT WARNING.
10) IF YOU AT ANY POINT DECIDE TO BREACH A CONDITION, YOU MUST REVERT YOUR ACTIONS.
11) YOU ALLOW THIS SOFTWARE TO ACCESS AND MODIFY YOUR BROWSER'S LOCAL STORAGE.

BY INSTALLING OR VIEWING THE CODE FOR THIS SOFTWARE, YOU AGREE TO THE TERMS AND CONDITIONS.
IF AT ANY POINT YOU HAD INSTALLED ANY VERSION OF THIS SOFTWARE, YOU MUST STILL ABIDE THE TERMS AND CONDITIONS.

To change player names, thread exceptions and Map of the Week preference, use the UI.
As many players and thread exceptions as you like are allowed (i.e. there isn't a limit).
*/
var v = '1';

var userscripts =
{
	dans: function()
	{
		if (document.getElementById('DansUserscriptBtn') !== null)
		{
			return true;
		}

		else
		{
			return false;
		}
	},

	mulis: function()
	{
		if (localStorage.getItem("MulisUserscript") !== undefined || localStorage.getItem("MulisUserscript") !== null)
		{
			localStorage.removeItem("MulisUserscript");
		}

		if (document.getElementsByClassName("userscript-menu").length === 0)
		{
			console.log("mulis userscript is disabled/not installed");
			return false;
			/*mulis userscript is desabled/not installed*/
		}
		else
		{
			console.log("mulis userscript is enabled");	
			return true;
			/*mulis userscript is enabled*/
		}
	},

	error: function(err)
	{
		//error handeling
		var msg = prompt("An error occurred while loading Dan's Userscript.\nPress OK to report the error.", ""),
			trb = document.getElementsByClassName("TopRightBar")[0].childNodes[1];
		msg;
		if (msg === "")
		{
			var Window = window.open("https://www.warlight.net/Discussion/SendMail?PlayerID=222685","_blank","left=0,top=0,menubar=no,status=no,channelmode=yes,fullscreen=yes,toolbar=no,width="+screen.width+",height="+screen.height,""),
				subject = 'Userscript Error (version ' + v + ')',
				message = "Platform: " + navigator.platform + ". User agent: " + navigator.userAgent + ". Error: " + msg + ". Error on page: " + location.href + ". Found by: " + trb.childNodes[5].innerHTML + " - " + trb.childNodes[5].href + ".";
			Window.focus();
			try{Window.document.getElementsByTagName("ins")[0].remove();}
			catch(err) {}
			setTimeout('if (Window.document.getElementById("SubjectBox") !== null) {Window.document.getElementById("SubjectBox").value = subject;}	if (Window.document.getElementById("TextArea_0") !== null) {Window.document.getElementById("TextArea_0").value = message;}',3000);
		}
		console.log("Error found: " + err.message);
	}
};
window.userscripts = userscripts;

//activate userscript.mulis()
userscripts.mulis();

//required global vars
var Players,
	threads;

//check localStorage for players and threads
function localStoragePlayersAndThreadsChecks()
{
	var PlayersLS = '';

	Players = '';
	if (localStorage.getItem('Players') === undefined || localStorage.getItem('Players') === null)
	{
		localStorage.Players = '[blank name],Wally Balls,i am fotwald,H-to-the-O-V,RainbowBrite,';
		console.log('Currently only hiding threads and repllies by ' + localStorage.Players);
	}
	else
	{
		PlayersLS = localStorage.getItem('Players');
		//prevent loads of random [blank names] from appearing
		if (PlayersLS.match(/\[blank name\]/g).length > 1)
		{
			localStorage.Players = PlayersLS.replace(PlayersLS.match(/\[blank name\],/), '');
			PlayersLS = localStorage.Players;
			localStorage.Players = PlayersLS.replace(PlayersLS.match(/\[blank name\]/g), '');
			localStorage.Players = '[blank name],' + localStorage.Players;
			PlayersLS = localStorage.Players;
		}
		Players = PlayersLS.split(",");
	}

	var threadsLS = '';
	if (localStorage.getItem('threads') === undefined || localStorage.getItem('threads') === null || localStorage.getItem('threads') === '')
	{
		console.log('Currently no thread excetions.');
		localStorage.threads = 'localStorage.threads_first-item(do_not_remove_this)'; //prevents visual UI bugs
		threads = localStorage.getItem('threads').split(',');
		console.log('localStorage.threads = ' + localStorage.threads);
	}
	else
	{
		threadsLS = localStorage.getItem('threads');
		threads = threadsLS.split(',');
	}
}
localStoragePlayersAndThreadsChecks();//perform the checks

//prevents certain people from using all features
function isValidUser()
{
	if (document.getElementById('MailLink') === null) {return;}

	var user = document.getElementById('MailLink').nextElementSibling.href;
	var ppl =
	[
		9071760924,
		5614353942,
		3066750843
	],
	i = 0

	while (i < ppl.length)
	{
		if (user.match(ppl[i]))
		{
			break;//break the loop
			return false;//isn't a valid user
		}
		else
		{
			return true;//is a valid user
		}
		i++;
	}
}
if (!isValidUser())
{
	throw new Error();
}

var PlayersNo = 0,
	threadsNo = 0;

//Players array to another array where Players[PlayersNo] is a single var
//And Player string array (for hidden players)
var p = [],
	ps = "",
	pNo = 0;
	pS = [],
	psS = "",
	pSNo = 0;

function PlayersToPThenPs()
{
	PlayersNo = 0;
	while (PlayersNo < Players.length-1)
	{
		ps = Players[PlayersNo];
		p.push(ps);
		PlayersNo++;
	}
	pNo = 0;
	PlayersNo = 0;
	while (pNo < p.length)
	{
		psS = "\n" + p[pNo];
		pS.push(psS);
		pNo++;
	}
	pNo = 0;
}
PlayersToPThenPs();
function fixPAndPsBug()
{
//fixes bug that causes p and pS to not reset when Player changes are made
	for (var i=Players.length-1; i>=0; i--)
	{
		p.splice(i, 1);
		pS.splice(i, 1);
	}
}
//threads
var t = [],
	ts = "",
	tNo = 0;
//threads array to another array where threads[threadsNo] is a single var
function threadsToT()
{
	console.log('threads.length = ' + threads.length);
	t = [];
	ts = '';
	tNo = 0;
	while (threadsNo < threads.length)
	{
		//console.log('threads to t')
		ts = threads[threadsNo];
		t.push(ts);
		//console.log('t added; current ts:\n' + t);
		threadsNo++;
	}
	threadsNo = 0;
	console.log('t = ' + t);
	window.t = t;
}
threadsToT();

function fixThreadExceptionsBug()
{
	for (var i=threads.length-1; i>=0; i--)
	{
		t.splice(i, 1);
	}
}

//validate function
function validate(str)
{
	//set string to lower case
	return str.toLowerCase()
	//removes - or _ characters
	.replace(/[-_]+/g, '')
	//removes any non alphanumeric characters
	.replace(/[^\w\s]/g, '')
	//removes numbers
	.replace(/[0-9]/g, '')
	//removes spaces
	.replace(/ /g, '' );
}

var config = 
{
	motwDialogue: "",
	
	motw: function()
	{
		//Makes it possable to Hide Map Of The Week threads. "yes" hides them, "no" doesn't.
		if (localStorage.getItem("MOTW") === undefined || localStorage.getItem("MOTW") === null)
		{
			this.motwDialogue = prompt("Hide Map of the Week threads?", "no");
		}
		else if (localStorage.getItem("MOTW") == "yes")
		{
			this.motwDialogue = prompt("Hide Map of the Week threads?", "no");
		}
		else
		{
			this.motwDialogue = prompt("Hide Map of the Week threads?", "yes");
		}
		this.motwDialogue;
		var motwV = validate(this.motwDialogue);
		if (motwV != "yes" || motwV != "no")
		{
			if (motwV.includes("no") || motwV === "")
			{
				this.motwDialogue = "no";
			}
			else if (motwV.includes("yes"))
			{
				this.motwDialogue = "yes";
			}
			else
			{
				alert('Invalid input for motw: ' + motwV + '.\nPlease change it to "yes" or "no".');
			}
		}
		if (this.motwDialogue == "no" || this.motwDialogue == "yes")
		{
			localStorage.MOTW = this.motwDialogue;
			this.motwDialogue = localStorage.getItem("MOTW");
		}
	},
	
	bpDialoguePrompt: "",
	
	bpDialogue: function()
	{
		//Makes it possable to Hide a message that says how much blank posts have been hidden on threads. "yes" hides them, "no" doesn't.
		if (localStorage.getItem("bpDialogue") === undefined || localStorage.getItem("bpDialogue") === null)
		{
			this.bpDialoguePrompt = prompt("Hide blank posts dialogue?", "yes");
		}
		else if (localStorage.getItem("bpDialogue") == "yes")
		{
			this.bpDialoguePrompt = prompt("Hide blank posts dialogue?", "no");
		}
		else
		{
			this.bpDialoguePrompt = prompt("Hide blank posts dialogue?", "yes");
		}
		this.bpDialoguePrompt;
		var bpDialogueV = validate(this.bpDialoguePrompt);
		if (bpDialogueV != "yes" || bpDialogueV != "no")
		{
			if (bpDialogueV.includes("no") || bpDialogueV === "")
			{
				this.bpDialoguePrompt = "no";
			}
			else if (bpDialogueV.includes("yes"))
			{
				this.bpDialoguePrompt = "yes";
			}
			else
			{
				alert('Invalid input for blank posts dialogue: ' + bpDialoguePrompt + '.\nPlease change it to "yes" or "no".');
			}
		}
		if (this.bpDialoguePrompt == "no" || this.bpDialoguePrompt == "yes")
		{
			localStorage.bpDialogue = this.bpDialoguePrompt;
			this.bpDialoguePrompt = localStorage.getItem("bpDialogue");
		}
	},
	players: function()
	{
		//makes it possable to change whos threads and posts get hidden.
		var changePlayers = confirm('Change which players to hide threads and replies from?');
		changePlayers;
		if (changePlayers)
		{
			var changeThePlayers = prompt("Here you can type which players you to hide threads and replies from.\nBelow is the list of players that you're currently hiding threads and replies from.\nImportant:\nnames are case-senseative,\nsepperate the list with commas and then end it with a comma.\nTo hide posts by player that have a blank name, use '[blank name],'.", localStorage.getItem("Players"));

			changeThePlayers;
			if (changeThePlayers !== null) //check if cancle isn't pressed
			{
				if (changeThePlayers !== "") // check if pressed ok
				{
					if (localStorage.Players !== null)
					{
						if (localStorage.Players === "")
						{
							//want's to get rid of Players
							localStorage.Players = "";
							PlayersToPThenPs();
							location.reload();
						}
						else if (localStorage.Players != changeThePlayers)
						{
							//let Players change
							localStorage.Players = changeThePlayers;
							PlayersToPThenPs();
							location.reload();
						}
						//Players haven't been modified
					}
				}
			}
		}
	},
	threads: function()
	{
		var changeThreads = confirm('Do you want to change which threads aren\'t being hidden?');

		changeThreads;
		if (changeThreads)
		{
			var threadNames = prompt('Input the threads that you want to see that are normaly hidden./n Sepperate each item using a comma (,) before the next thread.\nIf you place the comma in the incorrect place, then thread excepions may not work correctly.\nDo not remove the localStorage.threads_first-item(do_not_remove_this) text.', '');

			threadNames;
			if (threadNames !== null) //check if not pressed Cancel
			{
				localStorage.threads = threadNames; //changes the thread names in local storage
				localStoragePlayersAndThreadsChecks(); //updates definition of threads
				hideThreads(); //refreshes threads
			}
		}
	},
	userscript: function()
	{
		//makse it possable to change the settings
		alert('Your current Userscript version: ' + v);
		config.players();
		config.threads();
		var changeMOTW = prompt("Press OK to change your Map of the Week preference.\nIf it is set to no, then Map of the Week threads aren't hidden.\nYour current Map of the Week preference is: "+config.motwDialogue+".","");
		changeMOTW;
		if (changeMOTW === "")
		{
			config.motw();
			location.reload();
		}
		var changeBpDialogue = prompt("Press OK to change your blank posts dialogue preference.\nIf it is set to no, then blank posts dialogue aren't displayed.\nYour current blank posts dialogue preference is: "+localStorage.bpDialogue+".","");
		changeBpDialogue;
		if (changeBpDialogue === "")
		{
			config.bpDialogue();
			location.reload();
		}
		//Fixes thread excepions bug on older versions
		var resetThreads = confirm('Reset Thread Exceptions?');
		resetThreads;
		if (resetThreads)
		{
			localStorage.removeItem('threads');
		}
		//Resets players
		var resetPlayers = confirm('Reset Players?');
		resetPlayers;
		if (resetPlayers)
		{
			localStorage.removeItem('Players');
		}
	}
}

function localStorageConfigForFirstTimer()
{
	//sets script settings
	if (localStorage.getItem('MOTW') === undefined || localStorage.getItem('MOTW') === null)
	{
		config.motw();
		console.log('config.motw was undefined or null');
	}
	else
	{
		config.motwDialogue = localStorage.getItem('MOTW');
		console.log('config.motwDialogue = ' + config.motwDialogue);
	}

	if (localStorage.getItem('bpDialogue') === undefined || localStorage.getItem('bpDialogue') === null)
	{
		config.bpDialogue();
		console.log('localStorage.bpDialogue was undefined or null');
	}
	else
	{
		config.bpDialoguePrompt = localStorage.getItem('bpDialogue');
		console.log('localStorage.bpDialogue = ' + localStorage.bpDialogue);
	}

	if (localStorage.getItem('usePersonalDungeonInsteadOfBL') !== null || localStorage.getItem('usePersonalDungeonInsteadOfBL') !== undefined)
	{
		localStorage.removeItem('usePersonalDungeonInsteadOfBL');
	}
}
localStorageConfigForFirstTimer();
//main
//try{
var h = location.pathname,
	genF = h.includes("m/f1") || h.includes("m/F1"),
	mapF = h.includes("m/f4") || h.includes("m/F4"),
	ladF = h.includes("m/f5") || h.includes("m/F5"),
	progF = h.includes("m/f6") || h.includes("m/F6"),
	helpF = h.includes("m/f7") || h.includes("m/F7"),
	OTF = h.includes("m/f8") || h.includes("m/F8"),
	clansF = h.includes("m/f9") || h.includes("m/F9"),
	stratF = h.includes("m/f10") || h.includes("m/F10"),
	subForum = genF || mapF || ladF || progF || helpF || OTF || clansF || stratF,
	allF = h.includes("m/fo") || h.includes("m/Fo"),
	threadP =  h.includes("m/1") || h.includes("m/2") || h.includes("m/3") || h.includes("m/4") || h.includes("m/5") || h.includes("m/6") || h.includes("m/7") || h.includes("m/8") || h.includes("m/9"),
	discussionP = location.href.includes("https://www.warlight.net/Discussion/?ID="),
	mail = h.includes("/Discussion/MyMail"),
	clanF = h.includes("/Clans/forum") || h.includes("/Clans/Forum"),
	sHT = document.createElement("button"),
	hT = document.createElement("button"),
	td1 = document.createElement("td"),
	li1 = document.createElement("li"),
	li0 = document.createElement("li"),
	ddM = document.getElementsByClassName("dropdown-menu")[0],
	li1S = li1.style,
	sHTS = sHT.style,
	hTS = hT.style,
	a = document.getElementsByTagName("a"),
	aNo = "",
	f = document.getElementsByTagName("font"),
	fNo = 0,
	d = document.getElementsByTagName("tr"),
	dNo = "",
	dNoStart = '',
	dh = "detail_hidden",
	dhCN = document.getElementsByClassName(dh),
	ds = "detail_shown",
	dsCN = document.getElementsByClassName(ds),
	dg = "detail_good",
	db = "detail_blank",
	dbCN = document.getElementsByClassName(db),
	n = "none",
	y = "table-row",
	Apr1 = new Date();

window.d = d;
window.a = a;
window.dhCN = dhCN;
window.dsCN = dsCN;
window.dbCN = dbCN;

//show who's threads are getting hidden
li0.className = "dropdown-divider";
li1.id = "DansUserscriptBtn";
li1.innerHTML = "Dan's Userscript";
li1.onclick = function()
{
	config.userscript();
};
li1S.color = "#555";
li1S.paddingTop = "3px";
li1S.paddingRight = "15px";
li1S.paddingBottom = "3px";
li1S.paddingLeft = "15px";
li1S.cursor = "pointer";
li1.onmouseover = function()
{
	li1.style.backgroundColor = "#08C";
	li1.style.color = "#fff";
};
li1.onmouseleave = function()
{
	li1.style.backgroundColor = "inherit";
	li1.style.color = "#555";
};
if (ddM !== undefined)
{
	ddM.appendChild(li0);
	ddM.appendChild(li1);
}

//check forum type
function checkF()
{
	if (subForum || allF)
	{
		dNo = 4;
	}
	else
	{
		dNo = 3;
	}
	
	if (allF)
	{
		aNo = 20;
	}
	else if (clanF || subForum || mail)
	{
		aNo = 21;
	}
	else
	{
		aNo = 20;
	}
	dNoStart = dNo;
	window.dNoStart = dNoStart;
	console.log('checkF aNo is ' + aNo + '\ncheckF dNo is ' + dNo);
}

//setTheadClassNames to prevent bugs
function setTheadClassNames()
{
	checkF();
	while (dNo + 1 < d.length)
	{
		if (a[aNo].href.match(/\/\Discussion\/\?ID=/i) || a[aNo].href.match(/\/\Forum\/\d/i) && a[aNo].href.match(/\?Offset=/i) === null)
		{
			a[aNo].className = "ThreadLink";
			if (Apr1.getDate() === 1 && Apr1.getMonth() === 3)
			{
				var AHREF;
				if (mail === false)
				{
					var afh = a[aNo].href.split("/"),
						afh1 = afh[4].split("-"),
						afh2 = afh[4].split("?");
					AHREF = afh[0] + "//" + afh[2] + "/" + afh[3] + "/" + afh1[0] + "-happy-april-fools?" + afh2[1];
				}
				else
				{
					AHREF = a[aNo].href;
				}
			}
		}
		aNo++;
		dNo++;
	}
}
var ThreadLink = document.getElementsByClassName("ThreadLink");
window.ThreadLink = ThreadLink;

var TBL;
//vars required for UI and hide/show replies
var psttbls = [],
	psttbl = "",
	psttblNo = 0,
	cIds = [],
	cId = "",
	cIdsNo = 0;

//makes it possable to hide threads
function hideThreads()
{
	//sets thread class so that Jump to Last Page links aren't counted as threads
	setTheadClassNames();
	if (Apr1.getDate() === 1 && Apr1.getMonth() === 3)
	{
		document.title = "Happy April Fools! - Play Risk Online Free - WarLight";
	}
	//hide all-caps
	checkF();
	while (dNo < d.length+dNoStart+1)
	{
		if (a[aNo].href.match(/"?Offset="/gi) === null && a[aNo].innerHTML != "Jump to Last Page")
		{
			if (Apr1.getDate() === 1 && Apr1.getMonth() === 3)
			{
				a[aNo].innerHTML = "Happy April Fools!";
				if (mail === false)
				{
					var afh = a[aNo].href.split("/");
					var afh1 = afh[4].split("-");
					a[aNo].href = afh[0] + "//" + afh[2] + "/" + afh[3] + "/" + afh1[0] + "-happy-april-fools";
				}
			}
			if (a[aNo].innerHTML.match(/[A-Z]/g) !== null || a[aNo].innerHTML.match(/^\d+$/) !== null)
			{
				if (a[aNo].innerHTML.match(/[A-Z]/g) !== null &&  a[aNo].innerHTML.match(/\s/g) !== null)
				{
					if (a[aNo].innerHTML.length === a[aNo].innerHTML.match(/[A-Z]/g).length + a[aNo].innerHTML.match(/\s/g).length)
					{
						d[dNo].className = dh;
						d[dNo].style.display = "none";
						d[dNo].style.textDecoration = "line-through";
						a[aNo].title = "This thread has an all-caps subject";
						console.log(dNo + " " + aNo + a[aNo].innerHTML + " all-caps");
					}
					if (a[aNo].innerHTML.match(/^\d+$/) !== null)
					{
						d[dNo].className = "";
						d[dNo].style = "";
						a[aNo].title = "";
						console.log(dNo + " " + aNo + " " + a[aNo].innerHTML + " is a number");
					}
				}
			}
			console.log("dNo = " + dNo + " aNo = " + aNo + " a[aNo].innerHTML = " + a[aNo].innerHTML + " isn't all-caps and all-numbers");
		}
		//turns blanked-out subjects to [blank subject] so that subject becomes visible
		if (a[aNo].innerHTML.match(/\uA0/gi) || a[aNo].innerHTML.match(/\uAD/gi) || a[aNo].innerHTML.match(/\u2DE/gi) || a[aNo].innerHTML.match(/\u00AD/gi) || a[aNo].innerHTML.match(/\u02DE/gi) || a[aNo].innerHTML.match(/\u1361/gi) || a[aNo].innerHTML.match(/\u1680/gi) || a[aNo].innerHTML.match(/\u180E/gi) || a[aNo].innerHTML.match(/\u2000/gi) || a[aNo].innerHTML.match(/\u2001/gi) || a[aNo].innerHTML.match(/\u2002/gi) || a[aNo].innerHTML.match(/\u2003/gi) || a[aNo].innerHTML.match(/\u2004/gi) || a[aNo].innerHTML.match(/\u2005/gi) || a[aNo].innerHTML.match(/\u2006/gi) || a[aNo].innerHTML.match(/\u2007/gi) || a[aNo].innerHTML.match(/\u2008/gi) || a[aNo].innerHTML.match(/\u2009/gi) || a[aNo].innerHTML.match(/\u200A/gi) || a[aNo].innerHTML.match(/\u200B/gi) || a[aNo].innerHTML.match(/\u202F/gi) || a[aNo].innerHTML.match(/\u205F/gi) || a[aNo].innerHTML.match(/\u2800/gi) || a[aNo].innerHTML.match(/\u3000/gi) || a[aNo].innerHTML.match(/\u3164/gi) || a[aNo].innerHTML.match(/\uFEFF/gi))
		{
			a[aNo].innerHTML = "[blank subject]";
			console.log("a[" + aNo + "].innerHTML matches with blanks");
		}
		aNo++;
		dNo++;
	}
	//hide threads
	checkF();
	fNo = 0;
	while (fNo < f.length)
	{
		//console.log(a[aNo].innerHTML + f[fNo].innerHTML);
		pNo = 0;
		while (pNo < p.length)
		{
			//console.log(f[fNo].innerHTML + ".includes(" + p[pNo] + ") == " + f[fNo].innerHTML.includes(p[pNo]));
			if (f[fNo].innerHTML.match(/\uA0/gi) || f[fNo].innerHTML.match(/\uAD/gi) || f[fNo].innerHTML.match(/\u2DE/gi) || f[fNo].innerHTML.match(/\u00AD/gi) || f[fNo].innerHTML.match(/\u02DE/gi) || f[fNo].innerHTML.match(/\u1361/gi) || f[fNo].innerHTML.match(/\u1680/gi) || f[fNo].innerHTML.match(/\u180E/gi) || f[fNo].innerHTML.match(/\u2000/gi) || f[fNo].innerHTML.match(/\u2001/gi) || f[fNo].innerHTML.match(/\u2002/gi) || f[fNo].innerHTML.match(/\u2003/gi) || f[fNo].innerHTML.match(/\u2004/gi) || f[fNo].innerHTML.match(/\u2005/gi) || f[fNo].innerHTML.match(/\u2006/gi) || f[fNo].innerHTML.match(/\u2007/gi) || f[fNo].innerHTML.match(/\u2008/gi) || f[fNo].innerHTML.match(/\u2009/gi) || f[fNo].innerHTML.match(/\u200A/gi) || f[fNo].innerHTML.match(/\u200B/gi) || f[fNo].innerHTML.match(/\u202F/gi) || f[fNo].innerHTML.match(/\u205F/gi) || f[fNo].innerHTML.match(/\u2800/gi) || f[fNo].innerHTML.match(/\u3000/gi) || f[fNo].innerHTML.match(/\u3164/gi) || f[fNo].innerHTML.match(/\uFEFF/gi))
			{
				//turns blanked-out names to [blank name] so that player's name becomes visible and then hides threads by that player
				f[fNo].innerHTML = "by [blank name]";
				fixPAndPsBug();
				PlayersToPThenPs();
				//console.log(pS.length);
			}
			if (f[fNo].innerHTML.includes(p[pNo]))
			{
				d[dNo].className = dh;
				d[dNo].style.display = "none";
				d[dNo].style.textDecoration = "line-through";
				console.log(a[aNo].innerHTML + f[fNo].innerHTML + " hidden");
			}
			pNo++;
		}
		//motw dialogue
		if (config.motwDialogue == "yes")
		{
			//console.log(a[aNo].innerHTML + " " + d[dNo].innerHTML);
			if (a[aNo].innerHTML.includes("Map of the week discussion: Week "))
			{
				d[dNo].className = dh;
				d[dNo].style.display = "none";
				d[dNo].style.textDecoration = "line-through";
				a[aNo].title = "Map Of The Week is getting hidden";
			}
		}
		if (config.motwDialogue == "no")
		{
			if (a[aNo].innerHTML.includes("Map of the week discussion: Week "))
			{
				d[dNo].removeAttribute("className");
				d[dNo].style.display = "";
				d[dNo].style.textDecoration = "";
				a[aNo].title = "Map Of The Week isn't being hidden";
			}
		}
		fNo++;
		dNo++;
		aNo++;
	}
	fNo = 0;
	//thread exceptions
	checkF();
	tNo = 0;
	console.log('t = ' + t);
	console.log('t.length = ' + t.length);
	//if there aren't any thread exceptions, don't check for thread exceptions
	if (t.length > 1)
	{
		while (dNo < d.length-1)
		{
			if (d[dNo].id != 'HiddenThreadsRow')
			{
			tNo = 0;
				while (tNo < t.length)
				{
					console.log('t[tNo] = ' + t[tNo]);
					if (a[aNo].innerHTML.includes(t[tNo]))
					{
						d[dNo].className = dg;
						d[dNo].style.textDecoration = "";
						a[aNo].title = "This thread is NOT being hidden";
						d[dNo].style.display = y;
					}
					tNo++;
				}
				aNo++;
				//prevent aNo from increasing if the hidden threads row is found as there isn't a link on the hidden threads row
			}
			dNo++;
		}
	}
	hTS.display = "none";
	if (dhCN.length > 1)
	{
		sHT.innerHTML = "Show " + dhCN.length + " hidden threads";
		sHTS.display = "block";
	}
	else if (dhCN.length === 1)
	{
		sHT.innerHTML = "Show 1 hidden thread";
		sHTS.display = "block";
	}
	else
	{
		sHTS.display = "none";
	}
}

//makes it possable to show hidden threads
function showHiddenThreads()
{
	var dhNo = 0;
	if (dhCN !== undefined)
	{
		while (dhNo < dhCN.length)
		{
			dhCN[dhNo].className = ds;
			dhNo + 1;
		}
	}
	var dsNo = 0;
	if (dsCN !== undefined)
	{
		while (dsNo < dsCN.length)
		{
			dsCN[dsNo].style.display = y;
			dsNo++;
		}
	}
	sHTS.display = "none";
	if (dsCN.length > 1) {
	hT.innerHTML = "Hide " + dsCN.length + " threads";
		hTS.display = "block";
	}
	else if (dsCN.length === 1)
	{
		hT.innerHTML = "Hide 1 thread";
		hTS.display = "block";
	}
	else
	{
		hTS.display = "none";
	}
}

if (subForum || allF || clanF || mail)
{
	if (document.getElementsByTagName("table")[document.getElementsByTagName("table").length - 1] !== undefined)
	{
		if (document.getElementsByTagName("table")[document.getElementsByTagName("table").length - 1].childNodes[1] !== undefined)
		{
			if (document.getElementsByTagName("table")[document.getElementsByTagName("table").length - 1].childNodes[1] !== undefined)
			{
				//defines where the X threads/posts hidden should be
				TBL = document.getElementsByTagName("table")[document.getElementsByTagName("table").length - 1].childNodes[1].childNodes[0];
			}
		}
	}
	//spam
	/*if (subForum || allF)
	{
		var JTNSa = document.createElement("a"),
			td0 = document.createElement("td"),
			pages = 0;
		if (genF)
		{
			pages = 25;
			JTNSa.href = "/forum/f1-General?Offset=" + pages * 50;
		}
		if (mapF)
		{
			pages = 5;
			JTNSa.href = "/forum/f4-Map-Development?Offset=" + pages * 50;
		}
		if (ladF)
		{
			pages = 5;
			JTNSa.href = "/forum/f5-Ladder?Offset=" + pages * 50;
		}
		if (progF)
		{
			pages = 5;
			JTNSa.href = "/forum/f6-Programming?Offset=" + pages * 50;
		}
		if (helpF)
		{
			pages = 5;
			JTNSa.href = "/forum/f7-Help?Offset=" + pages * 50;
		}
		if (OTF)
		{
			pages = 20;
			JTNSa.href = "/forum/f8-topic?Offset=" + pages * 50;
		}
		if (clansF)
		{
			pages = 5;
			JTNSa.href = "/forum/f9-Clans?Offset=" + pages * 50;
		}
		if (stratF)
		{
			pages = 5;
			JTNSa.href = "/forum/f10-Strategy?Offset=" + pages * 50;
		}
		if (allF)
		{
			pages = 55;
			JTNSa.href = "/forum/Forum?Offset=" + pages * 50;
		}
		if (pages > 0)
		{
			JTNSa.innerHTML = "Jump to non-spam threads";
			td0.id = "spamTd";
			if (TBL !== undefined)
			{
				TBL.appendChild(td0);
				td0.parentNode.insertBefore(td0, td0.parentNode.childNodes[0]);
				td0.appendChild(JTNSa);
			}
		}
	}*/
	//make reset and restore buttons
	if (TBL !== undefined)
	{
		td1.id = "btnTd";
		TBL.appendChild(td1);
		td1.parentNode.insertBefore(td1, td1.parentNode.childNodes[0]);
		sHT.onclick = function()
		{
			showHiddenThreads();
		};
		sHTS.cursor = "pointer";
		td1.appendChild(sHT);
		hTS.cursor = "pointer";
		hT.onclick = function() {
			hideThreads();
		};
		td1.appendChild(hT);
	}

	//turns last post by players with blank names to "by [blank name]"
	var s = document.getElementsByTagName("span"),
		sNo = 2;
	while (sNo < s.length - 2)
	{
		if (s[sNo].innerHTML.match(/\uA0/gi) || s[sNo].innerHTML.match(/\uAD/gi) || s[sNo].innerHTML.match(/\u2DE/gi) || s[sNo].innerHTML.match(/\u00AD/gi) || s[sNo].innerHTML.match(/\u02DE/gi) || s[sNo].innerHTML.match(/\u1361/gi) || s[sNo].innerHTML.match(/\u1680/gi) || s[sNo].innerHTML.match(/\u180E/gi) || s[sNo].innerHTML.match(/\u2000/gi) || s[sNo].innerHTML.match(/\u2001/gi) || s[sNo].innerHTML.match(/\u2002/gi) || s[sNo].innerHTML.match(/\u2003/gi) || s[sNo].innerHTML.match(/\u2004/gi) || s[sNo].innerHTML.match(/\u2005/gi) || s[sNo].innerHTML.match(/\u2006/gi) || s[sNo].innerHTML.match(/\u2007/gi) || s[sNo].innerHTML.match(/\u2008/gi) || s[sNo].innerHTML.match(/\u2009/gi) || s[sNo].innerHTML.match(/\u200A/gi) || s[sNo].innerHTML.match(/\u200B/gi) || s[sNo].innerHTML.match(/\u202F/gi) || s[sNo].innerHTML.match(/\u205F/gi) || s[sNo].innerHTML.match(/\u2800/gi) || s[sNo].innerHTML.match(/\u3000/gi) || s[sNo].innerHTML.match(/\u3164/gi) || s[sNo].innerHTML.match(/\uFEFF/gi))
		{
			s[sNo].innerHTML = "by [blank name]";
		}
		sNo++;
	}
	sNo = 2;

	//removes Jump to Last Page links - fixes many bugs
	checkF();
	while (aNo < a.length)
	{
		if (a[aNo].innerHTML == 'Jump to Last Page' && a[aNo].href.match(/\?Offset=/i))
		{
			a[aNo].remove();
			console.log('Jump to Last Page link removed');
		}
		aNo++;
	}
	//hide threads straight away
	hideThreads();
}
else if (threadP || discussionP)
{
	if (document.getElementsByTagName("table")[document.getElementsByTagName("table").length - 2] !== undefined)
	{
		if (document.getElementsByTagName("table")[document.getElementsByTagName("table").length - 2].childNodes[1] !== undefined)
		{
			if (document.getElementsByTagName("table")[document.getElementsByTagName("table").length - 2].childNodes[1] !== undefined)
			{
				TBL = document.getElementsByTagName("table")[document.getElementsByTagName("table").length - 2].childNodes[1].childNodes[0];
			}
		}
	}
	if (Apr1.getDate() === 1 && Apr1.getMonth() === 3)
	{
		document.title = "Happy April Fools! - Play Risk Online Free - WarLight";
		fNo = 0;
		while (fNo < f.length)
		{
			if (f[fNo].parentNode == "[object HTMLTableCellElement]" && f[fNo].innerHTML != "WarLight Creator")
			{
				f[fNo].innerHTML = "Happy April Fools!";
			}
			fNo++;
		}
	}
	fNo = 0;
	//turns blanked-out subjects to [blank subject] so that subject becomes visible
	while (fNo < f.length)
	{
		if (f[fNo].innerHTML.match(/\uA0/gi) || f[fNo].innerHTML.match(/\uAD/gi) || f[fNo].innerHTML.match(/\u2DE/gi) || f[fNo].innerHTML.match(/\u00AD/gi) || f[fNo].innerHTML.match(/\u02DE/gi) || f[fNo].innerHTML.match(/\u1361/gi) || f[fNo].innerHTML.match(/\u1680/gi) || f[fNo].innerHTML.match(/\u180E/gi) || f[fNo].innerHTML.match(/\u2000/gi) || f[fNo].innerHTML.match(/\u2001/gi) || f[fNo].innerHTML.match(/\u2002/gi) || f[fNo].innerHTML.match(/\u2003/gi) || f[fNo].innerHTML.match(/\u2004/gi) || f[fNo].innerHTML.match(/\u2005/gi) || f[fNo].innerHTML.match(/\u2006/gi) || f[fNo].innerHTML.match(/\u2007/gi) || f[fNo].innerHTML.match(/\u2008/gi) || f[fNo].innerHTML.match(/\u2009/gi) || f[fNo].innerHTML.match(/\u200A/gi) || f[fNo].innerHTML.match(/\u200B/gi) || f[fNo].innerHTML.match(/\u202F/gi) || f[fNo].innerHTML.match(/\u205F/gi) || f[fNo].innerHTML.match(/\u2800/gi) || f[fNo].innerHTML.match(/\u3000/gi) || f[fNo].innerHTML.match(/\u3164/gi) || f[fNo].innerHTML.match(/\uFEFF/gi) && f[fNo].parentNode == "[object HTMLTableCellElement]" && f[fNo].innerHTML != "WarLight Creator")
		{
			f[fNo].innerHTML = "[blank subject]";
		}
		fNo++;
	}
	fNo = 0;
	//make reset and restore buttons
	if (TBL !== undefined)
	{
		td1.id = "btnTd";
		TBL.appendChild(td1);
		var btnTd = document.getElementById("btnTd");
		btnTd.parentNode.insertBefore(btnTd, btnTd.parentNode.childNodes[0]);
		sHT.onclick = function()
		{
			showHiddenReplies();
		};
		sHTS.cursor = "pointer";
		td1.appendChild(sHT);
		hTS.cursor = "pointer";
		hT.onclick = function()
		{
			hideReplies();
		};
		td1.appendChild(hT);
	}
	//hide blank posts
	var pfds = [],
		pfd = "",
		pfdNo = 0,
		divNo = 0,
		div = document.getElementsByTagName("div");
	if (document.getElementById("SubjectBox") === null && location.pathname.includes("/Discussion/Notes") === false)
	{
		while (divNo < div.length)
		{
			if (div[divNo].id.includes("PostForDisplay") && div[divNo].id != "PostForDisplay_-1")
			{
				pfd = div[divNo].id;
				pfds.push(pfd);
			}
			divNo++;
		}
		window.pfds = pfds;
		while (pfdNo < pfds.length)
		{
			if (Apr1.getDate() === 1 && Apr1.getMonth() === 3)
			{
				document.getElementById(pfds[pfdNo]).innerHTML = "Happy April Fools!";
			}
			if (document.getElementById(pfds[pfdNo]).innerHTML.length === 60 || document.getElementById(pfds[pfdNo]).innerHTML.length <= 121 && document.getElementById(pfds[pfdNo]).innerHTML.match(/edited/i))
			{
				var tbl = document.getElementById(pfds[pfdNo]).parentNode.parentNode.parentNode.parentNode;
				tbl.className = db;
				tbl.style.display = 'none';
			}
			pfdNo++;
		}
		if (localStorage.bpDialogue == 'no')
		{
			if (dbCN.length > 0)
			{
				if (dbCN.length === 1)
				{
					alert('1 blank post was hidden.');
				}
				else if (dbCN.length > 1)
				{
					alert(dbCN.length + ' blank posts were hidden.');
				}
			}
		}
	}
	//make hide replies function
	function hideReplies()
	{
		var players = [],
			player = "",
			playerNo = 0;
		aNo = 20;
		while (aNo < a.length - 18)
		{
			if (a[aNo].href.includes("warlight.net/Profile?p=") && a[aNo].parentNode == "[object HTMLTableCellElement]")
			{
				psttbl = a[aNo].parentNode.parentNode.parentNode.parentNode;
				psttbls.push(psttbl);
				player = a[aNo].innerHTML;
				players.push(player);
			}
			aNo++;
		}
		//hide main
		playerNo = 0;
		psttblNo = 0;
		while (playerNo < players.length)
		{
			pNo = 0;
			//alert(players);
			while (pNo < p.length)
			{
				if (players[playerNo].includes(p[pNo]))
				{
					psttbls[psttblNo].className = dh;
					psttbls[psttblNo].style.display = "none";
				}
				pNo++;
			}
			playerNo++;
			psttblNo++;
		}

		//hides show downvoted/hidden reply link if a player on the hide list has had their comment to be downvoted or hidden
		fNo = 0;
		pNo = 0;
	
		while (fNo < f.length)
		{
			pNo = 0;
			while (pNo < p.length)
			{
				if (f[fNo].innerHTML.includes('- downvoted') || f[fNo].innerHTML.includes('- hidden') && f[fNo].nextElementSibling.children[0].children[1].children[0].innerHTML.includes(p[pNo]))
				{
					f[fNo].style.display = 'none';
				}
				pNo++;
			}
			fNo++;
		}

		hTS.display = "none";
		if (dhCN.length > 1)
		{
			sHT.innerHTML = "Show " + dhCN.length + " hidden replies";
			sHTS.display = "block";
		}
		else if (dhCN.length === 1)
		{
			sHT.innerHTML = "Show 1 hidden reply";
			sHTS.display = "block";
		}
		else
		{
			sHTS.display = "none";
		}
	}

	//make show hidden replies function
	function showHiddenReplies()
	{
		var dhNo = dhCN.length-1;

		if (dhCN !== undefined)
		{
			while (dhNo < dhCN.length && dhNo > -1)
			{
				dhCN[dhNo].className = ds + " region";
				dhNo--;
			}
		}

		var dsNo = 0;

		if (dsCN !== undefined)
		{
			while (dsNo < dsCN.length)
			{
				dsCN[dsNo].style.display = "";
				dsNo++;
			}
		}

		sHTS.display = "none";
		if (dsCN.length > 1)
		{
			hT.innerHTML = "Hide " + dsCN.length + " replies";
			hTS.display = "block";
		}
		else if (dsCN.length === 1)
		{
			hT.innerHTML = "Hide 1 reply";
			hTS.display = "block";
		}
		else {
			hTS.display = "none";
		}
	}
	//link rels
	aNo = 21;
	while (aNo < a.length - 18)
	{
		if (a[aNo].href.includes("warlight.net/wiki"))
		{
			a[aNo].rel = "help";
		}
		aNo++;
	}
	//hide replies straight away
	hideReplies();
}
/*}
catch(err){
	userscripts.error(err);
}*/
//remove extra Muli's Userscript menu - a script causes this bug to happen
setTimeout('try{document.getElementsByClassName("userscript-menu")[1].remove();} catch(err) {}',750);
setTimeout('try{document.getElementsByClassName("userscript-menu")[1].remove();} catch(err) {}',1250);
//UI
//bug: make hide/show buttons update after player added - tried to fix but only half-worked but refreshing does - not ideal
//show and hide clicked are for making it possable to show and hide the downvoted threads an unlimited amount of time
function showClicked()
{
	$('tr[data-hidden]').show();
	var show = document.getElementById("show");
	show.id = "hide";
	var hide = document.getElementById("hide");
	hide.innerHTML = hide.innerHTML.replace("Show", "Hide");
	hide.onclick = function()
	{
	hideClicked();
	};
}

function hideClicked()
{
	$('tr[data-hidden]').hide();
	var hide = document.getElementById("hide");
	hide.id = "show";
	var show = document.getElementById("show");
	show.innerHTML = show.innerHTML.replace("Hide", "Show");
	show.onclick = function()
	{
		showClicked();
	};
}
//adds players/threads to the hide/exceptions list
function addToArray(ARRAY, ARRAYITEM, NUMBER)
{
	if (ARRAY == "Players")
	{
		localStorage.Players = localStorage.Players + ARRAYITEM.innerHTML.replace(/\u0020/, "").replace("by ", "") + ",";
		console.log('added ' + ARRAYITEM + ' to ' + ARRAY);
		//updates and remembers Players
		fixPAndPsBug();
		localStoragePlayersAndThreadsChecks();
		PlayersToPThenPs();
		hideThreads();
		PlayersBtnHCN[NUMBER].style.display = "none";
		PlayersBtnSCN[NUMBER].removeAttribute("style");
	}
	else if (ARRAY == "threads")
	{
		//alert(t);
		var item = ARRAYITEM.innerHTML;
		console.log('item = ' + item);
		//console.log('before: localStorage.threads = ' + localStorage.threads);
		localStorage.threads += ',' + item;//update and remember threads
		//console.log('after: localStorage.threads = ' + localStorage.threads);
		console.log('added ' + ARRAYITEM + ' to ' + ARRAY);
		localStoragePlayersAndThreadsChecks();
		threadsToT();
		hideThreads();
		ThreadExceptionsBtnHCN[NUMBER].style.display = "none";
		ThreadExceptionsBtnSCN[NUMBER].removeAttribute("style");
	}
	else
	{
		prompt('Something went wrong... Please message Dan the following details:', 'ARRAY = ' + ARRAY);
	}
}
window.addToArray = addToArray;
//removes a player from the list
function removePlayer(ARRAYITEM, NUMBER)
{
	fNo = 0;
	while (fNo < f.length)
	{
		if (f[fNo].innerHTML === ARRAYITEM.innerHTML)
		{
			f[fNo].parentNode.parentNode.removeAttribute("class");
			f[fNo].parentNode.parentNode.removeAttribute("style");
		}
		fNo++;
	}
	var item = ARRAYITEM.innerHTML.replace(/\u0020/, "").replace("by ", "");
	for (var i=Players.length-1; i>=0; i--)
	{
		if (Players[i] === item)
		{
			localStorage.Players = localStorage.Players.replace(item+",","");//update and remember Players
			//break;
		}
	}
	for (var ii=p.length-1; ii>=0; ii--)
	{
		if (p[ii] === item)
		{
			p.splice(ii, 1);
			//break;
		}
	}
	for (var iii=pS.length-1; iii>=0; iii--)
	{
		if (pS[iii] === "\n" + item)
		{
			pS.splice(iii, 1);
			//break;
		}
	}
	console.log('removed ' + ARRAYITEM);
	localStoragePlayersAndThreadsChecks();
	hideThreads();
	PlayersBtnSCN[NUMBER].style.display = "none";
	PlayersBtnHCN[NUMBER].removeAttribute("style");
}
//makes it possable to remove a thread exception
function removeThread(ARRAYITEM, NUMBER)
{
	var item = ARRAYITEM.innerHTML;
	for (var iv=threads.length-1; iv>=0; iv--)
	{
		if (threads[iv] === item)
		{
			localStorage.threads = localStorage.threads.replace(',' + item, '');//update and remember threads
			//break;
		}
	}
	for (var v=t.length-1; v>=0; v--)
	{
		if (t[v] === item)
		{
			t.splice(v, 1);
			//break;
		}
	}
	console.log('removed ' + ARRAYITEM);
	localStoragePlayersAndThreadsChecks();
	hideThreads();
	ThreadExceptionsBtnSCN[NUMBER].style.display = "none";
	ThreadExceptionsBtnHCN[NUMBER].removeAttribute("style");
}

if (subForum || allF || clanF || mail || threadP || discussionP)
{
	var f = document.getElementsByTagName("font"),
		fNo = 0;
	//makes the UI look good on the the rest of the page
	if (threadP || discussionP)
	{
		document.getElementById("MainSiteContent").childNodes[5].childNodes[1].childNodes[0].childNodes[1].childNodes[1].style.maxWidth = "1320px";//1000px + 200px +  175px + 145px
	}
	else if (mail)
	{
		document.getElementById("MainSiteContent").childNodes[3].childNodes[1].childNodes[0].childNodes[1].childNodes[1].style.maxWidth = "1320px";
	}
	else if (clanF)
	{
		document.getElementById("MainSiteContent").childNodes[8].childNodes[1].childNodes[0].childNodes[1].childNodes[1].style.maxWidth = "1320px";
	}
	else
	{
		document.getElementById("MainSiteContent").childNodes[1].childNodes[1].childNodes[0].childNodes[1].childNodes[1].style.maxWidth = "1320px";
	}
	var ActionsTh0 = document.createElement("th"),
		ActionsTh1 = document.createElement("th"),
		tdNo = 1,
		ThreadExceptionsTDCNNo = 0,
		ThreadExceptionsTrNo = 2,
		PlayersTDCNNo = 0,
		PlayersTrNo = 2;

	if (mail || clanF)
	{
		ThreadExceptionsTrNo = 2;
		PlayersTrNo = 2;
	}
	else
	{
		ThreadExceptionsTrNo = 4;
		PlayersTrNo = 4;
	}
	//UI for sub-forums, all forums, mail and clan forum (i.e. non-thread pages or non-discussion pages)
	if (threadP === false && discussionP === false)
	{
		ActionsTh0.innerHTML = 'Players';
		ActionsTh0.style.cursor = 'pointer';
		ActionsTh0.style.minWidth = '175px';
		ActionsTh0.style.maxWidth = '175px';
		ActionsTh0.onclick = function()
		{
			config.players();
		};
		ActionsTh1.innerHTML = 'Thread Exceptions';
		ActionsTh1.style.cursor = 'pointer';
		ActionsTh1.style.minWidth = '145px';
		ActionsTh1.style.maxWidth = '145px';
		ActionsTh1.onclick = function()
		{
			t.length > 0 ? alert('Current thread exceptions:\n' + t + '.') : alert('You don\'t have any thread exceptions');
		};
		if (mail || clanF)
		{
			d[2].appendChild(ActionsTh0);
			d[2].appendChild(ActionsTh1);
		}
		else
		{
			d[3].appendChild(ActionsTh0);
			d[3].appendChild(ActionsTh1);
		}
		//resize columns - looks better
		if (allF)
		{
			ActionsTh0.parentNode.childNodes[1].style.minWidth = "130px";
			ActionsTh0.parentNode.childNodes[1].style.maxWidth = "130px";
			ActionsTh0.parentNode.childNodes[3].style.minWidth = "33px";
			ActionsTh0.parentNode.childNodes[3].style.maxWidth = "33px";
			
		}
		else
		{
			ActionsTh0.parentNode.childNodes[1].style.minWidth = "33px";
			ActionsTh0.parentNode.childNodes[1].style.maxWidth = "33px";
		}
		setTheadClassNames();
		checkF();
		fNo = 0;
		sNo = 2;
		var HTRfound = false;
		while (dNo < d.length-1)
		{
			//if HiddenThreadsRow is found, make it possable to show and hide downvoted content an infinate amount of times
			if (d[dNo].id == "HiddenThreadsRow")
			{
				HTRfound = true;
				var htr = document.getElementById("HiddenThreadsRow"),
					show = htr.children[0].children[0];
				if (show !== null)
				{
					show.id = "show";
					show = document.getElementById("show");
					show.innerHTML = "Show " + show.innerHTML.replace("hidden", "downvoted");
				}
				var td2to6 = [document.createElement("td"),	document.createElement("td"),	document.createElement("td"),	document.createElement("td"),	document.createElement("td"),	document.createElement("td"),	document.createElement("td")];
				//if Muli's script enabled, hidden threads row looks bad, so make it look nice
				if (allF)
				{
					/*
					if (userscripts.mulis() === true)
					{
						setTimeout('htr = document.getElementById("HiddenThreadsRow");	var td2to6 = [document.createElement("td"),	document.createElement("td"),	document.createElement("td"),	document.createElement("td"),	document.createElement("td"),	document.createElement("td"),	document.createElement("td")]; htr.appendChild(td2to6[0]);	htr.insertBefore(td2to6[0], htr.childNodes[2]);',1500);
					}
					else
					{
						htr.appendChild(td2to6[0]);
						htr.insertBefore(td2to6[0], htr.childNodes[0]);
						htr.appendChild(td2to6[1]);
						htr.insertBefore(td2to6[1], htr.childNodes[2]);
						show.parentElement.removeAttribute("colSpan");
						show.parentElement.style.textAlign = "left";
					}
					*/
					setTimeout('var htr = document.getElementById("HiddenThreadsRow"), td2 = document.createElement("td"), td3 = document.createElement("td"), show = document.getElementById("show"); if (show !== null) {if(htr.childNodes.length > 3) {htr.appendChild(td3); htr.insertBefore(td3, htr.childNodes[2]);} else {htr.appendChild(td2);  htr.insertBefore(td2, htr.childNodes[0]); htr.appendChild(td3); htr.insertBefore(td3, htr.childNodes[2]); show.parentNode.removeAttribute("colSpan"); show.parentNode.style.textAlign = "left";}}',1500);
				}
				else
				{
					setTimeout('var htr = document.getElementById("HiddenThreadsRow"), td2 = document.createElement("td"), td3 = document.createElement("td"); if(htr.childNodes.length < 4) {htr.appendChild(td2); htr.insertBefore(td2, htr.childNodes[0]); show.parentNode.removeAttribute("colSpan"); show.parentNode.style.textAlign = "left";}',1500);
				}
				show.onclick = function()
				{
					showClicked();
				};
				break;
			}
			//otherwise make buttons
			else if (ActionsTh0.parentNode.parentNode.childNodes[PlayersTrNo] !== undefined)
			{
				var PlayersTD = document.createElement("td"),
					PlayersHBtn = document.createElement("button"),
					PlayersSBtn = document.createElement("button");
				PlayersTD.className = "PlayersTD";
				var PlayersTDCN = document.getElementsByClassName("PlayersTD");
				ActionsTh0.parentNode.parentNode.childNodes[PlayersTrNo].appendChild(PlayersTD);
				PlayersHBtn.innerHTML = "Hide posts by this player";
				PlayersHBtn.className = "PlayersHBtn";
				PlayersSBtn.innerHTML = "Unhide posts by this player";
				PlayersSBtn.className = "PlayersSBtn";
				//decides if you get to see the hide posts or unhide posts by players button
				//preventing style getting overidden bug using matched as classname
				PlayersNo = 0;
				if (p.length < 1)
				{
					//only shows hide button
					PlayersHBtn.style.display = "table-row";
					PlayersSBtn.style.display = "none";
				}
				else
				{
					while (PlayersNo < p.length)
					{
						pNo = 0;
						while (pNo < p.length)
						{
							//alert(p[pNo]);
							if (f[fNo].innerHTML.replace("by ", "").includes(p[pNo]))
							{
								f[fNo].className = "Matched";
								//alert("dNo = " + dNo + ". p[pNo] = " + p[pNo] + ". f[fNo].innerHTML.replace('by', '') = " + f[fNo].innerHTML.replace("by ", ""));
								//alert(f[fNo].innerHTML.replace("by ", "").includes(p[pNo]));
								PlayersHBtn.style.display = "none";
								PlayersSBtn.style.display = "table-row";
							}
							if (f[fNo].className === undefined || f[fNo].className === null || f[fNo].className === "")
							{
								PlayersHBtn.style.display = "table-row";
								PlayersSBtn.style.display = "none";
							}
							pNo++;
						}
						PlayersNo++;
					}
				}
				PlayersNo = 0;
				pNo = 0;
				//came to conclusion
				PlayersTDCN[PlayersTDCNNo].appendChild(PlayersHBtn);
				PlayersTDCN[PlayersTDCNNo].appendChild(PlayersSBtn);
				PlayersTrNo++;
				PlayersTrNo++;
				PlayersTDCNNo++;
				var ThreadExceptionsTD = document.createElement("td"),
					ThreadExceptionsBtnH = document.createElement("button"),
					ThreadExceptionsBtnS = document.createElement("button");
				ThreadExceptionsTD.className = "ThreadExceptionsTD";
				var ThreadExceptionsTDCN = document.getElementsByClassName("ThreadExceptionsTD");
				ActionsTh1.parentNode.parentNode.childNodes[ThreadExceptionsTrNo].appendChild(ThreadExceptionsTD);
				ThreadExceptionsBtnH.innerHTML = "Add";
				ThreadExceptionsBtnH.className = "ThreadExceptionsBtnH";
				ThreadExceptionsBtnS.innerHTML = "Remove";
				ThreadExceptionsBtnS.className = "ThreadExceptionsBtnS";
				//decides if you get to see the add or remove a thread from thread exceptions
				if (a[aNo].title == "This thread is NOT being hidden")
				{
					ThreadExceptionsBtnH.style.display = "none";
					ThreadExceptionsBtnS.style.display = "table-row";
				}
				else
				{
					ThreadExceptionsBtnH.style.display = "table-row";
					ThreadExceptionsBtnS.style.display = "none";
				}
				//came to conclusion
				ThreadExceptionsTDCN[ThreadExceptionsTDCNNo].appendChild(ThreadExceptionsBtnH);
				ThreadExceptionsTDCN[ThreadExceptionsTDCNNo].appendChild(ThreadExceptionsBtnS);
				ThreadExceptionsTrNo++;
				ThreadExceptionsTrNo++;
				ThreadExceptionsTDCNNo++;
				f[fNo].className = "PlayerName";
				//f[fNo].innerHTML = " by 12345678901234567890123456789012345678901234567890";
				//a[aNo].innerHTML = "12345678901234567890123456789012345678901234567890";
				//s[sNo].innerHTML = "by 12345678901234567890123456789012345678901234567890";
				if (ActionsTh0.parentNode.childNodes[5].style.minWidth != "468px")
				{
					if (s[sNo] !== undefined)
					{
						if (f[fNo].innerHTML.length+s[sNo].innerHTML.length > 85)
						{
							//resize thread width to make the table look better
							//if thread poster name last replier length is greater than 85
							ActionsTh0.parentNode.childNodes[5].style.minWidth = "468px";
							ActionsTh0.parentNode.childNodes[5].style.maxWidth = "468px";
						}
					}
				}
			}
			sNo++;
			fNo++;
			aNo++;
			dNo++;
		}
		//prevent buttons being placed in the wrong place because HiddenThreadsRow is found
		if (HTRfound === true)
		{
			ThreadExceptionsTrNo++;
			ThreadExceptionsTrNo++;
			PlayersTrNo++;
			PlayersTrNo++;
			sNo++
			fNo++;
			while (dNo + 1 < d.length)
			{
				if (ActionsTh0.parentNode.parentNode.childNodes[ThreadExceptionsTrNo] !== undefined)
				{
					var PlayersTD = document.createElement("td"),
						PlayersHBtn = document.createElement("button"),
						PlayersSBtn = document.createElement("button");
					PlayersTD.className = "PlayersTD";
					var PlayersTDCN = document.getElementsByClassName("PlayersTD");
					ActionsTh0.parentNode.parentNode.childNodes[PlayersTrNo].appendChild(PlayersTD);
					PlayersHBtn.innerHTML = "Hide posts by this player";
					PlayersHBtn.className = "PlayersHBtn";
					PlayersSBtn.innerHTML = "Unhide posts by this player";
					PlayersSBtn.className = "PlayersSBtn";
					//decides if you get to see the hide posts or unhide posts by players button
					//prevent style getting overidden bug using matched as classname
					PlayersNo = 0;
					if (p.length < 1)
					{
						//only shows hide button
						PlayersHBtn.style.display = "table-row";
						PlayersSBtn.style.display = "none";
					}
					else
					{
						while (PlayersNo < p.length)
						{
							pNo = 0;
							while (pNo < p.length)
							{
								//alert(p[pNo]);
								if (f[fNo].innerHTML.replace("by ", "").includes(p[pNo]) === true)
								{
									f[fNo].className = "Matched";
									//alert("dNo = " + dNo + ". p[pNo] = " + p[pNo] + ". f[fNo].innerHTML.replace('by', '') = " + f[fNo].innerHTML.replace("by ", ""));
									//alert(f[fNo].innerHTML.replace("by ", "").includes(p[pNo]));
									PlayersHBtn.style.display = "none";
									PlayersSBtn.style.display = "table-row";
								}
								if (f[fNo].className === undefined || f[fNo].className === null || f[fNo].className === "")
								{
									PlayersHBtn.style.display = "table-row";
									PlayersSBtn.style.display = "none";
								}
								pNo++;
							}
							PlayersNo++;
						}
					}
					PlayersNo = 0;
					pNo = 0;
					//came to conclusion
					f[fNo].className = "PlayerName";
					if (ActionsTh0.parentNode.childNodes[5].style.minWidth != "468px")
					{
						if (s[sNo] !== undefined)
						{
							if (f[fNo].innerHTML.length+s[sNo].innerHTML.length > 85)
							{
								//resize thread width to make the table look better
								//if thread poster name last replier length is greater than 85
								ActionsTh0.parentNode.childNodes[5].style.minWidth = "468px";
								ActionsTh0.parentNode.childNodes[5].style.maxWidth = "468px";
							}

						}
					}
					PlayersTDCN[PlayersTDCNNo].appendChild(PlayersHBtn);
					PlayersTDCN[PlayersTDCNNo].appendChild(PlayersSBtn);
					PlayersTrNo++;
					PlayersTrNo++;
					PlayersTDCNNo++;
					var ThreadExceptionsTD = document.createElement("td"),
						ThreadExceptionsBtnH = document.createElement("button"),
						ThreadExceptionsBtnS = document.createElement("button");
					ThreadExceptionsTD.className = "ThreadExceptionsTD";
					var ThreadExceptionsTDCN = document.getElementsByClassName("ThreadExceptionsTD");
					ActionsTh1.parentNode.parentNode.childNodes[ThreadExceptionsTrNo].appendChild(ThreadExceptionsTD);
					ThreadExceptionsBtnH.innerHTML = "Add";
					ThreadExceptionsBtnH.className = "ThreadExceptionsBtnH";
					ThreadExceptionsBtnS.innerHTML = "Remove";
					ThreadExceptionsBtnS.className = "ThreadExceptionsBtnS";
					//decides if you get to see the add or remove a thread from thread exceptions
					if (a[aNo].title == "This thread is NOT being hidden")
					{
						ThreadExceptionsBtnH.style.display = "none";
						ThreadExceptionsBtnS.style.display = "table-row";
					}
					else
					{
						ThreadExceptionsBtnH.style.display = "table-row";
						ThreadExceptionsBtnS.style.display = "none";
					}
					//came to conclusion
					ThreadExceptionsTDCN[ThreadExceptionsTDCNNo].appendChild(ThreadExceptionsBtnH);
					ThreadExceptionsTDCN[ThreadExceptionsTDCNNo].appendChild(ThreadExceptionsBtnS);
					ThreadExceptionsTrNo++;
					ThreadExceptionsTrNo++;
					ThreadExceptionsTDCNNo++;
					dNo++;
					aNo++;
					sNo++;
					fNo++;
				}
				else
				{
					break;
				}
			}
		}
	}
	var PlayerName = document.getElementsByClassName("PlayerName"),
		PlayersBtnHCN = document.getElementsByClassName("PlayersHBtn"),
		PlayersBtnSCN = document.getElementsByClassName("PlayersSBtn"),
		ThreadExceptionsBtnHCN = document.getElementsByClassName("ThreadExceptionsBtnH"),
		ThreadExceptionsBtnSCN = document.getElementsByClassName("ThreadExceptionsBtnS");

	//assigning onclick using loop doesn't work how it should :(
	//add player to Players array
	if (PlayersBtnHCN[0] !== undefined) {PlayersBtnHCN[0].onclick = function() {addToArray("Players", PlayerName[0], 0);};}
	if (PlayersBtnHCN[1] !== undefined) {PlayersBtnHCN[1].onclick = function() {addToArray("Players", PlayerName[1], 1);};}
	if (PlayersBtnHCN[2] !== undefined) {PlayersBtnHCN[2].onclick = function() {addToArray("Players", PlayerName[2], 2);};}
	if (PlayersBtnHCN[3] !== undefined) {PlayersBtnHCN[3].onclick = function() {addToArray("Players", PlayerName[3], 3);};}
	if (PlayersBtnHCN[4] !== undefined) {PlayersBtnHCN[4].onclick = function() {addToArray("Players", PlayerName[4], 4);};}
	if (PlayersBtnHCN[5] !== undefined) {PlayersBtnHCN[5].onclick = function() {addToArray("Players", PlayerName[5], 5);};}
	if (PlayersBtnHCN[6] !== undefined) {PlayersBtnHCN[6].onclick = function() {addToArray("Players", PlayerName[6], 6);};}
	if (PlayersBtnHCN[7] !== undefined) {PlayersBtnHCN[7].onclick = function() {addToArray("Players", PlayerName[7], 7);};}
	if (PlayersBtnHCN[8] !== undefined) {PlayersBtnHCN[8].onclick = function() {addToArray("Players", PlayerName[8], 8);};}
	if (PlayersBtnHCN[9] !== undefined) {PlayersBtnHCN[9].onclick = function() {addToArray("Players", PlayerName[9], 9);};}
	if (PlayersBtnHCN[10] !== undefined) {PlayersBtnHCN[10].onclick = function() {addToArray("Players", PlayerName[10], 10);};}
	if (PlayersBtnHCN[11] !== undefined) {PlayersBtnHCN[11].onclick = function() {addToArray("Players", PlayerName[11], 11);};}
	if (PlayersBtnHCN[12] !== undefined) {PlayersBtnHCN[12].onclick = function() {addToArray("Players", PlayerName[12], 12);};}
	if (PlayersBtnHCN[13] !== undefined) {PlayersBtnHCN[13].onclick = function() {addToArray("Players", PlayerName[13], 13);};}
	if (PlayersBtnHCN[14] !== undefined) {PlayersBtnHCN[14].onclick = function() {addToArray("Players", PlayerName[14], 14);};}
	if (PlayersBtnHCN[15] !== undefined) {PlayersBtnHCN[15].onclick = function() {addToArray("Players", PlayerName[15], 15);};}
	if (PlayersBtnHCN[16] !== undefined) {PlayersBtnHCN[16].onclick = function() {addToArray("Players", PlayerName[16], 16);};}
	if (PlayersBtnHCN[17] !== undefined) {PlayersBtnHCN[17].onclick = function() {addToArray("Players", PlayerName[17], 17);};}
	if (PlayersBtnHCN[18] !== undefined) {PlayersBtnHCN[18].onclick = function() {addToArray("Players", PlayerName[18], 18);};}
	if (PlayersBtnHCN[19] !== undefined) {PlayersBtnHCN[19].onclick = function() {addToArray("Players", PlayerName[19], 19);};}
	if (PlayersBtnHCN[20] !== undefined) {PlayersBtnHCN[20].onclick = function() {addToArray("Players", PlayerName[20], 20);};}
	if (PlayersBtnHCN[21] !== undefined) {PlayersBtnHCN[21].onclick = function() {addToArray("Players", PlayerName[21], 21);};}
	if (PlayersBtnHCN[22] !== undefined) {PlayersBtnHCN[22].onclick = function() {addToArray("Players", PlayerName[22], 22);};}
	if (PlayersBtnHCN[23] !== undefined) {PlayersBtnHCN[23].onclick = function() {addToArray("Players", PlayerName[23], 23);};}
	if (PlayersBtnHCN[24] !== undefined) {PlayersBtnHCN[24].onclick = function() {addToArray("Players", PlayerName[24], 24);};}
	if (PlayersBtnHCN[25] !== undefined) {PlayersBtnHCN[25].onclick = function() {addToArray("Players", PlayerName[25], 25);};}
	if (PlayersBtnHCN[26] !== undefined) {PlayersBtnHCN[26].onclick = function() {addToArray("Players", PlayerName[26], 26);};}
	if (PlayersBtnHCN[27] !== undefined) {PlayersBtnHCN[27].onclick = function() {addToArray("Players", PlayerName[27], 27);};}
	if (PlayersBtnHCN[28] !== undefined) {PlayersBtnHCN[28].onclick = function() {addToArray("Players", PlayerName[28], 28);};}
	if (PlayersBtnHCN[29] !== undefined) {PlayersBtnHCN[29].onclick = function() {addToArray("Players", PlayerName[29], 29);};}
	if (PlayersBtnHCN[30] !== undefined) {PlayersBtnHCN[30].onclick = function() {addToArray("Players", PlayerName[30], 30);};}
	if (PlayersBtnHCN[31] !== undefined) {PlayersBtnHCN[31].onclick = function() {addToArray("Players", PlayerName[31], 31);};}
	if (PlayersBtnHCN[32] !== undefined) {PlayersBtnHCN[32].onclick = function() {addToArray("Players", PlayerName[32], 32);};}
	if (PlayersBtnHCN[33] !== undefined) {PlayersBtnHCN[33].onclick = function() {addToArray("Players", PlayerName[33], 33);};}
	if (PlayersBtnHCN[34] !== undefined) {PlayersBtnHCN[34].onclick = function() {addToArray("Players", PlayerName[34], 34);};}
	if (PlayersBtnHCN[35] !== undefined) {PlayersBtnHCN[35].onclick = function() {addToArray("Players", PlayerName[35], 35);};}
	if (PlayersBtnHCN[36] !== undefined) {PlayersBtnHCN[36].onclick = function() {addToArray("Players", PlayerName[36], 36);};}
	if (PlayersBtnHCN[37] !== undefined) {PlayersBtnHCN[37].onclick = function() {addToArray("Players", PlayerName[37], 37);};}
	if (PlayersBtnHCN[38] !== undefined) {PlayersBtnHCN[38].onclick = function() {addToArray("Players", PlayerName[38], 38);};}
	if (PlayersBtnHCN[39] !== undefined) {PlayersBtnHCN[39].onclick = function() {addToArray("Players", PlayerName[39], 39);};}
	if (PlayersBtnHCN[40] !== undefined) {PlayersBtnHCN[40].onclick = function() {addToArray("Players", PlayerName[40], 40);};}
	if (PlayersBtnHCN[41] !== undefined) {PlayersBtnHCN[41].onclick = function() {addToArray("Players", PlayerName[41], 41);};}
	if (PlayersBtnHCN[42] !== undefined) {PlayersBtnHCN[42].onclick = function() {addToArray("Players", PlayerName[42], 42);};}
	if (PlayersBtnHCN[43] !== undefined) {PlayersBtnHCN[43].onclick = function() {addToArray("Players", PlayerName[43], 43);};}
	if (PlayersBtnHCN[44] !== undefined) {PlayersBtnHCN[44].onclick = function() {addToArray("Players", PlayerName[44], 44);};}
	if (PlayersBtnHCN[45] !== undefined) {PlayersBtnHCN[45].onclick = function() {addToArray("Players", PlayerName[45], 45);};}
	if (PlayersBtnHCN[46] !== undefined) {PlayersBtnHCN[46].onclick = function() {addToArray("Players", PlayerName[46], 46);};}
	if (PlayersBtnHCN[47] !== undefined) {PlayersBtnHCN[47].onclick = function() {addToArray("Players", PlayerName[47], 47);};}
	if (PlayersBtnHCN[48] !== undefined) {PlayersBtnHCN[48].onclick = function() {addToArray("Players", PlayerName[48], 48);};}
	if (PlayersBtnHCN[49] !== undefined) {PlayersBtnHCN[49].onclick = function() {addToArray("Players", PlayerName[49], 49);};}
	//remove player from Players array
	if (PlayersBtnSCN[0] !== undefined) {PlayersBtnSCN[0].onclick = function() {removePlayer(PlayerName[0], 0);};}
	if (PlayersBtnSCN[1] !== undefined) {PlayersBtnSCN[1].onclick = function() {removePlayer(PlayerName[1], 1);};}
	if (PlayersBtnSCN[2] !== undefined) {PlayersBtnSCN[2].onclick = function() {removePlayer(PlayerName[2], 2);};}
	if (PlayersBtnSCN[3] !== undefined) {PlayersBtnSCN[3].onclick = function() {removePlayer(PlayerName[3], 3);};}
	if (PlayersBtnSCN[4] !== undefined) {PlayersBtnSCN[4].onclick = function() {removePlayer(PlayerName[4], 4);};}
	if (PlayersBtnSCN[5] !== undefined) {PlayersBtnSCN[5].onclick = function() {removePlayer(PlayerName[5], 5);};}
	if (PlayersBtnSCN[6] !== undefined) {PlayersBtnSCN[6].onclick = function() {removePlayer(PlayerName[6], 6);};}
	if (PlayersBtnSCN[7] !== undefined) {PlayersBtnSCN[7].onclick = function() {removePlayer(PlayerName[7], 7);};}
	if (PlayersBtnSCN[8] !== undefined) {PlayersBtnSCN[8].onclick = function() {removePlayer(PlayerName[8], 8);};}
	if (PlayersBtnSCN[9] !== undefined) {PlayersBtnSCN[9].onclick = function() {removePlayer(PlayerName[9], 9);};}
	if (PlayersBtnSCN[10] !== undefined) {PlayersBtnSCN[10].onclick = function() {removePlayer(PlayerName[10], 10);};}
	if (PlayersBtnSCN[11] !== undefined) {PlayersBtnSCN[11].onclick = function() {removePlayer(PlayerName[11], 11);};}
	if (PlayersBtnSCN[12] !== undefined) {PlayersBtnSCN[12].onclick = function() {removePlayer(PlayerName[12], 12);};}
	if (PlayersBtnSCN[13] !== undefined) {PlayersBtnSCN[13].onclick = function() {removePlayer(PlayerName[13], 13);};}
	if (PlayersBtnSCN[14] !== undefined) {PlayersBtnSCN[14].onclick = function() {removePlayer(PlayerName[14], 14);};}
	if (PlayersBtnSCN[15] !== undefined) {PlayersBtnSCN[15].onclick = function() {removePlayer(PlayerName[15], 15);};}
	if (PlayersBtnSCN[16] !== undefined) {PlayersBtnSCN[16].onclick = function() {removePlayer(PlayerName[16], 16);};}
	if (PlayersBtnSCN[17] !== undefined) {PlayersBtnSCN[17].onclick = function() {removePlayer(PlayerName[17], 17);};}
	if (PlayersBtnSCN[18] !== undefined) {PlayersBtnSCN[18].onclick = function() {removePlayer(PlayerName[18], 18);};}
	if (PlayersBtnSCN[19] !== undefined) {PlayersBtnSCN[19].onclick = function() {removePlayer(PlayerName[19], 19);};}
	if (PlayersBtnSCN[20] !== undefined) {PlayersBtnSCN[20].onclick = function() {removePlayer(PlayerName[20], 20);};}
	if (PlayersBtnSCN[21] !== undefined) {PlayersBtnSCN[21].onclick = function() {removePlayer(PlayerName[21], 21);};}
	if (PlayersBtnSCN[22] !== undefined) {PlayersBtnSCN[22].onclick = function() {removePlayer(PlayerName[22], 22);};}
	if (PlayersBtnSCN[23] !== undefined) {PlayersBtnSCN[23].onclick = function() {removePlayer(PlayerName[23], 23);};}
	if (PlayersBtnSCN[24] !== undefined) {PlayersBtnSCN[24].onclick = function() {removePlayer(PlayerName[24], 24);};}
	if (PlayersBtnSCN[25] !== undefined) {PlayersBtnSCN[25].onclick = function() {removePlayer(PlayerName[25], 25);};}
	if (PlayersBtnSCN[26] !== undefined) {PlayersBtnSCN[26].onclick = function() {removePlayer(PlayerName[26], 26);};}
	if (PlayersBtnSCN[27] !== undefined) {PlayersBtnSCN[27].onclick = function() {removePlayer(PlayerName[27], 27);};}
	if (PlayersBtnSCN[28] !== undefined) {PlayersBtnSCN[28].onclick = function() {removePlayer(PlayerName[28], 28);};}
	if (PlayersBtnSCN[29] !== undefined) {PlayersBtnSCN[29].onclick = function() {removePlayer(PlayerName[29], 29);};}
	if (PlayersBtnSCN[30] !== undefined) {PlayersBtnSCN[30].onclick = function() {removePlayer(PlayerName[30], 30);};}
	if (PlayersBtnSCN[31] !== undefined) {PlayersBtnSCN[31].onclick = function() {removePlayer(PlayerName[31], 31);};}
	if (PlayersBtnSCN[32] !== undefined) {PlayersBtnSCN[32].onclick = function() {removePlayer(PlayerName[32], 32);};}
	if (PlayersBtnSCN[33] !== undefined) {PlayersBtnSCN[33].onclick = function() {removePlayer(PlayerName[33], 33);};}
	if (PlayersBtnSCN[34] !== undefined) {PlayersBtnSCN[34].onclick = function() {removePlayer(PlayerName[34], 34);};}
	if (PlayersBtnSCN[35] !== undefined) {PlayersBtnSCN[35].onclick = function() {removePlayer(PlayerName[35], 35);};}
	if (PlayersBtnSCN[36] !== undefined) {PlayersBtnSCN[36].onclick = function() {removePlayer(PlayerName[36], 36);};}
	if (PlayersBtnSCN[37] !== undefined) {PlayersBtnSCN[37].onclick = function() {removePlayer(PlayerName[37], 37);};}
	if (PlayersBtnSCN[38] !== undefined) {PlayersBtnSCN[38].onclick = function() {removePlayer(PlayerName[38], 38);};}
	if (PlayersBtnSCN[39] !== undefined) {PlayersBtnSCN[39].onclick = function() {removePlayer(PlayerName[39], 39);};}
	if (PlayersBtnSCN[40] !== undefined) {PlayersBtnSCN[40].onclick = function() {removePlayer(PlayerName[40], 40);};}
	if (PlayersBtnSCN[41] !== undefined) {PlayersBtnSCN[41].onclick = function() {removePlayer(PlayerName[41], 41);};}
	if (PlayersBtnSCN[42] !== undefined) {PlayersBtnSCN[42].onclick = function() {removePlayer(PlayerName[42], 42);};}
	if (PlayersBtnSCN[43] !== undefined) {PlayersBtnSCN[43].onclick = function() {removePlayer(PlayerName[43], 43);};}
	if (PlayersBtnSCN[44] !== undefined) {PlayersBtnSCN[44].onclick = function() {removePlayer(PlayerName[44], 44);};}
	if (PlayersBtnSCN[45] !== undefined) {PlayersBtnSCN[45].onclick = function() {removePlayer(PlayerName[45], 45);};}
	if (PlayersBtnSCN[46] !== undefined) {PlayersBtnSCN[46].onclick = function() {removePlayer(PlayerName[46], 46);};}
	if (PlayersBtnSCN[47] !== undefined) {PlayersBtnSCN[47].onclick = function() {removePlayer(PlayerName[47], 47);};}
	if (PlayersBtnSCN[48] !== undefined) {PlayersBtnSCN[48].onclick = function() {removePlayer(PlayerName[48], 48);};}
	if (PlayersBtnSCN[49] !== undefined) {PlayersBtnSCN[49].onclick = function() {removePlayer(PlayerName[49], 49);};}
	//add thread to thread exceptions array
	if (ThreadExceptionsBtnHCN[0] !== undefined) {ThreadExceptionsBtnHCN[0].onclick = function() {addToArray("threads", ThreadLink[0], 0);};}
	if (ThreadExceptionsBtnHCN[1] !== undefined) {ThreadExceptionsBtnHCN[1].onclick = function() {addToArray("threads", ThreadLink[1], 1);};}
	if (ThreadExceptionsBtnHCN[2] !== undefined) {ThreadExceptionsBtnHCN[2].onclick = function() {addToArray("threads", ThreadLink[2], 2);};}
	if (ThreadExceptionsBtnHCN[3] !== undefined) {ThreadExceptionsBtnHCN[3].onclick = function() {addToArray("threads", ThreadLink[3], 3);};}
	if (ThreadExceptionsBtnHCN[4] !== undefined) {ThreadExceptionsBtnHCN[4].onclick = function() {addToArray("threads", ThreadLink[4], 4);};}
	if (ThreadExceptionsBtnHCN[5] !== undefined) {ThreadExceptionsBtnHCN[5].onclick = function() {addToArray("threads", ThreadLink[5], 5);};}
	if (ThreadExceptionsBtnHCN[6] !== undefined) {ThreadExceptionsBtnHCN[6].onclick = function() {addToArray("threads", ThreadLink[6], 6);};}
	if (ThreadExceptionsBtnHCN[7] !== undefined) {ThreadExceptionsBtnHCN[7].onclick = function() {addToArray("threads", ThreadLink[7], 7);};}
	if (ThreadExceptionsBtnHCN[8] !== undefined) {ThreadExceptionsBtnHCN[8].onclick = function() {addToArray("threads", ThreadLink[8], 8);};}
	if (ThreadExceptionsBtnHCN[9] !== undefined) {ThreadExceptionsBtnHCN[9].onclick = function() {addToArray("threads", ThreadLink[9], 9);};}
	if (ThreadExceptionsBtnHCN[10] !== undefined) {ThreadExceptionsBtnHCN[10].onclick = function() {addToArray("threads", ThreadLink[10], 10);};}
	if (ThreadExceptionsBtnHCN[11] !== undefined) {ThreadExceptionsBtnHCN[11].onclick = function() {addToArray("threads", ThreadLink[11], 11);};}
	if (ThreadExceptionsBtnHCN[12] !== undefined) {ThreadExceptionsBtnHCN[12].onclick = function() {addToArray("threads", ThreadLink[12], 12);};}
	if (ThreadExceptionsBtnHCN[13] !== undefined) {ThreadExceptionsBtnHCN[13].onclick = function() {addToArray("threads", ThreadLink[13], 13);};}
	if (ThreadExceptionsBtnHCN[14] !== undefined) {ThreadExceptionsBtnHCN[14].onclick = function() {addToArray("threads", ThreadLink[14], 14);};}
	if (ThreadExceptionsBtnHCN[15] !== undefined) {ThreadExceptionsBtnHCN[15].onclick = function() {addToArray("threads", ThreadLink[15], 15);};}
	if (ThreadExceptionsBtnHCN[16] !== undefined) {ThreadExceptionsBtnHCN[16].onclick = function() {addToArray("threads", ThreadLink[16], 16);};}
	if (ThreadExceptionsBtnHCN[17] !== undefined) {ThreadExceptionsBtnHCN[17].onclick = function() {addToArray("threads", ThreadLink[17], 17);};}
	if (ThreadExceptionsBtnHCN[18] !== undefined) {ThreadExceptionsBtnHCN[18].onclick = function() {addToArray("threads", ThreadLink[18], 18);};}
	if (ThreadExceptionsBtnHCN[19] !== undefined) {ThreadExceptionsBtnHCN[19].onclick = function() {addToArray("threads", ThreadLink[19], 19);};}
	if (ThreadExceptionsBtnHCN[20] !== undefined) {ThreadExceptionsBtnHCN[20].onclick = function() {addToArray("threads", ThreadLink[20], 20);};}
	if (ThreadExceptionsBtnHCN[21] !== undefined) {ThreadExceptionsBtnHCN[21].onclick = function() {addToArray("threads", ThreadLink[21], 21);};}
	if (ThreadExceptionsBtnHCN[22] !== undefined) {ThreadExceptionsBtnHCN[22].onclick = function() {addToArray("threads", ThreadLink[22], 22);};}
	if (ThreadExceptionsBtnHCN[23] !== undefined) {ThreadExceptionsBtnHCN[23].onclick = function() {addToArray("threads", ThreadLink[23], 23);};}
	if (ThreadExceptionsBtnHCN[24] !== undefined) {ThreadExceptionsBtnHCN[24].onclick = function() {addToArray("threads", ThreadLink[24], 24);};}
	if (ThreadExceptionsBtnHCN[25] !== undefined) {ThreadExceptionsBtnHCN[25].onclick = function() {addToArray("threads", ThreadLink[25], 25);};}
	if (ThreadExceptionsBtnHCN[26] !== undefined) {ThreadExceptionsBtnHCN[26].onclick = function() {addToArray("threads", ThreadLink[26], 26);};}
	if (ThreadExceptionsBtnHCN[27] !== undefined) {ThreadExceptionsBtnHCN[27].onclick = function() {addToArray("threads", ThreadLink[27], 27);};}
	if (ThreadExceptionsBtnHCN[28] !== undefined) {ThreadExceptionsBtnHCN[28].onclick = function() {addToArray("threads", ThreadLink[28], 28);};}
	if (ThreadExceptionsBtnHCN[29] !== undefined) {ThreadExceptionsBtnHCN[29].onclick = function() {addToArray("threads", ThreadLink[29], 29);};}
	if (ThreadExceptionsBtnHCN[30] !== undefined) {ThreadExceptionsBtnHCN[30].onclick = function() {addToArray("threads", ThreadLink[30], 30);};}
	if (ThreadExceptionsBtnHCN[31] !== undefined) {ThreadExceptionsBtnHCN[31].onclick = function() {addToArray("threads", ThreadLink[31], 31);};}
	if (ThreadExceptionsBtnHCN[32] !== undefined) {ThreadExceptionsBtnHCN[32].onclick = function() {addToArray("threads", ThreadLink[32], 32);};}
	if (ThreadExceptionsBtnHCN[33] !== undefined) {ThreadExceptionsBtnHCN[33].onclick = function() {addToArray("threads", ThreadLink[33], 33);};}
	if (ThreadExceptionsBtnHCN[34] !== undefined) {ThreadExceptionsBtnHCN[34].onclick = function() {addToArray("threads", ThreadLink[34], 34);};}
	if (ThreadExceptionsBtnHCN[35] !== undefined) {ThreadExceptionsBtnHCN[35].onclick = function() {addToArray("threads", ThreadLink[35], 35);};}
	if (ThreadExceptionsBtnHCN[36] !== undefined) {ThreadExceptionsBtnHCN[36].onclick = function() {addToArray("threads", ThreadLink[36], 36);};}
	if (ThreadExceptionsBtnHCN[37] !== undefined) {ThreadExceptionsBtnHCN[37].onclick = function() {addToArray("threads", ThreadLink[37], 37);};}
	if (ThreadExceptionsBtnHCN[38] !== undefined) {ThreadExceptionsBtnHCN[38].onclick = function() {addToArray("threads", ThreadLink[38], 38);};}
	if (ThreadExceptionsBtnHCN[39] !== undefined) {ThreadExceptionsBtnHCN[39].onclick = function() {addToArray("threads", ThreadLink[39], 39);};}
	if (ThreadExceptionsBtnHCN[40] !== undefined) {ThreadExceptionsBtnHCN[40].onclick = function() {addToArray("threads", ThreadLink[40], 40);};}
	if (ThreadExceptionsBtnHCN[41] !== undefined) {ThreadExceptionsBtnHCN[41].onclick = function() {addToArray("threads", ThreadLink[41], 41);};}
	if (ThreadExceptionsBtnHCN[42] !== undefined) {ThreadExceptionsBtnHCN[42].onclick = function() {addToArray("threads", ThreadLink[42], 42);};}
	if (ThreadExceptionsBtnHCN[43] !== undefined) {ThreadExceptionsBtnHCN[43].onclick = function() {addToArray("threads", ThreadLink[43], 43);};}
	if (ThreadExceptionsBtnHCN[44] !== undefined) {ThreadExceptionsBtnHCN[44].onclick = function() {addToArray("threads", ThreadLink[44], 44);};}
	if (ThreadExceptionsBtnHCN[45] !== undefined) {ThreadExceptionsBtnHCN[45].onclick = function() {addToArray("threads", ThreadLink[45], 45);};}
	if (ThreadExceptionsBtnHCN[46] !== undefined) {ThreadExceptionsBtnHCN[46].onclick = function() {addToArray("threads", ThreadLink[46], 46);};}
	if (ThreadExceptionsBtnHCN[47] !== undefined) {ThreadExceptionsBtnHCN[47].onclick = function() {addToArray("threads", ThreadLink[47], 47);};}
	if (ThreadExceptionsBtnHCN[48] !== undefined) {ThreadExceptionsBtnHCN[48].onclick = function() {addToArray("threads", ThreadLink[48], 48);};}
	if (ThreadExceptionsBtnHCN[49] !== undefined) {ThreadExceptionsBtnHCN[49].onclick = function() {addToArray("threads", ThreadLink[49], 49);};}
	//remove thread exception from thread exceptions array
	if (ThreadExceptionsBtnSCN[0] !== undefined) {ThreadExceptionsBtnSCN[0].onclick = function() {removeThread(ThreadLink[0], 0);};}
	if (ThreadExceptionsBtnSCN[1] !== undefined) {ThreadExceptionsBtnSCN[1].onclick = function() {removeThread(ThreadLink[1], 1);};}
	if (ThreadExceptionsBtnSCN[2] !== undefined) {ThreadExceptionsBtnSCN[2].onclick = function() {removeThread(ThreadLink[2], 2);};}
	if (ThreadExceptionsBtnSCN[3] !== undefined) {ThreadExceptionsBtnSCN[3].onclick = function() {removeThread(ThreadLink[3], 3);};}
	if (ThreadExceptionsBtnSCN[4] !== undefined) {ThreadExceptionsBtnSCN[4].onclick = function() {removeThread(ThreadLink[4], 4);};}
	if (ThreadExceptionsBtnSCN[5] !== undefined) {ThreadExceptionsBtnSCN[5].onclick = function() {removeThread(ThreadLink[5], 5);};}
	if (ThreadExceptionsBtnSCN[6] !== undefined) {ThreadExceptionsBtnSCN[6].onclick = function() {removeThread(ThreadLink[6], 6);};}
	if (ThreadExceptionsBtnSCN[7] !== undefined) {ThreadExceptionsBtnSCN[7].onclick = function() {removeThread(ThreadLink[7], 7);};}
	if (ThreadExceptionsBtnSCN[8] !== undefined) {ThreadExceptionsBtnSCN[8].onclick = function() {removeThread(ThreadLink[8], 8);};}
	if (ThreadExceptionsBtnSCN[9] !== undefined) {ThreadExceptionsBtnSCN[9].onclick = function() {removeThread(ThreadLink[9], 9);};}
	if (ThreadExceptionsBtnSCN[10] !== undefined) {ThreadExceptionsBtnSCN[10].onclick = function() {removeThread(ThreadLink[10], 10);};}
	if (ThreadExceptionsBtnSCN[11] !== undefined) {ThreadExceptionsBtnSCN[11].onclick = function() {removeThread(ThreadLink[11], 11);};}
	if (ThreadExceptionsBtnSCN[12] !== undefined) {ThreadExceptionsBtnSCN[12].onclick = function() {removeThread(ThreadLink[12], 12);};}
	if (ThreadExceptionsBtnSCN[13] !== undefined) {ThreadExceptionsBtnSCN[13].onclick = function() {removeThread(ThreadLink[13], 13);};}
	if (ThreadExceptionsBtnSCN[14] !== undefined) {ThreadExceptionsBtnSCN[14].onclick = function() {removeThread(ThreadLink[14], 14);};}
	if (ThreadExceptionsBtnSCN[15] !== undefined) {ThreadExceptionsBtnSCN[15].onclick = function() {removeThread(ThreadLink[15], 15);};}
	if (ThreadExceptionsBtnSCN[16] !== undefined) {ThreadExceptionsBtnSCN[16].onclick = function() {removeThread(ThreadLink[16], 16);};}
	if (ThreadExceptionsBtnSCN[17] !== undefined) {ThreadExceptionsBtnSCN[17].onclick = function() {removeThread(ThreadLink[17], 17);};}
	if (ThreadExceptionsBtnSCN[18] !== undefined) {ThreadExceptionsBtnSCN[18].onclick = function() {removeThread(ThreadLink[18], 18);};}
	if (ThreadExceptionsBtnSCN[19] !== undefined) {ThreadExceptionsBtnSCN[19].onclick = function() {removeThread(ThreadLink[19], 19);};}
	if (ThreadExceptionsBtnSCN[20] !== undefined) {ThreadExceptionsBtnSCN[20].onclick = function() {removeThread(ThreadLink[20], 20);};}
	if (ThreadExceptionsBtnSCN[21] !== undefined) {ThreadExceptionsBtnSCN[21].onclick = function() {removeThread(ThreadLink[21], 21);};}
	if (ThreadExceptionsBtnSCN[22] !== undefined) {ThreadExceptionsBtnSCN[22].onclick = function() {removeThread(ThreadLink[22], 22);};}
	if (ThreadExceptionsBtnSCN[23] !== undefined) {ThreadExceptionsBtnSCN[23].onclick = function() {removeThread(ThreadLink[23], 23);};}
	if (ThreadExceptionsBtnSCN[24] !== undefined) {ThreadExceptionsBtnSCN[24].onclick = function() {removeThread(ThreadLink[24], 24);};}
	if (ThreadExceptionsBtnSCN[25] !== undefined) {ThreadExceptionsBtnSCN[25].onclick = function() {removeThread(ThreadLink[25], 25);};}
	if (ThreadExceptionsBtnSCN[26] !== undefined) {ThreadExceptionsBtnSCN[26].onclick = function() {removeThread(ThreadLink[26], 26);};}
	if (ThreadExceptionsBtnSCN[27] !== undefined) {ThreadExceptionsBtnSCN[27].onclick = function() {removeThread(ThreadLink[27], 27);};}
	if (ThreadExceptionsBtnSCN[28] !== undefined) {ThreadExceptionsBtnSCN[28].onclick = function() {removeThread(ThreadLink[28], 28);};}
	if (ThreadExceptionsBtnSCN[29] !== undefined) {ThreadExceptionsBtnSCN[29].onclick = function() {removeThread(ThreadLink[29], 29);};}
	if (ThreadExceptionsBtnSCN[30] !== undefined) {ThreadExceptionsBtnSCN[30].onclick = function() {removeThread(ThreadLink[30], 30);};}
	if (ThreadExceptionsBtnSCN[31] !== undefined) {ThreadExceptionsBtnSCN[31].onclick = function() {removeThread(ThreadLink[31], 31);};}
	if (ThreadExceptionsBtnSCN[32] !== undefined) {ThreadExceptionsBtnSCN[32].onclick = function() {removeThread(ThreadLink[32], 32);};}
	if (ThreadExceptionsBtnSCN[33] !== undefined) {ThreadExceptionsBtnSCN[33].onclick = function() {removeThread(ThreadLink[33], 33);};}
	if (ThreadExceptionsBtnSCN[34] !== undefined) {ThreadExceptionsBtnSCN[34].onclick = function() {removeThread(ThreadLink[34], 34);};}
	if (ThreadExceptionsBtnSCN[35] !== undefined) {ThreadExceptionsBtnSCN[35].onclick = function() {removeThread(ThreadLink[35], 35);};}
	if (ThreadExceptionsBtnSCN[36] !== undefined) {ThreadExceptionsBtnSCN[36].onclick = function() {removeThread(ThreadLink[36], 36);};}
	if (ThreadExceptionsBtnSCN[37] !== undefined) {ThreadExceptionsBtnSCN[37].onclick = function() {removeThread(ThreadLink[37], 37);};}
	if (ThreadExceptionsBtnSCN[38] !== undefined) {ThreadExceptionsBtnSCN[38].onclick = function() {removeThread(ThreadLink[38], 38);};}
	if (ThreadExceptionsBtnSCN[39] !== undefined) {ThreadExceptionsBtnSCN[39].onclick = function() {removeThread(ThreadLink[39], 39);};}
	if (ThreadExceptionsBtnSCN[40] !== undefined) {ThreadExceptionsBtnSCN[40].onclick = function() {removeThread(ThreadLink[40], 40);};}
	if (ThreadExceptionsBtnSCN[41] !== undefined) {ThreadExceptionsBtnSCN[41].onclick = function() {removeThread(ThreadLink[41], 41);};}
	if (ThreadExceptionsBtnSCN[42] !== undefined) {ThreadExceptionsBtnSCN[42].onclick = function() {removeThread(ThreadLink[42], 42);};}
	if (ThreadExceptionsBtnSCN[43] !== undefined) {ThreadExceptionsBtnSCN[43].onclick = function() {removeThread(ThreadLink[43], 43);};}
	if (ThreadExceptionsBtnSCN[44] !== undefined) {ThreadExceptionsBtnSCN[44].onclick = function() {removeThread(ThreadLink[44], 44);};}
	if (ThreadExceptionsBtnSCN[45] !== undefined) {ThreadExceptionsBtnSCN[45].onclick = function() {removeThread(ThreadLink[45], 45);};}
	if (ThreadExceptionsBtnSCN[46] !== undefined) {ThreadExceptionsBtnSCN[46].onclick = function() {removeThread(ThreadLink[46], 46);};}
	if (ThreadExceptionsBtnSCN[47] !== undefined) {ThreadExceptionsBtnSCN[47].onclick = function() {removeThread(ThreadLink[47], 47);};}
	if (ThreadExceptionsBtnSCN[48] !== undefined) {ThreadExceptionsBtnSCN[48].onclick = function() {removeThread(ThreadLink[48], 48);};}
	if (ThreadExceptionsBtnSCN[49] !== undefined) {ThreadExceptionsBtnSCN[49].onclick = function() {removeThread(ThreadLink[49], 49);};}
}

function blankLinksToBlankName()
{
	//makes blank links visable globaly by replacing the link's innerHTML with [blank name]
	var a = document.getElementsByTagName("a"),
		aNo = 0;


	while (aNo < a.length)
	{
		if (a[aNo].innerHTML.match(/\uA0/gi) || a[aNo].innerHTML.match(/\uAD/gi) || a[aNo].innerHTML.match(/\u2DE/gi) || a[aNo].innerHTML.match(/\u00AD/gi) || a[aNo].innerHTML.match(/\u02DE/gi) || a[aNo].innerHTML.match(/\u1361/gi) || a[aNo].innerHTML.match(/\u1680/gi) || a[aNo].innerHTML.match(/\u180E/gi) || a[aNo].innerHTML.match(/\u2000/gi) || a[aNo].innerHTML.match(/\u2001/gi) || a[aNo].innerHTML.match(/\u2002/gi) || a[aNo].innerHTML.match(/\u2003/gi) || a[aNo].innerHTML.match(/\u2004/gi) || a[aNo].innerHTML.match(/\u2005/gi) || a[aNo].innerHTML.match(/\u2006/gi) || a[aNo].innerHTML.match(/\u2007/gi) || a[aNo].innerHTML.match(/\u2008/gi) || a[aNo].innerHTML.match(/\u2009/gi) || a[aNo].innerHTML.match(/\u200A/gi) || a[aNo].innerHTML.match(/\u200B/gi) || a[aNo].innerHTML.match(/\u202F/gi) || a[aNo].innerHTML.match(/\u205F/gi) || a[aNo].innerHTML.match(/\u2800/gi) || a[aNo].innerHTML.match(/\u3000/gi) || a[aNo].innerHTML.match(/\u3164/gi) || a[aNo].innerHTML.match(/\uFEFF/gi))
		{
			a[aNo].innerHTML = "[blank name]";
		}

		aNo++;
	}
}

blankLinksToBlankName();