var	pdUpdate;
var	orbit;
var	planet;
var	plId;
var	pdIsOwn;
var	miSel;
var	miDir = -1;
var	mlSel = -1;


//---------------------------------------------------------------------------
// PLANET LIST
//---------------------------------------------------------------------------

var	plUpdate;

function	drawPlanetList(data)
{
	var	cs = document.getElementById('oid').value;
	var	str, i, a, n, f;

	a = data.split('\n');
	n = parseInt(a.shift(),10);
	if	(n > 0)
	{
		str  = '';
		f = false;
		for	(i=0;i<n;i++)
		{
			var	d = a.shift().split('#');
			str += '<option value="' + d[0] + '"';
			if	(cs == d[0])
			{
				str += ' selected="selected"';
				f = true;
			}
			str += '>' + d[1] + '</option>';
		}
		str  = '<select name="id" onChange="submit();">' + (f ? '' : '<option>------</option>') + str + '</select>';
	}
	else
		str = '---';
	document.getElementById('psel').innerHTML = str;
	plUpdate = setTimeout('x_getPlanetList(drawPlanetList)', 600000);
}


//---------------------------------------------------------------------------
// GENERIC ORBIT OBJECT
//---------------------------------------------------------------------------

function	Orbit(type,id,x,y,orbit,name)
{
	this.type	= type;
	this.id		= id;
	this.x		= x;
	this.y		= y;
	this.orbit	= orbit;
	this.name	= name;
	this.fleets	= null;
	this.spec	= null;
	this.drawAll	= Orbit_drawAll;
	this.draw	= Orbit_draw;
	this.drawCoords	= Orbit_drawCoords;
	this.drawFleets	= Orbit_drawFleetSummary;
}

function	Orbit_drawAll()
{
	if	(!this.spec)
		return
	this.spec.drawLayout();
	this.draw();
}

function	Orbit_draw()
{
	this.drawFleets();
	if	(!this.spec.draw)
		return
	this.spec.draw();
}

function	Orbit_drawCoords()
{
	return	'<b>'+this.x+','+this.y+'</b>,'+this.orbit;
}


//---------------------------------------------------------------------------
// NEBULA OBJECT
//---------------------------------------------------------------------------

function	Nebula(orbit,opacity)
{
	this.orbit = orbit;
	this.opacity = opacity;
	this.drawLayout = Nebula_drawLayout;
}


//---------------------------------------------------------------------------
// REMAINS OBJECT
//---------------------------------------------------------------------------

function	Remains(orbit)
{
	this.orbit = orbit;
	this.drawLayout = Remains_drawLayout;
}


//---------------------------------------------------------------------------
// PLANET OBJECT
//---------------------------------------------------------------------------

function	Planet(orbit)
{
	this.orbit = orbit;
	this.bq = new Array();
	this.sellForm = null;

	this.drawLayout = Planet_drawLayout;
	this.draw = Planet_draw;
	this.drawBuildQueue = Planet_drawQueue;
}

function	BQItem()
{
	this.selected = false;
}

function	parsePlanetData(planet, l)
{
	var	a = l.shift().split('#');
	planet.isOwn = (a.shift() == '1');
	planet.vacation = (a.shift() == '1');
	planet.protection = (a.shift() == '1');
	planet.turrets = a.shift();
	planet.population = a.shift();
	planet.tFactories = a.shift();
	planet.iFactories = a.shift();
	planet.mFactories = a.shift();
	planet.happiness = a.shift();
	planet.corruption = a.shift();
	planet.profit = a.shift();
	planet.tag = a.join('#');
	if	(!planet.isOwn)
		return;

	// Actions and capabilities
	a = l.shift().split('#');
	planet.cAction = a.shift();
	if	(planet.cAction == '0')
	{
		planet.canRename = (a.shift() == '1');
		planet.canSell = (a.shift() == '1');
		planet.canDestroy = (a.shift() == '1');
		planet.canAbandon = (a.shift() == '1');
	}
	else if	(planet.cAction == '1')
	{
		planet.time = a.shift();
		planet.sellId = a.shift();
		planet.sellName = a.shift();
	}
	else
		planet.time = a.shift();
	planet.caps = l.shift().split('#');

	// Build queue
	var	i = 0, obq = planet.bq;
	planet.bq = new Array();
	while	(l.length)
	{
		var	bqi = (i<obq.length) ? obq[i] : new BQItem();
		a = l.shift().split('#');
		bqi.type = a.shift();
		bqi.qt = a.shift();
		bqi.ttb = a.shift();
		bqi.cttb = a.shift();
		planet.bq.push(bqi);
		i ++;
	}
}

