1d4afb5ceSopenharmony_ci/* lws-fts.js - JS supporting lws fulltext search 2d4afb5ceSopenharmony_ci * 3d4afb5ceSopenharmony_ci * Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com> 4d4afb5ceSopenharmony_ci * 5d4afb5ceSopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a copy 6d4afb5ceSopenharmony_ci * of this software and associated documentation files (the "Software"), to 7d4afb5ceSopenharmony_ci * deal in the Software without restriction, including without limitation the 8d4afb5ceSopenharmony_ci * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 9d4afb5ceSopenharmony_ci * sell copies of the Software, and to permit persons to whom the Software is 10d4afb5ceSopenharmony_ci * furnished to do so, subject to the following conditions: 11d4afb5ceSopenharmony_ci * 12d4afb5ceSopenharmony_ci * The above copyright notice and this permission notice shall be included in 13d4afb5ceSopenharmony_ci * all copies or substantial portions of the Software. 14d4afb5ceSopenharmony_ci * 15d4afb5ceSopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16d4afb5ceSopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17d4afb5ceSopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18d4afb5ceSopenharmony_ci * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19d4afb5ceSopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20d4afb5ceSopenharmony_ci * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21d4afb5ceSopenharmony_ci * IN THE SOFTWARE. 22d4afb5ceSopenharmony_ci */ 23d4afb5ceSopenharmony_ci 24d4afb5ceSopenharmony_ci 25d4afb5ceSopenharmony_ci(function() { 26d4afb5ceSopenharmony_ci 27d4afb5ceSopenharmony_ci var last_ac = ""; 28d4afb5ceSopenharmony_ci 29d4afb5ceSopenharmony_ci function san(s) 30d4afb5ceSopenharmony_ci { 31d4afb5ceSopenharmony_ci s.replace(/</g, "!"); 32d4afb5ceSopenharmony_ci s.replace(/%/g, "!"); 33d4afb5ceSopenharmony_ci 34d4afb5ceSopenharmony_ci return s; 35d4afb5ceSopenharmony_ci } 36d4afb5ceSopenharmony_ci 37d4afb5ceSopenharmony_ci function lws_fts_choose() 38d4afb5ceSopenharmony_ci { 39d4afb5ceSopenharmony_ci var xhr = new XMLHttpRequest(); 40d4afb5ceSopenharmony_ci var sr = document.getElementById("searchresults"); 41d4afb5ceSopenharmony_ci var ac = document.getElementById("acomplete"); 42d4afb5ceSopenharmony_ci var inp = document.getElementById("lws_fts"); 43d4afb5ceSopenharmony_ci 44d4afb5ceSopenharmony_ci xhr.onopen = function(e) { 45d4afb5ceSopenharmony_ci xhr.setRequestHeader("cache-control", "max-age=0"); 46d4afb5ceSopenharmony_ci }; 47d4afb5ceSopenharmony_ci 48d4afb5ceSopenharmony_ci xhr.onload = function(e) { 49d4afb5ceSopenharmony_ci var jj, n, m, s = "", lic = 0; 50d4afb5ceSopenharmony_ci var sr = document.getElementById("searchresults"); 51d4afb5ceSopenharmony_ci var inp = document.getElementById("lws_fts"); 52d4afb5ceSopenharmony_ci sr.style.width = (parseInt(sr.parentNode.offsetWidth, 10) - 88) + "px"; 53d4afb5ceSopenharmony_ci sr.style.opacity = "1"; 54d4afb5ceSopenharmony_ci inp.blur(); 55d4afb5ceSopenharmony_ci 56d4afb5ceSopenharmony_ci // console.log(xhr.responseText); 57d4afb5ceSopenharmony_ci jj = JSON.parse(xhr.responseText); 58d4afb5ceSopenharmony_ci 59d4afb5ceSopenharmony_ci if (jj.fp) { 60d4afb5ceSopenharmony_ci lic = jj.fp.length; 61d4afb5ceSopenharmony_ci for (n = 0; n < lic; n++) { 62d4afb5ceSopenharmony_ci 63d4afb5ceSopenharmony_ci s += "<div class='filepath'>" + jj.fp[n].path + "</div>"; 64d4afb5ceSopenharmony_ci 65d4afb5ceSopenharmony_ci s += "<table>"; 66d4afb5ceSopenharmony_ci for (m = 0; m < jj.fp[n].hits.length; m++) 67d4afb5ceSopenharmony_ci s += "<tr><td class='r'>" + jj.fp[n].hits[m].l + 68d4afb5ceSopenharmony_ci "</td><td>" + jj.fp[n].hits[m].s + 69d4afb5ceSopenharmony_ci "</td></tr>"; 70d4afb5ceSopenharmony_ci 71d4afb5ceSopenharmony_ci s += "</table>"; 72d4afb5ceSopenharmony_ci 73d4afb5ceSopenharmony_ci } 74d4afb5ceSopenharmony_ci } 75d4afb5ceSopenharmony_ci 76d4afb5ceSopenharmony_ci sr.innerHTML = s; 77d4afb5ceSopenharmony_ci }; 78d4afb5ceSopenharmony_ci 79d4afb5ceSopenharmony_ci inp.blur(); 80d4afb5ceSopenharmony_ci ac.style.opacity = "0"; 81d4afb5ceSopenharmony_ci sr.style.innerHTML = ""; 82d4afb5ceSopenharmony_ci xhr.open("GET", "../fts/r/" + document.getElementById("lws_fts").value); 83d4afb5ceSopenharmony_ci xhr.send(); 84d4afb5ceSopenharmony_ci } 85d4afb5ceSopenharmony_ci 86d4afb5ceSopenharmony_ci function lws_fts_ac_select(e) 87d4afb5ceSopenharmony_ci { 88d4afb5ceSopenharmony_ci var t = e.target; 89d4afb5ceSopenharmony_ci 90d4afb5ceSopenharmony_ci while (t) { 91d4afb5ceSopenharmony_ci if (t.getAttribute && t.getAttribute("string")) { 92d4afb5ceSopenharmony_ci document.getElementById("lws_fts").value = 93d4afb5ceSopenharmony_ci t.getAttribute("string"); 94d4afb5ceSopenharmony_ci 95d4afb5ceSopenharmony_ci lws_fts_choose(); 96d4afb5ceSopenharmony_ci } 97d4afb5ceSopenharmony_ci 98d4afb5ceSopenharmony_ci t = t.parentNode; 99d4afb5ceSopenharmony_ci } 100d4afb5ceSopenharmony_ci } 101d4afb5ceSopenharmony_ci 102d4afb5ceSopenharmony_ci function lws_fts_search_input() 103d4afb5ceSopenharmony_ci { 104d4afb5ceSopenharmony_ci var ac = document.getElementById("acomplete"), 105d4afb5ceSopenharmony_ci sb = document.getElementById("lws_fts"); 106d4afb5ceSopenharmony_ci 107d4afb5ceSopenharmony_ci if (last_ac === sb.value) 108d4afb5ceSopenharmony_ci return; 109d4afb5ceSopenharmony_ci 110d4afb5ceSopenharmony_ci last_ac = sb.value; 111d4afb5ceSopenharmony_ci 112d4afb5ceSopenharmony_ci ac.style.width = (parseInt(sb.offsetWidth, 10) - 2) + "px"; 113d4afb5ceSopenharmony_ci ac.style.opacity = "1"; 114d4afb5ceSopenharmony_ci 115d4afb5ceSopenharmony_ci /* detect loss of focus for popup menu */ 116d4afb5ceSopenharmony_ci sb.addEventListener("focusout", function(e) { 117d4afb5ceSopenharmony_ci ac.style.opacity = "0"; 118d4afb5ceSopenharmony_ci }); 119d4afb5ceSopenharmony_ci 120d4afb5ceSopenharmony_ci 121d4afb5ceSopenharmony_ci var xhr = new XMLHttpRequest(); 122d4afb5ceSopenharmony_ci 123d4afb5ceSopenharmony_ci xhr.onopen = function(e) { 124d4afb5ceSopenharmony_ci xhr.setRequestHeader("cache-control", "max-age=0"); 125d4afb5ceSopenharmony_ci }; 126d4afb5ceSopenharmony_ci xhr.onload = function(e) { 127d4afb5ceSopenharmony_ci var jj, n, s = "", lic = 0; 128d4afb5ceSopenharmony_ci var inp = document.getElementById("lws_fts"); 129d4afb5ceSopenharmony_ci var ac = document.getElementById("acomplete"); 130d4afb5ceSopenharmony_ci 131d4afb5ceSopenharmony_ci // console.log(xhr.responseText); 132d4afb5ceSopenharmony_ci jj = JSON.parse(xhr.responseText); 133d4afb5ceSopenharmony_ci 134d4afb5ceSopenharmony_ci switch(parseInt(jj.indexed, 10)) { 135d4afb5ceSopenharmony_ci case 0: /* there is no index */ 136d4afb5ceSopenharmony_ci break; 137d4afb5ceSopenharmony_ci 138d4afb5ceSopenharmony_ci case 1: /* yay there is an index */ 139d4afb5ceSopenharmony_ci 140d4afb5ceSopenharmony_ci if (jj.ac) { 141d4afb5ceSopenharmony_ci lic = jj.ac.length; 142d4afb5ceSopenharmony_ci s += "<ul id='menu-ul'>"; 143d4afb5ceSopenharmony_ci for (n = 0; n < lic; n++) { 144d4afb5ceSopenharmony_ci 145d4afb5ceSopenharmony_ci if (jj.ac[n] && parseInt(jj.ac[n].matches, 10)) 146d4afb5ceSopenharmony_ci s += "<li id='mi_ac" + n + "' string='" + 147d4afb5ceSopenharmony_ci san(jj.ac[n].ac) + 148d4afb5ceSopenharmony_ci "'><table><tr><td>" + san(jj.ac[n].ac) + 149d4afb5ceSopenharmony_ci "</td><td class='r'>" + 150d4afb5ceSopenharmony_ci parseInt(jj.ac[n].matches, 10) + 151d4afb5ceSopenharmony_ci "</td></tr></table></li>"; 152d4afb5ceSopenharmony_ci } 153d4afb5ceSopenharmony_ci 154d4afb5ceSopenharmony_ci s += "</ul>"; 155d4afb5ceSopenharmony_ci 156d4afb5ceSopenharmony_ci if (!lic) { 157d4afb5ceSopenharmony_ci //s = "<img class='noentry'>"; 158d4afb5ceSopenharmony_ci inp.className = "nonviable"; 159d4afb5ceSopenharmony_ci ac.style.opacity = "0"; 160d4afb5ceSopenharmony_ci } else { 161d4afb5ceSopenharmony_ci inp.className = "viable"; 162d4afb5ceSopenharmony_ci ac.style.opacity = "1"; 163d4afb5ceSopenharmony_ci } 164d4afb5ceSopenharmony_ci } 165d4afb5ceSopenharmony_ci 166d4afb5ceSopenharmony_ci break; 167d4afb5ceSopenharmony_ci 168d4afb5ceSopenharmony_ci default: 169d4afb5ceSopenharmony_ci 170d4afb5ceSopenharmony_ci /* an index is being built... */ 171d4afb5ceSopenharmony_ci 172d4afb5ceSopenharmony_ci s = "<table><tr><td><img class='spinner'></td><td>" + 173d4afb5ceSopenharmony_ci "<table><tr><td>Indexing</td></tr><tr><td>" + 174d4afb5ceSopenharmony_ci "<div id='bar1' class='bar1'>" + 175d4afb5ceSopenharmony_ci "<div id='bar2' class='bar2'>" + 176d4afb5ceSopenharmony_ci jj.index_done + " / " + jj.index_files + 177d4afb5ceSopenharmony_ci "</div></div></td></tr></table>" + 178d4afb5ceSopenharmony_ci "</td></tr></table>"; 179d4afb5ceSopenharmony_ci 180d4afb5ceSopenharmony_ci setTimeout(lws_fts_search_input, 300); 181d4afb5ceSopenharmony_ci 182d4afb5ceSopenharmony_ci break; 183d4afb5ceSopenharmony_ci } 184d4afb5ceSopenharmony_ci 185d4afb5ceSopenharmony_ci ac.innerHTML = s; 186d4afb5ceSopenharmony_ci 187d4afb5ceSopenharmony_ci for (n = 0; n < lic; n++) 188d4afb5ceSopenharmony_ci if (document.getElementById("mi_ac" + n)) 189d4afb5ceSopenharmony_ci document.getElementById("mi_ac" + n). 190d4afb5ceSopenharmony_ci addEventListener("click", lws_fts_ac_select); 191d4afb5ceSopenharmony_ci if (jj.index_files) { 192d4afb5ceSopenharmony_ci document.getElementById("bar2").style.width = 193d4afb5ceSopenharmony_ci ((150 * jj.index_done) / (jj.index_files + 1)) + "px"; 194d4afb5ceSopenharmony_ci } 195d4afb5ceSopenharmony_ci }; 196d4afb5ceSopenharmony_ci 197d4afb5ceSopenharmony_ci xhr.open("GET", "../fts/a/" + document.getElementById("lws_fts").value); 198d4afb5ceSopenharmony_ci xhr.send(); 199d4afb5ceSopenharmony_ci } 200d4afb5ceSopenharmony_ci 201d4afb5ceSopenharmony_ci document.addEventListener("DOMContentLoaded", function() { 202d4afb5ceSopenharmony_ci var inp = document.getElementById("lws_fts"); 203d4afb5ceSopenharmony_ci 204d4afb5ceSopenharmony_ci inp.addEventListener("input", lws_fts_search_input, false); 205d4afb5ceSopenharmony_ci 206d4afb5ceSopenharmony_ci inp.addEventListener("keydown", 207d4afb5ceSopenharmony_ci function(e) { 208d4afb5ceSopenharmony_ci var inp = document.getElementById("lws_fts"); 209d4afb5ceSopenharmony_ci var sr = document.getElementById("searchresults"); 210d4afb5ceSopenharmony_ci var ac = document.getElementById("acomplete"); 211d4afb5ceSopenharmony_ci if (e.key === "Enter" && inp.className === "viable") { 212d4afb5ceSopenharmony_ci lws_fts_choose(); 213d4afb5ceSopenharmony_ci sr.focus(); 214d4afb5ceSopenharmony_ci ac.style.opacity = "0"; 215d4afb5ceSopenharmony_ci } 216d4afb5ceSopenharmony_ci }, false); 217d4afb5ceSopenharmony_ci 218d4afb5ceSopenharmony_ci }, false); 219d4afb5ceSopenharmony_ci 220d4afb5ceSopenharmony_ci}()); 221