if (typeof(Trace_INLINEREQUEST) == "undefined")
{
Trace_INLINEREQUEST = false;
}
if (typeof InlineRequestType == "undefined")
{
var InlineRequestType = new function()
{
this.PLAIN = 1;
this.HTML = 2;
this.XML = 3;
this.JSON = 4;
this.JAVASCRIPT = 5;
this.isValid = function(value)
{
return (value >= this.PLAIN && value <= this.JAVASCRIPT);
}
};
var InlineRequestEngine = new function()
{
this.GENERAL_FAILURE = 404;
this.REQUEST_TIMEOUT = 408;
this.getPreferences = function(type)
{
if (arguments.length < 1)
{
type = InlineRequestType.PLAIN;
}
return new InlineRequestPreferences(type);
};
this.sendRequest = function(prefs)
{
if (!validatePreferences(prefs))
{
if (Trace_INLINEREQUEST)
{
Trace_println("Preferences invalid");
Trace_dump(prefs);
}
return null;
}
var xhr = getXHR();
var xhrAborted = false;
var request = new InlineRequest(++nextRequestId, prefs, xhr);
if (request.isAsync())
{
watchAsyncRequest(request);
}
var method = request.getMethod();
var url;
if (method == "POST")
{
url = request.getBaseUrl();
}
else
{
url = request.getUrl();
}
xhr.open(method, url, request.isAsync());
var headers = request.getHeaders();
for (var header in headers)
{
xhr.setRequestHeader(header, headers[header]);
}
if (method == "POST" && !headers["Content-Type"])
{
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
}
try
{
if (Trace_INLINEREQUEST)
{
Trace_println("Inline request preferences:")
Trace_dump(prefs, /^(set|add)/);
Trace_println("Inline request parameters:")
Trace_dump(prefs.parameters.getMap());
}
xhr.send(request.getContent());
}
catch (e)
{
xhr.abort();
xhrAborted = true;
if (Trace_INLINEREQUEST)
{
Trace_println("XHR exception: " + e.description);
}
request.getErrorCallback()(this.GENERAL_FAILURE, prefs);
request.setXhr(null);
}
if (!xhrAborted && !request.isAsync())
{
processResponse(request);
}
return request.getId();
};
this.stopRequest = function(id)
{
var stopped = false;
var request = findRequest(id);
if (request)
{
request.getXhr().abort();
stopped = true;
}
return stopped;
};
this.evalHtmlScripts = function(node)
{
var head = document.getElementsByTagName("head")[0];
var tags = node.getElementsByTagName("script");
for (var i = 0; i < tags.length; i++)
{
var tag = tags[i];
if (tag.src)
{
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = tag.src;
head.appendChild(script);
}
else if (tag.innerHTML)
{
if (g_clientInfo.isBrowser(ClientInfo.MSIE))
{
try
{
eval(tag.innerHTML.replace(/function ([a-zA-Z0-9_]*)\(/g,
"window[\"$1\"] = function("));
}
catch (e)
{
eval(tag.innerHTML);
}
}
else
{
window.eval(tag.innerHTML);
}
}
}
};
this.checkAsyncRequests = function()
{
var ongoingRequests = [];
for (var i = 0; i < asyncRequests.length; i++)
{
var request = asyncRequests[i];
var xhr = request.getXhr();
var completed = false;
if (xhr.readyState == 0)
{
completed = true;
}
else if (xhr.readyState == 4)
{
processResponse(request);
completed = true;
}
else if (request.isTimedOut())
{
xhr.abort();
if (Trace_INLINEREQUEST)
{
Trace_println("XHR timeout");
}
request.getErrorCallback()(this.REQUEST_TIMEOUT, request.getPreferences());
completed = true;
}
if (completed)
{
request.setXhr(null);
}
else
{
ongoingRequests.push(request);
}
}
asyncRequests = ongoingRequests;
clearTimeout(asyncRequestTimer);
asyncRequestTimer = null;
if (asyncRequests.length > 0) {
asyncRequestTimer = setTimeout(InlineRequestEngine.checkAsyncRequests, 10);
}
};
function validatePreferences(prefs)
{
return ((prefs.method.toUpperCase() == "POST" || prefs.method.toUpperCase() == "GET")
&& prefs.url != null
&& InlineRequestType.isValid(prefs.type));
}
function getXHR()
{
var msVersions = ["Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];
var xhr = null;
if (typeof window.XMLHttpRequest != 'undefined')
{
xhr = new XMLHttpRequest();
}
else
{
for (var i = 0; i < msVersions.length; i++)
{
try
{
xhr = new ActiveXObject(msVersions[i]);
msVersions = [ msVersions[i] ];
break;
}
catch(e)
{
xhr = null;
}
}
}
return xhr;
}
var nextRequestId = 0;
var asyncRequests = [];
var asyncRequestTimer = null;
function watchAsyncRequest(request)
{
request.setStartTime((new Date()).getTime());
asyncRequests.push(request);
if (!asyncRequestTimer){
asyncRequestTimer = setTimeout(InlineRequestEngine.checkAsyncRequests, 10);
}
}
function findRequest(id)
{
for (var i = 0; i < asyncRequests.length; i++)
{
var request = asyncRequests[i];
if (request && request.getId() == id)
{
return request;
}
}
return null;
}
function processResponse(request)
{
var xhr = request.getXhr();
var status = xhr.status;
if (!((status >= 200 && status < 300)
|| status == 304
|| (status == 0 && location.protocol == "file:")))
{
if (Trace_INLINEREQUEST)
{
Trace_println("XHR request failed; status = " + status);
}
request.getErrorCallback()(status, request.getPreferences());
request.setXhr(null);
return;
}
var responseData;
switch (request.getType())
{
case InlineRequestType.XML:
responseData = xhr.responseXML;
break;
case InlineRequestType.JSON:
try
{
responseData = eval("(" + xhr.responseText + ")");
}
catch(e)
{
responseData = false;
}
break;
case InlineRequestType.JAVASCRIPT:
try
{
responseData = eval(xhr.responseText);
}
catch(e)
{
responseData = false;
}
break;
case InlineRequestType.HTML:
responseData = xhr.responseText;
var node = request.getTargetNode();
if (node)
{
if ((typeof node == "string") || (node instanceof String))
{
node = document.getElementById(node);
}
node.innerHTML = responseData;
if (request.getEvalScripts())
{
InlineRequestEngine.evalHtmlScripts(node);
}
}
break;
case InlineRequestType.PLAIN:
default:
responseData = xhr.responseText;
break;
}
request.getCallback()(responseData, request.getPreferences());
}
function InlineRequestPreferences(type)
{
this.type = type;
this.method = null;
this.url = null;
this.parameters = new wdk.lang.MultiMap();
this.headers = {};
this.isAsync = true;
this.timeout = 0;
this.callback = null;
this.errorCallback = null;
this.htmlOptions = {};
}
InlineRequestPreferences.prototype.setMethod = function(method)
{
this.method = method;
}
InlineRequestPreferences.prototype.setUrl = function(url)
{
this.url = url;
};
InlineRequestPreferences.prototype.setParameters = function(parameters)
{
this.parameters = parameters;
};
InlineRequestPreferences.prototype.addParameters = function(parameters)
{
this.parameters.addMap(parameters);
};
InlineRequestPreferences.prototype.setParameter = function(name, value)
{
this.parameters.set(name, value);
};
InlineRequestPreferences.prototype.addParameter = function(name, value)
{
this.parameters.add(name, value);
};
InlineRequestPreferences.prototype.setHeader = function(name, value)
{
this.headers[name] = value;
};
InlineRequestPreferences.prototype.setAsync = function(isAsync)
{
this.isAsync = isAsync;
};
InlineRequestPreferences.prototype.setCallback = function(callback)
{
this.callback = callback;
};
InlineRequestPreferences.prototype.setErrorCallback = function(callback)
{
this.errorCallback = callback;
};
InlineRequestPreferences.prototype.setTimeout = function(timeout)
{
this.timeout = timeout;
};
InlineRequestPreferences.prototype.setHtmlOptions = function(targetNode, bEvalScripts)
{
this.htmlOptions["targetNode"] = targetNode;
this.htmlOptions["bEvalScripts"] = bEvalScripts;
};
function InlineRequest (id, prefs, xhr)
{
this.id = id;
this.prefs = prefs;
this.xhr = xhr;
var type_map = ["text/plain", "text/html", "application/xml", "text/json", "text/javascript"];
this.mimetype = type_map[this.prefs.type - 1];
}
InlineRequest.prototype.getId = function()
{
return this.id;
}
InlineRequest.prototype.getPreferences = function()
{
return this.prefs;
}
InlineRequest.prototype.getXhr = function()
{
return this.xhr;
}
InlineRequest.prototype.setXhr = function(xhr)
{
this.xhr = xhr;
}
InlineRequest.prototype.getType = function()
{
return this.prefs.type;
}
InlineRequest.prototype.getMethod = function()
{
var method = this.prefs.method || "POST";
return method.toUpperCase();
}
InlineRequest.prototype.getBaseUrl = function()
{
return this.prefs.url;
}
InlineRequest.prototype.getHeaders = function()
{
return this.prefs.headers;
}
InlineRequest.prototype.getCallback = function()
{
return wdk.common.getSafeFunction("callback", this.prefs.callback);
}
InlineRequest.prototype.getErrorCallback = function()
{
return wdk.common.getSafeFunction("error callback", this.prefs.errorCallback);
}
InlineRequest.prototype.getTimeout = function()
{
return this.prefs.timeout;
}
InlineRequest.prototype.setStartTime = function(time)
{
this.startTime = time;
}
InlineRequest.prototype.getStartTime = function()
{
return this.startTime;
}
InlineRequest.prototype.isTimedOut = function()
{
if (!this.prefs.timeout)
{
return false;
}
var now = (new Date()).getTime();
return (now > this.startTime + this.prefs.timeout);
}
InlineRequest.prototype.getTargetNode = function()
{
return this.prefs.htmlOptions["targetNode"];
}
InlineRequest.prototype.getEvalScripts = function()
{
return !!(this.prefs.htmlOptions["bEvalScripts"]);
}
InlineRequest.prototype.isAsync = function()
{
return this.prefs.isAsync;
}
InlineRequest.prototype.getMimeType = function()
{
return this.mimetype;
}
InlineRequest.prototype.getContent = function()
{
if (this.getMethod() != "POST")
{
return null;
}
var builder = new wdk.common.UrlBuilder(null);
builder.setParameters(this.prefs.parameters);
return builder.getQueryString();
}
InlineRequest.prototype.getUrl = function()
{
if (this.getMethod() == "POST")
{
return this.prefs.url;
}
var builder = new wdk.common.UrlBuilder(this.prefs.url);
builder.setParameters(this.prefs.parameters);
return builder.getUrl();
}
};
} // end if if (typeof InlineRequestType == "undefined")
function makePrefs(params) {
if (!params["type"])
{
throw Error("Mandatory value missing: type");
}
var prefs = InlineRequestEngine.getPreferences(params["type"]);
if (params["method"])
{
prefs.setMethod(params["method"]);
}
if (params["url"])
{
prefs.setUrl(params["url"]);
}
if (params["isAsync"] != null)
{
prefs.setAsync(params["isAsync"]);
}
if (params["timeout"])
{
prefs.setTimeout(params["timeout"]);
}
if (params["callback"])
{
prefs.setCallback(params["callback"]);
}
if (params["errorCallback"])
{
prefs.setErrorCallback(params["errorCallback"]);
}
if (params["parameters"])
{
var parameters = params["parameters"];
for (var param in parameters)
{
var value = parameters[param];
if (value instanceof Array)
{
for (var i = 0; i < value.length; i++)
{
prefs.addParameter(param, value[i]);
}
}
else
{
prefs.addParameter(param, value);
}
}
}
if (params["headers"])
{
var headers = params["headers"];
for (var header in headers)
{
prefs.setHeader(header, headers[header]);
}
}
if (params["htmlOptions"])
{
var options = params["htmlOptions"];
var targetNode = options["targetNode"];
if (targetNode)
{
var bEvalScripts = !!options["bEvalScripts"];
prefs.setHtmlOptions(targetNode, bEvalScripts);
}
}
return prefs;
}
function postInlineServerEvent(strFormId, prefs, strSrcCtrl, strHandlerCtrl, strHandlerMethod, strEventArgName, strEventArgValue)
{
if (Trace_INLINEREQUEST)
{
Trace_println("Entered postInlineServerEvent");
}
if (strHandlerMethod == null || strHandlerMethod == "" || (typeof strHandlerMethod == "undefined"))
{
throwError("postInlineServerEvent: strHandlerMethod is a mandatory parameter");
return;
}
if (acquireEventPostingLock() == false)
{
if (Trace_INLINEREQUEST)
{
Trace_println("...failed to get event posting lock");
}
return;
}
if (strFormId == null)
{
// If form doesn't exist, Safari returns NULL, other browsers return type 'undefined'. This check covers both.
if (document.forms && document.forms[0])
{
strFormId = document.forms[0].name;
}
}
var formElement = null;
var preSubmitHandler = null;
if (strFormId != null)
{
formElement = document[strFormId];
preSubmitHandler = window[strFormId + "_preSubmitForm"];
}
if (formElement && formElement.enctype == "multipart/form-data")
{
throwError("postInlineServerEvent: multipart/form-data is not supported");
return;
}
var functionArgs = arguments;
if (formElement && preSubmitHandler)
{
if (strHandlerCtrl == null || strHandlerCtrl == "" || (typeof strHandlerCtrl == "undefined"))
{
strHandlerCtrl = strFormId;
}
formElement.__dmfAction.value = strFormId + "_" + strHandlerMethod;
formElement.__dmfHandler.value = strFormId + "_" + strHandlerCtrl;
if (typeof(strSrcCtrl) != "undefined" && strSrcCtrl != null && strSrcCtrl != "")
{
formElement.__dmfControl.value = escapeUnicodeString(strFormId + "_" + strSrcCtrl);
}
else
{
formElement.__dmfControl.value = "";
}
var handlerArgs = new wdk.lang.MultiMap();
var EVENTARG_OFFSET = 5;
for (var iArg = EVENTARG_OFFSET; iArg < functionArgs.length; iArg+=2)
{
var strEventName = functionArgs[iArg];
if (strEventName != null)
{
var strEventValue = functionArgs[iArg+1];
if (typeof(strEventValue) != "undefined" && strEventValue != null)
{
handlerArgs.add(escapeUnicodeString(strEventName), escapeUnicodeString(strEventValue));
}
}
}
wdk.forms.addKeyStates(handlerArgs);
var builder = new wdk.common.UrlBuilder(null);
builder.setParameters(handlerArgs);
formElement.__dmfHandlerArgs.value = strFormId + "_" + builder.getQueryString();
if (Trace_INLINEREQUEST)
{
Trace_println("posting inline form event");
Trace_println("... action = " + formElement.__dmfAction.value);
Trace_println("... handler = " + formElement.__dmfHandler.value);
Trace_println("... handlerArgs = " + formElement.__dmfHandlerArgs.value);
Trace_println("... source control = " + formElement.__dmfControl.value);
}
storeScrollPosition(strFormId, g_arrXId[strFormId], g_arrYId[strFormId]);
var strControlId = null;
if ( strSrcCtrl != null )
{
var elements = document.getElementsByName(strSrcCtrl);
if ( elements && elements.length > 0 )
{
strControlId = elements[0].id;
}
}
firePreSubmitClientEvent(postServerEvent.GENERIC_PRE_SUBMIT);
preSubmitHandler(strFormId, strControlId);
prefs.addParameter("__dmfInlineRequest", "true")
wdk.forms.submitInline(formElement, prefs);
}
else
{
if (Trace_INLINEREQUEST)
{
Trace_println("postServerEvent for " + ((strFormId != null) ? strFormId : "forms[0]")
+ " in window '" + window.name + "', Form not found. Delaying Call by "
+ postServerEvent.DELAY_PERIOD + "ms");
}
if ( postServerEvent.m_delayCount++ < postServerEvent.MAX_DELAY_COUNT )
{
// Haven't reached the max delay attempt limit, so try delaying [again]
var delayed = _postInlineServerEventClosure.apply(this, functionArgs);
return setTimeout(delayed, postServerEvent.DELAY_PERIOD);
}
else
{
g_serverEventLock = 0;
postServerEvent.m_delayCount = 0;
if (Trace_INLINEREQUEST)
{
Trace_println("postServerEvent for " + ((strFormId != null) ? strFormId : "forms[0]")
+ " in window '" + window.name + "', ABORTING. Form not found after "
+ postServerEvent.MAX_DELAY_COUNT * postServerEvent.DELAY_PERIOD + "ms");
}
}
}
}
function _postInlineServerEventClosure()
{
var functionArgs = arguments;
return function()
{
g_serverEventLock = 0;
postInlineServerEvent.apply(this, functionArgs);
};
}
function makeActionCallback(callback)
{
return (function(data){_processActionResponse(data, callback);});
}
function _processActionResponse(data, callback)
{
releaseEventPostingLock();
var exception = data["EXCEPTION"];
if (exception)
{
var url = "/" + getVirtualDir() + "/component/errormessage";
var options = "width=620,height=460,location=no,status=no,menubar=no,toolbar=no,resizable=yes,scrollbars=yes";
var newwindow = window.open(url, "_blank", options);
newwindow.focus();
return; // Don't try to do anything else if there was an exception
}
var responseData = data["RESPONSE_DATA"];
var clientEvents = data["CLIENT_EVENTS"];
if (window.startRecordingTransaction)
{
startRecordingTransaction('ignoreControlEvent') ;
}
callback = wdk.common.getSafeFunction("action callback", callback);
callback(responseData);
processClientEvents(clientEvents);
if (window.stopRecordingTransaction)
{
stopRecordingTransaction('ignoreControlEvent');
}
}
function processClientEvents(clientEvents)
{
if (clientEvents && clientEvents instanceof Array)
{
for (var i = 0; i < clientEvents.length; i++)
{
var event = clientEvents[i];
var evtName = event["EVENT"];
var evtArgs = event["ARGS"];
evtArgs.unshift(evtName);
fireClientEvent.apply(window, evtArgs);
}
}
}

