var	alPages = new Array('Main', 'Vote', 'MList', 'PList', 'MStat', 'Pending', 'FAdmin', 'RAdmin');
var	alColours = new Array(null, null, null, null, null, null, null, null);
var	alCheckPriv = new Array(
		new Function('return true'),
		new Function('return lockedAlliances || isDemocracy'),
		new Function('return (alPrivileges[0] > 0)'),
		new Function('return (alPrivileges[0] > 1)'),
		new Function('return (alPrivileges[1] == 1)'),
		new Function('return (alPrivileges[4] == 1) && !lockedAlliances'),
		new Function('return (alPrivileges[5] == 1)'),
		new Function('return (alPrivileges[8] == 1)')
	);

var	lockedAlliances;
var	plAlliance;
var	inAlliance;
var	alTag;
var	alName;
var	hasFocus = -1;
var	alPubInfo = false;
var	gdTimer;
var	puTimer;
var	amPage;
var	myPubInfo = false;
var	alPrivileges;

var	successor;
var	isDemocracy;
var	asSuccessor;
var	asDemocracy;
var	techTrade;
var	asTechTrade;
var	asButtons = false;

var	leCandidates;
var	leSelected;
var	leNewSel = false;
var	leCanSel;
var	leCanApply;
var	leCanCancel;
var	leCanTake;
var	leInAction = false;
var	leSort = 0;
var	leSortDir = false;

var	lsMode = false;
var	lsPlanets = new Array();
var	lsPPerPage = 10;
var	lsPPage = 0;
var	lsPSearchType = 0;
var	lsPSearchText = "";
var	lsPIndices;
var	lsPSort = 1;
var	lsPSortDir = false;
var	lsMembers = new Array();
var	lsMPerPage = 10;
var	lsMPage = 0;
var	lsMRanks;
var	lsMChange;
var	lsMKick;
var	lsMSearchText = "";
var	lsMIndices;
var	lsMSort = 0;
var	lsMSortDir = false;
var	lsMNewRank = false;
var	lsAttacks = new Array();
var	lsAPerPage = 10;
var	lsAPage = 0;
var	lsAIndices;
var	lsASort = 1;
var	lsASortDir = false;
var	lsASearchText = "";
var	lsASearchType = 0;

var	pRequests = new Array();

var	faForums;
var	faEditing = false;
var	faOriginal;
var	faOriACL;
var	faNewPos;
var	faAccess;

var	raRanks = new Array();
var	raForums;
var	raEditing = false;
var	raOriginal;
var	raDeleting = 0;
var	raDemote;

var	alltt;

function	emptyCB(data) {}


function	PubAlliance(id, tag, name, leader, rank, points, nplanets, cx, cy, vicCond)
{
	this.id = id;
	this.tag = tag;
	this.name = name;
	this.leader = leader;
	this.points = points;
	this.rank = rank;
	this.points = points;
	this.nplanets = nplanets;
	this.cx = cx;
	this.cy = cy;
	this.victory = vicCond;
}

function	initAlliancePage()
{
	var	data = document.getElementById('allinit').innerHTML;
	if	(data.indexOf('\n') != -1)
		generalDataReceived(data);
	else	// IE really sucks
		x_getGeneralData(generalDataReceived);
}

function	generalDataReceived(data)
{
	var	a = data.split('\n');
	var	b = a[0].split('#');

	plAlliance = b[0];
	if	(plAlliance == "")
	{
		inAlliance = false;
		drawPageNoAlliance();
	}
	else if	(a.length == 3)
	{
		inAlliance = false;
		alTag = a[1];
		alName = a[2];
		drawPageNoAlliance();
	}
	else
	{
		if	(!inAlliance)
			drawAllianceMemberLayout();

		lockedAlliances = (b[2] == 1);
		b = a[3].split('#');
		myPubInfo = new PubAlliance(b[0], a[1], a[2], a[4], b[5], b[6], b[1], b[2], b[3], b[8]);
		successor = a[5];
		isDemocracy = (b[4] == "1");
		techTrade = b[7];
		alPrivileges = a[6].split('#');
		alColours[4] = (alPrivileges[1] == 1 && a[8] != '0') ? "red" : null;
		alTag = a[1];
		alName = a[2];
		inAlliance = true;

		if (a[7] == 'List') {
			a[7] = 'Main';
		}
		if	(amPage != a[7])
			eval('switchTo'+a[7]+'Page()');
		else if	(amPage == 'Main')
		{
			drawAllianceMenu();
			drawMainPage();
		}
		else
			drawAllianceMenu();
	}

	gdTimer = setTimeout('x_getGeneralData(generalDataReceived)', 30000);
}


function	clearUpdate()
{
	if	(puTimer)
		clearTimeout(puTimer);
	puTimer = false;
}


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

function	getAllianceInfo()
{
	var	v = document.getElementById('alinfo').value;
	if	(v == "")
	{
		alertAllianceInfo(0);
		return;
	}
	x_getTagInformation(v, tagInformationReceived);
}

function	tagInformationReceived(data)
{
	if	(data.indexOf('ERR') == 0)
	{
		var	a = data.split('#');
		alPubInfo = false;
		alertAllianceInfo(parseInt(a[1], 10));
	}
	else
	{
		var	a = data.split('\n');
		var	b = a[0].split('#');
		alPubInfo = new PubAlliance(b[0], a[1], a[2], a[3], b[4], b[5], b[1], b[2], b[3], b[6]);
	}
	drawPubAllianceInfo();
}


//--------------------------------------------------
// ALLIANCE CREATION / REQUEST
//--------------------------------------------------

function	createAlliance()
{
	var	t, n;
	t = document.getElementById('actag').value;
	if	(t == "")
	{
		alertCreate(2);
		return;
	}
	n = document.getElementById('acname').value;
	if	(n == "")
	{
		alertCreate(3);
		return;
	}
	x_createAlliance(t, n, allianceCreated);
}

function	allianceCreated(data)
{
	if	(data.indexOf('ERR') == 0)
	{
		var	a = data.split('#');
		alertCreate(parseInt(a[1], 10));
	}
	else
	{
		updateHeader();
		clearTimeout(gdTimer);
		generalDataReceived(data);
	}
}

function	sendJoinRequest()
{
	var	t;
	t = document.getElementById('aljoin').value;
	if	(t == "")
	{
		alertJoin(0);
		return;
	}
	x_sendRequest(t, requestSent);
}

function requestSent(data) {
	if (data.indexOf('ERR') == 0) {
		var	a = data.split('#');
		alertJoin(parseInt(a[1], 10));
	} else {
		clearTimeout(gdTimer);
		generalDataReceived(data);
	}
}


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

function drawAllianceMemberLayout() {
	document.getElementById('allpage').innerHTML = '<form action="?" onSubmit="return false"><table cellspacing="0" cellpadding="0">'
		+ '<tr><td class="center" id="alpmenu">&nbsp;</td><td style="width:5%;vertical-align:top"><a href="manual?p=alliance">Help</a></td></tr>'
		+ '<tr><td colspan="2">&nbsp;</td></tr><tr><td id="alpmain" colspan="2">&nbsp;</td></tr></table></form>';
}

function drawAllianceMenu() {
	var i, j, str = "";
	for (i = 0, j = 0; i < alPages.length; i ++) {
		if (!alCheckPriv[i]()) {
			continue;
		}

		if (j > 0) {
			str += (j == 5 ? "<br/>" : " - ");
		}
		j ++;

		var colour = alColours[i] ? (" style='color: " + alColours[i] + "' ") : "";
		var t = (amPage == alPages[i]);
		str += (t ? ('<b' + colour + '>')
				: ('<a ' + alltt[210] + colour
					+ ' href="#" onClick="switchTo' + alPages[i] + 'Page();return false">')
			) + alPgTitles[i] + (t ? '</b>' : '</a>');
	}
	document.getElementById('alpmenu').innerHTML = str;
}

