|
Server IP : 10.2.73.233 / Your IP : 216.73.216.21 Web Server : Apache/2.4.59 (Debian) System : Linux polon 4.19.0-27-amd64 #1 SMP Debian 4.19.316-1 (2024-06-25) x86_64 User : www-data ( 33) PHP Version : 5.6.40-64+0~20230107.71+debian10~1.gbp673146 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority, MySQL : ON | cURL : ON | WGET : ON | Perl : ON | Python : ON Directory (0777) : /home/ifk/web/assets/54b90d07/prado/activecontrols/ |
| [ Home ] | [ C0mmand ] | [ Upload File ] |
|---|
Prado.AjaxRequest = Class.create();
Prado.AjaxRequest.prototype = Object.clone(Ajax.Request.prototype);
/**
* Override Prototype's response implementation.
*/
Object.extend(Prado.AjaxRequest.prototype,
{
/*initialize: function(request)
{
this.CallbackRequest = request;
this.transport = Ajax.getTransport();
this.setOptions(request.options);
this.request(request.url);
},*/
/**
* Customize the response, dispatch onXXX response code events, and
* tries to execute response actions (javascript statements).
*/
respondToReadyState : function(readyState)
{
var event = Ajax.Request.Events[readyState];
var transport = this.transport, json = this.getBodyDataPart(Prado.CallbackRequest.DATA_HEADER);
if (event == 'Complete')
{
var redirectUrl = this.getBodyContentPart(Prado.CallbackRequest.REDIRECT_HEADER);
if (redirectUrl)
document.location.href = redirectUrl;
if ((this.getHeader('Content-type') || '').match(/^text\/javascript/i))
{
try
{
json = eval('(' + transport.responseText + ')');
}
catch (e)
{
if(typeof(json) == "string")
json = Prado.CallbackRequest.decode(result);
}
}
try
{
Prado.CallbackRequest.updatePageState(this,transport);
Prado.CallbackRequest.checkHiddenFields(this,transport);
var obj = this;
Prado.CallbackRequest.loadAssets(this,transport, function()
{
try
{
Ajax.Responders.dispatch('on' + transport.status, obj, transport, json);
Prado.CallbackRequest.dispatchActions(transport,obj.getBodyDataPart(Prado.CallbackRequest.ACTION_HEADER));
(
obj.options['on' + obj.transport.status]
||
obj.options['on' + (obj.success() ? 'Success' : 'Failure')]
||
Prototype.emptyFunction
) (obj, json);
}
catch (e)
{
obj.dispatchException(e);
}
}
);
}
catch (e)
{
this.dispatchException(e);
}
}
try {
(this.options['on' + event] || Prototype.emptyFunction)(this, json);
Ajax.Responders.dispatch('on' + event, this, transport, json);
} catch (e) {
this.dispatchException(e);
}
/* Avoid memory leak in MSIE: clean up the oncomplete event handler */
if (event == 'Complete')
this.transport.onreadystatechange = Prototype.emptyFunction;
},
/**
* Gets header data assuming JSON encoding.
* @param string header name
* @return object header data as javascript structures.
*/
getHeaderData : function(name)
{
return this.getJsonData(this.getHeader(name));
},
getBodyContentPart : function(name)
{
if(typeof(this.transport.responseText)=="string")
return Prado.Element.extractContent(this.transport.responseText, name);
},
getJsonData : function(json)
{
try
{
return eval('(' + json + ')');
}
catch (e)
{
if(typeof(json) == "string")
return Prado.CallbackRequest.decode(json);
}
},
getBodyDataPart : function(name)
{
return this.getJsonData(this.getBodyContentPart(name));
}
});
/**
* Prado Callback client-side request handler.
*/
Prado.CallbackRequest = Class.create();
/**
* Static definitions.
*/
Object.extend(Prado.CallbackRequest,
{
/**
* Callback request target POST field name.
*/
FIELD_CALLBACK_TARGET : 'PRADO_CALLBACK_TARGET',
/**
* Callback request parameter POST field name.
*/
FIELD_CALLBACK_PARAMETER : 'PRADO_CALLBACK_PARAMETER',
/**
* Callback request page state field name,
*/
FIELD_CALLBACK_PAGESTATE : 'PRADO_PAGESTATE',
FIELD_POSTBACK_TARGET : 'PRADO_POSTBACK_TARGET',
FIELD_POSTBACK_PARAMETER : 'PRADO_POSTBACK_PARAMETER',
/**
* List of form fields that will be collected during callback.
*/
PostDataLoaders : [],
/**
* Response data header name.
*/
DATA_HEADER : 'X-PRADO-DATA',
/**
* Response javascript execution statement header name.
*/
ACTION_HEADER : 'X-PRADO-ACTIONS',
/**
* Response errors/exceptions header name.
*/
ERROR_HEADER : 'X-PRADO-ERROR',
/**
* Page state header name.
*/
PAGESTATE_HEADER : 'X-PRADO-PAGESTATE',
/**
* Script list header name.
*/
SCRIPTLIST_HEADER : 'X-PRADO-SCRIPTLIST',
/**
* Stylesheet code header name.
*/
STYLESHEET_HEADER : 'X-PRADO-STYLESHEET',
/**
* Stylesheet list header name.
*/
STYLESHEETLIST_HEADER : 'X-PRADO-STYLESHEETLIST',
/**
* Hidden field list header name.
*/
HIDDENFIELDLIST_HEADER : 'X-PRADO-HIDDENFIELDLIST',
REDIRECT_HEADER : 'X-PRADO-REDIRECT',
requestQueue : [],
//all request objects
requests : {},
getRequestById : function(id)
{
var requests = Prado.CallbackRequest.requests;
if(typeof(requests[id]) != "undefined")
return requests[id];
},
dispatch : function(id)
{
var requests = Prado.CallbackRequest.requests;
if(typeof(requests[id]) != "undefined")
requests[id].dispatch();
},
/**
* Add ids of inputs element to post in the request.
*/
addPostLoaders : function(ids)
{
var self = Prado.CallbackRequest;
self.PostDataLoaders = self.PostDataLoaders.concat(ids);
var list = [];
self.PostDataLoaders.each(function(id)
{
if(list.indexOf(id) < 0)
list.push(id);
});
self.PostDataLoaders = list;
},
/**
* Dispatch callback response actions.
*/
dispatchActions : function(transport,actions)
{
var self = Prado.CallbackRequest;
if(actions && actions.length > 0)
actions.each(self.__run.bind(self,transport));
},
/**
* Prase and evaluate a Callback clien-side action
*/
__run : function(transport, command)
{
var self = Prado.CallbackRequest;
self.transport = transport;
for(var method in command)
{
try
{
method.toFunction().apply(self,command[method]);
}
catch(e)
{
if(typeof(Logger) != "undefined")
self.Exception.onException(null,e);
else
debugger;
}
}
},
/**
* Respond to Prado Callback request exceptions.
*/
Exception :
{
/**
* Server returns 500 exception. Just log it.
*/
"on500" : function(request, transport, data)
{
var e = request.getHeaderData(Prado.CallbackRequest.ERROR_HEADER);
if (e)
Logger.error("Callback Server Error "+e.code, this.formatException(e));
else
Logger.error("Callback Server Error Unknown",'');
},
/**
* Callback OnComplete event,logs reponse and data to console.
*/
'on200' : function(request, transport, data)
{
if(transport.status < 500)
{
var msg = 'HTTP '+transport.status+" with response : \n";
if(transport.responseText.trim().length >0)
{
var f = RegExp('(<!--X-PRADO[^>]+-->)([\\s\\S\\w\\W]*)(<!--//X-PRADO[^>]+-->)',"m");
msg += transport.responseText.replace(f,'') + "\n";
}
if(typeof(data)!="undefined" && data != null)
msg += "Data : \n"+inspect(data)+"\n";
data = request.getBodyDataPart(Prado.CallbackRequest.ACTION_HEADER);
if(data && data.length > 0)
{
msg += "Actions : \n";
data.each(function(action)
{
msg += inspect(action)+"\n";
});
}
Logger.info(msg);
}
},
/**
* Uncaught exceptions during callback response.
*/
onException : function(request,e)
{
var msg = "";
$H(e).each(function(item)
{
msg += item.key+": "+item.value+"\n";
})
Logger.error('Uncaught Callback Client Exception:', msg);
},
/**
* Formats the exception message for display in console.
*/
formatException : function(e)
{
var msg = e.type + " with message \""+e.message+"\"";
msg += " in "+e.file+"("+e.line+")\n";
msg += "Stack trace:\n";
var trace = e.trace;
for(var i = 0; i<trace.length; i++)
{
msg += " #"+i+" "+trace[i].file;
msg += "("+trace[i].line+"): ";
msg += trace[i]["class"]+"->"+trace[i]["function"]+"()"+"\n";
}
msg += e.version+" "+e.time+"\n";
return msg;
}
},
/**
* @return string JSON encoded data.
*/
encode : function(data)
{
return Prado.JSON.stringify(data);
},
/**
* @return mixed javascript data decoded from string using JSON decoding.
*/
decode : function(data)
{
if(typeof(data) == "string" && data.trim().length > 0)
return Prado.JSON.parse(data);
else
return null;
},
/**
* Dispatch a normal request, no timeouts or aborting of requests.
*/
dispatchNormalRequest : function(callback)
{
callback.options.postBody = callback._getPostData(),
callback.request(callback.url);
return true;
},
/**
* Abort the current priority request in progress.
*/
tryNextRequest : function()
{
var self = Prado.CallbackRequest;
//Logger.debug('trying next request');
if(typeof(self.currentRequest) == 'undefined' || self.currentRequest==null)
{
if(self.requestQueue.length > 0)
return self.dispatchQueue();
//else
//Logger.warn('empty queque');
}
//else
//Logger.warn('current request ' + self.currentRequest.id);
},
/*
* Checks which scripts are used by the response and ensures they're loaded
*/
loadScripts : function(request, transport, callback)
{
var self = Prado.CallbackRequest;
var data = request.getBodyContentPart(self.SCRIPTLIST_HEADER);
if (!this.ScriptsToLoad) this.ScriptsToLoad = new Array();
this.ScriptLoadFinishedCallback = callback;
if (typeof(data) == "string" && data.length > 0)
{
json = Prado.CallbackRequest.decode(data);
if(typeof(json) != "object")
Logger.warn("Invalid script list:"+data);
else
for(var key in json)
if (/^\d+$/.test(key))
{
var url = json[key];
if (!Prado.ScriptManager.isAssetLoaded(url))
this.ScriptsToLoad.push(url);
}
}
this.loadNextScript();
},
loadNextScript: function()
{
var done = (!this.ScriptsToLoad || (this.ScriptsToLoad.length==0));
if (!done)
{
var url = this.ScriptsToLoad.shift(); var obj = this;
if (
Prado.ScriptManager.ensureAssetIsLoaded(url,
function() {
obj.loadNextScript();
}
)
)
this.loadNextScript();
}
else
{
if (this.ScriptLoadFinishedCallback)
{
var cb = this.ScriptLoadFinishedCallback;
this.ScriptLoadFinishedCallback = null;
cb();
}
}
},
loadStyleSheetsCode : function(request, transport)
{
var self = Prado.CallbackRequest;
var data = request.getBodyContentPart(self.STYLESHEET_HEADER);
if (typeof(data) == "string" && data.length > 0)
{
json = Prado.CallbackRequest.decode(data);
if(typeof(json) != "object")
Logger.warn("Invalid stylesheet list:"+data);
else
for(var key in json)
if (/^\d+$/.test(key))
Prado.StyleSheetManager.createStyleSheetCode(json[key],null);
}
},
loadStyleSheetsAsync : function(request, transport)
{
var self = Prado.CallbackRequest;
var data = request.getBodyContentPart(self.STYLESHEETLIST_HEADER);
if (typeof(data) == "string" && data.length > 0)
{
json = Prado.CallbackRequest.decode(data);
if(typeof(json) != "object")
Logger.warn("Invalid stylesheet list:"+data);
else
for(var key in json)
if (/^\d+$/.test(key))
Prado.StyleSheetManager.ensureAssetIsLoaded(json[key],null);
}
},
loadStyleSheets : function(request, transport, callback)
{
var self = Prado.CallbackRequest;
var data = request.getBodyContentPart(self.STYLESHEETLIST_HEADER);
if (!this.StyleSheetsToLoad) this.StyleSheetsToLoad = new Array();
this.StyleSheetLoadFinishedCallback = callback;
if (typeof(data) == "string" && data.length > 0)
{
json = Prado.CallbackRequest.decode(data);
if(typeof(json) != "object")
Logger.warn("Invalid stylesheet list:"+data);
else
for(var key in json)
if (/^\d+$/.test(key))
{
var url = json[key];
if (!Prado.StyleSheetManager.isAssetLoaded(url))
this.StyleSheetsToLoad.push(url);
}
}
this.loadNextStyleSheet();
},
loadNextStyleSheet: function()
{
var done = (!this.StyleSheetsToLoad || (this.StyleSheetsToLoad.length==0));
if (!done)
{
var url = this.StyleSheetsToLoad.shift(); var obj = this;
if (
Prado.StyleSheetManager.ensureAssetIsLoaded(url,
function() {
obj.loadNextStyleSheet();
}
)
)
this.loadNextStyleSheet();
}
else
{
if (this.StyleSheetLoadFinishedCallback)
{
var cb = this.StyleSheetLoadFinishedCallback;
this.StyleSheetLoadFinishedCallback = null;
cb();
}
}
},
/*
* Checks which assets are used by the response and ensures they're loaded
*/
loadAssets : function(request, transport, callback)
{
/*
! This is the callback-based loader for stylesheets, which loads them one-by-one, and
! waits for all of them to be loaded before loading scripts and processing the rest of
! the callback.
!
! That however is not neccessary, as stylesheets can be loaded asynchronously too.
!
! I leave this code here for the case that this turns out to be a compatibility issue
! (for ex. I can imagine some scripts trying to access stylesheet properties and such)
! so if need can be reactivated. If you do so, comment out the async stylesheet loader below!
var obj = this;
this.loadStyleSheets(request,transport, function() {
obj.loadScripts(request,transport,callback);
});
*/
this.loadStyleSheetsCode(request,transport);
this.loadStyleSheetsAsync(request,transport);
this.loadScripts(request,transport,callback);
},
checkHiddenField: function(name, value)
{
var id = name.replace(':','_');
if (!document.getElementById(id))
{
var field = document.createElement('input');
field.setAttribute('type','hidden');
field.id = id;
field.name = name;
field.value = value;
document.body.appendChild(field);
}
},
checkHiddenFields : function(request, transport)
{
var self = Prado.CallbackRequest;
var data = request.getBodyContentPart(self.HIDDENFIELDLIST_HEADER);
if (typeof(data) == "string" && data.length > 0)
{
json = Prado.CallbackRequest.decode(data);
if(typeof(json) != "object")
Logger.warn("Invalid hidden field list:"+data);
else
for(var key in json)
this.checkHiddenField(key,json[key]);
}
},
/**
* Updates the page state. It will update only if EnablePageStateUpdate and
* HasPriority options are both true.
*/
updatePageState : function(request, transport)
{
var self = Prado.CallbackRequest;
var pagestate = $(self.FIELD_CALLBACK_PAGESTATE);
var enabled = request.ActiveControl.EnablePageStateUpdate && request.ActiveControl.HasPriority;
var aborted = typeof(self.currentRequest) == 'undefined' || self.currentRequest == null;
if(enabled && !aborted && pagestate)
{
var data = request.getBodyContentPart(self.PAGESTATE_HEADER);
if(typeof(data) == "string" && data.length > 0)
pagestate.value = data;
else
{
if(typeof(Logger) != "undefined")
Logger.warn("Missing page state:"+data);
//Logger.warn('## bad state: setting current request to null');
self.endCurrentRequest();
//self.tryNextRequest();
return false;
}
}
self.endCurrentRequest();
//Logger.warn('## state updated: setting current request to null');
//self.tryNextRequest();
return true;
},
enqueue : function(callback)
{
var self = Prado.CallbackRequest;
self.requestQueue.push(callback);
//Logger.warn("equeued "+callback.id+", current queque length="+self.requestQueue.length);
self.tryNextRequest();
},
dispatchQueue : function()
{
var self = Prado.CallbackRequest;
//Logger.warn("dispatching queque, length="+self.requestQueue.length+" request="+self.currentRequest);
var callback = self.requestQueue.shift();
self.currentRequest = callback;
//get data
callback.options.postBody = callback._getPostData(),
//callback.request = new Prado.AjaxRequest(callback);
callback.timeout = setTimeout(function()
{
//Logger.warn("priority timeout");
self.abortRequest(callback.id);
},callback.ActiveControl.RequestTimeOut);
callback.request(callback.url);
//Logger.debug("dispatched "+self.currentRequest.id + " ...")
},
endCurrentRequest : function()
{
var self = Prado.CallbackRequest;
if(typeof(self.currentRequest) != 'undefined' && self.currentRequest != null)
clearTimeout(self.currentRequest.timeout);
self.currentRequest=null;
},
abortRequest : function(id)
{
//Logger.warn("abort id="+id);
var self = Prado.CallbackRequest;
if(typeof(self.currentRequest) != 'undefined'
&& self.currentRequest != null && self.currentRequest.id == id)
{
var request = self.currentRequest;
if(request.transport.readyState < 4)
request.transport.abort();
//Logger.warn('## aborted: setting current request to null');
self.endCurrentRequest();
}
self.tryNextRequest();
}
});
/**
* Automatically aborts the current request when a priority request has returned.
*/
Ajax.Responders.register({onComplete : function(request)
{
if(request && request instanceof Prado.AjaxRequest)
{
if(request.ActiveControl.HasPriority)
Prado.CallbackRequest.tryNextRequest();
}
}});
//Add HTTP exception respones when logger is enabled.
Event.OnLoad(function()
{
if(typeof Logger != "undefined")
Ajax.Responders.register(Prado.CallbackRequest.Exception);
});
/**
* Create and prepare a new callback request.
* Call the dispatch() method to start the callback request.
* <code>
* request = new Prado.CallbackRequest(UniqueID, callback);
* request.dispatch();
* </code>
*/
Prado.CallbackRequest.prototype = Object.extend(Prado.AjaxRequest.prototype,
{
/**
* Prepare and inititate a callback request.
*/
initialize : function(id, options)
{
/**
* Callback URL, same url as the current page.
*/
this.url = this.getCallbackUrl();
this.transport = Ajax.getTransport();
this.Enabled = true;
this.id = id;
this.randomId = this.randomString();
if(typeof(id)=="string"){
Prado.CallbackRequest.requests[id+"__"+this.randomId] = this;
}
this.setOptions(Object.extend(
{
RequestTimeOut : 30000, // 30 second timeout.
EnablePageStateUpdate : true,
HasPriority : true,
CausesValidation : true,
ValidationGroup : null,
PostInputs : true
}, options || {}));
this.ActiveControl = this.options;
Prado.CallbackRequest.requests[id+"__"+this.randomId].ActiveControl = this.options;
},
/**
* Sets the request options
* @return {Array} request options.
*/
setOptions: function(options){
this.options = {
method: 'post',
asynchronous: true,
contentType: 'application/x-www-form-urlencoded',
encoding: 'UTF-8',
parameters: '',
evalJSON: true,
evalJS: true
};
Object.extend(this.options, options || { });
this.options.method = this.options.method.toLowerCase();
if(Object.isString(this.options.parameters)){
this.options.parameters = this.options.parameters.toQueryParams();
}
},
/**
* Gets the url from the forms that contains the PRADO_PAGESTATE
* @return {String} callback url.
*/
getCallbackUrl : function()
{
return $('PRADO_PAGESTATE').form.action;
},
/**
* Sets the request parameter
* @param {Object} parameter value
*/
setCallbackParameter : function(value)
{
var requestId = this.id+"__"+this.randomId;
this.ActiveControl['CallbackParameter'] = value;
Prado.CallbackRequest.requests[requestId].ActiveControl['CallbackParameter'] = value;
},
/**
* @return {Object} request paramater value.
*/
getCallbackParameter : function()
{
return Prado.CallbackRequest.requests[this.id+"__"+this.randomId].ActiveControl['CallbackParameter'];
},
/**
* Sets the callback request timeout.
* @param {integer} timeout in milliseconds
*/
setRequestTimeOut : function(timeout)
{
this.ActiveControl['RequestTimeOut'] = timeout;
},
/**
* @return {integer} request timeout in milliseconds
*/
getRequestTimeOut : function()
{
return this.ActiveControl['RequestTimeOut'];
},
/**
* Set true to enable validation on callback dispatch.
* @param {boolean} true to validate
*/
setCausesValidation : function(validate)
{
this.ActiveControl['CausesValidation'] = validate;
},
/**
* @return {boolean} validate on request dispatch
*/
getCausesValidation : function()
{
return this.ActiveControl['CausesValidation'];
},
/**
* Sets the validation group to validate during request dispatch.
* @param {string} validation group name
*/
setValidationGroup : function(group)
{
this.ActiveControl['ValidationGroup'] = group;
},
/**
* @return {string} validation group name.
*/
getValidationGroup : function()
{
return this.ActiveControl['ValidationGroup'];
},
/**
* Dispatch the callback request.
*/
dispatch : function()
{
//Logger.info("dispatching request");
//trigger tinyMCE to save data.
if(typeof tinyMCE != "undefined")
tinyMCE.triggerSave();
if(this.ActiveControl.CausesValidation && typeof(Prado.Validation) != "undefined")
{
var form = this.ActiveControl.Form || Prado.Validation.getForm();
if(Prado.Validation.validate(form,this.ActiveControl.ValidationGroup,this) == false)
return false;
}
if(this.ActiveControl.onPreDispatch)
this.ActiveControl.onPreDispatch(this,null);
if(!this.Enabled)
return;
// Opera don't have onLoading/onLoaded state, so, simulate them just
// before sending the request.
if (Prototype.Browser.Opera)
{
if (this.ActiveControl.onLoading)
{
this.ActiveControl.onLoading(this,null);
Ajax.Responders.dispatch('onLoading',this, this.transport,null);
}
if (this.ActiveControl.onLoaded)
{
this.ActiveControl.onLoaded(this,null);
Ajax.Responders.dispatch('onLoaded',this, this.transport,null);
}
}
var result;
if(this.ActiveControl.HasPriority)
{
return Prado.CallbackRequest.enqueue(this);
//return Prado.CallbackRequest.dispatchPriorityRequest(this);
}
else
return Prado.CallbackRequest.dispatchNormalRequest(this);
},
abort : function()
{
return Prado.CallbackRequest.abortRequest(this.id);
},
/**
* Collects the form inputs, encode the parameters, and sets the callback
* target id. The resulting string is the request content body.
* @return string request body content containing post data.
*/
_getPostData : function()
{
var data = {};
var callback = Prado.CallbackRequest;
if(this.ActiveControl.PostInputs != false)
{
callback.PostDataLoaders.each(function(name)
{
var elements=$A(document.getElementsByName(name));
if(elements.size() == 0)
{
name += '[]';
elements=$A(document.getElementsByName(name));
}
elements.each(function(element)
{
//IE will try to get elements with ID == name as well.
if(element.type && element.name == name)
{
var value = $F(element);
if(typeof(value) != "undefined" && value != null)
data[name] = value;
}
})
})
}
if(typeof(this.ActiveControl.CallbackParameter) != "undefined")
data[callback.FIELD_CALLBACK_PARAMETER] = callback.encode(this.getCallbackParameter());
var pageState = $F(callback.FIELD_CALLBACK_PAGESTATE);
if(typeof(pageState) != "undefined")
data[callback.FIELD_CALLBACK_PAGESTATE] = pageState;
data[callback.FIELD_CALLBACK_TARGET] = this.id;
if(this.ActiveControl.EventTarget)
data[callback.FIELD_POSTBACK_TARGET] = this.ActiveControl.EventTarget;
if(this.ActiveControl.EventParameter)
data[callback.FIELD_POSTBACK_PARAMETER] = this.ActiveControl.EventParameter;
return $H(data).toQueryString();
},
/**
* Creates a random string with a length of 8 chars.
* @return string
*/
randomString : function()
{
chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
randomString = "";
for(x=0;x<8;x++)
randomString += chars.charAt(Math.floor(Math.random() * 62));
return randomString
}
});
/**
* Create a new callback request using default settings.
* @param string callback handler unique ID.
* @param mixed parameter to pass to callback handler on the server side.
* @param function client side onSuccess event handler.
* @param object additional request options.
* @return boolean always false.
*/
Prado.Callback = function(UniqueID, parameter, onSuccess, options)
{
var callback =
{
'CallbackParameter' : parameter || '',
'onSuccess' : onSuccess || Prototype.emptyFunction
};
Object.extend(callback, options || {});
var request = new Prado.CallbackRequest(UniqueID, callback);
request.dispatch();
return false;
};
/**
* Asset manager classes for lazy loading of scripts and stylesheets
* @author Gabor Berczi (gabor.berczi@devworx.hu)
*/
if (typeof(Prado.AssetManagerClass)=="undefined") {
Prado.AssetManagerClass = Class.create();
Prado.AssetManagerClass.prototype = {
initialize: function() {
this.loadedAssets = new Array();
this.discoverLoadedAssets();
},
/**
* Detect which assets are already loaded by page markup.
* This is done by looking up all <asset> elements and registering the values of their src attributes.
*/
discoverLoadedAssets: function() {
// wait until document has finished loading to avoid javascript errors
if (!document.body) return;
var assets = this.findAssetUrlsInMarkup();
for(var i=0;i<assets.length;i++)
this.markAssetAsLoaded(assets[i]);
},
/**
* Extend url to a fully qualified url.
* @param string url
*/
makeFullUrl: function(url) {
// this is not intended to be a fully blown url "canonicalizator",
// just to handle the most common and basic asset paths used by Prado
if (!this.baseUri) this.baseUri = window.location;
if (url.indexOf('://')==-1)
{
var a = document.createElement('a');
a.href = url;
if (a.href.indexOf('://')!=-1)
url = a.href;
else
{
var path = a.pathname;
if (path.substr(0,1)!='/') path = '/'+path;
url = this.baseUri.protocol+'//'+this.baseUri.host+path;
}
}
return url;
},
isAssetLoaded: function(url) {
url = this.makeFullUrl(url);
return (this.loadedAssets.indexOf(url)!=-1);
},
/**
* Mark asset as being already loaded
* @param string url of the asset
*/
markAssetAsLoaded: function(url) {
url = this.makeFullUrl(url);
if (this.loadedAssets.indexOf(url)==-1)
this.loadedAssets.push(url);
},
assetReadyStateChanged: function(url, element, callback, finalevent) {
if (finalevent || (element.readyState == 'loaded') || (element.readyState == 'complete'))
if (!element.assetCallbackFired)
{
element.assetCallbackFired = true;
callback(url,element);
}
},
assetLoadFailed: function(url, element, callback) {
debugger;
element.assetCallbackFired = true;
if(typeof Logger != "undefined")
Logger.error("Failed to load asset: "+url, this);
if (!element.assetCallbackFired)
callback(url,element,false);
},
/**
* Load a new asset dynamically into the page.
* Please not thet loading is asynchronous and therefore you can't assume that
* the asset is loaded and ready when returning from this function.
* @param string url of the asset to load
* @param callback will be called when the asset has loaded (or failed to load)
*/
startAssetLoad: function(url, callback) {
// create new <asset> element in page header
var asset = this.createAssetElement(url);
if (callback)
{
asset.onreadystatechange = this.assetReadyStateChanged.bind(this, url, asset, callback, false);
asset.onload = this.assetReadyStateChanged.bind(this, url, asset, callback, true);
asset.onerror = this.assetLoadFailed.bind(this, url, asset, callback);
asset.assetCallbackFired = false;
}
var head = document.getElementsByTagName('head')[0];
head.appendChild(asset);
// mark this asset as loaded
this.markAssetAsLoaded(url);
return (callback!=false);
},
/**
* Check whether a asset is loaded into the page, and if itsn't, load it now
* @param string url of the asset to check/load
* @return boolean returns true if asset is already loaded, or false, if loading has just started. callback will be called when loading has finished.
*/
ensureAssetIsLoaded: function(url, callback) {
url = this.makeFullUrl(url);
if (this.loadedAssets.indexOf(url)==-1)
{
this.startAssetLoad(url,callback);
return false;
}
else
return true;
}
}
};
Prado.ScriptManagerClass = Class.extend(Prado.AssetManagerClass, {
findAssetUrlsInMarkup: function() {
var urls = new Array();
var scripts = document.getElementsByTagName('script');
for(var i=0;i<scripts.length;i++)
{
var e = scripts[i]; var src = e.src;
if (src!="")
urls.push(src);
}
return urls;
},
createAssetElement: function(url) {
var asset = document.createElement('script');
asset.type = 'text/javascript';
asset.src = url;
// asset.async = false; // HTML5 only
return asset;
}
});
Prado.StyleSheetManagerClass = Class.extend(Prado.AssetManagerClass, {
findAssetUrlsInMarkup: function() {
var urls = new Array();
var scripts = document.getElementsByTagName('link');
for(var i=0;i<scripts.length;i++)
{
var e = scripts[i]; var href = e.href;
if ((e.rel=="stylesheet") && (href.length>0))
urls.push(href);
}
return urls;
},
createAssetElement: function(url) {
var asset = document.createElement('link');
asset.rel = 'stylesheet';
asset.media = 'screen';
asset.setAttribute('type', 'text/css');
asset.href = url;
// asset.async = false; // HTML5 only
return asset;
},
createStyleSheetCode: function(code) {
var asset = document.createElement('style');
asset.setAttribute('type', 'text/css');
if(asset.styleSheet)
asset.styleSheet.cssText = code; // IE7+IE8
else {
var cssCodeNode = document.createTextNode(code);
asset.appendChild(cssCodeNode);
}
var head = document.getElementsByTagName('head')[0];
head.appendChild(asset);
}
});
if (typeof(Prado.ScriptManager)=="undefined") Prado.ScriptManager = new Prado.ScriptManagerClass();
if (typeof(Prado.StyleSheetManager)=="undefined") Prado.StyleSheetManager = new Prado.StyleSheetManagerClass();
// make sure we scan for loaded scripts again when the page has been loaded
var discover = function() {
Prado.ScriptManager.discoverLoadedAssets();
Prado.StyleSheetManager.discoverLoadedAssets();
}
if (window.attachEvent) window.attachEvent('onload', discover);
else if (window.addEventListener) window.addEventListener('load', discover, false);