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>