Mercurial > hg > batmud > maputils
changeset 1912:fd642a09c8db
Implement location search. Also get rid of the END message.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Mon, 06 Nov 2017 20:47:35 +0200 |
parents | 1e65d3dd91c8 |
children | 1c5961641514 |
files | mapsearch.c www/search.css www/search.js www/search.php |
diffstat | 4 files changed, 160 insertions(+), 85 deletions(-) [+] |
line wrap: on
line diff
--- a/mapsearch.c Mon Nov 06 20:41:59 2017 +0200 +++ b/mapsearch.c Mon Nov 06 20:47:35 2017 +0200 @@ -1275,8 +1275,6 @@ } // End communication - verr = "END"; - mapLWSWrite(wsi, (unsigned char *) verr, strlen(verr)); lws_close_reason(wsi, LWS_CLOSE_STATUS_NOSTATUS, NULL, 0); } break;
--- a/www/search.css Mon Nov 06 20:41:59 2017 +0200 +++ b/www/search.css Mon Nov 06 20:47:35 2017 +0200 @@ -23,27 +23,23 @@ margin: 0.2em; } -#searchBox, #resultsBox { +#locSearchBox, #mapSearchBox, #resultsBox { background: #454; - display: inline-block; vertical-align: top; + border-radius: 0.3em; + padding: 0.5em; + margin-top: 0.25em; + margin-bottom: 0.25em; +} + +#mapSearchBox, #resultsBox { + display: inline-block; min-width: 35%; - border-radius:0.3em; - padding: 0.5em; - margin: auto; } #resultsBox { } -#logBox { - display: block; - vertical-align: top; - padding: 0.5em; - margin-top: 0.5em; - background: #232; -} - #controls { text-align: right; }
--- a/www/search.js Mon Nov 06 20:41:59 2017 +0200 +++ b/www/search.js Mon Nov 06 20:47:35 2017 +0200 @@ -5,8 +5,8 @@ // var mapServer = "wss://tnsp.org:4200"; -var fieldPattern, fieldRes, fieldLog; -var msgLog, mapWS, mapList = []; +var fieldPattern, fieldRes; +var msgLog, mapWS, tmpWS, locWS, mapList = []; function mapAddEventOb(obname, evobj, evtype, evcallback) @@ -39,34 +39,27 @@ } -function mapLog(msg) +function mapResult(msg) { - if (msgLog.length >= 10) - msgLog = msgLog.slice(1, 10); - - msgLog.push(msg); - - if (fieldLog) - { - fieldLog.innerHTML = msgLog.join("<br>"); - } + if (fieldRes) + fieldRes.innerHTML = msg; } -function mapPerformSearch() +function mapDoMapSearch() { // Check the search pattern for some sanity before // submitting to the server .. though we do checks there also. var tmp = fieldPattern.value.trim(); if (tmp == "") { - mapLog("Nothing to search for."); + mapResult("Nothing to search for."); return; } if (tmp.length > 25*25) { - mapLog("Search pattern too large!"); + mapResult("Search pattern too large!"); return; } @@ -82,31 +75,27 @@ if (searchList.length == 0 && mapList.length > 0) { - mapLog("No maps selected!"); + mapResult("No maps selected!"); return; } // Are we running an old query? if (mapWS) { - mapLog("Old query not finished."); + mapResult("Old query not finished."); return; } // Open a WebSocket connection .. mapWS = new WebSocket(mapServer); if (!mapWS) - { - mapLog("Could not create WebSocket connection?"); return; - } - btnSearch.disabled = true; + btnMapSearch.disabled = true; mapWS.onopen = function() { // Web Socket is connected, send data using send() - mapLog("Sending query to server."); mapWS.send("MAPSEARCH:"+ -1 +":"+ searchList.join(":") +"\n" + fieldPattern.value); }; @@ -115,16 +104,13 @@ { if (evt.data.substr(0, 6) == "ERROR:") { - var str = "ERROR! "+ evt.data.substr(6); - mapLog(str); - fieldRes.innerHTML = str; + mapResult("ERROR! "+ evt.data.substr(6)); } else if (evt.data.substr(0, 7) == "RESULT:" && evt.data.length >= 9) { var results = JSON.parse(evt.data.substr(7)); var str = ""; - mapLog("Receiving results."); if (results) { @@ -150,32 +136,19 @@ fieldRes.innerHTML = str; } - else - if (evt.data.substr(0, 9) == "PROGRESS:") - { - mapLog("Search progress "+ evt.data.substr(9) +"% .."); - } - else - if (evt.data == "END") - { - mapLog("Server ending communication."); - mapWS.close(); - } - else - { - mapLog("Sir! A message for you! "+ evt.data); - } + + mapWS.close(); }; mapWS.onclose = function() { mapWS = null; - btnSearch.disabled = false; + btnMapSearch.disabled = false; }; mapWS.onerror = function() { - mapLog("WebSocket error occured."); + mapResult("WebSocket error occured."); }; } @@ -198,13 +171,12 @@ { if (evt.data.substr(0, 6) == "ERROR:") { - mapLog("ERROR! "+ evt.data.substr(6)); + mapResult("ERROR! "+ evt.data.substr(6)); } else if (evt.data.substr(0, 5) == "MAPS:" && evt.data.length > 8) { var results = JSON.parse(evt.data.substr(5)); - mapLog("Receiving map information."); if (results && Array.isArray(results)) { mapList = results; @@ -224,47 +196,135 @@ else fieldRes.innerHTML = "ERROR!"; } - else - if (evt.data == "END") - { - tmpWS.close(); - } - else - { - mapLog("Sir! A message for you! "+ evt.data); - } - }; - tmpWS.onclose = function() - { - tmpWS = null; + tmpWS.close(); }; tmpWS.onerror = function() { - mapLog("WebSocket error occured."); + mapResult("WebSocket error occured."); }; } -function mapInitSearch() +function locResult(msg) +{ + mapResult(msg); +} + + +function mapDoLocSearch() { - msgLog = []; + locPID = -1; + + // Check the search pattern for some sanity before + // submitting to the server .. though we do checks there also. + var tmp = fieldLocPattern.value.trim(); + if (tmp == "") + { + locResult("Nothing to search for."); + return; + } + + if (tmp.length > 25) + { + locResult("Search pattern too large!"); + return; + } + + // Are we running an old query? + if (locWS) + return; + + // Open a WebSocket connection .. + locWS = new WebSocket(mapServer); + if (!locWS) + { + locResult("Could not create WebSocket connection?"); + return; + } + + locWS.onopen = function() + { + // Web Socket is connected, send data using send() + locWS.send("LOCSEARCH:"+ tmp); + }; + + // Register events + locWS.onmessage = function(evt) + { + if (evt.data.substr(0, 6) == "ERROR:") + { + locResult("ERROR! "+ evt.data.substr(6)); + } + else + if (evt.data.substr(0, 7) == "RESULT:" && evt.data.length >= 9) + { + var results = JSON.parse(evt.data.substr(7)); + var str = ""; + + if (results && Array.isArray(results)) + { + for (var i = 0; i < results.length; i++) + { + var res = results[i]; + if (!Array.isArray(res) || res.length != 9) + { + str = "ERROR: Invalid data."+res.length; + break; + } + + str += "<div class=\"result\">"+ + "<a target=\"_blank\" href=\""+ res[2] +".html#loc"+ res[3] +"_"+ res[4] +"\">"+ + res[7] +"</a>"; + if (res[7] != res[8]) + str += " ["+ res[8] +"]"; + str += " at "+ res[3] +", "+ res[4] +" on "+ mapCapitalize(res[2]) + + " <a class=\"glob\" target=\"_blank\" href=\"http://jeskko.pupunen.net/gmap2/?x="+ + res[5] +"&y="+ res[6] +"&zoom=10\">["+ res[5] +", "+ res[6] +"]</a>"+ + "</div>"; + } + + if (str.length == 0) + str = "No matches found."; + } + else + str = "ERROR: Could not parse result dataset." + + fieldRes.innerHTML = str; + } + + locWS.close(); + }; + + locWS.onclose = function() + { + locWS = null; + }; + + locWS.onerror = function() + { + locResult("WebSocket error occured."); + }; +} + + +function mapInitMapSearch() +{ mapGetData(); - fieldPattern = document.getElementById("pattern"); + fieldPattern = document.getElementById("mapPattern"); fieldRes = document.getElementById("results"); - fieldLog = document.getElementById("log"); - btnSearch = document.getElementById("btnSearch"); + btnMapSearch = document.getElementById("btnMapSearch"); - mapAddEventOb("btnSearch", btnSearch, "click", mapPerformSearch); + mapAddEventOb("btnMapSearch", btnMapSearch, "click", mapDoMapSearch); mapAddEvent("btnClear", "click", function () { - mapLog("Cleared search pattern and results."); fieldRes.innerHTML = ""; fieldPattern.value = ""; + mapResult("Cleared search pattern and results."); }); mapAddEvent("btnMaps", "click", @@ -295,4 +355,18 @@ elem.checked = same; } }); + + fieldLocPattern = document.getElementById("locPattern"); + if (fieldLocPattern) + { + locPID = -1; + mapAddEventOb("locPattern", fieldLocPattern, "input", + function () + { + if (locPID != -1) + clearTimeout(locPID); + + locPID = setTimeout(mapDoLocSearch, 500); + }); + } }
--- a/www/search.php Mon Nov 06 20:41:59 2017 +0200 +++ b/www/search.php Mon Nov 06 20:47:35 2017 +0200 @@ -17,14 +17,21 @@ </div> </noscript> -<div id="searchBox"> - <h2>Search pattern</h2> - <textarea id="pattern" cols="30" rows="15"></textarea> +<div id="locSearchBox"> + <h2>Location name search</h2> + <input type="text" id="locPattern" autocomplete="off" maxlength="30" size="30"> +</div> +<!-- +--> + +<div id="mapSearchBox"> + <h2>Map search pattern</h2> + <textarea id="mapPattern" cols="30" rows="15"></textarea> <div id="controls"> <div id="mapList">LOADING MAP LIST...</div> <button id="btnMaps" type="button">C^</button> <button class="large" id="btnClear" type="button">Clear search</button> - <button class="large" id="btnSearch" type="button">Search</button> + <button class="large" id="btnMapSearch" type="button">Search</button> </div> </div>