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 + "&nbsp;/&nbsp;" + 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