Source for "Conquer Club - BETA BOB"

By yeti_c
Has 2 other scripts.


the source is over 100KB, syntax highlighting in the browser is too slow

// Conquer Club - Card Counter, Card Redemption Value, Status Indicator
var versionString = "4.5.15";

//  
//  This monkey is now called 
//





             /////    ////   /////      
             //  //  //  //  //  //     
             /////   //  //  /////      
             //  //  //  //  //  //     
             /////    ////   /////      


//
//  
//    PLEASE READ ALL THE COMMENTS AT THE START OF THIS FILE BEFORE EDITING 
//  
//-----------------------------------------------------------------------------
// Installation
//-----------------------------------------------------------------------------
// This is a Greasemonkey user script.
//
// To use, first install Greasemonkey: http://greasemonkey.mozdev.org/
// Then restart Firefox and revisit this script.
// Under Tools, there will be a new menu item to "Install User Script".
// Accept the default configuration and install.
//
// To uninstall, go to Tools/Manage User Scripts,
// select "Conquer Club - BOB", and click Uninstall.
//
//-----------------------------------------------------------------------------
//  Meta Data - required for Greasemonkey
//-----------------------------------------------------------------------------
// ==UserScript==
// @name          Conquer Club - BETA BOB
// @namespace     http://yeti_c.co.uk/conquerClub
// @description   Adds Stats, card counter, redemption value, animated clock, text based map, map inspection tools
// @include       http://*conquerclub.com*
// ==/UserScript==

// 
//-----------------------------------------------------------------------------
// DO NOT EDIT BELOW THIS ( unless you know what you are doing )
//-----------------------------------------------------------------------------
// NO REALLY, THERE IS NO NEED TO EDIT THIS FILE ALL OPTIONS ARE CONTROLLED BY THE GAME MENU
//
//
//  I mean it dont even read past here


















// If you are still reading then on your own head be it, however pleaae post your modification to this thread
// http://www.conquerclub.com/forum/viewtopic.php?t=33445 so that I can look at improving the script.

//-----------------------------------------------------------------------------
//  Please Wait coding - creates a Div that gets in the way of people doing things!
//-----------------------------------------------------------------------------


// Start/stop please wait...
function startWaiting() { showPleaseWait(true);  }
function stopWaiting()  { showPleaseWait(false); }

// Start please wait with custom message
function customStartWaiting(msg) 
{
	startWaiting();
	var pleaseWaitCaption = document.getElementById('pleaseWaitMessage');
	if (pleaseWaitCaption)
		pleaseWaitCaption.innerHTML = msg;
}

// Functions for showing/hiding please wait message
function showPleaseWait(show)
{
	var pleaseWait = document.getElementById('pleaseWait');
	if (!pleaseWait)
		pleaseWait = createPleaseWait();
	if (pleaseWait)
	{
		if (show) 
			pleaseWait.style.display = "";
		else 
			pleaseWait.style.display = "none";
	}
}

function createPleaseWait()
{
	var opacity = "0.5";
	var backColour = "#000000";
	var frontColour = "#FFFFFF";
	
	
	var pleaseWait = document.createElement('div');
	pleaseWait.id = "pleaseWait";
	pleaseWait.style.position = "absolute";
	pleaseWait.style.height = "100%";
	pleaseWait.style.width = "100%";
	pleaseWait.style.display = "none";
	pleaseWait.style.zIndex = "99";
	pleaseWait.style.top = "0";
	pleaseWait.style.left = "0";

	// Show please wait over central column only.
	var midcol = document.getElementById("middleColumn");
	if (midcol) // note it may not exist in secondary included pages like topic review
		document.getElementById("middleColumn").appendChild(pleaseWait);
	else
		return;


	var pwTable = document.createElement('table');
	pwTable.style.height = "100%"
	pwTable.style.width = "100%";
	pwTable.cellSpacing = "0";
	pwTable.cellPadding = "0";

	var pwRow1 = document.createElement('tr');
	pwRow1.style.height = "300px";
	pwRow1.style.verticalAlign = "top";

	var pwTdRow1 = document.createElement('td');
	pwTdRow1.style.backgroundColor = backColour;
	pwTdRow1.style.opacity = opacity;
	pwTdRow1.colSpan = '3';


	var pwRow2 = document.createElement('tr');
	pwRow2.style.height = "1px";
	pwRow2.style.padding = "0px";


	var pwTd1Row2 = document.createElement('td');
	pwTd1Row2.style.backgroundColor = backColour;
	pwTd1Row2.style.opacity = opacity;
	pwTd1Row2.style.width = "25%";


	var pwTd2Row2 = document.createElement('td');

	pwTd2Row2.style.padding = "0px 0px 0px 0px";
	pwTd2Row2.style.backgroundColor = frontColour;
	pwTd2Row2.style.border = "1px";
	pwTd2Row2.style.padding = "10px";
	pwTd2Row2.style.borderStyle = "solid";
	pwTd2Row2.style.opacity = 1;

	var pwMessageTable = document.createElement('table');
	pwMessageTable.style.backgroundColor = frontColour;
	pwMessageTable.style.color = "#000000";
	pwMessageTable.style.padding = 0;
	pwMessageTable.style.width = "100%";
	pwMessageTable.style.height = "100%";


	var pwMessTableRow = document.createElement('tr');
	pwMessTableRow.style.padding = 0;


	var pwMessTableImageCell = document.createElement('td');
	pwMessTableImageCell.style.padding = 0;
	pwMessTableImageCell.style.width = "75px";
	
	
	var pwMessTableImage = document.createElement('img');
	pwMessTableImage.id = "pleaseWaitImage";
	pwMessTableImage.src = "http://www.conquerclub.com/static/loading.gif";
	pwMessTableImage.style.paddingRight = "2px";

	var pwMessTableCell = document.createElement('span');
	pwMessTableCell.id = "pleaseWaitMessage";
	pwMessTableCell.style.padding = 0;


	var pwTd3Row2 = document.createElement('td');
	pwTd3Row2.style.backgroundColor = backColour;
	pwTd3Row2.style.opacity = opacity;
	pwTd3Row2.style.width = "25%";


	var pwRow3 = document.createElement('tr');
	pwRow3.style.height = "100%";
	pwRow3.style.verticalAlign=  "top";


	var pwTdRow3 = document.createElement('td');
	pwTdRow3.style.backgroundColor = backColour;
	pwTdRow3.style.opacity = opacity;
	pwTdRow3.colSpan = '3';

	pwRow1.appendChild(pwTdRow1);

	pwTd2Row2.appendChild(pwMessageTable);

	pwMessTableImageCell.appendChild(pwMessTableImage);
	pwMessTableImageCell.appendChild(pwMessTableCell);

	pwMessTableRow.appendChild(pwMessTableImageCell);

	pwMessageTable.appendChild(pwMessTableRow);

	pwRow2.appendChild(pwTd1Row2);
	pwRow2.appendChild(pwTd2Row2);
	pwRow2.appendChild(pwTd3Row2);

	pwRow3.appendChild(pwTdRow3);

	pwTable.appendChild(pwRow1);
	pwTable.appendChild(pwRow2);
	pwTable.appendChild(pwRow3);


	pleaseWait.appendChild(pwTable);

	return pleaseWait;
}


//-----------------------------------------------------------------------------
//  DEFAULT OPTIONS SETTINGS
//-----------------------------------------------------------------------------

// THERE IS NO POINT IN EDITING THESE: CHANGES HERE WILL HAVE NO EFFECT
// There are TWO ways to edit the settings, EASY WAY: Use the new settings menu.
// HARD WAY. Go to about:Config in FireFox and - Search for BOB.OPTIONS.
// Then Edit that value - BE CAREFULL if you get the format wrong the script will crash, 
// if you crash it and want to recover, set that option value to exactly the next 4 chars ({}) 
// this will re load the defaults below.
var DEFAULT_OPTIONS = new Object();
DEFAULT_OPTIONS['jumptomap'] = false;
DEFAULT_OPTIONS['textMapType'] = "Standard";
DEFAULT_OPTIONS['fadeMap'] = 1; // 0 = No Fade  1 = Total WhiteOut
DEFAULT_OPTIONS['MapLeft'] = 0;
DEFAULT_OPTIONS['MapTop'] = 0;
DEFAULT_OPTIONS['24hourClockFormat'] = "am/pm";
DEFAULT_OPTIONS['Clock'] = "on";
DEFAULT_OPTIONS['mapInspect'] = true;
DEFAULT_OPTIONS['confirmEnds'] = true;
DEFAULT_OPTIONS['confirmAutoAttack'] = true;
DEFAULT_OPTIONS['confirmDeploy'] = true;
DEFAULT_OPTIONS['statsMode'] = "Extended";
DEFAULT_OPTIONS['floatActions'] = "Off";
DEFAULT_OPTIONS['hideMenu'] = "Off";
DEFAULT_OPTIONS['MinimumFormWidth'] = "600";
DEFAULT_OPTIONS['ccdd'] = "On";
DEFAULT_OPTIONS['fulllog'] = "Off";
DEFAULT_OPTIONS['swapavas'] = "Off";
DEFAULT_OPTIONS['smallavas'] = "Off";
DEFAULT_OPTIONS['hidesigs'] = "Off";
DEFAULT_OPTIONS['confirm_drop'] = "Off";
DEFAULT_OPTIONS['continent_overview'] = "Off";
var startLogTime = Math.round((new Date()).getTime()/1000)
var Logging =  "";

//-------------------------------------------------------------------------
// Images as strings
//-------------------------------------------------------------------------

//var attackonlyimage = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%1E%00%00%00%19%08%06%00%00%00%265%9E%1A%00%00%00%01sRGB%00%AE%CE%1C%E9%00%00%00%04gAMA%00%00%B1%8F%0B%FCa%05%00%00%00%20cHRM%00%00z%26%00%00%80%84%00%00%FA%00%00%00%80%E8%00%00u0%00%00%EA%60%00%00%3A%98%00%00%17p%9C%BAQ%3C%00%00%00%18tEXtSoftware%00Paint.NET%20v3.22%B7%91%17%7D%00%00%00TIDATHKcd%60%60%F8%0F%C4%03%02%40%16%0F%04%1E%10K%C1%A1%3C%10%BE%1Dd%16%BF%7B%F7%EE%3F%AD1%D6%A0%A6%B5%A5%20%F3G-%06%A7%F0%D1%A0%A6E%08%8C%26%AE%D1%C4E%B3%AC5%9A%B8%066q%D1%A9q0%DA%02%A1%5B%08%D0%CD%22%94F%25%00Y%5D%E4q)%2F%DC%C8%00%00%00%00IEND%AEB%60%82";
//var bombardimage = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%1E%00%00%00%19%08%06%00%00%00%265%9E%1A%00%00%00%01sRGB%00%AE%CE%1C%E9%00%00%00%04gAMA%00%00%B1%8F%0B%FCa%05%00%00%00%20cHRM%00%00z%26%00%00%80%84%00%00%FA%00%00%00%80%E8%00%00u0%00%00%EA%60%00%00%3A%98%00%00%17p%9C%BAQ%3C%00%00%00%18tEXtSoftware%00Paint.NET%20v3.22%B7%91%17%7D%00%00%00XIDATHKcd%60%60%F8%0F%C4%03%02%40%16%0F%04%1E%10K%C1%A1%3C%10%BE%1Dd%16%BF%7B%F7%EE%3F51%8EP%C5%0CjjZ%0A2k%D4bX%D9%81%11%14%A3AMi%08%8C%26%AE%D1%C4%05%CFV%94%26%26t%FD%A3%89k4q%8D%26.%AA%B5B%06Uv%02%00%D5U*%3AT%02%D2%0C%00%00%00%00IEND%AEB%60%82";
//var bombardedimage = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%1E%00%00%00%19%08%06%00%00%00%265%9E%1A%00%00%00%01sRGB%00%AE%CE%1C%E9%00%00%00%04gAMA%00%00%B1%8F%0B%FCa%05%00%00%00%20cHRM%00%00z%26%00%00%80%84%00%00%FA%00%00%00%80%E8%00%00u0%00%00%EA%60%00%00%3A%98%00%00%17p%9C%BAQ%3C%00%00%00%18tEXtSoftware%00Paint.NET%20v3.22%B7%91%17%7D%00%00%00gIDATHKcd%60%60%F8%0F%C4(%E0%DD%BBw%E8B%14%F1%85%84%84%B0%EA%07Y%8C%82%81%16%FF%A7%26F7%1F%E6%D9Q%8B%A9%1A%CC%A0(%1B%0D%EA%D1%C4%05O%04%D4%CC%C3%A3%89%0B)k%A1%16%97%20%89%D1%A0%A64%04FK%AE%D1%92k%E0K.%1C%A9%10W%BDJ%AE8f%012j1%8DB%60%60%82%1A%00%E5%E3%F5cK%EA~%D4%00%00%00%00IEND%AEB%60%82";
//var defendonlyimage = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%1E%00%00%00%19%08%06%00%00%00%265%9E%1A%00%00%00%01sRGB%00%AE%CE%1C%E9%00%00%00%04gAMA%00%00%B1%8F%0B%FCa%05%00%00%00%20cHRM%00%00z%26%00%00%80%84%00%00%FA%00%00%00%80%E8%00%00u0%00%00%EA%60%00%00%3A%98%00%00%17p%9C%BAQ%3C%00%00%00%18tEXtSoftware%00Paint.NET%20v3.22%B7%91%17%7D%00%00%00NIDATHKcd%60%60%F8%0F%C4%03%02%40%16%0F%04%1E%10K%C1%A1%3C%10%BE%1D%40%8B%DF%BD%7B%F7%9F%D6%18k%A8%D2%DAR%90%F9%A3%16%83C%604%A8i%11%02%A3%89k4q%D1%AC%E8%1CM%5C%03%9B%B8F%5EC%60%D4%C7%F4%0A%01%00%14%23%E4q_%D8%FDT%00%00%00%00IEND%AEB%60%82";
//var mutualbombimage = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%1E%00%00%00%19%08%06%00%00%00%265%9E%1A%00%00%00%01sRGB%00%AE%CE%1C%E9%00%00%00%04gAMA%00%00%B1%8F%0B%FCa%05%00%00%00%20cHRM%00%00z%26%00%00%80%84%00%00%FA%00%00%00%80%E8%00%00u0%00%00%EA%60%00%00%3A%98%00%00%17p%9C%BAQ%3C%00%00%00%18tEXtSoftware%00Paint.NET%20v3.22%B7%91%17%7D%00%00%00%5DIDATHKcd%60%60%F8%0F%C4(%E0%DD%BBw%E8B%14%F1%85%84%84%B0%EA%07Y%8C%82%81%16%FF%A7%26F7%1F%E6%D9Q%8B%A9%1A%CC%A0(%1B%0D%EA%D1%C4%05O%04%D4%CC%C3%A3%89%0B)k%A1%16%97%20%89%D1%A0%A64%04FK%AE%D1%92k%B4%E4%A2ZA2%9A%9D%064%3B%01%00%15%E0%0Ci%0C%BF%B9%F4%00%00%00%00IEND%AEB%60%82";
//var normalimage = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%1E%00%00%00%19%08%06%00%00%00%265%9E%1A%00%00%00%01sRGB%00%AE%CE%1C%E9%00%00%00%04gAMA%00%00%B1%8F%0B%FCa%05%00%00%00%20cHRM%00%00z%26%00%00%80%84%00%00%FA%00%00%00%80%E8%00%00u0%00%00%EA%60%00%00%3A%98%00%00%17p%9C%BAQ%3C%00%00%00%18tEXtSoftware%00Paint.NET%20v3.22%B7%91%17%7D%00%00%00LIDATHK%ED%96%B9%0D%000%08%C4.%FB%EF%CA%0A%E4)%D3%83%0B%0E%E9j%0B%83%10KR%9E%20u%C1D%10%E8%B3Lt%0B%82%23%22%89%88%80%5E%A6%C1m%F3%B6j%AB.3%E0%E5*S%FB%9F%E6%81%AA%E7%3D%02%EE%B8%CB%C0%06%C8%0A%B5%AE%09G%D2%BC%00%00%00%00IEND%AEB%60%82";
//var safeimage = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%1E%00%00%00%19%08%06%00%00%00%265%9E%1A%00%00%00%01sRGB%00%AE%CE%1C%E9%00%00%00%04gAMA%00%00%B1%8F%0B%FCa%05%00%00%00%20cHRM%00%00z%26%00%00%80%84%00%00%FA%00%00%00%80%E8%00%00u0%00%00%EA%60%00%00%3A%98%00%00%17p%9C%BAQ%3C%00%00%00%18tEXtSoftware%00Paint.NET%20v3.22%B7%91%17%7D%00%00%00%5EIDATHKcd%60%60%F8%0F%C4%03%02%40%16%0F%04%1E%10K%C1%A1%3C%10%BE%1Dd%16%BF%7B%F7%EE%3F51%8EP%C5%0CjjZ%0A2k%D4bX%D9%81%11%14%A3AMi%08%8C%26%AE%D1%C4%05%CFV%94%26%26t%FD%A3%89k%F0%25.%3A5%0EF%5B%20t%0B%01%BAY%84R%FD%02%00%A5g%13CokP%E0%00%00%00%00IEND%AEB%60%82";

