cronapp-common-js
Version:
Cronapp Commons Functions
551 lines (485 loc) • 17.1 kB
JavaScript
(function() {
var ISO_PATTERN = new RegExp("^(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z)?)|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))$");
var TIME_PATTERN = new RegExp("^PT(?:(\\d\\d?)H)?(?:(\\d\\d?)M)?(?:(\\d\\d?)(?:\\.(\\d\\d?\\d?)?)?S)?$");
var NUMBER_STR_PATTERN = new RegExp("\\d+");
window.stringToJs = function(value) {
var formated = "";
if (value != undefined && value != null) {
value = value.toString();
for (var i = 0; i < value.length; i++) {
var c = value.charAt(i);
if (c == "\\") {
formated += "\\\\";
} else if (c == "'") {
formated += "\\'";
} else if (c == "\"") {
formated += "\\\"";
} else if (c == "\n") {
formated += "\\n";
} else if (c == "\r") {
} else {
formated += c;
}
}
}
return formated;
}
window.objToOData = function(o, escape) {
if (escape == undefined || escape == null) {
escape = true;
}
if (o == null || o == undefined) {
return "null";
}
else if (typeof o == 'number' || typeof o == 'boolean') {
return o+"";
}
else if (o instanceof Date) {
return "datetimeoffset'"+o.toISOString()+"'";
}
if (typeof o == 'string' && escape) {
return "'" + o.replaceAll("'", "''") + "'";
}
return "'" + o + "'";
}
window.objectsAreEqual = function(v1, v2, type) {
v1 = oDataToObj(v1, undefined, type);
v2 = oDataToObj(v2, undefined, type);
if (v1 instanceof Date && v2 instanceof Date) {
return v1.getTime() == v2.getTime();
}
return v1 == v2;
}
window.oDataToObj = function(value, unquote, type) {
if (unquote == null || unquote == undefined) {
unquote = true;
}
if (typeof value == 'string') {
if (type && type == 'String') {
return value;
}
if (value.length >= 10 && value.match(ISO_PATTERN) && value.length < 100) {
return new Date(value);
}
else if (value.length >= 4 && value.match(TIME_PATTERN) && value.length < 100) {
try {
var momentDate = moment().utcOffset(window.systemTimeZoneOffset, true);
var g = TIME_PATTERN.exec(value);
momentDate = momentDate.hour(g[1]).minute(g[2]).second(g[3]).year(1970).dayOfYear(1).month(0);
return momentDate.toDate();
}
catch (e) {
return value;
}
}
else if (value.length >= 10 && value.substring(0, 6) == '/Date(' && value.substring(value.length - 2, value.length) == ")/") {
var r = value.substring(6, value.length-2);
return new Date(parseInt(r));
}
else if (value.length >= 20 && value.substring(0, 9) == "datetime'" && value.substring(value.length - 1, value.length) == "'") {
var r = value.substring(9, value.length-1);
if (r.match(NUMBER_STR_PATTERN)) {
return new Date(parseInt(r));
}
return new Date(r);
}
else if (value.length >= 20 && value.substring(0, 15) == "datetimeoffset'" && value.substring(value.length - 1, value.length) == "'") {
var r = value.substring(15, value.length-1);
if (r.match(NUMBER_STR_PATTERN)) {
return new Date(parseInt(r));
}
return new Date(r);
}
else if (value.length >= 2 && ((value.charAt(0) == "'" && value.charAt(value.length-1) == "'") || (value.charAt(0) == "\"" && value.charAt(value.length-1) == "\"")) ) {
var r = value.substring(1, value.length-1);
return r;
}
else if (value == 'true' || value == 'false') {
return (value == 'true')
}
else if (value == 'null') {
return null;
}
else if (!type && value && value.startsWith('0') ) {
return value;
}
else if (!isNaN(value) && !isNaN(parseFloat(value))) {
return parseFloat(value);
}
}
return value;
}
window.parseXml = function(xml) {
var dom = null;
if (window.DOMParser) {
try {
dom = (new DOMParser()).parseFromString(xml, "text/xml");
} catch (e) {
dom = null;
}
} else if (window.ActiveXObject) {
try {
dom = new ActiveXObject('Microsoft.XMLDOM');
dom.async = false;
if (!dom.loadXML(xml)) {
console.log(dom.parseError.reason + dom.parseError.srcText);
}
}
catch (e) {
dom = null;
}
}
return dom;
}
window.xml2json = function(xml, tab) {
var X = {
toObj: function(xml) {
var o = {};
if (xml.nodeType==1) { // element node ..
if (xml.attributes.length) // element with attributes ..
for (var i=0; i<xml.attributes.length; i++)
o["@"+xml.attributes[i].nodeName] = (xml.attributes[i].nodeValue||"").toString();
if (xml.firstChild) { // element has child nodes ..
var textChild=0, cdataChild=0, hasElementChild=false;
for (var n=xml.firstChild; n; n=n.nextSibling) {
if (n.nodeType==1) hasElementChild = true;
else if (n.nodeType==3 && n.nodeValue.match(/[^ \f\n\r\t\v]/)) textChild++; // non-whitespace text
else if (n.nodeType==4) cdataChild++; // cdata section node
}
if (hasElementChild) {
if (textChild < 2 && cdataChild < 2) {
X.removeWhite(xml);
for (var n=xml.firstChild; n; n=n.nextSibling) {
if (n.nodeType == 3)
o["#text"] = X.escape(n.nodeValue);
else if (n.nodeType == 4)
o["#cdata"] = X.escape(n.nodeValue);
else if (o[X.normalizeName(n.nodeName)]) { // multiple occurence of element ..
if (o[X.normalizeName(n.nodeName)] instanceof Array)
o[X.normalizeName(n.nodeName)][o[X.normalizeName(n.nodeName)].length] = X.toObj(n);
else
o[X.normalizeName(n.nodeName)] = [o[X.normalizeName(n.nodeName)], X.toObj(n)];
} else {
o[X.normalizeName(n.nodeName)] = X.toObj(n);
}
}
} else {
if (!xml.attributes.length)
o = X.escape(X.innerXml(xml));
else
o["#text"] = X.escape(X.innerXml(xml));
}
} else if (textChild) { // pure text
if (!xml.attributes.length)
o = X.escape(X.innerXml(xml));
else
o["#text"] = X.escape(X.innerXml(xml));
} else if (cdataChild) { // cdata
if (cdataChild > 1)
o = X.escape(X.innerXml(xml));
else
for (var n=xml.firstChild; n; n=n.nextSibling)
o["#cdata"] = X.escape(n.nodeValue);
}
}
if (!xml.attributes.length && !xml.firstChild) {
o = null;
}
} else if (xml.nodeType==9) {
o = X.toObj(xml.documentElement);
} else {
console.log("unhandled node type: " + xml.nodeType);
}
return o;
},
normalizeName : function(str) {
if (str && (str.length > 5) && (str.indexOf('cron-') == 0)) {
str = str.substr(5);
var result = "";
var camelCase = false;
for (var i in str) {
var s = str.charAt(i);
if (camelCase && s != "-") {
result += s.toUpperCase();
camelCase = false;
} else if (s == "-") {
camelCase = true;
} else {
result += s.toLowerCase();
}
}
return result;
}
},
toJson: function(o, name, ind) {
var json = name ? ("\""+name+"\"") : "";
if (o instanceof Array) {
for (var i=0,n=o.length; i<n; i++)
o[i] = X.toJson(o[i], "", ind+"\t");
json += (name?":[":"[") + (o.length > 1 ? ("\n"+ind+"\t"+o.join(",\n"+ind+"\t")+"\n"+ind) : o.join("")) + "]";
}
else if (o == null)
json += (name&&":") + "null";
else if (typeof(o) == "object") {
var arr = [];
for (var m in o)
arr[arr.length] = X.toJson(o[m], m, ind+"\t");
json += (name?":{":"{") + (arr.length > 1 ? ("\n"+ind+"\t"+arr.join(",\n"+ind+"\t")+"\n"+ind) : arr.join("")) + "}";
}
else if (typeof(o) == "string") {
var value = $.trim(o.toString());
json += (name && ":") + "\"" + X.htmlDecode(value) + "\"";
} else {
json += (name && ":") + X.htmlDecode($.trim(o.toString()));
}
return json;
},
htmlDecode: function (input){
var doc = new DOMParser().parseFromString(input, "text/html");
return doc.documentElement.textContent;
},
innerXml: function(node) {
var s = "";
if ("innerHTML" in node)
s = node.innerHTML;
else {
var asXml = function(n) {
var s = "";
if (n.nodeType == 1) {
s += "<" + n.nodeName;
for (var i=0; i<n.attributes.length;i++)
s += " " + n.attributes[i].nodeName + "=\"" + (n.attributes[i].nodeValue||"").toString() + "\"";
if (n.firstChild) {
s += ">";
for (var c=n.firstChild; c; c=c.nextSibling)
s += asXml(c);
s += "</"+n.nodeName+">";
}
else
s += "/>";
}
else if (n.nodeType == 3)
s += n.nodeValue;
else if (n.nodeType == 4)
s += "<![CDATA[" + n.nodeValue + "]]>";
return s;
};
for (var c=node.firstChild; c; c=c.nextSibling)
s += asXml(c);
}
return s;
},
escape: function(txt) {
return txt.trim()
.replace(/[\\]/g, "\\\\")
.replace(/[\"]/g, '\\"')
.replace(/[\n]/g, '\\n')
.replace(/[\r]/g, '\\r');
},
removeWhite: function(e) {
e.normalize();
for (var n = e.firstChild; n; ) {
if (n.nodeType == 3) { // text node
if (!n.nodeValue.match(/[^ \f\n\r\t\v]/)) { // pure whitespace text node
var nxt = n.nextSibling;
e.removeChild(n);
n = nxt;
}
else
n = n.nextSibling;
}
else if (n.nodeType == 1) { // element node
X.removeWhite(n);
n = n.nextSibling;
}
else // any other node
n = n.nextSibling;
}
return e;
}
};
if (xml.nodeType == 9) {
xml = xml.documentElement;
}
var json = X.toJson(X.toObj(X.removeWhite(xml)), xml.nodeName, "\t");
return "{\n" + tab + (tab ? json.replace(/\t/g, tab) : json.replace(/\t|\n/g, "")) + "\n}";
}
window.json2xml = function(json, tagName) {
var a = json;
var c = document.createElement(tagName);
var t = function (v) {
return {}.toString.call(v).split(' ')[1].slice(0, -1).toLowerCase();
};
var normalizeName = function(str) {
var result = "";
for (var i in str) {
var s = str.charAt(i);
if ((i > 0) && (s == s.toUpperCase())) {
result += "-";
}
result += s.toLowerCase();
}
return 'cron-' + result;
}
var f = function (f, c, a, s) {
if (t(a) != "array" && t(a) != "object") {
if (t(a) != "null") {
c.appendChild(document.createTextNode(a));
}
} else {
for (var k in a) {
var v = a[k];
if (k == "__type" && t(a) == "object") {
c.setAttribute("__type", v);
} else {
if (t(v) == "object") {
var ch = c.appendChild(document.createElementNS(null, normalizeName(k)));
f(f, ch, v);
} else if (t(v) == "array") {
for (var item in v) {
var ch = c.appendChild(document.createElementNS(null, normalizeName(k)));
f(f, ch, v[item], true);
}
} else {
var va = document.createElementNS(null, normalizeName(k));
if (t(v) != "null") {
if (t(v) == "string") {
v = v.trim();
}
va.appendChild(document.createTextNode(v));
}
var ch = c.appendChild(va);
}
}
}
}
};
f(f, c, a, t(a) == "array");
return c.outerHTML;
}
window.buildElementOptions = function(element) {
var options = $(element).closest("[data-component]").find("cron-options");
var dom = parseXml('<cron-options>' + $(options).html() + '</cron-options>');
var json = xml2json(dom);
if (json) {
json = json.slice(1);
json = json.substring(0, json.length - 1);
json = json.trim();
json = json.replace(/undefined"cron-options":/gm,'');
json = json.replace(/"undefined"/gm,'');
json = json.replace(/"undefined:"/gm,'');
json = json.replace(/undefined:/gm,'');
json = json.replace(/undefined/gm,'');
json = json.replace(/"cron-options":/gm,'');
}
return json;
}
window.objectClone = function(obj, validFields) {
var copy;
if (null == obj || "object" != typeof obj) {
return obj;
}
if (obj instanceof Date) {
copy = new Date();
copy.setTime(obj.getTime());
return copy;
}
if (obj instanceof Array) {
copy = [];
for (var i = 0, len = obj.length; i < len; i++) {
copy[i] = objectClone(obj[i], undefined);
}
return copy;
}
var validFieldObject = function(attr, validFields) {
/*
* Se não informou o dataSource, executa um clone comum de objeto.
*/
if (!validFields) {
return true;
} else {
/*
* Senão, analisa se o campo informado está na relação de validFields.
*/
for (var field in validFields) {
if (attr == field) {
return true;
}
}
return false;
}
}
var isFunction = function(functionToCheck) {
return functionToCheck && {}.toString.call(functionToCheck) === '[object Function]';
}
if (obj instanceof Object) {
copy = {};
for (var attr in obj) {
if ((obj.hasOwnProperty(attr)) && (obj[attr] != undefined) &&
(attr.substr(0,1) != '_' || attr == '_objectKey') && (!isFunction(obj[attr])) &&
(validFieldObject(attr, validFields))) {
copy[attr] = objectClone(obj[attr], validFields[attr]);
}
}
return copy;
}
throw new Error("Unable to copy obj! Its type isn't supported.");
}
window.getOperatorODATA = function(left, operator, right) {
if (operator == '%') {
return 'substringof(' + right + ', ' + left + ')';
} else if (operator == '=') {
return left + ' eq ' + right;
} else if (operator == '!=') {
return left + ' ne ' + right;
} else if (operator == '>') {
return left + ' gt ' + right;
} else if (operator == '>=') {
return left + ' ge ' + right;
} else if (operator == '<') {
return left + ' lt ' + right;
} else if (operator == '<=') {
return left + ' le ' + right;
}
}
window.executeRight = function(right) {
var result = 'null';
if (right != null && right != undefined) {
if (right.startsWith(':') || right.startsWith('datetimeoffset\'') || right.startsWith('datetime\'') ) {
result = right;
}
else {
result = eval(right);
if (result instanceof Date) {
result = "datetimeoffset'" + result.toISOString() + "'";
}
else if (typeof result == 'string') {
result = "'" + result + "'";
}
else if (result === undefined || result == null) {
result = 'null';
}
}
}
return result;
};
window.parserOdata = function (data) {
var result = '';
var operation = data.type;
if (data.args) {
for (var i = 0; i < data.args.length; i++) {
var arg = data.args[i];
var oper = operation;
if (i == 0) {
oper = '';
}
if (arg.args && arg.args.length > 0) {
result = result + ' ' + oper.toLowerCase() + ' ( ' + parserOdata(arg) + ' ) ';
} else {
result = result + ' ' + oper.toLowerCase() + ' ' + getOperatorODATA(arg.left, arg.type, executeRight(arg.right));
}
}
}
return result.trim();
}
})();