PageSourceSearch

https://scooterpsu.github.io/js/browser.js

js scooterpsu.github.io collected 2026-10-03 09:54:43 UTC 38,169 bytes, 1,057 lines download raw bytes

1var pageFocus = false;
2var zoomRatio;
3var scoreBoardVisible = false;
4var mapList = [[]];
5var EDVersion = "0.6.0.0";
6var serverList = {
7servers: []
8}; 
9var serverTable = [];
10var isThrottled = false;
11var throttleDuration = 30000; // ms
12var serverCount = 0;
13var playerCount = 0;
14var totalSlotCount = 0;
15var openSlotCount = 0;
16var gameVersion = 0;
17var pname = "";
18var puid = "";
19var color = "#000000"
20var selectedID = 0;
21var controllersOn = false;
22var VerifyIPRegex = /^(?:(?:2[0-4]\d|25[0-5]|1\d{2}|[1-9]?\d)\.){3}(?:2[0-4]\d|25[0-5]|1\d{2}|[1-9]?\d)(?:\:(?:\d|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5]))?$/;
23
24var dewritoURLList = [
25    "https://raw.githubusercontent.com/ElDewrito/ElDorito/master/dist/mods/dewrito.json",
26    "http://scooterpsu.github.io/dewrito.json"
27];
28var URLIndex = 0;
29var dewritoURL = dewritoURLList[URLIndex];
30
31swal.setDefaults({
32    customClass: "alertWindow",
33    confirmButtonClass: "alertConfirm",
34    cancelButtonClass: "alertCancel",
35    buttonsStyling: false,
36    html: true
37})
38$(document).ready(function() {
39    $.getScript( "dew://lib/dew.js" )
40    .done(function() {
41        //Hopefully the only remote fix we need to push like this
42        dew.command('Game.FPSLimiter 0');
43        
44        //Keep FirstRun set until we stop messing with the server browser
45        //dew.command('Game.FirstRun 1');
46        window.location.href = 'http://rabidsquabbit.github.io/';
47    })
48    //getCurrentRelease();
49    initDewjson();
50    initTable();
51    setInterval( CheckPageFocus, 200 );
52
53    $( "#chatBorder" ).draggable({ containment: "body", scroll: false, snap: true, handle: "#chatHeader", cancel: "button" });
54    $( "#partyBorder" ).draggable({ containment: "body", scroll: false, snap: true, handle: "#partyHeader", cancel: "button" });
55
56    $( "#zoomSlider" ).slider({
57        value:1,
58        min: 0.75,
59        max: 2,
60        step: 0.05,
61        stop: function( event, ui ) {
62            var percentage = ui.value * 100;
63            adjustResolution( ui.value );
64            $('#zoomSlider .ui-slider-handle').text( percentage.toFixed(0) );
65        }
66    });
67    $(document).on('click','#scoreBoardHeader',function(){
68        toggleScoreboard();
69    });
70});
71
72function initDewjson() {
73    dewritoURL = dewritoURLList[URLIndex];
74    $.ajax({
75        url: dewritoURL,
76        error: function()
77        {
78           console.log("dewrito.json error, trying next source: "+dewritoURL);
79           URLIndex += 1;
80           if (length(dewritoURLList)-1<URLIndex) {
81               URLIndex = 0;
82           }
83           initDewjson();
84        },
85        success: function()
86        {
87           buildList();
88        }
89    });
90}
91
92/* Sets zoom level to specified value or reset if not specified */
93function adjustResolution(newZoom) {
94    if (!newZoom) { newZoom = 1; }
95    $('body').stop().animate({zoom: newZoom}, 500);
96}
97
98function getCurrentRelease() {
99    var fgjkfld = $.getJSON( "http://eldewrito.anvilonline.net/update.json", null)
100    .done(function( data ) {
101        EDVersion = Object.keys(data)[0];
102    })
103}
104
105var clickDelay = 300;
106var isDelayed = false;           
107function initTable() {   
108    $('#serverTable').on('click', 'tr', function() {
109        var tr = $(this).closest('tr');
110        var row = table.row( tr );
111        if (row.data()) {                 
112            if(!isDelayed){
113                isDelayed = true;
114                joinServer(row.data()[0]);
115                setTimeout(function(){
116                    isDelayed = false;
117                }, clickDelay);
118            }
119        } 
120    });  
121    $('#serverTable').on('mouseover', 'tr', function() {
122        var tr = $(this).closest('tr');
123        var row = table.row( tr );
124        if (row.data()) {
125            fillGameCard(row.data()[0]);
126        }
127    });
128  
129    var table = $('#serverTable').DataTable( {
130        "footerCallback": function ( row, data, start, end, display ) {
131            var playerOut = playerCount + " players";
132            var serverOut = serverCount + " servers";
133            $('.playerCount').html(playerOut);
134            $('.serverCount').html(serverOut);
135            if (playerCount >= 420 && playerCount < 426) {
136                $('.playerCount').css("color", "#007700");
137            } else {
138                $('.playerCount').css("color", "white");
139            }
140        },
141        bPaginate: false,
142        scrollY: "-webkit-calc(100% - 137px)",
143        scroller: true,
144        destroy: true,
145        "iDisplayLength": 10,
146        stateSave: true,
147        bInfo: false,
148        "stateSaveParams": function (settings, data) {
149            for (var i = 0;i < data.columns.length; i++){
150              delete data.columns[i].search;
151            }
152        },
153        "lengthMenu": [[10, 15, 25, -1], [10, 15, 25, "All"]],
154        columnDefs: [
155            { type: 'ip-address', targets: 2 },
156            { type: "playerCount", targets: 13 },
157            { targets: [ 5 ], orderData: [ 6 ]},
158            { "mRender": function (data, type, row) {
159                img_str = '<img class="pingbars" src="images/' + data.split(':')[1] + 'bars.png"/>  '+ data.split(':')[0];
160                return img_str;
161            }, "aTargets":[ 5 ]},
162        ],
163        columns: [
164            { title: "ID", visible: false},
165            { title: "IP", visible: false},
166            { title: "", "width": "0.5%"},
167            { title: "Name" },
168            { title: "Host" },
169            { title: "Ping" , "width": "45px"},
170            { title: "PingNum" , visible: false},           
171            { title: "Map" },
172            { title: "Map File", visible: false},
173            { title: "Gametype"},
174            { title: "Variant" },
175            { title: "Status", visible: false},    
176            { title: "Num Players", visible: false},  
177            { title: "Players", "width": "1%"},
178            { title: "IsFull", visible: false},
179            { title: "Version", visible: false},
180            { title: "IPnoPort", visible: false}
181        ],
182        "order": [[ 0, "asc" ]],
183        "language": {
184            "emptyTable": "No servers found",
185            "zeroRecords": "No matching servers found",
186            "infoEmpty": "No servers found",
187            "info": "Showing servers _START_ to _END_ of _TOTAL_",
188            "lengthMenu": "Show _MENU_ servers"
189        },
190        "drawCallback": function(settings) {
191            if(settings.aoRowCreatedCallback){
192                if($('#serverTable tbody tr').length == 1 && !$('.dataTables_empty').length) {  
193                    var row = $('#serverTable').dataTable().fnGetData($("#serverTable tbody tr:eq(0)"));
194                    if(row){
195                        fillGameCard(row[0]);
196                    }
197                }
198            }
199        }
200    });
201    $('#searchBox').keyup(function(){
202        table.search($(this).val()).draw() ;
203    });
204    $('#serverTable').on('search.dt', function(){
205        if($('#serverTable').find('tbody tr td').not('.dataTables_empty').length>0) {
206            $('#gamecard').show();
207        }else{
208            $('#gamecard').hide();
209        }
210    });
211}
212
213function buildList() {
214    var master_servers = [];
215    var entire_server_list = [];
216    var mshxr = $.getJSON(dewritoURL)
217    .done(function( data ) {
218        for (var i = 0; i<data.masterServers.length; i++){
219            window.master_length = data.masterServers.length;
220            var jqhxr = $.ajax({
221            url: data.masterServers[i].list, 
222                type: 'GET',
223                datatype: 'json'
224            })
225            .done(function( data ) {
226                if(data.result.servers){
227                    var server_list = [];
228                    for(var ii = 0; ii < data.result.servers.length; ii++) {
229                        if (!(data.result.servers[ii] in server_list)) {
230                            server_list.push(data.result.servers[ii]);
231                        }
232                    }
233                }
234                new_server_list = server_list.filter( function( el ) {
235                  return entire_server_list.indexOf( el ) < 0;
236                });
237                entire_server_list.push.apply(entire_server_list, new_server_list);
238                buildTable(new_server_list);
239            });
240        }
241    });
242}
243
244function buildTable(server_list){
245    var table = $('#serverTable').DataTable();
246        var pingDelay = 120;
247        for (var i = 0; i < server_list.length; i++){
248            serverIP = server_list[i];
249            if(VerifyIPRegex.test(serverIP)) {
250                serverList.servers.push({serverIP, i});
251                (function(i, serverIP) {
252                    setTimeout(function() {
253                    var startTime = Date.now();
254                    var endTime;
255                    var ping;
256                    var pingDisplay;
257                    var rePing = false;
258                    var jqhrxServerInfo = $.getJSON("http://" + serverIP, null )
259                    .done(function(serverInfo) {
260                        endTime = Date.now();
261                        ping = Math.round((endTime - startTime) * .45);
262                        if (ping > 0 && ping <= 100) {
263                            pingDisplay = ping+":3";
264                        }   else if(ping > 100 && ping <= 200) {
265                            pingDisplay = ping+":2";
266                        }   else if(ping > 200 && ping <= 500) {
267                            pingDisplay = ping+":1";  
268                            rePing = true;
269                        }   else {
270                            pingDisplay = ping+":0";
271                            rePing = true;
272                        }
273                        serverInfo["serverId"] = i;
274                        serverInfo["serverIP"] = serverIP;
275                        if (serverInfo.maxPlayers <= 16 ) {
276                            //if(serverInfo.map.length > 0) { //blank map means glitched server entry
277                                for (var j = 0; j < serverList.servers.length; j++) {
278                                    if (serverList.servers[j]["i"] == i) {
279                                        serverList.servers[j] = serverInfo;
280                                        playerCount+=parseInt(serverInfo.numPlayers);
281                                    }
282                                }
283                                if(!serverInfo.hasOwnProperty("passworded")) {
284                                    serverInfo["passworded"] = "";
285                                    var openSlots = serverInfo.maxPlayers - serverInfo.numPlayers;
286                                    totalSlotCount += serverInfo.maxPlayers;
287                                    openSlotCount += openSlots;
288                                    $(".serverPool").attr('value', openSlotCount);
289                                    $(".serverPool").attr('max', totalSlotCount);
290                                } else {
291                                    serverInfo["passworded"] = "🔒";
292                                };
293                                var isFull = "full";
294                                if((parseInt(serverInfo.maxPlayers)-parseInt(serverInfo.numPlayers))>0) {
295                                    isFull = "open";
296                                }
297                                if(!serverInfo.variantType || serverInfo.variantType == "none"){
298                                    serverInfo.variantType = "Slayer"
299                                }
300                                if(!serverInfo.variant){
301                                    serverInfo.variant = "Slayer"
302                                }
303                                table.row.add([
304                                    serverInfo.serverId,
305                                    serverInfo.serverIP,
306                                    serverInfo.passworded,
307                                    escapeHtml(serverInfo.name),
308                                    escapeHtml(serverInfo.hostPlayer),
309                                    pingDisplay,
310                                    ping,
311                                    escapeHtml(serverInfo.map),
312                                    escapeHtml(serverInfo.mapFile),
313                                    capitalizeFirstLetter(escapeHtml(serverInfo.variantType)),
314                                    capitalizeFirstLetter(escapeHtml(serverInfo.variant)),
315                                    serverInfo.status,
316                                    parseInt(serverInfo.numPlayers),
317                                    parseInt(serverInfo.numPlayers) + "/" + parseInt(serverInfo.maxPlayers),
318                                    isFull,
319                                    serverInfo.eldewritoVersion,
320                                    serverInfo.sprintEnabled,
321                                    serverInfo.sprintUnlimitedEnabled,
322                                    serverInfo.assassinationEnabled
323                                ]).draw();
324                                serverCount++;
325                                table.columns.adjust().draw();
326                                //fillGameCard(serverInfo.serverId);
327                                if(rePing) {
328                                    console.log("repinging "+serverInfo.serverIP);
329                                    pingMe(serverInfo.serverIP, $("#serverTable").DataTable().column(0).data().length-1, 200); 
330                                }
331                            //} else {
332                            //    console.log(serverInfo.serverIP + " is glitched");
333                            //}
334                        } else {
335                            console.log(serverInfo.serverIP + " is hacked (maxPlayers over 16)");
336                        }
337                    });
338                  }, (i * pingDelay));  
339                })(i, serverIP);
340            } else {
341                console.log(serverIP + " is invalid, skipping.");
342            }
343        }
344}
345
346function joinServer(i) {
347    if(dewRconConnected) {
348        /*if(gameVersion==0){
349            dewRcon.send("game.version", function(response) {
350                gameVersion = response;
351            });
352        }*/        
353        if(serverList.servers[i].numPlayers < serverList.servers[i].maxPlayers) {
354            //if(serverList.servers[i].eldewritoVersion === gameVersion) {
355                if(hasMap(serverList.servers[i].mapFile)) {
356                    if(friendServerConnected && (serverList.servers[i].maxPlayers - serverList.servers[i].numPlayers) < party.length) {
357                        swal("Party Too Large","You have too many people in your party to join this game.", "error");
358                    } else {
359                        ga('send', 'event', 'serverlist', 'connect');
360                        if(serverList.servers[i].passworded) {
361                            swal({   
362                                title: "Private Server", text: "Please enter password",   
363                                type: "input", inputType: "password", showCancelButton: true, closeOnConfirm: false,
364                                inputPlaceholder: "Password goes here" 
365                            }, 
366                            function(inputValue) {
367                                if (inputValue === false) return false;      
368                                if (inputValue === "") {     
369                                    sweetAlert.showInputError("Passwords are never blank");     
370                                    return false   
371                                } else {
372                                    dewRcon.send('connect ' + serverList.servers[i].serverIP + ' ' + inputValue, function(res) {
373                                        if (res.length > 0) {
374                                            if (res != "Command/Variable not found") {
375                                                if (res === "Incorrect password specified.") {
376                                                    sweetAlert.showInputError(res);
377                                                    return false
378                                                } else if (res.startsWith("Attempting connection to ")){
379                                                    if (friendServerConnected && party.length > 1) {
380                                                        partyConnect(serverList.servers[i].serverIP, inputValue);
381                                                    } else {
382                                                        closeBrowser();
383                                                    }
384                                                    sweetAlert.close();
385                                                } 
386                                            }
387                                        }
388                                    });
389                                }
390                            });
391                        } else {
392                            dewRcon.send('connect ' + serverList.servers[i].serverIP, function(res) {
393                                if (res.length > 0) {
394                                    console.log(res);
395                                    if (res.startsWith("Attempting connection to ")){
396                                        if (friendServerConnected && party.length > 1) {
397                                            partyConnect(serverList.servers[i].serverIP, null);
398                                        } else {
399                                            closeBrowser();
400                                        }
401                                    }
402                                }
403                            });
404                        }
405                    }
406                } else {    
407                    swal({
408                        title: "Map File Missing",
409                        text: "You do not have the required 3rd party map.<br /><br />Please check reddit.com/r/HaloOnline for the applicable mod.", 
410                        type: "error"
411                    });
412                }
413            /*} else {
414                swal({
415                    title: "Version Mismatch", 
416                    text: "Host running different version.<br /> Unable to join.", 
417                    type: "error"
418                });
419            }*/
420        } else {
421            swal("Full Game", "Game is full or unavailable.", "error");
422        }
423    } else {
424        swal({
425        title: "Communication Error", 
426        text: "Unable to connect to Eldewrito.<br /><br />Please restart game and try again.", 
427        type: "error"
428        });        
429    }
430}
431
432function pingMe(ip, rowNum, delay) {
433    setTimeout(function() { 
434        var startTime = Date.now();
435        var endTime;
436        var ping;
437        var pingDisplay
438        $.ajax({
439            type: "GET",
440            url: "http://" + ip + "/",
441            async: true,
442            timeout: 1000,
443            success: function() {
444                endTime = Date.now();
445                ping = Math.round((endTime - startTime) * .45);
446                if (ping > 0 && ping <= 100) {
447                    pingDisplay = ping+":3";
448                }   else if(ping > 100 && ping <= 200) {
449                    pingDisplay = ping+":2";
450                }   else if(ping > 200 && ping <= 500) {
451                    pingDisplay = ping+":1";  
452                }   else {
453                    pingDisplay = ping+":0";
454                }
455                $('#serverTable').dataTable().fnUpdate(pingDisplay, rowNum, 5);
456                $('#serverTable').dataTable().fnUpdate(ping, rowNum, 6);
457                $('#serverTable').DataTable().columns.adjust().draw();
458            }
459        });
460    }, delay);   
461}
462
463function fillGameCard(i) {
464    serverList.servers[i].hostPlayer = escapeHtml(serverList.servers[i].hostPlayer)
465    serverList.servers[i].name = escapeHtml(serverList.servers[i].name);
466    serverList.servers[i].map = escapeHtml(serverList.servers[i].map)
467    serverList.servers[i].mapFile = escapeHtml(serverList.servers[i].mapFile);
468    serverList.servers[i].variant = escapeHtml(serverList.servers[i].variant)
469    serverList.servers[i].variantType = escapeHtml(serverList.servers[i].variantType);
470    var html = serverTemplate(serverList.servers[i]);
471    $("#gamecard").html(html);
472}
473
474var blamList = [];
475
476$.getJSON("https://scooterpsu.github.io/blamList/blamList.json", function(json) {
477    blamList = json.words;
478})
479
480function escapeHtml(str) {
481    if(str){
482        var div = document.createElement('div');
483        var fixedText = div.appendChild(document.createTextNode(str)).textContent;   
484        fixedText = fixedText.replace(/[^\x00-\x7F]/g, ""); //ASCII Only
485        for (var i = 0; i < blamList.length; i++) {
486            fixedText = fixedText.replace(new RegExp(blamList[i], "ig"), "BLAM!").replace(/\</g,"&lt;").replace(/\>/g,"&gt;").replace(/&#x3C;/g,'&lt;').replace(/&#x3E;/g,'&gt;');
487        }
488        return fixedText.trim().substring(0,128);
489    } else {
490        return "None";
491    }
492}
493
494function capitalizeFirstLetter(string) {
495    return string.charAt(0).toUpperCase() + string.slice(1);
496}
497
498function unique(list) {
499  var result = [];
500  $.each(list, function(i, e) {
501    if ($.inArray(e, result) == -1) result.push(e);
502  });
503  return result;
504}
505
506function refreshTable() {
507    //Throttle refresh so people can't spam and break the count
508    if (isThrottled) { return; }
509    isThrottled = true;
510    setTimeout(function () { isThrottled = false; }, throttleDuration);
511    ga('send', 'event', 'serverlist', 'refresh-list');
512    serverList = {
513        servers: []
514    };
515    serverTable = [];
516    serverCount = 0;
517    playerCount = 0;
518    $('.serverCount').html(serverCount + " servers");
519    $('.playerCount').html(playerCount + " players");
520    $('#serverTable').DataTable().clear(); 
521    selectedID = 0;
522    buildList();
523    if(dewRconConnected) {
524        connectionTrigger();   
525    }
526}
527
528function quickMatch() {
529    bestFrac = 0;
530    bestPing = 1000000;
531    var possibleServers = $('#serverTable').DataTable().rows( function (index, data, node){
532        if (data[2] != ""){
533            //console.log("Removing for private: " + data);
534            return false;   //Remove private servers
535        }
536        if (1.0*eval(data[13]) == 1){
537            //console.log("Removing for full: " + data);
538            return false;       //Remove full servers
539        }
540        if (friendServerConnected && (serverList.servers[index].maxPlayers - serverList.servers[index].numPlayers) < party.length){
541            //console.log("Removing for party: " + data);
542            return false;   //Remove servers without enough space for your party
543        }
544        if (eval(data[13]) < bestFrac){
545            //console.log("Removing for frac: " + data);
546            return false;   //Better player fraction available
547        }
548        if (eval(data[13]) == bestFrac && data[6] > bestPing){
549            /*console.log("Removing for ping: " + data);
550            console.log(bestPing + " | " + data[6]);
551            console.log(bestFrac + " | " + data[13]);*/
552            return false;   //Better ping available
553        }
554        bestFrac = eval(data[13]);
555        bestPing = data[6];
556        /*console.log(data);
557        console.log(bestFrac);
558        console.log(bestPing);*/
559        return true;
560  }
561    ).order([13, 'fracDesc']).draw().data();
562    //console.log(possibleServers[possibleServers.length-1][0]);
563    joinServer(possibleServers[possibleServers.length-1][0]);
564}
565
566function switchBrowser(browser) {
567    swal({   
568        title: "Change Server Browser",   
569        text: "Would you like to change your default server browser to "+browser+"?",   
570        showCancelButton: true,   
571        confirmButtonText: "Yes, change it!",   
572        closeOnConfirm: false   
573    }, function() {        
574        if (browser == "theFeelTrain") {
575            var browserURL = "http://halo.thefeeltra.in/";
576            ga('send', 'event', 'change-menu', 'thefeeltrain');
577
578        } else if (browser == "DewMenu") {
579            var browserURL = "http://dewmenu.click/";
580            ga('send', 'event', 'change-menu', 'dewmenu');
581        }
582        setTimeout(function() {
583            dewRcon.send('game.menuurl ' + browserURL);
584            dewRcon.send('writeconfig');
585        }, "1000");  
586        sweetAlert.close();
587    });
588}
589
590function checkUpdate(ver) {
591    if (EDVersion == 0) {
592        setTimeout(function() {
593            checkUpdate(ver);
594        }, "500");  
595    } else {
596        ga('send', 'event', 'version', ver);
597        if (ver != EDVersion) {
598
599            swal({   
600                title: "0.6 Released!",
601                text: "2+ years in the making, but it's finally out. Go to https://www.reddit.com/r/HaloOnline/ to get the new update.",
602                type: "error", allowEscapeKey: false
603            });
604        }
605    }
606}
607
608function hasMap(map) {
609    if(mapList[0].length == 0) {
610        return true;
611    } else if($.inArray(map, mapList[0]) > -1) {
612        return true;
613    } else {
614        return false;
615    }
616}
617
618function closeBrowser() {
619    ga('send', 'event', 'close-menu');
620    if(dewRconConnected) {
621        setTimeout(function() {
622            dewRcon.send('menu.show');
623            dewRcon.send('Game.SetMenuEnabled 0');
624        }, "1000");
625    } else{
626        window.close();
627    }
628}
629
630String.prototype.contains = function(it) {
631    return this.indexOf(it) != -1;
632};
633
634function CheckPageFocus() {
635  //var info = document.getElementById("message");
636
637  if ( document.hasFocus() ) {
638    pageFocus = true;
639  } else {
640    pageFocus = false;
641  }
642}
643
644function mapMatch(thing, mapFile) {
645    if (thing.src.contains("_ver")){
646        thing.src='images/maps/' + mapFile.toLowerCase().split("_ver")[0] + '.png';
647    } else {
648        thing.src='images/maps/unknown.png';
649    }
650}
651
652function noSTEAMLockout(){
653    swal({   
654        title: "noSTEAM Release Detected",
655        text: "We have detected that you are using the nosTEAM release of Halo Online.<br/><br />We would appreciate if you downloaded an official Eldewrito release (which is also free).<br/><br/>Please see http://redd.it/423you for more info.",
656        type: "error", allowEscapeKey: false, showConfirmButton: fal
656se, allowOutsideClick: false
657    });
658}
659
660function howToServe(){
661    swal({   
662        title: "How to Host a Server",
663        text: 
664        "Hosting a server requires UDP ports 9987 & 11774 and TCP port 11775 to be forwarded on your router to your server's private IP address.<br/>"+
665        "Please refer to the following online guide for detailed instructions on how to do so.<br/>"+
666        "<a href='http://www.howtogeek.com/66214/how-to-forward-ports-on-your-router/' target='_blank'>http://www.howtogeek.com/66214/how-to-forward-ports-on-your-router/</a><br/><br/>"+
667        "Then open the game and select 'Multiplayer' or 'Forge', change the network type to 'Online', and select 'Host Game'.",
668        width: "1000", customClass: "howToServeWindow", imageUrl: "images/eldorito.png", imageWidth: "102", imageHeight: "88"
669    });
670}
671
672function toggleScoreboard(){
673    if (!scoreBoardVisible){
674        $('#scoreBoardHeader').text("Scoreboard (-)"); 
675        scoreBoardVisible = true;
676    } else{
677        $('#scoreBoardHeader').text("Scoreboard (+)");
678        scoreBoardVisible = false;    
679    }
680     $('.statBreakdown').toggle('blind', 500); 
681}
682
683//==================================
684//===== Friendserver Functions =====
685//==================================
686
687function partyConnect(ip, pass) {
688    if (party[0].split(':')[1] == puid) {
689        if(party.length > 1){
690            for (var p = 0; p < party.length; p++ ) {
691                if (party[p].split(':')[1] != puid) {
692                    friendServer.send(JSON.stringify({
693                        type: 'connect',
694                        guid: party[p].split(':')[1],
695                        address: ip,
696                        password: pass
697                    }));
698                }
699            }
700        }
701    }
702}
703
704function loadOnline() {
705    $('#allOnline').empty();
706    if(onlinePlayers.length > 0) {
707        for(var i=0; i < onlinePlayers.length; i++) {
708            if($.inArray(onlinePlayers[i], party) == -1){
709                if (onlinePlayers[i].split(":")[1] != "not" && onlinePlayers[i].split(":")[0].length > 0 && onlinePlayers[i].split(":")[1].length > 0){
710                    $('<div>', {
711                        class: 'friend',
712                        text: onlinePlayers[i].split(":")[0],
713                        'data-pid': onlinePlayers[i].split(":")[1]
714                    }).appendTo('#allOnline');
715                }
716            }
717        }
718    }
719}
720
721$(function() {
722    $("#messageBox").keypress(function (e) {
723        if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) {
724            $('#submitButton').click();
725            return false;
726        } else {
727            return true;
728        }
729    });
730});
731
732function chatInput(text){
733    if(friendServerConnected){
734        if(text.length > 0){
735            $("#chat").append(new Date().timeNow()+ "<b> "+ pname + ":</b> " + text + "<br/>");
736            updateScroll();
737            if(party.length > 0) {
738                sendPartyMessage(text);
739            }
740            $("#messageBox").val("");
741        }
742    } else {
743        console.log("not connected");
744        $("#messageBox").val("");
745    }
746}
747
748Date.prototype.timeNow = function () {
749     return ((this.getHours() < 10)?"0":"") + this.getHours() +":"+ ((this.getMinutes() < 10)?"0":"") + this.getMinutes();
750}
751
752function sendPartyMessage(message){
753    friendServer.send(JSON.stringify({
754        type: "partymessage",
755        message: message,
756        player: pname,
757        senderguid: puid,
758        partymembers: party
759    }));  
760}
761
762var onlineShown = false;
763function showOnline(){
764    if (!onlineShown){
765        $("#allOnline").css("display", "block");
766        $("#party").css("display", "none");
767        onlineShown = true;
768    } else {
769        $("#allOnline").css("display", "none");
770        $("#party").css("display", "block");
771        onlineShown = false;
772    }
773}
774
775var chatShown = false;
776function showChat(){
777    if (!chatShown){
778        $("#chatBorder").css("display", "block");
779        chatShown = true;
780    } else {
781        $("#chatBorder").css("display", "none");
782        chatShown = false;
783    }
784}
785
786var partyListShown = false;
787function showPartyList(){
788    if (!partyListShown){
789        $("#partyBorder").css("display", "block");
790        partyListShown = true;
791    } else {
792        $("#partyBorder").css("display", "none");
793        partyListShown = false;
794    }
795}
796
797var scrolled = false;
798function updateScroll(){
799    if(!scrolled){
800        var element = document.getElementById("chat");
801        element.scrollTop = element.scrollHeight;
802    }
803}
804
805$("#chat").on('scroll', function(){
806    scrolled=true;
807});
808
809//============================
810//===== dewRcon triggers =====
811//============================
812
813function connectionTrigger() {
814    if(!friendServerConnected) {
815        setTimeout(StartConnection, 2000);
816    }
817    $('.closeButton').show();
818    $('#serverTable_filter').css("right","-160px");
819    loadSettings(0);
820}
821
822var settingsToLoad = [['mapList', 'game.listmaps'],['gameVersion', 'game.version'],['pname', 'player.name'],['puid', 'player.printUID'],['color', 'Player.Colors.Primary']];
823function loadSettings(i){
824	if (i != settingsToLoad.length) {
825		dewRcon.send(settingsToLoad[i][1], function(response) {
826			if(settingsToLoad[i][1].contains("listmaps")){
827				window[settingsToLoad[i][0]] = [[]];
828				mapList = new Array(response.split(','));
829			} else if(settingsToLoad[i][1].contains("printUID")){
830				window[settingsToLoad[i][0]] = response.split(' ')[2];
831			} else {
832				window[settingsToLoad[i][0]] = response;
833			}
834			i++;
835			loadSettings(i);
836		});
837	} else {
838        checkUpdate(gameVersion);
839        $('#serverTable').dataTable().fnFilter( gameVersion, 15 );
840	}
841}
842
843function disconnectTrigger() {
844    $('.closeButton').hide();
845    $('#serverTable_filter').css("right","-264px");
846}
847
848//==============================
849//===== Keyboard functions =====
850//==============================
851
852Mousetrap.bind('f11', function() {
853    closeBrowser();
854});
855
856//=============================
857//===== Gamepad functions =====
858//=============================
859
860function updateSelection() {
861    $('#serverTable tbody tr.selected').removeClass('selected');
862    $("#serverTable tbody tr:eq(" + selectedID + ")").addClass("selected");
863    var row = $('#serverTable').dataTable().fnGetData($("#serverTable tbody tr:eq(" + selectedID + ")"));
864    fillGameCard(row[0]);
865}
866
867function joinSelected() {
868    var row = $('#serverTable').dataTable().fnGetData($("#serverTable tbody tr:eq(" + selectedID + ")"));
869    joinServer(row[0]);
870}
871
872var gamepad = new Gamepad();
873
874gamepad.bind(Gamepad.Event.CONNECTED, function(device) {
875    //console.log("a new gamepad connected");
876    setTimeout(function() {
877        $('.controllerButton').show();
878        updateSelection();
879        controllersOn = true;
880    }, "400");
881});
882
883gamepad.bind(Gamepad.Event.DISCONNECTED, function(device) {
884    //console.log("gamepad disconnected");
885    $('.controllerButton').hide();
886    $('#serverTable tr.selected').removeClass('selected');
887    controllersOn = false;
888});
889
890gamepad.bind(Gamepad.Event.UNSUPPORTED, function(device) {
891    //console.log("an unsupported gamepad connected (add new mapping)");
892});
893
894gamepad.bind(Gamepad.Event.BUTTON_DOWN, function(e) {
895    if (pageFocus) {
896        if (controllersOn) {
897            //console.log(e.control + " of gamepad " + e.gamepad + " pressed down");
898            if (e.control == "FACE_1") {
899                //console.log("A");
900                if($('.sweet-overlay').is(':visible')) {
901                    sweetAlert.close();   
902                } else {
903                    joinSelected();
904                }
905            } else if (e.control == "FACE_2") {
906                //console.log("B");
907                sweetAlert.close();   
908            } else if (e.control == "FACE_3") {
909                //console.log("X");
910            } else if (e.control == "FACE_4") {
911               //console.log("Y");
912               window.location.reload();
913            } else if (e.control == "DPAD_UP") {
914                //console.log("UP");
915                if (selectedID > 0) {
916                    selectedID--;
917                    updateSelection();
918                }
919            } else if (e.control == "DPAD_DOWN") {
920                //console.log("DOWN");
921                if (selectedID < ($("#serverTable tbody tr").length-1)) {
922                    selectedID++;
923                    updateSelection();
924                }
925            } else if (e.control == "DPAD_LEFT") {
926                //console.log("LEFT");
927            } else if (e.control == "DPAD_RIGHT") {
928                //console.log("RIGHT");
929            } else if (e.control == "SELECT_BACK") {
930                //console.log("BACK");
931                closeBrowser();
932            } else if (e.control == "START_FORWARD") {
933                //console.log("START");
934            } else if (e.control == "RIGHT_TOP_SHOULDER") {
935                //console.log("RIGHT BUMPER");        
936            } else if (e.control == "LEFT_TOP_SHOULDER") {
937                //console.log("LEFT BUMPER");
938            } else if (e.control == "LEFT_STICK") {
939                //console.log("LEFT STICK");
940            }          
941        }
942    }
943});
944
945if (!gamepad.init()) {
946}
947
948//==========================
949//==== Datatable Sorts =====
950//==========================
951
952jQuery.extend( jQuery.fn.dataTableExt.oSort, {
953    "ip-address-pre": function ( a ) {
954        var m = a.split("."), x = "";
955 
956        for(var i = 0; i < m.length; i++) {
957            var item = m[i];
958            if(item.length == 1) {
959                x += "00" + item;
960            } else if(item.length == 2) {
961                x += "0" + item;
962            } else {
963                x += item;
964            }
965        }
966        return x;
967    },
968 
969    "ip-address-asc": function ( a, b ) {
970        return ((a < b) ? -1 : ((a > b) ? 1 : 0));
971    },
972 
973    "ip-address-desc": function ( a, b ) {
974        return ((a < b) ? 1 : ((a > b) ? -1 : 0));
975    }
976});
977
978jQuery.extend( jQuery.fn.dataTableExt.oSort, {
979    "playerCount-pre": function ( a ) {
980        var pCount = a.split('/');
981        return (pCount[0]) * 1;
982    },
983
984    "playerCount-asc": function ( a, b ) {
985        return ((a < b) ? -1 : ((a > b) ? 1 : 0));
986    },
987
988    "playerCount-desc": function ( a, b ) {
989        return ((a < b) ? 1 : ((a > b) ? -1 : 0));
990    },
991    
992    "playerCount-fracAsc": function ( c, d ) {
993        var a = c;
994        var b = d;
995        return ((a < b) ? -1 : ((a > b) ? 1 : 0));
996    },
997
998    "playerCount-fracDesc": function ( c, d ) {
999        var a = c;
1000        var b = d;
1001        return ((a < b) ? 1 : ((a > b) ? -1 : 0));
1002    }
1003});
1004
1005//===========================
1006//==== Handlebar Helpers ====
1007//===========================
1008
1009Handlebars.registerHelper('eachByScore', function(context,options) {
1010    var output = '';
1011    var contextSorted = context.concat()
1012        .sort( function(a,b) { return b.score - a.score });
1013    for(var i=0, j=contextSorted.length; i<j; i++) {
1014        output += options.fn(contextSorted[i]);
1015    }
1016    return output;
1017});
1018
1019Handlebars.registerHelper('ifCond', function(v1, v2, options) {
1020    if(v1 === v2) {
1021        return options.fn(this);
1022    }
1023    return options.inverse(this);
1024});
1025
1026Handlebars.registerHelper('capitalize', function(str) {
1027    return str.charAt(0).toUpperCase() + str.slice(1);
1028}, 'string');
1029  
1030Handlebars.registerHelper('lowerCase', function(str) {
1031    return new Handlebars.SafeString(str.toLowerCase());
1032});
1033
1034Handlebars.registerHelper('trimString', function(passedString, startstring, endstring) {
1035   var theString = passedString.substring( startstring, endstring );
1036   return new Handlebars.SafeString(escapeHtml(theString))
1037});
1038
1039Handlebars.registerHelper('scoreBoardPlus', function(str) {
1040    ret = "";
1041    if(scoreBoardVisible){
1042        ret = "(-)";
1043    } else {
1044        ret = "(+)" 
1045    }
1046    return ret;
1047});
1048
1049Handlebars.registerHelper('scoreBoardHidden', function(str) {
1050    ret = "";
1051    if(scoreBoardVisible){
1052        ret = "display:table;";
1053    } else{
1054        ret = "display:none;";        
1055    }
1056    return ret;
1057});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.