// Main page (current alliance + alliance information)

function	switchToMainPage()
{
	clearUpdate();
	x_mainPage(emptyCB);
	amPage = "Main";
	asButtons = (asDemocracy != isDemocracy)
		|| (asSuccessor.toLowerCase() != successor.toLowerCase())
		|| (asTechTrade != techTrade);
	hasFocus = -1;
	drawAllianceMenu();
	drawMainPage();
}

function updateASControls() {
	var nst = (asDemocracy != isDemocracy)
		|| (asSuccessor.toLowerCase() != successor.toLowerCase())
		|| (asTechTrade != techTrade);
	if (nst == asButtons) {
		return;
	}
	asButtons = nst;
	if (asButtons) {
		drawASButtons();
	} else {
		document.getElementById('lasbut').innerHTML = '&nbsp;';
	}
}

function resetAllianceSettings() {
	asSuccessor = successor;
	asDemocracy = isDemocracy;
	asTechTrade = techTrade;
	drawMainPage();
}

function	modifyAllianceSettings()
{
	document.getElementById('lasbut').innerHTML = '&nbsp;';
	x_modifySettings(asDemocracy ? 1 : 0, asTechTrade, asSuccessor, aSettingsModified);
}

function aSettingsModified(data) {
	if (data.indexOf('ERR') == 0) {
		var a = data.split('#');
		alertASettings(parseInt(a[1], 10));
		drawASButtons();
	} else {
		asDemocracy = -1;
		clearTimeout(gdTimer);
		generalDataReceived(data);
	}
}

function asFocus() {
	if (hasFocus == 0 && alPrivileges[8] == 1) {
		document.getElementById('lassucc').focus();
	} else if (hasFocus == 3) {
		document.getElementById('alinfo').focus();
	}
}

function	leaderStepDown()
{
	if	(!confirmLSD())
		return;
	x_leaderStepDown(aSettingsModified);
}

function	leaveAlliance()
{
	var	b;
	if	(alPrivileges[8] == 0)
		b = confirmLeave(0);
	else if	(successor != "")
		b = confirmLeave(1);
	else
		b = confirmLeave(isDemocracy ? 2 : 3);
	if	(!b)
		return;
	x_leaveAlliance(aSettingsModified);
}


// Leader election

function	switchToVotePage()
{
	clearUpdate();
	if (!alCheckPriv[1]()) {
		switchToMainPage();
		return;
	}

	amPage = 'Vote';
	drawAllianceMenu();
	drawLoadingText();
	x_getCandidates(candidatesReceived);
}

function	Candidate(id,nVotes,name)
{
	this.id		= id;
	this.nVotes	= nVotes;
	this.name	= name;
}

function	candidatesReceived(data)
{
	leInAction = false;
	if	(amPage != "Vote")
		return;

	if (data == "") {
		switchToMainPage();
		return;
	} else if (data.indexOf('ERR#') == 0) {
		var a = data.split('#');
		alertElection(parseInt(a[1],10));
	} else {
		var	a = data.split('\n');
		var	ll = a.shift().split('#');
		leCanSel = (ll[0] == '1');
		leCanApply = (ll[1] == '1');
		leCanCancel = (ll[2] == '1');
		leCanTake = (ll[3] == '1');
		leSelected = ll[4];
		if	(leNewSel == false && leCanSel)
			leNewSel = leSelected;

		var	i;
		leCandidates = new Array();
		for	(i=0;i<a.length;i++)
		{
			ll = a[i].split('#');
			leCandidates.push(new Candidate(ll.shift(),ll.shift(),ll.join('#')));
		}
	}

	drawElectionLayout();
	updateCandidateList();
	drawElectionButtons();

	puTimer = setTimeout('if (!leInAction) x_getCandidates(candidatesReceived)', 15000);
}

function	updateCandidateList()
{
	prepareCandidateList();
	drawCandidateList();
}

function	applyForPresidency()
{
	clearUpdate();
	leInAction = true;
	leNewSel = false;
	x_runForPresidency(candidatesReceived);
}

function	takePresidency()
{
	clearUpdate();
	leInAction = true;
	leNewSel = false;
	x_takeControl(controlTaken);
}

function controlTaken(data) {
	if (data.indexOf('ERR#') == 0) {
		alertElection(parseInt((data.split('#'))[1], 10));
	}

	clearUpdate();
	leNewSel = false;
	if (gdTimer) {
		clearTimeout(gdTimer);
	}
	gdTimer = false;
	x_getGeneralData(generalDataReceived);
	setTimeout('waitForGd()', 100);
}

function	waitForGd()
{
	if	(gdTimer)
		x_getCandidates(candidatesReceived);
	else
		setTimeout('waitForGd(data)', 100);
}

function	cancelCandidacy()
{
	clearUpdate();
	leNewSel = false;
	leInAction = true;
	x_cancelCandidate(candidatesReceived);
}

function	changeVote()
{
	clearUpdate();
	var	i = leNewSel;
	leNewSel = false;
	leInAction = true;
	x_setVote(i, candidatesReceived);
}

function	prepareCandidateList()
{
	var	i;
	var	st = new Array('Name', 'Votes');
	var	smet = 'leCandidates.sort(lec_' + st[leSort] + '_' + (leSortDir ? "desc" : "asc") + ')';
	eval(smet);
}


// Member listing

function Player(id, rank, current, lastOnline, onVacation, name) {
	this.id		= id;
	this.name	= name;
	this.rank	= rank;
	this.rankText	= "";
	this.rawRank	= "";
	this.current	= current;
	this.lastOnline	= parseInt(lastOnline, 10);
	this.onVacation	= (onVacation == '1');
	this.selected	= false;

	this.getRawRank = function () {
		if (this.rawRank != '') {
			return this.rawRank;
		}
		if (this.rank == '-') {
			this.rawRank = "+";
		} else {
			for (var i = 0; i < lsMRanks.length && lsMRanks[i].id != this.rank; i ++) {
				// Empty loop
			}
			if (i == lsMRanks.length || lsMRanks[i].name == "-") {
				this.rawRank = "-";
			} else {
				this.rawRank = i;
			}
		}
		return this.rawRank;
	};
}


function MLRank(id, name) {
	this.id		= id;
	this.name	= name;
}


function switchToMListPage() {
	clearUpdate();
	if (!alCheckPriv[2]()) {
		switchToMainPage();
		return;
	}

	amPage = 'MList';
	drawAllianceMenu();
	drawLoadingText();
	getMemberList();
}

function getMemberList() {
	if (amPage != 'MList') {
		return;
	}

	var ids = new Array(), i;
	for (i = 0; i < lsMembers.length; i ++) {
		ids.push(lsMembers[i].id);
	}
	x_getMemberList(ids.join('#'), memberListReceived);
}

function memberListReceived(data) {
	if (data == "") {
		lsMembers = new Array();
	} else if (data.indexOf("ERR#") == 0) {
		alertMemberAction(parseInt((data.split('#'))[1], 10));
	} else {
		parseMemberList(data);
	}
	puTimer = setTimeout('updateMListPage()', 60000);
	prepareMemberList();
	drawMemberList();
}

