Polling 'record' based on new 'activeclients' in pazpar2
[pazpar2-moved-to-github.git] / js / pz2.js
index dc95572..f290eec 100644 (file)
--- a/js/pz2.js
+++ b/js/pz2.js
@@ -98,6 +98,8 @@ var pz2 = function ( paramArray )
     this.showFastCount = 4;
     this.bytargetTime = paramArray.bytargettime || 1000;
     this.bytargetTimer = null;
+    this.recordTime = paramArray.recordtime || 500;
+    this.recordTimer = null;
 
     // counters for each command and applied delay
     this.dumpFactor = 500;
@@ -105,6 +107,7 @@ var pz2 = function ( paramArray )
     this.termCounter = 0;
     this.statCounter = 0;
     this.bytargetCounter = 0;
+    this.recordCounter = 0;
 
     // active clients, updated by stat and show
     // might be an issue since bytarget will poll accordingly
@@ -174,7 +177,7 @@ pz2.prototype =
         } else if (this.useSessions) {
             var context = this;
             var request = new pzHttpRequest(this.pz2String, this.errorHandler);
-            request.postParams(
+            request.safeGet(
                 { "command": "init" },
                 function(data) {
                     if ( data.getElementsByTagName("status")[0]
@@ -218,7 +221,7 @@ pz2.prototype =
             );
         var context = this;
         var request = new pzHttpRequest(this.pz2String, this.errorHandler);
-        request.postParams(
+        request.safeGet(
             { "command": "ping", "session": this.sessionID },
             function(data) {
                 if ( data.getElementsByTagName("status")[0]
@@ -237,7 +240,7 @@ pz2.prototype =
             }
         );
     },
-    search: function (query, num, sort, filter, showfrom)
+    search: function (query, num, sort, filter, showfrom, addParamsArr)
     {
         clearTimeout(this.statTimer);
         clearTimeout(this.showTimer);
@@ -271,10 +274,18 @@ pz2.prototype =
        
         if (filter !== undefined)
            searchParams["filter"] = filter;
+
+        // copy additional parmeters, do not overwrite
+        if (addParamsArr != undefined) {
+            for (var prop in addParamsArr) {
+                if (!searchParams.hasOwnProperty(prop))
+                    searchParams[prop] = addParamsArr[prop];
+            }
+        }
         
         var context = this;
         var request = new pzHttpRequest(this.pz2String, this.errorHandler);
-        request.postParams(
+        request.safeGet(
             searchParams,
             function(data) {
                 if ( data.getElementsByTagName("status")[0]
@@ -305,7 +316,7 @@ pz2.prototype =
         
         var context = this;
         var request = new pzHttpRequest(this.pz2String, this.errorHandler);
-        request.postParams(
+        request.safeGet(
             { "command": "stat", "session": this.sessionID },
             function(data) {
                 if ( data.getElementsByTagName("stat") ) {
@@ -383,7 +394,7 @@ pz2.prototype =
 
         var context = this;
         var request = new pzHttpRequest(this.pz2String, this.errorHandler);
-        request.postParams(
+        request.safeGet(
             { 
                 "command": "show", 
                 "session": this.sessionID, 
@@ -478,11 +489,11 @@ pz2.prototype =
         var context = this;
         var request = new pzHttpRequest(this.pz2String, this.errorHandler);
 
-        request.postParams(
+        request.safeGet(
            recordParams,
             function(data) {
                 var recordNode;
-                var record;
+                var record;                                
                 //raw record
                 if (context.currRecOffset !== null) {
                     record = new Array();
@@ -503,7 +514,21 @@ pz2.prototype =
                     //parse record
                     } else {
                         record = Element_parseChildNodes(recordNode);
-                    }                    
+                    }    
+                   var activeClients = 
+                      Number( data.getElementsByTagName("activeclients")[0]
+                               .childNodes[0].nodeValue );
+                   context.activeClients = activeClients; 
+                    context.recordCounter++;
+                    var delay = context.recordTime + context.recordCounter * context.dumpFactor;
+                    if ( activeClients > 0 )
+                        context.recordTimer = 
+                           setTimeout ( 
+                               function() {
+                                  context.record(id, offset, syntax, handler);
+                                  },
+                                  delay
+                               );                                    
                     callback(record, args);
                 }
                 else
@@ -525,7 +550,7 @@ pz2.prototype =
         
         var context = this;
         var request = new pzHttpRequest(this.pz2String, this.errorHandler);
-        request.postParams(
+        request.safeGet(
             { 
                 "command": "termlist", 
                 "session": this.sessionID, 
@@ -605,7 +630,7 @@ pz2.prototype =
         
         var context = this;
         var request = new pzHttpRequest(this.pz2String, this.errorHandler);
-        request.postParams(
+        request.safeGet(
             { "command": "bytarget", "session": this.sessionID },
             function(data) {
                 if ( data.getElementsByTagName("status")[0]
@@ -677,6 +702,7 @@ pz2.prototype =
 ********************************************************************************
 */
 var pzHttpRequest = function ( url, errorHandler ) {
+        this.maxUrlLength = 2048;
         this.request = null;
         this.url = url;
         this.errorHandler = errorHandler || null;
@@ -696,20 +722,29 @@ var pzHttpRequest = function ( url, errorHandler ) {
 
 pzHttpRequest.prototype = 
 {
-    postParams: function ( params, callback )
+    safeGet: function ( params, callback )
     {
-        this.requestHeaders["Content-Type"]="application/x-www-form-urlencoded";
-        this._send('POST', {}, this.encodeParams(params), callback);
+        var encodedParams =  this.encodeParams(params);
+        var url = this._urlAppendParams(encodedParams);
+        if (url.length >= this.maxUrlLength) {
+            this.requestHeaders["Content-Type"]
+                = "application/x-www-form-urlencoded";
+            this._send( 'POST', this.url, encodedParams, callback );
+        } else {
+            this._send( 'GET', url, '', callback );
+        }
     },
 
     get: function ( params, callback ) 
     {
-        this._send( 'GET', params, '', callback );
+        this._send( 'GET', this._urlAppendParams(this.encodeParams(params)), 
+            '', callback );
     },
 
     post: function ( params, data, callback )
     {
-        this._send( 'POST', params, data, callback );
+        this._send( 'POST', this._urlAppendParams(this.encodeParams(params)), 
+            data, callback );
     },
 
     load: function ()
@@ -734,12 +769,12 @@ pzHttpRequest.prototype =
         return encoded;
     },
 
-    _send: function ( type, params, data, callback )
+    _send: function ( type, url, data, callback)
     {
-        this.callback = callback;
         var context = this;
+        this.callback = callback;
         this.async = true;
-        this.request.open( type, this._urlAppendParams(params), this.async );
+        this.request.open( type, url, this.async );
         for (var key in this.requestHeaders)
             this.request.setRequestHeader(key, this.requestHeaders[key]);
         this.request.onreadystatechange = function () {
@@ -748,9 +783,8 @@ pzHttpRequest.prototype =
         this.request.send(data);
     },
 
-    _urlAppendParams: function (params)
+    _urlAppendParams: function (encodedParams)
     {
-        var encodedParams = this.encodeParams(params);
         if (encodedParams)
             return this.url + "?" + encodedParams;
         else
@@ -760,25 +794,17 @@ pzHttpRequest.prototype =
     _handleResponse: function ()
     {
         if ( this.request.readyState == 4 ) { 
-            // pick up pazpr2 errors first
-            if ( this.request.responseXML 
-                && this.request.responseXML.documentElement.nodeName == 'error'
-                && this.request.responseXML.getElementsByTagName("error")
-                    .length ) {
+            // pick up appplication errors first
+            var errNode = null;
+            if (this.request.responseXML &&
+                (errNode = this.request.responseXML.documentElement)
+                && errNode.nodeName == 'error') {
+                var errMsg = errNode.getAttribute("msg");
+                var errCode = errNode.getAttribute("code");
                 var errAddInfo = '';
-                if ( this.request.responseXML.getElementsByTagName("error")[0]
-                        .childNodes.length )
-                    errAddInfo = ': ' + 
-                        this.request.responseXML
-                            .getElementsByTagName("error")[0]
-                            .childNodes[0].nodeValue;
-                var errMsg = 
-                    this.request.responseXML.getElementsByTagName("error")[0]
-                        .getAttribute("msg");
-                var errCode = 
-                    this.request.responseXML.getElementsByTagName("error")[0]
-                        .getAttribute("code");
-            
+                if (errNode.childNodes.length)
+                    errAddInfo = ': ' + errNode.childNodes[0].nodeValue;
+                           
                 var err = new Error(errMsg + errAddInfo);
                 err.code = errCode;
            
@@ -788,13 +814,13 @@ pzHttpRequest.prototype =
                 else {
                     throw err;
                 }
-            } else if ( this.request.status == 200 ) {
-                this.callback( this.request.responseXML );
+            } else if (this.request.status == 200) {
+                this.callback(this.request.responseXML);
             } else {
-                var err = new Error("Pz2.js: HTTP request error (AJAX). Code: " 
-                            + this.request.status + " Info: " 
+                var err = new Error("HTTP response not OK: " 
+                            + this.request.status + " - " 
                             + this.request.statusText );
-                err.code = 'HTTP';
+                err.code = '00' + this.request.status;
                 
                 if (this.errorHandler) {
                     this.errorHandler(err);