var Request = Class.create({ initialize: function(opts){ this.required = new Array(); this.callOnFinish = new Array(); Object.extend(this, opts || {}); if (!this.id || String(this.id).length == 0){ this.id = Request.generateID(); this._forget_on_load = true; } }, id: "", static: false, src: "", url: function(){ return this.src + (typeof(this.params) == "undefined" ? "" : "?" + this.params); }, useServerCall: false, usePrototype: true, loaded: false, onFinish: function(){}, onSuccess: function(){ this.loaded = true; if (typeof this.onFinish == "function") this.onFinish(this); this.callOnFinish.invoke("call", this); this.callOnFinish.clear(); }, onFailure: function(sMessage, nErrorCode){ if (Object.isFunction(this.onException)) this.onException(sMessage, nErrorCode); else alert("Failed to load " + this.url() + ".\n" + sMessage); }, onLoadingStarted: function(){ if (Object.isFunction(this.src)) this.src = this.src(); switch (typeof this.params){ case "function": this.params = this.params(); break; case "object": this.params = URLSerializeVS(this.params); break; } }, load: function(){ if (Object.isFunction(this.action)){ this.action(); this.onSuccess(); return; } this.onLoadingStarted(); if (this.useServerCall) new ServerCall(this.src, this.params || "", { onSuccess: function(oPacket){ this.result = oPacket.Data(); this.onSuccess(); }.bind(this), onException: this.onFailure.bind(this) }); else if (this.usePrototype) new Ajax.Request(this.url(), { method: "get", onSuccess: function(transport){ this.transport = transport; this.onSuccess(); }.bind(this), onFailure: this.onFailure.bind(this) }); else new AjaxRequest("get", this.src, this.params || "", { onSuccess: function(transport){ this.transport = transport.oTransport_; this.onSuccess(); }.bind(this), onException: this.onFailure.bind(this) }); }, AddCallOnFinish: function(func){ if (Object.isFunction(func)) this.callOnFinish.push(func); }, IsLoaded: function(){ return this.loaded; }, GetResponseText: function(){ return this.transport.responseText; }, GetResponseXML: function(){ return this.transport.responseXML; }, GetResult: function(){ return this.result || {}; } }); Request.counter = 0; Request.generateID = function(){ return "__request__" + (Request.counter++); }; var RequestLoader = Class.create({ initialize: function(){ this.requests = {}; }, addRequest: function(request){ if (!(request instanceof Request)) request = new Request(request); this.requests[request.id] = request; request.AddCallOnFinish(this.refresh.bind(this)); request.loader = this; if (request.static){ request.static = false; request.started = true; if (!GRequestLoader.RequestExists(request.id)) GRequestLoader.addRequest({ "id": request.id, "src": request.src }); var static_request = GRequestLoader.GetRequest(request.id); var complete_request = function(){ request.transport = static_request.transport; request.onSuccess(); } if (static_request.IsLoaded()) complete_request(); else static_request.AddCallOnFinish(complete_request); }else{ request.started = false; this.startRequest(request); } return request; }, AddRequest: function(request){ return this.addRequest(request); }, refresh: function(){ for (requestID in this.requests){ var request = this.requests[requestID]; if (request.loaded && request._forget_on_load) delete this.requests[requestID]; else this.startRequest(request); } }, startRequest: function(request){ if (request.started) return; if ($A(request.required).collect(function(requestID){ if (!this.requests[requestID]) return false; return (this.requests[requestID].loaded); }, this).all()){ request.started = true; request.load(); } }, clear: function(requestIDs){ if (typeof(requestIDs) == "undefined"){ LogE("Warning: clearing ALL requests"); this.requests = {}; return; } $A(requestIDs).each(function(requestID){ if (!delete this.requests[requestID]) LogE("Cannot delete request \"" + requestID + "\""); else LogL("requests[\"" + requestID + "\"] deleted"); }, this); }, ClearRequests: function(array){ if (!Object.isArray(array)) return; return this.clear(array); }, RequestExists: function(requestID){ return !Object.isUndefined(this.requests[requestID]); }, getRequestNames: function(){ return $H(this.requests).keys(); }, GetRequest: function(id){ return this.requests[id]; }, IsLoaded: function(id){ return this.RequestExists(id) && this.GetRequest(id).IsLoaded(); }, GetRequestStatuses: function(){ var result = {}; this.getRequestNames().each(function(id){ result[id] = this.requests[id].IsLoaded(); }.bind(this)); return result; } }); RequestLoader.SerializeStructure = URLSerializeVS; var GRequestLoader = new RequestLoader();