|
|
|
|
/**
|
|
* @class Ajax
|
|
*
|
|
* Perform asynchronous call to the server.
|
|
*
|
|
* documentation:
|
|
* http://ajaxpatterns.org/HTTP_Streaming
|
|
* http://ajaxpatterns.org/XMLHttpRequest_Call
|
|
* http://www.skill-guru.com/blog/2011/02/04/adding-access-control-allow-origin-to-server-for-cross-domain-scripting/
|
|
*
|
|
* @author Jos de Jong, Almende, 2011
|
|
*/
|
|
var Ajax = function() {
|
|
this.isBusy = true;
|
|
this.timer = undefined;
|
|
this.req = undefined;
|
|
this.callback = undefined;
|
|
|
|
// for long poll
|
|
this.pollCallback = undefined;
|
|
this.pollInterval = 1000; // milliseconds
|
|
this.lastResponseLength = 0;
|
|
}
|
|
|
|
/**
|
|
* Make a request
|
|
* @param {string} method The call method: typically "GET" or "POST"
|
|
* @param {string} url The url to be called, for example "mydata.php"
|
|
* @param {method} callback The callback method, which will be called when
|
|
* the response is received. The response is passed
|
|
* as a plain text (string) parameter to this method:
|
|
* callback(response);
|
|
*/
|
|
Ajax.prototype.request = function(method, url, callback)
|
|
{
|
|
var me = this;
|
|
|
|
this.isBusy = true;
|
|
this.callback = callback;
|
|
this.req = (XMLHttpRequest)? new XMLHttpRequest(): new ActiveXObject("MSXML2.XMLHTTP");
|
|
this.req.onreadystatechange = function() { me._checkReadyState(); };
|
|
this.req.open(method, url, true);
|
|
this.req.send(null);
|
|
}
|
|
|
|
/**
|
|
* Make a long poll request.
|
|
* This poll can be stopped via Ajax.abort();
|
|
* @param {string} method The call method: typically "GET" or "POST"
|
|
* @param {string} url The url to be called, for example "mydata.php"
|
|
* @param {method} callback The callback method, which will be called
|
|
* repeatedly, each time that new data is received.
|
|
* The newly received data is passed
|
|
* as a plain text (string) parameter to this method:
|
|
* callback(response);
|
|
*/
|
|
Ajax.prototype.requestLongPoll = function(method, url, callback)
|
|
{
|
|
this.request(method, url);
|
|
|
|
var me = this;
|
|
this.pollCallback = callback;
|
|
this.lastResponseLength = 0;
|
|
this.timer = setInterval(function() {me._checkResponse();}, this.pollInterval);
|
|
}
|
|
|
|
/**
|
|
* Cancel a current request
|
|
*/
|
|
Ajax.prototype.abort = function() {
|
|
this.isBusy = false;
|
|
if (this.timer) {
|
|
clearInterval(this.timer)
|
|
this.timer = undefined;
|
|
}
|
|
|
|
if (this.req) {
|
|
this.req.abort();
|
|
this.req = undefined;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* The callback method which is called when a response is received.
|
|
*/
|
|
Ajax.prototype._checkReadyState = function()
|
|
{
|
|
switch(this.req.readyState)
|
|
{
|
|
case 1: break;
|
|
case 2: break;
|
|
case 3: break;
|
|
case 4:
|
|
if (this.callback) {
|
|
this.callback(this.req.responseText);
|
|
}
|
|
|
|
// reset all variables
|
|
this.abort();
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Callback function executed repeatedly during a long poll.
|
|
* The currently received response data is checked, and all new data is passed
|
|
* to the callback function.
|
|
*/
|
|
Ajax.prototype._checkResponse = function() {
|
|
var len = this.req.responseText.length;
|
|
|
|
if (len > this.lastResponseLength) {
|
|
var newData = this.req.responseText.substring(this.lastResponseLength);
|
|
|
|
// TODO: clear the current responseText here, to prevent the response
|
|
// from growing infinitely?
|
|
|
|
if (this.pollCallback) {
|
|
this.pollCallback(newData);
|
|
}
|
|
|
|
this.lastResponseLength = len;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Set the interval for long polling
|
|
* @param {number} interval Interval in milliseconds
|
|
*/
|
|
Ajax.prototype.setPollInterval = function(interval) {
|
|
this.pollInterval = interval;
|
|
}
|
|
|
|
/**
|
|
* get the poll interval
|
|
*/
|
|
Ajax.prototype.getPollInterval = function() {
|
|
return this.pollInterval;
|
|
}
|