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