var	alPgTitles = new Array(
			'Main page', 'Leader election', 'Members', 'Planets',
			'Military status', 'Pending requests', 'Forums admin.',
			'Ranks admin.'
		);
var	mbListHeaders = ['Name', 'Rank', 'Last online', 'On vacation'];
var	onlineText = "Currently online";
var	lastOnlinePrefix = "";
var	lastOnlineUnits = ['minute', 'minutes', 'hour', 'hours'];
var	lastOnlineSuffix = " ago";
var	vacationMode = ['No', 'Yes'];

function        makeAllianceTooltips()
{
        alltt = new Array();
	if      (ttDelay == 0)
	{
		var     i;
		for     (i=0;i<300;i++)
			alltt[i] = "";
		return;
	}
	alltt[0] = tt_Dynamic("Use this text field to type in the tag of the alliance you wish to join");
	alltt[1] = tt_Dynamic("Click here to send your joining request to the alliance's leadership");
	alltt[2] = tt_Dynamic("Use this text field to type in the tag of the alliance you wish to create");
	alltt[3] = tt_Dynamic("Use this text field to type in the full name of the alliance you wish to create");
	alltt[4] = tt_Dynamic("Click here to create the given alliance");
	alltt[5] = tt_Dynamic("Click here to cancel your joining request");
	alltt[10] = tt_Dynamic("Use this text field to type in the tag of the alliance you wish to get information about");
	alltt[11] = tt_Dynamic("Click here to display the information about the alliance you've provided the tag for");
	alltt[20] = tt_Dynamic("Click here to step down as leader of this alliance");
	alltt[21] = tt_Dynamic("Click here to leave this alliance");
	alltt[22] = tt_Dynamic("Use this radio button to switch the alliance in dictatorial mode");
	alltt[23] = tt_Dynamic("Use this radio button to switch the alliance in democratric mode");
	alltt[24] = tt_Dynamic("Use this text field to type in the name of your successor as leader of the alliance");
	alltt[30] = tt_Dynamic("Click here to update the alliance general settings according to your changes");
	alltt[31] = tt_Dynamic("Click here to reset the alliance general settings to their previous values");
	alltt[40] = tt_Dynamic("Click here to take the presidency of the alliance");
	alltt[41] = tt_Dynamic("Click here to apply to presidency of the alliance");
	alltt[42] = tt_Dynamic("Click here to cancel your candidacy for the presidency of the alliance");
	alltt[43] = tt_Dynamic("Click here to change your vote for the alliance presidency according to what you have selected in the candidates list");
	alltt[50] = tt_Dynamic("Click here to sort the candidates list according to this field and switch between ascending and descending ordering");
	alltt[51] = tt_Dynamic("Use this radio button to abstain in the presidency election");
	alltt[52] = tt_Dynamic("Use this radio button to select which candidate you wish to vote for in the presidency election");
	alltt[60] = tt_Dynamic("Use this drop down list to select the alliance listing you wish to display");
	alltt[61] = tt_Dynamic("Use this drop down list to select the number of planets to display on each page of the listing");
	alltt[62] = tt_Dynamic("Use this radio button if you wish to search for a planet in the listing");
	alltt[63] = tt_Dynamic("Use this radio button if you wish to search for a player in the listing");
	alltt[64] = tt_Dynamic("Use this text field to type in the name of the planet or player you wish to search for in the listing");
	alltt[70] = tt_Dynamic("Click here to order the list according to this field and switch between ascending and descending ordering");
	alltt[71] = tt_Dynamic("Click here to go to this individual planet page");
	alltt[72] = tt_Dynamic("Click here to send a private message to the owner of this planet");
	alltt[73] = tt_Dynamic("Use this drop down list to go to another page of the listing");
	alltt[80] = tt_Dynamic("Use this drop down list to select the number of alliance members to display oneach page of the listing");
	alltt[81] = tt_Dynamic("Use this text field to type in the name of the player you wish to search for in the listing");
	alltt[90] = tt_Dynamic("Click here to kick this member out of the alliance");
	alltt[91] = tt_Dynamic("Click here to change the rank of the selected members to the selected rank");
	alltt[92] = tt_Dynamic("Use this drop down list to choose the rank you want to give to the selected members");
	alltt[100] = tt_Dynamic("Check this checkbox to select this alliance member ");
	alltt[101] = tt_Dynamic("Click here to send a private message to this alliance member");
	alltt[110] = tt_Dynamic("Check this checkbox to select this player requesting to join the alliance");
	alltt[111] = tt_Dynamic("Click here to accept this player into the alliance");
	alltt[112] = tt_Dynamic("Click here to reject this player's joining request");
	alltt[120] = tt_Dynamic("Click here to go to the forum creation form and create a new forum");
	alltt[130] = tt_Dynamic("Click here to go to the forum modification form and edit this forum's settings");
	alltt[131] = tt_Dynamic("Click here to move this forum up in the forums list");
	alltt[132] = tt_Dynamic("Click here to move this forum down in the forums list");
	alltt[133] = tt_Dynamic("Click here to delete this forum and all its contents");
	alltt[140] = tt_Dynamic("Use this text field to type in the name of the forum");
	alltt[141] = tt_Dynamic("Use this radio button if you want everyone to be able to post new threads in this forum");
	alltt[142] = tt_Dynamic("Use this radio button if you want the moderators of the forum to be the only ones allowed to post new threads in it");
	alltt[143] = tt_Dynamic("Use this drop down list to select where to place this forum in the forums list");
	alltt[144] = tt_Dynamic("Use this text area to type in a description for this forum");
	alltt[145] = tt_Dynamic("Click here to validate your changes to this forum");
	alltt[146] = tt_Dynamic("Click here to cancel your changes to this forum");
	alltt[150] = tt_Dynamic("Check this checkbox to select this rank and modify its access level to this forum");
	alltt[160] = tt_Dynamic("Click here to give this access level to the selected rank(s) for this forum");
	alltt[170] = tt_Dynamic("Click here to go to the rank creation form and create a new rank");
	alltt[171] = tt_Dynamic("Click here to display / hide the dtails about this rank");
	alltt[172] = tt_Dynamic("Click here to go to the modification form and edit this rank");
	alltt[173] = tt_Dynamic("Click to delete this rank");
	alltt[180] = tt_Dynamic("Use this text field to type in the rank designation");
	alltt[181] = tt_Dynamic("Use this drop down list to select the level of listing access the members with this rank will have");
	alltt[182] = tt_Dynamic("Check this checkbox if you want members of this rank to see the list of planets under attack");
	alltt[183] = tt_Dynamic("Use this radio button if you want members of this rank to be diplomatic contact for the alliance and to receive all messages sent to the alliance");
	alltt[184] = tt_Dynamic("Use this radio button if you don't want members of this rank to be diplomatic contact for the alliance");
	alltt[185] = tt_Dynamic("Use this radio button if you want members of this rank to be able to vote for leader elections if the alliance is democratic");
	alltt[186] = tt_Dynamic("Use this radio button if you don't want members of this rank to be able to vote for leader elections if the alliance is democratic");
	alltt[187] = tt_Dynamic("Use this radio button if you want members of this rank to be able to apply for presidency");
	alltt[188] = tt_Dynamic("Use this radio button if you don't want members of this rank to be able to apply for presidency");
	alltt[189] = tt_Dynamic("Use this radio button if you want members of this rank to be able to accept or reject new joining requests");
	alltt[190] = tt_Dynamic("Use this radio button if you don't want members of this rank to be able to accept or reject new joining requests");
	alltt[191] = tt_Dynamic("Use this radio button if you want members of this rank to be forum administrators");
	alltt[192] = tt_Dynamic("Use this radio button if you don't want members of this rank to be forum administrators");
	alltt[193] = tt_Dynamic("Click here to accept the changes you've made to that rank");
	alltt[194] = tt_Dynamic("Click here to cancel the changes you've made to that rank and go back to the previous page");
	alltt[195] = tt_Dynamic("Use this radio button if you don't want members of this rank to be able to kick any member out of the alliance");
	alltt[196] = tt_Dynamic("Use this radio button if you want members of this rank to be able to kick any member out of the alliance");
	alltt[197] = tt_Dynamic("Use this radio button if you want members of this rank to be able to kick only members of a specific rank out of the alliance");
	alltt[198] = tt_Dynamic("Use this radio button if you don't want members of this rank to be able to change the rank of any other member of the alliance");
	alltt[199] = tt_Dynamic("Use this radio button if you want members of this rank to be able to change the rank of any other member of the alliance");
	alltt[200] = tt_Dynamic("Use this radio button if you want members of this rank to be able tochange the rank of other members of the alliance only if they have some specific rank");
	alltt[201] = tt_Dynamic("Use this radio button if you don't want members of this rank to have any access to this forum");
	alltt[202] = tt_Dynamic("Use this radio button if you want members of this rank to have access to this forum as normal users");
	alltt[203] = tt_Dynamic("Use this radio button if you want members of this rank to have access to this forum as moderators");
	alltt[204] = tt_Dynamic("Use this drop down list to select to which rank players of the rank you are about to delete are to be demoted to");
	alltt[205] = tt_Dynamic("Click here to confirm the deletion of this rank and the demotion of the players of this rank to the selected rank");
	alltt[206] = tt_Dynamic("Click here to cancel the deletion of this rank and go back to the previous page");
	alltt[210] = tt_Dynamic("Click here to go to this section of the alliance page");
	alltt[220] = tt_Dynamic("Check this checkbox to select this rang and provide the corresponding rights over the members of this rank to the members of rank you are editing");
}



//--------------------------------------------------
// PAGE WHEN PLAYER IS NOT A MEMBER OF AN ALLIANCE
//--------------------------------------------------