//var attackonlyimage = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%14%00%00%00%12%08%06%00%00%00%5B%D0%FE%10%00%00%00%01sRGB%00%AE%CE%1C%E9%00%00%00%04gAMA%00%00%B1%8F%0B%FCa%05%00%00%00%20cHRM%00%00z%26%00%00%80%84%00%00%FA%00%00%00%80%E8%00%00u0%00%00%EA%60%00%00%3A%98%00%00%17p%9C%BAQ%3C%00%00%00%18tEXtSoftware%00Paint.NET%20v3.22%B7%91%17%7D%00%00%00YIDAT8Ocd%60%60%F8%0F%C4T%05%20%03%A9%89%A9j%18%D8%B7%04%5D%C7%CE%CE%FE%9F%9B%9B%9B%A0%3A%B0Y%92%92%92p%85lll%FF%DF%BD%7BG%11%C6p%E1%F3%E7%CF%A9k%20%D5%5D8j%20%C9%11%84%11%CB%230%0C%89%C9%8A%04%D4%10%CE%CB%24Z2%C8%0D%04%00%FDK%12%98%26%AC%E3%C2%00%00%00%00IEND%AEB%60%82";
//var defendonlyimage = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%14%00%00%00%12%08%06%00%00%00%5B%D0%FE%10%00%00%00%01sRGB%00%AE%CE%1C%E9%00%00%00%04gAMA%00%00%B1%8F%0B%FCa%05%00%00%00%20cHRM%00%00z%26%00%00%80%84%00%00%FA%00%00%00%80%E8%00%00u0%00%00%EA%60%00%00%3A%98%00%00%17p%9C%BAQ%3C%00%00%00%18tEXtSoftware%00Paint.NET%20v3.22%B7%91%17%7D%00%00%00JIDAT8Ocd%60%60%F8%0F%C4T%05%20%03%A9%89%A9j%18%D8%B7%04%5D%C7%CE%CE%FE%9F%9B%9B%9B%A0%3A%B0Y%EF%DE%BD%FBO%09%C6p%10%25%86%81%F4%8E%1A8%1A)d%A4I%DA'%1Bb%B2%1E%89j%08%E7%E5%E1e%20%00%9Dc%12P%26%DA%9E(%00%00%00%00IEND%AEB%60%82";

