/** * Wrapper for Ajax calls. Provides flood control. */ cambrient.Ajax = function() { var REQUEST_PERIOD_MS = 100; // How often to make ajax requests var MAX_SIMULTANEOUS_REQUESTS = 5; // Maximum simultaenous ajax requests (remember that comet uses up 1) var self; // pointer to instance of this class var recentRequests = new Array(); var requestQueue = new Array(); var simultaneousRequests = 0; function constructorFn() { self = this; self.processRequests(); } // Make ajax request constructorFn.prototype.processRequests = function() { setTimeout(self.processRequests, REQUEST_PERIOD_MS); if (simultaneousRequests >= MAX_SIMULTANEOUS_REQUESTS) return; if (requestQueue.length == 0) return; var requestObj = requestQueue.shift(); if (requestObj.successFunction == null) { requestObj.successFunction = function(reply) { if (element != null) { element.innerHTML = reply.responseText; } else { cambrient[elementId] = reply.responseText; } if (requestObj.chainFunction != null && isFunction(requestObj.chainFunction)) { requestObj.chainFunction.call(reply); } } } if (requestObj.errorFunction == null) { requestObj.errorFunction = function(reply) { cambrient.userMessaging.error('ERROR!! ' + reply); } } simultaneousRequests++; if (requestObj.post) { new Ajax.Request(cambrient.contextPath + requestObj.url, { method: "post", parameters: requestObj.dataObj, onSuccess: function(reply) { cambrient.sessionManager.serverPing(); // reset the session manager simultaneousRequests--; requestObj.successFunction(reply); }, onFailure: function(reply) { simultaneousRequests--; requestObj.errorFunction(reply); } }); } else { new Ajax.Request(cambrient.contextPath + requestObj.url, { onSuccess: function(reply) { cambrient.sessionManager.serverPing(); // reset the session manager simultaneousRequests--; requestObj.successFunction(reply); }, onFailure: function(reply) { simultaneousRequests--; requestObj.errorFunction(reply); } }); } } // provides flood control by checking if the url was recently requested constructorFn.prototype.recentlyRequested = function(url) { var idx = requestQueue.find(function(item) { if (item.url == url) return true; else return false; }); if (idx >= 0) { return true; } return false; } // Make ajax request using the POST method constructorFn.prototype.requestPost = function(url, dataObj, successFunction, errorFunction, chainFunction) { if (!self.recentlyRequested(url)) { requestQueue.push({ "url": url, "post": true, "dataObj": dataObj, "successFunction": successFunction, "errorFunction": errorFunction, "chainFunction": chainFunction }); } } // Make ajax request constructorFn.prototype.request = function(url, successFunction, errorFunction, chainFunction) { if (!self.recentlyRequested(url)) { requestQueue.push({ "url": url, "successFunction" : successFunction, "errorFunction" : errorFunction, "chainFunction" : chainFunction }); } } return new constructorFn(); } cambrient.ajax = new cambrient.Ajax();