1 /* $Id: search.js,v 1.9 2007-01-10 08:14:11 sondberg Exp $
2 * ---------------------------------------------------
14 var targetsloaded = false;
20 var session_cells = Array('query', 'startrec', 'action_type');
21 var old_session = session_read();
24 var page_window = 5; // Number of pages prior to and after the current page
28 function initialize ()
30 facet_list = get_available_facets();
36 function GetXmlHttpObject()
39 if (window.XMLHttpRequest)
41 objXMLHttp=new XMLHttpRequest()
43 else if (window.ActiveXObject)
45 objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP")
50 function SendXmlHttpObject(obj, url, handler)
52 obj.onreadystatechange=handler;
57 function session_started()
59 if (xinitSession.readyState != 4)
61 var xml = xinitSession.responseXML;
62 var sesid = xml.getElementsByTagName("session")[0].childNodes[0].nodeValue;
63 document.getElementById("status").innerHTML = "Live";
65 setTimeout(ping_session, 50000);
68 function start_session()
70 xinitSession = GetXmlHttpObject();
71 var url="search.pz2?";
72 url += "command=init";
73 xinitSession.onreadystatechange=session_started;
74 xinitSession.open("GET", url);
75 xinitSession.send(null);
77 //url_surveillence = setInterval(session_check, 200);
80 function ping_session()
84 var url = "search.pz2?command=ping&session=" + session;
85 SendXmlHttpObject(xpingSession = GetXmlHttpObject(), url, session_pinged);
88 function session_pinged()
90 if (xpingSession.readyState != 4)
92 var xml = xpingSession.responseXML;
93 var error = xml.getElementsByTagName("error");
96 var msg = error[0].childNodes[0].nodeValue;
101 setTimeout(ping_session, 50000);
104 function targets_loaded()
106 if (xloadTargets.readyState != 4)
108 var xml = xloadTargets.responseXML;
109 var error = xml.getElementsByTagName("error");
112 var msg = error[0].childNodes[0].nodeValue;
116 document.getElementById("targetstatus").innerHTML = "Targets loaded";
119 function load_targets()
121 var fn = document.getElementById("targetfilename").value;
122 clearTimeout(termtimer);
123 clearTimeout(searchtimer);
124 clearTimeout(stattimer);
125 clearTimeout(showtimer);
126 document.getElementById("stat").innerHTML = "";
129 alert("Please enter a target definition file name");
132 var url="search.pz2?" +
134 "&session=" + session +
136 document.getElementById("targetstatus").innerHTML = "Loading targets...";
137 xloadTargets = GetXmlHttpObject();
138 xloadTargets.onreadystatechange=targets_loaded;
139 xloadTargets.open("GET", url);
140 xloadTargets.send(null);
144 function update_action (new_action) {
145 document.search.action_type.value = new_action;
149 function make_pager (hits, offset, max) {
153 for (off = offset - page_window * max;
154 off < hits && off < (offset + page_window * max);
162 var p = off / max + 1;
164 if ((offset >= off) && (offset < (off + max)))
165 class = ' class="select"';
167 html += '<a href="#" ' + class +
168 'onclick="update_offset(' + off + ')">' + p + '</a>\n';
175 function update_offset (offset) {
176 document.search.startrec.value = offset;
177 update_action('page');
184 function show_records()
186 if (xshow.readyState != 4)
189 var xml = xshow.responseXML;
190 var body = document.getElementById("body");
191 var hits = xml.getElementsByTagName("hit");
192 if (!hits[0]) // We should never get here with blocking operations
194 body.innerHTML = "No records yet";
195 searchtimer = setTimeout(check_search, 250);
200 var total = Number(xml.getElementsByTagName('total')[0].childNodes[0].nodeValue);
201 var merged = Number(xml.getElementsByTagName('merged')[0].childNodes[0].nodeValue);
202 var start = Number(xml.getElementsByTagName('start')[0].childNodes[0].nodeValue);
203 var num = Number(xml.getElementsByTagName('num')[0].childNodes[0].nodeValue);
204 var clients = Number(xml.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue);
205 body.innerHTML = '<div class="pages">' +
206 make_pager(merged, start, recstoshow) +
209 body.innerHTML += '<div class="results">Records : ' + (start + 1) +
210 ' to ' + (start + num) + ' of ' + merged +
211 ' (total hits: ' + total + ')</div><br/><br/>';
214 if (start + num < merged)
215 body.innerHTML += ' <a href="" ' +
216 'onclick="document.search.startrec.value=' + (start + recstoshow) +
217 ";update_action('page')" +
218 ';check_search(); update_history(); return false;">Next</a>';
221 body.innerHTML += ' <a href="" ' +
222 'onclick="document.search.startrec.value=' + (start - recstoshow) +
223 ";update_action('page')" +
224 ';check_search(); update_history();return false;">Previous</a>';
226 body.innerHTML += '<br/>';
228 body.innerHTML += '<div class="records">';
230 for (i = 0; i < hits.length; i++)
232 var mk = hits[i].getElementsByTagName("md-title");
233 var html = '<a href="#" class="record">';
237 field = mk[0].childNodes[0].nodeValue;
240 html += field + '</a>';
241 body.innerHTML += html;
244 body.innerHTML += '</div>';
249 searchtimer = setTimeout(check_search, 1000);
251 searchtimer = setTimeout(check_search, 2000);
255 termtimer = setTimeout(check_termlist, 500);
258 function check_search()
260 clearTimeout(searchtimer);
261 var url = "search.pz2?" +
263 "&start=" + document.search.startrec.value +
264 "&num=" + recstoshow +
265 "&session=" + session +
267 xshow = GetXmlHttpObject();
268 xshow.onreadystatechange=show_records;
269 xshow.open("GET", url);
274 function refine_query (obj) {
275 var query_cell = document.getElementById('query');
276 var term = obj.innerHTML;
278 term = term.replace(/[\(\)]/g, '');
279 if (cur_termlist == 'subject')
280 query_cell.value += ' and su=(' + term + ')';
281 else if (cur_termlist == 'author')
282 query_cell.value += ' and au=(' + term + ')';
288 function show_termlist()
290 if (xtermlist.readyState != 4)
294 var xml = xtermlist.responseXML;
295 var body = facet_list[cur_facet][1];
296 var hits = xml.getElementsByTagName("term");
298 Number(xml.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue);
302 if (cur_facet >= facet_list.length)
307 termtimer = setTimeout(check_termlist, 500);
313 for (i = 0; i < hits.length; i++)
315 var namen = hits[i].getElementsByTagName("name");
317 body.innerHTML += '<a href="#" onclick="refine_query(this)">' +
318 namen[0].childNodes[0].nodeValue +
323 termtimer = setTimeout(check_termlist, 1000);
327 function check_termlist()
329 var facet_name = facet_list[cur_facet][0];
330 var url = "search.pz2?" +
332 "&session=" + session +
333 "&name=" + facet_name;
334 xtermlist = GetXmlHttpObject();
335 xtermlist.onreadystatechange=show_termlist;
336 xtermlist.open("GET", url);
337 xtermlist.send(null);
342 if (xstat.readyState != 4)
345 var xml = xstat.responseXML;
346 var body = document.getElementById("stat");
347 var nodes = xml.childNodes[0].childNodes;
349 Number(xml.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue);
352 stattimer = setTimeout(check_stat, 500);
356 body.innerHTML = "(";
357 for (i = 0; i < nodes.length; i++)
359 if (nodes[i].nodeType != 1)
361 var value = nodes[i].childNodes[0].nodeValue;
364 var name = nodes[i].nodeName;
365 body.innerHTML += ' ' + name + '=' + value;
367 body.innerHTML += ')';
369 stattimer = setTimeout(check_stat, 2000);
373 function check_stat()
375 var url = "search.pz2?" +
377 "&session=" + session;
378 xstat = GetXmlHttpObject();
379 xstat.onreadystatechange=show_stat;
380 xstat.open("GET", url);
384 function search_started()
386 if (xsearch.readyState != 4)
388 var xml = xsearch.responseXML;
389 var error = xml.getElementsByTagName("error");
392 var msg = error[0].childNodes[0].nodeValue;
397 stattimer = setTimeout(check_stat, 1000);
400 function start_search()
402 clearTimeout(termtimer);
404 clearTimeout(searchtimer);
406 clearTimeout(stattimer);
408 clearTimeout(showtimer);
412 alert("Please load targets first");
415 var query = escape(document.getElementById('query').value);
416 var url = "search.pz2?" +
418 "&session=" + session +
420 xsearch = GetXmlHttpObject();
421 xsearch.onreadystatechange=search_started;
422 xsearch.open("GET", url);
424 // document.getElementById("termlist").innerHTML = '';
425 document.getElementById("body").innerHTML = '';
428 document.search.startrec.value = 0;
432 function session_encode ()
437 for (i = 0; i < session_cells.length; i++)
439 var name = session_cells[i];
440 var value = escape(document.getElementById(name).value);
441 session += '&' + name + '=' + value;
448 function session_restore (session)
450 var fields = session.split(/&/);
453 for (i = 1; i < fields.length; i++)
455 var pair = fields[i].split(/=/);
456 var key = pair.shift();
457 var value = pair.join('=');
458 var cell = document.getElementById(key);
466 function session_read ()
468 var ses = window.location.hash.replace(/^#/, '');
473 function session_store (new_value)
475 window.location.hash = '#' + new_value;
479 function update_history ()
481 var session = session_encode();
482 session_store(session);
483 old_session = session;
487 function session_check ()
489 var session = session_read();
490 var action = document.search.action_type.value;
492 clearInterval(url_surveillence);
494 if ( session != unescape(old_session) )
496 session_restore(session);
498 if (action == 'search') {
500 } else if (action == 'page') {
503 alert('Unregocnized action_type: ' + action);
508 url_surveillence = setInterval(session_check, 200);
512 function get_available_facets () {
513 var facet_container = document.getElementById('termlists');
514 var facet_cells = facet_container.childNodes;
515 var facets = Array();
518 for (i = 0; i < facet_cells.length; i++) {
519 var cell = facet_cells.item(i);
521 if (cell.className == 'facet') {
522 var facet_name = cell.id.replace(/^facet_([^_]+)_terms$/, "$1");
523 facets.push(Array(facet_name, cell));
531 function get_facet_container (obj) {
532 return document.getElementById(obj.id + '_terms');
536 function toggle_facet (obj) {
537 var container = get_facet_container(obj);
539 if (obj.className == 'selected') {
540 obj.className = 'unselected';
541 container.style.display = 'inline';
543 obj.className = 'selected';
544 container.style.display = 'none';