function	Planet_drawQueue()
{
	var	i, str;
	if	(!this.bq.length)
		return getEmptyBQ();

	str  = '<table cellspacing="0" cellpadding="0" class="bqueue">';
	str += drawBQHeader();

	for	(i=0;i<this.bq.length;i++)
	{
		str += '<tr class="bql">';
		str += '<td><input type="checkbox" name="qbsel" value="';
		str += i + '" onClick="orbit.spec.bq['+i+'].selected=!orbit.spec.bq['+i+'].selected; return true;"';
		if	(this.bq[i].selected)
			str += ' checked="checked"';
		str += '/></td>';
		str += '<td class="bqqt"><b>' + this.bq[i].qt + '</b></td>';
		str += '<td>' + getBQItemName(this.bq[i].type, (this.bq[i].qt > 1)) + '</td>';
		str += '<td class="bqqt"><b>' + this.bq[i].ttb + '</b>h</td>';
		str += '<td class="bqqt"><b>' + this.bq[i].cttb + '</b>h</td>';
		str += '</tr>';
	}

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


//---------------------------------------------------------------------------
// PLANET SALE
//---------------------------------------------------------------------------

function	SellForm()
{
	this.mode = 0;
	this.player = '';
	this.price = 0;
	this.expires = 0;
	this.fleets = new Array();
	this.validate = SellForm_validate;
}

function	SellForm_validate()
{
	if	(this.mode < 2)
	{
		this.player = document.getElementById('pstarget').value;
		if	(this.player == '')
			return	1;
	}
	if	(this.mode != 0)
	{
		this.price = parseInt(document.getElementById('psprice').value, 10);
		if	(isNaN(this.price) || this.price <= 0)
			return	2;
	}
	if	(this.mode == 3 && this.expires == 0)
		return	3;

	return	0;
}


function	sellPlanet()
{
	x_getSellableFleets(orbit.id, gotFleetsList);
}


function	gotFleetsList(data)
{
	if	(data != "ERR#-1")
	{
		orbit.spec.sellForm = new SellForm();
		if	(data != "")
		{
			var	l = data.split('\n');
			while	(l.length)
			{
				var	a = l.shift().split('#');
				var	b = new Array();
				b.push(a.shift()); b.push(a.shift()); b.push(a.shift());
				b.push(a.shift()); b.push(a.shift()); b.push(a.shift());
				b.push(a.join('#')); b.push(false);
				orbit.spec.sellForm.fleets.push(b);
			}
		}
	}
	orbit.draw();
}

function	closeSaleForm()
{
	orbit.spec.sellForm = null;
	orbit.draw();
}

function	confirmSale()
{with(orbit.spec.sellForm){
	var	e = validate();
	if	(e)
	{
		saleError(e);
		return;
	}
	var	a = new Array();
	for	(e=0;e<fleets.length;e++)
		if	(fleets[e][7])
			a.push(fleets[e][0]);

	if	(!lockUpdate())
		return;

	if	(!userConfirmSale())
	{
		startUpdate();
		return;
	}

	x_planetSale(plId, mode, player, price, expires, a.join('#'), saleRequestSent);
}}

function	saleRequestSent(data)
{
	if	(data.indexOf('ERR#') == 0)
	{
		saleError(parseInt(data.substr(4), 10));
		startUpdate();
	}
	else
	{
		orbit.spec.sellForm = null;
		parseOrbitData(data);
	}
}

function	setSaleMode(m)
{
	orbit.spec.sellForm.mode = m;
	drawSaleForm();
}

function	removeSaleOffer()
{
	if	(!lockUpdate())
		return;
	if	(!confirmCancelSale())
	{
		startUpdate();
		return;
	}
	x_cancelSale(plId, plExecuteOk);
}


//---------------------------------------------------------------------------
// PAGE MANAGEMENT & DATA PARSING
//---------------------------------------------------------------------------

function	lockUpdate()
{
	if	(!pdUpdate)
		return	false;
	var	p = pdUpdate;
	pdUpdate = null;
	clearTimeout(p);
	return	true;
}

function	startUpdate()
{
	if	(pdUpdate)
		return;
	pdUpdate = setTimeout('x_getPlanetData(plId, parseOrbitData)', 60000);
}

function initPlanetPage() {
	plId = document.getElementById('oid').value;
	x_getPlanetList(drawPlanetList);
	x_getPlanetData(plId, parseOrbitData);
}

function	parseOrbitData(data)
{
	var	l = data.split('\n');
	var	a = l.shift().split('#');
	var	t = parseInt(a.shift());

	if	(orbit && orbit.type == t)
	{
		orbit.fleets = l.shift().split('#');
		if	(t == 0)
		{
			a.splice(0,4);
			orbit.name = a.join('#'); 
			parsePlanetData(orbit.spec, l);
		}
		orbit.draw();
	}
	else
	{
		orbit = new Orbit(t, a.shift(), a.shift(), a.shift(), a.shift(), a.join('#'));
		orbit.fleets = l.shift().split('#');
		if	(t >= 2)
			orbit.spec = new Nebula(orbit, t - 1);
		else if	(t == 1)
			orbit.spec = new Remains(orbit);
		else
		{
			orbit.spec = new Planet(orbit);
			parsePlanetData(orbit.spec, l);
		}
		orbit.drawAll();
	}
	startUpdate();
}


//---------------------------------------------------------------------------
// ACTIONS
//---------------------------------------------------------------------------

function	renamePlanet()
{
	if	(!lockUpdate())
		return;
	var	nn = promptNewName();
	if	(typeof nn == 'object' && !nn)
	{
		startUpdate();
		return;
	}
	x_rename(plId, nn, plExecuteOk);
}

function	factAction(ta, tf)
{
	var	n, str;
	if	(!lockUpdate())
		return;

	str = (tf == 1) ? 'mfc' : 'ifc';
	n = parseInt(document.getElementById(str).value, 10);
	if	(isNaN(n) || n <= 0)
	{
		plError(3);
		startUpdate();
		return;
	}
	if	(!factoryConfirm(ta, tf, n))
	{
		startUpdate();
		return;
	}
	x_factoryAction(plId, ta, n, tf, plExecuteOk);
}

function	addToQueue()
{
	if	(!lockUpdate())
		return;

	if	(mlSel == -1)
	{
		plError(1);
		startUpdate();
		return;
	}

	var	n = parseInt(document.getElementById('bwfq').value, 10);
	if	(isNaN(n) || n <= 0)
	{
		plError(2);
		startUpdate();
		return;
	}
	x_addToQueue(plId, n, mlSel, plExecuteOk);
}

function	getSelectedItems()
{
	var	j, s = new Array();
	for	(j=0;j<orbit.spec.bq.length;j++)
	{
		if	(orbit.spec.bq[j].selected)
			s.push(j);
	}
	return	s;
}

function	replaceItems()
{
	if	(!lockUpdate())
		return;

	if	(mlSel == -1)
	{
		plError(1);
		startUpdate();
		return;
	}

	var	n = parseInt(document.getElementById('bwfq').value, 10);
	if	(isNaN(n) || n <= 0)
	{
		plError(4);
		startUpdate();
		return;
	}

	var	sel = getSelectedItems();
	if	(sel.length == 0)
	{
		plError(5);
		startUpdate();
		return;
	}

	x_replaceItems(plId, sel.join('#'), n, mlSel, plExecuteOk);
}

function	moveItems(dir)
{
	if	(!lockUpdate())
		return;

	var	sel = getSelectedItems();
	if	(!sel.length)
	{
		plError(5);
		startUpdate();
		return;
	}

	var	n, ts = '!' + sel.join('!') + '!';
	if	(dir == 1)
	{
		if	(ts.indexOf('!0!') != -1)
		{
			plError(6);
			startUpdate();
			return;
		}
	}
	else
	{
		n = orbit.spec.bq.length - 1;
		if	(ts.indexOf('!' + n + '!') != -1)
		{
			plError(7);
			startUpdate();
			return;
		}
	}
	miSel = sel;
	miDir = dir;
	x_moveItems(plId, sel.join('#'), dir, plExecuteOk);
}

function	deleteItems()
{
	if	(!lockUpdate())
		return;
	var	sel = getSelectedItems();
	if	(sel.length == 0)
	{
		plError(5);
		startUpdate();
		return;
	}
	x_deleteItems(plId, sel.join('#'), plExecuteOk);
}

function	flushQueue()
{
	if	(!lockUpdate())
		return;
	var	c = alertFlush();
	if	(!c)
	{
		startUpdate();
		return;
	}
	x_flushQueue(plId, plExecuteOk);
}

function	moveSelection()
{
	var	i, j, s, ni;
	s = '';
	for	(i=0;i<miSel.length;i++)
	{
		j = parseInt(miSel[i], 10);
		ni = j + (miDir ? -1 : 1);
		if	(s.indexOf('!'+j+'!') == -1)
			orbit.spec.bq[j].selected = false;
		orbit.spec.bq[ni].selected = true;
		s += '!'+ni+'!';
	}
}

function	plExecuteOk(data)
{
	if	(data.indexOf('ERR#') == 0)
	{
		plError(parseInt(data.substr(4), 10));
		if	(data.substr(4) == "-1")
		{
			history.go(0);
			return;
		}
		startUpdate();
	}
	else
	{
		if	(miDir != -1)
		{
			moveSelection();
			miDir = -1;
		}
		updateHeader();
		parseOrbitData(data);
	}
}

function	abandonPlanet()
{
	if	(!lockUpdate())
		return;
	if	(!confirmAbandon())
	{
		startUpdate();
		return;
	}
	x_abandon(plId, plExecuteOk);
}

function	cancelAbandon()
{
	if	(!lockUpdate())
		return;
	if	(!confirmCancelAbandon())
	{
		startUpdate();
		return;
	}
	x_cancelAbandon(plId, plExecuteOk);
}

function	destroyPlanet()
{
	if	(!lockUpdate())
		return;
	if	(!confirmDestroy())
	{
		startUpdate();
		return;
	}
	x_blowItUp(plId, plExecuteOk);
}

function	cancelDestruction()
{
	if	(!lockUpdate())
		return;
	if	(!confirmCancelDestruction())
	{
		startUpdate();
		return;
	}
	x_cancelDestruction(plId, plExecuteOk);
}

function	destroyTurrets()
{
	if	(!lockUpdate())
		return;
	var	nn = promptDestroyTurrets();
	if	(typeof nn == 'object' && !nn)
	{
		startUpdate();
		return;
	}
	x_destroyTurrets(plId, nn, plExecuteOk);
}