var autoUpdate, autoLock, onMainPage = false; var allies, fleets, locations, players, myself; var fAutoId = 0; var listLocations, listMode, fDispMode, alliesMode; var sType, sText; var ppList, apList, opList, mfList, wfList; var fSel, fDisp, splitParam; var orderFleets, moveTo, moveToLoc, orderMode, waitTime, selCanHS, guessOrders, gDest, gWait, sMovex, sMovey; var dMapX, dMapY, newDest, map, loadingMap = false, readingMoveLocation = false; var mapCType, mapParm; var trajectories, lTraj, trajLock; var fleetTrajectory, sales; var mapRemember = false; var mFleetSelectable, mFleetSelected; var wFleetSelectable, wFleetSelected; function Ally(id, isMe, fSpace, gSpace, cHaul, bHaul, gaPop, canSell) { this.id = id; this.isMe = isMe; this.gSpace = gSpace; this.fSpace = fSpace; this.cHaul = cHaul; this.bHaul = bHaul; this.gaPop = gaPop; this.canSell = canSell; this.getName = Ally_getName; this.planets = new Array(); this.fleets = new Array(); this.gasAt = new Hashtable(); if (isMe) myself = this; } function Ally_getName() { return players.get(this.id); } function Fleet(id, owner, gaships, fighters, cruisers, bcruisers, power, mode, upkeep, name) { this.id = (id == "" ? ("a" + (++fAutoId)) : id); this.owner = owner; this.ships = [gaships,fighters,cruisers,bcruisers]; this.power = power; this.upkeep = upkeep; this.mode = mode; this.name = name; this.selected = false; this.orders = null; } function FLocation(id, canMove) { this.oType = 0; this.locId = id; this.loc = null; this.canMove = canMove; } function FMove(to, from, now, eta, hs, reroute) { this.oType = 1; this.fromId = from; this.from = null; this.toId = to; this.to = null; this.curId = now; this.cur = null; this.eta = eta; this.wait = null; this.hyperspace = (hs == '1'); this.reroute = parseInt(reroute,10); } function FWait(loc, from, left, spent, minLoss, maxLoss) { this.oType = 2; this.fromId = from; this.from = null; this.locId = loc; this.loc = null; this.spent = spent; this.left = left; this.minLoss = minLoss; this.maxLoss = maxLoss; } function FOnSale(loc, sale, ib) { this.oType = 3; this.locId = loc; this.loc = null; this.saleId = sale; this.inBundle = (ib == 1); } function FSold(loc, sale, soldTo, timeLeft, ib) { this.oType = 4; this.locId = loc; this.loc = null; this.soldTo = soldTo; this.timeLeft = timeLeft; this.saleId = sale; this.inBundle = (ib == 1); } function FleetLocation(id, opacity, x, y, orbit, name) { this.id = id; this.opacity = opacity; this.x = x; this.y = y; this.orbit = orbit; this.name = name; this.fleets = new Array(); this.details = null; this.updateSelection = function () { var e = document.getElementById('fsel-p-' + this.id); if (!e) { return; } if (this.selectableFleets == 0) { e.innerHTML = ' '; return; } e.innerHTML = '<input type="checkbox" name="psel-all-' + this.id + '" id="psel-all-' + this.id + '" onclick="locations.get(' + this.id + ').selectAll();"' + (this.selectableFleets == this.selectedFleets ? ' checked="checked"' : '') + ' />'; }; this.selectAll = function () { if (autoLock) { setTimeout('locations.get(' + this.id + ').selectAll()', 500); return; } autoLock = true; if (this.selectableFleets == 0) { autoLock = false; return; } for (var i in this.fleets) { var e = document.getElementById('fsel' + this.fleets[i].id); if (!e) { continue; } e.checked = this.fleets[i].selected = !(this.selectableFleets == this.selectedFleets); } if (this.selectableFleets == this.selectedFleets) { this.selectedFleets = 0; } else { this.selectedFleets = this.selectableFleets; } updateActions(); autoLock = false; }; } function PlanetDetails(owner, turrets, tPower, pop, vacation, protection, tag) { this.owner = owner; this.turrets = turrets; this.tPower = tPower; this.pop = pop; this.vacation = (vacation == 1); this.protection = (protection == 1); this.tag = tag; } function FilteredLocation(id) { this.id = id; this.fleetLocation = locations.get(id); this.fleets = new Array(); } function MapSystem(x, y, opacity, prot) { this.x = x; this.y = y; this.opacity = opacity; this.protection = prot; this.locations = new Array(); } function MapLocation(id, x, y, orbit, opacity, ally, name) { this.id = id; this.x = x; this.y = y; this.orbit = orbit; this.color = parseInt(opacity, 10); if (this.color != 0) this.color += 2; else this.color = parseInt(ally); this.name = name; } function WayPoint(x, y, orbit, eta, name) { this.name = name; this.coords = "(" + x + "," + y + "," + orbit + ")"; this.eta = eta; } function FleetTrajectory(fid, from, to, changed, left, hs, wait) { this.fleetId = fid; this.fleet = fleets.get(fid); this.from = from; this.to = to; this.changed = parseInt(changed,10); this.left = parseInt(left,10); this.hyperspace = (hs == '1'); this.wait = parseInt(wait,10); this.waypoints = new Array(); } function FleetWayPoint(id, eta, sys, orb, op, name) { this.id = id; this.eta = parseInt(eta,10); this.system = sys; this.orbit = orb; this.opacity = op; this.name = name; } function FleetSale(loc) { this.id = loc; this.fleetLocation = locations.get(loc); this.mode = 0; this.player = ''; this.price = 0; this.priceText = ''; this.expires = 0; this.isValid = false; this.error = -1; this.fleets = new Array(); this.drawForm = FleetSale_drawForm; this.update = FleetSale_update; this.validate = FleetSale_validate; this.setMode = FleetSale_setMode; this.setExpire = FleetSale_setExpire; } function FleetSale_setMode(m) { this.mode = m; this.update(); this.validate(); } function FleetSale_setExpire(x) { this.expires = x; this.validate(); } function FleetSale_update() { var id = 's' + this.id, c0 = 'sales.get('+this.id+').validate();return true', code = ' onChange="'+c0+'" onKeyUp="'+c0+'" onClick="'+c0+'" ';; switch (this.mode) { case 0: if (document.getElementById(id+'price')) document.getElementById(id+'pril').innerHTML = document.getElementById(id+'pri').innerHTML = ' '; if (!document.getElementById(id+'target')) { document.getElementById(id+'tar').innerHTML = '<input type="text" name="'+id+'target" id="'+id+'target"'+code+' />'; document.getElementById(id+'tarl').innerHTML = '<label for="'+id+'target">' + salesText[0] + '</label>'; } document.getElementById(id+'target').value = this.player; break; case 1: if (!document.getElementById(id+'price')) document.getElementById(id+'pri').innerHTML = '<input type="text" name="'+id+'price" id="'+id+'price"'+code+' />'; if (!document.getElementById(id+'target')) { document.getElementById(id+'tar').innerHTML = '<input type="text" name="'+id+'target" id="'+id+'target"'+code+' />'; document.getElementById(id+'tarl').innerHTML = '<label for="'+id+'target">' + salesText[0] + '</label>'; } document.getElementById(id+'pril').innerHTML = '<label for="'+id+'price">' + salesText[1] + '</label>'; document.getElementById(id+'target').value = this.player; document.getElementById(id+'price').value = this.priceText; break; case 2: case 3: if (!document.getElementById(id+'price')) document.getElementById(id+'pri').innerHTML = '<input type="text" name="'+id+'price" id="'+id+'price"'+code+' />'; if (document.getElementById(id+'target')) document.getElementById(id+'tar').innerHTML = document.getElementById(id+'tarl').innerHTML = ' '; document.getElementById(id+'pril').innerHTML = '<label for="'+id+'price">' + salesText[this.mode-1] + '</label>'; document.getElementById(id+'price').value = this.priceText; break; } } function FleetSale_validate() { this.isValid = false; this.error = -1; if (document.getElementById('s'+this.id+'target')) this.player = document.getElementById('s'+this.id+'target').value; if (document.getElementById('s'+this.id+'price')) { this.priceText = document.getElementById('s'+this.id+'price').value; this.price = parseInt(this.priceText, 10); } if (this.mode < 2 && this.player == '') { this.error = 1; drawSellLinks(false); return; } if (this.mode != 0 && (isNaN(this.price) || this.price <= 0)) { this.error = 2; drawSellLinks(false); return; } if (this.mode == 3 && this.expires == 0) { this.error = 3; drawSellLinks(false); return; } this.isValid = true; checkAllSales(); } function getTrajectory(fleet, to) { var fLoc = (fleet.orders.oType != 1 ? fleet.orders.loc : fleet.orders.cur); var key = fLoc.id + ';' + ((fleet.ships[2] != 0 || (fleet.ships[2] == 0 && fleet.ships[3] == 0)) ? 1 : 0) + ';' + fleet.owner + ';' + to.id; if (trajectories.containsKey(key)) return trajectories.get(key); if (('#' + lTraj.join('#') + '#').indexOf('#' + key + '#') == -1) { lTraj.push(key); x_getTrajectory(key, gotTrajectory); } return null; } function gotTrajectory(data) { if (data == "") return; while (trajLock); trajLock = true; var l = data.split('\n'); var t = new Array(), key = l.shift(), a, w, eta = 0; while (l.length) { a = l.shift().split('#'); w = new WayPoint(a.shift(), a.shift(), a.shift(), (eta += parseInt(a.shift(), 10)), a.join('#')); t.push(w); } trajectories.put(key, t); t = new Array(); for (a=0;a<lTraj.length;a++) if (lTraj[a] != key) t.push(lTraj[a]); lTraj = t; trajLock = false; updateTrajectories(); } function initFleets() { fSel = new Array(); trajectories = new Hashtable(); lTraj = new Array(); var e = document.getElementById('finit'); if (!e) return; e = e.innerHTML; var pm; if (e.charAt(0) == '-') { pm = "parseMainData"; e = e.substr(2, e.length - 2); } else { var i = 0, s = ''; while (e.charAt(i) != ' ') { s += e.charAt(i); i++; } i ++; e = e.substr(i, e.length - i); moveTo = parseInt(s, 10); pm = "parseMainDataMove"; } map = new Hashtable(); if (e.indexOf('\n') == -1) { eval("x_getFleetsList("+pm+")"); } else { eval(pm+"(e)"); } } function parseAllies(l, nAllies) { var i, a, o; allies = new Hashtable(); for (i=0;i<nAllies;i++) { a = l.shift().split('#'); o = new Ally(a.shift(), (a.shift() == '1'), a.shift(), a.shift(), a.shift(), a.shift(), a.shift(), (a.shift() == '0')); allies.put(o.id, o); } } function parseFleets(l, nFleets) { var i, a, o, fs = '#' + fSel.join('#') + '#'; fleets = new Hashtable(); var p = new Array(); for (i=0;i<nFleets;i++) { a = l.shift().split('#'); o = new Fleet(a.shift(), a.shift(), a.shift(), a.shift(), a.shift(), a.shift(), a.shift(), a.shift(), a.shift(), a.join('#')); p.push(o.owner); a = l.shift().split('#'); if (o.mode < 2) o.orders = new FLocation(a[0],a[1]); else if (o.mode == 2) { o.orders = new FMove(a[0],a[1],a[2],a[4],a[5],a[6]); if (a[3] == 2) { a = l.shift().split('#'); o.orders.wait = new FWait(a[0],a[1],a[2],a[3],a[4],a[5]); o.mode = a[6]; } else o.mode = a[3]; } else if (o.mode == 3) { o.orders = new FWait(a[0],a[1],a[2],a[3],a[4],a[5]); o.mode = a[6]; } else if (o.mode == 4) { o.orders = new FOnSale(a[0], a[1], a[2]); o.mode = 0; } else if (o.mode == 5) { o.orders = new FSold(a[0], a[1], a[2], a[3], a[4]); o.mode = 0; } o.selected = (fs.indexOf('#'+o.id+'#') != -1); fleets.put(o.id, o); } return p; } function parsePlanets(l, nPlanets, pl) { var i, a, b, o; locations = new Hashtable(); for (i=0;i<nPlanets;i++) { a = l.shift().split('#'); o = new FleetLocation(a.shift(),a.shift(),a.shift(),a.shift(),a.shift(),a.join('#')); if (o.opacity == 0) { a = l.shift().split('#'); o.details = new PlanetDetails(a.shift(), a.shift(), a.shift(), a.shift(), a.shift(), a.shift(), a.join('#')); if (o.details.owner != '') { pl.push(o.details.owner); a = allies.get(o.details.owner); a.planets.push(o); } } locations.put(o.id, o); } } function parsePlayers(l, pl) { var a,o,i,str,np; str = ""; np = 0; for (i=0;i<pl.length;i++) { if (str.indexOf('#'+pl[i]+'#') != -1) continue; np++; str += '#' + pl[i] + '#'; } players = new Hashtable(); for (i=0;i<np;i++) { a = l.shift().split('#'); players.put(a[0], a[1]); } } function linkMainData() { var i, f, a, p, fl; fl = fleets.keys(); for (i=0;i<fl.length;i++) { f = fleets.get(fl[i]); a = allies.get(f.owner); if (a) a.fleets.push(f); if (f.orders.oType == 1) { f.orders.to = locations.get(f.orders.toId); f.orders.from = locations.get(f.orders.fromId); f.orders.cur = locations.get(f.orders.curId); if (f.orders.wait) { f.orders.wait.from = f.orders.from; f.orders.wait.loc = f.orders.to; } } else if (f.orders.oType == 2) { f.orders.loc = locations.get(f.orders.locId); f.orders.from = locations.get(f.orders.fromId); } else { p = locations.get(f.orders.locId); f.orders.loc = p; p.fleets.push(f); if (a && p.details && p.details.owner != a.id) { var g; if (a.gasAt.containsKey(p.id)) g = a.gasAt.get(p.id); else g = 0; g += parseInt(f.ships[0], 10); a.gasAt.put(p.id, g); } } } } function prepareUpdate() { var i,k; fSel = new Array(); k = fleets.keys(); for (i=0;i<k.length;i++) { var f = fleets.get(k[i]); if (f.selected) fSel.push(f.id); } } function mainDataUpdate() { if (autoLock) { setTimeout('mainDataUpdate()', 500); return; } autoLock = true; prepareUpdate(); x_getFleetsList(parseMainData); } // The infamous filtering function function applyFilters() { var i, keys, pln, flt; ppList = new Hashtable(); apList = new Hashtable(); opList = new Hashtable(); mfList = new Array(); wfList = new Array(); keys = locations.keys(); pln = new Array(); for (i=0;i<keys.length;i++) { var p = locations.get(keys[i]); if ( ( listLocations == 0 || listLocations == 1 && p.details && p.details.owner == myself.id || listLocations == 2 && p.details && p.details.owner != myself.id && p.details.owner != '' || listLocations == 3 && (!p.details || p.details.owner == '') ) && ( sType != 1 || sType == 1 && (sText == '' || p.name.toLowerCase().indexOf(sText.toLowerCase()) != -1) ) ) pln.push(keys[i]); } keys = fleets.keys(); flt = new Array(); for (i=0;i<keys.length;i++) { var f = fleets.get(keys[i]); if ( (listMode == 0 || listMode - 1 == f.mode) && ( fDispMode == 0 || fDispMode == 1 && f.orders.oType == 0 && f.orders.canMove == 'Y' || fDispMode == 2 && f.orders.oType == 0 && f.orders.canMove != 'Y' || fDispMode > 2 && fDispMode - 2 == f.orders.oType ) && ( alliesMode == 0 || alliesMode == 1 && f.owner == myself.id || alliesMode == 2 && f.owner != myself.id && allies.get(f.owner) || alliesMode == 3 && !allies.get(f.owner) ) && ( sType == 1 || sType == 0 && (sText == '' || f.name.toLowerCase().indexOf(sText.toLowerCase()) != -1) || sType == 2 && (sText == '' || players.get(f.owner).toLowerCase().indexOf(sText.toLowerCase()) != -1) ) ) flt.push(keys[i]); } if (fDispMode < 3) { if (listLocations < 2) for (i=0;i<myself.planets.length;i++) ppList.put(myself.planets[i].id, new FilteredLocation(myself.planets[i].id)); if (listLocations == 0 || listLocations == 2) { keys = allies.keys(); for (i=0;i<keys.length;i++) { var j, p=allies.get(keys[i]); if (p.isMe) continue; for (j=0;j<p.planets.length;j++) apList.put(p.planets[j].id, new FilteredLocation(p.planets[j].id)); } } } var pStr = '#'+pln.join('#')+'#'; for (i=0;i<flt.length;i++) { var p, l, f = fleets.get(flt[i]); switch (f.orders.oType) { case 0: case 3: case 4: p = f.orders.loc; if (pStr.indexOf('#' + p.id + '#') == -1) continue; if (!p.details || p.details.owner == "") l = opList; else if (p.details && p.details.owner != myself.id) l = apList; else l = ppList; p = l.get(f.orders.locId); if (!p) { p = new FilteredLocation(f.orders.locId); l.put(p.id, p); } p.fleets.push(f.id); break; case 1: if ( pStr.indexOf('#' + f.orders.toId + '#') == -1 && pStr.indexOf('#' + f.orders.fromId + '#') == -1 && pStr.indexOf('#' + f.orders.curId + '#') == -1 ) continue; mfList.push(f); break; case 2: if ( pStr.indexOf('#' + f.orders.locId + '#') == -1 && pStr.indexOf('#' + f.orders.fromId + '#') == -1 ) continue; wfList.push(f); break; } } } function changeFilters(fVar, fVal) { var r; eval("r = ("+fVar+"==fVal);"); if (r) return; if (autoLock) { setTimeout('changeFilters(fVar, fVal)', 500); return; } lockUpdate(); x_setFilter(fVar, fVal, function(){ }); eval(fVar + '=fVal;'); applyFilters(); drawMainContents(); unlockUpdate(); } function selectFleet(id) { if (autoLock) { setTimeout('selectFleet('+id+')', 500); return; } autoLock = true; var f = fleets.get(id); f.selected = !f.selected; if (f.orders.oType == 1) { mFleetSelected += (f.selected ? 1 : -1); updateMovingSelection(); } else if (f.orders.oType == 2) { wFleetSelected += (f.selected ? 1 : -1); updateWaitingSelection(); } else { var loc = f.orders.loc; loc.selectedFleets += (f.selected ? 1 : -1); loc.updateSelection(); } updateActions(); autoLock = false; } function updateWaitingSelection () { var e = document.getElementById('f-hssb-sel'); if (!e) { return; } if (wFleetSelectable == 0) { e.innerHTML = ' '; return; } e.innerHTML = '<input type="checkbox" name="wsel-all" id="wsel-all" onclick="selectAllWaitingFleets()"' + (wFleetSelectable == wFleetSelected ? ' checked="checked"' : '') + ' />'; } function selectAllWaitingFleets () { if (autoLock) { setTimeout('selectAllWaitingFleets()', 500); return; } autoLock = true; if (wFleetSelectable == 0) { autoLock = false; return; } for (var i in wfList) { var e = document.getElementById('fsel' + wfList[i].id); if (!e) { continue; } e.checked = wfList[i].selected = !(wFleetSelectable == wFleetSelected); } if (wFleetSelectable == wFleetSelected) { wFleetSelected = 0; } else { wFleetSelected = wFleetSelectable; } updateActions(); autoLock = false; } function updateMovingSelection () { var e = document.getElementById('f-move-sel'); if (!e) { return; } if (mFleetSelectable == 0) { e.innerHTML = ' '; return; } e.innerHTML = '<input type="checkbox" name="msel-all" id="msel-all" onclick="selectAllMovingFleets()"' + (mFleetSelectable == mFleetSelected ? ' checked="checked"' : '') + ' />'; } function selectAllMovingFleets () { if (autoLock) { setTimeout('selectAllMovingFleets()', 500); return; } autoLock = true; if (mFleetSelectable == 0) { autoLock = false; return; } for (var i in mfList) { var e = document.getElementById('fsel' + mfList[i].id); if (!e) { continue; } e.checked = mfList[i].selected = !(mFleetSelectable == mFleetSelected); } if (mFleetSelectable == mFleetSelected) { mFleetSelected = 0; } else { mFleetSelected = mFleetSelectable; } updateActions(); autoLock = false; } function updateActions() { var cRen = false, cTraj = true, cMove = true, cSwitch = true, cMerge = true, cDisband = true, cSell = myself.canSell, cCancelSale = myself.canSell; var i, n, ns; for (i=n=ns=0;i<fDisp.length;i++) { var f = fDisp[i]; if (!f.selected) continue; ns += parseInt(f.ships[0], 10) + parseInt(f.ships[1], 10) + parseInt(f.ships[2], 10) + parseInt(f.ships[3], 10); cRen = true; cTraj = cTraj && f.orders.oType == 1; cMove = cMove && (f.orders.oType < 3 && f.orders.oType != 0 || f.orders.canMove == 'Y'); cMerge = cMerge && !(f.orders.oType == 3 || f.orders.oType == 4) && (f.orders.oType != 0 || f.orders.canMove == 'Y'); cSwitch = cSwitch && !(f.orders.oType == 3 || f.orders.oType == 4) && (f.orders.oType != 1 && ( !f.orders.loc.details || f.orders.loc.details && f.orders.loc.details.owner != f.owner ) || f.orders.oType == 1 && ( !f.orders.to.details || f.orders.to.details && f.orders.to.details.owner != f.owner )); cDisband = cDisband && (f.owner == myself.id) && !(f.orders.oType == 3 || f.orders.oType == 4); cSell = cSell && (f.owner == myself.id) && (f.orders.oType == 0) && (f.mode == 0) && (f.orders.canMove == 'Y'); cCancelSale = cCancelSale && (f.orders.oType == 3 || f.orders.oType == 4) && !f.orders.inBundle && (f.owner == myself.id); n++; } if (!cRen) { document.getElementById('factions').innerHTML = actionText[0]; return; } i = '<a href="#" onClick="clearSelection();return false">' + actionText[9] + '</a>' + ' - <a href="#" onClick="renameSelected();return false">' + actionText[1] + '</a>'; if (cTraj && n == 1) i += ' - <a href="#" onClick="viewTrajectory();return false">' + actionText[8] + '</a>'; if (cMove) i += ' - <a href="#" onClick="moveSelected();return false">' + actionText[2] + '</a>'; if (cSwitch) i += ' - <a href="#" onClick="switchSelected();return false">' + actionText[3] + '</a>'; if (cMerge && n > 1) i += ' - <a href="#" onClick="mergeSelected();return false">' + actionText[5] + '</a>'; if (cMerge && n == 1 && ns > 1) i += ' - <a href="#" onClick="splitSelected();return false">' + actionText[4] + '</a>'; if (cSell) i += ' - <a href="#" onClick="sellSelected();return false">' + actionText[6] + '</a>'; if (cCancelSale) { if (n == 1) i += ' - <a href="#" onClick="viewSaleSelected();return false">' + actionText[11] + '</a>'; i += ' - <a href="#" onClick="cancelSaleSelected();return false">' + actionText[10] + '</a>'; } if (cDisband) i += ' - <a href="#" onClick="disbandSelected();return false">' + actionText[7] + '</a>'; document.getElementById('factions').innerHTML = i; } function drawFleetLine(fleet,type,hasSel) { var o = allies.get(fleet.owner); var i, str = '<tr class="fl'+type+'">'; var sc = ''; if (hasSel) { str += '<td class="fsel">'; if (o && (fleet.orders.oType != 3 && fleet.orders.oType != 4 || !fleet.orders.inBundle)) { str += '<input type="checkbox" id="fsel'+fleet.id+'" name="fsel'+fleet.id+'" value="1" ' + (fleet.selected ? 'checked="checked" ' : '') + ' onClick="selectFleet('+fleet.id+');return true" />'; fDisp.push(fleet); sc = ' onclick="with (document.getElementById(\'fsel'+fleet.id+'\')) { checked = !checked; };' + 'selectFleet('+fleet.id+');return true" '; var loc = fleet.orders.loc; loc.selectableFleets ++; loc.selectedFleets += (fleet.selected ? 1 : 0); } else { str += ' '; } str += '</td>'; } str += '<td'; if (myself.id != fleet.owner) { str += '><a href="message?a=c&ct=0&id=' + fleet.owner + '">'; } else { str += sc + '>'; } str += players.get(fleet.owner); str += '</td><td'; if (o) str += ' onClick="renameFleet(' + fleet.id + ');return false"'; str += '>' + fleet.name + '</td><td class="fhs"' + sc + '>'; if (o) { var used = fleet.ships[0] * o.gSpace + fleet.ships[1] * o.fSpace; var haul = fleet.ships[2] * o.cHaul + fleet.ships[3] * o.bHaul; if (haul == 0) str += 'N/A'; else { var hp = Math.round(used * 100 / haul); str += (hp > 200) ? '>200%' : (hp + '%'); } } else str += ' '; str += '</td>'; for (i=0;i<4;i++) str += '<td class="fshp"' + sc + '>'+formatNumber(fleet.ships[i])+'</td>'; str += '<td class="fpwr"' + sc + '>'+formatNumber(fleet.power)+'</td><td class="fstat"' + sc + '>'; if (fleet.orders.oType == 0) str += (fleet.mode == 1 ? statusText[0] : statusText[1]) + ', ' + (fleet.orders.canMove == 'Y' ? statusText[2] : statusText[3]); else if (fleet.orders.oType == 3) str += statusText[4] + (fleet.orders.inBundle ? statusText[6] : ''); else if (fleet.orders.oType == 4) str += statusText[5]; str += '</td></tr>'; return str; } function drawMovingFleetLine(fleet, hasSel) { var o = allies.get(fleet.owner); var i, str = '<tr><td class="flt"><table class="mfltl">'; var sc = ''; str += '<tr class="fl'+(fleet.owner==myself.id?'own':'ally')+'">'; if (hasSel) { str += '<td class="fsel" rowspan="2"><input type="checkbox" id="fsel' + fleet.id + '" name="fsel' + fleet.id + '" value="1" ' + (fleet.selected ? 'checked="checked" ' : '') + ' onClick="selectFleet(' + fleet.id + ');return true" /></td>'; mFleetSelectable ++; mFleetSelected += (fleet.selected ? 1 : 0); fDisp.push(fleet); sc = ' onclick="with (document.getElementById(\'fsel'+fleet.id+'\')) { checked = !checked; };' + 'selectFleet('+fleet.id+');return true" '; } str += '<td class="fown" rowspan="2"'; if (myself.id != fleet.owner) { str += '><a href="message?a=c&ct=0&id=' + fleet.owner + '">'; } else { str += sc + '>'; } str += players.get(fleet.owner); if (myself.id != fleet.owner) str += '</a>'; str += '</td><td onClick="renameFleet(' + fleet.id + ');return false"'; str += ' class="fname" rowspan="2">' + fleet.name + '</td><td class="fhs"' + sc + '>'; var used = fleet.ships[0] * o.gSpace + fleet.ships[1] * o.fSpace; var haul = fleet.ships[2] * o.cHaul + fleet.ships[3] * o.bHaul; if (haul == 0) str += 'N/A'; else { var hp = Math.round(used * 100 / haul); str += (hp > 200) ? '>200%' : (hp + '%'); } str += '</td>'; for (i=0;i<4;i++) str += '<td class="fshp"' + sc + '>'+formatNumber(fleet.ships[i])+'</td>'; str += '<td class="fpwr"' + sc + '>'+formatNumber(fleet.power)+'</td>'; str += '<td class="fstat"' + sc + '>' + (fleet.mode == 1 ? statusText[0] : statusText[1]) + '</td></tr>'; str += '<tr class="fl'+(fleet.owner==myself.id?'own':'ally')+'">'; str += '<td class="fdest" colspan="2"><a href="planet?id=' + fleet.orders.curId + '">' + fleet.orders.cur.name + '</a>'; if (fleet.orders.cur.details && fleet.orders.cur.details.tag != '') { str += ' [' + fleet.orders.cur.details.tag + ']'; } str += '</td><td class="floc" colspan="2"><a href="planet?id=' + fleet.orders.toId + '">' + fleet.orders.to.name + '</a>'; if (fleet.orders.to.details && fleet.orders.to.details.tag != '') { str += ' [' + fleet.orders.to.details.tag + ']'; } str += '</td><td class="feta"' + sc + '>' + fleet.orders.eta + ' min</td><td class="fstd" colspan="2"' + sc + '>'; if (fleet.orders.wait) { str += fleet.orders.wait.left + 'h ('; if (fleet.orders.wait.maxLoss == 0) str += '0%'; else str += fleet.orders.wait.minLoss + '% - ' + fleet.orders.wait.maxLoss + '%'; str += ')'; } else str += 'N/A'; str += '</td></tr></table></td></tr>'; return str; } function drawWaitingFleetLine(fleet,hasSel) { var o = allies.get(fleet.owner); var i, str = '<tr><td class="flt"><table class="wfltl">'; var sc = ''; str += '<tr class="fl'+(fleet.owner==myself.id?'own':'ally')+'">'; if (hasSel) { str += '<td class="fsel" rowspan="2"><input type="checkbox" name="fsel' + fleet.id + '" id="fsel'+fleet.id+'" value="1" ' + (fleet.selected ? 'checked="checked" ' : '') + ' onClick="selectFleet(' + fleet.id + ');return true" /></td>'; wFleetSelectable ++; wFleetSelected += (fleet.selected ? 1 : 0); fDisp.push(fleet); sc = ' onclick="with (document.getElementById(\'fsel'+fleet.id+'\')) { checked = !checked; };' + 'selectFleet('+fleet.id+');return true" '; } str += '<td class="fown" rowspan="2"'; if (myself.id != fleet.owner) { str += '><a href="message?a=c&ct=0&id=' + fleet.owner + '">'; } else { str += sc + '>'; } str += players.get(fleet.owner); if (myself.id != fleet.owner) str += '</a>'; str += '</td><td onClick="renameFleet(' + fleet.id + ');return false"'; str += ' class="fname" rowspan="2">' + fleet.name + '</td><td ' + sc + 'class="fhs">'; var used = fleet.ships[0] * o.gSpace + fleet.ships[1] * o.fSpace; var haul = fleet.ships[2] * o.cHaul + fleet.ships[3] * o.bHaul; if (haul == 0) str += 'N/A'; else { var hp = Math.round(used * 100 / haul); str += (hp > 200) ? '>200%' : (hp + '%'); } str += '</td>'; for (i=0;i<4;i++) str += '<td' + sc + ' class="fshp">'+formatNumber(fleet.ships[i])+'</td>'; str += '<td' + sc + ' class="fpwr">'+formatNumber(fleet.power)+'</td>'; str += '<td' + sc + ' class="fstat">' + (fleet.mode == 1 ? statusText[0] : statusText[1]) + '</td></tr>'; str += '<tr class="fl'+(fleet.owner==myself.id?'own':'ally')+'">' + '<td class="floc" colspan="2"><a href="planet?id=' + fleet.orders.locId + '">' + fleet.orders.loc.name + '</a>'; if (fleet.orders.loc.details && fleet.orders.loc.details.tag != '') { str += ' [' + fleet.orders.loc.details.tag + ']'; } str += '</td><td' + sc + ' class="ftime" colspan="2">' + fleet.orders.spent + 'h</td><td' + sc + ' class="ftime" colspan="2">' + fleet.orders.left + 'h</td><td' + sc + ' class="floss">'; if (fleet.orders.maxLoss == 0) str += '0%'; else str += fleet.orders.minLoss + '% - ' + fleet.orders.maxLoss + '%'; str += '</td></tr></table></td></tr>'; return str; } function drawMainContents() { fDisp = new Array(); if (ppList.size() == 0 && apList.size() == 0 && opList.size() == 0 && mfList.length == 0 && wfList.length == 0) { document.getElementById('fmain').innerHTML = '<center>'+noFleetsFound+'</center>'; return; } var i,sz,keys,j,p,f,str = ''; if ((sz = ppList.size()) != 0) { str += '<h1>'+sectionTitles[0]+'</h1>'; keys = ppList.keys(); keys.sort(sortPPList); for (i=0;i<sz;i++) str += drawPlanetBox(ppList.get(keys[i])); } if ((sz = apList.size()) != 0) { str += '<h1>'+sectionTitles[1]+'</h1>'; keys = apList.keys(); keys.sort(sortAPList); for (i=0;i<sz;i++) str += drawPlanetBox(apList.get(keys[i])); } if ((sz = opList.size()) != 0) { str += '<h1>'+sectionTitles[2]+'</h1>'; keys = opList.keys(); keys.sort(sortOPList); for (i=0;i<sz;i++) str += drawPlanetBox(opList.get(keys[i])); } if (mfList.length != 0) { mFleetSelectable = mFleetSelected = 0; str += '<h1>'+sectionTitles[3]+'</h1>'; str += '<table class="planet"><tr><td class="flt">' + drawMovingHeader(true) + '</td></tr>'; mfList.sort(sortMovingFleets); for (j=0;j<mfList.length;j++) { str += drawMovingFleetLine(mfList[j], true); } str += '</table>'; } if (wfList.length != 0) { wFleetSelectable = wFleetSelected = 0; str += '<h1>'+sectionTitles[4]+'</h1>'; str += '<table class="planet"><tr><td class="flt">' + drawWaitingHeader(true) + '</td></tr>'; wfList.sort(sortWaitingFleets); for (j=0;j<wfList.length;j++) { str += drawWaitingFleetLine(wfList[j], true); } str += '</table>'; } document.getElementById('fmain').innerHTML = str; keys = locations.keys(); for (i=0;i<keys.length;i++) { locations.get(keys[i]).updateSelection(); } updateMovingSelection(); updateWaitingSelection(); updateActions(); } function renameFleet(id) { if (autoLock) { setTimeout('renameFleet(id)', 500); return; } lockUpdate(); var str = ""; while (str == "") { str = getNewFleetName(false); if (typeof str == 'object' && !str) { unlockUpdate(); return; } if (str == "") alertFleetName(0); else if (str.length > 64) { alertFleetName(1); str = ""; } else if (str.length < 3) { alertFleetName(2); str = ""; } } x_renameFleets(id, str, renameCallback); } function renameSelected() { if (autoLock) { setTimeout('renameSelected()', 500); return; } lockUpdate(); var str = ""; while (str == "") { str = getNewFleetName(false); if (typeof str == 'object' && !str) { unlockUpdate(); return; } if (str == "") alertFleetName(0); else if (str.length > 64) { alertFleetName(1); str = ""; } else if (str.length < 3) { alertFleetName(2); str = ""; } } var s = new Array(); for (i=0;i<fDisp.length;i++) { if (fDisp[i].selected) s.push(fDisp[i].id); } x_renameFleets(s.join('#'), str, renameCallback); } function renameCallback(str) { if (str.indexOf('ERR#') == 0) { var l = str.split('#'); alertFleetName(parseInt(l[1], 10)); unlockUpdate(); } else { prepareUpdate(); parseMainData(str); } } function mergeSelected() { if (autoLock) { setTimeout('mergeSelected()', 500); return; } lockUpdate(); var str = " "; while (str == " ") { str = getMergedFleetName(); if (typeof str == 'object' && !str) { unlockUpdate(); return; } if (str.length > 64) { alertFleetMerge(0); str = " "; } else if (str.length < 3 && str != '') { alertFleetMerge(1); str = " "; } } var i, s = new Array(); for (i=0;i<fDisp.length;i++) { if (fDisp[i].selected) s.push(fDisp[i].id); } x_mergeFleets(s.join('#'), str, mergeCallback); } function mergeCallback(str) { if (str.indexOf('ERR#') == 0) { var l = str.split('#'); alertFleetMerge(parseInt(l[1], 10)); unlockUpdate(); } else { clearSelection(); prepareUpdate(); parseMainData(str); } } function switchSelected() { if (autoLock) { setTimeout('switchSelected()', 500); return; } lockUpdate(); var s = new Array(); for (i=0;i<fDisp.length;i++) { if (fDisp[i].selected) s.push(fDisp[i].id); } x_switchStatus(s.join('#'), switchCallback); } function switchCallback(str) { if (str.indexOf('ERR#') == 0) { var l = str.split('#'); alertFleetSwitch(parseInt(l[1], 10)); unlockUpdate(); } else { clearSelection(); prepareUpdate(); parseMainData(str); } } function disbandSelected() { if (autoLock) { setTimeout('disbandSelected()', 500); return; } lockUpdate(); var s = new Array(); for (i=0;i<fDisp.length;i++) { if (fDisp[i].selected) s.push(fDisp[i].id); } if (confirmDisband(s.length >1)) x_disbandFleets(s.join('#'), disbandCallback); else unlockUpdate(); } function disbandCallback(str) { if (str.indexOf('ERR#') == 0) { var l = str.split('#'); alertFleetDisband(parseInt(l[1], 10)); unlockUpdate(); } else { prepareUpdate(); parseMainData(str); } } function splitSelected() { if (autoLock) { setTimeout('splitSelected()', 500); return; } lockUpdate(); splitParam = new Array(); for (var i=0;i<fDisp.length;i++) if (fDisp[i].selected) { splitParam[0] = fDisp[i]; break; } splitParam[1] = splitParam[3] = splitParam[4] = splitParam[5] = splitParam[6] = 0; splitParam[2] = 1; splitParam[9] = ''; onMainPage = false; drawSplitPage(); } function setSplitType(type) { if (type == splitParam[1]) return; splitParam[1] = type; var i, flds = ['sgas','sfgt','scru','sbcr']; for (i=0;i<4;i++) { var e = document.getElementById(flds[i]); if (e) e.disabled = (type == 1); } if (type == 1) updateAutoSplit(); else { for (i=0;i<4;i++) { var e = document.getElementById(flds[i]); if (e) e.value = splitParam[i+3]; } updateSplitHaul(); updateSplitOk(); } } function updateAutoSplit() { var ships = [0,0,0,0]; var o = allies.get(splitParam[0].owner); var flds = ['sgas','sfgt','scru','sbcr']; var i; for (i=0;i<4;i++) { var e; ships[i] = Math.floor(splitParam[0].ships[i] / (splitParam[2] + 1)); e = document.getElementById(flds[i]); if (e) { e.disabled = true; e.value = ships[i]; } } if (splitParam[0].ships[2] > 0 || splitParam[0].ships[3] > 0) { splitParam[7] = ships[0] * o.gSpace + ships[1] * o.fSpace; splitParam[8] = ships[2] * o.cHaul + ships[3] * o.bHaul; document.getElementById('hused').innerHTML = splitParam[7]; document.getElementById('havail').innerHTML = splitParam[8]; } var s=0; for (i=0;i<4;i++) s += ships[i]; var canSplit = (s > 0); if (splitParam[0].orders.oType == 2 || splitParam[0].orders.oType == 1 && splitParam[0].orders.hyperspace) canSplit = canSplit && (splitParam[7] <= splitParam[8]); document.getElementById('bsplit').disabled = !canSplit; } function setSplitCount(amount) { splitParam[2] = amount; if (splitParam[1] == 0) { updateSplitHaul(); updateSplitOk(); } else updateAutoSplit(); } function setSplitShips(type,amount) { var flds = ['sgas','sfgt','scru','sbcr']; if (amount < 0 || isNaN(amount)) return; splitParam[type+3] = amount; updateSplitHaul(); updateSplitOk(); } function updateSplitHaul() { if (splitParam[0].ships[2] == 0 && splitParam[0].ships[3] == 0) { splitParam[7] = splitParam[8] = 0; return; } var o = allies.get(splitParam[0].owner); splitParam[7] = splitParam[3] * o.gSpace + splitParam[4] * o.fSpace; splitParam[8] = splitParam[5] * o.cHaul + splitParam[6] * o.bHaul; document.getElementById('hused').innerHTML = splitParam[7]; document.getElementById('havail').innerHTML = splitParam[8]; } function updateSplitOk() { var ships = [0,0,0,0]; var diffs = [0,0,0,0]; var i,s1=0,s2=0,neg=false; for (i=0;i<4;i++) { ships[i] = splitParam[i+3] * splitParam[2]; s1 += ships[i]; diffs[i] = splitParam[0].ships[i] - ships[i]; neg = neg || (diffs[i] < 0); s2 += diffs[i]; } var canSplit = (s1 > 0 && !neg && s2 > 0); if (splitParam[0].orders.oType == 2 || splitParam[0].orders.oType == 1 && splitParam[0].orders.hyperspace) { var ou, os, o = allies.get(splitParam[0].owner); ou = diffs[0] * o.gSpace + diffs[1] * o.fSpace; os = diffs[2] * o.cHaul + diffs[3] * o.bHaul; canSplit = canSplit && (splitParam[7] <= splitParam[8]) && (ou <= os); } document.getElementById('bsplit').disabled = !canSplit; } function cancelSplit() { prepareUpdate(); x_getFleetsList(parseMainData); } function doFleetSplit() { document.getElementById('bsplit').disabled = true; if (splitParam[1] == 0) x_manualSplit(splitParam[0].id, splitParam[9], splitParam[2], splitParam[3], splitParam[4], splitParam[5], splitParam[6], splitCallback); else x_autoSplit(splitParam[0].id, splitParam[9], splitParam[2], splitCallback); } function splitCallback(str) { if (str.indexOf('ERR#') == 0) { var l = str.split('#'); alertFleetSplit(parseInt(l[1], 10)); document.getElementById('bsplit').disabled = false; } else { clearSelection(); prepareUpdate(); parseMainData(str); } } function moveSelected() { if (autoLock) { setTimeout('moveSelected()', 500); return; } lockUpdate(); orderFleets = new Array(); for (var i=0;i<fDisp.length;i++) if (fDisp[i].selected) orderFleets.push(fDisp[i].id); moveTo = waitTime = -1; moveToLoc = null; onMainPage = false; guessOrders = true; drawOrdersPage(); updateOrdersPage(); } function cancelOrders() { prepareUpdate(); x_getFleetsList(parseMainData); } function setNewOrders() { var mode, e; if ((e = document.getElementById('flmode'))) mode = e.options[e.selectedIndex].value; else mode = 0; x_setOrders(orderFleets.join('#'), moveTo, waitTime, mode, ordersCallback); } function ordersCallback(str) { if (str.indexOf('ERR#') == 0) { var l = str.split('#'); alertFleetOrders(parseInt(l[1], 10)); } else { clearSelection(); prepareUpdate(); parseMainData(str); } } function updateOrdersPage() { if (!moveToLoc) { if (!readingMoveLocation) { readingMoveLocation = true; x_getLocation(moveTo, gotLocation); } return; } document.getElementById('oself').innerHTML = getOSelFleets(); document.getElementById('oavaf').innerHTML = getOAvailFleets(); document.getElementById('moveto').innerHTML = getMoveToLine(); document.getElementById('standby').innerHTML = getStandByLine(); document.getElementById('odmode').innerHTML = getModeLine(); document.getElementById('chordc').innerHTML = getOrderLinks(); updateTrajectories(); } function updateTrajectories() { if (readingMoveLocation || trajLock) return; var i, f; for (i=0;i<orderFleets.length;i++) { var f = fleets.get(orderFleets[i]); var e = document.getElementById('ft' + f.id); if (!e) continue; if (moveTo == -1) { e.innerHTML = getTrajectoryText(f.id, []); continue; } var t = getTrajectory(f, moveToLoc); e.innerHTML = getTrajectoryText(f.id, t); } } function getOSelFleets() { if (!orderFleets.length) { selCanHS = true; return '<p>' + actionText[0] + '</p>'; } var i,str = '<table class="oself"><tr>' + foSelHeader + '</tr>'; selCanHS = true; gWait = gDest = -2; var n = new Array(); sMovex = null; sMovey = null; orderFleets.sort(sortOrderFleets); for (i=0;i<orderFleets.length;i++) { var f = fleets.get(orderFleets[i]), o = allies.get(f.owner); var used = f.ships[0] * o.gSpace + f.ships[1] * o.fSpace; var haul = f.ships[2] * o.cHaul + f.ships[3] * o.bHaul; var canHS = (used <= haul); selCanHS = selCanHS && canHS; if (!canHS) { var fLoc = (f.orders.oType != 1 ? f.orders.loc : f.orders.cur); if (typeof sMovex == 'object') { sMovex = fLoc.x; sMovey = fLoc.y; } else if (fLoc.x != sMovex || fLoc.y != sMovey) continue; } n.push(f.id); if (guessOrders) { if (f.orders.oType == 1) { if (gDest == -2 && gWait == -2) { gDest = (f.orders.toId == f.orders.curId ? -1 : f.orders.toId); if (f.orders.wait) gWait = f.orders.wait.left; else gWait = -1; } else if (gDest != f.orders.toId || gWait > 0 && !f.orders.wait || f.orders.wait && gWait != f.orders.wait.left) gWait = gDest = -1; } else if (f.orders.oType == 2) { if (gWait == -2 && gDest == -2) { gDest = -1; gWait = f.orders.left; } else if (gDest > 0 || f.orders.left != gWait) gWait = gDest = -1; } else gWait = gDest = -1; orderMode = parseInt(f.mode, 10); } var oc = ' onClick="removeOrdersSelection('+f.id+')"'; str += '<tr class="' + (f.owner == myself.id ? 'flown' : 'flally') + '"><td class="fown"'+oc+'>' + players.get(f.owner) + '</td><td'+oc+' class="fname">' + f.name + '</td><td'+oc+' class="fhs">'; if (haul == 0) str += 'N/A'; else { var hp = Math.round(used * 100 / haul); str += (hp > 200) ? '>200%' : (hp + '%'); } str += '</td><td'+oc+' class="fshp">' + formatNumber(f.ships[0]) + ' / ' + formatNumber(f.ships[1]) + ' / '; str += formatNumber(f.ships[2]) + ' / ' + formatNumber(f.ships[3]) + '</td><td'+oc+' class="fpwr">'; str += formatNumber(f.power) + '</td><td class="ftraj" id="ft' + f.id + '"> </td></tr>'; } orderFleets = n; str += '</table>'; guessOrders = false; if (gWait > 0) waitTime = gWait; if (gDest > 0) { moveTo = gDest; moveToLoc = locations.get(moveTo); } return str; } function getOAvailFleets() { // Fleets are available if: // they are not selected // AND ( they are idling AND can move // OR they are moving // OR they are waiting in HS ) // AND ( there is a destination // AND ( the fleet is HS capable // OR the fleet is not HS capable AND the target is in the same system ) // OR there is no destination ) // AND ( there are HS stand-by orders AND the fleet is HS capable // OR there are no HS stand-by orders ) var i, sst = '#' + orderFleets.join('#') + '#'; var afl = new Array(), fk = fleets.keys(); for (i=0;i<fk.length;i++) { if (sst.indexOf('#'+fk[i]+'#') != -1) continue; var f = fleets.get(fk[i]); var o = allies.get(f.owner); if (!o) continue; var hs = ((f.ships[0] * o.gSpace + f.ships[1] * o.fSpace) <= (f.ships[2] * o.cHaul + f.ships[3] * o.bHaul)); var fLoc = (f.orders.oType != 1 ? f.orders.loc : f.orders.cur); if ( f.orders.oType == 0 && f.orders.canMove != 'Y' || moveTo != -1 && !hs && (fLoc.x != moveToLoc.x || fLoc.y != moveToLoc.y) || waitTime != -1 && !hs || !selCanHS && !hs && (fLoc.x != sMovex || fLoc.y != sMovey) || f.orders.oType >= 3 ) continue; afl.push(f); } if (!afl.length) return '<p>' + noFleetsFound + '</p>'; var i,str = '<table class="oavaf"><tr>' + foAvaHeader + '</tr>'; afl.sort(sortAvailFleets); for (i=0;i<afl.length;i++) { var f = afl[i], o = allies.get(f.owner); var used = f.ships[0] * o.gSpace + f.ships[1] * o.fSpace; var haul = f.ships[2] * o.cHaul + f.ships[3] * o.bHaul; str += '<tr onClick="addOrdersSelection('+f.id+')" class="' + (f.owner == myself.id ? 'flown' : 'flally') + '"><td class="fown">'; str += players.get(f.owner) + '</td><td class="fname">' + f.name + '</td><td class="fhs">'; if (haul == 0) str += 'N/A'; else { var hp = Math.round(used * 100 / haul); str += (hp > 200) ? '>200%' : (hp + '%'); } str += '</td><td class="fshp">' + formatNumber(f.ships[0]) + ' / ' + formatNumber(f.ships[1]) + ' / '; str += formatNumber(f.ships[2]) + ' / ' + formatNumber(f.ships[3]) + '</td><td class="fpwr">'; str += formatNumber(f.power) + '</td><td class="fco">'; var m = parseInt(f.mode, 10); if (f.orders.oType == 0) str += curOrdersTxt[m] + f.orders.loc.name + curOrdersTxt[2 + m]; else if (f.orders.oType == 1) str += curOrdersTxt[m+4] + f.orders.to.name + curOrdersTxt[m+6]; else str += curOrdersTxt[m+8] + f.orders.loc.name + curOrdersTxt[m+10]; str += '</td></tr>'; } str += '</table>'; return str; } function removeOrdersSelection(id) { var n = new Array(), i; for (i=0;i<orderFleets.length;i++) if (orderFleets[i] != id) n.push(orderFleets[i]); orderFleets = n; updateOrdersPage(); } function addOrdersSelection(id) { orderFleets.push(id); updateOrdersPage(); } function setOrdersTime() { var str = "", nt=waitTime; while (str == "") { str = getFleetDelay(waitTime == -1 ? "" : waitTime); if (typeof str == 'object' && !str) return; nt = parseInt(str, 10); if (isNaN(nt)) { fleetDelayError(0); str = ""; } else if (nt < 1) { fleetDelayError(1); str = ""; } else if (nt > 48) { fleetDelayError(2); str = ""; } } waitTime = nt; updateOrdersPage(); } function cancelOrdersDelay() { waitTime = -1; updateOrdersPage(); } function removeOrdersDestination() { moveTo = -1; updateOrdersPage(); } function gotLocation(data) { var l = data.split("\n"); var a, o; a = l.shift().split('#'); moveToLoc = new FleetLocation(a.shift(),a.shift(),a.shift(),a.shift(),a.shift(),a.join('#')); if (moveToLoc.opacity == 0) { a = l.shift().split('#'); moveToLoc.details = new PlanetDetails(a.shift(),a.shift(),a.shift(),a.shift(),a.shift(),a.join('#')); } readingMoveLocation = false; updateOrdersPage(); } function setOrdersDestination() { if (mapRemember && typeof sMovex == 'object') { } else if (moveTo == -1) { var ok = false; if (typeof sMovex != 'object') { dMapX = parseInt(sMovex,10); dMapY = parseInt(sMovey,10); ok = true; } else { if (orderFleets.length) { var f = fleets.get(orderFleets[0]); if (f) { var fLoc = (f.orders.oType != 1 ? f.orders.loc : f.orders.cur); dMapX = parseInt(fLoc.x, 10); dMapY = parseInt(fLoc.y, 10); ok = true; } } } if (! ok) { if (myself.planets.length) { dMapX = parseInt(myself.planets[0].x,10); dMapY = parseInt(myself.planets[0].y,10); } else { var i = 0, j, k = allies.keys(); while (i < k.length) { var a = allies.get(k[i]); if (!a.isMe && a.planets.length) { dMapX = parseInt(a.planets[0].x,10); dMapY = parseInt(a.planets[0].y,10); break; } i++; } if (i == k.length) dMapX = dMapY = 0; } } } else { dMapX = parseInt(moveToLoc.x,10); dMapY = parseInt(moveToLoc.y,10); } newDest = moveTo; mapCType = 0; drawDestinationSelection(); if (!map.containsKey(dMapX + ';' + dMapY)) { loadingMap = true; x_getMapData(dMapX, dMapY, gotMapData); } else { loadingMap = false; updateDestinationSelection(); } } function gotMapData(data) { if (data == "ERR") alertMap(); else { var l = data.split('\n'); var a = l.shift().split("#"), i; dMapX = parseInt(a[0], 10); dMapY = parseInt(a[1], 10); var system = new MapSystem(dMapX, dMapY, a[2], a[3] == '1'); for (i=0;i<6;i++) { if (system.opacity != -1) { a = l.shift().split('#'); var loc = new MapLocation(a.shift(), dMapX, dMapY, i+1, a.shift(), a.shift(), a.join('#')); system.locations.push(loc); map.put("p" + loc.id, loc); map.put("pn-" + loc.name.toLowerCase(), loc); } else system.locations.push(null); } map.put(dMapX + ";" + dMapY, system); } updateDestinationSelection(); loadingMap = false; } function updateDestinationSelection() { updateDestLine(); if (typeof sMovex == 'object') { drawGalacticMap(); } else { drawSystemMap(); } } function updateDestLine() { if (newDest == -1) document.getElementById('cursel').innerHTML = noSelection; else { var d = map.get("p" + newDest); document.getElementById('cursel').innerHTML = d.name + " (<b>" + d.x + "," + d.y + "</b>," + d.orbit + ")"; } } function drawSystemMap() { var sys = map.get(dMapX + ";" + dMapY); var str = "<table class='smap'><tr><td class='sys" + sys.opacity + "'>"; var i; for (i = 0; i < 6; i ++) { var loc = sys.locations[i]; if (sys.opacity == 0) { var img = (loc.color == 4) ? "prem_s" : ("pl/s/"+loc.id); str += "<tr onClick='setDestination(" + loc.id + ")'><td class='mimg'><img class='mimg' alt='[P]' src='" + staticurl + '/beta5/pics/'+img+".png' /></td><td class='ptype" + loc.color + "'>" + loc.name + '</td></tr>'; } else { str += "<tr onClick='setDestination(" + loc.id + ")'><td class='ptype" + loc.color + "'>" + loc.name + "</td></tr>"; } } str += '</td></tr></table><p class="smapi">' + smapCoordTxt + '<b>' + dMapX + ' , ' + dMapY + '</b></p>'; if (sys.protection) { str = '<span class="prot">' + str + '</span>'; } document.getElementById('sdmap').innerHTML = str; } function drawGalacticMap() { var sys = map.get(dMapX + ";" + dMapY); var op = sys.opacity == -1 ? 0 : sys.opacity; var str = "<table class='gmap'><tr><td class='gmcor'> </td><td class='gmvm' onClick='moveMap(0,1)'>" + "<img src='"+staticurl+"/beta5/pics/up_"+color+".gif' alt='"+dirTxt[0]+"' /></td>" + "<td class='gmcor'> </td></tr><tr><td class='gmhm' onClick='moveMap(-1,0)'>" + "<img src='"+staticurl+"/beta5/pics/left_"+color+".gif' alt='"+dirTxt[1]+"' /></td>" + "<td class='sys"+op+"'>" + (sys.protection ? '<span class="prot">' : '') + "<table class='gmmap'>"; var i; for (i=0;i<6;i++) { var loc = sys.locations[i]; if (loc && sys.opacity == 0) { var img = (loc.color == 4) ? "prem_s" : ("pl/s/"+loc.id); str += "<tr onClick='setDestination("+loc.id+")'><td class='mimg'><img class='mimg' alt='[P]' src='" + staticurl + '/beta5/pics/'+img+".png' /></td><td class='ptype" + loc.color + "'>" + loc.name + '</td></tr>'; } else if (loc) str += "<tr onClick='setDestination("+loc.id+")'><td class='ptype"+loc.color+"'>"+loc.name+"</td></tr>"; else str += '<tr><td class="gmun">'+unchartedTxt+'</td></tr>'; } str += "</table>" + (sys.protection ? '</span>' : '') + "</td><td class='gmhm' onClick='moveMap(1,0)'><img src='"+staticurl+"/beta5/pics/right_" +color+".gif' alt='"+dirTxt[2]+"' /></td></tr><tr><td class='gmcor'> </td><td class='gmvm' onClick='" +"moveMap(0,-1)'><img src='"+staticurl+"/beta5/pics/down_"+color+".gif' alt='"+dirTxt[3]+"' /></td>" +"<td class='gmcor'> </td></tr></table>"; str += drawMapControls(); document.getElementById('sdmap').innerHTML = str; } function updateGalacticMap() { if (loadingMap) return; var e; if (document.getElementById('mct0').checked) { var x = parseInt(document.getElementById('cx').value, 10); var y = parseInt(document.getElementById('cy').value, 10); mapCType = 0; if (isNaN(x) || isNaN(y)) return moveMapTo(x,y); } else if (document.getElementById('mct1').checked) { e = document.getElementById('mcpo'); var p = e.options[e.selectedIndex].value; mapCType = 1; if (p == 0) return; mapParm = p; if (map.containsKey('p'+p)) { var po = map.get('p'+p); moveMapTo(parseInt(po.x,10), parseInt(po.y,10)); } else { loadingMap = true; x_moveMapToId(p, gotMapData); } } else { e = document.getElementById('mcpn').value; mapCType = 2; if (e == "") return; mapParm = e; if (map.containsKey('pn-'+e.toLowerCase())) { var po = map.get('pn-'+e.toLowerCase()); moveMapTo(parseInt(po.x,10), parseInt(po.y,10)); } else { loadingMap = true; x_moveMapToName(e, gotMapData); } } } function moveMap(dx,dy) { if (loadingMap) return; mapCType = 0; moveMapTo(dMapX + dx, dMapY + dy); } function moveMapTo(nx, ny) { if (map.containsKey(nx + ';' + ny)) { dMapX = nx; dMapY = ny; drawGalacticMap(); } else { loadingMap = true; x_getMapData(nx, ny, gotMapData); } } function setDestination(id) { if (id == newDest) return; newDest = id; document.getElementById('sdok').disabled = (newDest == moveTo); updateDestLine(); } function confirmSetDestination() { moveTo = newDest; if (locations.containsKey(moveTo)) moveToLoc = locations.get(moveTo); else moveToLoc = null; cancelSetDestination(); } function cancelSetDestination() { drawOrdersPage(); updateOrdersPage(); } function viewTrajectory() { if (autoLock) { setTimeout('viewTrajectory()', 500); return; } lockUpdate(); var i, f = null; for (i=0;i<fDisp.length;i++) if (fDisp[i].selected) { f = fDisp[i]; break; } if (!(f && f.orders.oType == 1)) { unlockUpdate(); return; } onMainPage = false; x_getFleetTrajectory(f.id, gotFleetTrajectory); } function gotFleetTrajectory(data) { if (data == "") { alertServerError(); x_getFleetsList(parseMainData); return; } var l = data.split('\n'); var a, hc = false; a = l.shift().split('#'); fleetTrajectory = new FleetTrajectory(a[0],a[1],a[2],a[3],a[4],a[5],a[6]); while (l.length) { a = l.shift().split('#'); fleetTrajectory.waypoints.push(new FleetWayPoint( a.shift(), a.shift(), a.shift(), a.shift(), a.shift(), a.join('#') )); } drawFleetTrajectory(); } function sellSelected() { if (autoLock) { setTimeout('sellSelected()', 500); return; } lockUpdate(); sales = new Hashtable(); for (var i=0;i<fDisp.length;i++) { if (!fDisp[i].selected || fDisp[i].orders.oType != 0 || fDisp[i].orders.canMove != 'Y' || fDisp[i].mode == 1) continue; var s; if (!sales.containsKey(fDisp[i].orders.locId)) { s = new FleetSale(fDisp[i].orders.locId); sales.put(s.id, s); } else s = sales.get(fDisp[i].orders.locId); s.fleets.push(fDisp[i]); } if (sales.isEmpty()) { prepareUpdate(); x_getFleetsList(parseMainData); } onMainPage = false; drawSellPage(); } function drawSellPage() { drawSellLayout(); var k = sales.keys(), str = ''; k.sort(sortSalesKeys); for (var i=0;i<k.length;i++) str += sales.get(k[i]).drawForm(); document.getElementById('sflist').innerHTML = str; for (var i=0;i<k.length;i++) sales.get(k[i]).update(); drawSellLinks(false); } function checkAllSales() { var k = sales.keys(), str = '', v = true; for (var i=0;v&&i<k.length;i++) v = v && sales.get(k[i]).isValid; drawSellLinks(v); } function cancelSale() { sales = null; prepareUpdate(); x_getFleetsList(parseMainData); } function confirmSale() { var k = sales.keys(), l = new Array(); for (var i=0;i<k.length;i++) { var s = sales.get(k[i]), j, fids = new Array(), p = s.player; p.replace(/[^A-Za-z0-9_\.\-\+@\/' ]/, ' '); for (j=0;j<s.fleets.length;j++) fids.push(s.fleets[j].id); l.push(s.id + '#' + s.mode + '#' + s.expires + '#' + s.price + '#' + p + '#' + fids.join('!')); } x_sellFleets(l.join('*'), fleetsSold); } function fleetsSold(data) { if (data.indexOf('ERR#') == 0) { var l = data.split('#'); l.shift(); var ec = parseInt(l.shift(), 10); // Remove fleets and sales if required if (ec == 4) { while (l.length) { var sid = l.shift(), fl = '!' + l.shift() + '!'; var s = sales.get(sid); if (!s) continue; var f = new Array(); for (var i=0;i<s.fleets.length;i++) { if (fl.indexOf('!' + s.fleets[i].id + '!') != -1) continue; f.push(s.fleets[i]); } if (f.length) s.fleets[i] = f; else sales.remove(sid); } if (sales.isEmpty()) { saleAlert(5, null); cancelSale(); return; } saleAlert(4, null); var k = sales.keys(), str = ''; k.sort(sortSalesKeys); for (var i=0;i<k.length;i++) str += sales.get(k[i]).drawForm(); document.getElementById('sflist').innerHTML = str; for (var i=0;i<k.length;i++) { sales.get(k[i]).update(); sales.get(k[i]).validate(); } } else saleAlert(ec, l.shift()); } else { clearSelection(); prepareUpdate(); parseMainData(data); } } function cancelSaleSelected() { if (autoLock) { setTimeout('cancelSaleSelected()', 500); return; } lockUpdate(); var s = new Array(); for (i=0;i<fDisp.length;i++) { if (fDisp[i].selected) s.push(fDisp[i].orders.saleId); } if (confirmCancelSale(s.length >1)) x_cancelSales(s.join('#'), salesCanceled); else unlockUpdate(); } function salesCanceled(str) { if (str.indexOf('ERR#') == 0) { var l = str.split('#'); alertCancelSales(parseInt(l[1], 10)); unlockUpdate(); } else { prepareUpdate(); parseMainData(str); } } function viewSaleSelected() { if (autoLock) { setTimeout('viewSaleSelected()', 500); return; } lockUpdate(); var id = null; for (i=0;i<fDisp.length;i++) if (fDisp[i].selected) { id = fDisp[i].orders.saleId; break; } if (id) x_getSaleDetails(id, gotSaleDetails); else unlockUpdate(); } function gotSaleDetails(str) { if (str == "") { alertViewSale(); unlockUpdate(); } else { var t = str.split('\n'), l = t[0].split('#'); onMainPage = false; drawSaleDetails(l, t.length == 2 ? t[1] : null); } } function lockUpdate() { clearTimeout(autoUpdate); autoLock = true; } function unlockUpdate() { autoUpdate = setTimeout('mainDataUpdate()', 60000); autoLock = false; } function clearSelection() { var i; if (typeof fDisp != 'object') return; for (i=0;i<fDisp.length;i++) { if (onMainPage) document.getElementById('fsel' + fDisp[i].id).checked = false; fDisp[i].selected = false; } if (onMainPage) updateActions(); } function parseMainDataInternal(data) { var l = data.split('\n'); var i, a = l.shift().split('#'); var nAllies = a.shift(), nFleets = a.shift(), nPlanets = a.shift(); // Get page parameters a = l.shift().split('#'); listLocations = a.shift(); listMode = a.shift(); fDispMode = a.shift(); alliesMode = a.shift(); // Get search parameters a = l.shift().split('#'); sType = a.shift(); sText = a.join('#'); // Parse lists parseAllies(l, nAllies); var plist = parseFleets(l, nFleets); parsePlanets(l, nPlanets, plist); parsePlayers(l, plist); // Create links between lists linkMainData(); } function parseMainData(data) { // Do the actual parsing parseMainDataInternal(data); // Display page if (!onMainPage) { drawMainLayout(); if (navigator.userAgent.toLowerCase().indexOf("msie") != -1 && document.all && !(window.opera && document.getElementById)) { var ff = document.getElementById('faframe'); ff.style.position = "absolute"; var r = document.documentElement ? document.documentElement : document.body, h = r.clientHeight; r.onscroll = function () { ff.style.top = (r.scrollTop + h - 32) + "px"; }; ff.style.top = (r.scrollTop + h - 32) + "px"; } onMainPage = true; } applyFilters(); drawMainContents(); // Get ready to auto-update unlockUpdate(); } function parseMainDataMove(data) { // Do the actual parsing parseMainDataInternal(data); // Display page autoLock = true; onMainPage = false; var r = document.documentElement ? document.documentElement : document.body; r.onscroll = null; guessOrders = true; orderFleets = new Array(); moveToLoc = null; waitTime = -1; drawOrdersPage(); updateOrdersPage(); } function sortMapPList(ia, ib) { var a = locations.get(ia), b = locations.get(ib); var oa = allies.get(a.details.owner), ob = allies.get(b.details.owner); var pa = players.get(a.details.owner), pb = players.get(b.details.owner); return (a.details.owner == b.details.owner ? (a.x != b.x ? (parseInt(a.x, 10) - parseInt(b.x, 10)) : (a.y != b.y ? (parseInt(a.y, 10) - parseInt(b.y, 10)) : (parseInt(a.orbit, 10) - parseInt(b.orbit, 10)) )) : (oa.isMe ? -1 : (ob.isMe ? 1 : (pa.toLowerCase() > pb.toLowerCase() ? 1 : -1)))); } function sortPPList(ia,ib) { var a=ppList.get(ia).fleetLocation,b=ppList.get(ib).fleetLocation; return (a.x!=b.x ?(parseInt(a.x,10)-parseInt(b.x,10)) :(a.y!=b.y ?(parseInt(a.y,10)-parseInt(b.y,10)) :(parseInt(a.orbit,10)-parseInt(b.orbit,10)) ) ); } function sortAPList(ia,ib) { var a=apList.get(ia).fleetLocation,b=apList.get(ib).fleetLocation; return (a.details.owner==b.details.owner ?(a.x!=b.x ?(parseInt(a.x,10)-parseInt(b.x,10)) :(a.y!=b.y ?(parseInt(a.y,10)-parseInt(b.y,10)) :(parseInt(a.orbit,10)-parseInt(b.orbit,10)) ) ):(players.get(a.details.owner).toLowerCase()>players.get(b.details.owner).toLowerCase()?1:-1)); } function sortOPList(ia,ib) { var a=opList.get(ia).fleetLocation,b=opList.get(ib).fleetLocation; return (a.x!=b.x ?(parseInt(a.x,10)-parseInt(b.x,10)) :(a.y!=b.y ?(parseInt(a.y,10)-parseInt(b.y,10)) :(parseInt(a.orbit,10)-parseInt(b.orbit,10)) ) ); } function sortPlanetFleets(ia,ib) { var a=fleets.get(ia),b=fleets.get(ib); return (a.owner == b.owner ? (parseInt(b.power,10)-parseInt(a.power,10)) : (a.owner == myself.id ? -1 : (b.owner == myself.id ? 1 : (a.mode == 0 && b.mode == 1 ? -1 : (a.mode == 1 && b.mode == 0 ? 1 : (players.get(a.owner).toLowerCase()>players.get(b.owner).toLowerCase() ? 1 : -1) )) )) ); } function sortMovingFleets(a,b) { return (a.owner == b.owner ? (a.orders.eta == b.orders.eta ? (parseInt(b.power,10)-parseInt(a.power,10)) : (parseInt(a.orders.eta,10)-parseInt(b.orders.eta,10)) ) : (a.owner == myself.id ? -1 : (b.owner == myself.id ? 1 : (players.get(a.owner).toLowerCase()>players.get(b.owner).toLowerCase() ? 1 : -1) )) ); } function sortWaitingFleets(a,b) { return (a.owner == b.owner ? (a.orders.left == b.orders.left ? (parseInt(b.power,10)-parseInt(a.power,10)) : (parseInt(a.orders.left,10)-parseInt(b.orders.left,10)) ) : (a.owner == myself.id ? -1 : (b.owner == myself.id ? 1 : (players.get(a.owner).toLowerCase()>players.get(b.owner).toLowerCase() ? 1 : -1) )) ); } function sortOrderFleets(ia,ib) { var a=fleets.get(ia),b=fleets.get(ib); return (a.owner == b.owner ? (parseInt(b.power,10)-parseInt(a.power,10)) : (a.owner == myself.id ? -1 : (b.owner == myself.id ? 1 : (players.get(a.owner).toLowerCase()>players.get(b.owner).toLowerCase() ? 1 : -1) )) ); } function sortAvailFleets(a,b) { return (a.owner == b.owner ? (a.orders.oType == b.orders.oType && a.mode == b.mode ? (parseInt(b.power,10)-parseInt(a.power,10)) : (a.orders.oType * 2 + parseInt(a.mode,10) - b.orders.oType * 2 - parseInt(b.mode,10)) ) : (a.owner == myself.id ? -1 : (b.owner == myself.id ? 1 : (players.get(a.owner).toLowerCase()>players.get(b.owner).toLowerCase() ? 1 : -1) )) ); } function sortSalesKeys(ia,ib) { var a=locations.get(ia),b=locations.get(ib); return (a.x!=b.x ?(parseInt(a.x,10)-parseInt(b.x,10)) :(a.y!=b.y ?(parseInt(a.y,10)-parseInt(b.y,10)) :(parseInt(a.orbit,10)-parseInt(b.orbit,10)) )); }