/* Copyright (c) 2011, Geert Bergman (geert@scrivo.nl)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of "Scrivo" nor the names of its contributors may be
* used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* $Id: xhr.js 741 2013-07-16 13:36:00Z geert $
*/
"use strict";
/**
* Holds a set of xhr related functions.
* @namespace
*/
SUI.xhr = {
/**
* <p>Convert tabelized data to an array of objects. When sending a json
* string containing an huge array of objects you might want to consider
* to send the data in a table format: nn array of values only in which
* the first row defines the field names of the data that follows. For
* example:</p>
* <pre class="sh_javascript">
* [
* { id: 1, name: "Jan" },
* { id: 2, name: "Piet" },
* { id: 3, name: "Klaas" },
* ...
* ]
* </pre>
* <p>Can also be presended as:</p>
* <pre class="sh_javascript">
* [
* ["id", "name"],
* [1, "Jan"],
* [2, "Piet"],
* [3, "Klaas"],
* ...
* ]
* </pre>
* <p>This function converts the latter to the former.</p>
* @param {Array[]} t A table of values in which the first row defines the
* names of the columns.
* @return {Object[]} An array of objects containing name and value
* pairs.
*/
tableToObjArr : function(t) {
var vd = [];
if (t.length) {
// the first row is header ...
header = t[0];
// ... the rest is data
for (var i=1; i<t.length; i++) {
// construct an object ...
var r = {};
for (var j=0; j<header.length; j++) {
r[header[j]] = t[i][j];
}
// ... and add it to the result array
vd.push(r);
}
}
return vd;
},
/**
* Convert a javascript object to an url query string. The data will
* be url-encoded. The function does not support rescursive structures (no
* inner objects) but it supports 1D array values for the members of the
* argument object. Note that this function is designed to work with PHP
* and that arrays will be converted to the "name[]" syntax that (afaik)
* only PHP supports. For example: { a: "V&D", b: [1, 2] } will be
* translated to "a=V%26D&b[]=1&b[]=2".
* @param {Object} data An object with name and values pairs to convert
* to an url query string.
* @return {Object} data An url query string containing the given name
* and value pairs.
*/
queryString: function(data) {
var t = [];
// create name and url-encoded values pairs
for (var i in data) {
if (data.hasOwnProperty(i)) {
if (data[i] instanceof Array) {
// create PHP style array parameters
for (var j=0; j<data[i].length; j++) {
t.push(i+"[]="+encodeURIComponent(data[i][j]));
}
} else {
t.push(i+"="+encodeURIComponent(data[i]));
}
}
}
// construct the complete query string
return t.join("&");
},
/**
* Execute a get request to an http server and supply a callback function
* to deal with the response.
* @param {String} url The url of an xhr script on a web server.
* @param {Object} data An object of which the members and their values
* will be converted to an url query string and appended to the url.
* Note: it is also possible to add a query string directly to the url
* parameter, but then you should pass null for this parameter.
* @param {Function} callback A function with signature ({Object}) to
* handle the server's response.
*/
doGet: function(url, data, callback) {
// create an XMLHttpRequest obj, if not the normal way then the MS way
var xhr = window.XMLHttpRequest
? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
// if there's data append it to the url
if (data) {
url += "?" + this.queryString(data);
}
// set the callback ...
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
callback(eval("(" + xhr.responseText + ")"));
}
};
// ... open the connection ...
xhr.open("GET", url, true);
// ... and don't send any data.
xhr.send(null);
},
/**
* Execute a post request to an http server and supply a callback function
* to deal with the response.
* @param {String} url The url of an xhr script on a web server.
* @param {Object} data An object of which the members and their values
* will be converted to form encoded data and send along with the
* request.
* @param {Function} callback A function with signature ({Object}) to
* handle the server's response.
*/
doPost: function(url, data, callback) {
// create an XMLHttpRequest obj, if not the normal way then the MS way
var xhr = window.XMLHttpRequest
? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
// set the callback ...
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
callback(eval("(" + xhr.responseText + ")"));
}
};
// ... open the connection ...
xhr.open("POST", url, true);
// ... tell in what format we'll send the data ...
xhr.setRequestHeader(
"Content-type", "application/x-www-form-urlencoded");
// ... and send the data.
xhr.send(this.queryString(data));
}
};