var actionText = ['Please select at least one fleet.', 'Rename', 'Change orders', 'Switch status', 'Split', 'Merge', 'Sell', 'Disband', 'View trajectory', 'Clear selection', 'Cancel sale', 'Sale details']; var statusText = ['Attack', 'Defense', 'Avail.', 'Unavail.', 'On sale', 'Sold', ' (bundled)']; var sectionTitles = ['Own planets', 'Allied planets', 'Other planets', 'Moving fleets', 'Fleets standing by']; var noFleetsFound = 'No fleets were found.'; var foSelHeader = '<th class="fown">Owner</th><th class="fname">Name</th><th class="fhs">Haul</th><th class="fshp">Ships (G/F/C/B)</th><th class="fpwr">Power</th><th class="ftraj">Trajectory</th>'; var foAvaHeader = '<th class="fown">Owner</th><th class="fname">Name</th><th class="fhs">Haul</th><th class="fshp">Ships (G/F/C/B)</th><th class="fpwr">Power</th><th class="fco">Current Orders</th>'; var curOrdersTxt = ['Defending ', 'Attacking ', '', '', 'Moving to ', 'Moving to ', ' for defense', ' for attack', 'Standing by in Hyperspace to defend ', 'Standing by in Hyperspace to attack ', '', '']; var noSelection = 'no destination selected'; var smapCoordTxt = "System at coordinates "; var dirTxt = ['Up', 'Left', 'Right', 'Down']; var unchartedTxt = "(uncharted)"; var orbitTypes = ['Planet', 'Planetary remains', 'Class 1 nebula', 'Class 2 nebula', 'Class 3 nebula', 'Class 4 nebula']; var salesText = ['Target player:', 'Price:', 'Minimum bid:']; function drawMainLayout() { var i, str = '<form action="?" onSubmit="return false"><table class="fctrl" cellspacing="0" cellpadding="0">'; // Locations str += '<tr><td>Locations:</td><td><select name="lLoc" id="lLoc" onChange="changeFilters(\'listLocations\', this.options[this.selectedIndex].value)">'; var locs = ['All planets', 'Own planets', 'Allied planets', 'Other planets']; for (i=0;i<locs.length;i++) str += '<option value="'+i+'"'+(listLocations == i ? ' selected="selected"' : '')+'>'+locs[i]+'</option>'; str += '</select></td>'; // Modes str += '<td>Fleet mode:</td><td><select name="lMode" id="lMode" onChange="changeFilters(\'listMode\', this.options[this.selectedIndex].value)">'; var fmd = ['Any', 'Defending', 'Attacking']; for (i=0;i<fmd.length;i++) str += '<option value="'+i+'"'+(listMode == i ? ' selected="selected"' : '')+'>'+fmd[i]+'</option>'; str += '</select></td></tr>'; // Current status str += '<tr><td>Fleet status:</td><td><select name="fMode" id="fMode" onChange="changeFilters(\'fDispMode\', this.options[this.selectedIndex].value)">'; var fst = ['Any', 'Idle', 'Unavailable', 'Moving', 'H.S. Stand-by', 'On sale', 'Sold']; for (i=0;i<fst.length;i++) str += '<option value="'+i+'"'+(fDispMode == i ? ' selected="selected"' : '')+'>'+fst[i]+'</option>'; str += '</select></td>'; // Allies mode str += '<td>Fleet owner:</td><td><select name="aMode" id="aMode" onChange="changeFilters(\'alliesMode\', this.options[this.selectedIndex].value)">'; var alm = ['Any', 'Myself', 'Trusted Allies', 'Others']; for (i=0;i<alm.length;i++) str += '<option value="'+i+'"'+(alliesMode == i ? ' selected="selected"' : '')+'>'+alm[i]+'</option>'; str += '</select></td></tr></table>'; // Search engine str += '<table class="fsearch"><tr><td>'; str += 'Search for <select name="sType" id="sType" onChange="changeFilters(\'sType\', this.options[this.selectedIndex].value)">'; var stp = ['fleet', 'location', 'player']; for (i=0;i<stp.length;i++) str += '<option value="'+i+'"'+(sType == i ? ' selected="selected"' : '')+'>'+stp[i]+'</option>'; var c = "changeFilters('sText', this.value)"; str += '</select> <input type="text" name="sText" id="sText" value="" onKeyUp="'+c+'" onClick="'+c+'" />'; str += '</td></tr></table>'; // Main display str += '<hr/><div id="fmain"> </div>'; // Commands str += '<div class="factions" id="faframe"><table class="factions" cellpadding="0" cellspacing="0"><tr><th>Actions:</th>'; str += '<td id="factions"> </td><td style="width:5%"><a href="manual?p=fleets_page">Help</a></tr></table></div>'; str += '</form>'; document.getElementById('fpage').innerHTML = str; document.getElementById('sText').value = sText; } function drawMovingHeader(hasSel) { var str; str = '<table class="mfltl"><tr>'; if (hasSel) { str += '<th class="fsel" id="f-move-sel" rowspan="2"> </th>'; } str += '<th class="fown" rowspan="2">Owner</th><th class="fname" rowspan="2">Name</th>'; str += '<th class="fhs">Haul</th><th class="fshp">GA Ships</th>'; str += '<th class="fshp">Fighters</th><th class="fshp">Cruisers</th><th class="fshp">Battle Cruisers</th>'; str += '<th class="fpwr">Power</th><th class="fstat">Status</th></tr>'; str += '<tr><th class="floc" colspan="2">Current Location</th><th class="fdest" colspan="2">Destination</th>'; str += '<th class="feta">E.T.A.</th><th class="fstd" colspan="2">H.S. Standby</th></tr></table>'; return str; } function drawWaitingHeader(hasSel) { var str; str = '<table class="wfltl"><tr>'; if (hasSel) { str += '<th class="fsel" id="f-hssb-sel" rowspan="2"> </th>'; } str += '<th class="fown" rowspan="2">Owner</th><th class="fname" rowspan="2">Name</th>'; str += '<th class="fhs">Haul</th><th class="fshp">GA Ships</th>'; str += '<th class="fshp">Fighters</th><th class="fshp">Cruisers</th><th class="fshp">Battle Cruisers</th>'; str += '<th class="fpwr">Power</th><th class="fstat">Status</th></tr>'; str += '<tr><th class="floc" colspan="2">Location</th><th class="ftime" colspan="2">Time Spent</th>'; str += '<th class="ftime" colspan="2">Time Left</th><th class="floss">Loss Prob.</th></tr></table>'; return str; } function drawPlanetBox(planet) { var str = '<table class="planet"><tr class="phdr">'; var so = (planet.fleetLocation.details && planet.fleetLocation.details.owner != '' && planet.fleetLocation.details.owner != myself.id); var apow = 0, dpow = 0; str += "<td class='pimg'><img src='" + staticurl + '/beta5/pics/'; if (planet.fleetLocation.opacity == 0) { str += 'pl/s/'+planet.id; } else if (planet.fleetLocation.opacity == 1) { str += 'prem_s'; } else { str += 'nebula' + (planet.fleetLocation.opacity-1); } str += ".png' class='pimg' alt='[P]' /></td><td class='name'><a href='planet?id="; str += planet.id + "'>" + planet.fleetLocation.name + '</a>'; str += " (<b>" + planet.fleetLocation.x + ',' + planet.fleetLocation.y + '</b>,' + planet.fleetLocation.orbit + ')'; if (planet.fleetLocation.details && planet.fleetLocation.details.tag != '') { str += ' [<b>' + planet.fleetLocation.details.tag + '</b>]'; } str += '</td>'; if (so) { str += '<td class="pinf"><a href="message?a=c&ct=0&id='+planet.fleetLocation.details.owner+'">'; str += players.get(planet.fleetLocation.details.owner) + '</a></td>'; } str += "<td class='pinf'"; if (planet.fleetLocation.details) { with(planet.fleetLocation.details) { str += '>Population: <b>' + formatNumber(pop) + 'M</b></td><td class="pinf">'; if (turrets != 0) { str += '<b>' + formatNumber(turrets) + '</b> turret' + (turrets > 1 ? 's' : ''); str += '; power: <b>' + formatNumber(tPower) + '</b>'; dpow += parseInt(tPower, 10); } else { str += 'No turrets'; } } } else { str += ' colspan="2">' + (planet.fleetLocation.opacity == 1 ? 'Planetary remains' : ('Class ' + (planet.fleetLocation.opacity - 1) + ' nebula')); } str += '</td></tr><tr><td colspan="'+(so?'5':'4')+'" class="'; if (planet.fleets.length) { planet.fleetLocation.selectableFleets = planet.fleetLocation.selectedFleets = 0; var j, f, om = -1; str += 'flt"><table class="fltl"><tr><th class="fsel" id="fsel-p-' + planet.id + '"> </th>'; str += '<th class="fown">Owner</th><th class="fname">Name</th><th class="fhs">Haul</th><th class="fshp">GA Ships</th>'; str += '<th class="fshp">Fighters</th><th class="fshp">Cruisers</th><th class="fshp">Battle Cruisers</th>'; str += '<th class="fpwr">Power</th><th class="fstat">Status</th></tr>'; planet.fleets.sort(sortPlanetFleets); for (j=0;j<planet.fleets.length;j++) { f = fleets.get(planet.fleets[j]); if (f.owner == myself.id) { om = f.mode; } } if (om == -1) { for (j=0;j<planet.fleets.length;j++) { f = fleets.get(planet.fleets[j]); if (allies.containsKey(f.owner)) om = f.mode; } } if (om == -1) { om = 0; } for (j=0;j<planet.fleets.length;j++) { f = fleets.get(planet.fleets[j]); if (f.mode == 0) { dpow += parseInt(f.power,10); } else { apow += parseInt(f.power,10); } str += drawFleetLine(f, f.owner == myself.id ? 'own' : (f.mode == om ? 'ally': 'enemy'),true); } str += '</table>'; if (planet.fleetLocation.details) { var act = new Array(), ang = new Array(); f = allies.keys(); if (!planet.fleetLocation.details.vacation) { for (j=0;j<f.length;j++) { var a = allies.get(f[j]), og; if (!a.gasAt.containsKey(planet.id)) { continue; } og = a.gasAt.get(planet.id); if (og * a.gaPop >= planet.fleetLocation.details.pop) { act.push(a); } else if (og > 0) { var ep = parseInt(planet.fleetLocation.details.pop, 10) - og * a.gaPop; ep = Math.ceil(ep / a.gaPop); ang.push([a,ep.toString()]); } } } if (act.length || ang.length || apow != 0 || planet.fleetLocation.details.vacation || planet.fleetLocation.details.protection) { str += '</td></tr><tr><td colspan="'+(so?'5':'4')+'" class="takers">'; if (act.length) { for (j=0;j<act.length;j++) { if (j != 0) { str += (j == act.length - 1) ? ' or ' : ', '; } str += act[j].getName(); } str += ' could take the planet.'; if (ang.length || apow != 0) { str += '<br/>'; } } if (ang.length) { for (j=0;j<ang.length;j++) { str += ang[j][0].getName() + ' would need <b>' + formatNumber(ang[j][1]) + '</b> more GA Ship' + (ang[j][1] > 1 ? 's' : '') + ' to take this planet.'; if (j != ang.length - 1) { str += '<br/>'; } } if (apow != 0) { str += '<br/>'; } } if (apow != 0) { str += 'Battle status: <b class="own">' + formatNumber((om == 0 ? dpow : apow).toString()) + '</b> vs. <b class="enemy">' + formatNumber((om == 1 ? dpow : apow).toString()) + '</b>'; if (planet.fleetLocation.details.vacation || planet.fleetLocation.details.protection) { str += '<br/>'; } } if (planet.fleetLocation.details.protection) { str += '<b class="enemy">Planet is under protection!</b>'; } else if (planet.fleetLocation.details.vacation) { str += '<b class="enemy">Planet is on vacation!</b>'; } } } str += '</table>'; } else { str += 'noflt">No fleets found'; } str += '</td></tr></table>'; return str; } function getNewFleetName(p) { return prompt("Please type the new name for th"+(p?"ese fleets":"is fleet")+".", ""); } function alertFleetName(e) { var str = 'Error: '; switch (e) { case 0: str += 'please specify a name'; break; case 1: str += 'this name is too long'; break; case 2: str += 'this name is too short'; break; case 3: str += 'a fleet was not found'; break; case 200: str += 'you can\'t rename a fleet while in vacation mode'; break; default: str += 'an unknown error has occured'; break; } alert(str + '.'); } function getMergedFleetName() { return prompt("Please type the name of the merged fleet. Leave blank to keep\nits former name.\n", ''); } function alertFleetMerge(e) { var str = 'Error: '; switch (e) { case 0: str += 'this name is too long'; break; case 1: str += 'this name is too short'; break; case 2: str += 'a fleet was not found'; break; case 200: str += 'you can\'t merge fleets while in vacation mode'; break; default: str += 'an unknown error has occured'; break; } alert(str + '.'); } function alertFleetSwitch(e) { var str = 'Error: '; switch (e) { case 0: str += 'you no longer have control over this fleet'; break; case 1: str += 'you can\'t switch to attack mode on a planet you own'; break; case 2: str += 'you (or your alliance) are in the planet owner\'s enemy list'; break; case 3: str += 'the Peacekeepers will not let you get away with that so easily'; break; case 200: str += 'you can\'t switch a fleet\'s status while in vacation mode'; break; default: str += 'an unknown error has occured'; break; } alert(str + '.'); } function alertFleetDisband(e) { var str = 'Error: '; switch (e) { case 0: str += 'you don\'t have control over this fleet'; break; case 1: str += 'the selected fleet(s) no longer exist'; break; case 2: str += 'not enough cash to cancel the fleet\'s sale'; break; case 200: str += 'you can\'t disband fleets while in vacation mode'; break; default: str += 'an unknown error has occured'; break; } alert(str + '.'); } function alertFleetSplit(e) { var str = 'Error: '; switch (e) { case 0: str += 'you no longer have control over this fleet'; break; case 1: str += 'you are trying to cheat, aren\'t you? If not, contact us'; break; case 2: case 5: str += 'the fleet you tried to split is no longer available'; break; case 3: case 4: case 7: str += 'the fleet\'s size has changed in the meantime'; break; case 10: str += 'the new fleets\' name is too short'; break; case 11: str += 'the new fleets\' name is too long'; break; case 200: str += 'you can\'t split a fleet while in vacation mode'; break; default: str += 'an unknown error has occured'; break; } alert(str + '.'); } function alertFleetOrders(e) { var str = 'Error: '; switch (e) { case 0: str += 'you no longer have control over these fleets'; break; case 1: str += 'the destination planet wasn\'t found'; break; case 2: str += 'an internal error occured.\nPlease report this to the staff as "setOrders/2"'; break; case 3: str += 'the fleets you selected are for sale'; break; case 4: str += 'the fleets you selected are no longer available'; break; case 200: str += 'you can\'t change fleet orders while in vacation mode'; break; default: str += 'an unknown error has occured'; break; } alert(str + '.'); } function alertServerError() { alert('Error: an error has occured on the server.\nPlease contact the staff.'); } function alertViewSale() { alert('Error: this sale is no longer available'); } function drawSplitPage() { var i, str = '<form action="?" onSubmit="return false"><h2>'; var f = splitParam[0]; switch (f.orders.oType) { case 0: str += 'Split fleet orbitting ' + f.orders.loc.name + '</h2><br/>'; str += '<table class="planet"><tr><td class="flt"><table class="fltl"><tr>'; str += '<th class="fown">Owner</th><th class="fname">Name</th><th class="fhs">Haul</th><th class="fshp">GA Ships</th>'; str += '<th class="fshp">Fighters</th><th class="fshp">Cruisers</th><th class="fshp">Battle Cruisers</th>'; str += '<th class="fpwr">Power</th><th class="fstat">Status</th></tr>'; str += drawFleetLine(f, (f.owner == myself.id ? 'own' : 'ally'), false); str += '</table></td></tr></table>'; break; case 1: str += 'Split moving fleet</h2><br/><table class="planet"><tr><td class="flt">' + drawMovingHeader(false) + '</td></tr>'; str += drawMovingFleetLine(f, false); str += '</table>'; break; case 2: str += 'Split waiting fleet</h2><br/><table class="planet"><tr><td class="flt">' + drawWaitingHeader() + '</td></tr>'; str += drawWaitingFleetLine(f, false); str += '</table>'; break; } str += '<h2>New fleet(s)</h2>'; str += '<table class="scmd"><tr><th>Split type:</th><td><label><input type="radio" name="stype" value="0" id="stype0" checked="checked" onClick="setSplitType(0)" />'; str += 'Manual</label></td></tr><tr><th> </th><td><label><input type="radio" name="stype" value="1" onClick="setSplitType(1)" /> Automatic</label></td></tr>'; str += '<tr><th>Amount of fleets:</th><td><select name="nfleets" onChange="setSplitCount(parseInt(this.options[this.selectedIndex].value, 10))">'; for (i=1;i<11;i++) str += '<option value="'+i+'">'+(i+1)+'</option>'; str += '</select></td></tr><tr><th>New name:</th><td><input type="text" value="" name="nfn" id="nfn" onChange="splitParam[9]=this.value" /></td></tr>'; str += '<tr><td colspan="2"> </td></tr>'; if (f.ships[0] > 0) { var c = 'setSplitShips(0,parseInt(this.value, 10))'; c = "onKeyUp='"+c+"' onClick='"+c+"'"; str += '<tr><th>GA Ships:</th><td><input type="text" value="0" id="sgas" name="sgas" size="10"'+c+' /> / ' + formatNumber(f.ships[0]) + '</td></tr>'; } if (f.ships[1] > 0) { var c = 'setSplitShips(1,parseInt(this.value, 10))'; c = " onKeyUp='"+c+"' onClick='"+c+"'"; str += '<tr><th>Fighters:</th><td><input type="text" value="0" id="sfgt" name="sfgt" size="10"'+c+' /> / ' + formatNumber(f.ships[1]) + '</td></tr>'; } if (f.ships[2] > 0) { var c = 'setSplitShips(2,parseInt(this.value, 10))'; c = " onKeyUp='"+c+"' onClick='"+c+"'"; str += '<tr><th>Cruisers:</th><td><input type="text" value="0" id="scru" name="scru" size="10"'+c+' /> / ' + formatNumber(f.ships[2]) + '</td></tr>'; } if (f.ships[3] > 0) { var c = 'setSplitShips(3,parseInt(this.value, 10))'; c = " onKeyUp='"+c+"' onClick='"+c+"'"; str += '<tr><th>Battle Cruisers:</th><td><input type="text" value="0" id="sbcr" name="sbcr" size="10"'+c+' /> / ' + formatNumber(f.ships[3]) + '</td></tr>'; } if (f.ships[2] > 0 || f.ships[3] > 0) str += '<tr><th>Haul used:</th><td id="hused">0</td></tr><tr><th>Haul available:</th><td id="havail">0</td></tr>'; str += '<tr><td colspan="2"> </td></tr><tr><td colspan="2" class="sbut">'; str += '<input type="submit" onClick="doFleetSplit(); return false" value="Split fleet" id="bsplit" disabled="disabled" />'; str += '<input type="submit" onClick="cancelSplit(); return false" value="Cancel" /></td></tr>'; str += '</table>'; str += '</form>'; document.getElementById('fpage').innerHTML = str; } function confirmDisband(p) { return confirm('Are you sure you want to disband ' + (p ? 'these fleets' : 'this fleet') + '?'); } function drawOrdersPage() { var str = '<form action="?" onSubmit="return false">' + '<table><tr><td id="chord"><h1>Change Orders</h1><td id="chordc"> </td></tr></table>' + '<h2>New orders</h2><p><span id="moveto"> </span><br/><span id="standby"> </span><br/>' + '<span id="odmode"> </span></p><h2>Selected fleets</h2><div id="oself"> </div>' + '<h2>Available fleets</h2><div id="oavaf"> </div></form>'; document.getElementById('fpage').innerHTML = str; } function getMoveToLine() { if (moveTo == -1) return "No destination selected - <a href='#' onClick='setOrdersDestination();return false'>Set destination</a>"; return "Move to <b>" + moveToLoc.name + "</b> (<b>" + moveToLoc.x + ',' + moveToLoc.y + '</b>,' + moveToLoc.orbit + ") - <a href='#' onClick='setOrdersDestination();return false'>Change destination</a> - " + "<a href='#' onClick='removeOrdersDestination();return false'>Remove destination</a>"; } function getStandByLine() { if (!selCanHS) { waitTime = -1; return "Selection is not capable of Hyperspace travel"; } if (waitTime == -1) return "No Hyperspace stand-by orders - <a href='#' onClick='setOrdersTime();return false'>Set delay</a>"; return "Selection is scheduled to stand by in Hyperspace for <b>" + waitTime + "</b>h " + " - <a href='#' onClick='setOrdersTime();return false'>Change delay</a>" + " - <a href='#' onClick='cancelOrdersDelay();return false'>Remove delay</a>"; } function getModeLine() { var fd = false; if (orderFleets.length) { var i; for (i=0;i<orderFleets.length;i++) { var f = fleets.get(orderFleets[i]); if ( moveTo != -1 && moveToLoc.details && f.owner == moveToLoc.details.owner || moveTo == -1 && (f.orders.oType == 1 && f.orders.cur.details && f.orders.cur.details.owner == f.owner) || moveTo == -1 && (f.orders.oType != 1 && f.orders.loc.details && f.orders.loc.details.owner == f.owner) ) return "Destination is owned by one of the fleets' owners - forcing to defense."; } } return "Fleet mode: <select onclick='orderMode = parseInt(this.options[this.selectedIndex].value, 10)' " + "name='flmode' id='flmode'><option value='0'>Defense</option>" + "<option value='1' " + (orderMode ? " selected='selected'" : "") + ">Attack</option></select>"; } function getOrderLinks() { var str = ""; if (orderFleets.length > 0) str += '<a href="#" onClick="setNewOrders();return false">Confirm</a> - '; str += '<a href="#" onClick="cancelOrders();return false">Cancel</a>'; return str; } function getFleetDelay(current) { return prompt("Please enter the duration of the fleet's Hyperspace stand by,\nin hours.", current); } function fleetDelayError(e) { var str = "Error: "; switch (e) { case 0: str += "please type a valid number"; break; case 1: str += "the delay must be at least 1 hour"; break; case 2: str += "the delay must be at most 48 hours"; break; } alert(str); } function drawDestinationSelection() { var str = '<form onSubmit="return false" action="?">'; str += '<table class="fseldest"><tr><td><h1>Set Destination</h1>'; str += '<p>Current selection: <span id="cursel"> </span></p><p>'; str += 'Please use the map on the right to select a new destination.</p>'; str += '<p class="sdbut"><input type="button" name="sdok" value="Confirm" onClick="confirmSetDestination()" id="sdok" disabled="disabled" />'; str += ' <input type="button" name="sdcancel" value="Cancel" onClick="cancelSetDestination()" /></p>'; str += '</td><td id="sdmap"> </td></tr></table></form>'; document.getElementById('fpage').innerHTML = str; } function drawMapControls() { var str; // Centre map on coords... str = '<p> </p><table id="mapctr"><tr>'; str += '<td><input type="checkbox" name="mrem" id="mcrem" ' + (mapRemember ? 'checked="checked" ':'') + ' onclick="mapRemember = this.checked" /></td><td><label for="mcrem">Remember map location' + '</label></td></tr>'; str += '<td onClick="document.getElementById(\'mct0\').checked=true">'; str += '<input type="radio" name="mct" id="mct0" ' + (mapCType==0?'checked="checked" ':'') + ' /></td>'; str += '<td onClick="document.getElementById(\'mct0\').checked=true"><label for="mct0">Centre on coordinates</label></td></tr>'; str += '<tr><td> </td><td onClick="document.getElementById(\'mct0\').checked=true">'; str += '(<input type="text" name="cx" id="cx" value="'+dMapX+'" size="4" />,<input type="text" name="cy" id="cy"'; str += ' value="'+dMapY+'" size="4" />)</td></tr>'; // Centre map on own planet... str += '<td onClick="document.getElementById(\'mct1\').checked=true">'; str += '<input type="radio" name="mct" id="mct1" ' + (mapCType==1?'checked="checked" ':'') + ' /></td>'; str += '<td onClick="document.getElementById(\'mct1\').checked=true"><label for="mct1">Centre on own/allied planet</label></td></tr>'; str += '<tr><td> </td><td onClick="document.getElementById(\'mct1\').checked=true">'; str += '<select name="mcpo" style="width:100%" id="mcpo"><option value="0">-----</option>'; var i, l = locations.keys(), mapList = []; for (i = 0; i < l.length; i ++) { var p = locations.get(l[i]); if (!p.details || !p.details.owner) { continue; } mapList.push(l[i]); } mapList.sort(sortMapPList); for (i in mapList) { var p = locations.get(mapList[i]); str += '<option value="' + p.id + '"' + (mapCType == 1 && p.id == mapParm ? ' selected="selected"' : '') + '>' + p.name + (allies.get(p.details.owner).isMe ? '' : (' (' + players.get(p.details.owner) + ')')) + '</option>'; } str += '</select></td></tr>'; // Centre map on planet... str += '<td onClick="document.getElementById(\'mct2\').checked=true">'; str += '<input type="radio" name="mct" id="mct2" ' + (mapCType==2?'checked="checked" ':'') + ' /></td>'; str += '<td onClick="document.getElementById(\'mct2\').checked=true"><label for="mct2">Centre on planet</label></td></tr>'; str += '<tr><td> </td><td onClick="document.getElementById(\'mct2\').checked=true">'; str += '<input type="text" style="width:100%" name="pn" id="mcpn" value="' + (mapCType==2?mapParm:'') + '" /></td></tr>'; str += '</table><p class="mapbt"><input type="button" name="mcup" value="Move" onClick="updateGalacticMap()" /></p>'; return str; } function alertMap() { alert('Error: this planet was not found on the map'); } function getTrajectoryText(id, t) { if (!t) return "(loading)"; var f = fleets.get(id); if (t.length == 0 && f.orders.oType != 1) return "N/A"; var r, i, str = '<select name="tr' + id + '">'; if (f.orders.oType == 1) { r = f.orders.reroute + 10; if (r > 61) r = 61; str += '<option>Rerouting: ' + r + ' minutes</option>'; } else r = 0; for (i=0;i<t.length;i++) { var w = t[i]; str += '<option'; if (i == t.length - 1) str += ' selected="selected">Arriving at'; else str += '>Leaving'; var e = parseInt(w.eta,10) + r; str += ' ' + w.name + ' ' + w.coords + ': ' + e + ' minutes</option>'; } str += '</select>'; return str; } function drawFleetTrajectory() { var str, f = fleetTrajectory.fleet, 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 m = parseInt(f.mode, 10); str = '<table><tr><td id="chord"><h1>View Fleet Trajectory ...</h1></td><td id="chordc">' + '<a href="#" onClick="prepareUpdate();x_getFleetsList(parseMainData);return false">' + 'Close</a></td></tr></table><h2>Selected Fleet</h2><table class="oavaf"><tr>' + foAvaHeader + '</tr><tr class="' + (f.owner == myself.id ? 'flown' : 'flally') + '"><td class="fown">' + 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 + '%'); } var op = locations.get(fleetTrajectory.from); str += '</td><td class="fshp">' + formatNumber(f.ships[0]) + ' / ' + formatNumber(f.ships[1]) + ' / ' + formatNumber(f.ships[2]) + ' / ' + formatNumber(f.ships[3]) + '</td><td class="fpwr">' + formatNumber(f.power) + '</td><td class="fco">' + curOrdersTxt[m+4] + f.orders.to.name + curOrdersTxt[m+6] + '</td></tr></table><h2>Trajectory</h2><p>Fleet moving in ' + (fleetTrajectory.hyperspace ? 'Hyperspace' : 'normal space') + '; original point of origin: ' + '<a href="planet?id=' + op.id + '">' + op.name + '</a> (<b>' + op.x + ',' + op.y + '</b>,' + op.orbit + ')</p><table class="ftraj"><tr>' + '<th class="tname">Location</th><th class="ttype">Type</th><th class="tstat">' + 'Status</th></tr>'; var hc = false; if (fleetTrajectory.changed > 0) { str += '<tr class="tcur"><td class="tname"><a href="planet?id=' + fleetTrajectory.waypoints[0].id + '">' + fleetTrajectory.waypoints[0].name + '</a> (<b>' + fleetTrajectory.waypoints[0].system + '</b>,' + fleetTrajectory.waypoints[0].orbit + ')</td><td class="ttype"><span class="ot' + fleetTrajectory.waypoints[0].opacity + '">'+ orbitTypes[fleetTrajectory.waypoints[0].opacity] + '</td><td class="tstat">Rerouting (' + fleetTrajectory.changed + ' minute' + (fleetTrajectory.changed > 1 ? 's' : '') + ')</td></tr>'; hc = true; } var i; for (i=0;i<fleetTrajectory.waypoints.length;i++) { var wp = fleetTrajectory.waypoints[i]; str += '<tr'; if (!hc && wp.eta < fleetTrajectory.left) { str += ' class="tcur"'; hc = true; } str += '><td class="tname"><a href="planet?id=' + wp.id + '">' + wp.name + '</a> (<b>' + wp.system + '</b>,' + wp.orbit + ')</td><td class="ttype"><span class="ot' + wp.opacity + '">' + orbitTypes[wp.opacity] + '</td><td class="tstat">'; if (!hc) { var n = wp.eta - fleetTrajectory.left; if (n > 0) str += 'Left orbit ' + n + ' minute' + (n>1?'s':'') + ' ago'; else str += 'Just left orbit'; } else if (i < fleetTrajectory.waypoints.length - 1) { var n = fleetTrajectory.left + fleetTrajectory.changed - wp.eta; str += 'Leaving orbit in ' + n + ' minute' + (n>1?'s':''); } else { var n = fleetTrajectory.left + fleetTrajectory.changed - wp.eta; str += 'Reaching destination in ' + n + ' minute' + (n>1?'s':''); } str += '</td></tr>'; } if (fleetTrajectory.wait != 0) { var wp = fleetTrajectory.waypoints[fleetTrajectory.waypoints.length - 1]; str += '<tr><td class="tname"><a href="planet?id=' + wp.id + '">' + wp.name + '</a> (<b>' + wp.system + '</b>,' + wp.orbit + ')</td><td class="ttype"><span class="ot' + wp.opacity + '">' + orbitTypes[wp.opacity] + '</td><td class="tstat">Standing by in Hyperspace for ' + fleetTrajectory.wait + ' hour' + (fleetTrajectory.wait>1?'s':'') + '</td></tr>'; } str += '</table>'; document.getElementById('fpage').innerHTML = str; } function drawSellLayout() { var str; str = '<form onSubmit="return false" action="?"><table><tr><td id="chord">' + '<h1>Sell Fleets ...</h1></td><td id="chordc"> </td></tr></table>' + '<div id="sflist"> </div></form>'; document.getElementById('fpage').innerHTML = str; } function FleetSale_drawForm() {with(this){ var str; str = '<p> </p><h2>Orbitting ' + fleetLocation.name + ' (' + fleetLocation.x + ',' + fleetLocation.y + ',' + fleetLocation.orbit + ')</h2><h3>Selected Fleets</h3><table class="fslist"><tr><th class="fname">Fleet Name</th>' + '<th class="fshp">G.A. Ships</th><th class="fshp">Fighters</th><th class="fshp">Cruisers' + '</th><th class="fshp">Battle Cruisers</th><th class="fpwr">Power</th></tr>'; var tot = [0,0,0,0,0]; for (var i=0;i<fleets.length;i++) { str += '<tr><td class="fname">' + fleets[i].name + '</td>'; for (var j=0;j<4;j++) { str += '<td class="fshp">' + formatNumber(fleets[i].ships[j]) + '</td>'; tot[j] += parseInt(fleets[i].ships[j], 10); } str += '<td class="fpwr">' + formatNumber(fleets[i].power) + '</td></tr>'; tot[4] += parseInt(fleets[i].power, 10); } str += '<tr><th class="ftot">Total</th>'; for (i=0;i<5;i++) str += '<td class="f' + (i==4 ? 'pwr' : 'shp') + '">' + formatNumber(tot[i].toString()) + '</td>'; var smc = ['','','','']; smc[mode] = ' checked="checked"'; str += '</tr></table><h3>Sale details</h3><table cellspacing="0" cellpadding="0"><tr>' + '<td class="div20" rowspan="4"> </td><td class="pc45"><input type="radio" name="s' + id + 'mode" id="s' + id + 'm0" value="0" onClick="sales.get(' + id + ').setMode(0);' + 'return true"'+smc[0]+' /> <label for="s' + id + 'm0">Gift</label></td><td class="pc15"><label for="s' + id + 'exp">Offer expires:</label></td><td class="pc30"><select name="s' + id + 'exp" id="s' + id + 'exp" onChange="sales.get(' + id + ').setExpire(this.options[this.selectedIndex].value)">'; var expTime = [0, 6, 12, 24, 48, 72, 96, 120], expLabel = ['Never', '6 hours', '12 hours', '1 day', '2 days', '3 days', '4 days', '5 days']; for (i=0;i<expTime.length;i++) str += '<option value="'+expTime[i]+'">'+expLabel[i]+'</option>'; str += '</select></td><td class="div20" rowspan="4"> </td></tr><tr><td class="pc45"><input type="radio" ' + 'name="s'+ id + 'mode" id="s' + id + 'm1" value="1" onClick="sales.get(' + id + ').setMode(1);' + 'return true"'+smc[1]+' /> <label for="s' + id + 'm1">Direct Sale</label></td><td id="s' + id + 'tarl"> </td><td id="s' + id + 'tar"> </td></tr><tr><td class="pc45"><input type="radio" ' + 'name="s'+ id + 'mode" id="s' + id + 'm2" value="2" onClick="sales.get(' + id + ').setMode(2);' + 'return true"'+smc[2]+' /> <label for="s' + id + 'm2">Public Sale</label></td><td id="s' + id + 'pril"> </td><td id="s' + id + 'pri"> </td></tr><tr><td class="pc45"><input type="radio" ' + 'name="s'+ id + 'mode" id="s' + id + 'm3" value="3" onClick="sales.get(' + id + ').setMode(3);' + 'return true"'+smc[3]+' /> <label for="s' + id + 'm3">Auction Sale</label></td><td colspan="2"> </td>' + '</tr></table>'; return str; }} function drawSellLinks(valid) { var str; if (valid) str = '<a href="#" onClick="confirmSale();return false">Confirm</a> - '; else str = ''; str += '<a href="#" onClick="cancelSale();return false">Cancel</a>'; document.getElementById('chordc').innerHTML = str; } function saleAlert(ec, id) { var str; if (ec == -1) str = "Go away, kiddie."; else if (ec == 4) str = 'Error: some fleets were no longer available for sale; they have been\nremoved from the ' + 'list. Please verify the updated fleet sale form.'; else if (ec == 5) { str = 'Error: none of the previously selected fleets are available for sale.'; } else if (ec == 200) { str = 'Error: you are not allowed to sell fleets while in vacation mode.'; } else if (ec == 201) { str = 'Error: you are not allowed to sell fleets while under Peacekeeper protection.'; } else { str = 'An error occured while handling the sale at ' + locations.get(id).name + ':\n'; switch (ec) { case 0: str += 'The target player could not be found.'; break; case 1: str += 'The target player is in a different protection level.'; break; case 2: str += 'The price is invalid.'; break; case 3: str += 'Auction sales require an expiration date.'; break; case 6: str += 'You are trying to sell or give a fleet to yourself.'; break; case 7: str += 'The target player has not been in the game long enough to\naccept the offer.'; break; } } alert(str); } function confirmCancelSale(pl) { return confirm('Are you sure you want to cancel the sale of th' + (pl?'ese fleets':'is fleet') + '?'); } function drawSaleDetails(l, name) { var str, f = fleets.get(l[1]), 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 m = parseInt(f.mode, 10); str = '<table><tr><td id="chord"><h1>Fleet Sale Details</h1></td><td id="chordc">' + '<a href="#" onClick="prepareUpdate();x_getFleetsList(parseMainData);return false">' + 'Close</a></td></tr></table><h2>Fleet</h2><table class="oavaf"><tr>' + foAvaHeader + '</tr><tr class="flown"><td class="fown">' + o.getName() + '</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]) + ' / ' + formatNumber(f.ships[2]) + ' / ' + formatNumber(f.ships[3]) + '</td><td class="fpwr">' + formatNumber(f.power) + '</td><td class="fco">' + (f.orders.oType == 3 ? 'On sale at ' : 'Waiting for transfer at ') + f.orders.loc.name + '</td></tr></table><h2>Sale details</h2><table class="sdet"><tr><th>Sale type:</th><td>'; var st; switch (l[6]) { case '0': if (l[7] == '0') { str += 'Gift'; st = 0; } else { str += 'Direct offer'; st = 1; } str += '</td></tr><tr><th>To player:</th><td><a href="message?a=c&ct=0&id=' + l[4] + '">' + name + '</a></td></tr>'; if (st == 1) str += '<tr><th>Price:</th><td>€' + formatNumber(l[7]) + '</td></tr>'; str += '<tr><th>Expires:</th><td>' + (l[2] == "" ? 'Never' : formatDate(l[2])) + '</td></tr>'; break; case '1': str += 'Public offer</td></tr><tr><th>Price:</th><td>' + formatNumber(l[7]) + '</td></tr>' + '<tr><th>Expires:</th><td>' + (l[2] == "" ? 'Never' : formatDate(l[2])) + '</td></tr>'; st = 2; break; case '2': str += 'Auction sale</td></tr><tr><th>Minimum bid:</th><td>' + formatNumber(l[7]) + '</td></tr>' + '<tr><th>Expires:</th><td>' + formatDate(l[2]) + '</td></tr>'; if (l[8] != '') { str += '<tr><th>Latest bid at:</th><td>' + formatDate(l[10]) + '</td></tr><tr><th>' + 'Bid:</th><td>€' + formatNumber(l[8]) + '</td></tr>'; if (l[3] == "") str += '<tr><th>Bid by:</th><td><a href="message?a=c&ct=0&id=' + l[9] + '">' + name + '</a></td></tr>'; } st = 3; break; } if (l[3] != "") { var tx = parseInt(l[5],10) + 1; str += '<tr><th>Finalized:</th><td>' + formatDate(l[3]) + '</td></tr>'; if (st > 1) str += '<tr><th>Sold to:</th><td><a href="message?a=c&ct=0&id=' + l[4] + '">' + name + '</a></td></tr>'; str += '<tr><th>Transfer time:</th><td>' + tx + ' hour' + (tx > 1 ? 's' : '') + '</td></tr>'; } str += '</table>'; document.getElementById('fpage').innerHTML = str; }