tuscany-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jsdelf...@apache.org
Subject svn commit: r1053824 - /tuscany/sca-cpp/trunk/modules/js/htdocs/component.js
Date Thu, 30 Dec 2010 08:52:52 GMT
Author: jsdelfino
Date: Thu Dec 30 08:52:51 2010
New Revision: 1053824

URL: http://svn.apache.org/viewvc?rev=1053824&view=rev
Log:
Simplify and cleanup HTTP binding client Javascript code, now portable across browsers.

Modified:
    tuscany/sca-cpp/trunk/modules/js/htdocs/component.js

Modified: tuscany/sca-cpp/trunk/modules/js/htdocs/component.js
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/js/htdocs/component.js?rev=1053824&r1=1053823&r2=1053824&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/js/htdocs/component.js (original)
+++ tuscany/sca-cpp/trunk/modules/js/htdocs/component.js Thu Dec 30 08:52:51 2010
@@ -38,37 +38,31 @@ var JSONClient = new Object();
 
 JSONClient.escapeJSONChar = function(c) {
     if(c == "\"" || c == "\\") return "\\" + c;
-    else if (c == "\b") return "\\b";
-    else if (c == "\f") return "\\f";
-    else if (c == "\n") return "\\n";
-    else if (c == "\r") return "\\r";
-    else if (c == "\t") return "\\t";
+    if (c == "\b") return "\\b";
+    if (c == "\f") return "\\f";
+    if (c == "\n") return "\\n";
+    if (c == "\r") return "\\r";
+    if (c == "\t") return "\\t";
     var hex = c.charCodeAt(0).toString(16);
     if(hex.length == 1) return "\\u000" + hex;
-    else if(hex.length == 2) return "\\u00" + hex;
-    else if(hex.length == 3) return "\\u0" + hex;
-    else return "\\u" + hex;
+    if(hex.length == 2) return "\\u00" + hex;
+    if(hex.length == 3) return "\\u0" + hex;
+    return "\\u" + hex;
 };
 
 /**
  * Encode a string into JSON format.
  */
 JSONClient.escapeJSONString = function(s) {
-    /* The following should suffice but Safari's regex is broken
-       (doesn't support callback substitutions)
-       return "\"" + s.replace(/([^\u0020-\u007f]|[\\\"])/g,
-       JSONClient.escapeJSONChar) + "\"";
-    */
+    // The following should suffice but Safari's regex is broken (doesn't support callback
substitutions)
+    // return "\"" + s.replace(/([^\u0020-\u007f]|[\\\"])/g, JSONClient.escapeJSONChar) +
"\"";
 
-    /* Rather inefficient way to do it */
+    // Rather inefficient way to do it
     var parts = s.split("");
     for(var i = 0; i < parts.length; i++) {
-    var c = parts[i];
-    if(c == '"' ||
-       c == '\\' ||
-       c.charCodeAt(0) < 32 ||
-       c.charCodeAt(0) >= 128)
-        parts[i] = JSONClient.escapeJSONChar(parts[i]);
+        var c = parts[i];
+        if(c == '"' || c == '\\' || c.charCodeAt(0) < 32 || c.charCodeAt(0) >= 128)
+            parts[i] = JSONClient.escapeJSONChar(parts[i]);
     }
     return "\"" + parts.join("") + "\"";
 };
