Method pzHttpRequest.{get,post} takes URL params as array of object rather
[pazpar2-moved-to-github.git] / js / pz2.js
index cb5a0e7..c4b2431 100644 (file)
--- a/js/pz2.js
+++ b/js/pz2.js
@@ -1,5 +1,5 @@
 /*
-** $Id: pz2.js,v 1.27 2007-06-01 08:25:53 jakub Exp $
+** $Id: pz2.js,v 1.38 2007-06-21 14:05:41 adam Exp $
 ** pz2.js - pazpar2's javascript client library.
 */
 
@@ -30,14 +30,14 @@ var pz2 = function(paramArray) {
 
     //supported pazpar2's protocol version
     __myself.suppProtoVer = '1';
-    __myself.pz2String = "search.pz2";
+    __myself.pz2String = paramArray.pazpar2path || "search.pz2";
     __myself.stylesheet = paramArray.detailstylesheet || null;
 
     //load stylesheet if required in async mode
     if( __myself.stylesheet ) {
         var request = new pzHttpRequest( __myself.stylesheet );
         request.get(
-                {},
+                [],
                 function ( doc ) {
                     __myself.xslDoc = doc;
                 }
@@ -109,7 +109,16 @@ var pz2 = function(paramArray) {
     if (paramArray.autoInit !== false)
         __myself.init();
 };
-pz2.prototype = {
+pz2.prototype = 
+{
+   stop: function ()
+   {
+       clearTimeout(__myself.statTimer);
+       clearTimeout(__myself.showTimer);
+       clearTimeout(__myself.termTimer);
+       clearTimeout(__myself.bytargetTimer);
+    },
+    
     reset: function ()
     {
         __myself.sessionID = null;
@@ -117,10 +126,7 @@ pz2.prototype = {
         __myself.pingStatusOK = false;
         __myself.searchStatusOK = false;
 
-        clearTimeout(__myself.statTimer);
-        clearTimeout(__myself.showTimer);
-        clearTimeout(__myself.termTimer);
-        clearTimeout(__myself.bytargetTimer);
+        __myself.stop();
             
         if ( __myself.resetCallback )
                 __myself.resetCallback();
@@ -136,7 +142,7 @@ pz2.prototype = {
         } else {
             var request = new pzHttpRequest(__myself.pz2String, __myself.errorHandler);
             request.get(
-                { "command": "init" },
+                [ { "command": "init" } ],
                 function(data) {
                     if ( data.getElementsByTagName("status")[0].childNodes[0].nodeValue == "OK" ) {
                         if ( data.getElementsByTagName("protocol")[0].childNodes[0].nodeValue != __myself.suppProtoVer )
@@ -161,7 +167,7 @@ pz2.prototype = {
             // session is not initialized code here
         var request = new pzHttpRequest(__myself.pz2String, __myself.errorHandler);
         request.get(
-            { "command": "ping", "session": __myself.sessionID },
+            [ { "command": "ping", "session": __myself.sessionID } ],
             function(data) {
                 if ( data.getElementsByTagName("status")[0].childNodes[0].nodeValue == "OK" ) {
                     __myself.pingStatusOK = true;
@@ -194,10 +200,10 @@ pz2.prototype = {
         else
             throw new Error("You need to supply query to the search command");
 
-        if( filter !== undefined )
-            var searchParams = { "command": "search", "session": __myself.sessionID, "query": __myself.currQuery, "filter": filter };
-        else
-            var searchParams = { "command": "search", "session": __myself.sessionID, "query": __myself.currQuery };
+       var searchParams = [{ "command": "search", "query": __myself.currQuery }];
+       searchParams.push({"session":__myself.sessionID});
+       if (filter !== undefined)
+           searchParams.push({"filter": filter});
         var request = new pzHttpRequest(__myself.pz2String, __myself.errorHandler);
         request.get(
             searchParams,
@@ -231,7 +237,7 @@ pz2.prototype = {
         clearTimeout(__myself.statTimer);
         var request = new pzHttpRequest(__myself.pz2String, __myself.errorHandler);
         request.get(
-            { "command": "stat", "session": __myself.sessionID },
+            [ { "command": "stat", "session": __myself.sessionID } ],
             function(data) {
                 if ( data.getElementsByTagName("stat") ) {
                     var activeClients = Number( data.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue );
@@ -279,8 +285,8 @@ pz2.prototype = {
         var request = new pzHttpRequest(__myself.pz2String, __myself.errorHandler);
         var context = this;
         request.get(
-            { "command": "show", "session": __myself.sessionID, "start": __myself.currentStart,
-              "num": __myself.currentNum, "sort": __myself.currentSort, "block": 1 },
+            [ { "command": "show", "session": __myself.sessionID, "start": __myself.currentStart,
+              "num": __myself.currentNum, "sort": __myself.currentSort, "block": 1 } ],
             function(data) {
                 if ( data.getElementsByTagName("status")[0].childNodes[0].nodeValue == "OK" ) {
                     // first parse the status data send along with records
@@ -314,7 +320,9 @@ pz2.prototype = {
                                }
                                else {
                                    var nodeName = hits[i].childNodes[j].nodeName;
-                                    var nodeText = hits[i].childNodes[j].firstChild.nodeValue;
+                                    var nodeText = 'ERROR'
+                                    if ( hits[i].childNodes[j].firstChild )
+                                        nodeText = hits[i].childNodes[j].firstChild.nodeValue;
                                    show.hits[i][nodeName] = nodeText;
                                }
                             }
@@ -345,13 +353,14 @@ pz2.prototype = {
             __myself.currRecID = id;
         var request = new pzHttpRequest(__myself.pz2String, __myself.errorHandler);
         request.get(
-            { "command": "record", "session": __myself.sessionID, "id": __myself.currRecID },
+            [ { "command": "record", "session": __myself.sessionID, "id": __myself.currRecID } ],
             function(data) {
                 var recordNode;
                 var record = new Array();
                 if ( recordNode = data.getElementsByTagName("record")[0] ) {
                     // if stylesheet was fetched do not parse the response
                     if ( __myself.xslDoc ) {
+                        record['recid'] = recordNode.getElementsByTagName("recid")[0].firstChild.nodeValue;
                         record['xmlDoc'] = data;
                         record['xslDoc'] = __myself.xslDoc;
                     } else {
@@ -401,7 +410,7 @@ pz2.prototype = {
         clearTimeout(__myself.termTimer);
         var request = new pzHttpRequest(__myself.pz2String, __myself.errorHandler);
         request.get(
-            { "command": "termlist", "session": __myself.sessionID, "name": __myself.termKeys },
+            [ { "command": "termlist", "session": __myself.sessionID, "name": __myself.termKeys } ],
             function(data) {
                 if ( data.getElementsByTagName("termlist") ) {
                     var activeClients = Number( data.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue );
@@ -416,8 +425,10 @@ pz2.prototype = {
                         //for each term in the list
                         for (j = 0; j < terms.length; j++) { 
                             var term = {
-                                "name": terms[j].getElementsByTagName("name")[0].childNodes[0].nodeValue,
-                                "freq": terms[j].getElementsByTagName("frequency")[0].childNodes[0].nodeValue
+                                "name": (terms[j].getElementsByTagName("name")[0].childNodes.length 
+                                                ? terms[j].getElementsByTagName("name")[0].childNodes[0].nodeValue
+                                                : 'ERROR'),
+                                "freq": terms[j].getElementsByTagName("frequency")[0].childNodes[0].nodeValue || 'ERROR'
                             };
 
                             var termIdNode = terms[j].getElementsByTagName("id");
@@ -451,7 +462,7 @@ pz2.prototype = {
         clearTimeout(__myself.bytargetTimer);
         var request = new pzHttpRequest(__myself.pz2String, __myself.errorHandler);
         request.get(
-            { "command": "bytarget", "session": __myself.sessionID },
+            [ { "command": "bytarget", "session": __myself.sessionID } ],
             function(data) {
                 if ( data.getElementsByTagName("status")[0].childNodes[0].nodeValue == "OK" ) {
                     var targetNodes = data.getElementsByTagName("target");
@@ -511,6 +522,7 @@ var pzHttpRequest = function ( url, errorHandler ) {
         this.request = null;
         this.url = url;
         this.errorHandler = errorHandler || null;
+        this.async = true;
         
         if ( window.XMLHttpRequest ) {
             this.request = new XMLHttpRequest();
@@ -527,26 +539,39 @@ pzHttpRequest.prototype =
 {
     get: function ( params, callback ) 
     {
-        this.callback = callback;
-        
-        var getUrl = this.url;
-        var paramArr = new Array();
-
-        for ( var key in params ) {
-            paramArr.push(key + '=' + params[key] );
-        }
+        this._send( 'GET', params, null, callback );
+    },
 
-        if ( paramArr.length )
-            getUrl += '?' + paramArr.join('&');
+    post: function ( params, data, callback )
+    {
+        this._send( 'POST', params, data, callback );
+    },
 
+    _send: function ( type, params, data, callback )
+    {
+        this.callback = callback;
         var context = this;
-        this.request.open( 'GET', getUrl, true );
-        this.request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
-        //this.request.setRequestHeader('Accept-Charset', 'UTF-8');
+        this.request.open( type, this._urlAppendParams(params), this.async );
+        //this.request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
         this.request.onreadystatechange = function () {
             context._handleResponse();
         }
-        this.request.send(null);
+        this.request.send(data);
+    },
+
+    _urlAppendParams: function (params)
+    {
+        var getUrl = this.url;
+
+       var sep = '?';
+       for (var i = 0; i < params.length; i++) {
+           var el = params[i];
+           for (var key in el) {
+               getUrl += sep + key + '=' + encodeURI(el[key]);
+               sep = '&';
+           }
+       }
+        return getUrl;
     },
 
     _handleResponse: function ()
@@ -609,6 +634,10 @@ pzQuery.prototype = {
         this.simpleFilter = null;
         this.numTerms = 0;
     },
+    clearSimpleQuery: function()
+    {
+        this.simpleQuery = '';
+    },
     addTerm: function(field, value)
     {
         var term = {"field": field, "value": value};