var attackonlyimage = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%14%00%00%00%12%08%06%00%00%00%5B%D0%FE%10%00%00%00%04gAMA%00%00%B1%8F%0B%FCa%05%00%00%00%18tEXtSoftware%00Paint.NET%20v3.22%B7%91%17%7D%00%00%00SIDAT8Ocd%60%60%F8%0F%C4%14%83w%EF%DE1%C2%0C%01%19H1%06%1A%C8%00%C2%20%40%B1a%203%B0%1A%08%14%04I%90%8B!.%94%94%94%84%BB%90%02%C3h%E8B%E40%1Cu!%A9%B1%8D%99%0EG%C3p%10%86!%25%05%05%7DJ%1Bj%B8%10%00%F6%99%89%EE%AE%84%9A%9C%00%00%00%00IEND%AEB%60%82";
var bombardedimage = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%14%00%00%00%12%08%06%00%00%00%5B%D0%FE%10%00%00%00%04gAMA%00%00%B1%8F%0B%FCa%05%00%00%00%18tEXtSoftware%00Paint.NET%20v3.22%B7%91%17%7D%00%00%00%5BIDAT8Ocd%60%60%F8%0F%C4%60%F0%EE%DD%3B%18%93(ZHH%08%AE%EE%FF%FF%FF%8C0%0E%C8%400%06%1AH%12%86%E9%03%D1%40%00%22%C0f%8E%1AH%7C8%8E%86%E1h%B2%19%99Y%0F9%E5%93%CA%C6Z%DA%90j%08%C1%AC%C7%C2%C2%F2%9F%9D%9D%1D%5E%9C%91b%01%CC%85%00%16%23rE%C7(%B7)%00%00%00%00IEND%AEB%60%82";
var bombardimage = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%14%00%00%00%12%08%06%00%00%00%5B%D0%FE%10%00%00%00%04gAMA%00%00%B1%8F%0B%FCa%05%00%00%00%18tEXtSoftware%00Paint.NET%20v3.22%B7%91%17%7D%00%00%00IIDAT8Ocd%60%60%F8%0F%C4%14%83%FF%FF%FF3%C2%0C%01%19H1%06%1A%C8%00%C2%20%40%B1a%203%B0%1A%F8%EE%DD%BB%FF%A4%60d%C7%8C%1A%08%89%18R%C2%0F%A4v4%0C1%13%F6h%18%12LF%A3%C9%06%9Cl%00x%E0%90%9C%EB%B7%F2%06%00%00%00%00IEND%AEB%60%82";
var defendonlyimage = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%14%00%00%00%12%08%06%00%00%00%5B%D0%FE%10%00%00%00%04gAMA%00%00%B1%8F%0B%FCa%05%00%00%00%18tEXtSoftware%00Paint.NET%20v3.22%B7%91%17%7D%00%00%00JIDAT8O%ED%94%C1%0A%000%08B%ED%FF%FF%B5_p%C9%D8%D8%B9%DA-%C1c%8F%10%D1%000%5C%16I%3B%10%01%CB%0E%20d%A9%0C%13%E3%02%DD%9DY%BF%CF%0C0%97%E3d%B8%8B%9D%ED%A0%EE%26%C3O%E3%D0%BE6%DD%C0%05%90%82%90%9C%E5%9D%92.%00%00%00%00IEND%AEB%60%82";
var mutualbombimage = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%14%00%00%00%12%08%06%00%00%00%5B%D0%FE%10%00%00%00%04gAMA%00%00%B1%8F%0B%FCa%05%00%00%00%18tEXtSoftware%00Paint.NET%20v3.22%B7%91%17%7D%00%00%00IIDAT8Ocd%60%60%F8%0F%C4%60%F0%EE%DD%3B%18%93(ZHH%08%AE%EE%FF%FF%FF%8C0%0E%C8%400%06%1AH%12%86%E9%03%D1%40%00%22%C0f%8E%1AH%7C8%8E%86!E%C9%E6%3D(%CD%8E%86%E1h%18%0E%D6%E2%0B%00%3C%03%D6l4%B8H%5D%00%00%00%00IEND%AEB%60%82";
var normalimage = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%14%00%00%00%12%08%06%00%00%00%5B%D0%FE%10%00%00%00%04gAMA%00%00%B1%8F%0B%FCa%05%00%00%00%18tEXtSoftware%00Paint.NET%20v3.22%B7%91%17%7D%00%00%00NIDAT8Ocd%60%60%F8%0F%C4%14%83w%EF%DE1%C2%0C%01%19H1%06%1A%C8%00%C2%20%40%8Aa%E7%A1%EA%EF%A3%EB%83%1B%08d%FC%A7%12%86%B8%90J%86%81%1C5j%20%E5%913%1A%86%23'%0CI%2C%1Cp%16%24%E4%966%F47%10%00%AB%88%ED%BB%03%F0'%AC%00%00%00%00IEND%AEB%60%82";
var safeimage = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%14%00%00%00%12%08%06%00%00%00%5B%D0%FE%10%00%00%00%04gAMA%00%00%B1%8F%0B%FCa%05%00%00%00%18tEXtSoftware%00Paint.NET%20v3.22%B7%91%17%7D%00%00%00PIDAT8Ocd%60%60%F8%0F%C4%14%83%FF%FF%FF3%C2%0C%01%19H1%06%1A%C8%00%C2%20%40%B1a%203%B0%1A%F8%EE%DD%BB%FF%A4%60d%C7%8C%1A%08%89%18R%C2%0F%A4v4%0C1%13%F6h%18%12LF%04%93%0D%25%05%05%7DJ%1Bj%B8%10%00%0A%D1%2C4%3D%FCt%15%00%00%00%00IEND%AEB%60%82";

//-------------------------------------------------------------------------
//    OBJECTS
//-------------------------------------------------------------------------

    //Reinforcements Object
    function Reinforcement(lower, upper, divisor)
    {
    	this._lower = lower;
    	this._upper = upper;
    	this._divisor = divisor;
    }

    //Player Class
    function Player( name, pid, color ){
        this._name = name;
        this._pid = pid;
        this._color = color;
        this._cards = 0;
        this._armies = 0;
        this._countries = 0;
				this._calculatedCountries = 0;
        this._continentBonus = 0;
        this._territoryBonus = 0;
				this._lastBonus = 0;
				this._lastBonusFixed = false;
				this._points = 0;
				this._deferred = 0;
        this._skipped = 0;
        this._total_skipped = 0;
        this._continents = new Array();
        this.toString = function() { return  this._name; }
				this.getArmiesPerTurn = function()
				{
				}
        this.getTurninP = function() { if( this._cards < 3 ) return 0; if( this._cards > 4 ) return 1; if( this._cards == 3 ) return 0.3341; return 0.778; }
        this.alert = function() {
            alert(    "Name:\t"            +    this._name        +
                    "\nPID:\t"            +    this._pid        +
                    "\nCards:\t"        +    this._cards        +
                    "\nArmies:\t"        +    this._armies    +
                    "\nCountries:\t"    +    this._countries +
                    "\nArmies/Turn:\t"  +    this.getArmiesPerTurn()
            );
        }
        this.killToReduce = function() { 
            if( this._countries < 12 ) return "-"; 
            var rem = (this._countries/3 - Math.floor(this._countries/3));    
            return (rem==0)?"*": ( rem < 0.5 ? "**" : "***") ; 
            }
        this.calcKillToReduce = function() { 
            if( this._calculatedCountries < 12 ) return "-"; 
            var rem = (this._calculatedCountries/3 - Math.floor(this._calculatedCountries/3));    
            return (rem==0)?"*": ( rem < 0.5 ? "**" : "***") ; 
            }
    this.ContinentsDisplay = function ContinentsDisplay() 
    {
        var ret = "";
        var contSum = new Array();
        var flashList = new Array();
        for (var cntn  in this._continents) 
        {
            var ctn = continentsArray[this._continents[cntn]];
            if (typeof(contSum[ctn._name])=="undefined")
                {
                    contSum[ctn._name] =  ctn._bonus;
                    flashList[ctn._name] =  ctn._realName;
                }
                else 
                {
                    contSum[ctn._name] += ctn._bonus;
                    flashList[ctn._name] +=  "|" + ctn._realName;
                }
            
        }
        for (var cntnn  in contSum ) 
        {

            ret += '<span class="JumpClick" title="' + flashList[cntnn] + '">' + cntnn.replace(" ","&nbsp;") + "&nbsp(" + contSum[cntnn] + ") </span>";
        }
        var contSum = new Array();
        var flashList = new Array();
        for (country in countriesArray) 
        {
		var cnt = countriesArray[country];

		if ((cnt._bonus!=0) && (cnt._pid == this._pid))
		{
			if (typeof(contSum[cnt._name])=="undefined")
                	{
                    		contSum[cnt._name] =  cnt._bonus;
                    		flashList[cnt._name] =  cnt._name;
                	}
			else 
			{
				contSum[cnt._name] += cnt._bonus;
				flashList[cnt._name] +=  "," + cnt._name;
			}
		}
        }
        for (var cntnn  in contSum ) 
        {
            ret += '<span class="clickJump" title="' + flashList[cntnn] + '">' + cntnn.replace(" ","&nbsp;") + "&nbsp[" + contSum[cntnn] + "] </span>";
        }
        return ret;

    }
    }
    
    // Country Class
    function Country (name,pid,armies) {
        this._name = name;
        this._pid = pid;
        this._armies = armies;
        this.toString = function() { return this._name; }
        this._borders = new Array();
        this._DefendBorders = new Array();
        this._bombards = new Array();
        this._bombardedBy = new Array();
        this._inContenent = false;
				this._bonus = 0;
				this._killer = false;
				this._neutral = 0;
        this._smallxPos = 0;
        this._smallyPos = 0;
        this._largexPos = 0;
        this._largeyPos = 0;
        this.isSafe = function () {
            var howSafe = 2;
           
            for (var k =0; k < this._borders.length && howSafe > 0; k++){
                var bb = countriesArray[this._borders[k]];
                if (bb._pid != this._pid) {
                    // it's not mine
                    howSafe = 1
                    if (teamNumber(bb._pid) != teamNumber(this._pid)) {
                        // And it's not team
                        howSafe = 0
                        
                    }
                }
            }
            for (var k =0; k < this._DefendBorders.length && howSafe > 0; k++){
                var bb = countriesArray[this._DefendBorders[k]];
                if (bb._pid != this._pid) {
                    // it's not mine
                    howSafe = 1
                    if (teamNumber(bb._pid) != teamNumber(this._pid)) {
                        // And it's not team
                        howSafe = 0
                        
                    }
                }
            }
            for (var k =0; k < this._bombardedBy.length && howSafe > 0; k++){
                var bb = countriesArray[this._bombardedBy[k]];
                if (bb._pid != this._pid) {
                    // it's not mine
                    howSafe = 1
                    if (teamNumber(bb._pid) != teamNumber(this._pid)) {
                        // And it's not team
                        howSafe = 0
                        
                    }
                }
            }
            return howSafe;
        }
        this.textMap = function () { 
            var txtMapHtml2 = "";
            var txtMapHtmlA = "";
            var txtMapHtmlD = "";
            var txtMapHtmlC = "";
            var txtMapHtmlE = "";
            var txtMapHtmlF = "";
            var txtMapHtmlG = "";
            var aAttack = new Array();
            var aDefend = new Array();
            var aBombard = new Array();
            var aBombarded = new Array();
            
            for (var k =0; k < this._borders.length; k++){
                var bb = countriesArray[this._borders[k]];
                aAttack[bb._name] = bb;
            }
            for (var k =0; k < this._DefendBorders.length; k++){
                var bb = countriesArray[this._DefendBorders[k]];
                aDefend[bb._name] = bb;
            }
                
            for (var k =0; k < this._bombards.length; k++){
                var bb = countriesArray[this._bombards[k]];
                aBombard[bb._name] = bb;
            }
            for (var k =0; k < this._bombardedBy.length; k++){
                var bb = countriesArray[this._bombardedBy[k]];
                aBombarded[bb._name] = bb;
            }

            txtMapHtml2 += this.displayString(); 

                    for (var k =0; k < this._borders.length; k++){
                        var bb = countriesArray[this._borders[k]];
                         if (typeof(aDefend[bb._name])=="undefined"){
                                txtMapHtmlA +=  bb.displayString();
                            }
                            else
                            {
                                txtMapHtmlC +=  bb.displayString();
                            }
                    }
                    
                    for (var k =0; k < this._DefendBorders.length; k++)
		    						{
                        var bb = countriesArray[this._DefendBorders[k]];
                        
                        if (typeof(aAttack[bb._name])=="undefined")
												{
                                txtMapHtmlD += bb.displayString();
                        }
                    }


										for (var bombard in  this._bombards) 
										{
														var bb = countriesArray[this._bombards[bombard]];
														var b = this._bombards[bombard].makeID();

														if (typeof(aBombarded[bb._name])=="undefined")
														{
			                        txtMapHtmlE += bb.displayString();
														}
														else
														{
			                        txtMapHtmlG += bb.displayString();
														}
										}
										for (var bombard in  this._bombardedBy) 
										{
														var bb = countriesArray[this._bombardedBy[bombard]];
														var b = this._bombardedBy[bombard].makeID();
														if (typeof(aBombard[bb._name])=="undefined")
														{
			                        txtMapHtmlF += bb.displayString();
														}
														// don't need else as if will have been done by the bombard loop.
										}

                    if (txtMapHtmlC != "") 
		   							{
                       	txtMapHtml2 += '<br><img class="attackhovers" src='+normalimage+'>';
                        txtMapHtml2 += '<span> Borders </span>';
                        txtMapHtml2 += '[ ' + txtMapHtmlC + ' ]';
                    }
                    if (txtMapHtmlA != "") 
		    						{
                       	txtMapHtml2 += '<br><img class="attackhovers" src='+attackonlyimage+'>';
                        txtMapHtml2 += '<span> Attacks </span>';
												txtMapHtml2 += '[ ' + txtMapHtmlA + ' ]'

                    }
                    if (txtMapHtmlD != "") 
		    						{
                       	txtMapHtml2 += '<br><img class="attackhovers" src='+defendonlyimage+'>';
                        txtMapHtml2 += '<span> Attacked By </span>';
												txtMapHtml2 += '[ ' + txtMapHtmlD + ' ]'
										}
                    if (txtMapHtmlE != "") 
		    						{
                       	txtMapHtml2 += '<br><img class="attackhovers" src='+bombardimage+'>';
                        txtMapHtml2 += '<span> Bombards </span>';
												txtMapHtml2 += '[ ' + txtMapHtmlE + ' ]';
                    }
                    if (txtMapHtmlF != "") 
		    						{
                       	txtMapHtml2 += '<br><img class="attackhovers" src='+bombardedimage+'>';
                        txtMapHtml2 += '<span> Bombarded by </span>';
												txtMapHtml2 += '[ ' + txtMapHtmlF + ' ]';
                    }
                    if (txtMapHtmlG != "") 
		    						{
                       	txtMapHtml2 += '<br><img class="attackhovers" src='+mutualbombimage+'>';
                        txtMapHtml2 += '<span> Mutual Bombardment </span>';
												txtMapHtml2 += '[ ' + txtMapHtmlG + ' ]';
                    }
                    
                    
                return  txtMapHtml2;
         }
         this.displayString = function () 
				 {
						var pid = this._pid;
					 	if (pid == UID)
								pid = NID;
						result = '<span class="playerBG' + pid + '"><span class="clickJump" title="' + this._name + '">'  + replaceSpace(this._name) + '&nbsp;(' +  this._armies + ')';
						if (this._bonus != 0)
								result += '&nbsp;['+this._bonus+']';
						result += '</span> </span>';
						return result;
         }
    }

    //Continent Class - Note all Continents now have required elements
    // If a Traditional continent - then required matches the size of the countrys array.
    function Continent (name,bonus,realname) {
        this._name = name;
        this._realName = realname;
        this._bonus = bonus;
				this._required = 0;
        this.toString = function() { return this._name; }
        this._countrys = new Array();
        this._continents = new Array();
        this._owners = new Array(); // hold the owners of this continent (note could be many more than one)
				this._overrides = new Array(); // Hold overriders for this continent.
				this._overriden = new Array(); // hold an array to match the owners to say if this is overriden or not.
				this.clearOwners = function() // clean out owners array - called before processing.
				{
					this._owners = new Array();
					this._overriden = new Array();
				}
        this.alert = function() {
            alert(    "Name:\t"            +    this._name        +
                    "\nrealName:\t"            +    this._realName        +
                    "\nBonus:\t"        +    this._bonus        +
                    "\nRequired:\t"        +    this._required        +
                    "\nCountries:\t"    +    this._countrys +
                    "\nOverrides:\t"    +    this._overrides +
                    "\nOwners:\t"  +    this._owners +
                    "\nOverriden:\t"    +    this._overriden);
        }
				this.displayString = function () 
				{
						var result = "";
						for (i in this._owners)
						{
							for (name in playersArray)
							{
								var pid = this._owners[i]
								if (playersArray[name]._pid == pid) 
								{
									if (!this._overriden[i])
									{
											result += '<span class="playerBG' + pid + '"><span class="hovermap" title="' + this._realName + '">'  + replaceSpace(this._name) + '&nbsp;';
											if (this._bonus != 0)
														result += '&nbsp;['+this._bonus+']';
											result += '</span></span>';
									}
								}
							}
						}
						if (this._owners.length<1)
						{
								var pid = NID;
								result += '<span class="playerBG' + pid + '"><span class="hovermap" title="' + this._realName + '">'  + replaceSpace(this._name) + '&nbsp;';
								if (this._bonus != 0)
										result += '&nbsp;['+this._bonus+']';
								result += '</span></span>';
						}


					

					return result;
        }
    }

	function objective (name, realname)
	{
		this._name = name;
		this._realname = realname;
		this._countrys = new Array();
	        this._continents = new Array();
		this._required = 0;
	        this._owners = new Array(); // hold the owners of this objective (note could be many more than one)
		this.clearOwners = function() // clean out owners array - called before processing.
			{
				this._owners = new Array();
			}
	}


//-------------------------------------------------------------------------
//    FUNCTIONS
//-------------------------------------------------------------------------


// Aerial Attacks Drop Game Confirmations. (Modified to be able to be turned off!)
// function to add Drop Game confirmation event listeners to the drop game URL click event
function addConfirmDropGameClickHandlers()
{
			var arrFinderOptions = document.getElementById('middleColumn').getElementsByTagName("a");
			var txtAnchorURL = "";
			for( i in arrFinderOptions )
			{
						txtAnchorURL = new String(arrFinderOptions[i].href);
						if(txtAnchorURL.indexOf("submit=Drop") != -1 )
						{
									var arrGameNoIndex = txtAnchorURL.split("=");
									if (myOptions["confirm_drop"]=="On")
									{
											if (!txtAnchorURL.indexOf("confirm")>=0) // ensure we don't need to run again!
											{
													var intGameNo = arrGameNoIndex[2]; // sub 0 is URL, sub 1 is submit type of Drop, sub 2 is game #
													arrFinderOptions[i].href = "javascript: if (confirm('Drop Game #" + intGameNo + "?')) { window.location.href='" + txtAnchorURL + "' } else { void('') };";
											}
									}
									else
									{
											if (txtAnchorURL.indexOf("confirm")>=0) // ensure we need to turn this off.
											{
													var intGameNo = arrGameNoIndex[3]; // sub 0 is URL, sub 1 is submit type of Drop, sub 2 is game #
													intGameNo = intGameNo.substring(0,intGameNo.indexOf("'"));
													arrFinderOptions[i].href = "http://www.conquerclub.com/player.php?submit=Drop&game="+intGameNo;
											}
									}
						}
			}
} 

function showMoreTextMap()
{
				var sml = document.getElementById('showMoreLink')
				if (sml.innerHTML=="fixed text map")
				{
								textMap.style.height="";
								textMap.style.overflowY = "hidden";
								textMap.style.overflowX = "hidden";
								sml.innerHTML = "scrollable text map";
				}
				else
				{
								if (textMap.clientHeight>=200)
								{
												textMap.style.height="200px";
												textMap.style.overflowY = "auto";
												textMap.style.overflowX = "hidden";
												sml.innerHTML = "fixed text map";
								}
								else
								{
												sml.parentNode.style.display = "none";
								}
				}
				updateMenuHiderHeight();
}

function showMoreStats()
{
				var sml = document.getElementById('showMoreStatsLink')
				if (sml.innerHTML=="fixed statistics")
				{
								statsbody = document.getElementById("statsbody");
								statsbody.style.height="";
								statsbody.style.overflowY = "hidden";
								statsbody.style.overflowX = "hidden";
								sml.innerHTML = "scrollable statistics";
				}
				else
				{
								if (stats.clientHeight>=200)
								{
												statsbody = document.getElementById("statsbody");
												statsbody.style.overflowY = "auto";
												statsbody.style.height="200px";
												statsbody.style.overflowX = "hidden";
												sml.innerHTML = "fixed statistics";
								}
				}
				updateMenuHiderHeight();
}


function replaceSpace(text)
{
	var newText="";

	for (var i=0;i<text.length;i++)
	{
		if (text[i]==' ')
			newText += "&nbsp;";
		else
			newText += text[i];
	}
	return newText;
}

function deserialize(name, def) 
{
  return eval(GM_getValue(name, (def || '({})')));
}

function serialize(name, val) 
{
  GM_setValue(name, uneval(val));
}

function upgrade(o,name) 
{
    // Copies a default option if there is a missing option.
    if (typeof(o[name]) == "undefined") {
        o[name] = DEFAULT_OPTIONS[name];
    }
     
}
// Load Options 
var myOptions = (deserialize("OPTIONS", DEFAULT_OPTIONS))
if (typeof(myOptions) == "undefined") 
{
    // poor editing in the about:config page
    myOptions = new Object();
}

// LIST ALL OPTIONS HERE 
// This part will handle options MISSING from the config section
upgrade(myOptions,'jumptomap');

upgrade(myOptions,'fadeMap');
upgrade(myOptions,'MapLeft');
upgrade(myOptions,'MapTop');
upgrade(myOptions,'mapInspect');
upgrade(myOptions,'confirmEnds');
upgrade(myOptions,'statsMode');
upgrade(myOptions,'floatActions');
upgrade(myOptions,'hideMenu');
upgrade(myOptions,'MinimumFormWidth');
upgrade(myOptions,'ccdd');
upgrade(myOptions,'fulllog');
upgrade(myOptions,'swapavas');
upgrade(myOptions,'smallavas');
upgrade(myOptions,'clock');
upgrade(myOptions,'hidesigs');
upgrade(myOptions,'confirm_drop');
upgrade(myOptions,'continent_overview');

// REPLACED OPTIONS.
if (typeof(myOptions["showEstimatedArmies"]) != "undefined") {
    delete myOptions["showEstimatedArmies"];
}
if (typeof(myOptions["focuscolor"]) != "undefined") {
    delete myOptions["focuscolor"];
}
if (typeof(myOptions["hoverHighlight"]) != "undefined") {
    myOptions["mapInspect"] = myOptions["hoverHighlight"];
    delete myOptions["hoverHighlight"];
}
if (typeof(myOptions["mapInspect"]) != "undefined") {
    if (myOptions["mapInspect"] == "Standard" || myOptions["mapInspect"] == "Extended")
    		myOptions["mapInspect"]=true;
    else if (myOptions["mapInspect"] == "Off")
    		myOptions["mapInspect"]=false;
}

// TEXT MAP TYPE
    if (typeof(myOptions["textMapType"]) == "undefined") {
        // textMapType = new option
        if (typeof(myOptions["textMap"]) != "undefined") {
            // we have an option to upgrade.
            if (myOptions["textMap"]) {
                myOptions["textMapType"] = "Extended";
                alert ("This version of the script changes the text map option - there are now two varaitons large and small, you have been upgraded to the large setting which is the same as the previous version");
            }
            else 
            {
                myOptions["textMapType"] = "Off";
            }
            delete myOptions["textMap"];
        }
        else
        {
            upgrade(myOptions,'textMapType');
        }
    }
// CLOCK FORMAT
 if (typeof(myOptions["24hourClockFormat"]) == "undefined") {
  // 24hourClockFormat = new option
        if (typeof(myOptions["24hourClock"]) != "undefined") {
            // we have an option to upgrade.
            if (myOptions["24hourClock"]) {
                myOptions["24hourClockFormat"] = "24h";
             }
            else 
            {
                myOptions["24hourClockFormat"] = "am/pm";
            }
            delete myOptions["24hourClock"];
        }
        else
        {
            upgrade(myOptions,'24hourClockFormat');
           
        }
}
else {
    if (myOptions["24hourClockFormat"] == "AM/PM") {
        myOptions["24hourClockFormat"] = "am/pm";
    }
}
// Confirm Actions
if (typeof(myOptions["confirmAutoAttack"]) == "undefined") {
  if (typeof(myOptions["confirmActions"]) == "undefined") {
    upgrade(myOptions,'confirmAutoAttack');
  }
  else
  {
    myOptions["confirmAutoAttack"] = myOptions["confirmActions"];
  }
}
if (typeof(myOptions["confirmDeploy"]) == "undefined") {
  if (typeof(myOptions["confirmActions"]) == "undefined") {
    upgrade(myOptions,'confirmDeploy');
  }
  else
  {
    myOptions["confirmDeploy"] = myOptions["confirmActions"];
  }
}
 if (typeof(myOptions["confirmActions"]) != "undefined") {
     delete myOptions["confirmActions"];
}
serialize("OPTIONS", myOptions);

function parseTerritory(entry)
{
	var title = entry.getElementsByTagName('name')[0].textContent.normiliseSpaces();
	var pid = parseInt( armiesArr[(i*2)] );
	var amrs = armiesArr[(i*2)+1];
	countriesArray[title] =  new Country (title,pid,amrs);
	var borders = entry.getElementsByTagName('border');

	for (var j = 0; j <borders.length; j++) 
	{
		var bb = borders[j].textContent.normiliseSpaces();

		countriesArray[title]._borders.push(bb);
	}

	countriesArray[title]._smallxPos = entry.getElementsByTagName('smallx')[0].textContent;
	countriesArray[title]._smallyPos = entry.getElementsByTagName('smally')[0].textContent;
	countriesArray[title]._largexPos = entry.getElementsByTagName('largex')[0].textContent;
	countriesArray[title]._largeyPos = entry.getElementsByTagName('largey')[0].textContent;

	bombardments = entry.getElementsByTagName('bombardment');

	for (var j = 0; j <bombardments.length; j++) 
	{
		var bb = bombardments[j].textContent.normiliseSpaces();
		countriesArray[title]._bombards.push(bb);
	}

	var bonusElements = entry.getElementsByTagName('bonus');
	if (bonusElements.length>0)
	{
		var bonus = bonusElements[0].textContent;
		countriesArray[title]._bonus = parseInt(bonus);
	}
	var neutral = entry.getElementsByTagName('neutral');
	if (!neutral.length>0)
	{
		totalStartCountries++;
	}
	else
	{
		killer = neutral[0].getAttribute("killer");
		if (killer=="yes")
		{
			countriesArray[title]._killer=true;
			countriesArray[title]._neutral=neutral[0].textContent;
		}
	}
}

function parseContinent(entry)
{
	var title = entry.getElementsByTagName('name')[0].textContent.normiliseSpaces();
	var dedupename = 1;
	var titleRoot = title
	while (continentsArray[title]) { title = titleRoot + "_" + dedupename++ ; }
	var bonus = parseInt(entry.getElementsByTagName('bonus')[0].textContent);
	var partial = false;
	var required = 0;
	var requiredEl = entry.getElementsByTagName('required');
	if (requiredEl.length>0) // Partial continent - hold required value from XML
	{
		required = parseInt(requiredEl[0].textContent);
		partial = true;
	}

	continentsArray[title] = new Continent(titleRoot,bonus,title);
	var countries = entry.getElementsByTagName('territory');
	for (var j = 0; j <countries.length; j++) 
	{
		var bb = countries[j].textContent.normiliseSpaces();
		continentsArray[title]._countrys.push(bb);
		if (!partial) // Traditional continent we will need to capture how many components there are.
			required++;
	}
	var continents = entry.getElementsByTagName('continent');
	for (var j = 0; j <continents.length; j++) 
	{
		var bb = continents[j].textContent.normiliseSpaces();
		continentsArray[title]._continents.push(bb); 
		if (!partial) // Traditional continent we will need to capture how many components there are.
			required++;
	}
	continentsArray[title]._required = required;
	var overrides = entry.getElementsByTagName('override');
	for (var j = 0; j <overrides.length; j++) 
	{
		var bb = overrides[j].textContent.normiliseSpaces();
		continentsArray[title]._overrides.push(bb); 
	}
}

function parseObjective(entry)
{
	title = entry.getElementsByTagName('name')[0].textContent.normiliseSpaces();
	var dedupename = 1;
	var titleRoot = title
	while (objectivesArray[title]) { title = titleRoot + "_" + dedupename++ ; }
	objectivesArray[title] =  new objective(titleRoot,title);
	var countries = entry.getElementsByTagName('territory');
	for (var j = 0; j <countries.length; j++) 
	{
		var bb = countries[j].textContent.normiliseSpaces();
		objectivesArray[title]._countrys.push(bb); 
		objectivesArray[title]._required++; 
	}
	var continents = entry.getElementsByTagName('continent');
	for (var j = 0; j <continents.length; j++) 
	{
		var bb = continents[j].textContent.normiliseSpaces();
		objectivesArray[title]._continents.push(bb); 
		objectivesArray[title]._required++; 
	}
}

function showKillers()
{
	var ret="";

        var contSum = new Array();
        var flashList = new Array();
        for (country in countriesArray) 
        {
		var cnt = countriesArray[country];

		if (cnt._killer)
		{
			if (typeof(contSum[cnt._name])=="undefined")
                	{
                    		contSum[cnt._name] =  cnt._neutral;
                    		flashList[cnt._name] =  cnt._name;
                	}
			else 
			{
				contSum[cnt._name] += cnt._neutral;
				flashList[cnt._name] +=  "," + cnt._name;
			}
		}
        }
        for (var cntnn  in contSum ) 
        {
            ret += '<span class="clickJump" title="' + flashList[cntnn] + '">' + cntnn.replace(" ","&nbsp;") + "&nbsp[" + contSum[cntnn] + "] </span>";
        }
        return ret;
}

function reinitClock()
{
	var response = unsafeWindow.request.responseText
	if (response)
	{
		response = response.split("&");
		timeStr = response[3];
		if (timeStr.indexOf("span")>-1) // if countdown alert here then strip it out before continuing
		{
			timeStr = timeStr.substring(30,(timeStr.length-7));
		}
		time = timeStr.split("\n");

	/*        hours1 = parseInt(time[0]);
		minutes1 = parseInt(time[1]);
		seconds1 = parseInt(time[2]);*/
		//Yowsers clock fix
		hours1 = parseInt(time[0],10);
		minutes1 = parseInt(time[1],10);
		seconds1 = parseInt(time[2],10); 
	}
	if (!clockInterval || clockInterval=="")
		clockInterval = window.setInterval(countDown,1000);
}

function getCardType()
{
    var dash = dashboard.innerHTML
    if( dash.indexOf("Escalating") > -1 )
        m_bonusCards = eBonusCards.ESCALATING;
    else if( dash.indexOf("Flat Rate") > -1 )
        m_bonusCards = eBonusCards.FLATRATE;
    else 
        m_bonusCards = eBonusCards.NOCARDS;
}

function recalcRedemption()
{
	RedemptionValue = calcRedemption();
	if(m_bonusCards == eBonusCards.ESCALATING)
		redemption.innerHTML = "<table><tr><td colspan=2>Next Redemption Value is <b>" + RedemptionValue +".</b></td></tr></table>";
	else if(m_bonusCards == eBonusCards.FLATRATE)
		redemption.innerHTML = "<table><tr><td colspan=2><font color=red><b>Red:</b></font> 4&nbsp;<font color=green><b>Green:</b></font> 6&nbsp;<font color=blue><b>Blue:</b></font> 8&nbsp;<b>Mixed:</b> 10</td></tr></table>";
	else 
		redemption.innerHTML = "";
}


function updatePlayerCards()
{
    //    --- Get Player Card Counts ---
    var tmp2 = getElementsByClassName(rightside,"li","status");    
    for ( i in tmp2 ) 
    {
        var indx = tmp2[i].innerHTML.has("Assassin Target") ? 2:1;
        var tmp3 = tmp2[i].textContent.split(/\W/);
        playersArray[pIndxs[i].innerHTML]._cards=parseInt(tmp3[indx]);
    }
}

function getLeft(length)
{
	if (length==1)
		return 6;
	return 2;
}

function GET_MAPLEFT(OPTIONS,mapName) 
{
	var left = 0;
	if (typeof(OPTIONS["MapLeft:"+mapName])=="undefined") 
        {
            left = OPTIONS["MapLeft"];
        }
        else
        {
            left = OPTIONS["MapLeft:" + mapName];
        }
	if (!left)
		left = 0;
	return left;
}


function GET_MAPTOP(OPTIONS,mapName) 
{
	var top = 0;
	if (typeof(OPTIONS["MapTop:"+mapName])=="undefined") 
        {
            top = OPTIONS["MapTop"];
        }
        else
        {
            top = OPTIONS["MapTop:" + mapName];
        }
	if (!top)
		top = 0;
	return top;
}

function GET_MINFORMWIDTH(OPTIONS,mapName) 
{
	var width = 600;
	if (typeof(OPTIONS["MinimumFormWidth:"+mapName])=="undefined") 
        {
            width = OPTIONS["MinimumFormWidth"];
        }
        else
        {
            width = OPTIONS["MinimumFormWidth:" + mapName];
        }
	if (!width)
		width = 600;
	return width;
}


function SHIFT_MAGICMAP(options, name)
{
        var mm = document.getElementById("magicmap");
        left = 12 + GET_MAPLEFT(options,name);
        top = 22 + GET_MAPTOP(options,name);
	mm.style.top= top+"px";
	mm.style.left= left+"px";
}

function checkFloatDice()
{
    if (myOptions["floatActions"] == "On")
    {
	var outerRolls = document.getElementById('rolls');
	if (outerRolls)
	{
		outerRolls.style.position='fixed';
		outerRolls.style.backgroundColor="#EEEEEE";
		outerRolls.style.top=0;
		outerRolls.style.zIndex=2;
	}
	var actionForm = document.getElementById('action-form');
	if (actionForm)
	{
		var mapInspect = document.getElementById('mapinspect');
		var wrapperDiv = document.getElementById('actionWrapper');
		if (document.getElementById('from_country'))
			wrapperDiv.style.paddingTop="24px";
		else
			wrapperDiv.style.paddingTop="0px";
	}
    }
	
}

function showMapInspectDiv()
{
    var mapInspectDiv = document.getElementById('mapinspect');
    var mapInspetHTML = myOptions['mapInspect'] ? "<table><tr><td colspan=2>Map Inspect: <b><span id=hoverInfo /></b></td></tr></table>":"";
    mapInspectDiv.innerHTML = mapInspetHTML;
}


var newfilterTo = unsafeWindow.filterTo;

unsafeWindow.filterTo = 
function(selected) 
{
	newfilterTo(selected);
	colourCodeDD();
};

// code to find the country in the drop down.
function findCountry(title)
{
			var cntry = countriesArray[title.text];
			if (!cntry) // if we can't find the country - then we need to remove the brackets.
			{
				bracket = title.text.lastIndexOf("(");
				if (bracket!=-1)
				{
					title.text = title.text.substring(0,bracket); // remove stuff after the bracket so that we can find the country OK.
				}
				cntry = countriesArray[title.text];
			}
			// fix for ? mark in drop down - Massive looping problem could be involved so uncomment at your peril.
/*			if (!cntry)
			{
					var idx = title.text.indexOf('?');
					if (idx>-1)
					{
							ignoreQmarks(title, idx);
					}
			}*/
			return cntry;
}


function ignoreQmarks(title, idx)
{
			for (cnt in countriesArray)
			{
					var cnter = countriesArray[cnt];
					if (cnter._name.substring(0,idx)==title.text.substring(0,idx)) // matches first half.
					{
								title.text = cnter._name.substring(0,idx+1)+title.text.substring(idx+1);
								var idx = title.text.indexOf('?');
								if (idx>-1)
								{
										ignoreQmarks(title, idx);
								}
								if (cnter._name.substring(idx+1)==title.text.substring(idx+1)) // matches second half.
								{
										cntry = cnter;
										title.text = cnter._name;
										break;
								}
					}
			}
}


// Colour codes & Adds army counts to the Dropdown. (Note if Colour Codes is off - then sets class name back to default)
function colourCodeDD()
{
	cc_log("Color Coding the Drop downs");

//     		--- Color Code the TO drop down ---
	var tocountry = document.getElementById('to_country');
	if (tocountry) 
	{
		// We have the to drop down on Screen
		var tcopts = tocountry.options;
		for (var ttt =0 ; ttt < tcopts.length; ttt++)
		{
			var toop = tcopts[ttt];
			var cntry = findCountry(toop);
			var owner = cntry._pid;
			toop.innerHTML += " (" + cntry._armies + ")";
			if (myOptions['ccdd']=="On")
			{
				toop.className = "playerBGDD"+owner;
			}
			else
			{
				toop.className = "";
			}
		}
	}
//     		--- Color Code the from drop down ---
	var fromcountry = document.getElementById('from_country');
	if (fromcountry) 
	{
		// We have the to drop down on Screen
		var tcopts = fromcountry.options;
		for (var ttt =0 ; ttt < tcopts.length; ttt++)
		{
			var toop = tcopts[ttt];
			var cntry = findCountry(toop);
			var owner = cntry._pid;
			toop.innerHTML += " (" + cntry._armies + ")";
			if (myOptions['ccdd']=="On")
			{
				toop.className = "playerBGDD"+owner;
			}
			else
			{
				toop.className = "";
			}
		}
	}
}

function prepareMenuHider()
{
    // hide the menu to start with...
    hideMenu();

    // add events to hide the menu again. - occasionally these don't quite work so check they exist before adding events
    var centre = document.getElementById("middleColumn");
    if (centre)
    	centre.addEventListener('mouseover', hideMenu, true);
    var header = document.getElementById("masthead");
    if (header)
    	header.addEventListener('mouseover', hideMenu, true);
    var footer = document.getElementById("footer");
    if (footer)
    	footer.addEventListener('mouseover', hideMenu, true);

    // add div to show the menu.
    showDiv = document.createElement('div');
    showDiv.id="showDiv";
    showDiv.style.position = "absolute";
    showDiv.style.width = "2%";
    showDiv.style.height = document.height+"px";
    showDiv.style.left=0;
    showDiv.style.top=0;
    document.body .appendChild(showDiv);
    showDiv.addEventListener('mouseover', showMenu, true); 
}

function updateMenuHiderHeight()
{
    var showDiv = document.getElementById("showDiv");
    showDiv.style.height = document.height+"px";
}

function hideMenu()
{
	if (myOptions["hideMenu"]=="On")
	{
		hideSideBar();
	}
	else if (myOptions["hideMenu"]=="Game")
	{
		if (document.getElementById("inner-map"))
		{
			hideSideBar();
		}
	}
	else if (myOptions["hideMenu"]=="Site")
	{
		if (!document.getElementById("inner-map"))
		{
			hideSideBar();
		}
	}
	hideMapSettingsMenu();
	hideViewSettingsMenu();
	hideSnapshotsMenu();
	hideConfSettingsMenu();
	hideSiteSettingsMenu();
}

function hideSideBar()
{
	var outerMenu = document.getElementById("outerColumnContainer");
	var leftMenu = document.getElementById("leftColumn");
	if (leftMenu.innerHTML.indexOf('<span class="inbox">')==-1)
	{
		// Don't hide the menu if you have a PM!
		leftMenu.style.display = "none";
		outerMenu.style.borderLeft = "0em solid #DDEEDD";
	}
}

function showMenu()
{
	if (myOptions["hideMenu"]=="On")
	{
		showSideBar();
	}
	else if (myOptions["hideMenu"]=="Game")
	{
		if (document.getElementById("inner-map"))
		{
			showSideBar();
		}
	}
	else if (myOptions["hideMenu"]=="Site")
	{
		if (!document.getElementById("inner-map"))
		{
			showSideBar();
		}
	}
}

function showSideBar()
{
	var outerMenu = document.getElementById("outerColumnContainer");
	var leftMenu = document.getElementById("leftColumn");
	leftMenu.style.display = "inline";
	outerMenu.style.borderLeft = "14em solid #DDEEDD";
}


function setFormWidth()
{
	var width = GET_MINFORMWIDTH(myOptions,mapName);
	if (mapSize=="L")
	{
		lwidth = parseInt(largewidth,10)+5;
		if (lwidth>width)
			width = lwidth;
	}
	else
	{
		swidth = parseInt(smallwidth,10)+5;
		if (swidth>width)
			width = swidth;
	}
	var actionForm = document.getElementById('action-form');
	if (actionForm)
		actionForm.style.width=width+"px";
}

function toggleConfDrop()
{
	if (myOptions["confirm_drop"] == "Off")
	{
		myOptions["confirm_drop"] = "On";
	}
	else
	{
		myOptions["confirm_drop"] = "Off";
	}
	serialize("OPTIONS",  myOptions);
	var option = document.getElementById('menu_confirm_drop');
	option.innerHTML = "Confirm Drop: <b>" + myOptions["confirm_drop"] + '</b>';
	addConfirmDropGameClickHandlers();
}

function toggleColourCodeDD()
{
	if (myOptions["ccdd"] == "Off")
	{
		myOptions["ccdd"] = "On";
	}
	else
	{
		myOptions["ccdd"] = "Off";
	}
	serialize("OPTIONS",  myOptions);
	var option = document.getElementById('menu_colourcode_dd');
	option.innerHTML = "Colour DropDown: <b>" + myOptions["ccdd"] + '</b>';
	colourCodeDD();
}

function toggleFullLog()
{
	if (myOptions["fulllog"] == "Off")
	{
		myOptions["fulllog"] = "On";
	}
	else
	{
		myOptions["fulllog"] = "Off";
	}
	serialize("OPTIONS",  myOptions);
	var option = document.getElementById('menu_fulllog');
	option.innerHTML = "Full Log: <b>" + myOptions["fulllog"] + '</b>';
}

function toggleSwapAvas()
{
	if (myOptions["swapavas"] == "Off")
	{
		myOptions["swapavas"] = "On";
	}
	else
	{
		myOptions["swapavas"] = "Off";
	}
	serialize("OPTIONS",  myOptions);
	var option = document.getElementById('menu_swapavas');
	option.innerHTML = "Swap Avatars: <b>" + myOptions["swapavas"] + '</b>';
	swapAvatars();
}

function toggleSmallAvas()
{
	if (myOptions["smallavas"] == "Off")
	{
		myOptions["smallavas"] = "On";
	}
	else
	{
		myOptions["smallavas"] = "Off";
	}
	serialize("OPTIONS",  myOptions);
	var option = document.getElementById('menu_smallavas');
	option.innerHTML = "Small Avatars: <b>" + myOptions["smallavas"] + '</b>';
	smallAvatars();
}

function toggleHideSigs()
{
	if (myOptions["hidesigs"] == "Off")
	{
		myOptions["hidesigs"] = "On";
	}
	else
	{
		myOptions["hidesigs"] = "Off";
	}
	serialize("OPTIONS",  myOptions);
	var option = document.getElementById('menu_hidesigs');
	option.innerHTML = "Hide Signatures: <b>" + myOptions["hidesigs"] + '</b>';
	hideSigs();
}


function showContOver()
{
	var contOverviewWrapper = document.getElementById("contOverviewWrapper");
	if (myOptions["continent_overview"] == "On")
	{
		contOverviewWrapper.style.display = "";
		if (num_players<=8) // only need to do this if players less than or equal to 8.
		{
			var h = smallheight;
			if (mapSize == "L")
				h = largeheight;
	
			rightside.style.height = h+"px";
			rightside.style.overflow = "auto";
		}
	}
	else
	{
		contOverviewWrapper.style.display = "none";
		if (num_players<=8) // only need to do this if players less than or equal to 8.
		{
			rightside.style.height="";
			rightside.style.overflow = "none";
		}
	}
}

function toggleContOver()
{
	var contOverviewWrapper = document.getElementById("contOverviewWrapper");
	if (myOptions["continent_overview"] == "Off")
	{
		myOptions["continent_overview"] = "On";
	}
	else
	{
		myOptions["continent_overview"] = "Off";
	}
	serialize("OPTIONS",  myOptions);
	var option = document.getElementById('menu_contoverview');
	option.innerHTML = "Continent Overview: <b>" + myOptions["continent_overview"] + '</b>';
	showContOver();
}


function toggleFloatingActionForm()
{
	// Code below stolen from edthemaster
	var actionForm = document.getElementById('action-form')
	if (myOptions["floatActions"] == "Off")
	{
		myOptions["floatActions"] = "On";
		showMenuOption("menu_hudWidth");
		if (actionForm)
		{
			var mapInspect = document.getElementById('mapinspect');
			actionForm.style.position='fixed';
			actionForm.style.bottom=0;
			actionForm.style.zIndex=2;
			var wrapperDiv = document.createElement('div');
			wrapperDiv.id="actionWrapper";
			if (document.getElementById('from_country'))
				wrapperDiv.style.paddingTop="24px";
			else
				wrapperDiv.style.paddingTop="0px";
			wrapperDiv.appendChild(mapInspect);
			var cards = document.getElementById('cards');
			if (cards)
			{
				cards = cards.parentNode.parentNode;
				cards.style.backgroundColor="#EEEEEE";
				wrapperDiv.appendChild(cards);
			}
			actionForm.childNodes[1].appendChild(wrapperDiv);
			setFormWidth();
		}
		var outerRolls = document.getElementById('rolls');
		if (outerRolls)
		{
			outerRolls.style.position='fixed';
			outerRolls.style.backgroundColor="#EEEEEE";
			outerRolls.style.top=0;
			outerRolls.style.zIndex=2;
		}
	}
	else
	{
		myOptions["floatActions"] = "Off";
		hideMenuOption("menu_hudWidth");
		if (actionForm)
		{
			var cards = document.getElementById('cards');
			if (cards)
			{
				cards = cards.parentNode.parentNode;
				dashboard.childNodes[1].insertBefore(cards, document.getElementById('outer-rolls').parentNode);
			}

			var mapInspect = document.getElementById('mapinspect');
			dashboard.parentNode.insertBefore(mapInspect, siblings);

			actionForm.style.position='relative'
			actionForm.style.bottom=0
			actionForm.style.zIndex=2 
			actionForm.style.width="100%";
		}
		var outerRolls = document.getElementById('rolls');
		if (outerRolls)
		{
			outerRolls.style.position='relative';
			outerRolls.style.backgroundColor="#EEEEEE";
			outerRolls.style.top=0;
			outerRolls.style.zIndex=2;
		}
	}
	serialize("OPTIONS",  myOptions);
	var option = document.getElementById('menu_hud');
	option.innerHTML = "HUD: <b>" + myOptions["floatActions"] + '</b>';
	updateMenuHiderHeight();
}

function toggleTextMap() 
{
	startWaiting();
	if (myOptions["textMapType"] == "Off") 
	{
		myOptions["textMapType"] = "Standard";
	} 
	else if (myOptions["textMapType"] == "Standard") 
	{
		myOptions["textMapType"] = "Extended";
	} 
	else 
	{
		myOptions["textMapType"] = "Off";
	}
	serialize("OPTIONS",  myOptions);
	var option = document.getElementById('menu_textMap');
	option.innerHTML = "Text Map: <b>" + (myOptions["textMapType"]) + '</b>';
	setTimeout(doTextMap,100);
}

function doTextMap()
{
	updateTextmap(true);
	APPLY_TEXTMAP(myOptions);
	updateMagicMap(true);
	updateMenuHiderHeight();			
	stopWaiting();
}


function toggleJumpToMap() 
{
	myOptions["jumptomap"] = ! myOptions["jumptomap"];
	serialize("OPTIONS",  myOptions);
	var option = document.getElementById('menu_jtm');
	option.innerHTML = "Jump to Map: <b>" + (myOptions["jumptomap"] ? " On" : " Off")+ '</b>';
	if (!myOptions["jumptomap"] )
		window.location.hash="top";
	else 
		window.location.hash="map";
}

function toggleStatsMode() 
{
	if (myOptions["statsMode"] == "Off") 
	{
		myOptions["statsMode"] = "Standard";
	} 
	else if (myOptions["statsMode"] == "Standard") 
	{
		myOptions["statsMode"] = "Extended";
	} 
	else 
	{
		myOptions["statsMode"] = "Off";
	}

	serialize("OPTIONS",  myOptions);
	var option = document.getElementById('menu_stats');
	option.innerHTML = "Stats: <b> " + myOptions["statsMode"] + '</b>';
	var sml = document.getElementById('showMoreStatsLink');
	sml.innerHTML="scrollable statistics";
	APPLY_STATS(myOptions);
	updateMagicMap(false);
	updateMenuHiderHeight();
	stopWaiting();
}

function toggleMagicMap() 
{
	myOptions["mapInspect"] = ! myOptions["mapInspect"];
	serialize("OPTIONS",  myOptions);
	var option = document.getElementById('menu_mapInspect');
	option.innerHTML = "Map Inspect: <b>" + (myOptions["mapInspect"] ? " On" : " Off")+ '</b>';
	showMapInspectDiv();
	updateMagicMap(false);
	updateMenuHiderHeight();
	stopWaiting();
}

function toggleConfirmActionsAA() 
{
	myOptions["confirmAutoAttack"] = ! myOptions["confirmAutoAttack"];
	serialize("OPTIONS",  myOptions);
	var option = document.getElementById('menu_conf_attack');
	option.innerHTML = "Confirm AutoAttack: <b>" + (myOptions["confirmAutoAttack"] ? " On" : " Off")+ '</b>';
} 
function toggleConfirmActionsDeploy() 
{
	myOptions["confirmDeploy"] = ! myOptions["confirmDeploy"];
	serialize("OPTIONS",  myOptions);
	var option = document.getElementById('menu_conf_deploy');
	option.innerHTML = "Confirm Deploy: <b>" + (myOptions["confirmDeploy"] ? " On" : " Off")+ '</b>';
}    
function toggleConfirmEnds() 
{
	myOptions["confirmEnds"] = ! myOptions["confirmEnds"];
	serialize("OPTIONS",  myOptions);
	var option = document.getElementById('menu_conf_phase');
	option.innerHTML = "Confirm Phase End: <b>" + (myOptions["confirmEnds"] ? " On" : " Off")+ '</b>';
}
function toggleFadeMap() 
{
	var cur = GET_MAPFADE(myOptions,mapName);
	cur = Math.round((cur*10) - 1);
	if (cur >= 11) { cur = 1;}
	if (cur <= 0) { cur = 10;}
	myOptions["fadeMap:" + mapName] = cur/10;
	if (myOptions["fadeMap:" + mapName] == myOptions["fadeMap"])
	{
		delete myOptions["fadeMap:" + mapName];
	}
	serialize("OPTIONS",  myOptions);
	var option = document.getElementById('menu_fade');
	option.innerHTML = "Map Opacity:  <b>" + Math.round(cur*10) + '%</b>';
	APPLY_MAPFADE(myOptions,mapName);
}

function toggleFormWidth() 
{
	var cur = GET_MINFORMWIDTH(myOptions,mapName);
	cur = cur-50;
	if (cur >= 1000) { cur = 600;}
	if (cur <= 599) { cur = 1000;}
	myOptions["MinimumFormWidth:" + mapName] = cur;
	if (myOptions["MinimumFormWidth:" + mapName] == myOptions["MinimumFormWidth"])
	{
		delete myOptions["MinimumFormWidth:" + mapName];
	}
	serialize("OPTIONS",  myOptions);
	var option = document.getElementById('menu_hudWidth');
	option.innerHTML = "Min HUD Width:  <b>"+cur+'</b>';
	if (myOptions["floatActions"] == "On")
	{
		setFormWidth();
	}
}

function resetMap()
{
	var cur = 0;
	myOptions["MapLeft:" + mapName] = cur;
	if (myOptions["MapLeft:" + mapName] == myOptions["MapLeft"])
	{
		delete myOptions["MapLeft:" + mapName];
	}
	var option = document.getElementById('menu_align_left');
	option.innerHTML = "Map Align Left: <b>"+cur+' px</b>';

	myOptions["MapTop:" + mapName] = cur;
	if (myOptions["MapTop:" + mapName] == myOptions["MapTop"])
	{
		delete myOptions["MapTop:" + mapName];
	}
	option = document.getElementById('menu_align_top');
	option.innerHTML = "Map Align Top: <b>"+cur+' px</b>';
	SHIFT_MAGICMAP(myOptions,mapName);

	cur = 10;
	if (cur >= 11) { cur = 1;}
	if (cur <= 0) { cur = 10;}
	myOptions["fadeMap:" + mapName] = cur/10;
	if (myOptions["fadeMap:" + mapName] == myOptions["fadeMap"])
	{
		delete myOptions["fadeMap:" + mapName];
	}
	option = document.getElementById('menu_fade');
	option.innerHTML = "Map Opacity:  <b>" + Math.round(cur*10) + '%</b>';
	APPLY_MAPFADE(myOptions,mapName);

	serialize("OPTIONS",  myOptions);
}

function toggleMapLeft() 
{
	var cur = GET_MAPLEFT(myOptions,mapName);
	cur--;
	if (cur >= 22) { cur = -22;}
	if (cur <= -22) { cur = 22;}
	myOptions["MapLeft:" + mapName] = cur;
	if (myOptions["MapLeft:" + mapName] == myOptions["MapLeft"])
	{
		delete myOptions["MapLeft:" + mapName];
	}
	serialize("OPTIONS",  myOptions);
	var option = document.getElementById('menu_align_left');
	option.innerHTML = "Map Align Left: <b>"+cur+' px</b>';
	SHIFT_MAGICMAP(myOptions,mapName);
}

function toggleMapTop() 
{
	var cur = GET_MAPTOP(myOptions,mapName);
	cur--;
	if (cur >= 22) { cur = -22;}
	if (cur <= -22) { cur = 22;}
	myOptions["MapTop:" + mapName] = cur;
	if (myOptions["MapTop:" + mapName] == myOptions["MapTop"])
	{
		delete myOptions["MapTop:" + mapName];
	}
	serialize("OPTIONS",  myOptions);
	var option = document.getElementById('menu_align_top');
	option.innerHTML = "Map Align Top: <b>"+cur+' px</b>';
	SHIFT_MAGICMAP(myOptions,mapName);
}

function createOption(id, text, func, ul, bgcolour, before)
{
	var option1 = document.createElement ('li');
	if (before)
		ul.insertBefore(option1,before.parentNode);
	else
		ul.appendChild(option1);
	var option1a = document.createElement ('a');
	this.id = option1a.id=id;
	option1.appendChild(option1a);
	option1a.href="javascript:void(0);";
	if (bgcolour)
		option1a.style.backgroundColor = bgcolour;
	this.innerHTML = option1a.innerHTML = text;
	option1a.addEventListener("click", func, false);
}

function hideMenuOption(id)
{
	var option = document.getElementById(id);
	if (option)
	{
		option.parentNode.style.display="none";
	}
}

function showMenuOption(id)
{
	var option = document.getElementById(id);
	if (option)
		option.parentNode.style.display="block";
}

function removeMenuOption(id)
{
	var option = document.getElementById(id);
	if (option)
	{
		var parentParent = option.parentNode.parentNode;
		var parent = option.parentNode;
		parent.removeChild(option);
		parentParent.removeChild(parent);
	}
}

function showSnapshotsMenu()
{
	var option = document.getElementById("menu_takesnap");
	if (option)
	{
		if (option.parentNode.style.display=="block")
		{
			hideSnapshotsMenu();
		}
		else
		{
			showMenuOption("menu_takesnap");
			showMenuOption("menu_analyse");
			showMenuOption("menu_refresh");
			loadSnapshots();
			showMenuOption("menu_delete_snaps_game");
			showMenuOption("menu_delete_snaps_all");
		}
	}
	hideMapSettingsMenu();
	hideViewSettingsMenu();
	hideConfSettingsMenu()
}

function hideSnapshotsMenu()
{
	hideMenuOption("menu_takesnap");
	hideMenuOption("menu_analyse");
	hideMenuOption("menu_refresh");
	hideMenuOption("menu_delete_snaps_game");
	hideMenuOption("menu_delete_snaps_all");
	for (var i=0;i<snapshotsMenuLength;i++)
	{
		removeMenuOption("menu_snapshot_"+i);
	}
	snapshotsMenuLength=0;
}


function showMapSettingsMenu()
{
	var option = document.getElementById("menu_fade");
	if (option)
	{
		if (option.parentNode.style.display=="block")
		{
			hideMapSettingsMenu();
		}
		else
		{
			showMenuOption("menu_fade");
			showMenuOption("menu_align_left");
			showMenuOption("menu_align_top");
			showMenuOption("menu_map_reset");
		}
	}
	hideViewSettingsMenu();
	hideSnapshotsMenu();
	hideConfSettingsMenu()
}

function hideMapSettingsMenu()
{
	hideMenuOption("menu_fade");
	hideMenuOption("menu_align_left");
	hideMenuOption("menu_align_top");
	hideMenuOption("menu_map_reset");
}

function showViewSettingsMenu()
{
	var option = document.getElementById("menu_stats");
	if (option)
	{
		if (option.parentNode.style.display=="block")
		{
			hideViewSettingsMenu();
		}
		else
		{
			showMenuOption("menu_stats");
			showMenuOption("menu_mapInspect");
			showMenuOption("menu_textMap");
			showMenuOption("menu_contoverview");
			showMenuOption("menu_clock");
			showMenuOption("menu_clockformat");
			showMenuOption("menu_jtm");
			showMenuOption("menu_hud");
			if (myOptions["floatActions"]=="On")
				showMenuOption("menu_hudWidth");
			showMenuOption("menu_colourcode_dd");
		}
	}
	hideMapSettingsMenu();
	hideSnapshotsMenu();
	hideConfSettingsMenu()
}

function hideViewSettingsMenu()
{
	hideMenuOption("menu_stats");
	hideMenuOption("menu_mapInspect");
	hideMenuOption("menu_textMap");
	hideMenuOption("menu_contoverview");
	hideMenuOption("menu_clock");
	hideMenuOption("menu_clockformat");
	hideMenuOption("menu_jtm");
	hideMenuOption("menu_hud");
	hideMenuOption("menu_hudWidth");
	hideMenuOption("menu_colourcode_dd");
}

function showConfSettingsMenu()
{
	var option = document.getElementById("menu_conf_phase");
	if (option)
	{
		if (option.parentNode.style.display=="block")
		{
			hideConfSettingsMenu();
		}
		else
		{
			showMenuOption("menu_conf_phase");
			showMenuOption("menu_conf_attack");
			showMenuOption("menu_conf_deploy");
		}
	}
	hideMapSettingsMenu()
	hideViewSettingsMenu();
	hideSnapshotsMenu();
}

function hideConfSettingsMenu()
{
	hideMenuOption("menu_conf_phase");
	hideMenuOption("menu_conf_attack");
	hideMenuOption("menu_conf_deploy");
}

function showSiteSettingsMenu()
{
	var option = document.getElementById("menu_fulllog");
	if (option)
	{
		if (option.parentNode.style.display=="block")
		{
			hideSiteSettingsMenu();
		}
		else
		{
			showMenuOption("menu_fulllog");
			showMenuOption("menu_swapavas");
			showMenuOption("menu_smallavas");
			showMenuOption("menu_hidesigs");
			showMenuOption("menu_confirm_drop");
			showMenuOption("menu_clockformat_mygames");
		}
	}
}

function hideSiteSettingsMenu()
{
	hideMenuOption("menu_fulllog");
	hideMenuOption("menu_swapavas");
	hideMenuOption("menu_smallavas");
	hideMenuOption("menu_hidesigs");
	hideMenuOption("menu_confirm_drop");
	hideMenuOption("menu_clockformat_mygames");
}

function createGameMenu()
{
    
	cc_log("Building the Settings Menu 2");          
	var ul = setupMenu();
	
	createOption("menu_sub_map", "Map Options", showMapSettingsMenu, ul);
	
	createOption("menu_fade", "Map Opacity:  <b>" + Math.round(GET_MAPFADE(myOptions,mapName)*100) + '%</b>', toggleFadeMap, ul, "#77AA77");

	createOption("menu_align_left", "Map Align Left: <b>" + Math.round(GET_MAPLEFT(myOptions,mapName)) + ' px</b>', toggleMapLeft, ul, "#77AA77");

	createOption("menu_align_top", "Map Align Top: <b>" + Math.round(GET_MAPTOP(myOptions,mapName)) + ' px</b>', toggleMapTop, ul, "#77AA77");

	createOption("menu_map_reset", "Reset Map Options", resetMap, ul, "#77AA77");

	createOption("menu_sub_view", "View Options", showViewSettingsMenu, ul);

	createOption("menu_stats", "Stats: <b>" + myOptions["statsMode"] + '</b>', toggleStatsMode, ul, "#77AA77");

	createOption("menu_mapInspect", "Map Inspect: <b>" + (myOptions["mapInspect"] ? " On" : " Off")+ '</b>', toggleMagicMap, ul, "#77AA77");

	createOption("menu_textMap", "Text Map: <b>" + (myOptions["textMapType"] )+ '</b>', toggleTextMap, ul, "#77AA77");

	createOption("menu_contoverview", "Continent Overview: <b>" + (myOptions["continent_overview"] )+ '</b>', toggleContOver, ul, "#77AA77");

	createOption("menu_clock", "Clock: <b>" + myOptions["Clock"] + '</b>', toggleClock, ul, "#77AA77");

	createOption("menu_clockformat", "Clock Format: <b>" + myOptions["24hourClockFormat"] + '</b>', toggle24HourClock, ul, "#77AA77");

	createOption("menu_jtm", "Jump to Map: <b>" + (myOptions["jumptomap"] ? " On" : " Off")+ '</b>', toggleJumpToMap, ul, "#77AA77");

	createOption("menu_hud", "HUD: <b>" + myOptions["floatActions"] + '</b>', toggleFloatingActionForm, ul, "#77AA77");

	createOption("menu_hudWidth", "Min HUD Width:  <b>"+GET_MINFORMWIDTH(myOptions,mapName)+'</b>', toggleFormWidth, ul, "#77AA77");

	createOption("menu_colourcode_dd", "Colour DropDown: <b>" + myOptions["ccdd"] + '</b>', toggleColourCodeDD, ul, "#77AA77");

	createOption("menu_sub_snapshots", "Snapshots", showSnapshotsMenu, ul);

	createOption("menu_takesnap", "Take Snapshot", takeSnapshot, ul, "#77AA77");

	createOption("menu_analyse", "Analyse Snapshot", analyse, ul, "#77AA77");

	createOption("menu_refresh", "Revert To Live", 	reloadToLive, ul, "#77AA77");

	createOption("menu_delete_snaps_game", "Delete&nbsp;Game&nbsp;Snapshots", deleteGameSnaps, ul, "#77AA77");

	createOption("menu_delete_snaps_all", "Delete&nbsp;All&nbsp;Snapshots", deleteAllSnaps, ul, "#77AA77");

	createOption("menu_sub_conf", "Confirmations", showConfSettingsMenu, ul);

	createOption("menu_conf_phase", "Confirm Phase End: <b>" + (myOptions["confirmEnds"] ? " On" : " Off")+ '</b>', toggleConfirmEnds, ul, "#77AA77");

	createOption("menu_conf_attack", "Confirm AutoAttack: <b>" + (myOptions["confirmAutoAttack"] ? " On" : " Off")+ '</b>', toggleConfirmActionsAA, ul, "#77AA77");

	createOption("menu_conf_deploy", "Confirm Deploy: <b>" + (myOptions["confirmDeploy"] ? " On" : " Off")+ '</b>', toggleConfirmActionsDeploy, ul, "#77AA77");

	addSiteWideMenuOptions(ul);
}

function toggleHideMenu()
{
	if (myOptions["hideMenu"] == "Off")
	{
		myOptions["hideMenu"] = "Game";
	}
	else if (myOptions["hideMenu"] == "Game")
	{
		myOptions["hideMenu"] = "Site";
	}
	else if (myOptions["hideMenu"] == "Site")
	{
		myOptions["hideMenu"] = "On";
	}
	else
	{
		myOptions["hideMenu"] = "Off";
	}
	serialize("OPTIONS",  myOptions);
	hider = document.getElementById("menu_hider");
	hider.innerHTML = "Hide Menu: <b>" + myOptions["hideMenu"] + '</b>';
}


function toggleUpdateAvailable() 
{
	upgrader = document.getElementById("menu_upgrader");
	if (newVersionAvailable)
	{
		upgrader.innerHTML = "<span class='countdown-alert'>Update Available</span>";
	}
	else
	{
		upgrader.innerHTML = "Latest Version Installed";
	}
}

function toggleClock() 
{
	if (myOptions["Clock"] == "Off") 
	{
		myOptions["Clock"] = "On";
	} 
	else 
	{
		myOptions["Clock"] = "Off";
		clearInterval(clockInterval); // stop clock.
		clockInterval = "";
	}
	serialize("OPTIONS",  myOptions);
	var clock = document.getElementById("menu_clock");
	clock.innerHTML = "Clock: <b> " + myOptions["Clock"] + '</b>';
}

function toggle24HourClock() 
{
	clockformat = document.getElementById("menu_clockformat");
	if (!clockformat) // remember we might not be in the game menu - so we might need to get this one.
		clockformat = document.getElementById("menu_clockformat_mygames");
	if (myOptions["24hourClockFormat"] == "Off") 
	{
		myOptions["24hourClockFormat"] = "am/pm";
	} 
	else if (myOptions["24hourClockFormat"] == "am/pm") 
	{
		myOptions["24hourClockFormat"] = "24h";
	} 
	else 
	{
		myOptions["24hourClockFormat"] = "Off";
	}
	serialize("OPTIONS",  myOptions);
	clockformat.innerHTML = "Clock Format: <b> " + myOptions["24hourClockFormat"] + '</b>';
	updateMyGamesClocks();
}


function checkForUpdate() 
{
	scriptURL = 'http://www.fileden.com/files/2008/1/19/1707364/conquerclubbobsupport.txt?nocache=' + Math.random();
	GM_xmlhttpRequest({method: 'GET', url: scriptURL, onload: function(response) {
		responseArray = response.responseText.split('\n')
		var serverVersion = "1.1.1";
		for ( line in responseArray ) {
			if ( responseArray[line].match('var versionString = ') ) 
			{
				serverVersion = responseArray[line].split('"')[1]
				break;
			}
		}
		var serverVersionNumbers = serverVersion.split('.');
		var installedVersionNumbers = versionString.split('.');
		if (parseInt(serverVersionNumbers[0],10)>parseInt(installedVersionNumbers[0],10))
		{
			newVersionAvailable = true;
		}
		else if (parseInt(serverVersionNumbers[0],10)<parseInt(installedVersionNumbers[0],10))
		{
			newVersionAvailable = false;
		}
		else if (parseInt(serverVersionNumbers[1],10)>parseInt(installedVersionNumbers[1],10))
		{
			newVersionAvailable = true;
		}
		else if (parseInt(serverVersionNumbers[1],10)<parseInt(installedVersionNumbers[1],10))
		{
			newVersionAvailable = false;
		}
		else if (parseInt(serverVersionNumbers[2],10)>parseInt(installedVersionNumbers[2],10))
		{
			newVersionAvailable = true;
		}
		else
		{
			newVersionAvailable = false;
		}
		toggleUpdateAvailable();
	}})
}

function setupMenu()
{
	// setup menu headings.
	var leftBar = document.getElementById("leftColumn");

	var ul = leftBar.getElementsByTagName("ul");

	var gmMenu = document.createElement('div');
	gmMenu.id="bobmenu";
	ul[0].parentNode.appendChild(gmMenu);

	var t = document.createElement('h3');
	t.innerHTML =  "BOB Menu <span style='font-size:7pt;' ><a href='http://www.conquerclub.com/forum/viewtopic.php?t=33445'> " + versionString + "</a></span>"; 
	gmMenu.appendChild(t);


	var ul = document.createElement ('ul');
	ul.id = "bobmenuUl";
	gmMenu.appendChild(ul);
	return ul;
}

function addSiteMenuOptions(ul)
{

	createOption("menu_sub_sitemenu", "Site Options", showSiteSettingsMenu, ul);

	createOption("menu_fulllog", "Full Log: <b>" + myOptions["fulllog"] + '</b>', toggleFullLog, ul, "#77AA77");

	createOption("menu_swapavas", "Swap Avatars: <b>" + myOptions["swapavas"] + '</b>', toggleSwapAvas, ul, "#77AA77");

	createOption("menu_smallavas", "Small Avatars: <b>" + myOptions["smallavas"] + '</b>', toggleSmallAvas, ul, "#77AA77");

	createOption("menu_hidesigs", "Hide Signatures: <b>" + myOptions["hidesigs"] + '</b>', toggleHideSigs, ul, "#77AA77");

	createOption("menu_confirm_drop", "Confirm Drop: <b>" + myOptions["confirm_drop"] + '</b>', toggleConfDrop, ul, "#77AA77");
}

function addSiteWideMenuOptions(ul)
{

	createOption("menu_hider", "Hide Menu: <b>" + myOptions["hideMenu"] + '</b>', toggleHideMenu, ul);

	createOption("menu_help", "Help/Info", function() {showHelp(Logging)}, ul);

	createOption("menu_upgrader", "Latest Version Installed", function() {showUpgrade()}, ul);

}

function hideSigs()
{
	if (location.href.indexOf("mode=viewprofile")==-1)
	{
			var body = document.getElementById("page-body");
			if (body)
			{
						if (myOptions["hidesigs"]=="On")
						{
							var sigs = getElementsByClassName(body,'div','signature');
							for (var i=0;i<sigs.length;i++)
							{
								sigs[i].style.display = "none";
							}
						}
						else
						{
							var sigs = getElementsByClassName(body,'div','signature');
							for (var i=0;i<sigs.length;i++)
							{
								sigs[i].style.display = "block";
							}
						}
			}
	}
}

function smallAvatars()
{
	if (location.href.indexOf("mode=viewprofile")==-1)
	{
					var body = document.getElementById("page-body");
					if (body)
					{
						if (myOptions["smallavas"]=="On")
						{
							var avas = getElementsByClassName(body,'dl','postprofile');
							for (var i=0;i<avas.length;i++)
							{
									var dds = avas[i].getElementsByTagName("dd");
									for (var j=0;j<dds.length;j++)
									{
											var profIcons = getElementsByClassName(dds[j],'ul','profile');
											if (!profIcons.length>0)
											{
													if (dds[j].id)
													{
															var expand = document.getElementById("expander"+i);
															expand.value = "Expand";
													}
													else
													{
															dds[j].style.display = "none";
													}
											}
									}

									if (!dds[dds.length-1].id) // only add if we don't already have a button
									{
												var expand = createButtonDD("Expand", i);
												avas[i].appendChild(expand);
									}
							}
						}
						else
						{
							var avas = getElementsByClassName(body,'dl','postprofile');
							for (var i=0;i<avas.length;i++)
							{
									var dds = avas[i].getElementsByTagName("dd");
									for (var j=0;j<dds.length;j++)
									{
											var profIcons = getElementsByClassName(dds[j],'ul','profile');
											if (!profIcons.length>0)
											{
													if (dds[j].id)
													{
															var expand = document.getElementById("expander"+i);
															expand.value = "Collapse";
													}
													else
													{
															dds[j].style.display = "";
													}
											}
									}
									if (!dds[dds.length-1].id) // only add if we don't already have a button
									{
												var expand = createButtonDD("Collapse", i);
												avas[i].appendChild(expand);
									}

							}
						}
					}
	}
}

function createButtonDD(text, which)
{
				var makeExpander = function (n) {
				 return function () {expander (n);}
				};

				var expand = document.createElement("dd");
				expand.id = "expanderdd"+which;
				var expandButton = document.createElement("input");
				expandButton.value = text;
				expandButton.type = "Button";
				expandButton.id = "expander"+which;
				expandButton.className = "button1";
				expandButton.addEventListener("click", makeExpander(which), false);
				expand.appendChild(expandButton);
				return expand;
}

function expander(which)
{
		var expand = document.getElementById("expander"+which);
		var body = document.getElementById("page-body");
		var avas = getElementsByClassName(body,'dl','postprofile');
		var dds = avas[which].getElementsByTagName("dd");
		for (var j=0;j<dds.length;j++)
		{
				var profIcons = getElementsByClassName(dds[j],'ul','profile');
				if (!profIcons.length>0)
				{
						if (!dds[j].id)
						{
								if (expand.value=="Expand")
									dds[j].style.display = "";
								else
									dds[j].style.display = "none";
						}
				}
		}
		if (expand.value=="Expand")
				expand.value="Collapse";
		else
				expand.value="Expand";
}

function swapAvatars()
{
	if (location.href.indexOf("mode=viewprofile")==-1)
	{
					var body = document.getElementById("page-body");
					if (body)
					{
						if (myOptions["swapavas"]=="On")
						{
							var avas = getElementsByClassName(body,'dl','postprofile');
							for (var i=0;i<avas.length;i++)
							{
								avas[i].setAttribute("style","float:left;border-right:1px solid #FFFFFF;border-left:0px solid #FFFFFF;");//background-image:url('./styles/prosilver/imageset/en/icon_user_online.gif');background-position:100% 0pt;background-repeat:no-repeat");
							}
							if (avas.length>0)
							{
								var posts = getElementsByClassName(body,'div','postbody');
								for (var i=0;i<posts.length;i++)
								{
									posts[i].setAttribute("style","float:right");
								}
								var online = getElementsByClassName(body,'div','online');
								for (var i=0;i<online.length;i++)
								{
									online[i].setAttribute("style","background-position:100% 17pt");
								}
							}
						}
						else
						{
							var avas = getElementsByClassName(body,'dl','postprofile');
							for (var i=0;i<avas.length;i++)
							{
								avas[i].setAttribute("style","float:right;border-left:1px solid #FFFFFF;border-right:0px solid #FFFFFF");
							}
							if (avas.length>0)
							{
								var posts = getElementsByClassName(body,'div','postbody');
								for (var i=0;i<posts.length;i++)
								{
									posts[i].setAttribute("style","float:left");
								}
								var online = getElementsByClassName(body,'div','online');
								for (var i=0;i<online.length;i++)
								{
									online[i].setAttribute("style","background-position:100% 0pt");
								}
							}
						}
					}
	}
}

// function to change game links to load full log.
function updateGameLinks()
{
	if (myOptions["fulllog"]=="On")
	{
		var hrefs = document.getElementById('middleColumn').getElementsByTagName("a");
		for (var i=0;i<hrefs.length;i++)
		{
			if (hrefs[i].href.has("game.php"))
			{
				hrefs[i].href += "&full_log=Y";
			}
		}
	}
}

function updateMyGamesClocks()
{
	if (location.href.indexOf("mygames")>=0 || location.href.indexOf("mode=next")>=0) // if in mygames...
	{
		if (location.href.indexOf("mygames2")>=0 || location.href.indexOf("mygames3")>=0 || location.href.indexOf("mygames4")>=0) // but if not in active
			return;
		var middle = document.getElementById('middleColumn');
		var evens = getElementsByClassName(middle,"tr","even",true);
		updateMyGamesClock(evens);
		var odds = getElementsByClassName(middle,"tr","odd",true);
		updateMyGamesClock(odds);
	}
}

function updateMyGamesClock(elements)
{
	for (i=0;i<elements.length;i++)
	{
		var tr = elements[i];
		var tds = tr.childNodes;
		var tds = tr.childNodes;
		var td = tds[9];
		var hrsidx = td.innerHTML.indexOf("hrs");
		var bridx = td.innerHTML.lastIndexOf("<br>");
		time = td.innerHTML.substring(hrsidx-2);
		time = time.split(" ");
		finish = calcEndOfTurnTime(myOptions["24hourClockFormat"], parseInt(time[0],10), parseInt(time[1],10));
		if (bridx<hrsidx)
			td.innerHTML += "<br/>"+finish;
		else
			td.innerHTML = td.innerHTML.substring(0,bridx) + "<br/>" + finish;
	}


}

function showHelp(tlog) 
{
	var win = window.open("http://www.hometag.net/downloads/CC/BOB/help_4.6.1.htm","bobHelp","height=600, width=600, toolbar=no, scrollbars=yes, menubar=no");
	win.focus();
}

function showUpgrade() 
{
	var win = window.open("http://userscripts.org/scripts/source/13076.user.js","bobUpgrade","height=1, width=1, toolbar=no, scrollbars=no, menubar=no, resizable=no");
	win.focus();
	win.close();
}

function cc_log (m) 
{
	Logging += Math.round((new Date()).getTime()/1000)-startLogTime + ":" + m + "<br />" 
}

// Altered to allow partial matches... player matches player1 ... 2 etc.
function getElementsByClassName(oElm, strTagName, strClassName, exact)
{
        var arrElements = (strTagName == "*" && document.all)? document.all : oElm.getElementsByTagName(strTagName);
        var arrReturnElements = new Array();
        strClassName = strClassName.replace(/\-/g, "\\-");
        var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s)");
        var oElement;
        for(var i=0; i<arrElements.length; i++){
            oElement = arrElements[i];
	        if (exact)
	        {
		    if(oElement.className==strClassName){
			arrReturnElements.push(oElement);
		    }
	        }
		else
		{
		    if(oElement.className.has(strClassName)){
			arrReturnElements.push(oElement);
		    }
		}
        }
        return (arrReturnElements)
}

//mfontlans zslash function
function zslash(svalue, iwidth)
{
   var szero = String(svalue);
   var ch = szero.substr(0,1);
   while (ch == ' ')
   {
      szero = szero.substr(1, szero.length);
      ch = szero.substr(0,1);
   }
   ch = szero.substr(szero.length - 1, szero.length);
   while (ch == ' ')
   {
      szero = szero.substr(0, szero.length - 1);
   ch = szero.substr(szero.length - 1, szero.length);
   }
   
   var i=0;
   for (i=0; i < (iwidth - szero.length); i++)
   {
      szero = '0' + szero;
   }   

   return szero;
} 
    
function countDown()
{
	var clock = document.getElementById('clock');
	var clockFormat = myOptions['24hourClockFormat'];
	
        --seconds1;
        if(seconds1 < 0 ){
            --minutes1;
            if( minutes1 < 0 ){
                --hours1;
                if( hours1 < 0 ){
                    hours1 = 0;
                    if( minutes1 <= 0 && seconds1 <= 0 ){
                        clearInterval(clockInterval);//No more counting down
                        //No weird negative #s
                        minutes1= 0;
                        seconds1 = 0;
                        return;
                    }
                }
                minutes1 = 59;
            }
            seconds1 = 59;
        }
//	clock.innerHTML = hours1+'hrs '+minutes1+'min '+seconds1+'sec';

	var clockhtml = "";

	//mfontlans clock fix.
	if (((hours1==0) && (minutes1<10) && !unsafeWindow.speed) || (unsafeWindow.speed && minutes1<1))
		clockhtml += '<span class="countdown-alert">';
		
	clockhtml +=  zslash(hours1, 2) + 'hrs ' + zslash(minutes1, 2) + 'min ' + zslash(seconds1, 2) + 'sec';
	
	if (((hours1==0) && (minutes1<10) && !unsafeWindow.speed) || (unsafeWindow.speed && minutes1<1))
		clockhtml += "</span>";
		
        if (clockFormat !="Off") 
				{
             clockhtml += ' [' + calcEndOfTurnTime(clockFormat,hours1,minutes1)+ "]";
        }
        clock.innerHTML = clockhtml;


   // yowsers clock fix
/*   if( hours1 < 10)
   {
      clock.innerHTML = '0'+hours1+'hrs ';
   }
   else
   {
      clock.innerHTML = hours1+'hrs ';
   }
   if( minutes1 < 10)
   {
      clock.innerHTML = clock.innerHTML+'0'+minutes1+'min ';
   }
   else
   {
      clock.innerHTML = clock.innerHTML+minutes1+'min ';
   }
   if( seconds1 < 10)
   {
      clock.innerHTML = clock.innerHTML+'0'+seconds1+'sec';
   }
   else
   {
      clock.innerHTML = clock.innerHTML+seconds1+'sec';
   } */
}

function calcEndOfTurnTime(clockFormat, h, m)
{
	if (clockFormat=="Off")
		return "";
        var day = ' @ ';
        var ampm = '';

        var currentTime = new Date();
        var hours = currentTime.getHours();
        var minutes = currentTime.getMinutes();

        minutes = (minutes + m);
        if (minutes >= 60) {
                hours = hours + 1;
                minutes = minutes - 60;
            }

        hours = (hours + h);
        if (hours >= 24)
            {
                day = "Tomorrow @ ";
                hours = hours - 24
            }
        else
        {
                day = "Today @ ";
        }

	if (clockFormat == "am/pm") 
	{
		ampm = " am";
                if (hours >= 12)
                {
                    ampm = " pm";
                    hours = hours - 12;
                }
                if (hours == 0) hours = 12;
	}
	var timeDisplay = day + "<b>" + zslash(hours, 2) + ":" + zslash(minutes, 2) + ampm + "</b>";
	return timeDisplay;
}


function calcRedemption()
{
        if( m_bonusCards == eBonusCards.ESCALATING )
	{
		if( num_turnins < 5 ) 
			return num_turnins * 2 + 4;
		else 
			return num_turnins * 5 - 10;
        } 
	else if( m_bonusCards == eBonusCards.FLATRATE) 
		return 7;
        return 0; //no cards
}

function calcArmiesNextTurn(countries)
{
	var ret = 0; 
	if (reinforcementsArray.length==0) // old school.
	{
		if(countries < 12 ) 
			return 3; 
		ret = Math.floor(countries/3);
	}
	else // new territory array stuff.
	{
		var armiesAwarded = 0;
		for (i=0;i<reinforcementsArray.length;i++)
		{
			var lower = reinforcementsArray[i]._lower;
			var upper = reinforcementsArray[i]._upper;
			var divisor = reinforcementsArray[i]._divisor;
			if (countries>=lower)
			{
				armiesAwarded += Math.floor(  (Math.min(countries, upper)-(lower-1))/divisor);
			}
		}
		ret = Math.max(armiesAwarded,minimumReinforcements);
	}
	return ret;
}

//---- Returns probability of a tunin - http://www.kent.ac.uk/IMS/personal/odl/riskfaq.htm#3.5 ----
function getTurnInP(num_cards)
{
        if( num_cards < 3 ) return 0;
        if( num_cards > 4 ) return 1;
        if( num_cards == 3 ) return 0.3341;
        return 0.778; // has 4 cards
}

// START TAHITIWAHINI ARMIES FROM CARDS CALCULATIONS
// The following functions are derived from the calculations at:
// http://www.conquerclub.com/forum/viewtopic.php?t=15620
    
// Returns the probability of having a set 
// when holding the given number of cards.
function getSetProbability(cards) 
{
        if (cards < 3) return 0;
        if (cards == 3) return 0.333333;
        if (cards == 4) return 0.777778;
        if (cards >= 5) return 1;
        return -1;
}
    
    // Returns the number of armies expected from cashing in
    // a set when holding the given number of cards.
function getArmiesFromCardSet(cards) 
{
        if (m_bonusCards != eBonusCards.FLATRATE) {
            return getSetProbability(cards) * calcRedemption();
        } else {
            if (cards < 3) return 0;
            if (cards == 3) return 2.888889;
            if (cards == 4) return 5.333333;
            if (cards >= 5) return 7.333333;
            return -1;
        }
}  
    
// Returns the number of armies received from owning countries.
function getArmiesFromCountries(countries, continentBonus, missedTurns) 
{
        return (calcArmiesNextTurn(countries) + continentBonus) * (missedTurns + 1);
}
    
// Returns the estimated number of armies due for cashing in a set 
// of cards.
function getEstimatedArmiesFromCards(cards, countries, totalCountries) 
{
        return getArmiesFromCardSet(cards) + (6 * getSetProbability(cards) * (countries / totalCountries));
}

    // Returns the total number of armies expected for the next turn.
function getTotalExpectedArmies(countries, continentBonus, missedTurns, cards, totalCountries) 
{
        return getArmiesFromCountries(countries, continentBonus, missedTurns) + getEstimatedArmiesFromCards(cards, countries, totalCountries);
}

// Returns the calculated strength of a players position rounded to the 
// nearest hundreth.
function getStrength(currentArmies, expectedArmies, countries) 
{
        return Math.round ((currentArmies + expectedArmies - ((2 / 3) * countries)) * 100) / 100;
}
    
// END TAHITIWAHINI ARMIES FROM CARDS CALCULATIONS

function GET_MAPFADE(OPTIONS,mapName) 
{
	var fade = 1;
	if (typeof(OPTIONS["fadeMap:"+mapName])=="undefined") 
        {
            fade = OPTIONS["fadeMap"];
        }
        else
        {
            fade = OPTIONS["fadeMap:" + mapName];
        }
	// force Opacity to not be 0.
	if (fade==0)
	{
		return 1;
	}
	else
	{
		return fade;
	}
}

function APPLY_MAPFADE(OPTIONS,mapName) 
{ 
        var fm = document.getElementById("outer-map");
        fm.style.opacity = GET_MAPFADE(OPTIONS,mapName);
}   

function APPLY_TEXTMAP(OPTIONS) 
{
	if (OPTIONS['textMapType']!="Off")
	{
		if (OPTIONS['textMapType']=="Standard") 
		{ 
			textMap.innerHTML = txtMapSmallHtml;
		}
		else 
		{
			textMap.innerHTML = txtMapHtml;
		}
		var showMoreLink = document.getElementById('showMoreLink');
		showMoreLink.addEventListener('click', showMoreTextMap, true);
		showMoreLink.parentNode.style.display = "";
		var wrapper = document.getElementById('textMapWrapper');
		wrapper.style.display = "";
	}
	else
	{
		textMap.innerHTML = "";
		var wrapper = document.getElementById('textMapWrapper');
		wrapper.style.display = "none";
	}
}


function teamNumber(pid) 
{
	// OK game type = doubles
        //  0 = 0, 1&2 = 1, 3&4 = 2, 5&6 = 3 7&8 = 4
        // game type = triples
        //  0 = 0, 1&2&3 = 1, 4&5&6 = 2
        // Other Games Team=PID
        var tid = pid;
        
        if (pid==UID)
        	return 0;
        
        if (pid!=0 && m_gameType == eGameType.DOUBLES) {
            if (pid==1 || pid == 2) {
                tid = 1;
            }else if (pid==3 || pid == 4) {
                tid = 2;
            }else if ((pid==5 || pid == 6) && num_players>5) {
                tid = 3;
            }else if (num_players>7) {
                tid = 4;
            }
        }
        else if (pid!=0 && m_gameType == eGameType.TRIPLES) {
            if (pid==1 || pid == 2 || pid == 3) {
                tid = 1;
            }else {
                tid = 2;
            }
        } 
        else if (pid!=0 && m_gameType == eGameType.QUADRUPLES) {
            if (pid==1 || pid == 2 || pid == 3 || pid == 4) {
                tid = 1;
            }else {
                tid = 2;
            }
        } 
        return tid;
}
    
function isTeamGame() 
{
	return m_gameType == eGameType.DOUBLES || m_gameType == eGameType.TRIPLES || m_gameType == eGameType.QUADRUPLES;
}


function makeTableCellTextWorker(bEliminated,pid, strText,bwrap, id) 
{
	if (pid==UID)
		pid=0;
        return "<td" + (id?" id="+id:"") + (bwrap?"":" nowrap") +"><span " + (bEliminated ? "class=eliminated" : "" ) + "><span class='playerBG"+ pid +"'>"+  strText +  " </span></span></td>\n" 
}

function makeTableCellText(bEliminated,pid, strText,bwrap, id) 
{
        return makeTableCellTextWorker(bEliminated,pid, strText,false, id) ;
}

function makeTableCellTextWrap(bEliminated,pid, strText, id) 
{
        return makeTableCellTextWorker(bEliminated,pid, strText,true, id) ;
}

function APPLY_STATS(OPTIONS) 
{
    
        if (OPTIONS["statsMode"] == "Off") 
        {
								stats.innerHTML = "";
								var wrapper = document.getElementById('statsWrapper');
								wrapper.style.display = "none";

        }
        else
        {
								if (OPTIONS["statsMode"] == "Standard") 
								{
										stats.innerHTML = statsStr2;
								}
								else // Extended
								{
										stats.innerHTML = statsStr;
								}
								var showMoreLink = document.getElementById('showMoreStatsLink');
								showMoreLink.addEventListener('click', showMoreStats, true);
								showMoreLink.parentNode.style.display = "";
								var wrapper = document.getElementById('statsWrapper');
								wrapper.style.display = "";
								var hideButt = document.getElementById('hideConts');
								hideButt.addEventListener('click', hideContinents, true);
				}
}


function getFullLog()
{
	var thisLog = logDiv.innerHTML.split('<br>'); //Get logs on screen
	
	if (downloadedLog=="" && !thisLog[0].has("Game has been initialized"))
	{
		var failureMsg = "Log Downloading Failed - Would you like to retry?";
		try
		{
			var lastSend = new Date();
			var url = "http://www.conquerclub.com/game.php?";
			url+= "game=" + unsafeWindow.game.value + "&ajax=1&map_key=" + unsafeWindow.mapKey + "&log_number=" + unsafeWindow.logNumber + "&chat_number=" + unsafeWindow.chatNumber+"&lastSend="+lastSend.getTime()+"&full_log=Y";
			var req = new XMLHttpRequest();
			//Setting the URL with a synchronous GET
			req.open('GET',url,false);
			req.send(null);
		}
		catch (e)
		{
			alert(e);
			reloadFullLog(failureMsg);
			return "";
		}
		if (req.status != 200)
		{
			reloadFullLog(failureMsg);
			return "";
		}

		var response = req.responseText.split("&");
		downloadedLog = unescape(response[15]);
		logLength = thisLog.length-1;
	}
	var amendedLog = downloadedLog.split('<br />');
	
	for (var i=logLength;i<thisLog.length-1;i++)
	{
		amendedLog.push(thisLog[i]);
	}
	return amendedLog;

}

function reloadFullLog(message)
{
	if (confirm(message))
	{
		location.href = location.href + "&full_log=Y";
	}
}

// the following are the major functions for this script.

function processLog(start, init, showProgress, end)
{
    if (showProgress)
    	customStartWaiting("Processing Log");
    var log = getFullLog();
    if (end)
    {
    	start=0;
    	init=true;
    }
    if (!init)
    {
			rounds = stored_rounds;
			num_turnins = stored_num_turnins;
			for (name in playersArray)
			{
				playersArray[name]._skipped = stored_skipped[playersArray[name]._pid];
				playersArray[name]._total_skipped = stored_total_skipped[playersArray[name]._pid];
				playersArray[name]._lastBonus = stored_last_bonus[playersArray[name]._pid];
				playersArray[name]._points = stored_terminator_counter[playersArray[name]._pid];
			}
			if (fog)
			{
				for (name in playersArray)
				{
					playersArray[name]._calculatedCountries = stored_countries[playersArray[name]._pid];
				}
			}
			TerminatorSummary = stored_terminator_summary;
		}
		else
		{
			rounds = stored_rounds = 0;
			num_turnins = stored_num_turnins = 0;
			for (name in playersArray)
			{
				playersArray[name]._skipped = stored_skipped[playersArray[name]._pid] = 0;
				playersArray[name]._total_skipped = stored_total_skipped[playersArray[name]._pid] = 0;
				playersArray[name]._lastBonus = stored_last_bonus[playersArray[name]._pid] = 0;
				playersArray[name]._points = stored_terminator_counter[playersArray[name]._pid] = 0;
			}
			if (fog)
			{
				for (name in playersArray)
				{
					playersArray[name]._calculatedCountries = stored_countries[playersArray[name]._pid] = 0;
				}
			}
			TerminatorSummary = stored_terminator_summary = "";
		
			if (fog)
			{
				var np = num_players;
				if (np==2)
					np=3;
				var startingTerrs = Math.floor(totalStartCountries / np);
				if (totalPositions>0 && totalPositions<num_players)
					startingTerrs += ((totalPositionCountries / totalPositions) * Math.floor(totalPositions/num_players));
				for (name in playersArray)
				{
					if (name!="Neutral")
						playersArray[name]._calculatedCountries = startingTerrs;
				}
			}
    }

    /*---- Process Log ----*/
    cc_log("Starting Log Processing");
    cc_log("Log Processing Info - Length :" + log.length);
    for( i = start; i < log.length; i++ )
    {
    	if (end)
    	{
    		var dateStr = log[i].split(" - ")[0];
    		var front = dateStr.split(" ")[0];
    		var back = dateStr.split(" ")[1];
				if (front)
				{
	    		var dArray = front.split("-");
	    		var dyr = dArray[0];
	    		var dmth = dArray[1];
	    		dmth--; //minus 1 off of the month
	    		var dday = dArray[2];
	    		if (back)
	    		{
		    		var tArray = back.split(":");
		    		var thour = tArray[0];
		    		var tmin = tArray[1];
		    		var tsec = tArray[2];
		    		var dateStr2 = Date.UTC(dyr, dmth, dday, thour, tmin, tsec);
		    		if (dateStr2 >= end.getTime())
		    		{
		    			break;
		    		}
		    	}
				}
    	}
        // cc_log("Log Processing Info - indx :" + i + ":" + log[i]);
        // ID the player
        name = log[i].split(/<[^>]*>/)[1];
        if (! playersArray[name] && log[i].has('<span class="player')) {
                // Player Rename mid game?
                var num = parseInt(log[i].split(/"/)[1].split(/player/)[1]);
                name = pIndxs[num-1].innerHTML;
            }
        // Process the log
        if( log[i].has(" gets a card") ){
            playersArray[name]._skipped = 0;
            playersArray[name]._deferred = 0;
        }
        else if(  log[i].has(" ran out of time") ){
            playersArray[name]._skipped = 0;
            playersArray[name]._deferred = 0;
        }
        else if(  log[i].has(" fortified ") )
        {
            playersArray[name]._skipped = 0;
            playersArray[name]._deferred = 0;
        }
        else if (log[i].has(" deployed ")  )
        {
            playersArray[name]._skipped = 0;
        }
        else if(log[i].has(" attacked "))
				{
            playersArray[name]._skipped = 0;
				    if (fog)
				    {
							//add 1 to player who conquered...
							playersArray[name]._calculatedCountries++;
							// then minus 1 from player who lost...
							conquered = log[i].substring(log[i].indexOf("conquered"));
		        	lossname = conquered.split(/<[^>]*>/)[1];
							if (!playersArray[lossname] && conquered.has('<span class="player')) 
							{
                	// Player Rename mid game?
                	var num = parseInt(conquered.split(/"/)[1].split(/player/)[1]);
									if (num!=0)
                		lossname = pIndxs[num-1].innerHTML;
            	}
							if (lossname!="neutral player") // don't minus from neutral player...
							{
								playersArray[lossname]._calculatedCountries--;
							}
				    }

				}
        else if(log[i].has(" bombarded "))
				{
            playersArray[name]._skipped = 0;
				    if (fog)
				    {
							// then minus 1 from player who lost...
							annihilated = log[i].substring(log[i].indexOf("annihilated"));
		        	lossname = annihilated.split(/<[^>]*>/)[1];
							if (!playersArray[lossname] && annihilated.has('<span class="player')) 
							{
                	// Player Rename mid game?
                	var num = parseInt(annihilated.split(/"/)[1].split(/player/)[1]);
									if (num!=0)
                		lossname = pIndxs[num-1].innerHTML;
            	}
							if (lossname!="neutral player") // don't minus from neutral player...
							{
								playersArray[lossname]._calculatedCountries--;
							}
				    }

				}
        
        else if( log[i].has(" missed a turn") ){
            playersArray[ name ]._skipped += 1;
            playersArray[ name ]._total_skipped += 1;
        }
        else if( log[i].has(" cashed") ){
            playersArray[ name ]._skipped = 0;
            num_turnins++;
        }
        else if( log[i].has(" eliminated ") )
        {
            playersArray[ name ]._skipped = 0;
            TerminatorSummary += log[i] + " in round - "+rounds+"<br/>"
            
        }
	        else if( log[i].has(" receives ") )
					{
						if(fog && !log[i].has(" holding ") && !log[i].has(" deferred ")) // territory count calculation we know this is correct thus force correction.
						{
							var terrCount = log[i].substring(log[i].indexOf("for")+4,log[i].indexOf("territories")-1);
							terrCount = parseInt(terrCount,10);
				    	playersArray[name]._calculatedCountries = terrCount;
						}
						playersArray[name]._skipped = 0; // Copied from above as receives was previously checked for and did this.
						//calculate how many armies received... add to last bonus.
						if (playersArray[name]._lastBonusFixed)
						{
							playersArray[name]._lastBonus = 0;
							playersArray[name]._lastBonusFixed = false;
						}
						armies = log[i].substring(log[i].indexOf("receives")+8,log[i].indexOf("armies")-1);
						armies = parseInt(armies,10);
						if (log[i].has("deferred"))
							playersArray[name]._deferred = armies;
						else
							playersArray[name]._lastBonus = playersArray[name]._lastBonus + armies;
					}
        else if( log[i].has(" lost ") )
        {
			    if (fog)
			    {
			    	playersArray[name]._calculatedCountries--;
			    }
        }
        else if( log[i].has(" loses ") ){
            playersArray[name]._deferred = 0;
            TerminatorSummary += log[i] + " in round - "+rounds+"<br/>"
						var points = log[i].substring(log[i].indexOf("loses")+5,log[i].indexOf("points")-1);
						points = parseInt(points,10);
						playersArray[ name ]._points -= points;
        }
        else if( log[i].has(" gains ") ){
            playersArray[ name ]._skipped = 0;
            TerminatorSummary += log[i] + " in round - "+rounds+"<br/>"
						var points = log[i].substring(log[i].indexOf("gains")+5,log[i].indexOf("points")-1);
						points = parseInt(points,10);
						playersArray[ name ]._points += points;
        }
        else if( log[i].has(" was kicked out ") || log[i].has(" was a deadbeat") )
        {
            playersArray[ name ]._skipped = -1;
            TerminatorSummary += log[i] + " in round - "+rounds+"<br/>"
				    if (fog && isTeamGame())
				    {
				    	//work out where the armies go to after DB gives territories to team mate.
				    	var goto = calculateBenficiary(name);
				    	if (goto!="-1")
				    	{
				    		playersArray[goto]._calculatedCountries+=playersArray[name]._calculatedCountries;
				    	}
							playersArray[ name ]._calculatedCountries = 0;
				    }
            else if (m_gameType != eGameType.TERMINATOR) 
				    { // if player kicked out and not terminator then blat this to 0.
							playersArray[ name ]._calculatedCountries = 0;
				    }
				}
				else if( log[i].has("Incrementing game to round") || log[i].has("Game has been initialized") )
				{
						stored_rounds = rounds++;
						// update starter place - and stored vars.
						logFixed=i;
						stored_num_turnins = num_turnins;
						stored_skipped = new Array();
						stored_total_skipped = new Array();
						stored_last_bonus = new Array();
						stored_terminator_counter = new Array();
						if (fog)
							stored_countries = new Array();
						for (name in playersArray)
						{
							stored_skipped.push(playersArray[name]._skipped);
							stored_total_skipped.push(playersArray[name]._total_skipped);
							stored_last_bonus.push(playersArray[name]._lastBonus);
							playersArray[name]._lastBonusFixed = true;
							playersArray[name]._deferred = 0;
							stored_terminator_counter.push(playersArray[name]._points);
							if (fog)
								stored_countries.push(playersArray[name]._calculatedCountries);
						}
						stored_terminator_summary = TerminatorSummary;
								}
								else if (log[i].has("won the game"))
								{
						showDeleteAll = true;
						if (!end && !start)
						{
							logFixed=i+1; // Only show this on initial load.
						}
				}
		} // end of processing loops
		var termDiv = document.getElementById('summary');
		if (termDiv)
		{
			outputTerminatorSummary(TerminatorSummary, termDiv)
		}
		else
		{
			var termWrapper = document.getElementById('termWrapper');
			termDiv = document.createElement('div');
			termDiv.id="summary";
			termWrapper.appendChild(termDiv);
			outputTerminatorSummary(TerminatorSummary, termDiv)
		}
}

function outputTerminatorSummary(TerminatorSummary, div)
{
			var termCounter = "<b>Points Totals</b><br/>";
			var found = false;
			for (name in playersArray)
			{
						var player = playersArray[name];
						if (player._pid!=0 && player._pid!=UID)
						{
									var nameStr = "<span class='playerBG"+ player._pid +"'>"+name+"</span>";
									termCounter += nameStr+" scored <b>"+player._points+"</b> points in this game<br/>";
									if (player._points!=0)
											found = true;
						}
			}
			div.innerHTML = TerminatorSummary + (found?termCounter:"");
}

function calculateBenficiary(name)
{
	var curPlayer = playersArray[name];
	var curTeam = teamNumber(curPlayer._pid);
	for (var otherName in playersArray) // loop through from top to bottom...
	{
		possPlayer = playersArray[otherName];
		if (possPlayer._pid != curPlayer._pid) // ensure not the same player...
		{
			if (teamNumber(possPlayer._pid)==curTeam) // ensure on the same team...
			{
				if (possPlayer._skipped!=-1) // ensure teammate not a DB already!
				{
					return otherName;
				}
			}
		}
	}
	return "-1";
}

function hideContinents()
{
	var button = document.getElementById("hideConts");
	var title = document.getElementById("conts");
	if (button.value == "Hide")
	{
			button.value = "Show";
			title.style.color = "#999999";
			for (name in playersArray)
			{
					var disp = document.getElementById("cont"+playersArray[name]._pid);
					if (disp)
						disp.style.display = "none";
			}
	}
	else
	{
			button.value = "Hide";
			title.style.color = "#000000";
			for (name in playersArray)
			{
					var disp = document.getElementById("cont"+playersArray[name]._pid);
					if (disp)
						disp.style.display = "";
			}
	}
}

function createStats(showProgress)
{
    if (showProgress)
    	customStartWaiting("Creating Statistics Table");
    statsStr = "";
    statsStr2 = "";
    tmp = "";
    var tmp2 = "";
    unk = "";
    var unk2 = "";

    var plyrCnt = 0;

		statsStr = "<table align=center style='width:100%;border:1px solid #FFF;background:#eee;' rules=rows><thead><tr style='font-weight:normal;' ><td nowrap><b>P</b>layer&nbsp;</td>" + ( m_bonusCards?"<td nowrap><b>C</b>ards&nbsp;</td>":"" )+"<td nowrap><b>M</b>issed<br><b>T</b>urns&nbsp;(Total)</td><td nowrap><b>A</b>rmies&nbsp;</td><td nowrap><b>T</b>erritories&nbsp;";
		if (fog)	{statsStr +="[Calc]";}
		statsStr+= "</td><td nowrap><b>S</b>trength&nbsp;</td><td nowrap><b>L</b>ast<br><b>B</b>onus&nbsp;</td><td nowrap><b>A</b>rmies due<br>(<b>T</b> + <b>C</b> + <b>TB</b>)&nbsp;</td><td nowrap><b>D</b>eferred<br><b>A</b>rmies&nbsp;</td>" + ( m_bonusCards  ?"<td nowrap><b>C</b>ard Set<br><b>E</b>stimate&nbsp;</td>":"" )+"<td nowrap><span id='conts'><b>C</b>ontinents&nbsp;</span><input type='button' value='Hide' id='hideConts'></td></tr></thead><tbody id=statsbody>";
		statsStr2 = "<table align=center style='width:100%;border:1px solid #FFF;background:#eee;' rules=rows><thead><tr style='font-weight:normal;' ><td nowrap><b>P</b>layer&nbsp;</td>" + ( m_bonusCards?"<td nowrap><b>C</b>ards&nbsp;</td>":"" )+"<td nowrap><b>M</b>issed<br><b>T</b>urns&nbsp;</td><td nowrap><b>A</b>rmies&nbsp;</td><td nowrap><b>T</b>erritories&nbsp;";
		if (fog)	{statsStr2 +="[Calc]";}
		statsStr2 += "</td><td nowrap><b>L</b>ast<br><b>B</b>onus&nbsp;</td><td nowrap><b>A</b>rmies<br><b>D</b>ue&nbsp;</td><td nowrap><b>D</b>eferred<br><b>A</b>rmies&nbsp;</td><td nowrap><span id='conts'><b>C</b>ontinents&nbsp;</span><input type='button' value='Hide' id='hideConts'></td></tr></thead><tbody id=statsbody>";

		var LastTeamID = -1;
		var teamArmies = 0;
		var teamTerritories  = 0;
		var teamCalcedTerrs = 0;
		var teamStrength =0;
		var teamID = 0;

    for( name in playersArray )
    {
//        if( playersArray[name]._countries != 0 || playersArray[name]._calculatedCountries != 0)
        {
			    var tid = teamNumber(playersArray[name]._pid);
			    if (tid!=0)
            	teamID = tid;
	            if (isTeamGame() && LastTeamID != -1 && LastTeamID != teamID && name!="Unknown") 
	            {
                var pctArmies = Math.round(teamArmies*100/totalArmies);
                var pctCountries = Math.round(teamTerritories*100/totalCountries);
								pctCalcCountries = Math.round(teamCalcedTerrs*100/totalCountries);
            
                var curpid = 0;
                var nameStr = "Team " + LastTeamID;
                var isEliminated = false;
                if (LastTeamID != 0 ) 
                {
						                statsStr+= "<tr>" + 
                            	makeTableCellText(isEliminated, curpid, nameStr) + 
                            	( m_bonusCards?  makeTableCellText(isEliminated, curpid, "") :"" ) +
                            	makeTableCellText(isEliminated, curpid, "") + 
                            	makeTableCellTex