@@ -77,29 +71,32 @@ JSONClient.escapeJSONString = function(s
  * Marshall objects to JSON format.
  */
 JSONClient.toJSON = function(o) {
-    if(o == null) {
+    if(o == null)
         return "null";
-    } else if(o.constructor == String) {
+    if(o.constructor == String)
         return JSONClient.escapeJSONString(o);
-    } else if(o.constructor == Number) {
+    if(o.constructor == Number)
         return o.toString();
-    } else if(o.constructor == Boolean) {
+    if(o.constructor == Boolean)
         return o.toString();
-    } else if(o.constructor == Date) {
+    if(o.constructor == Date)
         return '{javaClass: "java.util.Date", time: ' + o.valueOf() +'}';
-    } else if(o.constructor == Array) {
+    if(o.constructor == Array) {
         var v = [];
-        for(var i = 0; i < o.length; i++) v.push(JSONClient.toJSON(o[i]));
+        for(var i = 0; i < o.length; i++)
+            v.push(JSONClient.toJSON(o[i]));
         return "[" + v.join(", ") + "]";
-    } else {
-        var v = [];
-        for(attr in o) {
-            if(o[attr] == null) v.push("\"" + attr + "\": null");
-            else if(typeof o[attr] == "function"); /* skip */
-            else v.push(JSONClient.escapeJSONString(attr) + ": " + JSONClient.toJSON(o[attr]));
-        }
-        return "{" + v.join(", ") + "}";
     }
+    var v = [];
+    for(attr in o) {
+        if(o[attr] == null)
+            v.push("\"" + attr + "\": null");
+        else if(typeof o[attr] == "function")
+            ; // Skip
+        else
+            v.push(JSONClient.escapeJSONString(attr) + ": " + JSONClient.toJSON(o[attr]));
+    }
+    return "{" + v.join(", ") + "}";
 };
 
 /**
@@ -108,411 +105,346 @@ JSONClient.toJSON = function(o) {
 function HTTPBindingClient(cname, uri, objectID) {
     this.uri = "/references/" + cname + "/" + uri;
     this.objectID = objectID;
-    this.apply = this._createApplyMethod();
-
-    if (typeof DOMParser == "undefined") {
-       DOMParser = function () {}
-    
-       DOMParser.prototype.parseFromString = function (str, contentType) {
-          if (typeof ActiveXObject != "undefined") {
-             var d = new ActiveXObject("MSXML.DomDocument");
-             d.loadXML(str);
-             return d;
-          } else if (typeof XMLHttpRequest != "undefined") {
-             var req = new XMLHttpRequest;
-             req.open("GET", "data:" + (contentType || "application/xml") +
-                             ";charset=utf-8," + encodeURIComponent(str), false);
-             if (req.overrideMimeType) {
-                req.overrideMimeType(contentType);
-             }
-             req.send(null);
-             return req.responseXML;
-          }
-       }
-    }
+    this.apply = this.createApplyMethod();
 }
 
 /**
- * HTTPBindingClient.Exception.
- */
-HTTPBindingClient.Exception = function(code, message, javaStack) {
-    this.code = code;
-    var name;
-    if(javaStack) {
-        this.javaStack = javaStack;
-        var m = javaStack.match(/^([^:]*)/);
-        if(m) name = m[0];
-    }
-    if(name) this.name = name;
-    else this.name = "HTTPBindingClientException";
-    this.message = message;
-};
-
-HTTPBindingClient.Exception.CODE_REMOTE_EXCEPTION = 490;
-HTTPBindingClient.Exception.CODE_ERR_CLIENT = 550;
-HTTPBindingClient.Exception.CODE_ERR_PARSE = 590;
-HTTPBindingClient.Exception.CODE_ERR_NOMETHOD = 591;
-HTTPBindingClient.Exception.CODE_ERR_UNMARSHALL = 592;
-HTTPBindingClient.Exception.CODE_ERR_MARSHALL = 593;
-
-HTTPBindingClient.Exception.prototype = new Error();
-HTTPBindingClient.Exception.prototype.toString = function(code, msg) {
-    return this.name + ": " + this.message;
-};
-
-/**
- * Default top level exception handler.
+ * JSON-RPC request counter.
  */
-HTTPBindingClient.default_ex_handler = function(e) {
-    alert(e);
-};
+HTTPBindingClient.jsonrpcID = 1;
 
 /**
- * Client settable variables
+ * HTTPBindingClient implementation
  */
-HTTPBindingClient.toplevel_ex_handler = HTTPBindingClient.default_ex_handler;
-HTTPBindingClient.profile_async = false;
-HTTPBindingClient.max_req_active = 1;
-HTTPBindingClient.requestId = 1;
 
 /**
- * HTTPBindingClient implementation
+ * Generate client proxy apply method.
  */
-HTTPBindingClient.prototype._createApplyMethod = function() {
+HTTPBindingClient.prototype.createApplyMethod = function() {
     var fn = function() {
-        var args = [];
-        var callback = null;
         var methodName = arguments[0];
-        for(var i = 1; i < arguments.length; i++) args.push(arguments[i]);
+        var args = [];
+        for(var i = 1; i < arguments.length; i++)
+            args.push(arguments[i]);
 
-        if(typeof args[args.length - 1] == "function") callback = args.pop();
+        var cb = null;
+        if (typeof args[args.length - 1] == "function")
+            cb = args.pop();
 
-        var req = fn.client._makeRequest.call(fn.client, methodName, args, callback);
-        if(callback == null) {
-            return fn.client._sendRequest.call(fn.client, req);
-        } else {
-            HTTPBindingClient.async_requests.push(req);
-            HTTPBindingClient.kick_async();
-            return req.requestId;
-        }
+        var req = HTTPBindingClient.makeJSONRequest(methodName, args, cb);
+        return fn.client.jsonApply(req);
     };
     fn.client = this;
     return fn;
 };
 
-HTTPBindingClient._getCharsetFromHeaders = function(http) {
-    try {
-        var contentType = http.getResponseHeader("Content-type");
-        var parts = contentType.split(/\s*;\s*/);
-        for(var i = 0; i < parts.length; i++) {
-            if(parts[i].substring(0, 8) == "charset=")
-                return parts[i].substring(8, parts[i].length);
-        }
-    } catch (e) {}
-    return "UTF-8";
+/**
+ * Make a JSON-RPC request.
+ */
+HTTPBindingClient.makeJSONRequest = function(methodName, args, cb) {
+    var req = {};
+    req.id = HTTPBindingClient.jsonrpcID++;
+    if (cb)
+        req.cb = cb;
+    var obj = {};
+    obj.id = req.id;
+    obj.method = methodName;
+    obj.params = args;
+    req.data = JSONClient.toJSON(obj);
+    return req;
 };
 
 /**
- * Async queue globals
+ * Return the JSON result from an XMLHttpRequest.
  */
-HTTPBindingClient.async_requests = [];
-HTTPBindingClient.async_inflight = {};
-HTTPBindingClient.async_responses = [];
-HTTPBindingClient.async_timeout = null;
-HTTPBindingClient.num_req_active = 0;
-
-HTTPBindingClient._async_handler = function() {
-    HTTPBindingClient.async_timeout = null;
-
-    while(HTTPBindingClient.async_responses.length > 0) {
-        var res = HTTPBindingClient.async_responses.shift();
-        if(res.canceled) continue;
-        if(res.profile) res.profile.dispatch = new Date();
+HTTPBindingClient.jsonResult = function(http) {
+    // Get the charset
+    function httpCharset(http) {
         try {
-            res.cb(res.result, res.ex, res.profile);
-        } catch(e) {
-            HTTPBindingClient.toplevel_ex_handler(e);
-        }
+            var contentType = http.getResponseHeader("Content-type");
+            var parts = contentType.split(/\s*;\s*/);
+            for (var i = 0; i < parts.length; i++) {
+                if (parts[i].substring(0, 8) == "charset=")
+                    return parts[i].substring(8, parts[i].length);
+            }
+        } catch (e) {}
+        return "UTF-8";
     }
+    if(!HTTPBindingClient.charset)
+        HTTPBindingClient.charset = httpCharset(http);
 
-    while(HTTPBindingClient.async_requests.length > 0 && HTTPBindingClient.num_req_active
< HTTPBindingClient.max_req_active) {
-        var req = HTTPBindingClient.async_requests.shift();
-        if(req.canceled) continue;
-        req.client._sendRequest.call(req.client, req);
-    }
-};
-
-HTTPBindingClient.kick_async = function() {
-    if(HTTPBindingClient.async_timeout == null)
-        HTTPBindingClient.async_timeout = setTimeout(HTTPBindingClient._async_handler, 0);
+    // Unmarshall the JSON response
+    var data = http.responseText;
+    var obj;
+    eval("obj = " + data);
+    if(obj.error)
+        throw new HTTPBindingClient.Exception(obj.error.code, obj.error.msg);
+    var res = obj.result;
+    return res;
 };
 
-HTTPBindingClient.cancelRequest = function(requestId) {
-    /* If it is in flight then mark it as canceled in the inflight map
-       and the XMLHttpRequest callback will discard the reply. */
-    if(HTTPBindingClient.async_inflight[requestId]) {
-        HTTPBindingClient.async_inflight[requestId].canceled = true;
-        return true;
-    }
+/**
+ * Apply a function remotely using JSON-RPC.
+ */
+HTTPBindingClient.prototype.jsonApply = function(req) {
+    // Connect to the service
+    var http = HTTPBindingClient.getHTTPRequest();
+    var hascb = req.cb? true : false;
+    http.open("POST", this.uri, hascb);
+    http.setRequestHeader("Content-type", "application/json-rpc");
 
-    /* If its not in flight yet then we can just mark it as canceled in
-       the the request queue and it will get discarded before being sent. */
-    for(var i in HTTPBindingClient.async_requests) {
-        if(HTTPBindingClient.async_requests[i].requestId == requestId) {
-            HTTPBindingClient.async_requests[i].canceled = true;
-            return true;
-        }
-    }
+    // Construct call back if we have one
+    if(hascb) {
+        http.onreadystatechange = function() {
+            if(http.readyState == 4) {
+                // Pass the result or exception
+                if(http.status == 200) {
+                    var res = null;
+                    try {
+                        res = HTTPBindingClient.jsonResult(http);
+                    } catch(e) {
+                        req.cb(null, e);
+                    }
+                    req.cb(res);
+                } else
+                    req.cb(null, HTTPBindingClient.Exception(http.status, http.statusText));
+            }
+        };
 
-    /* It may have returned from the network and be waiting for its callback
-       to be dispatched, so mark it as canceled in the response queue
-       and the response will get discarded before calling the callback. */
-    for(var i in HTTPBindingClient.async_responses) {
-        if(HTTPBindingClient.async_responses[i].requestId == requestId) {
-            HTTPBindingClient.async_responses[i].canceled = true;
-            return true;
-        }
+        // Send the request
+        http.send(req.data);
+        return req.id;
     }
 
-    return false;
+    // Send the request and return the result or exception
+    http.send(req.data);
+    if (http.status == 200)
+        return HTTPBindingClient.jsonResult(http);
+    throw new HTTPBindingClient.Exception(http.status, http.statusText);
 };
 
-HTTPBindingClient.prototype._makeRequest = function(methodName, args, cb) {
-    var req = {};
-    req.client = this;
-    req.requestId = HTTPBindingClient.requestId++;
-
-    var obj = {};
-    obj.id = req.requestId;
-    if (this.objectID)
-        obj.method = ".obj#" + this.objectID + "." + methodName;
-    else
-        obj.method = methodName;
-    obj.params = args;
+/**
+ * Return the XML Document result from an XMLHTTPRequest.
+ */
+HTTPBindingClient.xmlResult = function(http) {
+    if(!http.responseXML || http.responseXML.childNodes.length == 0)
+        return (new DOMParser()).parseFromString(http.responseText, "text/xml");
+    return http.responseXML;
+}
 
-    if (cb) req.cb = cb;
-    if (HTTPBindingClient.profile_async)
-        req.profile = { "submit": new Date() };
-    req.data = JSONClient.toJSON(obj);
+/**
+ * REST ATOMPub GET method.
+ */
+HTTPBindingClient.prototype.get = function(id, cb) {
+    // Connect to the service
+    var http = HTTPBindingClient.getHTTPRequest();
+    var hascb = cb? true : false;
+    http.open("GET", this.uri + '/' + id, hascb);
 
-    return req;
-};
+    // Construct call back if we have one
+    if (hascb) {
+        http.onreadystatechange = function() {
+            if (http.readyState == 4) {
+                // Pass the result or exception
+                if (http.status == 200) {
+                    var res = null;
+                    try {
+                        res = HTTPBindingClient.xmlResult(http);
+                    } catch (e) {
+                        cb(null, e);
+                    }
+                    cb(res);
+                } else
+                    cb(null, new HTTPBindingClient.Exception(http.status, http.statusText));
+            }
+        };
 
-HTTPBindingClient.prototype._sendRequest = function(req) {
-    if(req.profile) req.profile.start = new Date();
+        // Send the request
+        http.send(null);
+        return true;
+    }
 
-    /* Get free http object from the pool */
-    var http = HTTPBindingClient.poolGetHTTPRequest();
-    HTTPBindingClient.num_req_active++;
+    // Send the request and return the result or exception
+    http.send(null);
+    if (http.status == 200)
+        return HTTPBindingClient.xmlResult(http);
+    throw new HTTPBindingClient.Exception(http.status, http.statusText);
+};
 
-    /* Send the request */
-    http.open("POST", this.uri, (req.cb != null));
-    http.setRequestHeader("Content-type", "application/json-rpc");
+/**
+ * REST ATOMPub POST method.
+ */
+HTTPBindingClient.prototype.post = function (entry, cb) {
+    // Connect to the service
+    var http = HTTPBindingClient.getHTTPRequest();
+    var hascb = cb? true : false;
+    http.open("POST", this.uri, hascb);
+    http.setRequestHeader("Content-Type", "application/atom+xml");
 
-    /* Construct call back if we have one */
-    if(req.cb) {
-        var self = this;
+    // Construct call back if we have one
+    if (hascb) {
         http.onreadystatechange = function() {
-            if(http.readyState == 4) {
-                http.onreadystatechange = function () {};
-                var res = { "cb": req.cb, "result": null, "ex": null};
-                if (req.profile) {
-                    res.profile = req.profile;
-                    res.profile.end = new Date();
-                }
-                try { res.result = self._handleResponse(http); }
-                catch(e) { res.ex = e; }
-                if(!HTTPBindingClient.async_inflight[req.requestId].canceled)
-                    HTTPBindingClient.async_responses.push(res);
-                delete HTTPBindingClient.async_inflight[req.requestId];
-                HTTPBindingClient.kick_async();
+            // Pass the result or exception
+            if (http.readyState == 4) {
+                if (http.status == 201) {
+                    var res = null;
+                    try {
+                        res = HTTPBindingClient.xmlResult(http);
+                    } catch (e) {
+                        cb(null, e);
+                    }
+                    cb(res);
+                } else
+                    cb(null, new HTTPBindingClient.Exception(http.status, http.statusText));
             }
         };
-    } else {
-        http.onreadystatechange = function() {};
-    }
-
-    HTTPBindingClient.async_inflight[req.requestId] = req;
-    
-    try {
-        http.send(req.data);
-    } catch(e) {
-        HTTPBindingClient.poolReturnHTTPRequest(http);
-        HTTPBindingClient.num_req_active--;
-        throw new HTTPBindingClient.Exception(HTTPBindingClient.Exception.CODE_ERR_CLIENT,
"Connection failed");
+        // Send the request
+        http.send(entry);
+        return true;
     }
 
-    if(!req.cb) return this._handleResponse(http);
+    // Send the request and return the result or exception
+    http.send(entry);
+    if (http.status == 201)
+        return HTTPBindingClient.xmlResult(http);
+    throw new HTTPBindingClient.Exception(http.status, http.statusText);
 };
 
-HTTPBindingClient.prototype._handleResponse = function(http) {
-    /* Get the charset */
-    if(!this.charset) {
-        this.charset = HTTPBindingClient._getCharsetFromHeaders(http);
-    }
+/**
+ * REST ATOMPub PUT method.
+ */
+HTTPBindingClient.prototype.put = function (id, entry, cb) {
+    // Connect to the service
+    var http = HTTPBindingClient.getHTTPRequest();
+    var hascb = cb? true : false;
+    http.open("PUT", this.uri + '/' + id, hascb);
+    http.setRequestHeader("Content-Type", "application/atom+xml");
 
-    /* Get request results */
-    var status, statusText, data;
-    try {
-        status = http.status;
-        statusText = http.statusText;
-        data = http.responseText;
-    } catch(e) {
-        HTTPBindingClient.poolReturnHTTPRequest(http);
-        HTTPBindingClient.num_req_active--;
-        HTTPBindingClient.kick_async();
-        throw new HTTPBindingClient.Exception(HTTPBindingClient.Exception.CODE_ERR_CLIENT,
"Connection failed");
-    }
-
-    /* Return http object to the pool; */
-    HTTPBindingClient.poolReturnHTTPRequest(http);
-    HTTPBindingClient.num_req_active--;
-
-    /* Unmarshall the response */
-    if(status != 200) {
-        throw new HTTPBindingClient.Exception(status, statusText);
-    }
-    var obj;
-    try {
-        eval("obj = " + data);
-    } catch(e) {
-        throw new HTTPBindingClient.Exception(550, "error parsing result");
+    // Construct call back if we have one
+    if (hascb) {
+        http.onreadystatechange = function() {
+            if (http.readyState == 4) {
+                // Pass any exception
+                if (http.status == 200)
+                    cb();
+                else
+                    cb(new HTTPBindingClient.Exception(http.status, http.statusText));
+            }
+        };
+        // Send the request
+        http.send(entry);
+        return true;
     }
-    if(obj.error)
-        throw new HTTPBindingClient.Exception(obj.error.code, obj.error.msg, obj.error.trace);
-    var res = obj.result;
-
-    /* Handle CallableProxy */
-    if(res && res.objectID && res.JSONRPCType == "CallableReference")
-        return new HTTPBindingClient(this.uri, res.objectID);
 
-    return res;
+    // Send the request and return any exception
+    http.send(entry);
+    if (http.status == 200)
+        return true;
+    throw new HTTPBindingClient.Exception(http.status, http.statusText);
 };
 
-
 /**
- * XMLHttpRequest wrapper code
+ * REST ATOMPub DELETE method.
  */
-HTTPBindingClient.http_spare = [];
-HTTPBindingClient.http_max_spare = 8;
+HTTPBindingClient.prototype.del = function (id, cb) {       
+    // Connect to the service
+    var http = HTTPBindingClient.getHTTPRequest();
+    var hascb = cb? true : false;
+    http.open("DELETE", this.uri + '/' + id, hascb);        
 
-HTTPBindingClient.poolGetHTTPRequest = function() {
-    if(HTTPBindingClient.http_spare.length > 0) {
-        return HTTPBindingClient.http_spare.pop();
+    // Construct call back if we have one
+    if (cb) {
+        http.onreadystatechange = function() {
+            if (http.readyState == 4) {
+                // Pass any exception
+                if (http.status == 200)
+                    cb();
+                else
+                    cb(new HTTPBindingClient.Exception(http.status, http.statusText));
+            }
+        };
+        // Send the request
+        http.send(null);
+        return true;
     }
-    return HTTPBindingClient.getHTTPRequest();
+
+    // Send the request and return any exception
+    http.send(null);
+    if (http.status == 200)
+        return true;
+    throw new HTTPBindingClient.Exception(http.status, http.statusText);
 };
 
-HTTPBindingClient.poolReturnHTTPRequest = function(http) {
-    if(HTTPBindingClient.http_spare.length >= HTTPBindingClient.http_max_spare)
-        delete http;
-    else
-        HTTPBindingClient.http_spare.push(http);
+/**
+ * HTTPBindingClient exceptions.
+ */
+HTTPBindingClient.Exception = function(code, message) {
+    this.name = "HTTPBindingClientException";
+    this.code = code;
+    this.message = message;
+};
+
+HTTPBindingClient.Exception.prototype = new Error();
+
+HTTPBindingClient.Exception.prototype.toString = function() {
+    return this.name + ": " + this.message;
 };
 
-HTTPBindingClient.msxmlNames = [ "MSXML2.XMLHTTP.5.0",
-                 "MSXML2.XMLHTTP.4.0",
-                 "MSXML2.XMLHTTP.3.0",
-                 "MSXML2.XMLHTTP",
-                 "Microsoft.XMLHTTP" ];
+/**
+ * XMLHttpRequest wrapper.
+ */
+HTTPBindingClient.msxmlNames = [ "MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0",
"MSXML2.XMLHTTP", "Microsoft.XMLHTTP" ];
 
 HTTPBindingClient.getHTTPRequest = function() {
-    /* Mozilla XMLHttpRequest */
+    if (HTTPBindingClient.httpFactory)
+        return HTTPBindingClient.httpFactory();
+
+    // Mozilla XMLHttpRequest
     try {
-        HTTPBindingClient.httpObjectName = "XMLHttpRequest";
-        return new XMLHttpRequest();
+        HTTPBindingClient.httpFactory = function() {
+            return new XMLHttpRequest();
+        };
+        return HTTPBindingClient.httpFactory();
     } catch(e) {}
 
-    /* Microsoft MSXML ActiveX */
-    for (var i=0; i < HTTPBindingClient.msxmlNames.length; i++) {
+    // Microsoft MSXML ActiveX
+    for (var i = 0; i < HTTPBindingClient.msxmlNames.length; i++) {
         try {
-            HTTPBindingClient.httpObjectName = HTTPBindingClient.msxmlNames[i];
-            return new ActiveXObject(HTTPBindingClient.msxmlNames[i]);
+            HTTPBindingClient.httpFactory = function() {
+                return new ActiveXObject(HTTPBindingClient.msxmlNames[i]);
+            };
+            return HTTPBindingClient.httpFactory();
         } catch (e) {}
     }
 
-    /* None found */
-    HTTPBindingClient.httpObjectName = null;
+    // Can't create XMLHttpRequest
+    HTTPBindingClient.httpFactory = null;
     throw new HTTPBindingClient.Exception(0, "Can't create XMLHttpRequest object");
 };
 
-
-HTTPBindingClient.prototype.get = function(id, responseFunction) {
-    var xhr = HTTPBindingClient.getHTTPRequest();
-    xhr.onreadystatechange = function() {
-        if (xhr.readyState == 4) {
-            if (xhr.status == 200) {
-                var strDocument = xhr.responseText;
-                var xmlDocument = xhr.responseXML;
-                if(!xmlDocument || xmlDocument.childNodes.length==0){ 
-                    xmlDocument = (new DOMParser()).parseFromString(strDocument, "text/xml");
-                } 
-                if (responseFunction != null) responseFunction(xmlDocument);
-            } else {
-                alert("get - Error getting data from the server");
-            }
-        }
-    }
-    xhr.open("GET", this.uri + '/' + id, true);
-    xhr.send(null);
-};
-
-HTTPBindingClient.prototype.post = function (entry, responseFunction) {
-    var xhr = HTTPBindingClient.getHTTPRequest();
-    xhr.onreadystatechange = function() {
-        if (xhr.readyState == 4) {
-            if (xhr.status == 201) {
-                var strDocument = xhr.responseText;
-                var xmlDocument = xhr.responseXML;
-                if(!xmlDocument || xmlDocument.childNodes.length==0){ 
-                    xmlDocument = (new DOMParser()).parseFromString(strDocument, "text/xml");
-                } 
-                if (responseFunction != null) responseFunction(xmlDocument);
-            } else {
-                alert("post - Error getting data from the server");
-            }
-        }
-    }
-    xhr.open("POST", this.uri, true);
-    xhr.setRequestHeader("Content-Type", "application/atom+xml;type=entry");
-    xhr.send(entry);
-};
-
-HTTPBindingClient.prototype.put = function (id, entry, responseFunction) {
-    var xhr = HTTPBindingClient.getHTTPRequest();
-    xhr.onreadystatechange = function() {
-        if (xhr.readyState == 4) {
-            if (xhr.status == 200) {
-                var strDocument = xhr.responseText;
-                var xmlDocument = xhr.responseXML;
-                if(!xmlDocument || xmlDocument.childNodes.length==0){ 
-                    xmlDocument = (new DOMParser()).parseFromString(strDocument, "text/xml");
-                } 
-                if (responseFunction != null) responseFunction(xmlDocument);
-            } else {
-                alert("put - Error getting data from the server");
-            }
-        }
-    }
-    xhr.open("PUT", this.uri + '/' + id, true);
-    xhr.setRequestHeader("Content-Type", "application/atom+xml;type=entry");
-    xhr.send(entry);
-};
-
-HTTPBindingClient.prototype.del = function (id, responseFunction) {       
-    var xhr = HTTPBindingClient.getHTTPRequest();
-    xhr.onreadystatechange = function() {
-        if (xhr.readyState == 4) {
-            if (xhr.status == 200) {
-                if (responseFunction != null) responseFunction();
-            } else {
-                alert("delete - Error getting data from the server");
+/**
+ * DOM parser wrapper.
+ */
+if (typeof DOMParser == "undefined") {
+    DOMParser = function() {}
+    
+    DOMParser.prototype.parseFromString = function (str, contentType) {
+        if (typeof ActiveXObject != "undefined") {
+            var d = new ActiveXObject("MSXML.DomDocument");
+            d.loadXML(str);
+            return d;
+        } else if (typeof XMLHttpRequest != "undefined") {
+            var req = new XMLHttpRequest;
+            req.open("GET", "data:" + (contentType || "application/xml") +
+                            ";charset=utf-8," + encodeURIComponent(str), false);
+            if (req.overrideMimeType) {
+                req.overrideMimeType(contentType);
             }
+            req.send(null);
+            return req.responseXML;
         }
     }
-    xhr.open("DELETE", this.uri + '/' + id, true);        
-    xhr.send(null);
-};
+}
 
 /**
  * Public API.



Mime
View raw message