summaryrefslogtreecommitdiff
path: root/src/js/util/mxXmlRequest.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/js/util/mxXmlRequest.js')
-rw-r--r--src/js/util/mxXmlRequest.js425
1 files changed, 425 insertions, 0 deletions
diff --git a/src/js/util/mxXmlRequest.js b/src/js/util/mxXmlRequest.js
new file mode 100644
index 0000000..0ac55ed
--- /dev/null
+++ b/src/js/util/mxXmlRequest.js
@@ -0,0 +1,425 @@
+/**
+ * $Id: mxXmlRequest.js,v 1.38 2012-04-22 10:16:23 gaudenz Exp $
+ * Copyright (c) 2006-2010, JGraph Ltd
+ */
+/**
+ * Class: mxXmlRequest
+ *
+ * XML HTTP request wrapper. See also: <mxUtils.get>, <mxUtils.post> and
+ * <mxUtils.load>. This class provides a cross-browser abstraction for Ajax
+ * requests.
+ *
+ * Encoding:
+ *
+ * For encoding parameter values, the built-in encodeURIComponent JavaScript
+ * method must be used. For automatic encoding of post data in <mxEditor> the
+ * <mxEditor.escapePostData> switch can be set to true (default). The encoding
+ * will be carried out using the conte type of the page. That is, the page
+ * containting the editor should contain a meta tag in the header, eg.
+ * <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ *
+ * Example:
+ *
+ * (code)
+ * var onload = function(req)
+ * {
+ * mxUtils.alert(req.getDocumentElement());
+ * }
+ *
+ * var onerror = function(req)
+ * {
+ * mxUtils.alert(req.getStatus());
+ * }
+ * new mxXmlRequest(url, 'key=value').send(onload, onerror);
+ * (end)
+ *
+ * Sends an asynchronous POST request to the specified URL.
+ *
+ * Example:
+ *
+ * (code)
+ * var req = new mxXmlRequest(url, 'key=value', 'POST', false);
+ * req.send();
+ * mxUtils.alert(req.getDocumentElement());
+ * (end)
+ *
+ * Sends a synchronous POST request to the specified URL.
+ *
+ * Example:
+ *
+ * (code)
+ * var encoder = new mxCodec();
+ * var result = encoder.encode(graph.getModel());
+ * var xml = encodeURIComponent(mxUtils.getXml(result));
+ * new mxXmlRequest(url, 'xml='+xml).send();
+ * (end)
+ *
+ * Sends an encoded graph model to the specified URL using xml as the
+ * parameter name. The parameter can then be retrieved in C# as follows:
+ *
+ * (code)
+ * string xml = HttpUtility.UrlDecode(context.Request.Params["xml"]);
+ * (end)
+ *
+ * Or in Java as follows:
+ *
+ * (code)
+ * String xml = URLDecoder.decode(request.getParameter("xml"), "UTF-8").replace("\n", "&#xa;");
+ * (end)
+ *
+ * Note that the linefeeds should only be replaced if the XML is
+ * processed in Java, for example when creating an image.
+ *
+ * Constructor: mxXmlRequest
+ *
+ * Constructs an XML HTTP request.
+ *
+ * Parameters:
+ *
+ * url - Target URL of the request.
+ * params - Form encoded parameters to send with a POST request.
+ * method - String that specifies the request method. Possible values are
+ * POST and GET. Default is POST.
+ * async - Boolean specifying if an asynchronous request should be used.
+ * Default is true.
+ * username - String specifying the username to be used for the request.
+ * password - String specifying the password to be used for the request.
+ */
+function mxXmlRequest(url, params, method, async, username, password)
+{
+ this.url = url;
+ this.params = params;
+ this.method = method || 'POST';
+ this.async = (async != null) ? async : true;
+ this.username = username;
+ this.password = password;
+};
+
+/**
+ * Variable: url
+ *
+ * Holds the target URL of the request.
+ */
+mxXmlRequest.prototype.url = null;
+
+/**
+ * Variable: params
+ *
+ * Holds the form encoded data for the POST request.
+ */
+mxXmlRequest.prototype.params = null;
+
+/**
+ * Variable: method
+ *
+ * Specifies the request method. Possible values are POST and GET. Default
+ * is POST.
+ */
+mxXmlRequest.prototype.method = null;
+
+/**
+ * Variable: async
+ *
+ * Boolean indicating if the request is asynchronous.
+ */
+mxXmlRequest.prototype.async = null;
+
+/**
+ * Variable: binary
+ *
+ * Boolean indicating if the request is binary. This option is ignored in IE.
+ * In all other browsers the requested mime type is set to
+ * text/plain; charset=x-user-defined. Default is false.
+ */
+mxXmlRequest.prototype.binary = false;
+
+/**
+ * Variable: username
+ *
+ * Specifies the username to be used for authentication.
+ */
+mxXmlRequest.prototype.username = null;
+
+/**
+ * Variable: password
+ *
+ * Specifies the password to be used for authentication.
+ */
+mxXmlRequest.prototype.password = null;
+
+/**
+ * Variable: request
+ *
+ * Holds the inner, browser-specific request object.
+ */
+mxXmlRequest.prototype.request = null;
+
+/**
+ * Function: isBinary
+ *
+ * Returns <binary>.
+ */
+mxXmlRequest.prototype.isBinary = function()
+{
+ return this.binary;
+};
+
+/**
+ * Function: setBinary
+ *
+ * Sets <binary>.
+ */
+mxXmlRequest.prototype.setBinary = function(value)
+{
+ this.binary = value;
+};
+
+/**
+ * Function: getText
+ *
+ * Returns the response as a string.
+ */
+mxXmlRequest.prototype.getText = function()
+{
+ return this.request.responseText;
+};
+
+/**
+ * Function: isReady
+ *
+ * Returns true if the response is ready.
+ */
+mxXmlRequest.prototype.isReady = function()
+{
+ return this.request.readyState == 4;
+};
+
+/**
+ * Function: getDocumentElement
+ *
+ * Returns the document element of the response XML document.
+ */
+mxXmlRequest.prototype.getDocumentElement = function()
+{
+ var doc = this.getXml();
+
+ if (doc != null)
+ {
+ return doc.documentElement;
+ }
+
+ return null;
+};
+
+/**
+ * Function: getXml
+ *
+ * Returns the response as an XML document. Use <getDocumentElement> to get
+ * the document element of the XML document.
+ */
+mxXmlRequest.prototype.getXml = function()
+{
+ var xml = this.request.responseXML;
+
+ // Handles missing response headers in IE, the first condition handles
+ // the case where responseXML is there, but using its nodes leads to
+ // type errors in the mxCellCodec when putting the nodes into a new
+ // document. This happens in IE9 standards mode and with XML user
+ // objects only, as they are used directly as values in cells.
+ if (document.documentMode >= 9 || xml == null || xml.documentElement == null)
+ {
+ xml = mxUtils.parseXml(this.request.responseText);
+ }
+
+ return xml;
+};
+
+/**
+ * Function: getText
+ *
+ * Returns the response as a string.
+ */
+mxXmlRequest.prototype.getText = function()
+{
+ return this.request.responseText;
+};
+
+/**
+ * Function: getStatus
+ *
+ * Returns the status as a number, eg. 404 for "Not found" or 200 for "OK".
+ * Note: The NS_ERROR_NOT_AVAILABLE for invalid responses cannot be cought.
+ */
+mxXmlRequest.prototype.getStatus = function()
+{
+ return this.request.status;
+};
+
+/**
+ * Function: create
+ *
+ * Creates and returns the inner <request> object.
+ */
+mxXmlRequest.prototype.create = function()
+{
+ if (window.XMLHttpRequest)
+ {
+ return function()
+ {
+ var req = new XMLHttpRequest();
+
+ // TODO: Check for overrideMimeType required here?
+ if (this.isBinary() && req.overrideMimeType)
+ {
+ req.overrideMimeType('text/plain; charset=x-user-defined');
+ }
+
+ return req;
+ };
+ }
+ else if (typeof(ActiveXObject) != "undefined")
+ {
+ return function()
+ {
+ // TODO: Implement binary option
+ return new ActiveXObject("Microsoft.XMLHTTP");
+ };
+ }
+}();
+
+/**
+ * Function: send
+ *
+ * Send the <request> to the target URL using the specified functions to
+ * process the response asychronously.
+ *
+ * Parameters:
+ *
+ * onload - Function to be invoked if a successful response was received.
+ * onerror - Function to be called on any error.
+ */
+mxXmlRequest.prototype.send = function(onload, onerror)
+{
+ this.request = this.create();
+
+ if (this.request != null)
+ {
+ if (onload != null)
+ {
+ this.request.onreadystatechange = mxUtils.bind(this, function()
+ {
+ if (this.isReady())
+ {
+ onload(this);
+ this.onreadystatechaange = null;
+ }
+ });
+ }
+
+ this.request.open(this.method, this.url, this.async,
+ this.username, this.password);
+ this.setRequestHeaders(this.request, this.params);
+ this.request.send(this.params);
+ }
+};
+
+/**
+ * Function: setRequestHeaders
+ *
+ * Sets the headers for the given request and parameters. This sets the
+ * content-type to application/x-www-form-urlencoded if any params exist.
+ *
+ * Example:
+ *
+ * (code)
+ * request.setRequestHeaders = function(request, params)
+ * {
+ * if (params != null)
+ * {
+ * request.setRequestHeader('Content-Type',
+ * 'multipart/form-data');
+ * request.setRequestHeader('Content-Length',
+ * params.length);
+ * }
+ * };
+ * (end)
+ *
+ * Use the code above before calling <send> if you require a
+ * multipart/form-data request.
+ */
+mxXmlRequest.prototype.setRequestHeaders = function(request, params)
+{
+ if (params != null)
+ {
+ request.setRequestHeader('Content-Type',
+ 'application/x-www-form-urlencoded');
+ }
+};
+
+/**
+ * Function: simulate
+ *
+ * Creates and posts a request to the given target URL using a dynamically
+ * created form inside the given document.
+ *
+ * Parameters:
+ *
+ * docs - Document that contains the form element.
+ * target - Target to send the form result to.
+ */
+mxXmlRequest.prototype.simulate = function(doc, target)
+{
+ doc = doc || document;
+ var old = null;
+
+ if (doc == document)
+ {
+ old = window.onbeforeunload;
+ window.onbeforeunload = null;
+ }
+
+ var form = doc.createElement('form');
+ form.setAttribute('method', this.method);
+ form.setAttribute('action', this.url);
+
+ if (target != null)
+ {
+ form.setAttribute('target', target);
+ }
+
+ form.style.display = 'none';
+ form.style.visibility = 'hidden';
+
+ var pars = (this.params.indexOf('&') > 0) ?
+ this.params.split('&') :
+ this.params.split();
+
+ // Adds the parameters as textareas to the form
+ for (var i=0; i<pars.length; i++)
+ {
+ var pos = pars[i].indexOf('=');
+
+ if (pos > 0)
+ {
+ var name = pars[i].substring(0, pos);
+ var value = pars[i].substring(pos+1);
+
+ var textarea = doc.createElement('textarea');
+ textarea.setAttribute('name', name);
+ value = value.replace(/\n/g, '&#xa;');
+
+ var content = doc.createTextNode(value);
+ textarea.appendChild(content);
+ form.appendChild(textarea);
+ }
+ }
+
+ doc.body.appendChild(form);
+ form.submit();
+ doc.body.removeChild(form);
+
+ if (old != null)
+ {
+ window.onbeforeunload = old;
+ }
+};