pzHttpRequest: added synchronous load() methd.
[pazpar2-moved-to-github.git] / js / pz2.js
index 0b2560b..9626b83 100644 (file)
--- a/js/pz2.js
+++ b/js/pz2.js
@@ -1,5 +1,5 @@
 /*
-** $Id: pz2.js,v 1.33 2007-06-05 15:19:25 jakub Exp $
+** $Id: pz2.js,v 1.44 2007-07-04 12:33:51 jakub Exp $
 ** pz2.js - pazpar2's javascript client library.
 */
 
@@ -30,20 +30,19 @@ 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;
-
+    __myself.useSessions = true;
+    if (paramArray.usesessions != undefined) {
+         __myself.useSessions = paramArray.usesessions;
+    }
+       
     //load stylesheet if required in async mode
     if( __myself.stylesheet ) {
         var request = new pzHttpRequest( __myself.stylesheet );
-        request.get(
-                {},
-                function ( doc ) {
-                    __myself.xslDoc = doc;
-                }
-        );
+        request.get( {}, function ( doc ) { __myself.xslDoc = doc; } );
     }
-
+       
     // at least one callback required
     if ( !paramArray )
         throw new Error("An array with parameters has to be suplied when instantiating a class");
@@ -109,35 +108,37 @@ var pz2 = function(paramArray) {
     if (paramArray.autoInit !== false)
         __myself.init();
 };
-pz2.prototype = {
-    stop: function ()
-    {
-        clearTimeout(__myself.statTimer);
-        clearTimeout(__myself.showTimer);
-        clearTimeout(__myself.termTimer);
-        clearTimeout(__myself.bytargetTimer);
+pz2.prototype = 
+{
+   stop: function ()
+   {
+       clearTimeout(__myself.statTimer);
+       clearTimeout(__myself.showTimer);
+       clearTimeout(__myself.termTimer);
+       clearTimeout(__myself.bytargetTimer);
     },
+    
     reset: function ()
     {
         __myself.sessionID = null;
         __myself.initStatusOK = false;
         __myself.pingStatusOK = false;
         __myself.searchStatusOK = false;
-        
+
         __myself.stop();
-               
+            
         if ( __myself.resetCallback )
                 __myself.resetCallback();
     },
     init: function ( sessionId ) 
     {
         __myself.reset();
+
         if ( sessionId != undefined ) {
             __myself.initStatusOK = true;
             __myself.sessionID = sessionId;
             __myself.ping();
-
-        } else {
+        } else if (__myself.useSessions) {
             var request = new pzHttpRequest(__myself.pz2String, __myself.errorHandler);
             request.get(
                 { "command": "init" },
@@ -155,7 +156,9 @@ pz2.prototype = {
                         setTimeout("__myself.init()", 1000);
                 }
             );
-        }
+        } else {
+            __myself.initStatusOK = true;
+       }
     },
     // no need to ping explicitly
     ping: function () 
@@ -198,10 +201,11 @@ 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, "session": __myself.sessionID };
+       
+        if (filter !== undefined)
+           searchParams["filter"] = filter;
+        
         var request = new pzHttpRequest(__myself.pz2String, __myself.errorHandler);
         request.get(
             searchParams,
@@ -342,24 +346,35 @@ pz2.prototype = {
             }
         );
     },
-    record: function(id)
+    record: function(id,offset)
     {
-        if( !__myself.searchStatusOK )
+        if( !__myself.searchStatusOK && __myself.useSessions)
             return;
 
         if( id !== undefined )
             __myself.currRecID = id;
         var request = new pzHttpRequest(__myself.pz2String, __myself.errorHandler);
+
+       var recordParams = { "command": "record", "session": __myself.sessionID, "id": __myself.currRecID };
+       if (offset !== undefined) {
+               recordParams["offset"] = offset;
+               recordParams["syntax"] = "usmarc";
+               recordParams["esn"] = "F";
+       }
+       __myself.currRecOffset = offset;
         request.get(
-            { "command": "record", "session": __myself.sessionID, "id": __myself.currRecID },
+           recordParams,
             function(data) {
                 var recordNode;
                 var record = new Array();
-                if ( recordNode = data.getElementsByTagName("record")[0] ) {
+                record['xmlDoc'] = data;
+               if (__myself.currRecOffset !== undefined) {
+                    record['offset'] = __myself.currRecOffset;
+                    __myself.recordCallback(record);
+                } else 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 {
                         for ( i = 0; i < recordNode.childNodes.length; i++) {
@@ -408,7 +423,7 @@ pz2.prototype = {
         clearTimeout(__myself.termTimer);
         var request = new pzHttpRequest(__myself.pz2String, __myself.errorHandler);
         request.get(
-            { "command": "termlist", "session": __myself.sessionID, "name": __myself.termKeys, "block": "1" },
+            { "command": "termlist", "session": __myself.sessionID, "name": __myself.termKeys },
             function(data) {
                 if ( data.getElementsByTagName("termlist") ) {
                     var activeClients = Number( data.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue );
@@ -520,6 +535,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();
@@ -536,26 +552,48 @@ pzHttpRequest.prototype =
 {
     get: function ( params, callback ) 
     {
-        this.callback = callback;
-        
-        var getUrl = this.url;
-        var paramArr = new Array();
+        this._send( 'GET', params, '', callback );
+    },
 
-        for ( var key in params ) {
-            paramArr.push(key + '=' + encodeURI(params[key]) );
-        }
+    post: function ( params, data, callback )
+    {
+        this._send( 'POST', params, data, callback );
+    },
 
-        if ( paramArr.length )
-            getUrl += '?' + paramArr.join('&');
+    load: function ()
+    {
+        this.async = false;
+        this.request.open( 'GET', this.url, this.async );
+        this.request.send('');
+        if ( this.request.status == 200 )
+            return this.request.responseXML;
+    },
 
+    _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.async = true;
+        this.request.open( type, this._urlAppendParams(params), this.async );
         this.request.onreadystatechange = function () {
             context._handleResponse();
         }
-        this.request.send(null);
+        this.request.send(data);
+    },
+
+    _urlAppendParams: function (params)
+    {
+        var getUrl = this.url;
+
+       var sep = '?';
+        var el = params;
+        for (var key in el) {
+            if (el[key] != null) {
+                getUrl += sep + key + '=' + encodeURI(el[key]);
+                sep = '&';
+            }
+        }
+        return getUrl;
     },
 
     _handleResponse: function ()
@@ -611,10 +649,6 @@ var pzQuery = function()
     this.filterNums = 0;
 };
 pzQuery.prototype = {
-    clearSimpleQuery: function()
-    {
-        this.simpleQuery = '';
-    },
     reset: function()
     {
         this.simpleQuery = '';
@@ -622,6 +656,10 @@ pzQuery.prototype = {
         this.simpleFilter = null;
         this.numTerms = 0;
     },
+    clearSimpleQuery: function()
+    {
+        this.simpleQuery = '';
+    },
     addTerm: function(field, value)
     {
         var term = {"field": field, "value": value};