function parseMemberList(data) {
	var ll = data.split('\n');
	var a, i, j, nr, nm;

	a = ll.shift().split('#');
	nr = parseInt(a[0],10);
	nm = parseInt(a[1],10);
	lsMChange = ll.shift().split('#');
	lsMKick = ll.shift().split('#');

	j = nm; lsMRanks = new Array();
	for (i = 0; i < nr; i ++, j ++) {
		a = ll[j].split('#');
		lsMRanks.push(new MLRank(a[0], a[1]));
	}

	for (i = 0; i < nm; i ++) {
		a = ll[i].split('#');
		if (a[0] == '-') {
			removeMember(a[1]);
		} else if (a[0] == '+') {
			a.shift();
			lsMembers.push(new Player(a.shift(), a.shift(), (a.shift() == "0"), a.shift(), a.shift(),
				a.join('#')));
		} else {
			changeMemberRank(a[1], a[2], a[3], a[3]);
		}
	}

	lsMChange.sort(function(x, y) {
		return getRawRankText(x).toLowerCase() > getRawRankText(y).toLowerCase() ? 1 : -1;
	});
}

function getRank(m) {
	if (m.rankText == "") {
		m.rankText = getRankText(m.getRawRank());
	}
	return m.rankText;
}

function getRawRankText(r) {
	for (var i = 0; i < lsMRanks.length && lsMRanks[i].id != r; i ++) {
		// Empty loop
	}
	return getRankText(i);
}

function getCookedRankText(r) {
	for (var i = 0; i < lsMRanks.length && lsMRanks[i].id != r; i ++) {
		// Empty loop
	}
	return getRankText((i == lsMRanks.length || lsMRanks[i].name == '-') ? '-' : i);
}

function removeMember(id) {
	var	k;
	for	(k=0;k<lsMembers.length && lsMembers[k].id != id;k++)
		;
	if	(k!=lsMembers.length)
		lsMembers.splice(k, 1);
}

function changeMemberRank(id, r, lOnline, vacation) {
	var	k;
	for (k = 0; k < lsMembers.length && lsMembers[k].id != id; k ++) {
		// Empty loop
	}
	if (k != lsMembers.length) {
		lsMembers[k].lastOnline = parseInt(lOnline, 10);
		lsMembers[k].onVacation = (vacation == '1');
		if (r != lsMembers[k].rank) {
			lsMembers[k].rank = r;
			lsMembers[k].rankText = "";
			lsMembers[k].rawRank = "";
		}
	}
}

function prepareMemberList() {
	var i;
	lsMIndices = new Array();
	if (lsMSearchText == "") {
		for (i = 0; i < lsMembers.length; i ++) {
			lsMIndices.push(i);
		}
	} else {
		for (i = 0; i < lsMembers.length; i ++) {
			if (lsMembers[i].name.toLowerCase().indexOf(lsMSearchText.toLowerCase()) != -1) {
				lsMIndices.push(i);
			}
		}
	}

	var st = new Array('Name', 'Rank', 'LastOnline', 'Vacation');
	var smet = 'lsMIndices.sort(mls_' + st[lsMSort] + '_' + (lsMSortDir ? "desc" : "asc") + ')';
	eval(smet);
}

function updateSearchMembers() {
	prepareMemberList();
	drawMemberListContents(false);
}

function changeMembers() {
	var	sel = new Array(), ids = new Array(), i;
	var	n = Math.min((lsMPage+1)*lsMPerPage, lsMIndices.length);
	for	(i=lsMPage*lsMPerPage;i<n;i++)
		if	(lsMembers[lsMIndices[i]].selected)
			sel.push(lsMIndices[i]);

	if	(!confirmChangeRank(sel))
		return;

	for	(i=0;i<lsMembers.length;i++)
		ids.push(lsMembers[i].id);
	for	(i=0;i<sel.length;i++)
		sel[i] = lsMembers[sel[i]].id;
	clearUpdate();
	x_changeMemberRank(sel.join('#'), lsMNewRank, ids.join('#'), memberListReceived);
}

function kickMembers() {
	var	sel = new Array(), ids = new Array(), i;
	var	n = Math.min((lsMPage+1)*lsMPerPage, lsMIndices.length);
	for	(i=lsMPage*lsMPerPage;i<n;i++)
		if	(lsMembers[lsMIndices[i]].selected)
			sel.push(lsMIndices[i]);

	if	(!confirmKick(sel))
		return;

	for	(i=0;i<lsMembers.length;i++)
		ids.push(lsMembers[i].id);
	for	(i=0;i<sel.length;i++)
		sel[i] = lsMembers[sel[i]].id;
	clearUpdate();
	x_kickMembers(sel.join('#'), ids.join('#'), memberListReceived);
}


function drawMemberListPanel(firstMember, mCount, canSelect, kickRanks, changeRanks) {
	var i, str = '<table id="mbrlist" class="list" cellspacing="0" cellpadding="0"><tr>';

	// Headers
	if (canSelect) {
		str += '<td class="mselect">&nbsp;</td>';
	}
	for (i = 0; i < 4; i ++) {
		str += '<th ' + alltt[70] + ' onClick="lsMSort=' + i + ';lsMSortDir=!lsMSortDir;updateSearchMembers()" ';
		str += '>' + (lsMSort == i ? '<b>' : '') + mbListHeaders[i];
		if (lsMSort == i) {
			str += '</b><img src="' + staticurl + '/beta5/pics/' + (lsMSortDir ? "up" : "down")
				+ '_' + color + '.gif" alt="' + (lsMSortDir ? "up" : "down") + '" />';
		}
		str += '</th>';
	}
	str += '</tr>';

	// Contents
	for (i = firstMember; i < firstMember + mCount; i ++) {
		var idx = lsMIndices[i];
		str += '<tr>';
		if (canSelect) {
			str += '<td class="mselect">';
			if ( ( kickRanks.indexOf('#' + lsMembers[idx].rank + '#') != -1
					|| changeRanks.indexOf('#' + lsMembers[idx].rank + '#') != -1
					) && !lsMembers[idx].current ) {
				str += '<input ' + alltt[100] + ' type="checkbox" name="mbrsel" value="'
					+ idx+'" ' + (lsMembers[idx].selected ? ' checked="checked"' : '')
					+ 'onClick="with(lsMembers[' + idx
					+ '])selected=!selected;drawMemberListContents(true)" />';
			}
			str += '&nbsp;';
			str += '</td>';
		}
		str += '<td>';
		if (!lsMembers[idx].current) {
			str += '<a ' + alltt[101] + ' href="message?a=c&ct=0&id=' + lsMembers[idx].id + '">';
		}
		str += lsMembers[idx].name + (lsMembers[idx].current ? '' : '</a>') + '</td><td';
		if (lsMembers[idx].rank == "-") {
			str += ' class="mbleader"';
		}
		str += '>' + getRank(lsMembers[idx]) + '</td><td class="'
			+ (lsMembers[idx].lastOnline ? "mboffline" : "mbonline") + '">'
			+ lastOnline(lsMembers[idx]) + '</td><td class="'
			+ (lsMembers[idx].onVacation ? "mbonvac" : "mbnovac") + '">'
			+ vacationMode[lsMembers[idx].onVacation ? 1 : 0] + '</td></tr>';
	}

	str += '</table>';
	return	str;
}

function lastOnline(member) {
	if (member.lastOnline) {
		var str = lastOnlinePrefix;
		var lo, loUnit;
		if (member.lastOnline > 60) {
			lo = (member.lastOnline - (member.lastOnline % 60)) / 60;
			loUnit = 1;
		} else {
			lo = member.lastOnline;
			loUnit = 0;
		}
		str += formatNumber(lo.toString()) + ' ' + lastOnlineUnits[loUnit * 2 + (lo > 1 ? 1 : 0)]
			+ lastOnlineSuffix;
		return str;
	}
	return onlineText;
}


function updateMListPage() {
	if (!alCheckPriv[2]()) {
		switchToMainPage();
		return;
	}
	hasFocus = 0;
	getPlayerList();
}



// Planet list

