nscomponentsreact
Version:
React Wrapper Components for NSComponents
1,150 lines (1,066 loc) • 28.7 kB
JavaScript
var nsModuleExport = function(root,name,prototype)
{
if(typeof exports === 'object' && typeof module === 'object')
{
module.exports[name] = prototype;
}
else if (typeof define === "function" && define.amd)
{
define(name,[], function () {return prototype;});
}
else if(typeof exports === 'object')
{
exports[name] = prototype;
}
else
{
root[name] = prototype;
}
};var nsIsWeb = function(root)
{
if(typeof exports === 'object' && typeof module === 'object')
{
return false;
}
else if (typeof define === "function" && define.amd)
{
return false;
}
else if(typeof exports === 'object')
{
return false;
}
else
{
return true;
}
};if(!nsIsWeb())
{
var nsutilRef = require('./nsUtil.min.js');
var NSUtil = nsutilRef.NSUtil;
}
;
var NSAjax = (function()
{
function NSAjax(defaultSetting)
{
var self = this;
self.__defaultSetting = defaultSetting || {};
var activeReq = 0;
self.__eligibleMethods = ["POST","GET","DELETE","HEAD","OPTIONS","PUT"];
/*var post = function(url,data,setting)
{
return processRequest(getSetting("POST",url,data,setting));
};
var get = function(url,data,setting)
{
return processRequest(getSetting("GET",url,data,setting));
};*/
var jsonp = function(url,data,setting)
{
setting = setting ? setting : {};
setting.dataType = "JSONP";
setting.url = url;
setting.param = data;
return processRequest(setting);
};
var getSetting = function(method,url,data,setting)
{
setting = setting ? setting : {};
setting.method = method || self.__defaultSetting.method;
setting.url = url || self.__defaultSetting.url;
setting.param = data || self.__defaultSetting.param;
setting.dataType = setting.dataType || self.__defaultSetting.dataType;
return setting;
};
var processRequest = function(setting)
{
var config = null;
var onInit = function()
{
if(!setting)
{
return;
}
self.util = new NSUtil();
self.ajaxUtil = new AjaxUtil(self);
self.dom = self.util.getDomVariables();
config = {
method: setting["method"] || "POST",
url: setting["url"] || "",
param: setting["param"] || {},
dataType: setting["dataType"] || "",
completeHandler: setting["completeHandler"],
timeOutHandler: setting["timeOutHandler"],
//if browser supports W3C Events then the below function will fire
loadStartHandler: setting["loadStartHandler"],
progressHandler: setting["progressHandler"],
abortHandler: setting["abortHandler"],
//end of browser supports W3C Events then the below function will fire
timeout: setting.timeout || -1,
header: setting["header"],
encodeParam: (typeof setting["encodeParam"] == "undefined") ? false : setting["encodeParam"],
processData: (typeof setting["processData"] == "undefined") ? true : setting["processData"],
mimeType: setting["mimeType"],
//should be set to false if param or data sent with get or post is of type FormData
setDefaultHeaders: (typeof setting["setDefaultHeaders"] == "undefined") ? true : setting["setDefaultHeaders"],
//enhanced inline with fetch
mode: setting["mode"] || "cors", // no-cors, *cors, same-origin
cache: setting["cache"] || "default", // *default, no-cache, reload, force-cache, only-if-cached
credentials: setting["credentials"] || "same-origin", // include, *same-origin, omit
jsonpCallback: setting["callback"],
jsonpType: setting["type"],
jsonpCharset: setting["charset"],
};
};
var getPromise = function()
{
if(config)
{
handleActiveReq(true);
var objPromise = (config.dataType.toUpperCase() === "JSONP") ? new AjaxJSONP(self,config,handleActiveReq) : AjaxNormal(self,config,handleActiveReq);
return objPromise;
}
return null;
};
onInit();
return getPromise();
};
var handleActiveReq = function(add)
{
if(add)
{
activeReq++;
if(activeReq == 1)
{
self.util.dispatchEvent(self.dom.win,NSAjax.REQUEST_STARTED);
}
}
else
{
activeReq--;
if(activeReq == 0)
{
self.util.dispatchEvent(self.dom.win,NSAjax.ALL_REQUEST_COMPLETED);
}
}
};
var addMethods = function()
{
for(var count = 0;count < self.__eligibleMethods.length;count++)
{
addMethod(self.__eligibleMethods[count]);
}
};
var addMethod = function(method)
{
if(!self[method.toLowerCase()])
{
self[method.toLowerCase()] = function(url,data,setting)
{
return processRequest(getSetting(method,url,data,setting));
};
}
};
addMethods();
/*self.post = post;
self.get = get;*/
self.jsonp = jsonp;
self.processRequest = processRequest;
};
var AjaxNormal = function(ajax,config,handleActiveReq)
{
var xhr = null;
var request = null;
var response = null;
var requestDone = false;
var resolve = null;
var reject = null;
var init = function()
{
var objPromise = new Promise(function(paramResolve,paramReject)
{
resolve = paramResolve;
reject = paramReject;
request = new AjaxRequest(ajax,config);
if(config.timeout > 0)
{
ajax.dom.win.setTimeout(function()
{
requestDone = true;
}, config.timeout);
}
xhr = getRequest();
xhr.open(request.method,request.url,true);
if("onloadstart" in xhr)
{
xhr.onloadstart = loadStartHandler;
xhr.onprogress = progressHandler;
xhr.onabort = abortHandler;
xhr.onerror = errorHandler;
xhr.onload = loadHandler;
xhr.ontimeout = timeOutHandler;
xhr.onloadend = loadEndHandler;
}
else
{
xhr.onreadystatechange = stateChange;
}
if (config.credentials == "include")
{
xhr.withCredentials = true;
}
else if (config.credentials == "omit")
{
xhr.withCredentials = false;
}
if ("responseType" in xhr)
{
if(ajax.ajaxUtil.browserSupprots.blob)
{
xhr.responseType = "blob";
}
else if(ajax.ajaxUtil.browserSupprots.arrayBuffer && request.headers["Content-Type"] &&
request.headers["Content-Type"].indexOf('application/octet-stream') != -1)
{
xhr.responseType = "arraybuffer";
}
}
for(var key in request.headers)
{
xhr.setRequestHeader(key,request.headers[key]);
}
xhr.send(request.params);
});
return objPromise;
};
var getRequest = function()
{
if (ajax.dom.win.XMLHttpRequest)
{
return new XMLHttpRequest();
}
else
{
var versions = ["Microsoft", "msxm3", "msxml2", "msxml1"];
for (var count = 0;count < versions.length; count++)
{
try
{
var version = versions[count] + ".XMLHTTP";
return new ActiveXObject(version);
}
catch (error)
{
}
}
}
return null;
};
var stateChange = function(object)
{
if(xhr.readyState == 4 && !requestDone)
{
var callback = function(value)
{
if(isRequestSuccess())
{
defaultSuccessHandler(value,response);
}
else
{
defaultErrorHandler(value,response);
}
defaultCompleteHandler();
xhr = null;
};
var data = getResponseData();
if(ajax.ajaxUtil.isPromise(data))
{
data.then(function(value)
{
callback(value);
});
}
else
{
callback(data);
defaultCompleteHandler();
xhr = null;
}
}
else if(xhr.readyState != 4 && requestDone)
{
if(config["timeOutHandler"])
{
config["timeOutHandler"]();
}
xhr.onreadystatechange = null;
}
};
var isRequestSuccess = function()
{
var retValue = false;
//if requesting a local resource
if(!xhr.status && location.protocol == "file:")
{
retValue = true;
}
// Any status in the 200 range is good
else if (xhr.status >= 200 && xhr.status < 300)
{
retValue = true;
}
//Successful if the document has not been modified and Safari returns an empty status if the file has not been modified
else if(xhr.status == 304 || (navigator.userAgent.indexOf("Safari") >= 0 && typeof xhr.status == "undefined"))
{
retValue = true;
}
return retValue;
};
var getResponseData = function()
{
response = new AjaxResponse(ajax,config,xhr);
var value = response.getValue();
return value;
};
var loadStartHandler = function(event)
{
if(config["loadStartHandler"])
{
config["loadStartHandler"]();
}
};
var progressHandler = function(event)
{
if(config["progressHandler"])
{
if (event.lengthComputable)
{
config["progressHandler"](event.loaded,event.total);
}
else
{
config["progressHandler"](event.loaded,-1);
}
}
};
var abortHandler = function(event)
{
if(config["abortHandler"])
{
config["abortHandler"](event);
}
defaultErrorHandler(event);
};
var errorHandler = function(event)
{
var data = getResponseData(event);
if(ajax.ajaxUtil.isPromise(data))
{
data.then(function(value)
{
defaultErrorHandler(event,value,response);
});
}
else
{
defaultErrorHandler(event,data,response);
}
};
var loadHandler = function(event)
{
var callback = function(value)
{
if(isRequestSuccess())
{
defaultSuccessHandler(value,response);
}
else
{
defaultErrorHandler(value,response);
}
};
var data = getResponseData();
if(ajax.ajaxUtil.isPromise(data))
{
data.then(function(value)
{
callback(value);
});
}
else
{
callback(data);
}
};
var timeOutHandler = function(event)
{
if(config["timeOutHandler"])
{
config["timeOutHandler"](event);
}
defaultErrorHandler(event);
};
var loadEndHandler = function(event)
{
defaultCompleteHandler();
};
var defaultSuccessHandler = function(value,response)
{
if(resolve)
{
resolve(value);
resolve = null;
handleActiveReq(false);
}
};
var defaultErrorHandler = function(value,response)
{
if(reject)
{
reject(value);
reject = null;
handleActiveReq(false);
}
};
var defaultCompleteHandler = function()
{
if(config.completeHandler)
{
config.completeHandler();
}
};
return init();
};
var AjaxJSONP = function(ajax,config,handleActiveReq)
{
var functionNameInitials = "nsjsonp";
var instanceNameInitials = "nsjsonpIns";
var random = -1;
var resolve = null;
var reject = null;
var origCallback = null;
var callback = null;
var objPromise = new Promise(function(parResolve,parReject)
{
var util = new NSUtil();
var getParam = function()
{
if(config.processData)
{
var strParam = "";
var param = config.param;
if(util.isString(param))
{
return param;
}
for(var paramKey in param)
{
if(param[paramKey])
{
if(config.encodeParam)
{
strParam += "&" + encodeURIComponent(paramKey) + "=" + encodeURIComponent(param[paramKey]);
}
else
{
strParam += "&" + paramKey + "=" + param[paramKey];
}
}
}
if(strParam && strParam.length > 1)
{
strParam = strParam.substring(1);
}
return strParam;
}
return config.param;
};
var createScript = function(url)
{
var domPosition = ajax.dom.doc.body;
var script = ajax.dom.doc.createElement("script");
script.async = true;
script.setAttribute("id", url);
if(config.jsonpType)
{
script.setAttribute("type",config.jsonpType);
}
if (config.jsonpCharset)
{
script.setAttribute("charset",config.jsonpCharset);
}
script.setAttribute("src",url);
script.onload = script.onreadystatechange = function()
{
if (!script.readyState || /loaded|complete/.test(script.readyState))
{
script.onload = script.onreadystatechange = null;
if (script.parentNode)
{
script.parentNode.removeChild(script);
}
script = null;
}
};
domPosition.appendChild(script);
};
var defaultSuccessHandler = function(response)
{
var win = ajax.dom.win;
var instanceName = instanceNameInitials + random;
if(win[instanceName])
{
win[instanceName] = null;
}
if(win[callback])
{
win[callback] = origCallback;
}
if(origCallback)
{
origCallback(response);
}
origCallback = null;
if(resolve)
{
resolve(response);
resolve = null;
handleActiveReq(false);
}
};
resolve = parResolve;
reject = parReject;
if(random == -1)
{
random = ajax.util.getUniqueId();
}
callback = config.jsonpCallback;
if(callback)
{
origCallback = util.getFunction(callback);
if(origCallback && util.isString(origCallback))
{
origCallback = null;
}
}
else
{
callback = functionNameInitials + random;
}
var instanceName = instanceNameInitials + random;
//ajax.dom.win[instanceName] = this;
ajax.dom.win[callback] = function(json){
defaultSuccessHandler(json);
};
var url = config.url + "?callback=" + callback;
var strParam = getParam();
if(strParam && strParam != "")
{
url += "&" + strParam;
}
createScript(url);
});
return objPromise;
};
var AjaxRequest = function(ajax,config)
{
var self = this;
var dom = null;
var init = function()
{
dom = ajax.dom;
self.method = getMethodName(config.method);
self.params = getParams();
self.headers = getHeader();
self.url = getUrl();
};
var getParams = function()
{
var param = config.param;
if(config.processData && param && !ajax.ajaxUtil.isTypeFormData(param))
{
if (self.method != "GET" && self.method != "HEAD" && config.dataType != null && config.dataType.toUpperCase() == "JSON" && !config.encodeParam && !ajax.util.isString(param))
{
return JSON.stringify(param);
}
if(ajax.util.isString(param))
{
return param;
}
if (self.method == "GET" || self.method == "HEAD")
{
var strParam = "";
for(var paramKey in param)
{
if(param[paramKey])
{
if(config.encodeParam)
{
strParam += "&" + encodeURIComponent(paramKey) + "=" + encodeURIComponent(param[paramKey]);
}
else
{
strParam += "&" + paramKey + "=" + param[paramKey];
}
}
}
if(strParam && strParam.length > 1)
{
strParam = strParam.substring(1);
}
return strParam;
}
}
return param;
};
var getHeader = function()
{
var header = config.header || {};
var dataType = config.dataType ? config.dataType : null;
var contentType = header["content-type"];
var param = config.param;
if(!contentType && !ajax.ajaxUtil.isTypeFormData(param))
{
if(dataType == "JSON")
{
contentType = "application/json";
}
else if(typeof param === "string")
{
contentType = "text/plain;charset=UTF-8";
}
else if(ajax.ajaxUtil.browserSupprots.blob && Blob.prototype.isPrototypeOf(param) && param.type)
{
contentType = param.type;
}
else if(ajax.ajaxUtil.browserSupprots.urlSearchParams && URLSearchParams.prototype.isPrototypeOf(param))
{
contentType = "application/x-www-form-urlencoded;charset=UTF-8";
}
}
if(contentType)
{
header["content-type"] = contentType;
}
return header;
};
var getUrl = function()
{
var url = config.url;
if(self.method == "GET" || self.method == "HEAD")
{
if(self.params && self.params != "")
{
url += "?" + self.params;
//so that send method sends as null for GET
self.params = null;
}
if(config.cache == "no-store" || config.cache == "no-cache")
{
// handling underscore parameter in the query string
var underscoreSearch = /([?&])_=[^&]*/;
if (underscoreSearch.test(url))
{
// If it already exists then set the value with the current time
url = url.replace(underscoreSearch, '$1_=' + new Date().getTime())
}
else
{
// Otherwise add a new '_' parameter to the end with the current time
var reQueryString = /\?/;
url += (reQueryString.test(url) ? '&' : '?') + '_=' + new Date().getTime();
}
}
}
try
{
url = (url == "" && dom.win.location.href) ? dom.win.location.href : url
}
catch (e)
{
}
return url;
};
var getMethodName = function(name)
{
var methodName = name.toUpperCase();
if(ajax.__eligibleMethods.indexOf(methodName) == -1)
{
ajax.util.throwNSError("NSAjax","Method is not valid");
}
return methodName;
};
init();
};
var AjaxResponse = function(ajax,config,xhr)
{
var self = this;
var init = function()
{
self.headers = getHeader();
self.status = (xhr.status == null) ? 200 : xhr.status;
self.statusText = (xhr.statusText == null) ? "" : ("" + xhr.statusText);
self.url = "responseURL" in xhr ? xhr.responseURL : self.headers["X-Request-URL"];
self.params = "response" in xhr ? xhr.response : xhr.responseText;
populateBodyParams(self.params);
};
var populateBodyParams = function(params)
{
self.__paramInit = params;
if(!params)
{
self.__paramText = "";
}
else if(typeof params == "string")
{
self.__paramText = params;
}
else if (ajax.ajaxUtil.browserSupprots.blob && Blob.prototype.isPrototypeOf(params))
{
self.__paramBlob = params;
}
else if (ajax.ajaxUtil.browserSupprots.formData && FormData.prototype.isPrototypeOf(params))
{
self.__paramFormData = params;
}
else if (ajax.ajaxUtil.browserSupprots.urlSearchParams && URLSearchParams.prototype.isPrototypeOf(params))
{
self.__paramText = params.toString();
}
else if (ajax.ajaxUtil.browserSupprots.arrayBuffer && ajax.ajaxUtil.browserSupprots.blob && ajax.ajaxUtil.isTypeDataView(params))
{
self.__paramArrayBuffer = ajax.ajaxUtil.bufferClone(params.buffer);
// IE 10-11 can't handle a DataView params.
self.__paramInit = new Blob([self.__paramArrayBuffer])
}
else if (ajax.ajaxUtil.browserSupprots.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(params) || ajax.ajaxUtil.isArrayBufferView(params)))
{
self.__paramArrayBuffer = ajax.ajaxUtil.bufferClone(params);
}
else
{
self.__paramText = params = Object.prototype.toString.call(params);
}
};
self.getValue = function()
{
var retValue = null;
//for some reason IE is taking Content-Type
var contentType = self.headers["content-type"] || self.headers["Content-Type"];
var dataType = xhr.dataType;
var isXMLData = false;
if(!dataType && contentType && contentType.indexOf("xml") > -1)
{
isXMLData = true;
}
if(contentType && contentType.indexOf("json") > -1)
{
retValue = self.getJson();
}
else if(isXMLData || (dataType && dataType.indexOf("xml") > -1))
{
retValue = xhr.responseXML;
}
else
{
retValue = self.getText();
}
// If the specified type is "script", execute the returned text response as if it was JavaScript
if (dataType == "script")
{
if(ajax.ajaxUtil.isPromise(retValue))
{
data.then(function(value)
{
eval.call(ajax.dom.win,value);
});
}
else
{
eval.call(ajax.dom.win,value);
}
}
return retValue;
};
self.getBlob = function()
{
if(ajax.ajaxUtil.browserSupprots.blob)
{
if(self.__paramBlob)
{
return Promise.resolve(self.__paramBlob);
}
else if (self.__paramArrayBuffer)
{
return Promise.resolve(new Blob([self.__paramArrayBuffer]));
}
else if (self.__paramFormData)
{
throw ajax.util.throwNSError("NSAjax","FormData body could not be read as blob");
}
else
{
return Promise.resolve(new Blob([self.__paramText]));
}
}
else
{
throw ajax.util.throwNSError("NSAjax","Blob is not supported");
}
};
self.getArrayBuffer = function()
{
if(ajax.ajaxUtil.browserSupprots.blob)
{
if (self.__paramArrayBuffer)
{
if(ArrayBuffer.isView(self.__paramArrayBuffer))
{
return Promise.resolve(
self.__paramArrayBuffer.buffer.slice(self.__paramArrayBuffer.byteOffset,(self.__paramArrayBuffer.byteOffset + self.__paramArrayBuffer.byteLength))
);
}
else
{
return Promise.resolve(self.__paramArrayBuffer);
}
}
else
{
return self.blob().then(ajax.ajaxUtil.readBlobAsArrayBuffer);
}
}
else
{
throw ajax.util.throwNSError("NSAjax","Blob is not supported");
}
};
self.getFormData = function()
{
if(ajax.ajaxUtil.browserSupprots.formData)
{
self.getText().then(decodeFormData);
}
else
{
throw ajax.util.throwNSError("NSAjax","FormData is not supported");
}
};
self.getText = function()
{
if (self.__paramBlob)
{
return ajax.ajaxUtil.readBlobAsText(self.__paramBlob);
}
else if (self.__paramArrayBuffer)
{
return Promise.resolve(ajax.ajaxUtil.readArrayBufferAsText(self.__paramArrayBuffer));
}
else if (self.__paramFormData)
{
throw ajax.util.throwNSError("NSAjax","FormData body could not be read as blob");
}
else
{
return Promise.resolve(self.__paramText);
}
};
self.getJson = function()
{
return self.getText().then(JSON.parse);
};
var decodeFormData = function(param)
{
param = param || "";
var objRet = new FormData();
var arrParam = param.trim().split("&");
for(var count = 0;count < arrParam.length;count++)
{
var bytes = arrParam[count];
var split = bytes.split("=");
var key = split.shift().replace(/\+/g, " ");
var value = split.join('=').replace(/\+/g," ");
objRet.append(decodeURIComponent(key), decodeURIComponent(value))
}
return objRet;
};
var getHeader = function()
{
var objHeader = {};
var strHeader = xhr.getAllResponseHeaders() || "";
//replace \r\n and \n with space
strHeader = strHeader.replace(/\r?\n[\t ]+/g," ");
var arrHeader = strHeader.split("\r");
for(var count = 0;count < arrHeader.length;count++)
{
var header = arrHeader[count];
header = (header.indexOf("\n") == 0) ? header.substr(1,header.length) : header;
var arrParts = header.split(':');
var key = arrParts.shift().trim();
if(key)
{
var value = arrParts.join(':').trim();
objHeader[key] = value;
}
}
return objHeader;
};
init();
};
var AjaxUtil = function(ajax)
{
var self = this;
var dom = null;
self.browserSupprots = null;
var init = function()
{
dom = ajax.util.getDomVariables();
self.browserSupprots = {blob: self.isBlobSupproted(),formData: self.isFormDataSupproted(),arrayBuffer: self.isArrayBufferSupproted(),
urlSearchParams: self.isURLSearchParamsSupproted(),iterator: self.isIterartorSupproted()};
};
self.isBlobSupproted = function()
{
if("FileReader" in dom.win && "FileReader" in dom.win)
{
try
{
new Blob();
return true;
}
catch (e)
{
}
}
return false;
};
self.isURLSearchParamsSupproted = function()
{
return "URLSearchParams" in dom.win;
};
self.isIterartorSupproted = function()
{
return "Symbol" in dom.win && "iterator" in Symbol;
};
self.isFormDataSupproted = function()
{
return "FormData" in dom.win;
};
self.isArrayBufferSupproted = function()
{
return "ArrayBuffer" in dom.win;
};
self.isTypeDataView = function(type)
{
return type && DataView.prototype.isPrototypeOf(type);
};
self.isTypeArrayBuffer = function(type)
{
if(ArrayBuffer.isView && type)
{
var arrayBufferClasses = [
'[object Int8Array]',
'[object Uint8Array]',
'[object Uint8ClampedArray]',
'[object Int16Array]',
'[object Uint16Array]',
'[object Int32Array]',
'[object Uint32Array]',
'[object Float32Array]',
'[object Float64Array]'
];
return arrayBufferClasses.indexOf(Object.prototype.toString.call(type)) > -1;
}
return false;
};
self.isTypeFormData = function(type)
{
return self.browserSupprots.formData && type && (Object.prototype.toString.call(type) == "[object FormData]");
};
self.isPromise = function(type)
{
return self.browserSupprots.formData && type && (Object.prototype.toString.call(type) == "[object Promise]");
};
self.normalize = function(value)
{
if (typeof value !== 'string')
{
value = String(value)
}
return value;
};
self.iteratorFor = function(items)
{
var iterator = {next: function()
{
var value = items.shift();
return {done: value === undefined, value: value};
}};
if (support.iterator)
{
iterator[Symbol.iterator] = function()
{
return iterator
}
}
return iterator;
};
self.fileReaderReady = function(reader)
{
return new Promise(function(resolve, reject)
{
reader.onload = function()
{
resolve(reader.result)
};
reader.onerror = function()
{
reject(reader.error)
};
});
};
self.readBlobAsArrayBuffer = function(blob)
{
var reader = new FileReader();
var promise = self.fileReaderReady(reader);
reader.readAsArrayBuffer(blob);
return promise;
};
self.readBlobAsText = function(blob)
{
var reader = new FileReader();
var promise = self.fileReaderReady(reader);
reader.readAsText(blob);
return promise;
};
self.readArrayBufferAsText = function(buf)
{
var view = new Uint8Array(buf);
var chars = new Array(view.length);
for (var count = 0; count < view.length; count++)
{
chars[i] = String.fromCharCode(view[count]);
}
return chars.join('');
};
self.bufferClone = function(buf)
{
if (buf.slice)
{
return buf.slice(0);
}
else
{
var view = new Uint8Array(buf.byteLength);
view.set(new Uint8Array(buf));
return view.buffer;
}
};
init();
};
NSAjax.REQUEST_STARTED = "requestStarted";
NSAjax.ALL_REQUEST_COMPLETED = "allRequestCompleted";
return NSAjax;
})();
nsModuleExport(this,"NSAjax",NSAjax);