Changed sscanf in urldecode to use more portable scan-spec.
[pazpar2-moved-to-github.git] / js / pz2.js
index 21990d0..6bad626 100644 (file)
--- a/js/pz2.js
+++ b/js/pz2.js
@@ -1,5 +1,5 @@
 /*
-** $Id: pz2.js,v 1.69 2008-02-14 12:20:24 jakub Exp $
+** $Id: pz2.js,v 1.70 2008-03-12 11:36:57 jakub Exp $
 ** pz2.js - pazpar2's javascript client library.
 */
 
@@ -174,7 +174,7 @@ pz2.prototype =
         } else if (this.useSessions) {
             var context = this;
             var request = new pzHttpRequest(this.pz2String, this.errorHandler);
-            request.get(
+            request.safeGet(
                 { "command": "init" },
                 function(data) {
                     if ( data.getElementsByTagName("status")[0]
@@ -218,7 +218,7 @@ pz2.prototype =
             );
         var context = this;
         var request = new pzHttpRequest(this.pz2String, this.errorHandler);
-        request.get(
+        request.safeGet(
             { "command": "ping", "session": this.sessionID },
             function(data) {
                 if ( data.getElementsByTagName("status")[0]
@@ -274,7 +274,7 @@ pz2.prototype =
         
         var context = this;
         var request = new pzHttpRequest(this.pz2String, this.errorHandler);
-        request.get(
+        request.safeGet(
             searchParams,
             function(data) {
                 if ( data.getElementsByTagName("status")[0]
@@ -305,7 +305,7 @@ pz2.prototype =
         
         var context = this;
         var request = new pzHttpRequest(this.pz2String, this.errorHandler);
-        request.get(
+        request.safeGet(
             { "command": "stat", "session": this.sessionID },
             function(data) {
                 if ( data.getElementsByTagName("stat") ) {
@@ -383,7 +383,7 @@ pz2.prototype =
 
         var context = this;
         var request = new pzHttpRequest(this.pz2String, this.errorHandler);
-        request.get(
+        request.safeGet(
             { 
                 "command": "show", 
                 "session": this.sessionID, 
@@ -478,7 +478,7 @@ pz2.prototype =
         var context = this;
         var request = new pzHttpRequest(this.pz2String, this.errorHandler);
 
-        request.get(
+        request.safeGet(
            recordParams,
             function(data) {
                 var recordNode;
@@ -525,7 +525,7 @@ pz2.prototype =
         
         var context = this;
         var request = new pzHttpRequest(this.pz2String, this.errorHandler);
-        request.get(
+        request.safeGet(
             { 
                 "command": "termlist", 
                 "session": this.sessionID, 
@@ -605,7 +605,7 @@ pz2.prototype =
         
         var context = this;
         var request = new pzHttpRequest(this.pz2String, this.errorHandler);
-        request.get(
+        request.safeGet(
             { "command": "bytarget", "session": this.sessionID },
             function(data) {
                 if ( data.getElementsByTagName("status")[0]
@@ -677,10 +677,12 @@ pz2.prototype =
 ********************************************************************************
 */
 var pzHttpRequest = function ( url, errorHandler ) {
+        this.maxUrlLength = 2048;
         this.request = null;
         this.url = url;
         this.errorHandler = errorHandler || null;
         this.async = true;
+        this.requestHeaders = {};
         
         if ( window.XMLHttpRequest ) {
             this.request = new XMLHttpRequest();
@@ -695,14 +697,29 @@ var pzHttpRequest = function ( url, errorHandler ) {
 
 pzHttpRequest.prototype = 
 {
+    safeGet: function ( 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 ()
@@ -714,31 +731,39 @@ pzHttpRequest.prototype =
             return this.request.responseXML;
     },
 
-    _send: function ( type, params, data, callback )
+    encodeParams: function (params)
+    {
+        var sep = "";
+        var encoded = "";
+        for (var key in params) {
+            if (params[key] != null) {
+                encoded += sep + key + '=' + encodeURIComponent(params[key]);
+                sep = '&';
+            }
+        }
+        return encoded;
+    },
+
+    _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 () {
             context._handleResponse();
         }
         this.request.send(data);
     },
 
-    _urlAppendParams: function (params)
+    _urlAppendParams: function (encodedParams)
     {
-        var getUrl = this.url;
-
-       var sep = '?';
-        var el = params;
-        for (var key in el) {
-            if (el[key] != null) {
-                getUrl += sep + key + '=' + encodeURIComponent(el[key]);
-                sep = '&';
-            }
-        }
-        return getUrl;
+        if (encodedParams)
+            return this.url + "?" + encodedParams;
+        else
+            return this.url;
     },
 
     _handleResponse: function ()
@@ -933,18 +958,16 @@ Element_parseChildNodes = function (node)
         }
     }
 
-    if (node.hasAttributes()) {
-        var attrs = node.attributes;
-        for (var i = 0; i < attrs.length; i++) {
-            var attrName = '@' + attrs[i].nodeName;
-            var attrValue = attrs[i].nodeValue;
-            parsed[attrName] = attrValue;
-        }
+    var attrs = node.attributes;
+    for (var i = 0; i < attrs.length; i++) {
+        var attrName = '@' + attrs[i].nodeName;
+        var attrValue = attrs[i].nodeValue;
+        parsed[attrName] = attrValue;
     }
 
     // if no nested elements, get text content
     if (node.hasChildNodes() && !hasChildElems) {
-        if (node.hasAttributes()) 
+        if (node.attributes.length) 
             parsed['textContent'] = node.firstChild.nodeValue;
         else
             parsed = node.firstChild.nodeValue;