1 /* $Id: search.js,v 1.26 2007-01-16 03:38:50 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 var value = nodes[i].childNodes[0].nodeValue;
272 var lbl = create_element('b', name );
273 var lbln = document.createElement('td');
274 lbln.setAttribute('width', 70);
275 lbln.appendChild(lbl);
276 var val = create_element('td', value);
277 var tr = document.createElement('tr');
278 tr.appendChild(lbln);
280 table.appendChild(tr);
282 body.appendChild(table);
283 body.style.display = 'inline';
286 function fetch_details(id)
288 var node = document.getElementById('rec_' + id);
289 if (node && node.style.display == 'inline')
291 node.style.display = 'none';
296 var url = "search.pz2?session=" + session +
299 SendXmlHttpObject(xfetchDetails = GetXmlHttpObject(), url, show_details);
302 function show_records()
304 if (xshow.readyState != 4)
307 var xml = xshow.responseXML;
308 var body = document.getElementById("body");
309 var hits = xml.getElementsByTagName("hit");
313 if (!hits[0]) // We should never get here with blocking operations
315 assign_text(body, 'No records yet');
316 searchtimer = setTimeout(check_search, 250);
320 var total = Number(xml.getElementsByTagName('total')[0].childNodes[0].nodeValue);
321 var merged = Number(xml.getElementsByTagName('merged')[0].childNodes[0].nodeValue);
322 var start = Number(xml.getElementsByTagName('start')[0].childNodes[0].nodeValue);
323 var num = Number(xml.getElementsByTagName('num')[0].childNodes[0].nodeValue);
324 var clients = Number(xml.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue);
325 var pager = make_pager(merged, start,recstoshow);
326 var break_node1 = document.createElement('br');
327 var break_node2 = document.createElement('br');
328 var record_container = document.createElement('div');
329 var interval = create_element('div', 'Records : ' + (start + 1) +
330 ' to ' + (start + num) + ' of ' +
331 merged + ' (total hits: ' +
334 interval.className = 'results';
335 record_container.className = 'records';
337 body.appendChild(pager);
338 body.appendChild(interval);
339 body.appendChild(break_node1);
340 body.appendChild(break_node2);
341 body.appendChild(record_container);
343 for (i = 0; i < hits.length; i++)
345 var tn = hits[i].getElementsByTagName("md-title");
347 var an = hits[i].getElementsByTagName("md-author");
349 var cn = hits[i].getElementsByTagName("count");
351 var idn = hits[i].getElementsByTagName("recid");
354 title = tn[0].childNodes[0].nodeValue;
358 if (an[0] && an[0].childNodes[0])
359 author = an[0].childNodes[0].nodeValue;
361 count = Number(cn[0].childNodes[0].nodeValue);
362 var id = idn[0].childNodes[0].nodeValue;
364 var record_div = document.createElement('div');
365 record_div.className = 'record';
367 var record_cell = create_element('a', title);
368 record_cell.setAttribute('href', '#');
369 record_cell.setAttribute('onclick', 'fetch_details(' + id + '); return false');
370 record_div.appendChild(record_cell);
373 record_div.appendChild(document.createTextNode(', by '));
374 record_div.appendChild(document.createTextNode(author));
377 record_div.appendChild(document.createTextNode(
378 ' (' + count + ')'));
379 var det_div = document.createElement('div');
380 det_div.style.display = 'none';
381 det_div.setAttribute('id', 'rec_' + id);
382 det_div.appendChild(document.createElement('br'));
383 det_div.appendChild(document.createTextNode('Hugo'));
384 record_div.appendChild(det_div);
385 record_container.appendChild(record_div);
392 searchtimer = setTimeout(check_search, 1000);
394 searchtimer = setTimeout(check_search, 2000);
398 termtimer = setTimeout(check_termlist, 500);
401 function check_search()
403 clearTimeout(searchtimer);
404 var url = "search.pz2?" +
406 "&start=" + document.search.startrec.value +
407 "&num=" + recstoshow +
408 "&session=" + session +
409 "&sort=" + cur_sort +
411 xshow = GetXmlHttpObject();
412 xshow.onreadystatechange=show_records;
413 xshow.open("GET", url);
418 function refine_query (obj) {
419 var term = obj.getAttribute('term');
420 var cur_termlist = obj.getAttribute('facet');
421 var query_cell = document.getElementById('query');
423 term = term.replace(/[\(\)]/g, '');
425 if (cur_termlist == 'subject')
426 query_cell.value += ' and su=(' + term + ')';
427 else if (cur_termlist == 'author')
428 query_cell.value += ' and au=(' + term + ')';
435 function show_termlist()
437 if (xtermlist.readyState != 4)
441 var xml = xtermlist.responseXML;
442 var body = facet_list[cur_facet][1];
443 var facet_name = facet_list[cur_facet][0];
444 var hits = xml.getElementsByTagName("term");
446 Number(xml.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue);
450 if (cur_facet >= facet_list.length)
455 termtimer = setTimeout(check_termlist, 500);
461 for (i = 0; i < hits.length; i++)
463 var namen = hits[i].getElementsByTagName("name");
464 var freqn = hits[i].getElementsByTagName("frequency");
466 var term = namen[0].childNodes[0].nodeValue;
467 var freq = freqn[0].childNodes[0].nodeValue;
468 var refine_cell = create_element('a', term + ' (' + freq + ')');
469 refine_cell.setAttribute('href', '#');
470 refine_cell.setAttribute('term', term);
471 refine_cell.setAttribute('facet', facet_name);
472 refine_cell.onclick = function () {
476 body.appendChild(refine_cell);
480 termtimer = setTimeout(check_termlist, 1000);
484 function check_termlist()
486 var facet_name = facet_list[cur_facet][0];
487 var url = "search.pz2?" +
489 "&session=" + session +
490 "&name=" + facet_name;
491 xtermlist = GetXmlHttpObject();
492 xtermlist.onreadystatechange=show_termlist;
493 xtermlist.open("GET", url);
494 xtermlist.send(null);
499 if (xstat.readyState != 4)
502 var xml = xstat.responseXML;
503 var body = document.getElementById("stat");
504 var nodes = xml.childNodes[0].childNodes;
506 Number(xml.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue);
509 stattimer = setTimeout(check_stat, 500);
513 assign_text(body, '(');
514 for (i = 0; i < nodes.length; i++)
516 if (nodes[i].nodeType != 1)
518 var value = nodes[i].childNodes[0].nodeValue;
521 var name = nodes[i].nodeName;
522 append_text(body, ' ' + name + '=' + value);
525 append_text(body, ')');
527 stattimer = setTimeout(check_stat, 2000);
531 function check_stat()
533 var url = "search.pz2?" +
535 "&session=" + session;
536 xstat = GetXmlHttpObject();
537 xstat.onreadystatechange=show_stat;
538 xstat.open("GET", url);
542 function search_started()
544 if (xsearch.readyState != 4)
546 var xml = xsearch.responseXML;
547 var error = xml.getElementsByTagName("error");
550 var msg = error[0].childNodes[0].nodeValue;
555 stattimer = setTimeout(check_stat, 1000);
558 function start_search()
560 clearTimeout(termtimer);
562 clearTimeout(searchtimer);
564 clearTimeout(stattimer);
566 clearTimeout(showtimer);
568 var query = escape(document.getElementById('query').value);
569 var url = "search.pz2?" +
571 "&session=" + session +
573 xsearch = GetXmlHttpObject();
574 xsearch.onreadystatechange=search_started;
575 xsearch.open("GET", url);
577 clear_cell(document.getElementById("body"));
580 document.search.startrec.value = 0;
583 function session_encode ()
588 for (i = 0; i < session_cells.length; i++)
590 var name = session_cells[i];
591 var value = escape(document.getElementById(name).value);
592 session += '&' + name + '=' + value;
599 function session_restore (session)
601 var fields = session.split(/&/);
604 for (i = 1; i < fields.length; i++)
606 var pair = fields[i].split(/=/);
607 var key = pair.shift();
608 var value = pair.join('=');
609 var cell = document.getElementById(key);
617 function session_read ()
619 var ses = window.location.hash.replace(/^#/, '');
624 function session_store (new_value)
626 window.location.hash = '#' + new_value;
630 function update_history ()
632 var session = session_encode();
633 session_store(session);
634 old_session = session;
638 function session_check ()
640 var session = session_read();
641 var action = document.search.action_type.value;
643 clearInterval(url_surveillence);
645 if ( session != unescape(old_session) )
647 session_restore(session);
649 if (action == 'search') {
651 } else if (action == 'page') {
654 alert('Unregocnized action_type: ' + action);
659 url_surveillence = setInterval(session_check, 200);
663 function get_available_facets () {
664 var facet_container = document.getElementById('termlists');
665 var facet_cells = facet_container.childNodes;
666 var facets = Array();
669 for (i = 0; i < facet_cells.length; i++) {
670 var cell = facet_cells.item(i);
672 if (cell.className == 'facet') {
673 var facet_name = cell.id.replace(/^facet_([^_]+)_terms$/, "$1");
674 facets.push(Array(facet_name, cell));
682 function get_facet_container (obj) {
683 return document.getElementById(obj.id + '_terms');
687 function toggle_facet (obj) {
688 var container = get_facet_container(obj);
690 if (obj.className == 'selected') {
691 obj.className = 'unselected';
692 container.style.display = 'inline';
694 obj.className = 'selected';
695 container.style.display = 'none';