1 /* $Id: search.js,v 1.17 2007-01-10 13:39:41 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 clearTimeout(searchtimer);
185 document.search.startrec.value = offset;
186 update_action('page');
193 function create_element (name, cdata) {
194 var elem_node = document.createElement(name);
195 var text_node = document.createTextNode(cdata);
196 elem_node.appendChild(text_node);
202 function clear_cell (cell) {
203 while (cell.hasChildNodes())
204 cell.removeChild(cell.firstChild);
208 function append_text(cell, text) {
209 text_node = document.createTextNode(text);
210 cell.appendChild(text_node);
214 function assign_text (cell, text) {
216 append_text(cell, text);
220 function show_records()
222 if (xshow.readyState != 4)
225 var xml = xshow.responseXML;
226 var body = document.getElementById("body");
227 var hits = xml.getElementsByTagName("hit");
231 if (!hits[0]) // We should never get here with blocking operations
233 assign_text(body, 'No records yet');
234 searchtimer = setTimeout(check_search, 250);
239 var total = Number(xml.getElementsByTagName('total')[0].childNodes[0].nodeValue);
240 var merged = Number(xml.getElementsByTagName('merged')[0].childNodes[0].nodeValue);
241 var start = Number(xml.getElementsByTagName('start')[0].childNodes[0].nodeValue);
242 var num = Number(xml.getElementsByTagName('num')[0].childNodes[0].nodeValue);
243 var clients = Number(xml.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue);
244 var pager = make_pager(merged, start,recstoshow);
245 var break_node1 = document.createElement('br');
246 var break_node2 = document.createElement('br');
247 var record_container = document.createElement('div');
248 var interval = create_element('div', 'Records : ' + (start + 1) +
249 ' to ' + (start + num) + ' of ' +
250 merged + ' (total hits: ' +
252 interval.className = 'results';
253 record_container.className = 'records';
255 body.appendChild(pager);
256 body.appendChild(interval);
257 body.appendChild(break_node1);
258 body.appendChild(break_node2);
259 body.appendChild(record_container);
261 for (i = 0; i < hits.length; i++)
263 var mk = hits[i].getElementsByTagName("md-title");
267 field = mk[0].childNodes[0].nodeValue;
272 var record_cell = create_element('a', field);
273 record_cell.setAttribute('href', '#');
274 record_cell.className = 'record';
275 record_container.appendChild(record_cell);
282 searchtimer = setTimeout(check_search, 1000);
284 searchtimer = setTimeout(check_search, 2000);
288 termtimer = setTimeout(check_termlist, 500);
291 function check_search()
293 clearTimeout(searchtimer);
294 var url = "search.pz2?" +
296 "&start=" + document.search.startrec.value +
297 "&num=" + recstoshow +
298 "&session=" + session +
300 xshow = GetXmlHttpObject();
301 xshow.onreadystatechange=show_records;
302 xshow.open("GET", url);
307 function refine_query (obj) {
308 var query_cell = document.getElementById('query');
309 var term = obj.innerHTML;
311 term = term.replace(/[\(\)]/g, '');
312 if (cur_termlist == 'subject')
313 query_cell.value += ' and su=(' + term + ')';
314 else if (cur_termlist == 'author')
315 query_cell.value += ' and au=(' + term + ')';
321 function show_termlist()
323 if (xtermlist.readyState != 4)
327 var xml = xtermlist.responseXML;
328 var body = facet_list[cur_facet][1];
329 var hits = xml.getElementsByTagName("term");
331 Number(xml.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue);
335 if (cur_facet >= facet_list.length)
340 termtimer = setTimeout(check_termlist, 500);
346 for (i = 0; i < hits.length; i++)
348 var namen = hits[i].getElementsByTagName("name");
350 var refine_cell = create_element('a',
351 namen[0].childNodes[0].nodeValue);
352 refine_cell.setAttribute('href', '#');
353 refine_cell.setAttribute('onclick', 'refine_query(this)');
354 body.appendChild(refine_cell);
358 termtimer = setTimeout(check_termlist, 1000);
362 function check_termlist()
364 var facet_name = facet_list[cur_facet][0];
365 var url = "search.pz2?" +
367 "&session=" + session +
368 "&name=" + facet_name;
369 xtermlist = GetXmlHttpObject();
370 xtermlist.onreadystatechange=show_termlist;
371 xtermlist.open("GET", url);
372 xtermlist.send(null);
377 if (xstat.readyState != 4)
380 var xml = xstat.responseXML;
381 var body = document.getElementById("stat");
382 var nodes = xml.childNodes[0].childNodes;
384 Number(xml.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue);
387 stattimer = setTimeout(check_stat, 500);
391 assign_text(body, '(');
392 for (i = 0; i < nodes.length; i++)
394 if (nodes[i].nodeType != 1)
396 var value = nodes[i].childNodes[0].nodeValue;
399 var name = nodes[i].nodeName;
400 append_text(body, ' ' + name + '=' + value);
403 append_text(body, ')');
405 stattimer = setTimeout(check_stat, 2000);
409 function check_stat()
411 var url = "search.pz2?" +
413 "&session=" + session;
414 xstat = GetXmlHttpObject();
415 xstat.onreadystatechange=show_stat;
416 xstat.open("GET", url);
420 function search_started()
422 if (xsearch.readyState != 4)
424 var xml = xsearch.responseXML;
425 var error = xml.getElementsByTagName("error");
428 var msg = error[0].childNodes[0].nodeValue;
433 stattimer = setTimeout(check_stat, 1000);
436 function start_search()
438 clearTimeout(termtimer);
440 clearTimeout(searchtimer);
442 clearTimeout(stattimer);
444 clearTimeout(showtimer);
448 alert("Please load targets first");
451 var query = escape(document.getElementById('query').value);
452 var url = "search.pz2?" +
454 "&session=" + session +
456 xsearch = GetXmlHttpObject();
457 xsearch.onreadystatechange=search_started;
458 xsearch.open("GET", url);
460 clear_cell(document.getElementById("body"));
463 document.search.startrec.value = 0;
467 function session_encode ()
472 for (i = 0; i < session_cells.length; i++)
474 var name = session_cells[i];
475 var value = escape(document.getElementById(name).value);
476 session += '&' + name + '=' + value;
483 function session_restore (session)
485 var fields = session.split(/&/);
488 for (i = 1; i < fields.length; i++)
490 var pair = fields[i].split(/=/);
491 var key = pair.shift();
492 var value = pair.join('=');
493 var cell = document.getElementById(key);
501 function session_read ()
503 var ses = window.location.hash.replace(/^#/, '');
508 function session_store (new_value)
510 window.location.hash = '#' + new_value;
514 function update_history ()
516 var session = session_encode();
517 session_store(session);
518 old_session = session;
522 function session_check ()
524 var session = session_read();
525 var action = document.search.action_type.value;
527 clearInterval(url_surveillence);
529 if ( session != unescape(old_session) )
531 session_restore(session);
533 if (action == 'search') {
535 } else if (action == 'page') {
538 alert('Unregocnized action_type: ' + action);
543 url_surveillence = setInterval(session_check, 200);
547 function get_available_facets () {
548 var facet_container = document.getElementById('termlists');
549 var facet_cells = facet_container.childNodes;
550 var facets = Array();
553 for (i = 0; i < facet_cells.length; i++) {
554 var cell = facet_cells.item(i);
556 if (cell.className == 'facet') {
557 var facet_name = cell.id.replace(/^facet_([^_]+)_terms$/, "$1");
558 facets.push(Array(facet_name, cell));
566 function get_facet_container (obj) {
567 return document.getElementById(obj.id + '_terms');
571 function toggle_facet (obj) {
572 var container = get_facet_container(obj);
574 if (obj.className == 'selected') {
575 obj.className = 'unselected';
576 container.style.display = 'inline';
578 obj.className = 'selected';
579 container.style.display = 'none';