function Planet(id, owner, msOwner, name, cx, cy, orbit, fact, tur, ua) {
	this.id			= id;
	this.owner		= owner;
	this.msOwner		= msOwner;
	this.name		= name;
	this.coords		= '(' + cx + ',' + cy + ',' + orbit + ')';
	this.factories		= fact;
	this.turrets		= tur;
	this.underAttack	= ua;
}


function switchToPListPage() {
	clearUpdate();
	if (!alCheckPriv[3]()) {
		switchToMainPage();
		return;
	}

	amPage = 'PList';
	drawAllianceMenu();
	drawLoadingText();
	getPlanetList();
}


function getPlanetList() {
	if (amPage != 'PList') {
		return;
	}

	var ids = new Array(), i;
	for (i = 0; i < lsPlanets.length; i ++) {
		ids.push(lsPlanets[i].id);
	}
	x_getPlanetList(ids.join('#'), planetListReceived);
}

function planetListReceived(data) {
	if (amPage != 'PList') {
		return;
	}

	if (data == "") {
		lsPlanets = new Array();
	} else {
		parsePlanetList(data);
	}
	puTimer = setTimeout('updatePListPage()', 180000);
	preparePlanetList();
	drawPlanetList();
}

function updatePListPage() {
	if (!alCheckPriv[3]()) {
		switchToMainPage();
		return;
	}
	hasFocus = 0;
	getPlanetList();
}

function removePlanet(id) {
	var	k;
	for	(k=0;k<lsPlanets.length && lsPlanets[k].id != id;k++)
		;
	if	(k!=lsPlanets.length)
		lsPlanets.splice(k, 1);
}

function replacePlanet(npl) {
	var	k;
	for	(k=0;k<lsPlanets.length && lsPlanets[k].id != npl.id;k++)
		;
	if	(k!=lsPlanets.length)
		lsPlanets.splice(k, 1, npl);
}

function parsePlanetList(data) {
	var	l = data.split("\n");
	var	i;

	for	(i=0;i<l.length;i++)
	{
		var	a = l[i].split('#');
		if	(a[0] == "-")
			removePlanet(a[1]);
		else
		{
			var	op = a.shift(), npl;
			npl = new Planet(a[0],l[i+1],a[1],l[i+2],a[2],a[3],a[4],a[5],a[6],a[7]);
			if	(op == '+')
				lsPlanets.push(npl);
			else
				replacePlanet(npl);
			i += 2;
		}
	}
}

function preparePlanetList() {
	var	i;

	lsPIndices = new Array();
	if	(lsPSearchText == "")
		for	(i=0;i<lsPlanets.length;i++)
			lsPIndices.push(i);
	else
	{
		for	(i=0;i<lsPlanets.length;i++)
		{
			var	b;
			if	(lsPSearchType == 0)
				b = (lsPlanets[i].name.toLowerCase().indexOf(lsPSearchText.toLowerCase()) != -1);
			else
				b = (lsPlanets[i].owner.toLowerCase().indexOf(lsPSearchText.toLowerCase()) != -1);
			if	(b)
				lsPIndices.push(i);
		}
	}

	var	st = new Array('Coord', 'Planet', 'Owner', 'Fact', 'Trt');
	var	smet = 'lsPIndices.sort(pls_' + st[lsPSort] + '_' + (lsPSortDir ? "desc" : "asc") + ')';
	eval(smet);
}

function updateSearchPlanet() {
	preparePlanetList();
	drawPlanetListContents();
}



// Military status

function switchToMStatPage() {
	clearUpdate();
	if (!alCheckPriv[4]()) {
		switchToMainPage();
		return;
	}

	amPage = 'MStat';
	drawAllianceMenu();
	drawLoadingText();
	getMilitaryList();
}

function updateMStatPage() {
	if (amPage != 'MStat') {
		return;
	}

	if (!alCheckPriv[4]()) {
		switchToMainPage();
		return;
	}

	hasFocus = 0;
	getMilitaryList();
}


function MilitarySituation(pid, pname, coords, oid, oname, attPower, defPower, attackers, defenders) {
	this.planetId	= pid;
	this.planetName	= pname;
	this.coords	= coords;
	this.ownerId	= oid;
	this.ownerName	= oname;
	this.attPower	= attPower;
	this.defPower	= defPower;
	this.attackers	= attackers;
	this.defenders	= defenders;
}

function getMilitaryList() {
	if (amPage != 'MStat') {
		return;
	}
	x_getAttackList(militaryListReceived);
}

function militaryListReceived(data) {
	lsAttacks = new Array();
	if (data != "") {
		parseMilitaryList(data);
	}
	puTimer = setTimeout('updateMStatPage()', 180000);
	prepareMilitaryList();
	drawMilitaryList();
}

function parseMilitaryList(data) {
	var	l = data.split('\n'), st = 0, ca, pn, on, att, def;
	while	(l.length > 0)
	{
		var	s = l.shift();
		if	(st == 0)
		{
			ca = s.split('#');
			ca[4] = parseInt(ca[4], 10);
			ca[5] = parseInt(ca[5], 10);
			on = '';
			att = new Array();
			def = new Array();
			st = 1;
		}
		else if	(st == 1)
		{
			pn = s;
			if	(ca[1] != "")
				st = 2;
			else if	(ca[4] > 0)
				st = 3;
			else if	(ca[5] > 0)
				st = 4;
			else
			{
				lsAttacks.push(new MilitarySituation(ca[0],pn,ca[6],'','',ca[3],ca[2],att,def));
				st = 0;
			}
		}
		else if	(st == 2)
		{
			on = s;
			if	(ca[4] > 0)
				st = 3;
			else if	(ca[5] > 0)
				st = 4;
			else
			{
				lsAttacks.push(new MilitarySituation(ca[0],pn,ca[6],ca[1],on,ca[3],ca[2],att,def));
				st = 0;
			}
		}
		else if	(st == 3)
		{
			def.push(s);
			ca[4] --;
			if	(ca[4] == 0)
			{
				if	(ca[5] > 0)
					st = 4;
				else
				{
					lsAttacks.push(new MilitarySituation(ca[0],pn,ca[6],ca[1],on,ca[3],ca[2],att,def));
					st = 0;
				}
			}
		}
		else if	(st == 4)
		{
			att.push(s);
			ca[5] --;
			if	(ca[5] == 0)
			{
				lsAttacks.push(new MilitarySituation(ca[0],pn,ca[6],ca[1],on,ca[3],ca[2],att,def));
				st = 0;
			}
		}
	}
}

function prepareMilitaryList() {
	var	i;
	lsAIndices = new Array();
	if (lsASearchText == "") {
		for	(i=0;i<lsAttacks.length;i++)
			lsAIndices.push(i);
	} else {
		for (i=0;i<lsAttacks.length;i++) {
			var	b;
			if	(lsASearchType == 0 || alPrivileges[0] < 2)
				b = (lsAttacks[i].planetName.toLowerCase().indexOf(lsASearchText.toLowerCase()) != -1);
			else
				b = (lsAttacks[i].ownerName.toLowerCase().indexOf(lsASearchText.toLowerCase()) != -1);
			if	(b)
				lsAIndices.push(i);
		}
	}

	var	st = new Array('Coords', 'Name', 'Owner', 'Def', 'Att');
	var	smet = 'lsAIndices.sort(als_' + st[lsASort] + '_' + (lsASortDir ? "desc" : "asc") + ')';
	eval(smet);
}

function updateSearchMilitary() {
	prepareMilitaryList();
	drawMilitaryListContents();
}


// Pending requests page

function	switchToPendingPage()
{
	clearUpdate();
	if	(alPrivileges[4] != 1)
	{
		switchToMainPage();
		return;
	}

	amPage = 'Pending';
	drawAllianceMenu();
	drawLoadingText();
	getPendingRequests();
}

