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