Experimentally added display of database names after each hit
[pazpar2-moved-to-github.git] / www / masterkey / js / client.js
index 94c2193..d93de8d 100644 (file)
@@ -1,5 +1,5 @@
 /*
-** $Id: client.js,v 1.8 2007-04-02 08:41:51 jakub Exp $
+** $Id: client.js,v 1.17 2007-04-15 03:24:18 quinn Exp $
 ** MasterKey - pazpar2's javascript client .
 */
 
@@ -15,11 +15,8 @@ var my_paz = new pz2( { "onshow": my_onshow,
 /* some state variable */
 var currentSort = 'relevance';
 var currentResultsPerPage = 20;
-var currentQuery = null;
-var currentQueryArr = new Array();
 var currentPage = 0;
-var currentFilter = undefined;
-var currentFilterName = null;
+var curQuery = new pzQuery();
 
 var currentDetailedId = null;
 var currentDetailedData = null;
@@ -27,6 +24,8 @@ var currentDetailedData = null;
 var termStartup = true;
 var advancedOn = false;
 
+var showBriefLocations = true;
+
 /* wait until the DOM is ready and register basic handlers */
 $(document).ready( function() { 
                     document.search.onsubmit = onFormSubmitEventHandler;
@@ -54,12 +53,10 @@ $(document).ready( function() {
 
 /* search button event handler */
 function onFormSubmitEventHandler() {
-    if(!loadQueryFromForm())
-        return false;
+    loadQueryFromForm();
+    curQuery.clearFilter();
     fireSearch();
     drawBreadcrumb();
-    //hack for now
-    currentFilter = undefined;
     $('div.content').show();
     $("div.leftbar").show();
     return false;
@@ -103,7 +100,8 @@ function my_onshow(data)
         
         if( author ) {
             recBody.append('<i> by </i>');
-            $('<a name="author" class="recAuthor">'+author+'</a>\n').click(function(){ refine(this.name, this.firstChild.nodeValue) }).appendTo(recBody);
+            $('<a name="author" class="recAuthor">'+author+'</a>\n').click(function(){ 
+                            refine(this.name, this.firstChild.nodeValue) }).appendTo(recBody);
         }
 
         if( currentDetailedId == id ) {
@@ -111,9 +109,22 @@ function my_onshow(data)
             drawDetailedRec(detailBox);
         }
 
-        if( count > 1 ) {
-            recBody.append('<span> ('+count+')</span>');
-        }
+       if (showBriefLocations) {
+           var location = data.hits[i]['location'];
+           var l;
+           var list = '';
+           for (l in location) {
+               if (list)
+                   list += ', ';
+               list += location[l].name;
+           }
+           recBody.append('<span> ('+list+')</span>');
+       }
+       else {
+           if( count > 1 ) {
+               recBody.append('<span> ('+count+')</span>');
+           }
+       }
 
         recsBody.append('<div class="resultNum">'+(currentPage*currentResultsPerPage+i+1)+'.</a>');
         recsBody.append(recBody);
@@ -131,10 +142,10 @@ function my_onstat(data){}
 */
 function my_onterm(data)
 {
-    var termLists = $("#termlists");
-
     if(termStartup)
     {
+        var termLists = $("#termlists");
+        
         for(var key in data){
             if (key == "activeclients")
                 continue;
@@ -165,8 +176,7 @@ function my_onterm(data)
             for(var i = 0; i < data[key].length; i++)
             {
                 if (key == "xtargets"){
-                    var listItem = $('<a class="sub" name="xtarget" value="'+data[key][i].id+'">'+data[key][i].name
-                            /*+'<span> ('+data[key][i].freq+')</span>'*/+'</a>');
+                    var listItem = $('<a class="sub" name="xtarget" value="'+data[key][i].id+'">'+data[key][i].name +'<span> ('+data[key][i].freq+')</span>'+'</a>');
                     listItem.click(function(){ 
                         refine(this.name, this.attributes[0].nodeValue, this.firstChild.nodeValue) });
                     listItem.appendTo(listEntries);
@@ -187,12 +197,11 @@ function my_onterm(data)
             if (key == "activeclients")
                 continue;
             var listEntries = $('#term_'+key).children('.termEntries');
-            listEntries.empty()
+            if( data[key].length ) listEntries.empty();
 
             for(var i = 0; i < data[key].length; i++){
                 if (key == "xtargets"){
-                    var listItem = $('<a class="sub" name="xtarget" value="'+data[key][i].id+'">'+data[key][i].name
-                                /*+'<span> ('+data[key][i].freq+')</span>'*/+'</a>').click(function(){ 
+                    var listItem = $('<a class="sub" name="xtarget" value="'+data[key][i].id+'">'+data[key][i].name+'<span> ('+data[key][i].freq+')</span>'+'</a>').click(function(){ 
                                     refine(this.name, this.attributes[0].nodeValue, this.firstChild.nodeValue) });
                     listItem.appendTo(listEntries);
                 } else {
@@ -227,8 +236,13 @@ function my_onbytarget(data){}
 */
 function fireSearch()
 {
-    my_paz.search(currentQuery, currentResultsPerPage, currentSort, currentFilter);    
+    $('div.showing').empty().text('No records to show.');
+    $('div.pages').empty().html('&nbsp;');
     $('div.records').empty();
+    currentDetailedId = null;
+    if( !curQuery.totalLength() )
+        return false;
+    my_paz.search(curQuery.toCCL(), currentResultsPerPage, currentSort, curQuery.getFilterString() );
 }
 
 function toggleAdvanced()
@@ -243,6 +257,7 @@ function toggleAdvanced()
         $("div.advanced").show();
         advancedOn = true;
         $("#advanced").text("Simple search");
+        loadFormFieldsFromQuery();
     }
 }
 
@@ -251,22 +266,34 @@ function drawDetailedRec(detailBox)
     if( detailBox == undefined )
         detailBox = $('<div class="detail"></div>').appendTo($('#rec_'+currentDetailedId));
     
-    detailBox.append('Details:<hr/>');
     var detailTable = $('<table></table>');
-    var recDate = currentDetailedData["md-date"];
-    var recSubject = currentDetailedData["md-subject"];
     var recLocation = currentDetailedData["location"];
 
-    if( recDate )
-        detailTable.append('<tr><td class="item">Published:</td><td>'+recDate+'</td></tr>');
-    if( recSubject )
-        detailTable.append('<tr><td class="item">Subject:</td><td>'+recSubject+'</td></tr>');
-    if( recLocation )
-        detailTable.append('<tr><td class="item">Available at:</td><td>&nbsp;</td></tr>');
-
-    for(var i=0; i < recLocation.length; i++)
-    {
-        detailTable.append('<tr><td class="item">&nbsp;</td><td>'+recLocation[i].name+'</td></tr>');
+    var hdtarget;
+    if( recLocation ) {
+        hdtarget = $('<tr><td class="item">Available at:</td></tr>');
+       detailTable.append(hdtarget);
+
+       for(var i=0; i < recLocation.length; i++)
+       {
+           if (!hdtarget)
+               hdtarget = $('<tr><td class="item">&nbsp;</td></tr>').appendTo(detailTable);
+           var url = recLocation[i]["md-url"];
+           var description = recLocation[i]["md-description"];
+           hdtarget.append('<td><b>'+recLocation[i].name+'</b></td>');
+           if (url) {
+               var tline = $('<tr><td>&nbsp;</td></tr>');
+               var td = $('<td></td>').appendTo(tline);
+               var tlink = $('<a>Go to resource</a>');
+               tlink.attr('href', url);;
+               tlink.attr('target', '_blank');
+               tlink.appendTo(td);
+               detailTable.append(tline);
+           }
+           if (description)
+               detailTable.append($('<tr><td>&nbsp</td><td>'+description+'</td></tr>'));
+           hdtarget = undefined;
+       }
     }
 
     detailTable.appendTo(detailBox);
@@ -274,75 +301,53 @@ function drawDetailedRec(detailBox)
 
 function refine(field, value, opt)
 {
-    // for the time being
-    //if(!advancedOn)
-    //    toggleAdvanced();
-
     switch(field) {
-        case "author":  currentQueryArr.push('au="'+value+'"');
-                        if(document.search.author.value != '') document.search.author.value+='; ';
-                        document.search.author.value += value; break;
-
-        case "title":   currentQueryArr.push('ti="'+value+'"');
-                        //if(document.search.tile.value != '') document.search.title.value+='; ';
-                        //document.search.title.value += value; break;
-        
-        case "date":    currentQueryArr.push('date="'+value+'"');
-                        if(document.search.date.value != '') document.search.date.value+='; ';
-                        document.search.date.value += value; break;
-        
-        case "subject": currentQueryArr.push('su="'+value+'"');
-                        if(document.search.subject.value != '') document.search.subject.value+='; ';
-                        document.search.subject.value += value; break;
-        
-        case "xtarget": currentFilter = 'id='+value;
-                        currentFilterName = opt; break;
+        case "author":  curQuery.addTerm('au', value); break;
+        case "title":   curQuery.addTerm('ti', value); break;
+        case "date":    curQuery.addTerm('date', value); break;
+        case "subject": curQuery.addTerm('su', value); break;
+        case "xtarget": curQuery.setFilter(opt, value); break;
     }
 
+    if(advancedOn)
+        loadFormFieldsFromQuery();
+
     currentPage = 0;
-    currentQuery = currentQueryArr.join(' and ');
     drawBreadcrumb();
     fireSearch();
 }
 
 function loadQueryFromForm()
 {
-    query = new Array();
-    if( document.search.query.value !== '' ) query.push(document.search.query.value);
+    curQuery.reset();
+    curQuery.simpleQuery = document.search.query.value;
 
     if( advancedOn )
     {
-        var input;
-        if( (input = parseField(document.search.author.value, 'au')).length ) query = query.concat(input);
-        if( (input = parseField(document.search.title.value, 'ti')).length ) query = query.concat(input);
-        if( (input = parseField(document.search.date.value, 'date')).length ) query = query.concat(input);
-        if( (input = parseField(document.search.subject.value, 'su')).length ) query = query.concat(input);
-    }
-
-    if( query.length ) {
-        currentQueryArr = query;
-        currentQuery = query.join(" and ");
-        return true;
-    } else {
-        return false;
+        curQuery.addTermsFromList(document.search.author.value, 'au');
+        curQuery.addTermsFromList(document.search.title.value, 'ti');
+        curQuery.addTermsFromList(document.search.date.value, 'date');
+        curQuery.addTermsFromList(document.search.subject.value, 'su');
     }
 }
 
-function parseField(inputString, field)
+function loadFormFieldsFromQuery()
 {
-    var inputArr = inputString.split(';');
-    var outputArr = new Array();
-    for(var i=0; i < inputArr.length; i++){
-        if(inputArr[i].length < 3){
-            continue;
+    document.search.author.value = '';
+    document.search.title.value = '';
+    document.search.date.value = '';
+    document.search.subject.value = '';
+
+    for(var i = 0; i < curQuery.numTerms; i++)
+    {
+        switch( curQuery.getTermFieldByIdx(i) )
+        {
+            case "au": document.search.author.value += curQuery.getTermValueByIdx(i) + '; '; break;
+            case "ti": document.search.title.value += curQuery.getTermValueByIdx(i) + '; '; break;
+            case "date": document.search.date.value += curQuery.getTermValueByIdx(i) + '; '; break;
+            case "su": document.search.subject.value += curQuery.getTermValueByIdx(i) + '; '; break;
         }
-        outputArr.push(field+'="'+inputArr[i]+'"');
     }
-    //if( outputArr.length ){
-        return outputArr;//.join(" and ");
-    //}else {
-    //    return false;
-    //}
 }
 
 function drawPager(max, hits)
@@ -365,8 +370,13 @@ function drawPager(max, hits)
         pager.append('<a class="previous_inactive">Previous</a>');
 
     var numPages = Math.ceil(max / currentResultsPerPage);
+
+    var start = ( currentPage - 5 > 0 ? currentPage - 5 : 1 );
+    var stop =  ( start + 12 < numPages ? start + 12 : numPages );
+
+    if (start > 1) $('<span>... </span>').appendTo(pager);
     
-    for(var i = 1; i <= numPages; i++)
+    for(var i = start; i <= stop; i++)
     {
         if( i == (currentPage + 1) ){
            $('<a class="select">'+i+'</a>').appendTo(pager);
@@ -390,6 +400,8 @@ function drawPager(max, hits)
         pager.eq(1).append(plClone);
     }
 
+    if (stop < numPages) $('<span> ...</span>').appendTo(pager);
+
     if ( currentPage < (numPages-1) ){
         $('<a class="next_active">Next</a>').click(function() { my_paz.showNext(1); currentPage++; }).appendTo(pager.eq(0));
         $('<a class="next_active">Next</a>').click(function() { my_paz.showNext(1); currentPage++; }).appendTo(pager.eq(1));
@@ -403,16 +415,19 @@ function drawBreadcrumb()
     var bc = $("#breadcrumb");
     bc.empty();
     
-    if(currentFilter) $('<strong id="filter"><a>'+currentFilterName+'</a>: </strong>').click(function(){
-                                currentFilter = undefined; currentFilterName = null; refine();}).appendTo(bc);
+    if(curQuery.filterNums) $('<strong id="filter"><a>'+curQuery.getFilterName(0)+'</a>: </strong>').click(function() {
+                                curQuery.removeFilter(0);
+                                refine();
+                                }).appendTo(bc);
 
-    bc.append('<span>'+currentQueryArr[0]+'</span>');
+    bc.append('<span>'+curQuery.simpleQuery+'</span>');
 
-    for(var i = 1; i < currentQueryArr.length; i++){
+    for(var i = 0; i < curQuery.numTerms; i++){
         bc.append('<strong> + </strong>');
-        var bcLink = $('<a id="pos_'+i+'">'+
-                currentQueryArr[i].substring(currentQueryArr[i].indexOf('"') + 1, currentQueryArr[i].lastIndexOf('"'))
-                +'</a>').click(function() { currentQueryArr.splice(this.id.split('_')[1], 1);refine(); });
+        var bcLink = $('<a id="pos_'+i+'">'+curQuery.getTermValueByIdx(i)+'</a>').click(function() { 
+                                            curQuery.removeTermByIdx(this.id.split('_')[1]);
+                                            refine(); 
+                                            });
         bc.append(bcLink);
     }
 }