function	PendingRequest(id, player)
{
	this.id		= id;
	this.player	= player;
	this.selected	= false;
}

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

	var	ids = new Array(), i;
	for	(i=0;i<pRequests.length;i++)
		ids.push(pRequests[i].id);
	x_getPending(ids.join('#'), pendingRequestsReceived);
}

function	removePendingRequest(id)
{
	var	k;
	for	(k=0;k<pRequests.length && pRequests[k].id != id;k++)
		;
	if	(k!=pRequests.length)
		pRequests.splice(k, 1);
}

function	pendingRequestsReceived(data)
{
	if (data.indexOf("ERR#") == 0) {
		alertPending(parseInt((data.split('#'))[1], 10));
	} else if (data != "") {
		var	l = data.split("\n");
		var	i, j;

		for	(i=0;i<l.length;i++)
		{
			var	a = l[i].split('#');
			if	(a[0] == "-")
				removePendingRequest(a[1]);
			else
			{
				a.shift();
				j = a.shift();
				pRequests.push(new PendingRequest(j, a.join('#')));
			}
		}
	}
	puTimer = setTimeout('getPendingRequests()', 180000);
	drawPendingPage();
}

function	getSelectedRequests()
{
	var	a = new Array(), i;
	for	(i=0;i<pRequests.length;i++)
		if	(pRequests[i].selected)
			a.push(pRequests[i].id);
	return	a;
}

function	acceptRequests()
{
	var	a = getSelectedRequests();
	if	(a.length == 0)
	{
		alertRequests(true);
		return;
	}
	if	(!confirmRequests(true, a.length > 1))
		return;
	if	(puTimer && amPage == "Pending")
	{
		clearUpdate();
		var	ids = new Array(), i;
		for	(i=0;i<pRequests.length;i++)
			ids.push(pRequests[i].id);
		x_acceptRequests(ids.join('#'), a.join('#'), pendingRequestsReceived);
	}
}

function	rejectRequests()
{
	var	a = getSelectedRequests();
	if	(a.length == 0)
	{
		alertRequests(false);
		return;
	}
	if	(!confirmRequests(false, a.length > 1))
		return;
	if	(puTimer && amPage == "Pending")
	{
		clearUpdate();
		var	ids = new Array(), i;
		for	(i=0;i<pRequests.length;i++)
			ids.push(pRequests[i].id);
		x_rejectRequests(ids.join('#'), a.join('#'), pendingRequestsReceived);
	}
}


// Forums administation

function	switchToFAdminPage()
{
	clearUpdate();
	if	(alPrivileges[5] != 1)
	{
		switchToMainPage();
		return;
	}

	amPage = 'FAdmin';
	faEditing = false;
	drawAllianceMenu();
	drawLoadingText();
	x_getForums(forumsReceived);
}

function	AllianceForum(id,order,userPost,name,description)
{
	this.id			= id;
	this.order		= order;
	this.userPost		= userPost;
	this.name		= name;
	this.description	= description;
}

function	ForumACL(id,priv,name)
{
	this.id		= id;
	this.priv	= priv;
	this.name	= name;
	this.selected	= false;
}

function forumsReceived(data) {
	if (amPage != 'FAdmin') {
		return;
	}

	faForums = new Array();
	if (data.indexOf("ERR#") == 0) {
		alertForum(parseInt((data.split('#'))[1], 10));
		puTimer = setTimeout('x_getForums(forumsReceived)', 180000);
		return;
	} else if (data != "") {
		parseForumList(data);
	}

	if (!faEditing) {
		drawForumList();
	} else if (!faEditing.id && faForums.length >= 30) {
		alertMaximumFCount();
		forumEditCancel();
	} else if (!faEditing.id) {
		if	(faNewPos != -1 && !forumById(faNewPos))
			faNewPos = -1;
		updateFPosSelector();
	} else if (faEditing.id) {
		var	f = forumById(faEditing.id);
		if (!f) {
			alertForumDeleted();
			forumEditCancel();
		} else if (faOriginal.name != f.name || faOriginal.userPost != f.userPost || faOriginal.description != f.description) {
			alertForumChanged();
			updateFEditor();
		} else {
			updateFEditor();
		}
	}
	puTimer = setTimeout('x_getForums(forumsReceived)', 180000);
}

function	parseForumList(data)
{
	var	dl = data.split('\n');
	var	st = 0, i = 0, cf = 0;
	var	a;

	while	(i<dl.length)
	{
		if	(st == 0)
		{
			a = dl[i].split('#');
			faForums[cf] = new AllianceForum(a.shift(),a.shift(),(a.shift()=="1"),a.join('#'),'');
			st = 1;
			i ++;
		}
		else if	(st == 1)
		{
			if	(dl[i].indexOf('+#') == 0)
			{
				a = dl[i].split('#');
				a.shift();
				a = a.join('#');
				if	(faForums[cf].description != '')
					faForums[cf].description += '\n';
				faForums[cf].description += a;
				i++;
			}
			else
			{
				cf++;
				st = 0;
			}
		}
	}

	faForums.sort(new Function('a','b','return (a.order > b.order ? 1 : -1)'));
}

function	moveForum(id,up)
{
	x_moveForum(id, up ? 1 : 0, forumsReceived);
}

function	forumById(id)
{
	var	i;
	for	(i=0;i<faForums.length&&faForums[i].id!=id;i++)
		;
	return	(i==faForums.length) ? false : faForums[i];
}

function	deleteForum(id)
{
	var	f = forumById(id);
	if	(!(f && confirmDeleteForum(f.name)))
		return;
	x_delForum(id, forumsReceived);
}

function	createForum()
{
	faEditing = new AllianceForum(false,false,true,'','');
	if	(faForums.length)
		faNewPos = faForums[faForums.length - 1].id;
	else
		faNewPos = -1;
	displayForumEditor();
}

function	editForum(id)
{
	var	f = forumById(id);
	if	(!f)
		return;
	faEditing = new AllianceForum(id,f.order,f.userPost,f.name,f.description);
	faOriginal = new AllianceForum(id,f.order,f.userPost,f.name,f.description);
	displayForumEditor();
}

function	displayForumEditor()
{
	document.getElementById('crforum').innerHTML = '';
	drawForumEditor();
	x_getForumAcl(faEditing.id ? faEditing.id : '', forumAclReceived);
}

function	forumAclReceived(data)
{
	faAccess = new Array();
	if	(data != "")
	{
		var	i, l = data.split('\n');
		for	(i=0;i<l.length;i++)
		{
			var	a = l[i].split('#');
			faAccess.push(new ForumACL(a.shift(), a.shift(), a.join('#')));
		}
		faAccess.sort(new Function('a','b','return a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1'));
	}
	if	(faEditing.id)
		faOriACL = makeForumACLString();
	drawFAccessManager();
	updateFEditor();
}

function	setFAccessLevel(level)
{
	var	i,cc=0;
	for	(i=0;i<faAccess.length;i++)
	{
		if	(faAccess[i].priv == 3 || !faAccess[i].selected || faAccess[i].priv == level)
			continue;
		cc++;
		faAccess[i].priv = level;
	}
	if	(cc > 0)
	{
		drawFAccessManager();
		updateFEditor();
	}
}

function	updateFEditor()
{
	var	ok, i;
	ok = (faEditing.name.length >= 4);
	if	(faEditing.id)
		ok = ok && (
			faEditing.name != faOriginal.name || faEditing.description != faOriginal.description
			|| faEditing.userPost != faOriginal.userPost || faOriACL != makeForumACLString()
		);
	document.getElementById('feok').disabled = !ok;
}