function	drawPageNoAlliance()
{
	var	jd, cd1, cd2, ai;
	var	str = '<form action="?"><table cellspacing="0" cellpadding="0"><tr>';

	// Build join/create pannel
	str += '<td class="div2"><h1>Join an alliance</h1>';
	if	(plAlliance == "")
	{
		str += '<table class="calliance"><tr><td class="brd" rowspan="2">&nbsp;</td>';
		str += '<th>Alliance tag:</th><td>';
		str += '<input type="text" ' + alltt[0] + ' size="6" maxlength="5" name="aljoin" id="aljoin" value="" onFocus="hasFocus=0;return true" /></td></tr>';
		str += '<tr><td colspan="2" class="but">';
		str += '<input type="button" ' + alltt[1] + ' value="Send request" onClick="sendJoinRequest(); return false" />';
		str += '</td></tr></table>';

		str += '<p>&nbsp;</p>';

		str += '<h1>Create a new alliance</h1>';
		str += '<table class="calliance"><tr><td class="brd" rowspan="4">&nbsp;</td><th>';
		str += 'Alliance tag:</th><td><input ' + alltt[2] + ' type="text" size="6" maxlength="5" name="actag" id="actag" value="" onFocus="hasFocus=1;return true" />';
		str += '</td><td>&nbsp;</td></tr>';
		str += '<tr><th>Alliance name:</th><td colspan="2">';
		str += '<input ' + alltt[3] + ' type="text" size="32" maxlength="64" name="acname" id="acname" value="" onFocus="hasFocus=2;return true" />';
		str += '</td></tr>';
		str += '<tr><td colspan="2" class="but">';
		str += '<input type="button" ' + alltt[4] + ' value="Create this alliance" onClick="createAlliance(); return false" /></td>';
		str += '<td>&nbsp;</td></tr></table>';
	}
	else
	{
		str += '<p>Request sent to ' + alName + ' <b>[' + alTag + ']</b> ';
		str += '<input type="button" ' + alltt[5] + ' value="Cancel request" onClick="x_cancelRequest(requestSent); return false" /></p>';
	}

	// Build alliance info pannel
	str += '</td><td style="width:45%">';
	str += drawAllianceInfoPannel();
	str += '</td><td style="width:5%;vertical-align:top"><a href="manual?p=alliance">Help</a></td></tr></table>';

	var	i, e, v = new Array();
	var	a = new Array('aljoin', 'actag', 'acname', 'alinfo');
	for	(i=0;i<a.length;i++)
	{
		e = document.getElementById(a[i]);
		if	(!e)
			v[i] = '';
		else
			v[i] = e.value;
	}

	document.getElementById('allpage').innerHTML = str;

	for	(i=0;i<a.length;i++)
	{
		e = document.getElementById(a[i]);
		if	(!e)
			continue;
		e.value = v[i];
		if	(hasFocus == i)
			e.focus();
	}

	drawPubAllianceInfo();
}

function alertCreate(ei) {
	var str = 'Error\n';
	switch (ei) {
		case 0: str += "Multiple spaces are not allowed in alliance tags."; break;
		case 1: str += "Please enter a tag for the alliance to create."; break;
		case 2: str += "Please enter a name for the new alliance."; break;
		case 3: str += "Tag or name too long."; break;
		case 4: str += "This alliance tag already exists."; break;
		case 5: str += "A database error occured on the server."; break;
		case 6: str += "You can't create alliances in this game."; break;
		case 200: str += "You can\'t create an alliance while in vacation mode."; break;
		default: str += 'An unknown error has occured.'; break;
	}
	alert(str);
}

function alertJoin(ei) {
	var	str = 'Error\n';
	switch (ei) {
		case 0: str += "Please enter the tag of the alliance to send a request to."; break;
		case 1: str += "The alliance could not be found."; break;
		case 2: str += "You have already requested to a the member of an alliance."; break;
		case 3: str += "You can't join alliances in this game."; break;
		case 4: str += "You have already canceled your request to join this alliance."; break;
		case 5: str += "You shouldn't be here - this game has locked allianced."; break;
		case 200: str += "You can\'t join an alliance while in vacation mode."; break;
		case 201: str += "You can\'t cancel a request to join an alliance while in vacation mode."; break;
		default: str += 'An unknown error has occured.'; break;
	}
	alert(str);
}


//--------------------------------------------------
// ALLIANCE INFORMATION PANNEL
//--------------------------------------------------

function	drawAllianceInfoPannel()
{
	var	str = '<h1>Alliance information</h1>';
	str += '<table class="calliance"><tr><td class="brd" rowspan="11">&nbsp;</td>';
	str += '<th>Alliance tag:</th><td>';
	str += '<input type="text" ' + alltt[10] + ' size="6" maxlength="5" name="alinfo" id="alinfo" value="" onFocus="hasFocus=3;return true" /></td></tr>';
	str += '<tr><td colspan="2" class="but">';
	str += '<input type="button" ' + alltt[11] + ' value="Display information" onClick="getAllianceInfo(); return false" />';
	str += '</td></tr><tr><td colspan="2">&nbsp;</td></tr>';
	var	i, a = new Array('tag', 'name', 'ldname', 'rank', 'points', 'nplanets', 'coords');
	for	(i=0;i<a.length;i++)
		str += '<tr><th id="aihd' + a[i] + '">&nbsp;</th><td id="aidt' + a[i] + '">&nbsp;</td></tr>';
	str += '<tr><th id="aihdvict">&nbsp;</th><td id="aidtvict">&nbsp;</td></tr>';
	str += '<tr><td colspan="2" class="but" id="ainfmsg">&nbsp;</td></tr>';
	str += '</table>';
	return	str;
}

function	drawPubAllianceInfo()
{
	if	(alPubInfo && typeof alPubInfo == 'object')
	{
		document.getElementById('aihdtag').innerHTML = 'Alliance tag:';
		document.getElementById('aihdname').innerHTML = 'Alliance name:';
		document.getElementById('aihdldname').innerHTML = 'Leader:';
		document.getElementById('aihdrank').innerHTML = 'Rank:';
		document.getElementById('aihdpoints').innerHTML = 'Points:';
		document.getElementById('aihdnplanets').innerHTML = 'Planets:';
		document.getElementById('aihdcoords').innerHTML = 'Avg. coordinates:';
		document.getElementById('aidttag').innerHTML = '[' + alPubInfo.tag + ']';
		document.getElementById('aidtname').innerHTML = alPubInfo.name;
		document.getElementById('aidtldname').innerHTML = (alPubInfo.leader == "" ? '<span class="noleader">NONE!</span>' : alPubInfo.leader);
		document.getElementById('aidtrank').innerHTML = '#' + formatNumber(alPubInfo.rank);
		document.getElementById('aidtpoints').innerHTML = formatNumber(alPubInfo.points);
		document.getElementById('aidtnplanets').innerHTML = formatNumber(alPubInfo.nplanets);
		if	(alPubInfo.nplanets > 0)
			document.getElementById('aidtcoords').innerHTML = '(' + alPubInfo.cx + ',' + alPubInfo.cy + ')';
		else
			document.getElementById('aidtcoords').innerHTML = 'N/A';
		if (alPubInfo.victory != '') {
			document.getElementById('aihdvict').innerHTML = 'Victory:';
			document.getElementById('aidtvict').innerHTML = alPubInfo.victory + '%';
		}
	}
	else
	{
		var	i, a = new Array('tag', 'name', 'ldname', 'rank', 'points', 'nplanets', 'coords');
		for	(i=0;i<a.length;i++)
		{
			document.getElementById('aihd' + a[i]).innerHTML = '';
			document.getElementById('aidt' + a[i]).innerHTML = '';
		}
		document.getElementById('ainfmsg').innerHTML = '';
	}
}

function	alertAllianceInfo(ei)
{
	var	str = 'Error\n';
	switch	(ei)
	{
		case 0: str += 'Please enter a tag to look up.'; break;
		case 1: str += 'This alliance does not exist.'; break;
		default: str += 'An unknown error has occured.'; break;
	}
	alert(str);
}


//--------------------------------------------------
// ALLIANCE MEMBER PAGE
//--------------------------------------------------

function	drawLoadingText()
{
	document.getElementById('alpmain').innerHTML = 'Loading page, please wait ...';
}

