blob: a9cf16cd45ccb7cbeb2d866d149696d1fc992ff2 [file] [log] [blame]
//Ajax
(function() {
var name = 'Ajax', global = this, overwrittenName = global[name], exports;
function partial(){
var args = Array.prototype.slice.call(arguments);
var fn=args.shift();
return fn.bind(this, args)
}
function Ajax() {
this.logger=new global.Logger(name);
var self=this;
function encode(data) {
var result = "";
if (typeof data === "string") {
result = data;
} else {
var e = encodeURIComponent;
for (var i in data) {
if (data.hasOwnProperty(i)) {
result += '&' + e(i) + '=' + e(data[i]);
}
}
}
return result;
}
function request(m, u, d) {
var p = new Promise(), timeout;
self.logger.time(m + ' ' + u);
(function(xhr) {
xhr.onreadystatechange = function() {
this.readyState ^ 4 || (self.logger.timeEnd(m + ' ' + u), clearTimeout(timeout), p.done(null, this));
};
xhr.onerror=function(response){
clearTimeout(timeout);
p.done(response, null);
}
xhr.oncomplete=function(response){
clearTimeout(timeout);
self.logger.timeEnd(m + ' ' + u);
self.info("%s request to %s returned %s", m, u, this.status );
}
xhr.open(m, u);
if (d) {
if("object"===typeof d){
d=JSON.stringify(d);
}
xhr.setRequestHeader("Content-Type", "application/json");
xhr.setRequestHeader("Accept", "application/json");
}
timeout = setTimeout(function() {
xhr.abort();
p.done("API Call timed out.", null)
}, 30000);
//TODO stick that timeout in a config variable
xhr.send(encode(d));
}(new XMLHttpRequest()));
return p;
};
this.request=request;
this.get = partial(request,'GET');
this.post = partial(request,'POST');
this.put = partial(request,'PUT');
this.delete = partial(request,'DELETE');
}
global[name] = new Ajax();
global[name].noConflict = function() {
if(overwrittenName){
global[name] = overwrittenName;
}
return exports;
};
return global[name];
}());