function	makeForumACLString()
{
	var	a = new Array(), i;
	for	(i=0;i<faAccess.length;i++)
		if	(faAccess[i].priv != 3 && faAccess[i].priv != 0)
			a.push(faAccess[i].id + '!' + faAccess[i].priv);
	return	a.join('#');
}

function	forumEditOk()
{
	if	(faEditing.id)
		x_changeForum(faEditing.id, faEditing.name, faEditing.userPost ? 1 : 0, faEditing.description, makeForumACLString(), forumEditCallback);
	else
		x_newForum(faEditing.name, faEditing.userPost ? 1 : 0, faNewPos, faEditing.description, makeForumACLString(), forumEditCallback);
}

function	forumEditCancel()
{
	faEditing = false;
	drawForumList();
}

function forumEditCallback(data) {
	if (data.indexOf('ERR#') == 0) {
		var	a = data.split('#');
		a.shift();
		alertForum(parseInt(a[0], 10));
		if (a[0] == 3) {
			clearUpdate();
			faEditing = false;
			x_getForums(forumsReceived);
		}
	} else {
		clearUpdate();
		faEditing = false;
		forumsReceived(data);
	}
}


//--------------------------------------------------
// RANKS MANAGEMENT
//--------------------------------------------------

function	switchToRAdminPage()
{
	clearUpdate();
	if	(alPrivileges[8] != 1)
	{
		switchToMainPage();
		return;
	}

	amPage = 'RAdmin';
	raEditing = false;
	raDeleting = 0;
	drawAllianceMenu();
	drawLoadingText();
	x_getRanks(ranksReceived);
}

function Rank(id, name, players, list, att, srank, kick, accept, fadmin, dipl, vote, cand, techTrade) {
	this.id			= id;
	this.name		= name;
	this.players		= players;
	this.list		= list;
	this.attacks		= att;
	this.canSet		= srank;
	this.canKick		= kick;
	this.accept		= accept;
	this.forumAdmin		= fadmin;
	this.diplContact	= dipl;
	this.canVote		= vote;
	this.candidate		= cand;
	this.techTrade		= parseInt(techTrade, 10);
	this.ranksKick		= new Array();
	this.ranksChange	= new Array();
	this.fRead		= new Array();
	this.fMod		= new Array();
	this.open		= false;
}

function	RForum(id,name)
{
	this.id		= id;
	this.name	= name;
}

function ranksReceived(data) {
	var l = data.split('\n'), a = l.shift().split('#');
	var nf = a[0], nr = a[1], i;

	raForums = new Array();
	for (i = 0; i < nf; i ++) {
		a = l.shift().split('#');
		raForums.push(new RForum(a.shift(), a.join()));
	}
	raForums.sort(new Function('a','b','return a.name.toLowerCase()>b.name.toLowerCase()?1:-1'));

	var rr = new Array();
	for (i = 0; i < nr; i ++) {
		var	r, n, i;
		a = l.shift().split('#');
		r = new Rank(a[0], l.shift(), a[1], a[2], a[3] == "1", a[4] == "1", a[5] == "1",
			a[6] == "1", a[7] == "1", a[8] == "1", a[9] == 1, a[10] == "1", a[11]);
		if (r.canKick) {
			if (l[0] != "") {
				r.ranksKick = l.shift().split('#');
			} else {
				l.shift();
			}
		}
		if (r.canSet) {
			if (l[0] != "") {
				r.ranksChange = l.shift().split('#');
			} else {
				l.shift();
			}
		}
		if (l[0] == "") {
			l.shift();
		} else {
			r.fRead = l.shift().split('#');
		}
		if (l[0] == "") {
			l.shift();
		} else {
			r.fMod = l.shift().split('#');
		}
		n = rankById(r.id);
		if (n) {
			r.open = n.open;
		}
		rr.push(r);
	}
	rr.sort(new Function('a','b','return a.name.toLowerCase()>b.name.toLowerCase()?1:-1'));
	raRanks = rr;

	if (!(raEditing || raDeleting)) {
		drawRanksList();
	}

	puTimer = setTimeout('x_getRanks(ranksReceived)', 180000);
}

function	rankById(id)
{
	var	i;
	for	(i=0;i<raRanks.length&&raRanks[i].id!=id;i++) ;
	return (i == raRanks.length) ? false : raRanks[i];
}

function	raForumById(id)
{
	var	i;
	for	(i=0;i<raForums.length&&raForums[i].id!=id;i++) ;
	return (i == raForums.length) ? false : raForums[i];
}

function	showRank(i)
{
	raRanks[i].open = !raRanks[i].open;
	drawRanksList();
}

function createRank() {
	raEditing = new Rank(false, '', 0, 3, true, 0, 0, false, false, false, true, true, 0);
	displayRankEditor();
}

function editRank(idx) {
	raEditing = new Rank(
		raRanks[idx].id, raRanks[idx].name, raRanks[idx].players, raRanks[idx].list, raRanks[idx].attacks,
		raRanks[idx].canSet ? (raRanks[idx].ranksChange.length == raRanks.length - 1 ? 2 : 1) : 0,
		raRanks[idx].canKick ? (raRanks[idx].ranksKick.length == raRanks.length - 1 ? 2 : 1) : 0,
		raRanks[idx].accept, raRanks[idx].forumAdmin, raRanks[idx].diplContact,
		raRanks[idx].canVote, raRanks[idx].candidate, raRanks[idx].techTrade
	);
	raEditing.ranksChange = raEditing.ranksChange.concat(raRanks[idx].ranksChange);
	raEditing.ranksChange.sort(new Function('a','b','return a-b'));
	raEditing.ranksKick = raEditing.ranksKick.concat(raRanks[idx].ranksKick);
	raEditing.ranksKick.sort(new Function('a','b','return a-b'));
	raEditing.fRead = raEditing.fRead.concat(raRanks[idx].fRead);
	raEditing.fRead.sort(new Function('a','b','return a-b'));
	raEditing.fMod = raEditing.fMod.concat(raRanks[idx].fMod);
	raEditing.fMod.sort(new Function('a','b','return a-b'));

	raOriginal = new Rank(
		raEditing.id, raEditing.name, raEditing.players, raEditing.list, raEditing.attacks,
		raEditing.canSet, raEditing.canKick, raEditing.accept, raEditing.forumAdmin,
		raEditing.diplContact, raEditing.canVote, raEditing.candidate, raEditing.techTrade
	);
	raOriginal.ranksChange = raOriginal.ranksChange.concat(raEditing.ranksChange);
	raOriginal.ranksKick = raOriginal.ranksKick.concat(raEditing.ranksKick);
	raOriginal.fRead = raOriginal.fRead.concat(raEditing.fRead);
	raOriginal.fMod = raOriginal.fMod.concat(raEditing.fMod);

	displayRankEditor();
}

