/* Product Name: dhtmlxSuite Version: 5.2.0 Edition: Professional License: content of this file is covered by DHTMLX Commercial or Enterprise license. Usage without proper license is prohibited. To obtain it contact sales@dhtmlx.com Copyright UAB Dinamenta http://www.dhtmlx.com */ /* dhtmlx.com */ if (typeof(window.dhx) == "undefined") { window.dhx = window.dhx4 = { version: "{{VERSION}}", skin: null, // allow to be set by user skinDetect: function(comp) { var i = Math.floor(dhx4.readFromCss(comp+"_skin_detect")/10)*10; return {10:"dhx_skyblue",20:"dhx_web",30:"dhx_terrace",40:"material"}[i]||null; }, // read value from css readFromCss: function(className, property, innerHTML) { var t = document.createElement("DIV"); t.className = className; if (document.body.firstChild != null) document.body.insertBefore(t, document.body.firstChild); else document.body.appendChild(t); if (typeof(innerHTML) == "string") t.innerHTML = innerHTML; var w = t[property||"offsetWidth"]; t.parentNode.removeChild(t); t = null; return w; }, // id manager lastId: 1, newId: function() { return this.lastId++; }, // z-index manager zim: { data: {}, step: 5, first: function() { return 100; }, last: function() { var t = this.first(); for (var a in this.data) t = Math.max(t, this.data[a]); return t; }, reserve: function(id) { this.data[id] = this.last()+this.step; return this.data[id]; }, clear: function(id) { if (this.data[id] != null) { this.data[id] = null; delete this.data[id]; } } }, // string to boolean s2b: function(r) { if (typeof(r) == "string") r = r.toLowerCase(); return (r == true || r == 1 || r == "true" || r == "1" || r == "yes" || r == "y" || r == "on"); }, // string to json s2j: function(s) { var obj = null; dhx4.temp = null; try { eval("dhx4.temp="+s); } catch(e) { dhx4.temp = null; } obj = dhx4.temp; dhx4.temp = null; return obj; }, // absolute top/left position on screen absLeft: function(obj) { if (typeof(obj) == "string") obj = document.getElementById(obj); return this.getOffset(obj).left; }, absTop: function(obj) { if (typeof(obj) == "string") obj = document.getElementById(obj); return this.getOffset(obj).top; }, _aOfs: function(elem) { var top = 0, left = 0; while (elem) { top = top + parseInt(elem.offsetTop); left = left + parseInt(elem.offsetLeft); elem = elem.offsetParent; } return {top: top, left: left}; }, _aOfsRect: function(elem) { var box = elem.getBoundingClientRect(); var body = document.body; var docElem = document.documentElement; var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop; var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft; var clientTop = docElem.clientTop || body.clientTop || 0; var clientLeft = docElem.clientLeft || body.clientLeft || 0; var top = box.top + scrollTop - clientTop; var left = box.left + scrollLeft - clientLeft; return { top: Math.round(top), left: Math.round(left) }; }, getOffset: function(elem) { if (elem.getBoundingClientRect) { return this._aOfsRect(elem); } else { return this._aOfs(elem); } }, // copy obj _isObj: function(k) { return (k != null && typeof(k) == "object" && typeof(k.length) == "undefined"); }, _copyObj: function(r) { if (this._isObj(r)) { var t = {}; for (var a in r) { if (typeof(r[a]) == "object" && r[a] != null) t[a] = this._copyObj(r[a]); else t[a] = r[a]; } } else { var t = []; for (var a=0; a= 0); var dim = {}; dim.left = document.body.scrollLeft; dim.right = dim.left+(window.innerWidth||document.body.clientWidth); dim.top = Math.max((isIE?document.documentElement:document.getElementsByTagName("html")[0]).scrollTop, document.body.scrollTop); dim.bottom = dim.top+(isIE?Math.max(document.documentElement.clientHeight||0,document.documentElement.offsetHeight||0):window.innerHeight); return dim; }, // input/textarea range selection selectTextRange: function(inp, start, end) { inp = (typeof(inp)=="string"?document.getElementById(inp):inp); var len = inp.value.length; start = Math.max(Math.min(start, len), 0); end = Math.min(end, len); if (inp.setSelectionRange) { try {inp.setSelectionRange(start, end);} catch(e){}; // combo in grid under IE requires try/catch } else if (inp.createTextRange) { var range = inp.createTextRange(); range.moveStart("character", start); range.moveEnd("character", end-len); try {range.select();} catch(e){}; } }, // transition transData: null, transDetect: function() { if (this.transData == null) { this.transData = {transProp: false, transEv: null}; // transition, MozTransition, WebkitTransition, msTransition, OTransition var k = { "MozTransition": "transitionend", "WebkitTransition": "webkitTransitionEnd", "OTransition": "oTransitionEnd", "msTransition": "transitionend", "transition": "transitionend" }; for (var a in k) { if (this.transData.transProp == false && document.documentElement.style[a] != null) { this.transData.transProp = a; this.transData.transEv = k[a]; } } k = null; } return this.transData; }, // xml parser _xmlNodeValue: function(node) { var value = ""; for (var q=0; q= 0 || navigator.userAgent.indexOf("Trident") >= 0); window.dhx4.isIE6 = (window.XMLHttpRequest == null && navigator.userAgent.indexOf("MSIE") >= 0); window.dhx4.isIE7 = (navigator.userAgent.indexOf("MSIE 7.0") >= 0 && navigator.userAgent.indexOf("Trident") < 0); window.dhx4.isIE8 = (navigator.userAgent.indexOf("MSIE 8.0") >= 0 && navigator.userAgent.indexOf("Trident") >= 0); window.dhx4.isIE9 = (navigator.userAgent.indexOf("MSIE 9.0") >= 0 && navigator.userAgent.indexOf("Trident") >= 0); window.dhx4.isIE10 = (navigator.userAgent.indexOf("MSIE 10.0") >= 0 && navigator.userAgent.indexOf("Trident") >= 0 && window.navigator.pointerEnabled != true); window.dhx4.isIE11 = (navigator.userAgent.indexOf("Trident") >= 0 && window.navigator.pointerEnabled == true); window.dhx4.isEdge = (navigator.userAgent.indexOf("Edge") >= 0); window.dhx4.isOpera = (navigator.userAgent.indexOf("Opera") >= 0); window.dhx4.isChrome = (navigator.userAgent.indexOf("Chrome") >= 0) && !window.dhx4.isEdge; window.dhx4.isKHTML = (navigator.userAgent.indexOf("Safari") >= 0 || navigator.userAgent.indexOf("Konqueror") >= 0) && !window.dhx4.isEdge; window.dhx4.isFF = (navigator.userAgent.indexOf("Firefox") >= 0); window.dhx4.isIPad = (navigator.userAgent.search(/iPad/gi) >= 0); // dnd data window.dhx4.dnd = { evs: {}, p_en: ((window.dhx4.isIE || window.dhx4.isEdge) && (window.navigator.pointerEnabled || window.navigator.msPointerEnabled)), // touch/pointer _mTouch: function(e) { // mouse touch type in ie10/11/Edge return (window.dhx4.isIE10 && e.pointerType == e.MSPOINTER_TYPE_MOUSE || window.dhx4.isIE11 && e.pointerType == "mouse" || window.dhx4.isEdge && e.pointerType == "mouse"); }, _touchOn: function(obj) { if (obj == null) obj = document.body; obj.style.touchAction = obj.style.msTouchAction = ""; obj = null; }, _touchOff: function(obj) { if (obj == null) obj = document.body; obj.style.touchAction = obj.style.msTouchAction = "none"; obj = null; } }; // dnd events if (window.navigator.pointerEnabled == true) { // edge/ie11 window.dhx4.dnd.evs = {start: "pointerdown", move: "pointermove", end: "pointerup"}; } else if (window.navigator.msPointerEnabled == true) { // ie10- window.dhx4.dnd.evs = {start: "MSPointerDown", move: "MSPointerMove", end: "MSPointerUp"}; } else if (typeof(window.addEventListener) != "undefined") { // rest touch devices window.dhx4.dnd.evs = {start: "touchstart", move: "touchmove", end: "touchend"}; }; }; if (typeof(window.dhx4.template) == "undefined") { // trim window.dhx4.trim = function(t) { return String(t).replace(/^\s{1,}/,"").replace(/\s{1,}$/,""); }; // template parsing window.dhx4.template = function(tpl, data, trim) { // tpl - template text, #value|func:param0:param1:paramX# // data - object with key-value // trim - true/false, trim values return tpl.replace(/#([a-z0-9_-]{1,})(\|([^#]*))?#/gi, function(){ var key = arguments[1]; var t = window.dhx4.trim(arguments[3]); var func = null; var args = [data[key]]; if (t.length > 0) { t = t.split(":"); var k = []; // check escaped colon for (var q=0; q 0 && k[k.length-1].match(/\\$/) != null) { k[k.length-1] = k[k.length-1].replace(/\\$/,"")+":"+t[q]; } else { k.push(t[q]); } } func = k[0]; for (var q=1; q 0 && typeof(data[key]) != "undefined") { if (!data[key] && data[key] !== 0) return ""; if (trim == true) return window.dhx4.trim(data[key]); return String(data[key]); } // key not found return ""; }); }; window.dhx4.template.date = function(value, format) { // Date obj + format => convert to string // timestamp + format => convert to string // string => no convert // any other value => empty string if (value != null) { if (value instanceof Date) { return window.dhx4.date2str(value, format); } else { value = value.toString(); if (value.match(/^\d*$/) != null) return window.dhx4.date2str(new Date(parseInt(value)), format); return value; } } return ""; }; window.dhx4.template.maxlength = function(value, limit) { return String(value).substr(0, limit); }; window.dhx4.template.number_format = function(value, format, group_sep, dec_sep) { var fmt = window.dhx4.template._parseFmt(format, group_sep, dec_sep); if (fmt == false) return value; return window.dhx4.template._getFmtValue(value, fmt); }; window.dhx4.template.lowercase = function(value) { if (typeof(value) == "undefined" || value == null) value = ""; return String(value).toLowerCase(); }; window.dhx4.template.uppercase = function(value) { if (typeof(value) == "undefined" || value == null) value = ""; return String(value).toUpperCase(); }; // number format helpers window.dhx4.template._parseFmt = function(format, group_sep, dec_sep) { var t = format.match(/^([^\.\,0-9]*)([0\.\,]*)([^\.\,0-9]*)/); if (t == null || t.length != 4) return false; // invalid format var fmt = { // int group i_len: false, i_sep: (typeof(group_sep)=="string"?group_sep:","), // decimal d_len: false, d_sep: (typeof(dec_sep)=="string"?dec_sep:"."), // chars before and after s_bef: (typeof(t[1])=="string"?t[1]:""), s_aft: (typeof(t[3])=="string"?t[3]:"") }; var f = t[2].split("."); if (f[1] != null) fmt.d_len = f[1].length; var r = f[0].split(","); if (r.length > 1) fmt.i_len = r[r.length-1].length; return fmt; }; window.dhx4.template._getFmtValue = function(value, fmt) { var r = String(value).match(/^(-)?([0-9]{1,})(\.([0-9]{1,}))?$/); // r = [complete value, minus sign, integer, full decimal, decimal] if (r != null && r.length == 5) { var v0 = ""; // minus sign if (r[1] != null) v0 += r[1]; // chars before v0 += fmt.s_bef; // int part if (fmt.i_len !== false) { var i = 0; var v1 = ""; for (var q=r[2].length-1; q>=0; q--) { v1 = ""+r[2].charAt(q)+v1; if (++i == fmt.i_len && q > 0) { v1=fmt.i_sep+v1; i=0; } } v0 += v1; } else { v0 += r[2]; } // dec part if (fmt.d_len !== false) { if (r[4] == null) r[4] = ""; while (r[4].length < fmt.d_len) r[4] += "0"; eval("dhx4.temp = new RegExp(/\\d{"+fmt.d_len+"}/);"); var t1 = (r[4]).match(dhx4.temp); if (t1 != null) v0 += fmt.d_sep+t1; dhx4.temp = t1 = null; } // chars after v0 += fmt.s_aft; return v0; } return value; }; }; if (typeof(window.dhx4.dateLang) == "undefined") { window.dhx4.dateLang = "en"; window.dhx4.dateStrings = { en: { monthFullName: ["January","February","March","April","May","June","July","August","September","October","November","December"], monthShortName: ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"], dayFullName: ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"], dayShortName: ["Su","Mo","Tu","We","Th","Fr","Sa"] } }; window.dhx4.dateFormat = { en: "%Y-%m-%d" }; window.dhx4.date2str = function(val, format, strings) { if (format == null || typeof(format) == "undefined") format = window.dhx4.dateFormat[window.dhx4.dateLang]; if (strings == null || typeof(strings) == "undefined") strings = window.dhx4.dateStrings[window.dhx4.dateLang]; if (val instanceof Date) { var z = function(t) { return (String(t).length==1?"0"+String(t):t); } var k = function(t) { switch(t) { case "%d": return z(val.getDate()); case "%j": return val.getDate(); case "%D": return strings.dayShortName[val.getDay()]; case "%l": return strings.dayFullName[val.getDay()]; case "%m": return z(val.getMonth()+1); case "%n": return val.getMonth()+1; case "%M": return strings.monthShortName[val.getMonth()]; case "%F": return strings.monthFullName[val.getMonth()]; case "%y": return z(val.getYear()%100); case "%Y": return val.getFullYear(); case "%g": return (val.getHours()+11)%12+1; case "%h": return z((val.getHours()+11)%12+1); case "%G": return val.getHours(); case "%H": return z(val.getHours()); case "%i": return z(val.getMinutes()); case "%s": return z(val.getSeconds()); case "%a": return (val.getHours()>11?"pm":"am"); case "%A": return (val.getHours()>11?"PM":"AM"); case "%%": return "%"; case "%u": return val.getMilliseconds(); case "%P": if (window.dhx4.temp_calendar != null && window.dhx4.temp_calendar.tz != null) return window.dhx4.temp_calendar.tz; var ofs = val.getTimezoneOffset(); var h = Math.abs(Math.floor(ofs/60)); var m = Math.abs(ofs)-h*60; return (ofs>0?"-":"+")+z(h)+":"+z(m); default: return t; } } var t = String(format||window.dhx4.dateFormat).replace(/%[a-zA-Z]/g, k); } return (t||String(val)); }; window.dhx4.str2date = function(val, format, strings) { if (format == null || typeof(format) == "undefined") format = window.dhx4.dateFormat[window.dhx4.dateLang]; if (strings == null || typeof(strings) == "undefined") strings = window.dhx4.dateStrings[window.dhx4.dateLang]; // escape custom chars format = format.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\\:|]/g, "\\$&"); var v = []; var f = []; // escape required chars format = format.replace(/%[a-z]/gi, function(t){ switch (t) { case "%d": case "%m": case "%y": case "%h": case "%H": case "%i": case "%s": f.push(t); return "(\\d{2})"; // 2 digits case "%D": case "%l": case "%M": case "%F": f.push(t); return "([a-zéûä\u0430-\u044F\u0451]{1,})"; // chars case "%j": case "%n": case "%g": case "%G": f.push(t); return "(\\d{1,2})"; // 1-2 digits case "%Y": f.push(t); return "(\\d{4})"; // 4 digits case "%a": f.push(t); return "([a|p]m)"; // am/pm case "%A": f.push(t); return "([A|P]M)"; // AM/PM case "%u": f.push(t); return "(\\d{1,6})"; // 1-6 digits, micro/milliseconds case "%P": f.push(t); return "([+-]\\d{1,2}:\\d{1,2})"; // zone offset } return t; }); var re = new RegExp(format, "i"); var e = val.match(re); if (e == null || e.length-1 != f.length) return "Invalid Date"; // sorting /* Year y,Y 1 Month n,m,M,F 2 Day d,j 3 AM/PM a,A 4 Hours H,G,h,g 5 Minutes i 6 Seconds s 7 MSec u 7 Zone P 7 */ for (var q=1; q= 0) r.setMonth(k); break; // case "%y": if (!isNaN(v[q])) { var v0 = Number(v[q]); r.setFullYear(v0+(v0>50?1900:2000)); } break; // case "%g": case "%h": if (!isNaN(v[q])) { var v0 = Number(v[q]); if (v0 <= 12 && v0 >= 0) r.setHours(v0+(getInd("pm",v)>=0?(v0==12?0:12):(v0==12?-12:0))); // 12:00 AM -> midnight, 12:00 PM -> noon } break; // case "%P": if (window.dhx4.temp_calendar != null) { window.dhx4.temp_calendar.tz = v[q]; } break; } } return r; }; }; if (typeof(window.dhx4.ajax) == "undefined") { window.dhx4.ajax = function(a){ return dhx4.ajax.get(a) }; var ajaxbase = { // if false - dhxr param will added to prevent caching on client side (default), // if true - do not add extra params cache: false, // default method for load/loadStruct, post/get allowed // get - since 4.1.1, this should fix 412 error for macos safari method: "get", parse: function(data) { if (typeof data !== "string") return data; data = data.replace(/^[\s]+/,""); if (window.DOMParser && !dhx4.isIE) { // ff,ie9 var obj = (new window.DOMParser()).parseFromString(data, "text/xml"); } else if (window.ActiveXObject !== window.undefined) { var obj = new window.ActiveXObject("Microsoft.XMLDOM"); obj.async = "false"; obj.loadXML(data); } return obj; }, xmltop: function(tagname, xhr, obj) { if (typeof xhr.status == "undefined" || xhr.status < 400) { xml = (!xhr.responseXML) ? dhx4.ajax.parse(xhr.responseText || xhr) : (xhr.responseXML || xhr); if (xml && xml.documentElement !== null) { try { if (!xml.getElementsByTagName("parsererror").length) return xml.getElementsByTagName(tagname)[0]; } catch(e){} } } if (obj !== -1) dhx4.callEvent("onLoadXMLError",["Incorrect XML", arguments[1], obj]); return document.createElement("DIV"); }, xpath: function(xpathExp, docObj) { if (!docObj.nodeName) docObj = docObj.responseXML || docObj; if (dhx4.isIE) { try { return docObj.selectNodes(xpathExp)||[]; } catch(e){ return []; } } else { var rows = []; var first; var col = (docObj.ownerDocument||docObj).evaluate(xpathExp, docObj, null, XPathResult.ANY_TYPE, null); while (first = col.iterateNext()) rows.push(first); return rows; } }, query: function(config) { return dhx4.ajax._call( (config.method || "GET"), config.url, config.data || "", (config.async || true), config.callback, null, config.headers ); }, get: function(url, onLoad) { return this._call("GET", url, null, true, onLoad); }, getSync: function(url) { return this._call("GET", url, null, false); }, put: function(url, postData, onLoad) { return this._call("PUT", url, postData, true, onLoad); }, del: function(url, postData, onLoad) { return this._call("DELETE", url, postData, true, onLoad); }, post: function(url, postData, onLoad) { if (arguments.length == 1) { postData = ""; } else if (arguments.length == 2 && (typeof(postData) == "function" || typeof(window[postData]) == "function")) { onLoad = postData; postData = ""; } else if (!postData || typeof postData !== "object"){ postData = String(postData); } return this._call("POST", url, postData, true, onLoad); }, postSync: function(url, postData) { postData = (postData == null ? "" : String(postData)); return this._call("POST", url, postData, false); }, getLong: function(url, onLoad) { this._call("GET", url, null, true, onLoad, {url:url}); }, postLong: function(url, postData, onLoad) { if (arguments.length == 2 && (typeof(postData) == "function" || typeof(window[postData]))) { onLoad = postData; postData = ""; } this._call("POST", url, postData, true, onLoad, {url:url, postData:postData}); }, _call: function(method, url, postData, async, onLoad, longParams, headers) { //postData can be a hash of values if (typeof postData === "object"){ var _postData = []; for (var a in postData) _postData.push(a+"="+encodeURIComponent(postData[a])); postData = _postData.join("&"); } var def = dhx.promise.defer(); var t = (window.XMLHttpRequest && !dhx4.isIE ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP")); var isQt = (navigator.userAgent.match(/AppleWebKit/) != null && navigator.userAgent.match(/Qt/) != null && navigator.userAgent.match(/Safari/) != null); if (async == true) { t.onreadystatechange = function() { if ((t.readyState == 4) || (isQt == true && t.readyState == 3)) { // what for long response and status 404? if (t.status != 200 || t.responseText == ""){ def.reject(t); if (!dhx4.callEvent("onAjaxError", [{xmlDoc:t, filePath:url, async:async}])) return; } window.setTimeout(function(){ if (typeof(onLoad) == "function") { try { onLoad.apply(window, [{xmlDoc:t, filePath:url, async:async}]); // dhtmlx-compat, response.xmlDoc.responseXML/responseText } catch(e){ def.reject(e); } } if (longParams != null) { if (typeof(longParams.postData) != "undefined") { dhx4.ajax.postLong(longParams.url, longParams.postData, onLoad); } else { dhx4.ajax.getLong(longParams.url, onLoad); } } def.resolve(t.responseText); onLoad = null; t = null; },1); } } } if (method == "GET") { url += this._dhxr(url); } t.open(method, url, async); if (headers != null) { for (var key in headers) t.setRequestHeader(key, headers[key]); } else if (method == "POST" || method == "PUT" || method == "DELETE") { t.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); } else if (method == "GET") { postData = null; } t.setRequestHeader("X-Requested-With", "XMLHttpRequest"); t.send(postData); if (async != true) { if ((t.readyState == 4) || (isQt == true && t.readyState == 3)) { if (t.status != 200 || t.responseText == "") dhx4.callEvent("onAjaxError", [{xmlDoc:t, filePath:url, async:async}]); } } def.xmlDoc=t; def.filePath=url; def.async=async; return def; }, _dhxr: function(sign, value) { if (this.cache != true) { if (sign.match(/^[\?\&]$/) == null) sign = (sign.indexOf("?")>=0?"&":"?"); if (typeof(value) == "undefined") value = true; return sign+"dhxr"+new Date().getTime()+(value==true?"=1":""); } return ""; } }; for (var key in ajaxbase) dhx4.ajax[key] = ajaxbase[key]; }; if (typeof(window.dhx4._enableDataLoading) == "undefined") { window.dhx4._enableDataLoading = function(obj, initObj, xmlToJson, xmlRootTag, mode) { if (mode == "clear") { // clear attached functionality for (var a in obj._dhxdataload) { obj._dhxdataload[a] = null; delete obj._dhxdataload[a]; }; obj._loadData = null; obj._dhxdataload = null; obj.load = null; obj.loadStruct = null; obj = null; return; } obj._dhxdataload = { // move to obj.conf? initObj: initObj, xmlToJson: xmlToJson, xmlRootTag: xmlRootTag, onBeforeXLS: null }; obj._loadData = function(data, loadParams, onLoad) { if (arguments.length == 2) { onLoad = loadParams; loadParams = null; } var obj = null; // deprecated from 4.0, compatability with version (url, type[json|xml], onLoad) if (arguments.length == 3) onLoad = arguments[2]; this.callEvent("onXLS",[]); if (typeof(data) == "string") { var k = data.replace(/^\s{1,}/,"").replace(/\s{1,}$/,""); var tag = new RegExp("^<"+this._dhxdataload.xmlRootTag); // xml if (tag.test(k.replace(/^<\?xml[^\?]*\?>\s*/, ""))) { // remove leading if any, \n can be also present obj = dhx4.ajax.parse(data); if (obj != null) obj = this[this._dhxdataload.xmlToJson].apply(this, [obj]); // xml to json } if (obj == null && (k.match(/^[\s\S]*{[.\s\S]*}[\s\S]*$/) != null || k.match(/^[\s\S]*\[[.\s\S]*\][\s\S]*$/) != null)) { // check for '{...}' or '[...]', cut leading/trailing \n\r with \s\S obj = dhx4.s2j(k); } if (obj == null) { var params = []; // allow to modify url and add params if (typeof(this._dhxdataload.onBeforeXLS) == "function") { var k = this._dhxdataload.onBeforeXLS.apply(this,[data]); if (k != null && typeof(k) == "object") { if (k.url != null) data = k.url; if (k.params != null) { for (var a in k.params) params.push(a+"="+encodeURIComponent(k.params[a])); } } } var t = this; var callBack = function(r) { var obj = null; if ((r.xmlDoc.getResponseHeader("Content-Type")||"").search(/xml/gi) >= 0 || (r.xmlDoc.responseText.replace(/^\s{1,}/,"")).match(/^ url t.callEvent("onXLE",[]); if (onLoad != null) { if (typeof(onLoad) == "function") { onLoad.apply(t,[]); } else if (typeof(window[onLoad]) == "function") { window[onLoad].apply(t,[]); } } callBack = onLoad = null; obj = r = t = null; }; params = params.join("&")+(typeof(loadParams)=="string"?"&"+loadParams:""); if (dhx4.ajax.method == "post") { return dhx4.ajax.post(data, params, callBack); } else if (dhx4.ajax.method == "get") { return dhx4.ajax.get(data+(params.length>0?(data.indexOf("?")>0?"&":"?")+params:""), callBack); } return; } } else { if (typeof(data.documentElement) == "object" || (typeof(data.tagName) != "undefined" && typeof(data.getElementsByTagName) != "undefined" && data.getElementsByTagName(this._dhxdataload.xmlRootTag).length > 0)) { // xml obj = this[this._dhxdataload.xmlToJson].apply(this, [data]); } else { // json obj = window.dhx4._copyObj(data); } } // init if (obj != null) this[this._dhxdataload.initObj].apply(this,[obj]); this.callEvent("onXLE",[]); if (onLoad != null) { if (typeof(onLoad) == "function") { onLoad.apply(this, []); } else if (typeof(window[onLoad]) == "function") { window[onLoad].apply(this, []); } onLoad = null; } }; // loadStruct for hdr/conf // load for data if (mode != null) { var k = {struct: "loadStruct", data: "load"}; for (var a in mode) { if (mode[a] == true) obj[k[a]] = function() {return this._loadData.apply(this, arguments);} } } obj = null; }; }; if (typeof(window.dhx4._eventable) == "undefined") { window.dhx4._eventable = function(obj, mode) { if (mode == "clear") { obj.detachAllEvents(); obj.dhxevs = null; obj.attachEvent = null; obj.detachEvent = null; obj.checkEvent = null; obj.callEvent = null; obj.detachAllEvents = null; obj = null; return; } obj.dhxevs = { data: {} }; obj.attachEvent = function(name, func) { name = String(name).toLowerCase(); if (!this.dhxevs.data[name]) this.dhxevs.data[name] = {}; var eventId = window.dhx4.newId(); this.dhxevs.data[name][eventId] = func; return eventId; } obj.detachEvent = function(eventId) { for (var a in this.dhxevs.data) { var k = 0; for (var b in this.dhxevs.data[a]) { if (b == eventId) { this.dhxevs.data[a][b] = null; delete this.dhxevs.data[a][b]; } else { k++; } } if (k == 0) { this.dhxevs.data[a] = null; delete this.dhxevs.data[a]; } } } obj.checkEvent = function(name) { name = String(name).toLowerCase(); return (this.dhxevs.data[name] != null); } obj.callEvent = function(name, params) { name = String(name).toLowerCase(); if (this.dhxevs.data[name] == null) return true; var r = true; for (var a in this.dhxevs.data[name]) { r = this.dhxevs.data[name][a].apply(this, params) && r; } return r; } obj.detachAllEvents = function() { for (var a in this.dhxevs.data) { for (var b in this.dhxevs.data[a]) { this.dhxevs.data[a][b] = null; delete this.dhxevs.data[a][b]; } this.dhxevs.data[a] = null; delete this.dhxevs.data[a]; } } obj = null; }; dhx4._eventable(dhx4); }; // validation // all purpose set of rules, based on http://code.google.com/p/validation-js if (!window.dhtmlxValidation) { dhtmlxValidation = function(){}; dhtmlxValidation.prototype = { isEmpty: function(value) { return value == ''; }, isNotEmpty: function(value) { return (value instanceof Array?value.length>0:!value == ''); // array in case of multiselect }, isValidBoolean: function(value) { return !!value.toString().match(/^(0|1|true|false)$/); }, isValidEmail: function(value) { return !!value.toString().match(/^[a-z0-9][0-9a-z\-_\.]*@[0-9a-z_\-\.]*\.[a-z]{2,5}$/i); }, isValidInteger: function(value) { return !!value.toString().match(/(^-?\d+$)/); }, isValidNumeric: function(value) { return !!value.toString().match(/(^-?\d\d*[\.|,]\d*$)|(^-?\d\d*$)|(^-?[\.|,]\d\d*$)/); }, isValidAplhaNumeric: function(value) { return !!value.toString().match(/^[_\-a-z0-9]+$/gi); }, // 0000-00-00 00:00:00 to 9999:12:31 59:59:59 (no it is not a "valid DATE" function) isValidDatetime: function(value) { var dt = value.toString().match(/^(\d{4})-(\d{2})-(\d{2})\s(\d{2}):(\d{2}):(\d{2})$/); return dt && !!(dt[1]<=9999 && dt[2]<=12 && dt[3]<=31 && dt[4]<=59 && dt[5]<=59 && dt[6]<=59) || false; }, // 0000-00-00 to 9999-12-31 isValidDate: function(value) { var d = value.toString().match(/^(\d{4})-(\d{2})-(\d{2})$/); return d && !!(d[1]<=9999 && d[2]<=12 && d[3]<=31) || false; }, // 00:00:00 to 59:59:59 isValidTime: function(value) { var t = value.toString().match(/^(\d{1,2}):(\d{1,2}):(\d{1,2})$/); return t && !!(t[1]<=24 && t[2]<=59 && t[3]<=59) || false; }, // 0.0.0.0 to 255.255.255.255 isValidIPv4: function(value) { var ip = value.toString().match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/); return ip && !!(ip[1]<=255 && ip[2]<=255 && ip[3]<=255 && ip[4]<=255) || false; }, isValidCurrency: function(value) { // Q: Should I consider those signs valid too ? : ¢|€|₤|₦|¥ return value.toString().match(/^\$?\s?\d+?([\.,\,]?\d+)?\s?\$?$/) && true || false; }, // Social Security Number (999-99-9999 or 999999999) isValidSSN: function(value) { return value.toString().match(/^\d{3}\-?\d{2}\-?\d{4}$/) && true || false; }, // Social Insurance Number (999999999) isValidSIN: function(value) { return value.toString().match(/^\d{9}$/) && true || false; } }; dhtmlxValidation = new dhtmlxValidation(); }; if (typeof(window.dhtmlx) == "undefined") { window.dhtmlx = {}; } if (!window.dhtmlx.extend){ window.dhtmlx.extend = function(a, b){ for (var key in b) if (!a[key]) a[key]=b[key]; return a; }; window.dhtmlx.extend_api = function(name,map,ext){ var t = window[name]; if (!t) return; //component not defined window[name]=function(obj){ if (obj && typeof obj == "object" && !obj.tagName){ var that = t.apply(this,(map._init?map._init(obj):arguments)); //global settings for (var a in dhtmlx) if (map[a]) this[map[a]](dhtmlx[a]); //local settings for (var a in obj){ if (map[a]) this[map[a]](obj[a]); else if (a.indexOf("on")===0){ this.attachEvent(a,obj[a]); } } } else var that = t.apply(this,arguments); if (map._patch) map._patch(this); return that||this; }; window[name].prototype=t.prototype; if (ext) dhtmlx.extend(window[name].prototype,ext); }; window.dhtmlx.url = function(str){ if (str.indexOf("?") != -1) return "&"; else return "?"; }; } /** * @desc: find out what symbol to use as url param delimiters in further params * @type: private * @param: str - current url string * @topic: 0 */ function dhtmlDragAndDropObject(){ if (window.dhtmlDragAndDrop) return window.dhtmlDragAndDrop; this.lastLanding=0; this.dragNode=0; this.dragStartNode=0; this.dragStartObject=0; this.tempDOMU=null; this.tempDOMM=null; this.waitDrag=0; window.dhtmlDragAndDrop=this; return this; }; dhtmlDragAndDropObject.prototype.removeDraggableItem=function(htmlNode){ htmlNode.onmousedown=null; htmlNode.dragStarter=null; htmlNode.dragLanding=null; } dhtmlDragAndDropObject.prototype.addDraggableItem=function(htmlNode, dhtmlObject){ htmlNode.onmousedown=this.preCreateDragCopy; htmlNode.dragStarter=dhtmlObject; this.addDragLanding(htmlNode, dhtmlObject); } dhtmlDragAndDropObject.prototype.addDragLanding=function(htmlNode, dhtmlObject){ htmlNode.dragLanding=dhtmlObject; } dhtmlDragAndDropObject.prototype.preCreateDragCopy=function(e){ if ((e||window.event) && (e||event).button == 2) return; if (window.dhtmlDragAndDrop.waitDrag){ window.dhtmlDragAndDrop.waitDrag=0; document.body.onmouseup=window.dhtmlDragAndDrop.tempDOMU; document.body.onmousemove=window.dhtmlDragAndDrop.tempDOMM; return false; } if (window.dhtmlDragAndDrop.dragNode) window.dhtmlDragAndDrop.stopDrag(e); window.dhtmlDragAndDrop.waitDrag=1; window.dhtmlDragAndDrop.tempDOMU=document.body.onmouseup; window.dhtmlDragAndDrop.tempDOMM=document.body.onmousemove; window.dhtmlDragAndDrop.dragStartNode=this; window.dhtmlDragAndDrop.dragStartObject=this.dragStarter; document.body.onmouseup=window.dhtmlDragAndDrop.preCreateDragCopy; document.body.onmousemove=window.dhtmlDragAndDrop.callDrag; window.dhtmlDragAndDrop.downtime = new Date().valueOf(); if ((e)&&(e.preventDefault)){ e.preventDefault(); return false; } return false; }; dhtmlDragAndDropObject.prototype.callDrag=function(e){ if (!e) e=window.event; dragger=window.dhtmlDragAndDrop; if ((new Date()).valueOf()-dragger.downtime<100) return; //if ((e.button == 0)&&(_isIE)) // return dragger.stopDrag(); if (!dragger.dragNode){ if (dragger.waitDrag){ dragger.dragNode=dragger.dragStartObject._createDragNode(dragger.dragStartNode, e); if (!dragger.dragNode) return dragger.stopDrag(); dragger.dragNode.onselectstart=function(){return false;} dragger.gldragNode=dragger.dragNode; document.body.appendChild(dragger.dragNode); document.body.onmouseup=dragger.stopDrag; dragger.waitDrag=0; dragger.dragNode.pWindow=window; dragger.initFrameRoute(); } else return dragger.stopDrag(e, true); } if (dragger.dragNode.parentNode != window.document.body && dragger.gldragNode){ var grd = dragger.gldragNode; if (dragger.gldragNode.old) grd=dragger.gldragNode.old; //if (!document.all) dragger.calculateFramePosition(); grd.parentNode.removeChild(grd); var oldBody = dragger.dragNode.pWindow; if (grd.pWindow && grd.pWindow.dhtmlDragAndDrop.lastLanding) grd.pWindow.dhtmlDragAndDrop.lastLanding.dragLanding._dragOut(grd.pWindow.dhtmlDragAndDrop.lastLanding); // var oldp=dragger.dragNode.parentObject; if (_isIE){ var div = document.createElement("Div"); div.innerHTML=dragger.dragNode.outerHTML; dragger.dragNode=div.childNodes[0]; } else dragger.dragNode=dragger.dragNode.cloneNode(true); dragger.dragNode.pWindow=window; // dragger.dragNode.parentObject=oldp; dragger.gldragNode.old=dragger.dragNode; document.body.appendChild(dragger.dragNode); oldBody.dhtmlDragAndDrop.dragNode=dragger.dragNode; } dragger.dragNode.style.left=e.clientX+15+(dragger.fx ? dragger.fx*(-1) : 0) +(document.body.scrollLeft||document.documentElement.scrollLeft)+"px"; dragger.dragNode.style.top=e.clientY+3+(dragger.fy ? dragger.fy*(-1) : 0) +(document.body.scrollTop||document.documentElement.scrollTop)+"px"; if (!e.srcElement) var z = e.target; else z=e.srcElement; dragger.checkLanding(z, e); } dhtmlDragAndDropObject.prototype.calculateFramePosition=function(n){ //this.fx = 0, this.fy = 0; if (window.name){ var el = parent.frames[window.name].frameElement.offsetParent; var fx = 0; var fy = 0; while (el){ fx+=el.offsetLeft; fy+=el.offsetTop; el=el.offsetParent; } if ((parent.dhtmlDragAndDrop)){ var ls = parent.dhtmlDragAndDrop.calculateFramePosition(1); fx+=ls.split('_')[0]*1; fy+=ls.split('_')[1]*1; } if (n) return fx+"_"+fy; else this.fx=fx; this.fy=fy; } return "0_0"; } dhtmlDragAndDropObject.prototype.checkLanding=function(htmlObject, e){ if ((htmlObject)&&(htmlObject.dragLanding)){ if (this.lastLanding) this.lastLanding.dragLanding._dragOut(this.lastLanding); this.lastLanding=htmlObject; this.lastLanding=this.lastLanding.dragLanding._dragIn(this.lastLanding, this.dragStartNode, e.clientX, e.clientY, e); this.lastLanding_scr=(_isIE ? e.srcElement : e.target); } else { if ((htmlObject)&&(htmlObject.tagName != "BODY")) this.checkLanding(htmlObject.parentNode, e); else { if (this.lastLanding) this.lastLanding.dragLanding._dragOut(this.lastLanding, e.clientX, e.clientY, e); this.lastLanding=0; if (this._onNotFound) this._onNotFound(); } } } dhtmlDragAndDropObject.prototype.stopDrag=function(e, mode){ dragger=window.dhtmlDragAndDrop; if (!mode){ dragger.stopFrameRoute(); var temp = dragger.lastLanding; dragger.lastLanding=null; if (temp) temp.dragLanding._drag(dragger.dragStartNode, dragger.dragStartObject, temp, (_isIE ? event.srcElement : e.target)); } dragger.lastLanding=null; if ((dragger.dragNode)&&(dragger.dragNode.parentNode == document.body)) dragger.dragNode.parentNode.removeChild(dragger.dragNode); dragger.dragNode=0; dragger.gldragNode=0; dragger.fx=0; dragger.fy=0; dragger.dragStartNode=0; dragger.dragStartObject=0; document.body.onmouseup=dragger.tempDOMU; document.body.onmousemove=dragger.tempDOMM; dragger.tempDOMU=null; dragger.tempDOMM=null; dragger.waitDrag=0; } dhtmlDragAndDropObject.prototype.stopFrameRoute=function(win){ if (win) window.dhtmlDragAndDrop.stopDrag(1, 1); for (var i = 0; i < window.frames.length; i++){ try{ if ((window.frames[i] != win)&&(window.frames[i].dhtmlDragAndDrop)) window.frames[i].dhtmlDragAndDrop.stopFrameRoute(window); } catch(e){} } try{ if ((parent.dhtmlDragAndDrop)&&(parent != window)&&(parent != win)) parent.dhtmlDragAndDrop.stopFrameRoute(window); } catch(e){} } dhtmlDragAndDropObject.prototype.initFrameRoute=function(win, mode){ if (win){ window.dhtmlDragAndDrop.preCreateDragCopy(); window.dhtmlDragAndDrop.dragStartNode=win.dhtmlDragAndDrop.dragStartNode; window.dhtmlDragAndDrop.dragStartObject=win.dhtmlDragAndDrop.dragStartObject; window.dhtmlDragAndDrop.dragNode=win.dhtmlDragAndDrop.dragNode; window.dhtmlDragAndDrop.gldragNode=win.dhtmlDragAndDrop.dragNode; window.document.body.onmouseup=window.dhtmlDragAndDrop.stopDrag; window.waitDrag=0; if (((!_isIE)&&(mode))&&((!_isFF)||(_FFrv < 1.8))) window.dhtmlDragAndDrop.calculateFramePosition(); } try{ if ((parent.dhtmlDragAndDrop)&&(parent != window)&&(parent != win)) parent.dhtmlDragAndDrop.initFrameRoute(window); }catch(e){} for (var i = 0; i < window.frames.length; i++){ try{ if ((window.frames[i] != win)&&(window.frames[i].dhtmlDragAndDrop)) window.frames[i].dhtmlDragAndDrop.initFrameRoute(window, ((!win||mode) ? 1 : 0)); } catch(e){} } } _isFF = false; _isIE = false; _isOpera = false; _isKHTML = false; _isMacOS = false; _isChrome = false; _FFrv = false; _KHTMLrv = false; _OperaRv = false; if (navigator.userAgent.indexOf('Macintosh') != -1) _isMacOS=true; if (navigator.userAgent.toLowerCase().indexOf('chrome')>-1) _isChrome=true; if ((navigator.userAgent.indexOf('Safari') != -1)||(navigator.userAgent.indexOf('Konqueror') != -1)){ _KHTMLrv = parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf('Safari')+7, 5)); if (_KHTMLrv > 525){ //mimic FF behavior for Safari 3.1+ _isFF=true; _FFrv = 1.9; } else _isKHTML=true; } else if (navigator.userAgent.indexOf('Opera') != -1){ _isOpera=true; _OperaRv=parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf('Opera')+6, 3)); } else if (navigator.appName.indexOf("Microsoft") != -1){ _isIE=true; if ((navigator.appVersion.indexOf("MSIE 8.0")!= -1 || navigator.appVersion.indexOf("MSIE 9.0")!= -1 || navigator.appVersion.indexOf("MSIE 10.0")!= -1 || document.documentMode > 7) && document.compatMode != "BackCompat"){ _isIE=8; } } else if (navigator.appName == 'Netscape' && navigator.userAgent.indexOf("Trident") != -1){ //ie11 _isIE=8; } else { _isFF=true; _FFrv = parseFloat(navigator.userAgent.split("rv:")[1]) } if (typeof(window.dhtmlxEvent) == "undefined") { window.dhtmlxEvent = function(el, event, handler){ if (el.addEventListener) el.addEventListener(event, handler, false); else if (el.attachEvent) el.attachEvent("on"+event, handler); } }; if (dhtmlxEvent.touchDelay == null) { dhtmlxEvent.touchDelay = 2000; }; if (typeof(dhtmlxEvent.initTouch) == "undefined") { dhtmlxEvent.initTouch = function(){ var longtouch; var target; var tx, ty; dhtmlxEvent(document.body, "touchstart", function(ev){ target = ev.touches[0].target; tx = ev.touches[0].clientX; ty = ev.touches[0].clientY; longtouch = window.setTimeout(touch_event, dhtmlxEvent.touchDelay); }); function touch_event(){ if (target){ var ev = document.createEvent("HTMLEvents"); // for chrome and firefox ev.initEvent("dblclick", true, true); target.dispatchEvent(ev); longtouch = target = null; } }; dhtmlxEvent(document.body, "touchmove", function(ev){ if (longtouch){ if (Math.abs(ev.touches[0].clientX - tx) > 50 || Math.abs(ev.touches[0].clientY - ty) > 50 ){ window.clearTimeout(longtouch); longtouch = target = false; } } }); dhtmlxEvent(document.body, "touchend", function(ev){ if (longtouch){ window.clearTimeout(longtouch); longtouch = target = false; } }); dhtmlxEvent.initTouch = function(){}; }; }; /** Bazed on Promiz - A fast Promises/A+ library https://github.com/Zolmeister/promiz The MIT License (MIT) Copyright (c) 2014 Zolmeister Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* jshint ignore:start */ (function (self) { var now = typeof setImmediate !== 'undefined' ? setImmediate : function(cb) { setTimeout(cb, 0) } /** * @constructor */ function promise(fn, er) { var self = this self.promise = self self.state = 'pending' self.val = null self.fn = fn || null self.er = er || null self.next = []; } promise.prototype.resolve = function (v) { var self = this if (self.state === 'pending') { self.val = v self.state = 'resolving' now(function () { self.fire() }) } } promise.prototype.reject = function (v) { var self = this if (self.state === 'pending') { self.val = v self.state = 'rejecting' now(function () { self.fire() }) } } promise.prototype.then = function (fn, er) { var self = this var p = new promise(fn, er) self.next.push(p) if (self.state === 'resolved') { p.resolve(self.val) } if (self.state === 'rejected') { p.reject(self.val) } return p } promise.prototype.fail = function (er) { return this.then(null, er) } promise.prototype.finish = function (type) { var self = this self.state = type if (self.state === 'resolved') { for (var i = 0; i < self.next.length; i++) self.next[i].resolve(self.val); } if (self.state === 'rejected') { for (var i = 0; i < self.next.length; i++) self.next[i].reject(self.val); if (!self.next.length) throw(self.val); } } // ref : reference to 'then' function // cb, ec, cn : successCallback, failureCallback, notThennableCallback promise.prototype.thennable = function (ref, cb, ec, cn, val) { var self = this val = val || self.val if (typeof val === 'object' && typeof ref === 'function') { try { // cnt protects against abuse calls from spec checker var cnt = 0 ref.call(val, function(v) { if (cnt++ !== 0) return cb(v) }, function (v) { if (cnt++ !== 0) return ec(v) }) } catch (e) { ec(e) } } else { cn(val) } } promise.prototype.fire = function () { var self = this // check if it's a thenable var ref; try { ref = self.val && self.val.then } catch (e) { self.val = e self.state = 'rejecting' return self.fire() } self.thennable(ref, function (v) { self.val = v self.state = 'resolving' self.fire() }, function (v) { self.val = v self.state = 'rejecting' self.fire() }, function (v) { self.val = v if (self.state === 'resolving' && typeof self.fn === 'function') { try { self.val = self.fn.call(undefined, self.val) } catch (e) { self.val = e return self.finish('rejected') } } if (self.state === 'rejecting' && typeof self.er === 'function') { try { self.val = self.er.call(undefined, self.val) self.state = 'resolving' } catch (e) { self.val = e return self.finish('rejected') } } if (self.val === self) { self.val = TypeError() return self.finish('rejected') } self.thennable(ref, function (v) { self.val = v self.finish('resolved') }, function (v) { self.val = v self.finish('rejected') }, function (v) { self.val = v self.state === 'resolving' ? self.finish('resolved') : self.finish('rejected') }) }) } promise.prototype.done = function () { if (this.state = 'rejected' && !this.next) { throw this.val } return null } promise.prototype.nodeify = function (cb) { if (typeof cb === 'function') return this.then(function (val) { try { cb(null, val) } catch (e) { setImmediate(function () { throw e }) } return val }, function (val) { try { cb(val) } catch (e) { setImmediate(function () { throw e }) } return val }) return this } promise.prototype.spread = function (fn, er) { return this.all().then(function (list) { return typeof fn === 'function' && fn.apply(null, list) }, er) } promise.prototype.all = function() { var self = this return this.then(function(list){ var p = new promise() if(!(list instanceof Array)) { p.reject(TypeError) return p } var cnt = 0 var target = list.length function done() { if (++cnt === target) p.resolve(list) } for(var i=0, l=list.length; i