1 /* $Id: search.js,v 1.25 2007-01-15 22:05:37 quinn 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
27 var cur_sort = "relevance";
30 function initialize ()
32 facet_list = get_available_facets();
39 function GetXmlHttpObject()
42 if (window.XMLHttpRequest)
44 objXMLHttp=new XMLHttpRequest()
46 else if (window.ActiveXObject)
48 objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP")
53 function SendXmlHttpObject(obj, url, handler)
55 obj.onreadystatechange=handler;
60 function session_started()
62 if (xinitSession.readyState != 4)
64 var xml = xinitSession.responseXML;
65 var sesid = xml.getElementsByTagName("session")[0].childNodes[0].nodeValue;
66 assign_text(document.getElementById("status"), 'Live');
68 setTimeout(ping_session, 50000);
71 function start_session()
73 xinitSession = GetXmlHttpObject();
74 var url="search.pz2?";
75 url += "command=init";
76 xinitSession.onreadystatechange=session_started;
77 xinitSession.open("GET", url);
78 xinitSession.send(null);
81 function ping_session()
85 var url = "search.pz2?command=ping&session=" + session;
86 SendXmlHttpObject(xpingSession = GetXmlHttpObject(), url, session_pinged);
89 function session_pinged()
91 if (xpingSession.readyState != 4)
93 var xml = xpingSession.responseXML;
94 var error = xml.getElementsByTagName("error");
97 var msg = error[0].childNodes[0].nodeValue;
102 setTimeout(ping_session, 50000);
105 function update_action (new_action) {
106 document.search.action_type.value = new_action;
110 function make_pager (hits, offset, max) {
113 var start_offset = offset - page_window * max;
114 var div_elem = document.createElement('div');
116 div_elem.className = 'pages';
118 if (start_offset < 0) {
122 for (off = start_offset;
123 off < hits && off < (start_offset + 2 * page_window * max);
126 var p = off / max + 1;
127 var page_elem = create_element('a', p);
128 var newline_node = document.createTextNode(' ');
130 if ((offset >= off) && (offset < (off + max))) {
131 page_elem.className = 'select';
134 page_elem.setAttribute('off', off);
135 page_elem.style.cursor = 'pointer';
136 page_elem.onclick = function () {
137 update_offset(this.getAttribute('off'));
140 div_elem.appendChild(page_elem);
141 div_elem.appendChild(newline_node);
148 function update_offset (offset) {
149 clearTimeout(searchtimer);
150 document.search.startrec.value = offset;
151 update_action('page');
158 function create_element (name, cdata) {
159 var elem_node = document.createElement(name);
160 var text_node = document.createTextNode(cdata);
161 elem_node.appendChild(text_node);
167 function clear_cell (cell) {
168 while (cell.hasChildNodes())
169 cell.removeChild(cell.firstChild);
173 function append_text(cell, text) {
174 text_node = document.createTextNode(text);
175 cell.appendChild(text_node);
179 function assign_text (cell, text) {
181 append_text(cell, text);
184 function set_sort_opt(n, opt, str)
186 var txt = document.createTextNode(str);
191 var a = document.createElement('a');
193 a.setAttribute('href', "");
194 a.setAttribute('onclick', "set_sort('" + opt + "'); return false");
199 function set_sort(sort)
201 if (sort && sort != cur_sort)
208 var t = document.getElementById("sortselect");
210 t.appendChild(document.createTextNode("Sort results by: "));
211 set_sort_opt(t, 'relevance', 'Relevance');
212 t.appendChild(document.createTextNode(" or "));
213 set_sort_opt(t, 'title:1', 'Title');
216 function show_records()
218 if (xshow.readyState != 4)
221 var xml = xshow.responseXML;
222 var body = document.getElementById("body");
223 var hits = xml.getElementsByTagName("hit");
227 if (!hits[0]) // We should never get here with blocking operations
229 assign_text(body, 'No records yet');
230 searchtimer = setTimeout(check_search, 250);
234 var total = Number(xml.getElementsByTagName('total')[0].childNodes[0].nodeValue);
235 var merged = Number(xml.getElementsByTagName('merged')[0].childNodes[0].nodeValue);
236 var start = Number(xml.getElementsByTagName('start')[0].childNodes[0].nodeValue);
237 var num = Number(xml.getElementsByTagName('num')[0].childNodes[0].nodeValue);
238 var clients = Number(xml.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue);
239 var pager = make_pager(merged, start,recstoshow);
240 var break_node1 = document.createElement('br');
241 var break_node2 = document.createElement('br');
242 var record_container = document.createElement('div');
243 var interval = create_element('div', 'Records : ' + (start + 1) +
244 ' to ' + (start + num) + ' of ' +
245 merged + ' (total hits: ' +
248 interval.className = 'results';
249 record_container.className = 'records';
251 body.appendChild(pager);
252 body.appendChild(interval);
253 body.appendChild(break_node1);
254 body.appendChild(break_node2);
255 body.appendChild(record_container);
257 for (i = 0; i < hits.length; i++)
259 var tn = hits[i].getElementsByTagName("md-title");
261 var an = hits[i].getElementsByTagName("md-author");
263 var cn = hits[i].getElementsByTagName("count");
267 title = tn[0].childNodes[0].nodeValue;
271 if (an[0] && an[0].childNodes[0])
272 author = an[0].childNodes[0].nodeValue;
274 count = Number(cn[0].childNodes[0].nodeValue);
276 var record_div = document.createElement('div');
277 record_div.className = 'record';
279 var record_cell = create_element('a', title);
280 record_cell.setAttribute('href', '#');
281 record_div.appendChild(record_cell);
284 record_div.appendChild(document.createTextNode(', by '));
285 record_div.appendChild(document.createTextNode(author));
288 record_div.appendChild(document.createTextNode(
289 ' (' + count + ')'));
290 record_container.appendChild(record_div);
297 searchtimer = setTimeout(check_search, 1000);
299 searchtimer = setTimeout(check_search, 2000);
303 termtimer = setTimeout(check_termlist, 500);
306 function check_search()
308 clearTimeout(searchtimer);
309 var url = "search.pz2?" +
311 "&start=" + document.search.startrec.value +
312 "&num=" + recstoshow +
313 "&session=" + session +
314 "&sort=" + cur_sort +
316 xshow = GetXmlHttpObject();
317 xshow.onreadystatechange=show_records;
318 xshow.open("GET", url);
323 function refine_query (obj) {
324 var term = obj.getAttribute('term');
325 var cur_termlist = obj.getAttribute('facet');
326 var query_cell = document.getElementById('query');
328 term = term.replace(/[\(\)]/g, '');
330 if (cur_termlist == 'subject')
331 query_cell.value += ' and su=(' + term + ')';
332 else if (cur_termlist == 'author')
333 query_cell.value += ' and au=(' + term + ')';
340 function show_termlist()
342 if (xtermlist.readyState != 4)
346 var xml = xtermlist.responseXML;
347 var body = facet_list[cur_facet][1];
348 var facet_name = facet_list[cur_facet][0];
349 var hits = xml.getElementsByTagName("term");
351 Number(xml.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue);
355 if (cur_facet >= facet_list.length)
360 termtimer = setTimeout(check_termlist, 500);
366 for (i = 0; i < hits.length; i++)
368 var namen = hits[i].getElementsByTagName("name");
369 var freqn = hits[i].getElementsByTagName("frequency");
371 var term = namen[0].childNodes[0].nodeValue;
372 var freq = freqn[0].childNodes[0].nodeValue;
373 var refine_cell = create_element('a', term + ' (' + freq + ')');
374 refine_cell.setAttribute('href', '#');
375 refine_cell.setAttribute('term', term);
376 refine_cell.setAttribute('facet', facet_name);
377 refine_cell.onclick = function () {
381 body.appendChild(refine_cell);
385 termtimer = setTimeout(check_termlist, 1000);
389 function check_termlist()
391 var facet_name = facet_list[cur_facet][0];
392 var url = "search.pz2?" +
394 "&session=" + session +
395 "&name=" + facet_name;
396 xtermlist = GetXmlHttpObject();
397 xtermlist.onreadystatechange=show_termlist;
398 xtermlist.open("GET", url);
399 xtermlist.send(null);
404 if (xstat.readyState != 4)
407 var xml = xstat.responseXML;
408 var body = document.getElementById("stat");
409 var nodes = xml.childNodes[0].childNodes;
411 Number(xml.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue);
414 stattimer = setTimeout(check_stat, 500);
418 assign_text(body, '(');
419 for (i = 0; i < nodes.length; i++)
421 if (nodes[i].nodeType != 1)
423 var value = nodes[i].childNodes[0].nodeValue;
426 var name = nodes[i].nodeName;
427 append_text(body, ' ' + name + '=' + value);
430 append_text(body, ')');
432 stattimer = setTimeout(check_stat, 2000);
436 function check_stat()
438 var url = "search.pz2?" +
440 "&session=" + session;
441 xstat = GetXmlHttpObject();
442 xstat.onreadystatechange=show_stat;
443 xstat.open("GET", url);
447 function search_started()
449 if (xsearch.readyState != 4)
451 var xml = xsearch.responseXML;
452 var error = xml.getElementsByTagName("error");
455 var msg = error[0].childNodes[0].nodeValue;
460 stattimer = setTimeout(check_stat, 1000);
463 function start_search()
465 clearTimeout(termtimer);
467 clearTimeout(searchtimer);
469 clearTimeout(stattimer);
471 clearTimeout(showtimer);
473 var query = escape(document.getElementById('query').value);
474 var url = "search.pz2?" +
476 "&session=" + session +
478 xsearch = GetXmlHttpObject();
479 xsearch.onreadystatechange=search_started;
480 xsearch.open("GET", url);
482 clear_cell(document.getElementById("body"));
485 document.search.startrec.value = 0;
488 function session_encode ()
493 for (i = 0; i < session_cells.length; i++)
495 var name = session_cells[i];
496 var value = escape(document.getElementById(name).value);
497 session += '&' + name + '=' + value;
504 function session_restore (session)
506 var fields = session.split(/&/);
509 for (i = 1; i < fields.length; i++)
511 var pair = fields[i].split(/=/);
512 var key = pair.shift();
513 var value = pair.join('=');
514 var cell = document.getElementById(key);
522 function session_read ()
524 var ses = window.location.hash.replace(/^#/, '');
529 function session_store (new_value)
531 window.location.hash = '#' + new_value;
535 function update_history ()
537 var session = session_encode();
538 session_store(session);
539 old_session = session;
543 function session_check ()
545 var session = session_read();
546 var action = document.search.action_type.value;
548 clearInterval(url_surveillence);
550 if ( session != unescape(old_session) )
552 session_restore(session);
554 if (action == 'search') {
556 } else if (action == 'page') {
559 alert('Unregocnized action_type: ' + action);
564 url_surveillence = setInterval(session_check, 200);
568 function get_available_facets () {
569 var facet_container = document.getElementById('termlists');
570 var facet_cells = facet_container.childNodes;
571 var facets = Array();
574 for (i = 0; i < facet_cells.length; i++) {
575 var cell = facet_cells.item(i);
577 if (cell.className == 'facet') {
578 var facet_name = cell.id.replace(/^facet_([^_]+)_terms$/, "$1");
579 facets.push(Array(facet_name, cell));
587 function get_facet_container (obj) {
588 return document.getElementById(obj.id + '_terms');
592 function toggle_facet (obj) {
593 var container = get_facet_container(obj);
595 if (obj.className == 'selected') {
596 obj.className = 'unselected';
597 container.style.display = 'inline';
599 obj.className = 'selected';
600 container.style.display = 'none';