function drawMainPage() {
	var	jd, cd1, cd2, ai;
	var	str = '<table cellspacing="0" cellpadding="0"><tr>';
	asButtons = false;

	// Build current alliance information
	str += '<td class="div2"><h1>Current alliance</h1>';
	var nsl = 13 + ((successor != "") ? 1 : 0) + (myPubInfo.victory != '' ? 1 : 0);
	str += '<table class="calliance"><tr><td class="brd" rowspan="' + nsl + '">&nbsp;</td>';
	str += '<td colspan="2">You are ';
	if (alPrivileges[8] == "1") {
		str += 'the leader';
	} else {
		str += 'a member';
	}
	str += ' of <b>[' + myPubInfo.tag + ']</b>.</td></tr>';
	if (alPrivileges[8] == 1 && successor != "") {
		str += '<tr><td colspan="2" class="but"><input ' + alltt[20]
			+ ' type="button" value="Step down" onClick="leaderStepDown();return false" /></td></tr>';
	}
	str += '<tr><td colspan="2">&nbsp;</td></tr>';
	str += '<tr><th>Alliance tag:</th><td>[' + myPubInfo.tag + ']</td></tr>';
	str += '<tr><th>Alliance name:</th><td>' + myPubInfo.name + '</td></tr>';
	// FIXME: message link if not leader
	str += '<tr><th>Leader:</th><td' + (myPubInfo.leader == "" ? ' class="noleader">NONE!' : ('>' + myPubInfo.leader))
		+ '</td></tr>';
	if (successor != "") {
		str += '<tr><th>Successor:</th><td>' + successor + '</td></tr>';
	}
	str += '<tr><th>Government:</th><td>' + (isDemocracy ? 'democratic' : 'dictatorial')
		+ '</td></tr><tr><th>Tech. trading:</th><td>';
	if (techTrade == 'N') {
		str += 'disabled';
	} else {
		str += '<a href="techtrade">enabled</a>'
			+ (techTrade == 'R' ? '' : ' (no requests)');
	}
	str += '</td></tr>';
	str += '<tr><th>Rank:</th><td>#'+formatNumber(myPubInfo.rank)+'</td></tr>';
	str += '<tr><th>Points:</th><td>'+formatNumber(myPubInfo.points)+'</td></tr>';
	str += '<tr><th>Planets:</th><td>' + formatNumber(myPubInfo.nplanets) + '</td></tr>';
	str += '<tr><th>Avg. coordinates:</th><td>';
	if	(myPubInfo.nplanets > 0)
		str += '(' + myPubInfo.cx + ',' + myPubInfo.cy + ')';
	else
		str += 'N/A';
	str += '</td></tr>';

	if (myPubInfo.victory != '') {
		str += '<tr><th>Victory:</th><td>' + myPubInfo.victory + '%</td>';
	}

	if (!lockedAlliances) {
		str += '<tr><td colspan="2" class="but"><input type="button" ' + alltt[21] + ' value="Leave the alliance" onClick="leaveAlliance();return false" /></td></tr>';
	}
	str += '</table></td><td>';

	// Alliance settings
	if (alPrivileges[8] == "1") {
		if (typeof asDemocracy != "boolean") {
			asDemocracy = isDemocracy;
			asSuccessor = successor;
			asTechTrade = techTrade;
		}
		str += '<h1>General settings</h1>';
		str += '<table class="calliance"><tr><td class="brd" rowspan="5">&nbsp;</td>';
		if (!lockedAlliances) {
			str += '<th>Government:</th><td><label><input type="radio" ' + alltt[22]
				+ ' name="lasmode" value="1" ' + (asDemocracy ? '' : 'checked="checked"')
				+ ' onClick="asDemocracy=false;updateASControls();return true"/> Dictatorial</label>'
				+ '</td></tr><tr><td>&nbsp;</td><td><label><input type="radio" ' + alltt[23]
				+ ' name="lasmode" value="1" ' + (asDemocracy ? 'checked="checked"' : '')
				+ ' onClick="asDemocracy=true;updateASControls();return true"/> Democratic'
				+ '</label></td></tr>';
		}
		str += '<tr><th>Successor:</th><td><input ' + alltt[24]
			+ ' type="text" name="lassucc" id="lassucc" size="16" maxlength="15" value=""'
			+ ' onKeyUp="asSuccessor=value;updateASControls();return true" onFocus="hasFocus=0;'
			+ 'return true"/></td></tr><tr><th><label for="ttrade">Tech. trading:</label></th>'
			+ '<td><select name="ttrade" id="ttrade" onchange="'
			+ 'asTechTrade=this.options[this.selectedIndex].value;updateASControls();return true">'
			+ '<option value="N"' + (asTechTrade == 'N' ? ' selected="selected"' : '')
			+ '>disabled</option><option value="S"'	+ (asTechTrade == 'S' ? ' selected="selected"' : '')
			+ '>enabled (no requests)</option><option value="R"'
			+ (asTechTrade == 'R' ? ' selected="selected"' : '')
			+ '>enabled (with requests)</option></select></td></tr>'
			+ '<tr><td colspan="2" class="but" id="lasbut">&nbsp;</td></tr>'
			+ '<tr><td colspan="3">&nbsp;</td></tr></table>';
	}

	// Build alliance info pannel
	str += drawAllianceInfoPannel();
	str += '</td></tr></table>';

	var	e = document.getElementById('alinfo'), es;
	if	(e)
		es = e.value;
	else
		es = "";

	document.getElementById('alpmain').innerHTML = str;
	drawPubAllianceInfo();

	if	(alPrivileges[8] == "1")
	{
		document.getElementById('lassucc').value = asSuccessor;
		updateASControls();
	}
	document.getElementById('alinfo').value = es;

	asFocus();
}

function	drawASButtons()
{
	var	str = '<input type="button" ' + alltt[30] + ' name="lasbut1" value="Update" onClick="modifyAllianceSettings();return false" /> ';
	str += '<input type="button" ' + alltt[31] + ' name="lasbut2" value="Reset" onClick="resetAllianceSettings();return false" />';
	document.getElementById('lasbut').innerHTML = str;
}

function alertASettings(ei) {
	var str = 'Error\n';
	switch (ei) {
		case 0: str += "You are no longer the leader of this alliance."; break;
		case 1: str += 'The player you selected to be your successor could\nnot be found.'; break;
		case 2: str += 'You can\'t name yourself as your own successor.'; break;
		case 3: str += 'The player you selected to be your successor is not\na member of the alliance.'; break;
		case 4: str += "You can't leave the alliance in this game."; break;
		case 200: str += 'You are not allowed to do that while in vacation mode.'; break;
		default: str += 'An unknown error has occured.'; break;
	}
	alert(str);
}

function	confirmLSD()
{
	return	confirm(
		'You are about to step down from the head of the\n[' + alTag
		+ '] alliance.\nThis will make ' + successor + ', your successor, the new leader.\n'
		+ 'Please confirm you really want to do this.'
	);
}

function	confirmLeave(lt)
{
	var	str = 'You are about to leave the [' + alTag + '] alliance.\n';
	switch	(lt)
	{
		case 1: str += 'The successor you designated, ' + successor + ', will take your place\nas the head of the alliance.\n'; break;
		case 2: str += 'The alliance will be become leader-less until someone is\nelected to replace you at the head of the alliance.\n'; break;
		case 3: str += 'The alliance will be become a leader-less democracy until\nsomeone is elected to replace you at the head of the alliance.\n'; break;
	}
	str += 'Please confirm.';
	return	confirm(str);
}


//--------------------------------------------------
// LEADER ELECTION
//--------------------------------------------------

function	drawElectionLayout()
{
	var	str = '<h1>Alliance Leader Election</h1>';
	str += '<table cellspacing="0" cellpadding="0">';
	str += '<tr><td class="div2"><h2>Candidates</h2><div id="lecdlist">&nbsp;</div></td>';
	str += '<td class="div2"><h2>Actions</h2><div id="leaclist">&nbsp;</div></td></tr>';
	str += '</table>';
	document.getElementById('alpmain').innerHTML = str;
}

function	drawElectionButtons()
{
	var	str = '<p>';
	if	(leCanSel||leCanTake||leCanApply||leCanCancel)
	{
		if	(leCanTake)
			str += '<input  ' + alltt[40] + ' type="button" name="leTake" value="Take Presidency" onClick="takePresidency();return false" /><br/>';
		if	(leCanApply)
			str += '<input ' + alltt[41] + ' type="button" name="leApply" value="Apply for Presidency" onClick="applyForPresidency();return false" /><br/>';
		else if	(leCanCancel)
			str += '<input ' + alltt[42] + ' type="button" name="leTake" value="Cancel Candidacy" onClick="cancelCandidacy();return false" /><br/>';
		if	(leCanSel && (leNewSel != leSelected))
			str += '<input type="button" ' + alltt[43] + ' name="leChSel" value="Change my Vote" onClick="changeVote();return false" />';
	}
	else
	{
		str += 'There is nothing you can do here, since ';
		if	(alPrivileges[8] == 1)
			str += 'you are the alliance\'s leader.';
		else
			str += 'you don\'t have the right to vote or to apply for presidency.';
	}
	str += '</p>';
	document.getElementById('leaclist').innerHTML = str;
}


function	drawCandidateList()
{
	var	str;

	if	(leCandidates.length > 0)
	{
		str = '<table class="list" id="candlist" cellspacing="0" cellpadding="0"><tr>';

		// Headers
		if	(leCanSel)
			str += '<td class="lesel">&nbsp;</td>';
		str += '<th class="lecname" ' + alltt[50] + ' onClick="leSort=0;leSortDir=!leSortDir;updateCandidateList()" ';
		str += '>' + (leSort == 0 ? '<b>' : '') + 'Name';
		if	(leSort == 0)
		{
			str += '</b><img src="'+staticurl+'/beta5/pics/';
			str += leSortDir ? "up" : "down";
			str += '_' + color + '.gif" alt="' + (leSortDir ? "up" : "down") + '" />';
		}
		str += '</th><th class="lecvotes" ' + alltt[50] + ' onClick="leSort=1;leSortDir=!leSortDir;updateCandidateList()" ';
		str += '>' + (leSort == 1 ? '<b>' : '') + 'Votes';
		if	(leSort == 1)
		{
			str += '</b><img src="'+staticurl+'/beta5/pics/';
			str += leSortDir ? "up" : "down";
			str += '_' + color + '.gif" alt="' + (leSortDir ? "up" : "down") + '" />';
		}
		str += '</th></tr>';

		if	(leCanSel)
		{
			str += '<tr onClick="leNewSel=\'\';document.getElementById(\'lesela\').checked=true;drawElectionButtons()">';
			str += '<td class="lesel"><input type="radio"  ' + alltt[51] + ' name="lecsel" onClick="leNewSel=\'\';drawElectionButtons()" id="lesela" value=""';
			if	(leNewSel == '')
				str += 'checked="checked" ';
			str += ' /></td><td colspan="2"><i>Abstain</i></td></tr>';
		}

		// List
		for	(i=0;i<leCandidates.length;i++)
		{
			str += '<tr';
			if	(leCanSel)
			{
				str += ' onClick="leNewSel=\'' + leCandidates[i].id + '\';document.getElementById(\'lesel'+i+'\').checked=true;';
				str += 'drawElectionButtons()">';
				str += '<td class="lesel"><input ' + alltt[52] + ' type="radio" name="lecsel" onClick="leNewSel=\''+leCandidates[i].id;
				str += '\';drawElectionButtons()" id="lesel'+i+'" value="'+i+'" ';
				if	(leNewSel == leCandidates[i].id)
					str += 'checked="checked" ';
				str += '/></td';
			}
			str += '><td class="lecname">' + leCandidates[i].name + '</td><td class="lecvotes">' + leCandidates[i].nVotes + '</td>';
			str += '</tr>';
		}

		str += '</table>';
	}
	else
		str = '<p>Noone has applied for presidency yet.</p>';
	document.getElementById('lecdlist').innerHTML = str;
}

function alertElection(ei) {
	var str = 'Error\n';
	switch (ei) {
		case 0: str += 'You are no longer a member of the alliance.'; break;
		case 1: str += 'You no longer have the authorization to do that.'; break;
		case 2: str += "The player you voted for is no longer a candidate."; break
		case 3: str += "You are already a candidate for presidency."; break
		case 4: str += "You aren\'t a candidate for presidency anymore."; break
		case 5: str += "You missed the occasion to seize control of the alliance."; break;
		case 200: str += 'You are not allowed to use this page while in vacation mode.'; break;
		default: str += 'An unknown error has occured.'; break;
	}
	alert(str);
}


//--------------------------------------------------
// LISTINGS PAGE
//--------------------------------------------------


