1 /* $Id: search.js,v 1.21 2007-01-11 13:31:31 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(' ');
168 if ((offset >= off) && (offset < (off + max))) {
169 page_elem.className = 'select';
172 page_elem.setAttribute('off', off);
173 page_elem.style.cursor = 'pointer';
174 page_elem.onclick = function () {
175 update_offset(this.getAttribute('off'));
178 div_elem.appendChild(page_elem);
179 div_elem.appendChild(newline_node);
186 function update_offset (offset) {
187 clearTimeout(searchtimer);
188 document.search.startrec.value = offset;
189 update_action('page');
196 function create_element (name, cdata) {
197 var elem_node = document.createElement(name);
198 var text_node = document.createTextNode(cdata);
199 elem_node.appendChild(text_node);
205 function clear_cell (cell) {
206 while (cell.hasChildNodes())
207 cell.removeChild(cell.firstChild);
211 function append_text(cell, text) {
212 text_node = document.createTextNode(text);
213 cell.appendChild(text_node);
217 function assign_text (cell, text) {
219 append_text(cell, text);
223 function show_records()
225 if (xshow.readyState != 4)
228 var xml = xshow.responseXML;
229 var body = document.getElementById("body");
230 var hits = xml.getElementsByTagName("hit");
234 if (!hits[0]) // We should never get here with blocking operations
236 assign_text(body, 'No records yet');
237 searchtimer = setTimeout(check_search, 250);
242 var total = Number(xml.getElementsByTagName('total')[0].childNodes[0].nodeValue);
243 var merged = Number(xml.getElementsByTagName('merged')[0].childNodes[0].nodeValue);
244 var start = Number(xml.getElementsByTagName('start')[0].childNodes[0].nodeValue);
245 var num = Number(xml.getElementsByTagName('num')[0].childNodes[0].nodeValue);
246 var clients = Number(xml.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue);
247 var pager = make_pager(merged, start,recstoshow);
248 var break_node1 = document.createElement('br');
249 var break_node2 = document.createElement('br');
250 var record_container = document.createElement('div');
251 var interval = create_element('div', 'Records : ' + (start + 1) +
252 ' to ' + (start + num) + ' of ' +
253 merged + ' (total hits: ' +
255 interval.className = 'results';
256 record_container.className = 'records';
258 body.appendChild(pager);
259 body.appendChild(interval);
260 body.appendChild(break_node1);
261 body.appendChild(break_node2);
262 body.appendChild(record_container);
264 for (i = 0; i < hits.length; i++)
266 var mk = hits[i].getElementsByTagName("md-title");
270 field = mk[0].childNodes[0].nodeValue;
275 var record_cell = create_element('a', field);
276 record_cell.setAttribute('href', '#');
277 record_cell.className = 'record';
278 record_container.appendChild(record_cell);
285 searchtimer = setTimeout(check_search, 1000);
287 searchtimer = setTimeout(check_search, 2000);
291 termtimer = setTimeout(check_termlist, 500);
294 function check_search()
296 clearTimeout(searchtimer);
297 var url = "search.pz2?" +
299 "&start=" + document.search.startrec.value +
300 "&num=" + recstoshow +
301 "&session=" + session +
303 xshow = GetXmlHttpObject();
304 xshow.onreadystatechange=show_records;
305 xshow.open("GET", url);
310 function refine_query (obj) {
311 var term = obj.getAttribute('term');
312 var cur_termlist = obj.getAttribute('facet');
313 var query_cell = document.getElementById('query');
315 term = term.replace(/[\(\)]/g, '');
317 if (cur_termlist == 'subject')
318 query_cell.value += ' and su=(' + term + ')';
319 else if (cur_termlist == 'author')
320 query_cell.value += ' and au=(' + term + ')';
327 function show_termlist()
329 if (xtermlist.readyState != 4)
333 var xml = xtermlist.responseXML;
334 var body = facet_list[cur_facet][1];
335 var facet_name = facet_list[cur_facet][0];
336 var hits = xml.getElementsByTagName("term");
338 Number(xml.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue);
342 if (cur_facet >= facet_list.length)
347 termtimer = setTimeout(check_termlist, 500);
353 for (i = 0; i < hits.length; i++)
355 var namen = hits[i].getElementsByTagName("name");
357 var term = namen[0].childNodes[0].nodeValue;
358 var refine_cell = create_element('a', term);
359 refine_cell.setAttribute('href', '#');
360 refine_cell.setAttribute('term', term);
361 refine_cell.setAttribute('facet', facet_name);
362 refine_cell.onclick = function () {
366 body.appendChild(refine_cell);
370 termtimer = setTimeout(check_termlist, 1000);
374 function check_termlist()
376 var facet_name = facet_list[cur_facet][0];
377 var url = "search.pz2?" +
379 "&session=" + session +
380 "&name=" + facet_name;
381 xtermlist = GetXmlHttpObject();
382 xtermlist.onreadystatechange=show_termlist;
383 xtermlist.open("GET", url);
384 xtermlist.send(null);
389 if (xstat.readyState != 4)
392 var xml = xstat.responseXML;
393 var body = document.getElementById("stat");
394 var nodes = xml.childNodes[0].childNodes;
396 Number(xml.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue);
399 stattimer = setTimeout(check_stat, 500);
403 assign_text(body, '(');
404 for (i = 0; i < nodes.length; i++)
406 if (nodes[i].nodeType != 1)
408 var value = nodes[i].childNodes[0].nodeValue;
411 var name = nodes[i].nodeName;
412 append_text(body, ' ' + name + '=' + value);
415 append_text(body, ')');
417 stattimer = setTimeout(check_stat, 2000);
421 function check_stat()
423 var url = "search.pz2?" +
425 "&session=" + session;
426 xstat = GetXmlHttpObject();
427 xstat.onreadystatechange=show_stat;
428 xstat.open("GET", url);
432 function search_started()
434 if (xsearch.readyState != 4)
436 var xml = xsearch.responseXML;
437 var error = xml.getElementsByTagName("error");
440 var msg = error[0].childNodes[0].nodeValue;
445 stattimer = setTimeout(check_stat, 1000);
448 function start_search()
450 clearTimeout(termtimer);
452 clearTimeout(searchtimer);
454 clearTimeout(stattimer);
456 clearTimeout(showtimer);
460 alert("Please load targets first");
463 var query = escape(document.getElementById('query').value);
464 var url = "search.pz2?" +
466 "&session=" + session +
468 xsearch = GetXmlHttpObject();
469 xsearch.onreadystatechange=search_started;
470 xsearch.open("GET", url);
472 clear_cell(document.getElementById("body"));
475 document.search.startrec.value = 0;
479 function session_encode ()
484 for (i = 0; i < session_cells.length; i++)
486 var name = session_cells[i];
487 var value = escape(document.getElementById(name).value);
488 session += '&' + name + '=' + value;
495 function session_restore (session)
497 var fields = session.split(/&/);
500 for (i = 1; i < fields.length; i++)
502 var pair = fields[i].split(/=/);
503 var key = pair.shift();
504 var value = pair.join('=');
505 var cell = document.getElementById(key);
513 function session_read ()
515 var ses = window.location.hash.replace(/^#/, '');
520 function session_store (new_value)
522 window.location.hash = '#' + new_value;
526 function update_history ()
528 var session = session_encode();
529 session_store(session);
530 old_session = session;
534 function session_check ()
536 var session = session_read();
537 var action = document.search.action_type.value;
539 clearInterval(url_surveillence);
541 if ( session != unescape(old_session) )
543 session_restore(session);
545 if (action == 'search') {
547 } else if (action == 'page') {
550 alert('Unregocnized action_type: ' + action);
555 url_surveillence = setInterval(session_check, 200);
559 function get_available_facets () {
560 var facet_container = document.getElementById('termlists');
561 var facet_cells = facet_container.childNodes;
562 var facets = Array();
565 for (i = 0; i < facet_cells.length; i++) {
566 var cell = facet_cells.item(i);
568 if (cell.className == 'facet') {
569 var facet_name = cell.id.replace(/^facet_([^_]+)_terms$/, "$1");
570 facets.push(Array(facet_name, cell));
578 function get_facet_container (obj) {
579 return document.getElementById(obj.id + '_terms');
583 function toggle_facet (obj) {
584 var container = get_facet_container(obj);
586 if (obj.className == 'selected') {
587 obj.className = 'unselected';
588 container.style.display = 'inline';
590 obj.className = 'selected';
591 container.style.display = 'none';