1 /* $Id: search.js,v 1.23 2007-01-15 04:34:29 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 mk = hits[i].getElementsByTagName("md-title");
263 field = mk[0].childNodes[0].nodeValue;
268 var record_cell = create_element('a', field);
269 record_cell.setAttribute('href', '#');
270 record_cell.className = 'record';
271 record_container.appendChild(record_cell);
278 searchtimer = setTimeout(check_search, 1000);
280 searchtimer = setTimeout(check_search, 2000);
284 termtimer = setTimeout(check_termlist, 500);
287 function check_search()
289 clearTimeout(searchtimer);
290 var url = "search.pz2?" +
292 "&start=" + document.search.startrec.value +
293 "&num=" + recstoshow +
294 "&session=" + session +
295 "&sort=" + cur_sort +
297 xshow = GetXmlHttpObject();
298 xshow.onreadystatechange=show_records;
299 xshow.open("GET", url);
304 function refine_query (obj) {
305 var term = obj.getAttribute('term');
306 var cur_termlist = obj.getAttribute('facet');
307 var query_cell = document.getElementById('query');
309 term = term.replace(/[\(\)]/g, '');
311 if (cur_termlist == 'subject')
312 query_cell.value += ' and su=(' + term + ')';
313 else if (cur_termlist == 'author')
314 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 facet_name = facet_list[cur_facet][0];
330 var hits = xml.getElementsByTagName("term");
332 Number(xml.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue);
336 if (cur_facet >= facet_list.length)
341 termtimer = setTimeout(check_termlist, 500);
347 for (i = 0; i < hits.length; i++)
349 var namen = hits[i].getElementsByTagName("name");
351 var term = namen[0].childNodes[0].nodeValue;
352 var refine_cell = create_element('a', term);
353 refine_cell.setAttribute('href', '#');
354 refine_cell.setAttribute('term', term);
355 refine_cell.setAttribute('facet', facet_name);
356 refine_cell.onclick = function () {
360 body.appendChild(refine_cell);
364 termtimer = setTimeout(check_termlist, 1000);
368 function check_termlist()
370 var facet_name = facet_list[cur_facet][0];
371 var url = "search.pz2?" +
373 "&session=" + session +
374 "&name=" + facet_name;
375 xtermlist = GetXmlHttpObject();
376 xtermlist.onreadystatechange=show_termlist;
377 xtermlist.open("GET", url);
378 xtermlist.send(null);
383 if (xstat.readyState != 4)
386 var xml = xstat.responseXML;
387 var body = document.getElementById("stat");
388 var nodes = xml.childNodes[0].childNodes;
390 Number(xml.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue);
393 stattimer = setTimeout(check_stat, 500);
397 assign_text(body, '(');
398 for (i = 0; i < nodes.length; i++)
400 if (nodes[i].nodeType != 1)
402 var value = nodes[i].childNodes[0].nodeValue;
405 var name = nodes[i].nodeName;
406 append_text(body, ' ' + name + '=' + value);
409 append_text(body, ')');
411 stattimer = setTimeout(check_stat, 2000);
415 function check_stat()
417 var url = "search.pz2?" +
419 "&session=" + session;
420 xstat = GetXmlHttpObject();
421 xstat.onreadystatechange=show_stat;
422 xstat.open("GET", url);
426 function search_started()
428 if (xsearch.readyState != 4)
430 var xml = xsearch.responseXML;
431 var error = xml.getElementsByTagName("error");
434 var msg = error[0].childNodes[0].nodeValue;
439 stattimer = setTimeout(check_stat, 1000);
442 function start_search()
444 clearTimeout(termtimer);
446 clearTimeout(searchtimer);
448 clearTimeout(stattimer);
450 clearTimeout(showtimer);
452 var query = escape(document.getElementById('query').value);
453 var url = "search.pz2?" +
455 "&session=" + session +
457 xsearch = GetXmlHttpObject();
458 xsearch.onreadystatechange=search_started;
459 xsearch.open("GET", url);
461 clear_cell(document.getElementById("body"));
464 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';