function	drawPlanetList()
{
	var	i, str, n, m;

	// Header
	str = '<h1>Alliance planets</h1>';

	// List header with page selector and search bar
	str += '<table cellspacing="0" cellpadding="0"><tr>';
	str += '<td class="lspsel1">Display <select ' + alltt[61] + ' name="lspspp" onChange="lsPPerPage=parseInt(options[selectedIndex].value, 10);drawPlanetList()">';
	for	(i=1;i<6;i++)
		str += '<option' + (i*5 == lsPPerPage ? ' selected="selected"' : '') + ' value="'+(i*5)+'">' + (i*5) + '</option>';
	str += '</select> planets / page</td><td class="lspsel1" id="lstpage">';
	str += '</td></tr><tr><td colspan="2" class="lspsearch">';
	str += 'Search for <label><input type="radio" ' + alltt[62] + ' + name="plstype" value="0" onClick="lsPSearchType=0;updateSearchPlanet()"';
	if	(lsPSearchType == 0)
		str += ' checked="checked"';
	str += ' /> planet</label> or <label><input type="radio" ' + alltt[63] + ' name="plstype" value="1" onClick="lsPSearchType=1;updateSearchPlanet()"';
	if	(lsPSearchType == 1)
		str += ' checked="checked"';
	str += ' /> player</label> <input type="text"  ' + alltt[64] + ' name="plsname" value="" onKeyUp="lsPSearchText=value;updateSearchPlanet()" ';
	str += 'id="plsname"></td></tr></table><hr/><div id="lstcontents">&nbsp;</div>';

	document.getElementById('alpmain').innerHTML = str;
	document.getElementById('plsname').value = lsPSearchText;

	drawPlanetListContents();
}

function	drawPlanetListContents()
{
	var	str, i, n, m;

	// Page handling
	n = lsPIndices.length;
	m = n % lsPPerPage;
	n = (n-m)/lsPPerPage + (m>0?1:0);
	if	(n > 0 && lsPPage >= n)
		lsPPage = n-1;

	// Planet list
	if	(lsPIndices.length == 0)
		str = '<center>&nbsp;<br/>No planets were found.<br/>&nbsp;</center>';
	else
	{
		str = '<table id="plnlist" class="list" cellspacing="0" cellpadding="0"><tr>';
		var	hdNames = ['Coordinates', 'Planet', 'Owner', 'Factories', 'Turrets'];
		var	hdCols = ['class="pcoord"', 'class="pname" colspan="2"', 'class="oname"', 'class="pcoord"', 'class="pcoord"'];
		var	ll = (alPrivileges[0] == 3) ? 5 : 3;
		for	(i=0;i<ll;i++)
		{
			str += '<th ' + alltt[70] + ' onClick="lsPSort=' + i + ';lsPSortDir=!lsPSortDir;updateSearchPlanet()" ';
			str += hdCols[i] + '>' + (lsPSort == i ? '<b>' : '') + hdNames[i];
			if	(lsPSort == i)
			{
				str += '</b><img src="'+staticurl+'/beta5/pics/';
				str += lsPSortDir ? "up" : "down";
				str += '_' + color + '.gif" alt="' + (lsPSortDir ? "up" : "down") + '" />';
			}
			str += '</th>';
		}
		str += '<td>&nbsp;</td></tr>';

		for	(i=lsPPerPage*lsPPage;i<lsPIndices.length&&i<lsPPerPage*(lsPPage+1);i++)
		{
			var	idx = lsPIndices[i];
			str += '<tr';
			if	(lsPlanets[idx].underAttack == 1)
				str += ' class="attack"';
			str += '><td class="pcoord">' + lsPlanets[idx].coords + '</td>';
			str += '<td class="picon"><img src="'+staticurl+'/beta5/pics/pl/s/' + lsPlanets[idx].id + '.png" alt="[' + lsPlanets[idx].id + ']" /></td>';
			str += '<td><a  ' + alltt[71] + ' href="planet?id=' + lsPlanets[idx].id + '">' + lsPlanets[idx].name + '</a></td>';
			str += '<td>' + (lsPlanets[idx].msOwner != "" ? ('<a ' + alltt[72] + ' href="message?a=c&ct=0&id='+lsPlanets[idx].msOwner+'">') : '');
			str += lsPlanets[idx].owner + (lsPlanets[idx].msOwner != "" ? '</a>' : '') + '</td>';
			if	(alPrivileges[0] == 3)
			{
				str += '<td class="pcoord">' + formatNumber(lsPlanets[idx].factories) + '</td>';
				str += '<td class="pcoord">' + formatNumber(lsPlanets[idx].turrets) + '</td>';
			}
		}
		str += '</table>';
	}

	document.getElementById('lstcontents').innerHTML = str;

	// Page selector
	str ='Page ';
	if	(n <= 1)
		str += '1 / 1';
	else
	{
		str += '<select name="lspnp"  ' + alltt[73] + ' onChange="lsPPage=parseInt(this.options[this.selectedIndex].value, 10);updateSearchPlanet()">';
		for	(i=0;i<n;i++)
			str += '<option' + (i==lsPPage ? ' selected="selected"' : '') + ' value="'+i+'">' + (i+1) + '</option>';
		str += '</select> / ' + n;
	}
	document.getElementById('lstpage').innerHTML = str;
}

function drawMemberList() {
	var	i, str, n, m;

	// Header
	str = '<h1>Alliance members</h1>';

	// List header with page selector and search bar
	str += '<table cellspacing="0" cellpadding="0"><tr>';
	str += '<td class="lspsel1">Display <select  ' + alltt[80] + ' name="lspspp" onChange="lsMPerPage=parseInt(this.options[this.selectedIndex].value,10);drawMemberList()">';
	for	(i=1;i<6;i++)
		str += '<option' + (i*5 == lsMPerPage ? ' selected="selected"' : '') + ' value="' + (i*5) + '">' + (i*5) + '</option>';
	str += '</select> members / page</td><td class="lspsel1" id="lstpage">';
	str += '</td></tr><tr><td colspan="2" class="lspsearch">';
	str += 'Search for player <input ' + alltt[81] + ' type="text" name="mlsname" value="" onKeyUp="lsMSearchText=value;updateSearchMembers()" ';
	str += 'id="mlsname"></td></tr></table><hr/><div id="lstcontents">&nbsp;</div><div id="lstcontrols">&nbsp;</div>';

	document.getElementById('alpmain').innerHTML = str;
	document.getElementById('mlsname').value = lsMSearchText;

	drawMemberListContents(false);
}

function drawMemberListContents(ao) {
	var	str = "", i, nPages, m;
	var	csel, kr, cr;

	// Page handling
	nPages = lsMIndices.length;
	m = nPages % lsMPerPage;
	nPages = (nPages - m) / lsMPerPage + (m > 0 ? 1 : 0);
	if (nPages > 0 && lsMPage >= nPages) {
		lsMPage = nPages - 1;
	}

	// Kick/Change rank
	csel = (lsMChange.length > 0 || lsMKick.length > 0);
	kr = '#' + lsMKick.join('#') + '#';
	cr = '#' + lsMChange.join('#') + '#';

	if (!ao) {
		// Page selector
		str ='Page ';
		if (nPages <= 1) {
			str += '1 / 1';
		} else {
			str += '<select ' + alltt[73] + ' name="lsmpbp" onChange="lsMPage=parseInt(this.options[this.selectedIndex].value, 10);updateSearchMembers()">';
			for (i = 0; i < nPages; i ++) {
				str += '<option' + (i == lsMPage ? ' selected="selected"' : '')
					+ ' value="' + i + '">' + (i + 1) + '</option>';
			}
			str += '</select> / ' + nPages;
		}
		document.getElementById('lstpage').innerHTML = str;
	}

	if (! ao) {
		if (nPages == 0 && !ao) {
			str  = '<center>&nbsp;<br/>No members were found.<br/>&nbsp;</center>';
		} else {
			// List length
			var lp;
			if (lsMPage == nPages - 1 && m > 0) {
				lp = m;
			} else {
				lp = lsMPerPage;
			}

			str = drawMemberListPanel(lsMPage * lsMPerPage, lp, csel, kr, cr)
		}
		document.getElementById('lstcontents').innerHTML = str;
	}

	if (!csel) {
		document.getElementById('lstcontrols').innerHTML = '&nbsp;';
		return;
	}

	// Action panel
	var sel = new Array(), ck = !lockedAlliances, cc = true;
	nPages = Math.min((lsMPage + 1) * lsMPerPage, lsMIndices.length);
	for (i = lsMPage * lsMPerPage; i < nPages; i ++) {
		if (!lsMembers[lsMIndices[i]].selected) {
			continue;
		}
		sel.push(lsMIndices[i]);
		ck = ck && (kr.indexOf('#'+lsMembers[lsMIndices[i]].rank+'#') != -1);
		cc = cc && (cr.indexOf('#'+lsMembers[lsMIndices[i]].rank+'#') != -1);
	}
	if (sel.length==0||!(ck||cc)) {
		document.getElementById('lstcontrols').innerHTML = '&nbsp;';
		return;
	}
	if (typeof lsMNewRank == "boolean") {
		lsMNewRank = lsMChange[0];
	}
	str = '<hr/><center>';
	if (!cc && ck) {
		str += '<input type="button" ' + alltt[90] + ' name="ksel" value="Kick" onClick="kickMembers();return false" /> selected members.';
	} else if (!ck && cc) {
		str += '<input type="button" ' + alltt[91] + ' name="csel" value="Change" onClick="changeMembers();return false" /> selected members\' ranks to ';
		str += '<select ' + alltt[92] + ' name="nrsel" onChange="lsMNewRank=options[selectedIndex].value">';
		for	(i=0;i<lsMChange.length;i++)
		{
			str += '<option value="' + lsMChange[i] + '"';
			if	(lsMNewRank == lsMChange[i])
				str += ' selected="selected"';
			str += '>' + getCookedRankText(lsMChange[i]) + '</option>';
		}
		str += '</select>.';
	} else {
		str += '<input type="button" ' + alltt[90] + ' name="ksel" value="Kick" onClick="kickMembers();return false" /> selected members or ';
		str += '<input type="button" ' + alltt[91] + ' name="csel" value="change" onClick="changeMembers();return false" /> their ranks to ';
		str += '<select ' + alltt[92] + ' name="nrsel" onChange="lsMNewRank=options[selectedIndex].value">';
		for (i=0;i<lsMChange.length;i++) {
			str += '<option value="' + lsMChange[i] + '"';
			if	(lsMNewRank == lsMChange[i])
				str += ' selected="selected"';
			str += '>' + getCookedRankText(lsMChange[i]) + '</option>';
		}
		str += '</select>.';
	}
	str += '</center>';
	document.getElementById('lstcontrols').innerHTML = str;
}

