1 /* $Id: search.js,v 1.27 2007-01-16 05:29:48 quinn Exp $
2 * ---------------------------------------------------
15 var targetsloaded = false;
21 var session_cells = Array('query', 'startrec', 'action_type');
22 var old_session = session_read();
25 var page_window = 5; // Number of pages prior to and after the current page
28 var cur_sort = "relevance";
31 function initialize ()
33 facet_list = get_available_facets();
40 function GetXmlHttpObject()
43 if (window.XMLHttpRequest)
45 objXMLHttp=new XMLHttpRequest()
47 else if (window.ActiveXObject)
49 objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP")
54 function SendXmlHttpObject(obj, url, handler)
56 obj.onreadystatechange=handler;
61 function session_started()
63 if (xinitSession.readyState != 4)
65 var xml = xinitSession.responseXML;
66 var sesid = xml.getElementsByTagName("session")[0].childNodes[0].nodeValue;
67 assign_text(document.getElementById("status"), 'Live');
69 setTimeout(ping_session, 50000);
72 function start_session()
74 xinitSession = GetXmlHttpObject();
75 var url="search.pz2?";
76 url += "command=init";
77 xinitSession.onreadystatechange=session_started;
78 xinitSession.open("GET", url);
79 xinitSession.send(null);
82 function ping_session()
86 var url = "search.pz2?command=ping&session=" + session;
87 SendXmlHttpObject(xpingSession = GetXmlHttpObject(), url, session_pinged);
90 function session_pinged()
92 if (xpingSession.readyState != 4)
94 var xml = xpingSession.responseXML;
95 var error = xml.getElementsByTagName("error");
98 var msg = error[0].childNodes[0].nodeValue;
103 setTimeout(ping_session, 50000);
106 function update_action (new_action) {
107 document.search.action_type.value = new_action;
111 function make_pager (hits, offset, max) {
114 var start_offset = offset - page_window * max;
115 var div_elem = document.createElement('div');
117 div_elem.className = 'pages';
119 if (start_offset < 0) {
123 for (off = start_offset;
124 off < hits && off < (start_offset + 2 * page_window * max);
127 var p = off / max + 1;
128 var page_elem = create_element('a', p);
129 var newline_node = document.createTextNode(' ');
131 if ((offset >= off) && (offset < (off + max))) {
132 page_elem.className = 'select';
135 page_elem.setAttribute('off', off);
136 page_elem.style.cursor = 'pointer';
137 page_elem.onclick = function () {
138 update_offset(this.getAttribute('off'));
141 div_elem.appendChild(page_elem);
142 div_elem.appendChild(newline_node);
149 function update_offset (offset) {
150 clearTimeout(searchtimer);
151 document.search.startrec.value = offset;
152 update_action('page');
159 function create_element (name, cdata) {
160 var elem_node = document.createElement(name);
161 var text_node = document.createTextNode(cdata);
162 elem_node.appendChild(text_node);
168 function clear_cell (cell) {
169 while (cell.hasChildNodes())
170 cell.removeChild(cell.firstChild);
174 function append_text(cell, text) {
175 text_node = document.createTextNode(text);
176 cell.appendChild(text_node);
180 function assign_text (cell, text) {
182 append_text(cell, text);
185 function set_sort_opt(n, opt, str)
187 var txt = document.createTextNode(str);
192 var a = document.createElement('a');
194 a.setAttribute('href', "");
195 a.setAttribute('onclick', "set_sort('" + opt + "'); return false");
200 function set_sort(sort)
202 if (sort && sort != cur_sort)
209 var t = document.getElementById("sortselect");
211 t.appendChild(document.createTextNode("Sort results by: "));
212 set_sort_opt(t, 'relevance', 'Relevance');
213 t.appendChild(document.createTextNode(" or "));
214 set_sort_opt(t, 'title:1', 'Title');
217 function displayname(name)
219 if (name == 'md-author')
221 else if (name == 'md-subject')
223 else if (name == 'md-date')
225 else if (name == 'md-isbn')
227 else if (name == 'md-publisher')
233 function show_details()
235 if (xfetchDetails.readyState != 4)
237 var xml = xfetchDetails.responseXML;
238 var error = xml.getElementsByTagName("error");
241 var msg = error[0].childNodes[0].nodeValue;
247 // This is some ugly display code. Replace with your own ting o'beauty
249 var idn = xml.getElementsByTagName('recid');
252 var id = idn[0].childNodes[0].nodeValue;
254 var body = document.getElementById('rec_' + id);
258 //body.appendChild(document.createElement('br'));
259 var nodes = xml.childNodes[0].childNodes;
261 var table = document.createElement('table');
262 table.setAttribute('cellpadding', 2);
263 for (i = 0; i < nodes.length; i++)
265 if (nodes[i].nodeType != 1)
267 var name = nodes[i].nodeName;
268 if (name == 'recid' || name == 'md-title')
270 name = displayname(name);
271 if (!nodes[i].childNodes[0])
273 var value = nodes[i].childNodes[0].nodeValue;
274 var lbl = create_element('b', name );
275 var lbln = document.createElement('td');
276 lbln.setAttribute('width', 70);
277 lbln.appendChild(lbl);
278 var val = create_element('td', value);
279 var tr = document.createElement('tr');
280 tr.appendChild(lbln);
282 table.appendChild(tr);
284 body.appendChild(table);
285 body.style.display = 'inline';
288 function fetch_details(id)
290 var node = document.getElementById('rec_' + id);
291 if (node && node.style.display == 'inline')
293 node.style.display = 'none';
298 var url = "search.pz2?session=" + session +
301 SendXmlHttpObject(xfetchDetails = GetXmlHttpObject(), url, show_details);
304 function show_records()
306 if (xshow.readyState != 4)
309 var xml = xshow.responseXML;
310 var body = document.getElementById("body");
311 var hits = xml.getElementsByTagName("hit");
315 if (!hits[0]) // We should never get here with blocking operations
317 assign_text(body, 'No records yet');
318 searchtimer = setTimeout(check_search, 250);
322 var total = Number(xml.getElementsByTagName('total')[0].childNodes[0].nodeValue);
323 var merged = Number(xml.getElementsByTagName('merged')[0].childNodes[0].nodeValue);
324 var start = Number(xml.getElementsByTagName('start')[0].childNodes[0].nodeValue);
325 var num = Number(xml.getElementsByTagName('num')[0].childNodes[0].nodeValue);
326 var clients = Number(xml.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue);
327 var pager = make_pager(merged, start,recstoshow);
328 var break_node1 = document.createElement('br');
329 var break_node2 = document.createElement('br');
330 var record_container = document.createElement('div');
331 var interval = create_element('div', 'Records : ' + (start + 1) +
332 ' to ' + (start + num) + ' of ' +
333 merged + ' (total hits: ' +
336 interval.className = 'results';
337 record_container.className = 'records';
339 body.appendChild(pager);
340 body.appendChild(interval);
341 body.appendChild(break_node1);
342 body.appendChild(break_node2);
343 body.appendChild(record_container);
345 for (i = 0; i < hits.length; i++)
347 var tn = hits[i].getElementsByTagName("md-title");
349 var an = hits[i].getElementsByTagName("md-author");
351 var cn = hits[i].getElementsByTagName("count");
353 var idn = hits[i].getElementsByTagName("recid");
356 title = tn[0].childNodes[0].nodeValue;
360 if (an[0] && an[0].childNodes[0])
361 author = an[0].childNodes[0].nodeValue;
363 count = Number(cn[0].childNodes[0].nodeValue);
364 var id = idn[0].childNodes[0].nodeValue;
366 var record_div = document.createElement('div');
367 record_div.className = 'record';
369 var record_cell = create_element('a', title);
370 record_cell.setAttribute('href', '#');
371 record_cell.setAttribute('onclick', 'fetch_details(' + id + '); return false');
372 record_div.appendChild(record_cell);
375 record_div.appendChild(document.createTextNode(', by '));
376 record_div.appendChild(document.createTextNode(author));
379 record_div.appendChild(document.createTextNode(
380 ' (' + count + ')'));
381 var det_div = document.createElement('div');
382 det_div.style.display = 'none';
383 det_div.setAttribute('id', 'rec_' + id);
384 det_div.appendChild(document.createElement('br'));
385 det_div.appendChild(document.createTextNode('Hugo'));
386 record_div.appendChild(det_div);
387 record_container.appendChild(record_div);
394 searchtimer = setTimeout(check_search, 1000);
396 searchtimer = setTimeout(check_search, 2000);
400 termtimer = setTimeout(check_termlist, 500);
403 function check_search()
405 clearTimeout(searchtimer);
406 var url = "search.pz2?" +
408 "&start=" + document.search.startrec.value +
409 "&num=" + recstoshow +
410 "&session=" + session +
411 "&sort=" + cur_sort +
413 xshow = GetXmlHttpObject();
414 xshow.onreadystatechange=show_records;
415 xshow.open("GET", url);
420 function refine_query (obj) {
421 var term = obj.getAttribute('term');
422 var cur_termlist = obj.getAttribute('facet');
423 var query_cell = document.getElementById('query');
425 term = term.replace(/[\(\)]/g, '');
427 if (cur_termlist == 'subject')
428 query_cell.value += ' and su=(' + term + ')';
429 else if (cur_termlist == 'author')
430 query_cell.value += ' and au=(' + term + ')';
437 function show_termlist()
439 if (xtermlist.readyState != 4)
443 var xml = xtermlist.responseXML;
444 var body = facet_list[cur_facet][1];
445 var facet_name = facet_list[cur_facet][0];
446 var hits = xml.getElementsByTagName("term");
448 Number(xml.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue);
452 if (cur_facet >= facet_list.length)
457 termtimer = setTimeout(check_termlist, 500);
463 for (i = 0; i < hits.length; i++)
465 var namen = hits[i].getElementsByTagName("name");
466 var freqn = hits[i].getElementsByTagName("frequency");
468 var term = namen[0].childNodes[0].nodeValue;
469 var freq = freqn[0].childNodes[0].nodeValue;
470 var refine_cell = create_element('a', term + ' (' + freq + ')');
471 refine_cell.setAttribute('href', '#');
472 refine_cell.setAttribute('term', term);
473 refine_cell.setAttribute('facet', facet_name);
474 refine_cell.onclick = function () {
478 body.appendChild(refine_cell);
482 termtimer = setTimeout(check_termlist, 1000);
486 function check_termlist()
488 var facet_name = facet_list[cur_facet][0];
489 var url = "search.pz2?" +
491 "&session=" + session +
492 "&name=" + facet_name;
493 xtermlist = GetXmlHttpObject();
494 xtermlist.onreadystatechange=show_termlist;
495 xtermlist.open("GET", url);
496 xtermlist.send(null);
501 if (xstat.readyState != 4)
504 var xml = xstat.responseXML;
505 var body = document.getElementById("stat");
506 var nodes = xml.childNodes[0].childNodes;
508 Number(xml.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue);
511 stattimer = setTimeout(check_stat, 500);
515 assign_text(body, '(');
516 for (i = 0; i < nodes.length; i++)
518 if (nodes[i].nodeType != 1)
520 var value = nodes[i].childNodes[0].nodeValue;
523 var name = nodes[i].nodeName;
524 append_text(body, ' ' + name + '=' + value);
527 append_text(body, ')');
529 stattimer = setTimeout(check_stat, 2000);
533 function check_stat()
535 var url = "search.pz2?" +
537 "&session=" + session;
538 xstat = GetXmlHttpObject();
539 xstat.onreadystatechange=show_stat;
540 xstat.open("GET", url);
544 function search_started()
546 if (xsearch.readyState != 4)
548 var xml = xsearch.responseXML;
549 var error = xml.getElementsByTagName("error");
552 var msg = error[0].childNodes[0].nodeValue;
557 stattimer = setTimeout(check_stat, 1000);
560 function start_search()
562 clearTimeout(termtimer);
564 clearTimeout(searchtimer);
566 clearTimeout(stattimer);
568 clearTimeout(showtimer);
570 var query = escape(document.getElementById('query').value);
571 var url = "search.pz2?" +
573 "&session=" + session +
575 xsearch = GetXmlHttpObject();
576 xsearch.onreadystatechange=search_started;
577 xsearch.open("GET", url);
579 clear_cell(document.getElementById("body"));
582 document.search.startrec.value = 0;
585 function session_encode ()
590 for (i = 0; i < session_cells.length; i++)
592 var name = session_cells[i];
593 var value = escape(document.getElementById(name).value);
594 session += '&' + name + '=' + value;
601 function session_restore (session)
603 var fields = session.split(/&/);
606 for (i = 1; i < fields.length; i++)
608 var pair = fields[i].split(/=/);
609 var key = pair.shift();
610 var value = pair.join('=');
611 var cell = document.getElementById(key);
619 function session_read ()
621 var ses = window.location.hash.replace(/^#/, '');
626 function session_store (new_value)
628 window.location.hash = '#' + new_value;
632 function update_history ()
634 var session = session_encode();
635 session_store(session);
636 old_session = session;
640 function session_check ()
642 var session = session_read();
643 var action = document.search.action_type.value;
645 clearInterval(url_surveillence);
647 if ( session != unescape(old_session) )
649 session_restore(session);
651 if (action == 'search') {
653 } else if (action == 'page') {
656 alert('Unregocnized action_type: ' + action);
661 url_surveillence = setInterval(session_check, 200);
665 function get_available_facets () {
666 var facet_container = document.getElementById('termlists');
667 var facet_cells = facet_container.childNodes;
668 var facets = Array();
671 for (i = 0; i < facet_cells.length; i++) {
672 var cell = facet_cells.item(i);
674 if (cell.className == 'facet') {
675 var facet_name = cell.id.replace(/^facet_([^_]+)_terms$/, "$1");
676 facets.push(Array(facet_name, cell));
684 function get_facet_container (obj) {
685 return document.getElementById(obj.id + '_terms');
689 function toggle_facet (obj) {
690 var container = get_facet_container(obj);
692 if (obj.className == 'selected') {
693 obj.className = 'unselected';
694 container.style.display = 'inline';
696 obj.className = 'selected';
697 container.style.display = 'none';