Allow predictable sessions PAZ-1030
[pazpar2-moved-to-github.git] / www / demo / search.js
index ee5e723..c856961 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: search.js,v 1.38 2007-01-17 17:24:44 quinn Exp $
+/* $Id: search.js,v 1.53 2007-04-11 02:11:29 quinn Exp $
  * ---------------------------------------------------
  * Javascript container
  */
@@ -28,6 +28,7 @@ var cur_sort = "relevance";
 var searched = 0;
 var cur_id = -1;
 var cur_rec = 0;
+var filter = '';
 
 function initialize ()
 {
@@ -154,8 +155,7 @@ function update_offset (offset) {
 
 function create_element (name, cdata) {
     var elem_node = document.createElement(name);
-    var text_node = document.createTextNode(cdata);
-    elem_node.appendChild(text_node);
+    elem_node.innerHTML = cdata;
 
     return elem_node;
 }
@@ -188,7 +188,8 @@ function set_sort_opt(n, opt, str)
        var a = document.createElement('a');
        a.appendChild(txt);
        a.setAttribute('href', "");
-       a.setAttribute('onclick', "set_sort('" + opt + "'); return false");
+       a.setAttribute('id', opt);
+       a.onclick = function() { set_sort(this.getAttribute('id')); return false; };
        n.appendChild(a);
     }
 }
@@ -224,6 +225,18 @@ function displayname(name)
        return 'Publisher';
     else if (name == 'md-url')
        return 'URL';
+    else if (name == 'md-title')
+       return '@';
+    else if (name == 'md-id')
+       return 'Local ID';
+    else if (name == 'md-description')
+       return 'Description';
+    else if (name == 'md-lccn')
+       return 'LCCN';
+    else if (name == 'recid')
+       return '@';
+    else if (name == 'location')
+       return '@';
     else
        return name;
 }
@@ -246,8 +259,8 @@ function  paint_details_tr(name, dn)
     var dname = displayname(name);
     var ln = create_element('b', dname);
     var tln = document.createElement('td');
-    tln.setAttribute('width', 70);
-    tln.setAttribute('valign', 'top');
+    tln.width = '90';
+    tln.vAlign = 'top';
     tln.appendChild(ln);
     var tr = document.createElement('tr');
     tr.appendChild(tln);
@@ -255,17 +268,20 @@ function  paint_details_tr(name, dn)
     return tr;
 }
 
-function paint_details(body, xml)
+function cleanurl(v)
 {
-    // This is some ugly display code. Replace with your own ting o'beauty
-    clear_cell(body);
-    //body.appendChild(document.createElement('br'));
-    var nodes = xml.childNodes[0].childNodes;
-    var i;
-    var table = document.createElement('table');
-    table.setAttribute('cellpadding', 2);
+    var v1 = v;
+    var v2 = v1.replace(/\?.*$/, "");
+    var v3 = v2.replace(/http:\/\//, "");
+    return v3;
+}
+
+function paint_data_elements(target, node)
+{
+    var nodes = node.childNodes;
     var dn = 0;
     var lastname = '';
+    var i;
     for (i = 0; i < nodes.length; i++)
     {
        if (nodes[i].nodeType != 1)
@@ -273,17 +289,23 @@ function paint_details(body, xml)
        var name = nodes[i].nodeName;
        if (name == 'recid' || name == 'md-title')
            continue;
-       if (name != lastname)
+       if (name != lastname && lastname != 'location') 
        {
            if (dn)
            {
                var tr = paint_details_tr(lastname, dn);
-               table.appendChild(tr);
+               target.appendChild(tr);
            }
            dn = document.createElement('td');
            lastname = name;
        }
-
+       if (name == 'location')
+       {
+           dn = document.createElement('td');
+           dn.appendChild(paint_subrecord(nodes[i]));
+           target.appendChild(paint_details_tr('Location', dn)); 
+           continue;
+       }
        if (!nodes[i].childNodes[0])
                continue;
        var value = nodes[i].childNodes[0].nodeValue;
@@ -293,29 +315,77 @@ function paint_details(body, xml)
        var nv;
        if (hyl)
        {
-           nv = create_element('a', value);
+           nv = create_element('a', cleanurl(value));
            if (hyl == 'URL')
            {
-               nv.setAttribute('href', value);
-               nv.setAttribute('target', '_blank');
+               nv.href = value;
+               nv.target = '_blank';
            }
            else
            {
-               nv.setAttribute('href', '#');
+               nv.href = '#';
                nv.setAttribute('term', value);
                nv.setAttribute('searchfield', hyl);
                nv.onclick = function() { hyperlink_search(this); return false; };
            }
        }
+       else if (name == 'md-lccn')
+       {
+           nv = document.createElement('span');
+           nv.appendChild(document.createTextNode(value + ' '));
+           var link = create_element('a', 'Show title in LoC');
+               link.setAttribute('target', '_blank');
+               link.setAttribute('href', 'http://catalog.loc.gov/cgi-bin/Pwebrecon.cgi?DB=local&CNT=10&CMD=10+records+per+page&CMD=lccn+' + value);
+           nv.appendChild(link);
+
+       }
+       else if (name == 'md-isbn')
+       {
+           nv = document.createElement('span');
+           nv.appendChild(document.createTextNode(value + ' '));
+           var link = create_element('a', 'search OpenWorldCat');
+               link.setAttribute('target', '_blank');
+               link.setAttribute('href', 'http://www.worldcat.org/search?q=isbn%3A' + value);
+           nv.appendChild(link);
+       }
        else
            nv = document.createTextNode(value);
        dn.appendChild(nv);
     }
-    if (dn)
+    if (dn && lastname != 'location')
     {
        var tr = paint_details_tr(lastname, dn);
-       table.appendChild(tr);
+       target.appendChild(tr);
     }
+}
+
+function paint_subrecord(node)
+{
+    var table = document.createElement('table');
+    var tbody = document.createElement('tbody');
+    var zurl = node.getAttribute('id');
+    var name = node.getAttribute('name');
+    var tr;
+    var td;
+    if (name)
+       td = create_element('td', name);
+    else
+       td = create_element('td', zurl);
+    tr = paint_details_tr('Source', td);
+    tbody.appendChild(tr);
+    paint_data_elements(tbody, node);
+    table.appendChild(tbody);
+    return table;
+}
+
+function paint_details(body, xml)
+{
+    clear_cell(body);
+    var table = document.createElement('table');
+    var tbody = document.createElement('tbody');
+    table.setAttribute('cellpadding', 2);
+    paint_data_elements(tbody, xml.childNodes[0]);
+    table.appendChild(tbody);
     body.appendChild(table);
     body.style.display = 'inline';
 }
@@ -361,7 +431,7 @@ function hyperlink_search(obj)
     var field = obj.getAttribute('searchfield');
     var term = obj.getAttribute('term');
     var queryfield  = document.getElementById('query');
-    queryfield.value = field + '=' + term;
+    queryfield.value = field + '="' + term + '"';
     start_search();
 }
 