function getRankText(r) {
	if (r == "+") {
		return "(Leader)";
	} else if (r == '-') {
		return "<i>(Standard member)</i>";
	}
	return lsMRanks[r].name.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
}

function	confirmChangeRank(players)
{
	var	i, str = 'You are about to modify the following player';
	var	names = new Array();
	i = getCookedRankText(lsMNewRank).replace(/<[^>]+>/g, '');

	str += (players.length > 1 ? 's\'' : '\'s') + ' rank to ' + i + ':\n - ';
	for	(i=0;i<players.length;i++)
		names.push(lsMembers[players[i]].name);
	str += names.join('\n - ') + '\nPlease confirm.';
	return	confirm(str);
}

function	confirmKick(players)
{
	var	i, str = 'You are about to kick the following member';
	var	names = new Array();

	str += (players.length > 1 ? 's' : '') + ' from the alliance:\n - ';
	for	(i=0;i<players.length;i++)
		names.push(lsMembers[players[i]].name);
	str += names.join('\n - ') + '\nPlease confirm.';
	return	confirm(str);
}

function alertMemberAction(ei) {
	var str = 'Error\n';
	switch (ei) {
		case 0: str += 'You are no longer a member of the alliance.'; break;
		case 1: str += 'You no longer have the authorization to manage members.'; break;
		case 2: str += "Impossible to kick players in this game, the alliances are locked."; break;
		case 200: str += 'You are not allowed to manage members while in vacation mode.'; break;
		default: str += 'An unknown error has occured.'; break;
	}
	alert(str);
}

function drawMilitaryList() {
	var	i, str, n, m;

	// Header
	str = '<h1>Military status</h1>';

	// List header with page selector and search bar
	str += '<table cellspacing="0" cellpadding="0"><tr>';
	str += '<td class="lspsel1">Display <select ' + alltt[61] + ' name="lsaspp" onChange="lsAPerPage=parseInt(options[selectedIndex].value, 10);drawMilitaryList()">';
	for	(i=1;i<6;i++)
		str += '<option' + (i*5 == lsAPerPage ? ' selected="selected"' : '') + ' value="'+(i*5)+'">' + (i*5) + '</option>';
	str += '</select> planets / page</td><td class="lspsel1" id="lstpage">';
	str += '</td></tr><tr><td colspan="2" class="lspsearch">';
	str += 'Search for ';
	if	(alPrivileges[0] > 1)
	{
		str += '<label><input ' + alltt[62] + ' type="radio" name="alstype" value="0" onClick="lsASearchType=0;updateSearchMilitary()"';
		if	(lsASearchType == 0)
			str += ' checked="checked"';
		str += ' /> planet</label> or <label><input ' + alltt[63] + ' type="radio" name="alstype" value="1" onClick="lsASearchType=1;updateSearchMilitary()"';
		if	(lsASearchType == 1)
			str += ' checked="checked"';
		str += ' /> player</label>';
	}
	else
		str += 'planet';
	str += ' <input type="text" ' + alltt[64] + ' name="alsname" value="" onKeyUp="lsASearchText=value;updateSearchMilitary()" ';
	str += 'id="alsname"></td></tr></table><hr/><div id="lstcontents">&nbsp;</div>';

	document.getElementById('alpmain').innerHTML = str;
	document.getElementById('alsname').value = lsASearchText;

	drawMilitaryListContents();
}

function drawMilitaryListContents() {
	var	str, i, n, m;

	// Page handling
	n = lsAIndices.length;
	m = n % lsAPerPage;
	n = (n-m)/lsAPerPage + (m>0?1:0);
	if	(n > 0 && lsAPage >= n)
		lsAPage = n-1;

	// Planet list
	if	(lsAIndices.length == 0)
		str = '<center>&nbsp;<br/>No planets are currently under attack.<br/>&nbsp;</center>';
	else
	{
		str = '<table id="plnlist" class="list" cellspacing="0" cellpadding="0"><tr>';
		var	hdNames = ['Coordinates', 'Planet', 'Owner', 'Def. Power', 'Att. Power'];
		var	hdCols = ['class="pcoord"', 'class="pname" colspan="2"', 'class="oname"', 'class="pcoord"', 'class="pcoord"'];
		for	(i=0;i<5;i++)
		{
			if	(alPrivileges[0] < 2 && i == 2)
				continue;
			str += '<th ' + alltt[70] + ' onClick="lsASort=' + i + ';lsASortDir=!lsASortDir;updateSearchMilitary()" ';
			str += hdCols[i] + '>' + (lsASort == i ? '<b>' : '') + hdNames[i];
			if	(lsASort == i)
			{
				str += '</b><img src="'+staticurl+'/beta5/pics/';
				str += lsASortDir ? "up" : "down";
				str += '_' + color + '.gif" alt="' + (lsASortDir ? "up" : "down") + '" />';
			}
			str += '</th>';
		}
		str += '<td>&nbsp;</td></tr>';

		for	(i=lsAPerPage*lsAPage;i<lsAIndices.length&&i<lsAPerPage*(lsAPage+1);i++)
		{
			var	idx = lsAIndices[i];
			str += '<tr';
			if	(lsAttacks[idx].defPower >= 3 * lsAttacks[idx].attPower)
				str += ' class="defence"';
			else if	(lsAttacks[idx].attPower >= 3* lsAttacks[idx].defPower)
				str += ' class="attack"';
			str += '><td class="pcoord">(' + lsAttacks[idx].coords + ')</td>';
			str += '<td class="picon"><img src="'+staticurl+'/beta5/pics/pl/s/' + lsAttacks[idx].planetId + '.png" alt="[' + lsAttacks[idx].planetId + ']" /></td>';
			str += '<td><a  ' + alltt[71] + ' href="planet?id=' + lsAttacks[idx].planetId + '">' + lsAttacks[idx].planetName + '</a></td>';
			if	(alPrivileges[0] > 1)
			{
				str += '<td>' + (lsAttacks[idx].ownerId != "-1" ? ('<a  ' + alltt[72] + ' href="message?a=c&ct=0&id='+lsAttacks[idx].ownerId+'">') : '');
				str += lsAttacks[idx].ownerName + (lsAttacks[idx].ownerId != "-1" ? '</a>' : '') + '</td>';
			}
			if	(lsAttacks[idx].defPower != "")
			{
				str += '<td class="afriendly">' + formatNumber(lsAttacks[idx].defPower) + '</td>';
				str += '<td class="aenemy">' + formatNumber(lsAttacks[idx].attPower) + '</td>';
			}
			else
				str += '<td class="afriendly">?</td><td class="aenemy">?</td>';

			if	(lsAttacks[idx].defenders.length > 0)
			{
				str += '<tr class="deflist"><td>&nbsp;</td><td colspan="' + (alPrivileges[0] > 1 ? 5 : 4) + '">Defenders: ';
				str += lsAttacks[idx].defenders.join(', ') + '</td></tr>';
			}
			if	(lsAttacks[idx].attackers.length > 0)
			{
				str += '<tr class="attlist"><td>&nbsp;</td><td colspan="' + (alPrivileges[0] > 1 ? 5 : 4) + '">Attackers: ';
				str += lsAttacks[idx].attackers.join(', ') + '</td></tr>';
			}
		}
		str += '</table>';
	}

	document.getElementById('lstcontents').innerHTML = str;

	// Page selector
	str ='Page ';
	if	(n <= 1)
		str += '1 / 1';
	else
	{
		str += '<select ' + alltt[73] + ' name="lspnp" onChange="lsPPage=parseInt(this.options[this.selectedIndex].value, 10);updateSearchPlanet()">';
		for	(i=0;i<n;i++)
			str += '<option' + (i==lsPPage ? ' selected="selected"' : '') + ' value="'+i+'">' + (i+1) + '</option>';
		str += '</select> / ' + n;
	}
	document.getElementById('lstpage').innerHTML = str;
}


//--------------------------------------------------
// PENDING REQUESTS PAGE
//--------------------------------------------------

function	drawPendingPage()
{
	if	(amPage != 'Pending')
		return;

	var	str = '<h1>Pending Requests</h1>';
	if	(pRequests.length == 0)
		str += '<p>There are no players requesting to join <b>['+alTag+']</b> at this time.</p>';
	else
	{
		str += '<table cellspacing="0" cellpadding="0" class="prequests">';
		str += '<tr><td class="prblk">&nbsp;</td><th class="prsel">(S)</th><th class="prplayer">Player</th></tr>';
		var	i;
		for	(i=0;i<pRequests.length;i++)
		{
			str += '<tr><td>&nbsp;</td><td class="prsel"><input ' + alltt[110] + ' type="checkbox" name="selp" id="selp'+i+'" ';
			str += 'onClick="pRequests['+i+'].selected=!pRequests['+i+'].selected;"';
			if	(pRequests[i].selected)
				str += ' checked="checked"';
			str += '/></td><td><a href="message?a=c&ct=0&id=' + pRequests[i].id + '">';
			str += pRequests[i].player + '</a></td></tr>';
		}
		str += '<tr><td>&nbsp;</td><td colspan="2" class="prbut">';
		str += '<input type="button" ' + alltt[111] + ' value="Accept" onClick="acceptRequests();return false" /> ';
		str += '<input type="button" ' + alltt[112] + ' value="Reject" onClick="rejectRequests();return false" /> ';
		str += '</td></tr></table>';
	}

	document.getElementById('alpmain').innerHTML = str;
}

function alertRequests(acc) {
	alert('You must select at least one player to ' + (acc ? "accept into" : "reject from") + ' the alliance.');
}

function confirmRequests(acc, plu) {
	var	str = 'Are you sure you want to ' + (acc ? "accept" : "reject");
	str += ' th' + (plu ? 'ese' : 'is') + ' player' + (plu ? 's\'' : '\'s') + ' request' + (plu ? 's' : '');
	str += ' to join [' + alTag + ']?';
	return	confirm(str);
}

function alertPending(ei) {
	var str = 'Error\n';
	switch (ei) {
		case 0: str += 'You are no longer a member of the alliance.'; break;
		case 1: str += 'You no longer have the authorization to manage pending requests.'; break;
		case 2: str += 'The alliance has reached its maximal capacity.'; break;
		case 3: str += "You can't manage requests in this game, the alliances are locked."; break;
		case 200: str += 'You are not allowed to manage pending requests while in vacation mode.'; break;
		default: str += 'An unknown error has occured.'; break;
	}
	alert(str);
}


