1 /* $Id: search.js,v 1.16 2007-01-10 13:28:09 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 assign_text(document.getElementById("status"), '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);
78 function ping_session()
82 var url = "search.pz2?command=ping&session=" + session;
83 SendXmlHttpObject(xpingSession = GetXmlHttpObject(), url, session_pinged);
86 function session_pinged()
88 if (xpingSession.readyState != 4)
90 var xml = xpingSession.responseXML;
91 var error = xml.getElementsByTagName("error");
94 var msg = error[0].childNodes[0].nodeValue;
99 setTimeout(ping_session, 50000);
102 function targets_loaded()
104 if (xloadTargets.readyState != 4)
106 var xml = xloadTargets.responseXML;
107 var error = xml.getElementsByTagName("error");
110 var msg = error[0].childNodes[0].nodeValue;
115 assign_text(document.getElementById("targetstatus"), 'Targets loaded');
118 function load_targets()
120 var fn = document.getElementById("targetfilename").value;
121 clearTimeout(termtimer);
122 clearTimeout(searchtimer);
123 clearTimeout(stattimer);
124 clearTimeout(showtimer);
125 clear_cell(document.getElementById("stat"));
128 alert("Please enter a target definition file name");
131 var url="search.pz2?" +
133 "&session=" + session +
135 assign_text(document.getElementById("targetstatus"), 'Loading targets...');
136 xloadTargets = GetXmlHttpObject();
137 xloadTargets.onreadystatechange=targets_loaded;
138 xloadTargets.open("GET", url);
139 xloadTargets.send(null);
143 function update_action (new_action) {
144 document.search.action_type.value = new_action;
148 function make_pager (hits, offset, max) {
151 var start_offset = offset - page_window * max;
152 var div_elem = document.createElement('div');
154 div_elem.className = 'pages';
156 if (start_offset < 0) {
160 for (off = start_offset;
161 off < hits && off < (start_offset + 2 * page_window * max);
164 var p = off / max + 1;
165 var page_elem = create_element('a', p);
166 var newline_node = document.createTextNode('\n');
168 if ((offset >= off) && (offset < (off + max))) {
169 page_elem.className = 'select';
172 page_elem.setAttribute('href', '#');
173 page_elem.setAttribute('onclick', 'update_offset(' + off + ')');
175 div_elem.appendChild(page_elem);
176 div_elem.appendChild(newline_node);
183 function update_offset (offset) {
184 document.search.startrec.value = offset;
185 update_action('page');
192 function create_element (name, cdata) {
193 var elem_node = document.createElement(name);
194 var text_node = document.createTextNode(cdata);
195 elem_node.appendChild(text_node);
201 function clear_cell (cell) {
202 while (cell.hasChildNodes())
203 cell.removeChild(cell.firstChild);
207 function append_text(cell, text) {
208 text_node = document.createTextNode(text);
209 cell.appendChild(text_node);
213 function assign_text (cell, text) {
215 append_text(cell, text);
219 function show_records()
221 if (xshow.readyState != 4)
224 var xml = xshow.responseXML;
225 var body = document.getElementById("body");
226 var hits = xml.getElementsByTagName("hit");
230 if (!hits[0]) // We should never get here with blocking operations
232 assign_text(body, 'No records yet');
233 searchtimer = setTimeout(check_search, 250);
238 var total = Number(xml.getElementsByTagName('total')[0].childNodes[0].nodeValue);
239 var merged = Number(xml.getElementsByTagName('merged')[0].childNodes[0].nodeValue);
240 var start = Number(xml.getElementsByTagName('start')[0].childNodes[0].nodeValue);
241 var num = Number(xml.getElementsByTagName('num')[0].childNodes[0].nodeValue);
242 var clients = Number(xml.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue);
243 var pager = make_pager(merged, start,recstoshow);
244 var break_node1 = document.createElement('br');
245 var break_node2 = document.createElement('br');
246 var record_container = document.createElement('div');
247 var interval = create_element('div', 'Records : ' + (start + 1) +
248 ' to ' + (start + num) + ' of ' +
249 merged + ' (total hits: ' +
251 interval.className = 'results';
252 record_container.className = 'records';
254 body.appendChild(pager);
255 body.appendChild(interval);
256 body.appendChild(break_node1);
257 body.appendChild(break_node2);
258 body.appendChild(record_container);
260 for (i = 0; i < hits.length; i++)
262 var mk = hits[i].getElementsByTagName("md-title");
266 field = mk[0].childNodes[0].nodeValue;
271 var record_cell = create_element('a', field);
272 record_cell.setAttribute('href', '#');
273 record_cell.className = 'record';
274 record_container.appendChild(record_cell);
281 searchtimer = setTimeout(check_search, 1000);
283 searchtimer = setTimeout(check_search, 2000);
287 termtimer = setTimeout(check_termlist, 500);
290 function check_search()
292 clearTimeout(searchtimer);
293 var url = "search.pz2?" +
295 "&start=" + document.search.startrec.value +
296 "&num=" + recstoshow +
297 "&session=" + session +
299 xshow = GetXmlHttpObject();
300 xshow.onreadystatechange=show_records;
301 xshow.open("GET", url);
306 function refine_query (obj) {
307 var query_cell = document.getElementById('query');
308 var term = obj.innerHTML;
310 term = term.replace(/[\(\)]/g, '');
311 if (cur_termlist == 'subject')
312 query_cell.value += ' and su=(' + term + ')';
313 else if (cur_termlist == 'author')
314 query_cell.value += ' and au=(' + term + ')';
320 function show_termlist()
322 if (xtermlist.readyState != 4)
326 var xml = xtermlist.responseXML;
327 var body = facet_list[cur_facet][1];
328 var hits = xml.getElementsByTagName("term");
330 Number(xml.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue);
334 if (cur_facet >= facet_list.length)
339 termtimer = setTimeout(check_termlist, 500);
345 for (i = 0; i < hits.length; i++)
347 var namen = hits[i].getElementsByTagName("name");
349 var refine_cell = create_element('a',
350 namen[0].childNodes[0].nodeValue);
351 refine_cell.setAttribute('href', '#');
352 refine_cell.setAttribute('onclick', 'refine_query(this)');
353 body.appendChild(refine_cell);
357 termtimer = setTimeout(check_termlist, 1000);
361 function check_termlist()
363 var facet_name = facet_list[cur_facet][0];
364 var url = "search.pz2?" +
366 "&session=" + session +
367 "&name=" + facet_name;
368 xtermlist = GetXmlHttpObject();
369 xtermlist.onreadystatechange=show_termlist;
370 xtermlist.open("GET", url);
371 xtermlist.send(null);
376 if (xstat.readyState != 4)
379 var xml = xstat.responseXML;
380 var body = document.getElementById("stat");
381 var nodes = xml.childNodes[0].childNodes;
383 Number(xml.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue);
386 stattimer = setTimeout(check_stat, 500);
390 assign_text(body, '(');
391 for (i = 0; i < nodes.length; i++)
393 if (nodes[i].nodeType != 1)
395 var value = nodes[i].childNodes[0].nodeValue;
398 var name = nodes[i].nodeName;
399 append_text(body, ' ' + name + '=' + value);
402 append_text(body, ')');
404 stattimer = setTimeout(check_stat, 2000);
408 function check_stat()
410 var url = "search.pz2?" +
412 "&session=" + session;
413 xstat = GetXmlHttpObject();
414 xstat.onreadystatechange=show_stat;
415 xstat.open("GET", url);
419 function search_started()
421 if (xsearch.readyState != 4)
423 var xml = xsearch.responseXML;
424 var error = xml.getElementsByTagName("error");
427 var msg = error[0].childNodes[0].nodeValue;
432 stattimer = setTimeout(check_stat, 1000);
435 function start_search()
437 clearTimeout(termtimer);
439 clearTimeout(searchtimer);
441 clearTimeout(stattimer);
443 clearTimeout(showtimer);
447 alert("Please load targets first");
450 var query = escape(document.getElementById('query').value);
451 var url = "search.pz2?" +
453 "&session=" + session +
455 xsearch = GetXmlHttpObject();
456 xsearch.onreadystatechange=search_started;
457 xsearch.open("GET", url);
459 clear_cell(document.getElementById("body"));
462 document.search.startrec.value = 0;
466 function session_encode ()
471 for (i = 0; i < session_cells.length; i++)
473 var name = session_cells[i];
474 var value = escape(document.getElementById(name).value);
475 session += '&' + name + '=' + value;
482 function session_restore (session)
484 var fields = session.split(/&/);
487 for (i = 1; i < fields.length; i++)
489 var pair = fields[i].split(/=/);
490 var key = pair.shift();
491 var value = pair.join('=');
492 var cell = document.getElementById(key);
500 function session_read ()
502 var ses = window.location.hash.replace(/^#/, '');
507 function session_store (new_value)
509 window.location.hash = '#' + new_value;
513 function update_history ()
515 var session = session_encode();
516 session_store(session);
517 old_session = session;
521 function session_check ()
523 var session = session_read();
524 var action = document.search.action_type.value;
526 clearInterval(url_surveillence);
528 if ( session != unescape(old_session) )
530 session_restore(session);
532 if (action == 'search') {
534 } else if (action == 'page') {
537 alert('Unregocnized action_type: ' + action);
542 url_surveillence = setInterval(session_check, 200);
546 function get_available_facets () {
547 var facet_container = document.getElementById('termlists');
548 var facet_cells = facet_container.childNodes;
549 var facets = Array();
552 for (i = 0; i < facet_cells.length; i++) {
553 var cell = facet_cells.item(i);
555 if (cell.className == 'facet') {
556 var facet_name = cell.id.replace(/^facet_([^_]+)_terms$/, "$1");
557 facets.push(Array(facet_name, cell));
565 function get_facet_container (obj) {
566 return document.getElementById(obj.id + '_terms');
570 function toggle_facet (obj) {
571 var container = get_facet_container(obj);
573 if (obj.className == 'selected') {
574 obj.className = 'unselected';
575 container.style.display = 'inline';
577 obj.className = 'selected';
578 container.style.display = 'none';