var AjaxTCR = {};
AjaxTCR.comm = {
UNSENT : 0,
OPEN : 1,
SENT : 2,
LOADING : 3,
DONE : 4,
DEFAULT_REQUEST_METHOD : "GET",
DEFAULT_ASYNC : true,
DEFAULT_PREVENT_CACHE: false,
DEFAULT_CONTENT_TYPE : "application/x-www-form-urlencoded",
DEFAULT_CONTENT_TRANSFER_ENCODING : "",
DEFAULT_TRANSPORT_INDICATOR : true,
DEFAULT_TIMEOUT : 0,
DEFAULT_RETRIES : 0,
DEFAULT_SHOW_PROGRESS : false,
DEFAULT_PROGRESS_INTERVAL : 1000,
DEFAULT_ENFORCE_ORDER : false,
DEFAULT_CACHE_RESPONSE : false,
DEFAULT_USE_RAW : true,
DEFAULT_ONEWAY : false,
DEFAULT_REQUEST_SIGNATURE : "X-Signature",
DEFAULT_SIGNED_RESPONSE : false,
DEFAULT_TRANSPORT : "xhr",
DEFAULT_TRANSPORT_HEADER : "X-Requested-By",
DEFAULT_XHR_TRANSPORT_VALUE: "XHR",
DEFAULT_IFRAME_TRANSPORT_VALUE: "iframe",
DEFAULT_IMAGE_TRANSPORT_VALUE: "image",
DEFAULT_SCRIPT_TRANSPORT_VALUE: "HTMLScriptTag",
DEFAULT_FALLBACK : true,
DEFAULT_FALLBACK_TRANSPORT: "iframe",
DEFAULT_INSERTION_METHOD : "replace",
DEFAULT_CACHE_TEMPLATE : true,
DEFAULT_TEMPLATE_RENDER : "client",
TEMPLATE_SERVER_DEFINED : "dynamic",
_requestID : 0,
_requestsOutstanding : 0,
_networkErrorStatus : new Array(0, 408, 504, 3507, 12002, 12007, 12029, 12030, 12031, 12152),
setDefault : function(option, value){
AjaxTCR.comm[option] = value;
},
getDefault : function(option){
return AjaxTCR.comm[option]
},
sendRequest : function (url,options) {
var request = new Object();
request.requestID = ++AjaxTCR.comm._requestID;
request.method = AjaxTCR.comm.DEFAULT_REQUEST_METHOD;
request.async = AjaxTCR.comm.DEFAULT_ASYNC;
request.preventCache = AjaxTCR.comm.DEFAULT_PREVENT_CACHE;
request.requestContentType = AjaxTCR.comm.DEFAULT_CONTENT_TYPE;
request.requestContentTransferEncoding = AjaxTCR.comm.DEFAULT_CONTENT_TRANSFER_ENCODING;
request.payload = "";
request.headers = new Array();
request.transportIndicator = AjaxTCR.comm.DEFAULT_TRANSPORT_INDICATOR;
request.onSuccess = function(){};
request.onFail = function(){};
request.onCreate = null;
request.onOpen = null;
request.onSent = null;
request.onLoading = null;
request.onReceived = null;
request.abort = false;
request.inProgress = true;
request.received = false;
request.showProgress = AjaxTCR.comm.DEFAULT_SHOW_PROGRESS;
request.progressInterval = AjaxTCR.comm.DEFAULT_PROGRESS_INTERVAL;
request.onProgress = function (){};
request.progressTimerID = null;
request.timespent = 0;
request.timeout = AjaxTCR.comm.DEFAULT_TIMEOUT;
request.onTimeout = function(){};
request.timeoutTimerID = null;
request.retries = AjaxTCR.comm.DEFAULT_RETRIES;
request.retryCount = 1;
request.onRetry = function (){};
request.inQueue = false;
request.responseQueueID = 0;
request.enforceOrder = AjaxTCR.comm.DEFAULT_ENFORCE_ORDER;
request.cacheResponse = AjaxTCR.comm.DEFAULT_CACHE_RESPONSE;
request.fromCache = false;
request.onPrefetch = function(){};
request.isPrefetch = false;
request.serializeForm = null;
request.hasFile = false;
request.outputTarget = null;
request.useRaw = AjaxTCR.comm.DEFAULT_USE_RAW;
request.insertionType = AjaxTCR.comm.DEFAULT_INSERTION_METHOD;
request.oneway = AjaxTCR.comm.DEFAULT_ONEWAY;
request.username = null;
request.password = null;
request.requestSignature = AjaxTCR.comm.DEFAULT_REQUEST_SIGNATURE;
request.signRequest = null;
request.signedResponse = AjaxTCR.comm.DEFAULT_SIGNED_RESPONSE;
request.history = null;
request.transport = AjaxTCR.comm.DEFAULT_TRANSPORT;
request.fallback = AjaxTCR.comm.DEFAULT_FALLBACK;
request.fallbackTransport = AjaxTCR.comm.DEFAULT_FALLBACK_TRANSPORT;
request.cookieName = null;
request.template = null;
request.templateRender = AjaxTCR.comm.DEFAULT_TEMPLATE_RENDER;
request.cacheTemplate = AjaxTCR.comm.DEFAULT_CACHE_TEMPLATE;
request.shortTermCacheTemplate = false;
request.statusIndicator = null;
for (option in options)
request[option] = options[option];
if (request.isPrefetch)
request.cacheResponse = true;
if (AjaxTCR.history._backGuardEnabled == AjaxTCR.history.BACK_GUARD_INITIALIZED)
AjaxTCR.history._activateBackGuard();
if (request.template && request.template != AjaxTCR.comm.TEMPLATE_SERVER_DEFINED && request.templateRender == "client")
{
if (!AjaxTCR.template.getFromCache(request.template))
{
request.enforceOrder = true;
AjaxTCR.comm.sendRequest(request.template, {shortTermCacheTemplate:true, enforceOrder:true});
}
}
else if (request.template && request.template != AjaxTCR.comm.TEMPLATE_SERVER_DEFINED && request.templateRender == "server")
{
if (request.payload != "")
request.payload += "&";
request.payload += "templateURL=" + request.template;
}
if (request.serializeForm)
{
var newPayload = AjaxTCR.data.serializeForm(request.serializeForm,request.requestContentType);
if (newPayload == "fileupload")
request.hasFile = true;
else
{
if (request.payload)
{
if (typeof(request.payload) == "object")
newPayload = AjaxTCR.data.serializeObject(newPayload, request.payload, request.requestContentType);
else if (request.requestContentType == AjaxTCR.comm.DEFAULT_CONTENT_TYPE)
newPayload += "&" + request.payload;
}
request.payload = newPayload;
if (request.requestContentType == "application/json")
request.payload = AjaxTCR.data.encodeJSON(request.payload);
else if (request.requestContentType == "text/xml")
request.payload = AjaxTCR.data.serializeXML(request.payload);
if (request.requestContentTransferEncoding == "base64")
request.payload = AjaxTCR.data.encode64(request.payload);
}
}
if (request.history)
AjaxTCR.history.init(function(){});
if (request.history && !request.history.saveResponse)
AjaxTCR.history.addToHistory(request.history.id, "", request.history.title, url, options);
if (request.hasFile)
request.transport = "iframe";
request.transport = request.transport.toLowerCase();
if (request.transport == "script" || request.transport == "image")
request.method = "GET";
if (request.method.toUpperCase() == "GET" && request.payload != "")
request.url = url + "?" + request.payload;
else
request.url = url;
if (request.method.toUpperCase() == "POST")
request.postBody = request.payload;
else
request.postBody = null;
if (request.enforceOrder)
request.responseQueueID = AjaxTCR.comm.queue._responseQueue.maxID++;
var cachedResponse = null;
if (request.cacheResponse)
{
if (request.cacheKey == undefined)
request.cacheKey = request.url;
cachedResponse = AjaxTCR.comm.cache.get(request.cacheKey);
if (cachedResponse)
AjaxTCR.comm.cache._handleCacheResponse(request, cachedResponse);
}
if (!cachedResponse)
AjaxTCR.comm._makeRequest(request);
return request;
},
abortRequest : function(request) {
request.abort = true;
request.inProgress = false;
request.xhr.abort();
AjaxTCR.comm._requestsOutstanding--;
clearTimeout(request.timeoutTimerID);
request.timeoutTimerID = null;
if (request.progressTimerID)
{
clearTimeout(request.progressTimerID);
request.progressTimerID = null;
}
if (request.statusIndicator)
{
AjaxTCR.comm._removeProgressStatus(request.statusIndicator);
}
},
_createXHR : function() {
try { return new XMLHttpRequest(); } catch(e) {}
try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch (e) {}
try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); } catch (e) {}
try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {}
try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {}
return null;
},
_makeRequest : function (request) {
AjaxTCR.comm.stats._commResults.totalRequests++;
if (!request.oneway)
AjaxTCR.comm._initSend(request);
if (request.onCreate)
request.onCreate(request);
if (request.transport == "xhr")
AjaxTCR.comm._sendXHR(request);
else if (request.transport == "iframe")
AjaxTCR.comm._sendIframe(request);
else if (request.transport == "script")
AjaxTCR.comm._sendScript(request);
else if (request.transport == "image")
AjaxTCR.comm._sendImage(request);
},
_sendXHR : function(request){
request.xhr = AjaxTCR.comm._createXHR();
if (!request.xhr)
{
AjaxTCR.comm._fallbackOrError(request);
return;
}
try{
request.xhr.open(request.method, request.url, request.async, request.username, request.password);
}
catch(e){
AjaxTCR.comm._fallbackOrError(request);
return;
}
request.abort = false;
if (request.transportIndicator)
{
request.xhr.setRequestHeader(AjaxTCR.comm.DEFAULT_TRANSPORT_HEADER,AjaxTCR.comm.DEFAULT_XHR_TRANSPORT_VALUE);
request.xhr.setRequestHeader("X-Request-Id",request.requestID);
}
if (request.signRequest)
request.xhr.setRequestHeader(request.requestSignature, request.signRequest);
if (request.method.toUpperCase() == "POST")
{
request.xhr.setRequestHeader("Content-Type", request.requestContentType);
if (request.requestContentTransferEncoding != "")
request.xhr.setRequestHeader("Content-Transfer-Encoding", request.requestContentTransferEncoding);
}
if (request.preventCache)
request.xhr.setRequestHeader("If-Modified-Since", "Wed, 15 Nov 1995 04:58:08 GMT");
request.headerObj = {};
for (var i=0; i<request.headers.length;i++)
{
if (request.headers[i].name.toUpperCase() == "COOKIE")
document.cookie = request.headers[i].value;
else if(request.headerObj[request.headers[i].name] === undefined)
request.headerObj[request.headers[i].name] = request.headers[i].value;
else
request.headerObj[request.headers[i].name] = request.headers[i].value + "," + request.headerObj[request.headers[i].name];
}
for (var header in request.headerObj)
request.xhr.setRequestHeader(header, request.headerObj[header]);
if (!request.oneway)
{
request.xhr.onreadystatechange = function () {AjaxTCR.comm._handleReadyStateChange(request);};
if (request.async && request.timeout && request.timeoutTimerID == null)
request.timeoutTimerID = window.setTimeout( function(){AjaxTCR.comm._timeoutRequest(request);}, request.timeout);
}
request