vis.js is a dynamic, browser-based visualization library
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

141 lines
3.7 KiB

/**
* @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;
}