//--------------------------------------------------
// FORUMS ADMINISTRATION PAGE
//--------------------------------------------------

function        drawForumList()
{
	var     str = '<table cellspacing="0" cellpadding="0">';
	str += '<tr><td class="div2" id="fattl"><h1>Alliance Forums</h1><td id="crforum">&nbsp;</td></tr>';
	str += '<tr><td colspan="2" id="falist">&nbsp;</td></tr></table>';
	document.getElementById('alpmain').innerHTML = str;
	if      (faForums.length < 30)
		drawCreateForumLink();
	if      (faForums.length == 0)
		drawTextNoForums();
	else
		drawRealForumList();
}

function	drawCreateForumLink()
{
	var	str = '<a href="#" ' + alltt[120] + ' onClick="createForum();return false">';
	str += 'Create a forum</a>';
	document.getElementById('crforum').innerHTML = str;
}

function	drawTextNoForums()
{
	document.getElementById('falist').innerHTML = '<p>No forums have been defined for the alliance.</p>';
}

function	drawRealForumList()
{
	var	i, str = '<table class="list" cellspacing="0" cellpadding="0" id="fatbl">';

	str += '<tr><th class="faname">Name &amp; description</th><th class="fauserpost">New threads</th></tr>';
	for	(i=0;i<faForums.length;i++)
	{
		str += '<tr>';
		str += '<td class="faname"><b><u>' + faForums[i].name.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;') + '</u></b> (';
		str += '<a ' + alltt[130] + ' href="#" onClick="editForum(' + faForums[i].id + ');return false">Edit</a> - ';
		if	(i > 0)
			str += '<a ' + alltt[131] + ' href="#" onClick="moveForum(' + faForums[i].id + ',true);return false">Move up</a> - ';
		if	(i < faForums.length - 1)
			str += '<a ' + alltt[132] + ' href="#" onClick="moveForum(' + faForums[i].id + ',false);return false">Move down</a> - ';
		str += '<a ' + alltt[133] + ' href="#" onClick="deleteForum(' + faForums[i].id + ');return false">Delete</a>)';
		if	(faForums[i].description != '')
			str += '<br/><p>' + faForums[i].description.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\n/g,"<br/>") + '</p>';
		str += '</td><td class="fauserpost">';
		if	(faForums[i].userPost)
			str += 'Everyone';
		else
			str += 'Moderators only';
		str += '</td></tr>';
	}

	str += '</table>';
	document.getElementById('falist').innerHTML = str;
}

function	cheatAlert()
{
	alert('Possible cheating detected.');
}

function	confirmDeleteForum(name)
{
	var	str = 'You are about to delete the following forum:\n' + name + '\n';
	str += 'The forum\'s topics will be lost and you will not be able to recover them.\nPlease confirm.';
	return	confirm(str);
}

function	alertMaximumFCount()
{
	alert('The alliance has reached its maximum possible count of forums.\nYou will be taken back to the list.');
}

