4 <meta charset="utf-8" http-equiv="Content-Language" content="en"/>
5 <title>FreeSpace Standalone</title>
10 var standalone_socket = new WebSocket("ws://" + document.URL.substr(7).split('/')[0], "standalone");
13 standalone_socket.onmessage = function got_packet(msg) {
14 console.log(" <== " + msg.data);
15 if (msg.data[0] == 'D') {
16 document.getElementById("debug").textContent = msg.data.substr(2);
17 } else if (msg.data[0] == 'T') {
18 document.title = msg.data.substr(2);
19 } else if (msg.data[0] == 'S') {
20 do_server_tab(msg.data.substr(2));
21 } else if (msg.data[0] == 'M') {
22 do_multi_tab(msg.data.substr(2));
23 } else if (msg.data[0] == 'P') {
24 do_player_tab(msg.data.substr(2));
25 } else if (msg.data[0] == 'G') {
26 do_gs_tab(msg.data.substr(2));
30 alert('<p>Error ' + exception);
34 standalone_socket.send("shutdown");
35 console.log(" ==> shutdown");
38 function do_general_msgs(msg) {
42 function do_server_tab(msg) {
43 if (msg.substring(0, 5) == "name ") {
44 document.getElementById("server_name").value = msg.substr(5);
45 } else if (msg.substring(0, 5) == "pass ") {
46 document.getElementById("host_pass").value = msg.substr(5);
47 } else if (msg.substring(0, 5) == "ping ") {
48 var conn_table = document.getElementById("connections");
49 var ping_list = msg.substr(5).split(';');
52 while (j < ping_list.length - 1 && j < 12) {
53 var ping = ping_list[j].split(',')
54 var row = conn_table.rows.namedItem(ping[0]);
57 row.cells[1].innerHTML = ping[1];
62 } else if (msg.substring(0, 5) == "conn ") {
63 var conn_table = document.getElementById("connections");
64 var players = document.getElementById("players");
65 var gs_players = document.getElementById("gs_players");
66 var connections = msg.substr(5).split(';');
69 while (j < connections.length - 1 && j < 12) {
70 var conn = connections[j].split(',');
72 var option = document.createElement("option");
73 option.text = conn[0];
74 gs_players.add(option);
76 option = document.createElement("option");
77 option.text = conn[0];
80 conn_table.rows[j+1].id = conn[1];
81 conn_table.rows[j+1].cells[0].innerHTML = conn[1];
83 if (Boolean(conn[2])) {
84 conn_table.rows[j+1].cells[1].innerHTML = conn[2];
90 document.getElementById("n_conn").textContent = j;
93 var ip = msg.substr(5).split(';');
97 while (j < ip.length - 1 && j < 12) {
98 addr = apair[j].split(',');
100 table.rows[j+1].cells[0].innerHTML = addr[0];
101 table.rows[j+1].cells[1].innerHTML = addr[1];
106 document.getElementById("n_conn").textContent = j;
108 while (j < table.rows.length - 1) {
109 table.rows[j+1].cells[0].innerHTML = " ";
110 table.rows[j+1].cells[1].innerHTML = "";
117 function do_player_tab(msg) {
118 if (msg.substring(0, 5) == "info ") {
119 var pinfo = msg.substr(5).split(';');
121 document.getElementById("ship_type").textContent = pinfo[0];
122 document.getElementById("player_ping").textContent = pinfo[1];
124 var all_stats = pinfo[2].split(',');
125 var mission_stats = pinfo[3].split(',');
126 var table = document.getElementById("stats");
129 while (j < table.length - 1) {
130 var row = table.rows[j+1];
132 row.cells[1] = all_stats[j];
133 row.cells[2] = mission_stats[j];
140 function do_gs_tab(msg) {
141 if (msg.substring(0, 5) == "mesg ") {
142 var smsg_box = document.getElementById("smsg_box");
144 smsg_box.value += msg.substr(5);
149 standalone_socket.send("T:");
150 console.log(" ==> test!");
153 function change_server_name() {
154 standalone_socket.send("S:name " + document.getElementById("server_name").value);
155 console.log(" ==> S:name " + document.getElementById("server_name").value);
158 function change_host_pass() {
159 standalone_socket.send("S:pass " + document.getElementById("host_pass").value);
160 console.log(" ==> S:pass " + document.getElementById("host_pass").value);
163 function send_server_message() {
164 var smsg = document.getElementById("server_message");
165 standalone_socket.send("G:smsg " + smsg.value);
166 console.log(" ==> G:smsg " + smsg.value);
170 function refresh_missions() {
171 standalone_socket.send("G:mrefresh");
174 function switch_tab(tab) {
175 var server_tab = document.getElementById("server_tab");
176 var multi_tab = document.getElementById("multi_tab");
177 var pilot_tab = document.getElementById("pilot_tab");
178 var godstuff_tab = document.getElementById("godstuff_tab");
181 multi_tab.style.display = 'none';
182 pilot_tab.style.display = 'none';
183 godstuff_tab.style.display = 'none';
185 server_tab.style.display = 'inline';
186 } else if (tab == 1) {
187 server_tab.style.display = 'none';
188 pilot_tab.style.display = 'none';
189 godstuff_tab.style.display = 'none';
191 multi_tab.style.display = 'inline';
192 } else if (tab == 2) {
193 server_tab.style.display = 'none';
194 multi_tab.style.display = 'none';
195 godstuff_tab.style.display = 'none';
197 pilot_tab.style.display = 'inline';
198 } else if (tab == 3) {
199 server_tab.style.display = 'none';
200 multi_tab.style.display = 'none';
201 pilot_tab.style.display = 'none';
203 godstuff_tab.style.display = 'inline';
207 function smsg_submit(e) {
208 e = e || window.event;
210 if (e.keyCode == 13) {
211 document.getElementById("smsg_submit").click();
218 function get_player_info() {
219 var n = document.getElementById("players").selectedIndex;
222 standalone_socket.send("P:info " + document.getElementById("players").options[n].text);
227 <style type="text/css">
229 font-family: Arial, Helvetica, sans-serif;
232 display: inline-block;
235 background-color: #ddd;
241 background-color: #e7e7e7;
245 text-decoration: none;
246 display: inline-block;
250 list-style-type: none;
254 background-color: #3a3a3a;
260 display: inline-block;
264 text-decoration: none;
269 ul.topnav li a:hover,a:active {
270 background-color: #111;
272 ul.topnav li.shutdown {
276 ul.topnav li.shutdown a {
277 background-color: darkred;
279 ul.topnav li.shutdown a:hover {
280 background-color: red;
289 .tab-box input#server_name,input#host_pass {
294 .tab-box table#connections,table#stats {
295 border: 1px solid #444;
297 border-collapse: collapse;
301 .tab-box table#connections th,table#stats th {
302 background-color: #444;
308 .tab-box table#connections td,table#stats td {
311 font-family: Courier New, Courier, monospace;
314 .tab-box table#connections tr:nth-child(odd),table#stats tr:nth-child(odd) {
315 background-color: #d5d5d5;
320 table.name_pass label {
323 input#server_message {
328 box-sizing: border-box;
330 .players,.players option {
335 #godstuff_tab textarea#smsg_box {
337 box-sizing: border-box;
339 background-color: #fff;
340 border: 1px solid #bbb;
344 font-family: Courier New, Courier, monospace;
352 <div class="container">
355 <li><a onclick="switch_tab(0);" href="javascript:void(0);">Server</a></li>
356 <li><a onclick="switch_tab(1);" href="javascript:void(0);">Multi-Player</a></li>
357 <li><a onclick="switch_tab(2);" href="javascript:void(0);">Player Info</a></li>
358 <li><a onclick="switch_tab(3);" href="javascript:void(0);">God Stuff</a></li>
359 <li class="shutdown"><a onclick="shutdown();" href="javascript:void(0);">Shutdown</a></li>
361 <input type="button" value="Shutdown" onclick="shutdown();"></li>
365 <div class="tab-box">
367 <div id="server_tab" style="display:inline;">
368 <table class="name_pass">
369 <tr><td><label for="server_name">Server Name </label></td><td><input id="server_name" type="text" value="" maxlength="32" onchange="change_server_name();"></td></tr>
370 <tr><td><label for="host_pass">Host Password </label></td><td><input id="host_pass" type="text" value="" maxlength="16" onchange="change_host_pass();"></td></tr>
373 <p>Connections : <span id="n_conn">0</span></p>
375 <table id="connections">
376 <tr><th style="min-width:20em;">IP Address</th><th style="min-width:5em;">Ping</th></tr>
377 <tr><td> </td><td></td></tr>
378 <tr><td> </td><td></td></tr>
379 <tr><td> </td><td></td></tr>
380 <tr><td> </td><td></td></tr>
381 <tr><td> </td><td></td></tr>
382 <tr><td> </td><td></td></tr>
383 <tr><td> </td><td></td></tr>
384 <tr><td> </td><td></td></tr>
385 <tr><td> </td><td></td></tr>
386 <tr><td> </td><td></td></tr>
387 <tr><td> </td><td></td></tr>
388 <tr><td> </td><td></td></tr>
393 <div id="multi_tab" style="display:none;">
397 <div id="pilot_tab" style="display:none;">
398 <label for="players">Player</label>
399 <select id="players" class="players" onchange="get_player_info();">
401 <p>Ship Type <span id="ship_type" class="pinfo"></span></p>
402 <p>Avg Ping <span id="player_ping" class="pinfo"></span></p>
405 <tr><th>Stats</th><th>All Time</th><th>Mission</th></tr>
406 <tr><td>Primary Shots</td><td></td><td></td></tr>
407 <tr><td>Primary Hits</td><td></td><td></td></tr>
408 <tr><td>Primary BH Hits</td><td></td><td></td></tr>
409 <tr><td>Primary Hit %</td><td></td><td></td></tr>
410 <tr><td>Primary BH Hit %</td><td></td><td></td></tr>
411 <tr><td>Secondary Shots</td><td></td><td></td></tr>
412 <tr><td>Secondary Hits</td><td></td><td></td></tr>
413 <tr><td>Secondary BH Hits</td><td></td><td></td></tr>
414 <tr><td>Secondary Hit %</td><td></td><td></td></tr>
415 <tr><td>Secondary BH Hit %</td><td></td><td></td></tr>
416 <tr><td>Assists</td><td></td><td></td></tr>
421 <div id="godstuff_tab" style="display:none;">
422 <label for="gs_players">Player</label>
423 <select id="gs_players" class="players">
426 <input class="button" type="button" value="Refresh Missions" onclick="refresh_missions();">
429 <label for="server_message">Server Message</label>
431 <input id="server_message" type="text" value="" onkeypress="return smsg_submit(event);">
432 <input id="smsg_submit" type="button" onclick="send_server_message();" style="display:none;">
435 <textarea readonly rows="20" id="smsg_box"></textarea>
441 <div id="debug" class="debug_state"></div>
444 <input type="button" value="Test" onclick="testing();">