@@ -432,7 +502,7 @@ function show_records()
            var count = 1;
            var idn = hits[i].getElementsByTagName("recid");
 
-           if (tn[0]) {
+           if (tn[0] && tn[0].childNodes[0]) {
                 title = tn[0].childNodes[0].nodeValue;
             } else {
                 title = 'N/A';
@@ -449,11 +519,13 @@ function show_records()
 
             var record_cell = create_element('a', title);
             record_cell.setAttribute('href', '#' + id);
-           record_cell.setAttribute('onclick', 'fetch_details(' + id + '); return false');
+           record_cell.setAttribute('id', id);
+           //record_cell.onclick = function() { fetch_details(this.getAttribute('id')); return false; }
+           record_cell.onclick = function() { fetch_details(this.getAttribute('id')); return false; };
             record_div.appendChild(record_cell);
            if (author)
            {
-               record_div.appendChild(document.createTextNode(', by '));
+               record_div.appendChild(document.createTextNode(' by '));
                var al = create_element('a', author);
                al.setAttribute('href', '#');
                al.setAttribute('term', author);
@@ -509,15 +581,18 @@ function refine_query (obj) {
     var term = obj.getAttribute('term');
     var cur_termlist = obj.getAttribute('facet');
     var query_cell = document.getElementById('query');
+    var id = obj.getAttribute('target_id');
     
     term = term.replace(/[\(\)]/g, '');
     
     if (cur_termlist == 'subject')
-       query_cell.value += ' and su=(' + term + ')';
+       query_cell.value += ' and su="' + term + '"';
     else if (cur_termlist == 'author')
-       query_cell.value += ' and au=(' + term + ')';
+       query_cell.value += ' and au="' + term + '"';
     else if (cur_termlist == 'date')
-       query_cell.value += ' and date=' + term;
+       query_cell.value += ' and date="' + term + '"';
+    else if (cur_termlist == 'xtargets')
+       filter ='pz:id=' +  id;
 
     start_search();
 }
@@ -553,18 +628,25 @@ function show_termlists()
        {
            var namen = terms[t].getElementsByTagName("name");
            var freqn = terms[t].getElementsByTagName("frequency");
+           var idn = terms[t].getElementsByTagName("id");
            if (namen[0])
+           {
                 var term = namen[0].childNodes[0].nodeValue;
                var freq = freqn[0].childNodes[0].nodeValue;
+               var id;
+               if (idn[0])
+                   id = idn[0].childNodes[0].nodeValue;
                 var refine_cell = create_element('a', term + ' (' + freq + ')');
                 refine_cell.setAttribute('href', '#');
                 refine_cell.setAttribute('term', term);
                 refine_cell.setAttribute('facet', listname);
+               refine_cell.setAttribute('target_id', id);
                 refine_cell.onclick = function () {
                     refine_query(this);
                     return false;
                 };
                 body.appendChild(refine_cell);
+           }
        }
     }
     if (clients > 0)
@@ -651,6 +733,11 @@ function search_started()
     stattimer = setTimeout(check_stat, 1000);
 }
 
+function clear_filter()
+{
+    filter = '';
+}
+
 function start_search()
 {
     clearTimeout(termtimer);
@@ -667,7 +754,8 @@ function start_search()
     var url = "search.pz2?" +
         "command=search" +
        "&session=" + session +
-       "&query=" + query;
+       "&query=" + query +
+       "&filter=" + escape(filter);
     xsearch = GetXmlHttpObject();
     xsearch.onreadystatechange=search_started;
     xsearch.open("GET", url);