function	drawForumEditor()
{
	document.getElementById('falist').innerHTML = '&nbsp;';

	var	str;
	if	(faEditing.id)
	{
		f = forumById(faEditing.id);
		str = "'" + f.name.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;') + "' forum";
	}
	else
		str = "Create a forum";
	document.getElementById('fattl').innerHTML = '<h1>' + str + '</h1>';

	str  = '<table cellspacing="0" cellpadding="0" id="feditor">';
	str += '<tr><th class="edheader">Forum name:</th><td><input ' + alltt[140] + ' type="text" name="fedit" id="fname" size="48" maxlength="64" value="';
	str += faEditing.name.replace(/"/g, '&quot;') + '" onKeyUp="faEditing.name=value.replace(/&lt;/g, \'<\').replace(/&gt;/g, \'>\').replace(/&amp;/g, \'&\');';
	str += 'updateFEditor()" onChange="faEditing.name=value;updateFEditor()" />';
	str += '</td></tr>';
	str += '<tr><th class="edheader">New threads:</th><td>';
	str += '<label><input ' + alltt[141] + ' type="radio" name="nt" value="1" onClick="faEditing.userPost=true;updateFEditor()" ';
	if	(faEditing.userPost)
		str += 'checked="checked" ';
	str += '/> Everyone</label> <label><input ' + alltt[142] + ' type="radio" name="nt" value="0" onClick="faEditing.userPost=false;updateFEditor()" ';
	if	(!faEditing.userPost)
		str += 'checked="checked" ';
	str += '/> Moderators only</label></td></tr>';
	if	(!faEditing.id)
		str += '<tr><th class="edheader">Initial position:</th><td  ' + alltt[143] + ' id="faeipos">&nbsp;</td></tr>';
	str += '<tr><th class="edheader">Description:</th><td><textarea ' + alltt[144] + ' name="fdesc" onKeyUp="faEditing.description=';
	str += 'value.replace(/&lt;/g, \'<\').replace(/&gt;/g, \'>\').replace(/&amp;/g, \'&\');updateFEditor()"';
	str += ' onChange="faEditing.description=value;updateFEditor()"';
	str += ' rows="10" cols="48">' + faEditing.description.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;') + '</textarea></td></tr>';
	str += '<td id="febut" colspan="2"><input type="button" name="feok" value="Ok" id="feok" onClick="forumEditOk();return false" ' + alltt[145] + ' />';
	str += '&nbsp;<input type="button" name="feccl" value="Cancel" onClick="forumEditCancel();return false"  ' + alltt[146] + ' /></td></tr>';
	str += '<tr><td colspan="2"><h3>Forum access</h3></td></tr>';
	str += '<tr><td colspan="2" id="faeaccess"><p>(Loading access list data ...)</p></td></tr>';

	str += '</table>';
	document.getElementById('falist').innerHTML = str;
	document.getElementById('feok').disabled = true;
	if	(!faEditing.id)
		updateFPosSelector();
}

function	updateFPosSelector()
{
	var	i, str = '<select name="fanewpos" onChange="faNewPos=this.options[this.selectedIndex].value">';
	str += '<option value="-1">At the beginning</option>';
	for	(i=0;i<faForums.length;i++)
	{
		str += '<option value="' + faForums[i].id + '"';
		if	(faNewPos == faForums[i].id)
			str += ' selected="selected"';
		str += '>After ' + faForums[i].name + '</option>';
	}
	str += '</select>';
	document.getElementById('faeipos').innerHTML = str;
}

function	drawFAccessManager()
{
	var	lnp = new Array(), lmd = new Array(), lrd = new Array(), ml, i, sc=0;
	for	(i=0;i<faAccess.length;i++)
	{
		if	(faAccess[i].priv == 0)
			lnp.push(i);
		else if	(faAccess[i].priv == 1)
			lrd.push(i);
		else
			lmd.push(i);
	}
	ml = Math.max(lnp.length, Math.max(lmd.length, lrd.length));

	var	n, str = '<table cellspacing="0" cellpadding="0" id="faeacl">';
	str += '<tr><th colspan="2">No access</th><th colspan="2">Standard access</th><th colspan="2">Moderators</th></tr>';
	for	(i=0;i<ml;i++)
	{
		str += '<tr>';
		if	(i<lnp.length)
		{
			n = faAccess[lnp[i]].name == '-' ? '<i>(standard members)</i>' : faAccess[lnp[i]].name;
			str += '<td class="faaepsel"><input ' + alltt[150] + ' type="checkbox" name="nrs" value="'+faAccess[lnp[i]].id+'" onClick="faAccess['+lnp[i]+']';
			str += '.selected=!faAccess['+lnp[i]+'].selected;updateFAccessManager()"' + (faAccess[lnp[i]].selected ? ' checked="checked"' : '');
			str += ' /></td><td>' + n + '</td>';
		}
		else
			str += '<td colspan="2">&nbsp;</td>';
		if	(i<lrd.length)
		{
			n = faAccess[lrd[i]].name == '-' ? '<i>(standard members)</i>' : faAccess[lrd[i]].name;
			str += '<td class="faaepsel"><input ' + alltt[150] + ' type="checkbox" name="rds" value="'+faAccess[lrd[i]].id+'" onClick="faAccess['+lrd[i]+']';
			str += '.selected=!faAccess['+lrd[i]+'].selected;updateFAccessManager()"' + (faAccess[lrd[i]].selected ? ' checked="checked"' : '');
			str += ' /></td><td>' + n + '</td>';
		}
		else
			str += '<td colspan="2">&nbsp;</td>';
		if	(i<lmd.length)
		{
			n = faAccess[lmd[i]].name == '-' ? '<i>(standard members)</i>' : faAccess[lmd[i]].name;
			str += '<td class="faaepsel">';
			if	(faAccess[lmd[i]].priv == 2)
			{
				str += '<input ' + alltt[150] + ' type="checkbox" name="mds" value="'+faAccess[lmd[i]].id+'" onClick="faAccess['+lmd[i]+']';
				str += '.selected=!faAccess['+lmd[i]+'].selected;updateFAccessManager()" '+ (faAccess[lmd[i]].selected ? ' checked="checked"' : '') + '/>';
			}
			else
			{
				str += '&nbsp';
				n = '<b>'+n+'</b>';
			}
			str += '</td><td>' + n + '</td>';
		}
		else
			str += '<td colspan="2">&nbsp;</td>';
		str += '</tr>';
	}
	str += '<tr><td colspan="2" id="faeab0">&nbsp;</td><td colspan="2" id="faeab1">&nbsp;</td><td colspan="2" id="faeab2">&nbsp;</td></tr>';
	str += '</table>';
	document.getElementById('faeaccess').innerHTML = str;

	updateFAccessManager();
}

function	updateFAccessManager()
{
	var	i, sc = 0;
	for	(i=0;i<faAccess.length;i++)
	{
		if	(faAccess[i].selected && faAccess[i].priv < 3)
			sc ++;
	}
	if	(sc == 0)
	{
		for	(i=0;i<3;i++)
			document.getElementById('faeab'+i).innerHTML = '&nbsp;';
		return;
	}

	var	str, btn = ['Remove access', 'Give standard access', 'Make moderators'];
	for	(i=0;i<3;i++)
	{
		str = '<input ' + alltt[160] + ' type="button" name="sfea'+i+'" value="'+btn[i]+'" onClick="setFAccessLevel(' + i + ');return false" />';
		document.getElementById('faeab'+i).innerHTML = str;
	}
}

function alertForum(ei) {
	var str = 'Error\n';
	switch (ei) {
		case 0: str += 'You are no longer a member of this alliance.'; break;
		case 1: str += 'The name of this forum is too short.'; break;
		case 2: str += 'A forum with the same name already exists.'; break;
		case 3: str += 'This forum has been deleted while you were editing it.'; break;
		case 4: str += 'You aren\'t a forum administrator anymore.'; break;
		case 5: str += 'The alliance already has 30 forums.'; break;
		case 6: str += 'Probable bug: the forum to insert after wasn\'t transmitted.'; break;
		case 7: str += 'A server error has occured.'; break;
		case 8: str += 'This forum has already been deleted.'; break;
		case 200: str += "You can\'t modify an alliance\'s forums while in vacation mode."; break;
		default: str += 'An unknown error has happened.'; break;
	}
	alert(str);
}

function alertForumChanged() {
	alert('The forum you are editing at this moment has been modified!');
}

function alertForumDeleted() {
	alert('The forum you are editing at this moment has been deleted!');
}


//--------------------------------------------------
// RANKS ADMINISTRATION PAGE
//--------------------------------------------------

function	drawRanksList()
{
	var	i, str = '<table cellspacing="0" cellpadding="0"><tr>';
	str += '<td><h1>Ranks Administration</h1></td><td id="crforum"><a ' + alltt[170] + ' href="#" onClick="createRank();return false">Create a rank</a></td></tr>';
	str += '<tr><td colspan="2"><table class="list" cellspacing="0" cellpadding="0" id="ratbl">';
	str += '<tr><td class="rkshow">&nbsp;</td><th class="rkname">Rank name</th><th class="rkact">Actions</th><th class="rkmembers">Members</th></tr>';
	str += '<tr><th colspan="4"><hr/></th></tr>';
	for	(i=0;i<raRanks.length;i++)
	{
		str += '<tr><td class="rkshow"><a ' + alltt[171] + ' href="#" onClick="showRank('+i+');return false">[ ';
		str += raRanks[i].open ? "-" : "+";
		var n = (raRanks[i].name == "-" ? '<i>(Standard member)</i>' : raRanks[i].name.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;'));
		str += ' ]</a></td><td class="rkname"><u>' + n + '</u>';
		if	(raRanks[i].open)
			str += '<p>' + drawRankDetails(raRanks[i]) + '</p>';
		str += '</td><td class="rkact"><a ' + alltt[172] + ' href="#" onClick="editRank('+i+');return false">Edit</a>';
		if	(raRanks[i].name != "-")
			str += ' - <a  ' + alltt[173] + ' href="#" onClick="deleteRank('+i+');return false">Delete</a>';
		str += '</td><td class="rkmembers">' + raRanks[i].players + '</td></tr>';
	}
	str += '</table></td></tr></table>';

	document.getElementById('alpmain').innerHTML = str;
}

function drawRankDetails(r) {
	var	a = new Array();
	if (r.list == "1") {
		a.push("Can access the player list.");
	} else if (r.list == "2") {
		a.push("Can access the planet list.");
	} else if (r.list == "3") {
		a.push("Can access the detailed planet list.");
	}

	if (r.attacks) {
		a.push("Has access to the military situation display.");
	}

	var str;
	switch (r.techTrade) {
		case 0: str = ''; break;
		case 1: str = 'Can submit technology list'; break;
		case 2: str = 'Can submit technology list and requests'; break;
		case 3: str = 'Has access to the alliance\'s technology list'; break;
		case 4: str = 'Can manage the alliance\'s technology list and orders'; break;
	}
	if (str != '') {
		a.push(str);
	}

	if (r.accept && !lockedAlliances) {
		a.push('Can accept new members into the alliance.');
	}
	if (r.canKick && !lockedAlliances) {
		if (r.ranksKick.length == raRanks.length - 1) {
			a.push('Can kick members regardless of their ranks.');
		} else {
			var	str, i, r2;
			str = 'Can kick members with the ';
			for (i = 0; i < r.ranksKick.length; i ++) {
				r2 = rankById(r.ranksKick[i]);
				if (!r2) {
					continue;
				}
				if (i > 0 && i < r.ranksKick.length - 1) {
					str += ', ';
				} else if (i > 0) {
					str += ' or ';
				}
				str += '<b>' + (r2.name == '-' ? 'Standard member' : r2.name.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')) + '</b>';
			}
			a.push(str + ' rank' + (r.ranksKick.length > 1 ? 's' : '') + '.');
		}
	}
	if (r.canSet) {
		if (r.ranksChange.length == raRanks.length - 1) {
			a.push('Can modify rank for all members.');
		} else {
			var	str, i, r2;
			str = 'Can modify rank for members with the ';
			for (i = 0; i < r.ranksChange.length; i ++) {
				r2 = rankById(r.ranksChange[i]);
				if (!r2) {
					continue;
				}
				if (i>0&&i<r.ranksChange.length - 1) {
					str += ', ';
				} else if (i > 0) {
					str += ' or ';
				}
				str += '<b>' + (r2.name == '-' ? 'Standard member' : r2.name.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')) + '</b>';
			}
			a.push(str + ' rank' + (r.ranksChange.length > 1 ? 's' : '') + '.');
		}
	}
	if (r.forumAdmin) {
		a.push('Can administrate the forums.');
	} else {
		if (r.fRead.length > 0) {
			if (r.fRead.length == raForums.length) {
				a.push('Can access all forums');
			} else {
				var	str, i, f;
				str = 'Can access the following forum'+(r.fRead.length>1?'s':'')+': ';
				for (i = 0; i < r.fRead.length; i ++) {
					f = raForumById(r.fRead[i]);
					if (!f) {
						continue;
					}
					if (i > 0 && i < r.fRead.length - 1) {
						str += ', ';
					} else if (i>0) {
						str += ' and ';
					}
					str += '<b>'+f.name.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')+'</b>';
				}
				a.push(str + '.');
			}
		}
		if (r.fMod.length > 0) {
			if (r.fMod.length == raForums.length) {
				a.push('Can moderate all forums');
			} else {
				var	str, i, f;
				str = 'Can moderate the following forum'+(r.fMod.length>1?'s':'')+': ';
				for (i = 0; i < r.fMod.length; i ++) {
					f = raForumById(r.fMod[i]);
					if (!f) {
						continue;
					}
					if (i > 0 && i < r.fMod.length - 1) {
						str += ', ';
					} else if (i>0) {
						str += ' and ';
					}
					str += '<b>'+f.name.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')+'</b>';
				}
				a.push(str + '.');
			}
		}
	}
	if (r.diplContact) {
		a.push('Is a diplomatic contact for the alliance.');
	}
	if (isDemocracy && !lockedAlliances && (r.canVote || r.canditate)) {
		var	str = 'Can ';
		if (r.canVote) {
			str += 'vote to elect the leader';
		}
		if (r.candidate) {
			str += (r.canVote ? ' and ' : '') + 'run for presidency of the alliance';
		}
		str += '.';
		a.push(str);
	}

	return	a.join('<br/>');
}


function displayRankEditor() {
	var	i, str = '<table cellspacing="0" cellpadding="0" id="rankedit"><tr>';
	str += '<td colspan="2"><h1>' + (raEditing.id ? 'Edit a Rank' : 'Create a Rank') + '</h1></td></tr>';

	str += '<tr><th>Designation:</th><td>'
		+ (raEditing.name != '-'
			?  ('<input ' + alltt[180] + ' type="text" name="rname" value="'
				+ raEditing.name.replace(/"/g, '&quot;')
				+ '" size="33" maxlength="32" onChange="raEditing.name=value;updateREditor()" '
				+ 'onKeyUp="raEditing.name=value;updateREditor()" />')
			: '<i>Standard member</i>') 
		+ '</td></tr>';

	str += '<tr><th>List access:</th><td><select  ' + alltt[181] + ' name="rlist" onChange="raEditing.list=options[selectedIndex].value;drawRankMgmt();updateREditor()">';
	var	lacc = ['No access', 'Member list', 'Planet list', 'Detailed planet list'];
	for	(i=0;i<4;i++)
	{
		str += '<option value="'+i+'"';
		if	(raEditing.list == i.toString())
			str += ' selected="selected"';
		str += '>' + lacc[i] + '</option>';
	}
	str += '</select></td></tr>';
	str += '<tr><td>&nbsp;</td><td><input ' + alltt[182] + ' type="checkbox" name="rmil" value="1" onClick="raEditing.attacks=!raEditing.attacks;updateREditor()"';
	if	(raEditing.attacks)
		str += ' checked="checked"';
	str += ' /> List of planets under attack</td></tr>';

	// Tech trading
	if (techTrade != 'N') {
		var ttMode = ['No access', 'Submit list', '', 'View list', 'Manage orders'];
		if (techTrade == 'R') {
			ttMode[2] = 'Submit list &amp; requests';
		}
		str += '<tr><th>Tech. trading:</th><td><select name="ttaccess" onChange="raEditing.techTrade='
			+ 'parseInt(this.options[this.selectedIndex].value, 10);drawRankMgmt();updateREditor()">';
		for (i = 0; i < ttMode.length; i ++) {
			if (ttMode[i] == '') {
				continue;
			}
			str += '<option value="' + i + '"' + (raEditing.techTrade == i ? ' selected="selected"' : '')
				+ '>' + ttMode[i] + '</option>';
		}
		str += '</select></td></tr>';
	}

	str += '<tr><th>Diplomatic contact:</th><td>';
	str += '<label><input  ' + alltt[183] + ' type="radio" name="rdipl" value="1" onClick="raEditing.diplContact=true;updateREditor()"'+(raEditing.diplContact?' checked="checked"':'');
	str +=' /> Yes</label> <label><input ' + alltt[184] + ' type="radio" name="rdipl" value="0" onClick="raEditing.diplContact=false;updateREditor()"';
	str += (raEditing.diplContact?'':' checked="checked"')+' /> No</label></td></tr>';

	if (!lockedAlliances) {
		str += '<tr><th>Can vote (*):</th><td>'
			+ '<label><input ' + alltt[185] + ' type="radio" name="rvote" value="1" '
			+ 'onClick="raEditing.canVote=true;updateREditor()"'
			+ (raEditing.canVote ? ' checked="checked"' : '') + ' /> Yes</label> '
			+ '<label><input ' + alltt[186] + 'type="radio" name="rvote" value="0" '
			+ 'onClick="raEditing.canVote=false;updateREditor()"'
			+ (raEditing.canVote ? '' : ' checked="checked"') +' /> No</label>'
			+ '</td></tr><tr><th>Can apply for presidency (*):</th><td>'
			+ '<label><input  ' + alltt[187] + ' type="radio" name="rcnd" value="1" '
			+ 'onClick="raEditing.candidate=true;updateREditor()"'
			+ (raEditing.candidate ? ' checked="checked"' : '') + ' /> Yes</label> <label><input '
			+ alltt[188] + ' type="radio" name="rcnd" value="0"'
			+ ' onClick="raEditing.candidate=false;updateREditor()"'
			+ (raEditing.candidate ? '' : ' checked="checked"') + ' /> No</label></td></tr>'
			+ '<tr><td colspan="2">(*) These privileges only apply if the alliance is democratic.</td></tr>';
	}

	str += '<tr><td colspan="2"><h3>Member management:</h3></td></tr>';
	if (!lockedAlliances) {
		str += '<tr><th>Accept pending requests:</th><td>';
		str += '<label><input ' + alltt[189] + ' type="radio" name="racc" value="1" onClick="raEditing.accept=true;updateREditor()"'+(raEditing.accept?' checked="checked"':'')+' /> Yes</label> ';
		str += '<label><input ' + alltt[190] + ' type="radio" name="racc" value="0" onClick="raEditing.accept=false;updateREditor()"'+(raEditing.accept?'':' checked="checked"')+' /> No</label>';
		str += '</td></tr>';
		str += '<tr><th>Kick members:</th><td id="radmkick">&nbsp;</td></tr>'
	}
	str += '<tr><th>Change ranks:</th><td id="radmchange">&nbsp;</td></tr>'

	str += '<tr><td colspan="2"><h3>Forum access:</h3></td></tr>';
	str += '<tr><th>Forum administrator:</th><td>';
	str += '<label><input ' + alltt[191] + ' type="radio" name="rfadm" value="1" onClick="raEditing.forumAdmin=true;updateREForums();updateREditor()"';
	str += (raEditing.forumAdmin?' checked="checked"':'')+' />';
	str += ' Yes</label> <label><input ' + alltt[192] + ' type="radio" name="rfadm" value="0" onClick="raEditing.forumAdmin=false;updateREForums();updateREditor()"';
	str += (raEditing.forumAdmin?'':' checked="checked"')+' /> No</label>';
	str += '</td></tr>';
	str += '<tr><th id="refperm">&nbsp;</th><td id="radmforums">&nbsp;</td></tr>';

	str += '<tr><td colspan="2">&nbsp;</td></tr>';
	str += '<tr><td colspan="2" class="rebut"><input ' + alltt[193] + ' type="button" value="Ok" name="reok" id="reok" onClick="rankEditOk();return false" />';
	str += ' <input ' + alltt[194] + ' type="button" value="Cancel" name="recancel" onClick="rankEditCancel();return false" />';
	str += '</td></tr>';

	str += '</table>';
	document.getElementById('alpmain').innerHTML = str;
	document.getElementById('reok').disabled = true;
	drawRankMgmt();
	updateREForums();
}


function	drawRankMgmt() {
	if (raEditing.list == 0) {
		if (!lockedAlliances) {
			document.getElementById('radmkick').innerHTML = 'Not available without list access.';
		}
		document.getElementById('radmchange').innerHTML = 'Not available without list access.';
		return;
	}

	var str;
	if (!lockedAlliances) {
		str = '<label><input ' + alltt[195] + ' type="radio" name="rekick" value="0" onClick="raEditing.canKick=0;drawKickList();updateREditor()" ';
		str += (raEditing.canKick == 0 ? ' checked="checked"' : '') + ' /> No</label> ';
		str += '<label><input ' + alltt[196] + ' type="radio" name="rekick" value="2" onClick="raEditing.canKick=2;drawKickList();updateREditor()" ';
		str += (raEditing.canKick == 2 ? ' checked="checked"' : '') + ' /> Yes</label> ';
		if	(raRanks.length > 1 || !raEditing.id)
		{
			str += '<label><input ' + alltt[197] + ' type="radio" name="rekick" value="1" onClick="raEditing.canKick=1;drawKickList();updateREditor()" ';
			str += (raEditing.canKick == 1 ? ' checked="checked"' : '') + ' /> Only specific ranks</label><span id="rekicklist"> </span>';
		}
		document.getElementById('radmkick').innerHTML = str;
		drawKickList();
	}

	str = '<label><input ' + alltt[198] + ' type="radio" name="rechange" value="0" onClick="raEditing.canSet=0;drawChangeList();updateREditor()" ';
	str += (raEditing.canSet == 0 ? ' checked="checked"' : '') + ' /> No</label> ';
	str += '<label><input ' + alltt[199] + ' type="radio" name="rechange" value="2" onClick="raEditing.canSet=2;drawChangeList();updateREditor()" ';
	str += (raEditing.canSet == 2 ? ' checked="checked"' : '') + ' /> Yes</label> ';
	if	(raRanks.length > 1 || !raEditing.id)
	{
		str += '<label><input ' + alltt[200] + ' type="radio" name="rechange" value="1" onClick="raEditing.canSet=1;drawChangeList();updateREditor()" ';
		str += (raEditing.canSet == 1 ? ' checked="checked"' : '') + ' /> Only specific ranks</label><span id="rechangelist"> </span>';
	}
	document.getElementById('radmchange').innerHTML = str;
	drawChangeList();
}

function	drawChangeList()
{
	drawRERankList(raEditing.canSet, raEditing.ranksChange, 'Change', 'change', 'Standard member');
}

function	drawKickList()
{
	drawRERankList(raEditing.canKick, raEditing.ranksKick, 'Kick', 'kick', 'Standard member');
}

function	updateREForums()
{
	if	(raEditing.forumAdmin)
	{
		document.getElementById('refperm').innerHTML = document.getElementById('radmforums').innerHTML = '&nbsp;';
		return;
	}
	else if	(raForums.length == 0)
	{
		document.getElementById('refperm').innerHTML = 'Forum access:';
		document.getElementById('radmforums').innerHTML = 'No forums have been created yet.';
		return;
	}

	var	i, str = '<table cellspacing="0" cellpadding="0" class="reflist">';
	var	rl = '!' + raEditing.fRead.join('!') + '!';
	var	ml = '!' + raEditing.fMod.join('!') + '!';
	for	(i=0;i<raForums.length;i++)
	{
		var	isMod = (ml.indexOf('!' + raForums[i].id + '!') != -1);
		var	isRd = !isMod && (rl.indexOf('!' + raForums[i].id + '!') != -1);
		str += '<tr><td><b>' + raForums[i].name.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;') + '</b></td><td>';
		str += '<label><input ' + alltt[201] + ' type="radio" name="facc' + i + '" value="0" onClick="rankSetForum('+i+',0);updateREditor()"';
		str += (isMod || isRd) ? '' : ' checked="checked"';
		str += ' /> No access</label>';
		str += '<label><input ' + alltt[202] + ' type="radio" name="facc' + i + '" value="1" onClick="rankSetForum('+i+',1);updateREditor()"';
		str += (isRd ? ' checked="checked"' : '') + ' /> User</label>';
		str += '<label><input ' + alltt[203] + ' type="radio" name="facc' + i + '" value="2" onClick="rankSetForum('+i+',2);updateREditor()"';
		str += (isMod ? ' checked="checked"' : '') + ' /> Moderator</label>';
		str += '</td></tr>';
	}
	str += '</table>';
	document.getElementById('refperm').innerHTML = 'Forum access:';
	document.getElementById('radmforums').innerHTML = str;
}


function	confirmDeleteRank(name)
{
	return	confirm('You are about to delete the ' + name + ' rank.\nPlease confirm.');
}


function	showRankDeletePage()
{
	var	i, str = '<h1>Confirm Rank Deletion</h1>';
	str += '<p>You are about to delete the <b>' + raDeleting.name + '</b> rank.<br/>';
	str += '<b>' + raDeleting.players + '</b> member' + (raDeleting.players > 1 ? 's' : '') + ' of the alliance ha';
	str += (raDeleting.players > 1 ? 've' : 's') + ' been assigned this rank.<br/>';
	str += 'You may choose to proceed with the deletion of this rank; members will be demoted to the ';
	str += '<select ' + alltt[204] + ' name="rddemo" onChange="raDemote=options[selectedIndex].value">';
	for	(i=0;i<raRanks.length;i++)
	{
		if	(raRanks[i].id == raDeleting.id)
			continue;
		str += '<option value="' + raRanks[i].id + '"';
		if	(raRanks[i].id == raDemote)
			str += ' selected="selected"';
		str += '>' + (raRanks[i].name == "-" ? '(Standard member)' : raRanks[i].name) + '</option>';
	}
	str += '</select> rank.<br/>Please confirm the deletion.<br/><br/>';
	str += '<input ' + alltt[205] + ' type="button" name="rdok" value="Delete this rank" onClick="rankDeleteOk();return false" /> ';
	str += '<input ' + alltt[206] + ' type="button" name="rdcancel" value="Cancel" onClick="rankDeleteCancel();return false" />';
	str += '</p>';
	document.getElementById('alpmain').innerHTML = str;
}


function alertRank(ei) {
	var str = 'Error\n';
	switch (ei) {
		case 0: str += 'You are no longer a member of the alliance.'; break;
		case 1: str += 'This name is too short, it must be at least 4 characters long.'; break;
		case 2: str += 'This name is too long, it must be less than 32 characters long.'; break;
		case 3: str += 'This name is already in use.'; break;
		case 4: str += 'You aren\'t the leader of the alliance anymore.'; break;
		case 5: str += "This rank no longer exists."; break;
		case 6: str += 'The server received invalid data. This may be a bug.'; break;
		case 7: str += 'One of the selected forums has been deleted.'; break;
		case 200: str += 'You can\'t modify the ranks while on vacation.'; break;
		default: str += 'An unknown error has occured.'; break;
	}
	alert(str);
}