Moving javascript into a separate container.
[pazpar2-moved-to-github.git] / www / test1 / search.js
1 /* $Id: search.js,v 1.1 2006-12-29 10:22:09 sondberg Exp $
2  * ---------------------------------------------------
3  * Javascript container
4  */
5
6 var xmlHttp
7 var xinitSession;
8 var xloadTargets;
9 var xsearch;
10 var xshow;
11 var xstat;
12 var xtermlist;
13 var session = false;
14 var targetsloaded = false;
15 var shown;
16 var searchtimer;
17 var showtimer;
18 var termtimer;
19 var stattimer;
20 var startrec;
21 var session_cells = Array('query');
22 var old_session = session_read();
23
24 function GetXmlHttpObject()
25
26     var objXMLHttp=null
27     if (window.XMLHttpRequest)
28       {
29       objXMLHttp=new XMLHttpRequest()
30       }
31     else if (window.ActiveXObject)
32       {
33       objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP")
34       }
35     return objXMLHttp
36
37
38 function session_started()
39 {
40     if (xinitSession.readyState != 4)
41         return;
42     var xml = xinitSession.responseXML;
43     var sesid = xml.getElementsByTagName("session")[0].childNodes[0].nodeValue;
44     document.getElementById("status").innerHTML = "Live";
45     session = sesid;
46 }
47
48 function start_session()
49 {
50     xinitSession = GetXmlHttpObject();
51     var url="search.pz2?";
52     url += "command=init";
53     xinitSession.onreadystatechange=session_started;
54     xinitSession.open("GET", url);
55     xinitSession.send(null);
56 }
57
58 function targets_loaded()
59 {
60     if (xloadTargets.readyState != 4)
61         return;
62     var xml = xloadTargets.responseXML;
63     var error = xml.getElementsByTagName("error");
64     if (error[0])
65     {
66         var msg = error[0].childNodes[0].nodeValue;
67         alert(msg);
68         return;
69     }
70     document.getElementById("targetstatus").innerHTML = "Targets loaded";
71 }
72
73 function load_targets()
74 {
75     var fn = document.getElementById("targetfilename").value;
76     clearTimeout(termtimer);
77     clearTimeout(searchtimer);
78     clearTimeout(stattimer);
79     clearTimeout(showtimer);
80     document.getElementById("stat").innerHTML = "";
81     if (!fn)
82     {
83         alert("Please enter a target definition file name");
84         return;
85     }
86     var url="search.pz2?" +
87         "command=load" +
88         "&session=" + session +
89         "&name=" + fn;
90     document.getElementById("targetstatus").innerHTML = "Loading targets...";
91     xloadTargets = GetXmlHttpObject();
92     xloadTargets.onreadystatechange=targets_loaded;
93     xloadTargets.open("GET", url);
94     xloadTargets.send(null);
95 }
96
97 function show_records()
98 {
99     if (xshow.readyState != 4)
100         return;
101     var i;
102     var xml = xshow.responseXML;
103     var body = document.getElementById("body");
104     var hits = xml.getElementsByTagName("hit");
105     if (!hits[0]) // We should never get here with blocking operations
106     {
107         body.innerHTML = "No records yet";
108         searchtimer = setTimeout(check_search, 250);
109     }
110     else
111     {
112
113         var total = Number(xml.getElementsByTagName('total')[0].childNodes[0].nodeValue);
114         var merged = Number(xml.getElementsByTagName('merged')[0].childNodes[0].nodeValue);
115         var start = Number(xml.getElementsByTagName('start')[0].childNodes[0].nodeValue);
116         var num = Number(xml.getElementsByTagName('num')[0].childNodes[0].nodeValue);
117         body.innerHTML = '<b>Records : ';
118         body.innerHTML += (start + 1) + ' to ' + (start + num) +
119                 ' of ' + merged + ' (total hits: ' + total + ')</b>';
120
121         if (start + num < merged)
122             body.innerHTML += ' <a href="" ' +
123                 'onclick="startrec=' + (start + 20) +
124                 ';check_search(); return false;">Next</a>';
125
126         if (start > 0)
127             body.innerHTML += ' <a href="" ' +
128                 'onclick="startrec=' + (start - 20) +
129                 ';check_search(); return false;">Previous</a>';
130
131         body.innerHTML += '<br/>';
132         for (i = 0; i < hits.length; i++)
133         {
134             body.innerHTML += '<p>';
135             body.innerHTML += (i + start + 1) + ': ';
136             var mk = hits[i].getElementsByTagName("title");
137             if (mk[0])
138                 body.innerHTML += mk[0].childNodes[0].nodeValue;
139             body.innerHTML += '</p>';
140         }
141         shown++;
142         if (shown < 5)
143             searchtimer = setTimeout(check_search, 1000);
144         else
145             searchtimer = setTimeout(check_search, 2000);
146     }
147     if (!termtimer)
148         termtimer = setTimeout(check_termlist, 1000);
149 }
150
151 function check_search()
152 {
153     clearTimeout(searchtimer);
154     var url = "search.pz2?" +
155         "command=show" +
156         "&start=" + startrec +
157         "&num=15" +
158         "&session=" + session +
159         "&block=1";
160     xshow = GetXmlHttpObject();
161     xshow.onreadystatechange=show_records;
162     xshow.open("GET", url);
163     xshow.send(null);
164 }
165
166
167 function refine_query (obj) {
168     var query_cell = document.getElementById('query');
169     var subject = obj.innerHTML;
170     
171     subject = subject.replace(/[\(\)]/g, '');
172     query_cell.value += ' and su=(' + subject + ')';
173     start_search();
174 }
175
176 function show_termlist()
177 {
178     if (xtermlist.readyState != 4)
179         return;
180
181     var i;
182     var xml = xtermlist.responseXML;
183     var body = document.getElementById("termlist");
184     var hits = xml.getElementsByTagName("term");
185     if (!hits[0])
186     {
187         termtimer = setTimeout(check_termlist, 1000);
188         
189     }
190     else
191     {
192         body.innerHTML = "<b>Limit results:</b><br>";
193         for (i = 0; i < hits.length; i++)
194         {
195             var namen = hits[i].getElementsByTagName("name");
196             if (namen[0])
197                 body.innerHTML += '<a href="#" onclick="refine_query(this)">' +
198                                   namen[0].childNodes[0].nodeValue +
199                                   '</a>';
200             /*
201             body.innerHTML += ' (';
202             var freqn = hits[i].getElementsByTagName("frequency");
203             if (freqn[0])
204                 body.innerHTML += freqn[0].childNodes[0].nodeValue;
205             body.innerHTML += ')<br>';
206             */
207             body.innerHTML += '<br>';
208         }
209         termtimer = setTimeout(check_termlist, 2000);
210     }
211 }
212
213
214 function check_termlist()
215 {
216     var url = "search.pz2?" +
217         "command=termlist" +
218         "&session=" + session;
219     xtermlist = GetXmlHttpObject();
220     xtermlist.onreadystatechange=show_termlist;
221     xtermlist.open("GET", url);
222     xtermlist.send(null);
223 }
224
225 function show_stat()
226 {
227     if (xstat.readyState != 4)
228         return;
229     var i;
230     var xml = xstat.responseXML;
231     var body = document.getElementById("stat");
232     var nodes = xml.childNodes[0].childNodes;
233     if (!nodes[0])
234     {
235         stattimer  = setTimeout(check_stat, 500);
236     }
237     else
238     {
239         body.innerHTML = "(";
240         for (i = 0; i < nodes.length; i++)
241         {
242             if (nodes[i].nodeType != 1)
243                 continue;
244             var value = nodes[i].childNodes[0].nodeValue;
245             if (value == 0)
246                 continue;
247             var name = nodes[i].nodeName;
248             body.innerHTML += ' ' + name + '=' + value;
249         }
250         body.innerHTML += ')';
251         stattimer = setTimeout(check_stat, 2000);
252     }
253 }
254
255 function check_stat()
256 {
257     var url = "search.pz2?" +
258         "command=stat" +
259         "&session=" + session;
260     xstat = GetXmlHttpObject();
261     xstat.onreadystatechange=show_stat;
262     xstat.open("GET", url);
263     xstat.send(null);
264 }
265
266 function search_started()
267 {
268     if (xsearch.readyState != 4)
269         return;
270     var xml = xsearch.responseXML;
271     var error = xml.getElementsByTagName("error");
272     if (error[0])
273     {
274         var msg = error[0].childNodes[0].nodeValue;
275         alert(msg);
276         return;
277     }
278     check_search();
279     stattimer = setTimeout(check_stat, 1000);
280 }
281
282 function start_search()
283 {
284     clearTimeout(termtimer);
285     termtimer = 0;
286     clearTimeout(searchtimer);
287     searchtimer = 0;
288     clearTimeout(stattimer);
289     stattimer = 0;
290     clearTimeout(showtimer);
291     showtimer = 0;
292     if (!targets_loaded)
293     {
294         alert("Please load targets first");
295         return;
296     }
297     var query = escape(document.getElementById('query').value);
298     var url = "search.pz2?" +
299         "command=search" +
300         "&session=" + session +
301         "&query=" + query;
302     xsearch = GetXmlHttpObject();
303     xsearch.onreadystatechange=search_started;
304     xsearch.open("GET", url);
305     xsearch.send(null);
306     document.getElementById("termlist").innerHTML = '';
307     document.getElementById("body").innerHTML = '';
308     update_history();
309     shown = 0;
310     startrec = 0;
311 }
312
313
314 function session_encode ()
315 {
316     var i;
317     var session = '';
318
319     for (i = 0; i < session_cells.length; i++)
320     {
321         var name = session_cells[i];
322         var value = escape(document.getElementById(name).value);
323         session += '&' + name + '=' + value;
324     }
325
326     return session;
327 }
328
329
330 function session_restore (session)
331 {
332     var fields = session.split(/&/);
333     var i;
334
335     for (i = 1; i < fields.length; i++)
336     {
337         var pair = fields[i].split(/=/);
338         var key = pair.shift();
339         var value = pair.join('=');
340         var cell = document.getElementById(key);
341
342         cell.value = value;
343     }
344     
345 }
346
347
348 function session_read ()
349 {
350     var ses = window.location.hash.replace(/^#/, '');
351     return ses;
352 }
353
354
355 function session_store (new_value)
356 {
357     window.location.hash = '#' + new_value;
358 }
359
360
361 function update_history ()
362 {
363     var session = session_encode();
364     session_store(session);
365     old_session = session;
366 }
367
368
369 function session_check ()
370 {
371     var session = session_read();
372
373     clearInterval(url_surveillence);
374
375     if ( session != unescape(old_session) )
376     {
377         session_restore(session);
378         start_search();
379         
380     }
381     
382     url_surveillence = setInterval(session_check, 200);
383 }
384         
385
386 var url_surveillence = setInterval(session_check, 200);
387