function	drawRERankList(can, list, func, lstid, sm)
{
	if	(can != 1 || (raRanks.length == 1 && raEditing.id))
	{
		var	e = document.getElementById('re'+lstid+'list');
		if	(e)
			e.innerHTML = ' ';
		return;
	}

	var	i, n = 0, kl, str = '<table cellspacing="0" cellpadding="1" class="rerlist">';
	kl = '!' + list.join('!') + '!';
	for	(i=0;i<raRanks.length;i++)
	{
		if	(raEditing.id && raRanks[i].id == raEditing.id)
			continue;
		if	(n%3 == 0)
			str += '<tr>';
		str += '<td><label><input ' + alltt[220] + ' type="checkbox" name="re'+lstid+'rank" value="'+i+'" onClick="rankSwitch'+func+'('+i+');updateREditor()"';
		str += (kl.indexOf('!' + raRanks[i].id + '!') == -1 ? '' : ' checked="checked"') + ' /> ';
		str += (raRanks[i].name == '-' ? ('<i>'+sm+'</i>') : raRanks[i].name.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')) + '</label></td>';
		if	(n%3 == 2)
			str += '</tr>';
		n++;
	}
	if	(n%3 != 0)
	{
		while	(n%3 != 0)
		{
			str += '<td>&nbsp;</td>';
			n++;
		}
		str += '</tr>';
	}
	str += '</table>';
	document.getElementById('re'+lstid+'list').innerHTML = str;
}

function updateREditor() {
	var	ok;
	if (!raEditing.id || (raEditing.id && raOriginal.name != "-")) {
		ok = (raEditing.name.length > 3);
	} else {
		ok = true;
	}
	if (raEditing.id) {
		raEditing.ranksChange.sort(new Function('a','b','return a-b'));
		raEditing.ranksKick.sort(new Function('a','b','return a-b'));
		raEditing.fRead.sort(new Function('a','b','return a-b'));
		raEditing.fMod.sort(new Function('a','b','return a-b'));
		ok = ok && (
			(raEditing.name != raOriginal.name) || (raEditing.list != raOriginal.list)
			|| (raEditing.attacks != raOriginal.attacks) || (raEditing.canSet != raOriginal.canSet)
			|| (raEditing.canKick != raOriginal.canKick) || (raEditing.accept != raOriginal.accept)
			|| (raEditing.forumAdmin != raOriginal.forumAdmin) || (raEditing.canVote != raOriginal.canVote)
			|| (raEditing.diplContact != raOriginal.diplContact)
			|| (raEditing.candidate != raOriginal.candidate)
			|| (raEditing.techTrade != raOriginal.techTrade)
			|| (raEditing.ranksChange.join('#') != raOriginal.ranksChange.join('#'))
			|| (raEditing.ranksKick.join('#') != raOriginal.ranksKick.join('#'))
			|| (raEditing.fRead.join('#') != raOriginal.fRead.join('#'))
			|| (raEditing.fMod.join('#') != raOriginal.fMod.join('#'))
		);
	}
	document.getElementById('reok').disabled = !ok;
}

function rankEditCancel() {
	raEditing = false;
	drawRanksList();
}

function rankEditOk() {
	var	i, prs, rkick, rchange, fread, fmod;

	if	(raEditing.canSet == 1 && raEditing.ranksChange.length == 0)
		raEditing.canSet = 0;
	if	(raEditing.canKick == 1 && raEditing.ranksKick.length == 0)
		raEditing.canKick = 0;

	prs  = raEditing.list + '#' + (raEditing.attacks ? '1' : '0') + '#';
	prs += (raEditing.canSet != 0 ? '1' : '0') + '#' + (raEditing.canKick != 0 ? '1' : '0') + '#';
	prs += (raEditing.accept ? '1' : '0') + '#' + (raEditing.forumAdmin ? '1' : '0') + '#';
	prs += (raEditing.diplContact ? '1' : '0') + '#' + (raEditing.canVote ? '1' : '0') + '#';
	prs += (raEditing.candidate ? '1' : '0') + '#' + raEditing.techTrade;

	if	(raEditing.canSet == 1)
		rchange = raEditing.ranksChange.join('#');
	else
		rchange = "";

	if	(raEditing.canKick == 1)
		rkick = raEditing.ranksKick.join('#');
	else
		rkick = "";

	if	(raEditing.forumAdmin)
		fread = fmod = "";
	else
	{
		fread = raEditing.fRead.join('#');
		fmod = raEditing.fMod.join('#');
	}

	if (raEditing.id) {
		x_changeRank(raEditing.id, raEditing.name, prs, rkick, rchange, fread, fmod, rankEdited);
	} else {
		x_newRank(raEditing.name, prs, rkick, rchange, fread, fmod, rankEdited);
	}
}

function rankEdited(data) {
	if (data.indexOf('ERR#') == 0) {
		alertRank(parseInt(data.replace(/ERR#/, ''), 10));
	} else {
		raEditing = false;
		clearUpdate();
		ranksReceived(data);
	}
}

function	rankSwitchKick(idx)
{
	var	id = raRanks[idx].id;
	var	ks = '!' + raEditing.ranksKick.join('!') + '!';
	if	(ks.indexOf('!' + id + '!') == -1)
		raEditing.ranksKick.push(id);
	else
	{
		var	i;
		for	(i=0;i<raEditing.ranksKick.length&&raEditing.ranksKick[i]!=id;i++) ;
		if	(i<raEditing.ranksKick.length)
			raEditing.ranksKick.splice(i, 1);
	}
}

function	rankSwitchChange(idx)
{
	var	id = raRanks[idx].id;
	var	cs = '!' + raEditing.ranksChange.join('!') + '!';
	if	(cs.indexOf('!' + id + '!') == -1)
		raEditing.ranksChange.push(id);
	else
	{
		var	i;
		for	(i=0;i<raEditing.ranksChange.length&&raEditing.ranksChange[i]!=id;i++) ;
		if	(i<raEditing.ranksChange.length)
			raEditing.ranksChange.splice(i, 1);
	}
}

function	rankSetForum(idx, l)
{
	var	fid = raForums[idx].id;
	var	isRd = (('!' + raEditing.fRead.join('!') + '!').indexOf('!'+fid+'!') != -1);
	var	isMod = (('!' + raEditing.fMod.join('!') + '!').indexOf('!'+fid+'!') != -1);
	if	(l == 0)
	{
		var	i, a = isRd ? raEditing.fRead : raEditing.fMod;
		for	(i=0;i<a.length&&a[i]!=fid;i++) ;
		a.splice(i, 1);
	}
	else if	(l == 1)
	{
		if	(isMod)
		{
			var	i, a = raEditing.fMod;
			for	(i=0;i<a.length&&a[i]!=fid;i++) ;
			a.splice(i, 1);
		}
		raEditing.fRead.push(fid);
	}
	else
	{
		if	(isRd)
		{
			var	i, a = raEditing.fRead;
			for	(i=0;i<a.length&&a[i]!=fid;i++) ;
			a.splice(i, 1);
		}
		raEditing.fMod.push(fid);
	}
}

function	deleteRank(idx)
{
	var	i;
	for	(i=0;i<raRanks.length&&raRanks[i].name!="-";i++) ;
	if	(i==raRanks.length)
		return;

	if	(raRanks[idx].players == 0 && confirmDeleteRank(raRanks[idx].name))
		x_delRank(raRanks[idx].id, raRanks[i].id, rankDeleted);
	else if	(raRanks[idx].players > 0)
	{
		raDeleting = raRanks[idx];
		raDemote = raRanks[i].id;
		showRankDeletePage();
	}
}

function rankDeleteOk() {
	x_delRank(raDeleting.id, raDemote, rankDeleted);
}

function	rankDeleteCancel()
{
	raDeleting = false;
	drawRanksList();
}

function rankDeleted(data) {
	raDeleting = false;
	clearUpdate();
	if (data.indexOf('ERR#') == 0) {
		alertRank(parseInt((data.split('#'))[1], 10));
	} else {
		ranksReceived(data);
	}
}


//--------------------------------------------------
// LIST SORTING
//--------------------------------------------------

function pls_Coord_asc(a,b)
{
	var ra = lsPlanets[a].coords.toLowerCase(); var rb = lsPlanets[b].coords.toLowerCase();
	return	(ra < rb) ? -1 : 1;
}

function pls_Coord_desc(a,b)
{
	var ra = lsPlanets[a].coords.toLowerCase(); var rb = lsPlanets[b].coords.toLowerCase();
	return	(ra < rb) ? 1 : -1;
}

function pls_Planet_asc(a,b)
{
	var ra = lsPlanets[a].name.toLowerCase(); var rb = lsPlanets[b].name.toLowerCase();
	return	(ra < rb) ? -1 : 1;
}

function pls_Planet_desc(a,b)
{
	var ra = lsPlanets[a].name.toLowerCase(); var rb = lsPlanets[b].name.toLowerCase();
	return	(ra < rb) ? 1 : -1;
}

function pls_Owner_asc(a,b)
{
	var ra = lsPlanets[a].owner.toLowerCase(); var rb = lsPlanets[b].owner.toLowerCase();
	return  (ra < rb) ? -1 : ((ra > rb) ? 1 : pls_Planet_asc(a,b));
}

function pls_Owner_desc(a,b)
{
	var ra = lsPlanets[a].owner.toLowerCase(); var rb = lsPlanets[b].owner.toLowerCase();
	return  (ra < rb) ? 1 : ((ra > rb) ? -1 : pls_Planet_desc(a,b));
}

function pls_Fact_asc(a,b)
{
	var ra = parseInt(lsPlanets[a].factories, 10); var rb = parseInt(lsPlanets[b].factories, 10);
	return  (ra < rb) ? -1 : ((ra > rb) ? 1 : pls_Planet_asc(a,b));
}

function pls_Fact_desc(a,b)
{
	var ra = parseInt(lsPlanets[a].factories, 10); var rb = parseInt(lsPlanets[b].factories, 10);
	return  (ra < rb) ? 1 : ((ra > rb) ? -1 : pls_Planet_desc(a,b));
}

function pls_Trt_asc(a,b)
{
	var ra = parseInt(lsPlanets[a].turrets, 10); var rb = parseInt(lsPlanets[b].turrets, 10);
	return  (ra < rb) ? -1 : ((ra > rb) ? 1 : pls_Planet_asc(a,b));
}

function pls_Trt_desc(a,b)
{
	var ra = parseInt(lsPlanets[a].turrets, 10); var rb = parseInt(lsPlanets[b].turrets, 10);
	return  (ra < rb) ? 1 : ((ra > rb) ? -1 : pls_Planet_desc(a,b));
}

function mls_Name_asc(a,b) {
	var ra = lsMembers[a].name.toLowerCase(); var rb = lsMembers[b].name.toLowerCase();
	return  (ra < rb) ? -1 : 1;
}

function mls_Name_desc(a,b) {
	var ra = lsMembers[a].name.toLowerCase(); var rb = lsMembers[b].name.toLowerCase();
	return  (ra > rb) ? -1 : 1;
}

function mls_LastOnline_asc(a,b) {
	var ra = lsMembers[a].lastOnline; var rb = lsMembers[b].lastOnline;
	return  (ra < rb) ? 1 : ((ra > rb) ? -1 : mls_Name_desc(a,b));
}

function mls_LastOnline_desc(a,b) {
	var ra = lsMembers[a].lastOnline; var rb = lsMembers[b].lastOnline;
	return  (ra < rb) ? -1 : ((ra > rb) ? 1 : mls_Name_asc(a,b));
}

function mls_Vacation_asc(a,b) {
	var ra = lsMembers[a].onVacation ? 1 : 0; var rb = lsMembers[b].onVacation ? 1 : 0;
	return (ra == rb ? mls_Name_asc(a,b) : (ra - rb));
}

function mls_Vacation_desc(a,b) {
	var ra = lsMembers[a].onVacation ? 1 : 0; var rb = lsMembers[b].onVacation ? 1 : 0;
	return (ra == rb ? mls_Name_desc(a,b) : (rb - ra));
}

function mls_Rank_asc(a,b) {
	var ra = lsMembers[a].getRawRank(), rb = lsMembers[b].getRawRank();
	return (ra == rb) ? mls_Name_asc(a, b)
		: ((ra == '+' || rb == '-') ? -1
		: ((ra == '-' || rb == '+') ? 1
		: ((getRank(lsMembers[a]).toLowerCase() < getRank(lsMembers[b]).toLowerCase()) ? -1 : 1)));
}

function mls_Rank_desc(a,b) {
	var ra = lsMembers[a].getRawRank(), rb = lsMembers[b].getRawRank();
	return (ra == rb) ? mls_Name_asc(a, b)
		: ((ra == '+' || rb == '-') ? 1
		: ((ra == '-' || rb == '+') ? -1
		: ((getRank(lsMembers[a]).toLowerCase() < getRank(lsMembers[b]).toLowerCase()) ? 1 : -1)));
}

function als_Coords_asc(a,b)
{
	var ra = lsAttacks[a].coords.toLowerCase(); var rb = lsAttacks[b].coords.toLowerCase();
	return	(ra < rb) ? -1 : 1;
}

function als_Coords_desc(a,b)
{
	var ra = lsAttacks[a].coords.toLowerCase(); var rb = lsAttacks[b].coords.toLowerCase();
	return	(ra < rb) ? 1 : -1;
}

function als_Name_asc(a,b)
{
	var ra = lsAttacks[a].planetName.toLowerCase(); var rb = lsAttacks[b].planetName.toLowerCase();
	return	(ra < rb) ? -1 : 1;
}

function als_Name_desc(a,b)
{
	var ra = lsAttacks[a].planetName.toLowerCase(); var rb = lsAttacks[b].planetName.toLowerCase();
	return	(ra < rb) ? 1 : -1;
}

function als_Owner_asc(a,b)
{
	var ra = lsAttacks[a].ownerName.toLowerCase(); var rb = lsAttacks[b].ownerName.toLowerCase();
	return  (ra < rb) ? -1 : ((ra > rb) ? 1 : als_Planet_asc(a,b));
}

function als_Owner_desc(a,b)
{
	var ra = lsAttacks[a].ownerName.toLowerCase(); var rb = lsAttacks[b].ownerName.toLowerCase();
	return  (ra < rb) ? 1 : ((ra > rb) ? -1 : als_Planet_desc(a,b));
}

function als_Def_asc(a,b)
{
	var ra = parseInt(lsAttacks[a].defPower, 10); var rb = parseInt(lsAttacks[b].defPower, 10);
	return  (ra < rb) ? -1 : ((ra > rb) ? 1 : als_Name_asc(a,b));
}

function als_Def_desc(a,b)
{
	var ra = parseInt(lsAttacks[a].defPower, 10); var rb = parseInt(lsAttacks[b].defPower, 10);
	return  (ra < rb) ? 1 : ((ra > rb) ? -1 : als_Name_desc(a,b));
}

function als_Att_asc(a,b)
{
	var ra = parseInt(lsAttacks[a].attPower, 10); var rb = parseInt(lsAttacks[b].attPower, 10);
	return  (ra < rb) ? -1 : ((ra > rb) ? 1 : als_Name_asc(a,b));
}

function als_Att_desc(a,b)
{
	var ra = parseInt(lsAttacks[a].attPower, 10); var rb = parseInt(lsAttacks[b].attPower, 10);
	return  (ra < rb) ? 1 : ((ra > rb) ? -1 : als_Name_desc(a,b));
}

function lec_Name_asc(a,b)
{
	var ra = a.name.toLowerCase(), rb = b.name.toLowerCase();
	return	(ra > rb) ? 1 : -1;
}

function lec_Name_desc(a,b)
{
	var ra = a.name.toLowerCase(), rb = b.name.toLowerCase();
	return	(ra < rb) ? 1 : -1;
}

function lec_Votes_asc(a,b)
{
	var ra = parseInt(a.nVotes,10), rb = parseInt(b.nVotes,10);
	return	(ra > rb) ? 1 : ((ra < rb) ? -1 : lec_Name_asc(a,b));
}

function lec_Votes_desc(a,b)
{
	var ra = parseInt(b.nVotes,10), rb = parseInt(a.nVotes,10);
	return	(ra > rb) ? 1 : ((ra < rb) ? -1 : lec_Name_desc(a,b));
}