{"version":3,"file":"webix.min.js","sources":["../sources/thirdparty/promiz.js","../sources/services.js","../sources/webix/debug.js","../sources/webix/helpers.js","../sources/webix/i18n.js","../sources/webix/stringify.js","../sources/core/eventsystem.js","../sources/webix/customevents.js","../sources/load/drivers/xml.js","../sources/load/drivers/json.js","../sources/load/ajax.js","../sources/load/proxy/binary.js","../sources/load/proxy/debug.js","../sources/load/proxy/rest.js","../sources/load/proxy/json.js","../sources/load/proxy/post.js","../sources/load/proxy/graphql.js","../sources/load/proxy.js","../sources/load/drivers/jsarray.js","../sources/load/drivers/html.js","../sources/webix/env.js","../sources/webix/html.js","../sources/load/drivers/htmltable.js","../sources/load/require.js","../sources/load/drivers/excel.js","../sources/load/drivers/index.js","../sources/load/drivers/csv.js","../sources/core/atomdataloader.js","../sources/core/codeparser.js","../sources/webix/template.js","../sources/core/atomrender.js","../sources/core/autoscroll.js","../sources/webix/htmlevents.js","../sources/webix/type.js","../sources/core/state.js","../sources/ui/core.js","../sources/core/tooltipcontrol.js","../sources/ui/helpers.js","../sources/webix/ready.js","../sources/webix/rules.js","../sources/webix/message.js","../sources/webix/fullscreen.js","../sources/core/uimanager.js","../sources/core/settings.js","../sources/core/destruction.js","../sources/core/collectionbind.js","../sources/core/valuebind.js","../sources/core/recordbind.js","../sources/core/bindsource.js","../sources/core/basebind.js","../sources/views/baseview.js","../sources/views/view.js","../sources/core/singlerender.js","../sources/views/tooltip.js","../sources/core/autotooltip.js","../sources/core/canvas.js","../sources/webix/animate.js","../sources/css/skins/material/config.js","../sources/webix/skin.js","../sources/css/skins/mini/config.js","../sources/css/skins/flat/config.js","../sources/css/skins/compact/config.js","../sources/css/skins/contrast/config.js","../sources/core/touch.js","../sources/core/dragcontrol.js","../sources/core/movable.js","../sources/core/modality.js","../sources/core/resizearea.js","../sources/views/window.js","../sources/core/contexthelper.js","../sources/webix/clipbuffer.js","../sources/webix/csv.js","../sources/core/copypaste.js","../sources/core/customprint.js","../sources/core/customscroll.js","../sources/core/datamarks.js","../sources/core/datamove.js","../sources/core/validatedata.js","../sources/load/dataprocessor.js","../sources/core/datastore.js","../sources/core/dataloader.js","../sources/core/datastate.js","../sources/core/dragitem.js","../sources/core/dragorder.js","../sources/core/undo.js","../sources/webix/editors.js","../sources/core/editability.js","../sources/core/flexlayout.js","../sources/core/groupmethods.js","../sources/core/groupstore.js","../sources/core/group.js","../sources/core/htmloptions.js","../sources/core/htmlmap.js","../sources/core/idspace.js","../sources/core/keysnavigation.js","../sources/core/mapcollection.js","../sources/core/mouseevents.js","../sources/core/navigationbuttons.js","../sources/core/overlaybox.js","../sources/core/pagingability.js","../sources/core/progressbar.js","../sources/core/renderstack.js","../sources/core/scrollable.js","../sources/core/selectionmodel.js","../sources/webix/color.js","../sources/core/sparklines/svg.js","../sources/core/sparklines/line.js","../sources/core/sparklines/area.js","../sources/core/sparklines/bar.js","../sources/core/sparklines/pie.js","../sources/core/sparklines/spline.js","../sources/core/sparklines/splinearea.js","../sources/core/sparklines.js","../sources/core/tablepaste.js","../sources/core/treeapi.js","../sources/core/treeclick.js","../sources/core/treedataloader.js","../sources/core/treedatamove.js","../sources/core/treerenderstack.js","../sources/core/treestatecheckbox.js","../sources/core/treestore.js","../sources/core/treetablepaste.js","../sources/core/treetype.js","../sources/core/uploaddriver.js","../sources/core/validatecollection.js","../sources/core/values.js","../sources/core/virtualrenderstack.js","../sources/core/vrenderstack.js","../sources/webix/export/common.js","../sources/webix/export/topdf.js","../sources/webix/export/toexcel.js","../sources/webix/ie8.js","../sources/i18n/en.js","../sources/core/date.js","../sources/core/number.js","../sources/webix/locale.js","../sources/webix/storage.js","../sources/webix/print.js","../sources/webix/filters.js","../sources/webix/patterns.js","../sources/webix/index.js","../sources/load/remote.js","../sources/ui/fullscreen.js","../sources/ui/datafilter.js","../sources/views/baselayout.js","../sources/views/layout.js","../sources/views/daterange.js","../sources/ui/datafilter_pro.js","../sources/ui/detect.js","../sources/ui/index.js","../sources/ui/animate.js","../sources/i18n/index.js","../sources/i18n/de.js","../sources/i18n/es.js","../sources/i18n/fr.js","../sources/i18n/it.js","../sources/i18n/ja.js","../sources/i18n/pt.js","../sources/i18n/zh.js","../sources/i18n/ru.js","../sources/i18n/be.js","../sources/views/spacer.js","../sources/views/template.js","../sources/views/scrollview.js","../sources/views/accordion.js","../sources/views/iframe.js","../sources/views/accordionitem.js","../sources/views/headerlayout.js","../sources/views/resizearea.js","../sources/views/resizer.js","../sources/views/align.js","../sources/views/multiview.js","../sources/views/tabview.js","../sources/views/carousel.js","../sources/views/proxy.js","../sources/views/portlet.js","../sources/views/abslayout.js","../sources/views/gridlayout.js","../sources/views/dashboard.js","../sources/views/panel.js","../sources/views/flexlayout.js","../sources/views/datalayout.js","../sources/views/flexdatalayout.js","../sources/views/popup.js","../sources/views/toolbar.js","../sources/views/form.js","../sources/views/fieldset.js","../sources/views/forminput.js","../sources/views/htmlform.js","../sources/views/property.js","../sources/views/calendar.js","../sources/views/colorboard.js","../sources/views/colorselect.js","../sources/views/button.js","../sources/views/label.js","../sources/core/textpattern.js","../sources/views/text.js","../sources/core/datacollection.js","../sources/views/select.js","../sources/views/checkbox.js","../sources/views/radio.js","../sources/views/datepicker.js","../sources/views/colorpicker.js","../sources/views/richselect.js","../sources/views/combo.js","../sources/views/counter.js","../sources/views/icon.js","../sources/views/segmented.js","../sources/views/search.js","../sources/views/textarea.js","../sources/views/toggle.js","../sources/views/multitext.js","../sources/views/proto.js","../sources/views/list.js","../sources/views/multiselect.js","../sources/views/multicombo.js","../sources/views/slider.js","../sources/views/rangeslider.js","../sources/views/switch.js","../sources/views/tabbar.js","../sources/views/richtext.js","../sources/views/uploader.js","../sources/views/texthighlight.js","../sources/views/timeboard.js","../sources/views/suggest.js","../sources/webix/consts.js","../sources/webix/export/topng.js","../sources/webix/export/tocsv.js","../sources/webix/api.js","../sources/load/send.js"],"sourcesContent":["var global = window;\n\nvar queueId = 1;\nvar queue = {};\nvar isRunningTask = false;\n\nif (!global.setImmediate && global.addEventListener)\n\tglobal.addEventListener(\"message\", function (e) {\n\t\tif (e.source == global){\n\t\t\tif (isRunningTask)\n\t\t\t\tnextTick(queue[e.data]);\n\t\t\telse {\n\t\t\t\tisRunningTask = true;\n\t\t\t\ttry {\n\t\t\t\t\tqueue[e.data]();\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// eslint-disable-line\n\t\t\t\t}\n\n\t\t\t\tdelete queue[e.data];\n\t\t\t\tisRunningTask = false;\n\t\t\t}\n\t\t}\n\t});\n\nfunction nextTick(fn) {\n\tif (global.setImmediate) global.setImmediate(fn);\n\t// if inside of web worker\n\telse if (global.importScripts || !global.addEventListener) setTimeout(fn);\n\telse {\n\t\tqueueId++;\n\t\tqueue[queueId] = fn;\n\t\tglobal.postMessage(queueId, \"*\");\n\t}\n}\n\nDeferred.resolve = function (value) {\n\tif (!(this._d == 1))\n\t\tthrow TypeError();\n\n\tif (value instanceof Deferred)\n\t\treturn value;\n\n\treturn new Deferred(function (resolve) {\n\t\tresolve(value);\n\t});\n};\n\nDeferred.reject = function (value) {\n\tif (!(this._d == 1))\n\t\tthrow TypeError();\n\n\treturn new Deferred(function (resolve, reject) {\n\t\treject(value);\n\t});\n};\n\nDeferred.all = function (arr) {\n\tif (!(this._d == 1))\n\t\tthrow TypeError();\n\n\tif (!(arr instanceof Array))\n\t\treturn Deferred.reject(TypeError());\n\n\tvar d = new Deferred();\n\n\tfunction done(e, v) {\n\t\tif (v)\n\t\t\treturn d.resolve(v);\n\n\t\tif (e)\n\t\t\treturn d.reject(e);\n\n\t\tvar unresolved = arr.reduce(function (cnt, v) {\n\t\t\tif (v && v.then)\n\t\t\t\treturn cnt + 1;\n\t\t\treturn cnt;\n\t\t}, 0);\n\n\t\tif(unresolved == 0)\n\t\t\td.resolve(arr);\n\n\n\t\tarr.map(function (v, i) {\n\t\t\tif (v && v.then)\n\t\t\t\tv.then(function (r) {\n\t\t\t\t\tarr[i] = r;\n\t\t\t\t\tdone();\n\t\t\t\t\treturn r;\n\t\t\t\t}, done);\n\t\t});\n\t}\n\n\tdone();\n\n\treturn d;\n};\n\nDeferred.race = function (arr) {\n\tif (!(this._d == 1))\n\t\tthrow TypeError();\n\n\tif (!(arr instanceof Array))\n\t\treturn Deferred.reject(TypeError());\n\n\tif (arr.length == 0)\n\t\treturn new Deferred();\n\n\tvar d = new Deferred();\n\n\tfunction done(e, v) {\n\t\tif (v)\n\t\t\treturn d.resolve(v);\n\n\t\tif (e)\n\t\t\treturn d.reject(e);\n\n\t\tvar unresolved = arr.reduce(function (cnt, v) {\n\t\t\tif (v && v.then)\n\t\t\t\treturn cnt + 1;\n\t\t\treturn cnt;\n\t\t}, 0);\n\n\t\tif(unresolved == 0)\n\t\t\td.resolve(arr);\n\n\t\tarr.map(function (v) {\n\t\t\tif (v && v.then)\n\t\t\t\tv.then(function (r) {\n\t\t\t\t\tdone(null, r);\n\t\t\t\t}, done);\n\t\t});\n\t}\n\n\tdone();\n\n\treturn d;\n};\n\nDeferred._d = 1;\n\n\n/**\n * @constructor\n */\nfunction Deferred(resolver) {\n\t\"use strict\";\n\tif (typeof resolver != \"function\" && resolver != undefined)\n\t\tthrow TypeError();\n\t\t\n\tif (typeof this != \"object\" || (this && this.then))\n\t\tthrow TypeError();\n\n\t// states\n\t// 0: pending\n\t// 1: resolving\n\t// 2: rejecting\n\t// 3: resolved\n\t// 4: rejected\n\tvar self = this,\n\t\tstate = 0,\n\t\tval = 0,\n\t\tnext = [],\n\t\tfn, er;\n\n\tself[\"promise\"] = self;\n\n\tself[\"resolve\"] = function (v) {\n\t\tfn = self.fn;\n\t\ter = self.er;\n\t\tif (!state) {\n\t\t\tval = v;\n\t\t\tstate = 1;\n\n\t\t\tnextTick(fire);\n\t\t}\n\t\treturn self;\n\t};\n\n\tself[\"reject\"] = function (v) {\n\t\tfn = self.fn;\n\t\ter = self.er;\n\t\tif (!state) {\n\t\t\tval = v;\n\t\t\tstate = 2;\n\n\t\t\tnextTick(fire);\n\n\t\t}\n\t\treturn self;\n\t};\n\n\tself[\"_d\"] = 1;\n\n\tself[\"then\"] = function (_fn, _er) {\n\t\tif (!(this._d == 1))\n\t\t\tthrow TypeError();\n\n\t\tvar d = new Deferred();\n\n\t\td.fn = _fn;\n\t\td.er = _er;\n\t\tif (state == 3) {\n\t\t\td.resolve(val);\n\t\t}\n\t\telse if (state == 4) {\n\t\t\td.reject(val);\n\t\t}\n\t\telse {\n\t\t\tnext.push(d);\n\t\t}\n\n\t\treturn d;\n\t};\n\n\tself[\"finally\"] = function(_handler){\n\t\tvar _value;\n\t\tconst handler = function(value){\n\t\t\t_value = value;\n\t\t\treturn _handler();\n\t\t};\n\t\t\n\t\tconst value = function(){\n\t\t\tconst d = new Deferred();\n\t\t\tif(state == 4)\n\t\t\t\treturn d.reject(_value);\n\t\t\telse\n\t\t\t\treturn d.resolve(_value);\n\t\t};\n\n\t\treturn self.then(handler, handler).then(value, value);\n\t};\n\n\tself[\"catch\"] = function (_er) {\n\t\treturn self[\"then\"](null, _er);\n\t};\n\n\t//compatibility with old version of promiz lib\n\tself[\"fail\"] = function (_er) {\n\t\treturn self[\"then\"](null, _er);\n\t};\n\n\tvar finish = function (type) {\n\t\tstate = type || 4;\n\t\tfor (var i=0; i1){\n\t\ttarget = arguments[0];\n\t\tsource = arguments[1];\n\t} else \n\t\ttarget = (isArray(source)?[]:{});\n\n\tfor (var method in source){\n\t\tvar from = source[method];\n\t\tif(from && typeof from == \"object\" && !(from instanceof RegExp)){\n\t\t\tif (isDate(from))\n\t\t\t\ttarget[method] = new Date(from);\n\t\t\t/* jshint ignore:start */\n\t\t\telse if (esModern && (from instanceof Map || from instanceof Set || from instanceof WeakMap || from instanceof WeakSet))\n\t\t\t\ttarget[method] = from;\n\t\t\t/* jshint ignore:end */\n\t\t\telse {\n\t\t\t\ttarget[method] = (isArray(from)?[]:{});\n\t\t\t\tcopy(target[method],from);\n\t\t\t}\n\t\t} else {\n\t\t\ttarget[method] = from;\n\t\t}\n\t}\n\n\tif (DEBUG) level_out();\n\treturn target;\t\n}\n\nexport function single(source){ \n\tvar instance = null;\n\tvar t = function(){\n\t\tif (!instance)\n\t\t\tinstance = new source({});\n\t\t\t\n\t\tif (instance._reinit)\n\t\t\tinstance._reinit.apply(instance, arguments);\n\t\treturn instance;\n\t};\n\treturn t;\n}\n\n\n//creates function with specified \"this\" pointer\nexport function bind(functor, object){ \n\treturn function(){ return functor.apply(object,arguments); }; \n}\n\n\n//evaluate javascript code in the global scoope\nexport function exec(code){\n\tif (window.execScript)\t//special handling for IE\n\t\twindow.execScript(code);\n\telse window.eval(code);\n}\n\nexport function wrap(code, wrap){\n\tif (!code) return wrap;\n\treturn function(){\n\t\tvar result = code.apply(this, arguments);\n\t\twrap.apply(this,arguments);\n\t\treturn result;\n\t};\n}\n\n//check === undefined\nexport function isUndefined(a){\n\treturn typeof a == \"undefined\";\n}\n//delay call to after-render time\nexport function delay(method, obj, params, delay){\n\treturn window.setTimeout(function(){\n\t\tif(!(obj&&obj.$destructed)){\n\t\t\tvar ret = method.apply(obj,(params||[]));\n\t\t\tmethod = obj = params = null;\n\t\t\treturn ret;\n\t\t}\n\t},delay||1);\n}\n\nexport function once(method){\n\tvar flag = true;\n\treturn function(){\n\t\tif (flag){\n\t\t\tflag = false;\n\t\t\tmethod.apply(this, arguments);\n\t\t}\n\t};\n}\n\n//common helpers\n\n//generates unique ID (unique per window, nog GUID)\nlet _seed = (new Date()).valueOf();\nexport function uid(){\n\t_seed++;\n\treturn _seed;\n}\n//resolve ID as html object\nexport function toNode(node){\n\tif (typeof node == \"string\") return document.getElementById(node);\n\treturn node;\n}\n//resolve function name\nexport function toFunctor(str, scope){ \n\tif (typeof(str)==\"string\"){\n\t\tvar method = str.replace(\"()\",\"\");\n\t\tif (scope && scope[method]) return scope[method];\n\t\treturn window[method] || window.eval(str);\n\t}\n\treturn str;\n}\n/*checks where an object is instance of Array*/\nexport function isArray(obj) {\n\treturn Array.isArray?Array.isArray(obj):(Object.prototype.toString.call(obj) === \"[object Array]\");\n}\nexport function isDate(obj){\n\treturn obj instanceof Date;\n}\n\n//adds extra methods for the array\nexport function _to_array(array){ \n\treturn extend((array||[]),_power_array, true);\n}\n//can be used by _to_array()\nexport const _power_array={\n\t//remove element at specified position\n\tremoveAt:function(pos,len){\n\t\tif (pos>=0) this.splice(pos,(len||1));\n\t},\n\t//find element in collection and remove it \n\tremove:function(value){\n\t\tthis.removeAt(this.find(value));\n\t},\t\n\t//add element to collection at specific position\n\tinsertAt:function(data,pos){\n\t\tif (!pos && pos!==0)\t//add to the end by default\n\t\t\tthis.push(data);\n\t\telse {\n\t\t\tthis.splice(pos, 0, data); \n\t\t}\n\t},\n\t//return index of element, -1 if it doesn't exists\n\tfind:function(data){ \n\t\tfor (var i=0; i handler\n\t\t\tthis._evs_handlers = {};\t//hash of event handlers, ID => handler\n\t\t\tthis._evs_map = {};\n\t\t}\n\t},\n\t//temporary block event triggering\n\tblockEvent : function(){\n\t\tthis._evs_events._block = true;\n\t},\n\t//re-enable event triggering\n\tunblockEvent : function(){\n\t\tthis._evs_events._block = false;\n\t},\n\tmapEvent:function(map){\n\t\textend(this._evs_map, map, true);\n\t},\n\ton_setter:function(config){\n\t\tif(config){\n\t\t\tfor(var i in config){\n\t\t\t\tvar method = toFunctor(config[i], this.$scope);\n\t\t\t\tvar sub = i.indexOf(\"->\");\n\t\t\t\tif (sub !== -1){\n\t\t\t\t\tthis[i.substr(0,sub)].attachEvent(i.substr(sub+2), bind(method, this));\n\t\t\t\t} else\n\t\t\t\t\tthis.attachEvent(i, method);\n\t\t\t}\n\t\t}\n\t},\n\t//trigger event\n\tcallEvent:function(type,params){\n\t\tconst master = this._event_master || this;\n\t\tif (this._evs_events._block) return true;\n\t\t\n\t\ttype = type.toLowerCase();\n\t\tvar event_stack =this._evs_events[type.toLowerCase()];\t//all events for provided name\n\t\tvar return_value = true;\n\n\t\tif (DEBUG)\n\t\t\tif ((debug_mode.events || this.debug) && type !== \"onmousemoving\" )\t//can slowdown a lot\n\t\t\t\tlog(\"info\",\"[\"+this.name+\"@\"+((this._settings||{}).id)+\"] event:\"+type,params);\n\t\t\n\t\tif (event_stack)\n\t\t\tfor(var i=0; i evs.callEvent(a, b);\nexport const attachEvent = (a,b,c,d) => evs.attachEvent(a, b, c, d);\nexport const detachEvent = (a) => evs.detachEvent(a);\nexport const blockEvent = () => evs.blockEvent();\nexport const unblockEvent = () => evs.unblockEvent();\nexport const mapEvent = map => evs.mapEvent(map);\nexport const hasEvent = type => evs.hasEvent(type);\n","import { assert } from \"../../webix/debug\";\n\nconst xml={\n\t_isValidXML:function(data){\n\t\tif (!data || !data.documentElement)\n\t\t\treturn null;\n\t\tif (data.getElementsByTagName(\"parsererror\").length)\n\t\t\treturn null;\n\t\treturn data;\n\t},\n\t//convert xml string to xml object if necessary\n\ttoObject:function(text, response){\n\t\tvar data = response ? (response.rawxml ? response.rawxml() : response) :null;\n\t\tif (this._isValidXML(data))\n\t\t\treturn data;\n\t\tif (typeof text == \"string\")\n\t\t\tdata = this.fromString(text.replace(/^[\\s]+/,\"\"));\n\t\telse\n\t\t\tdata = text;\n\n\t\tif (this._isValidXML(data))\n\t\t\treturn data;\n\t\treturn null;\n\t},\n\t//get array of records\n\tgetRecords:function(data){\n\t\treturn this.xpath(data,this.records);\n\t},\n\trecords:\"/*/item\",\n\tchild:\"item\",\n\tconfig:\"/*/config\",\n\t//get hash of properties for single record\n\tgetDetails:function(data){\n\t\treturn this.tagToObject(data,{});\n\t},\n\tgetOptions:function(){ \n\t\treturn false;\n\t},\n\t//get count of data and position at which new data_loading need to be inserted\n\tgetInfo:function(data){\n\t\t\n\t\tvar config = this.xpath(data, this.config);\n\t\tif (config.length)\n\t\t\tconfig = this.assignTypes(this.tagToObject(config[0],{}));\n\t\telse \n\t\t\tconfig = null;\n\n\t\treturn {\n\t\t\tsize:(data.documentElement.getAttribute(\"total_count\")||0),\n\t\t\tfrom:data.documentElement.getAttribute(\"pos\"),\n\t\t\tparent:(data.documentElement.getAttribute(\"parent\")||0),\n\t\t\tconfig:config\n\t\t};\n\t},\n\t//xpath helper\n\txpath:function(xml,path){\n\t\tif (window.XPathResult){\t//FF, KHTML, Opera\n\t\t\tvar node=xml;\n\t\t\tif(xml.nodeName.indexOf(\"document\")==-1)\n\t\t\t\txml=xml.ownerDocument;\n\n\t\t\tvar res = [];\n\t\t\tvar col = xml.evaluate(path, node, null, XPathResult.ANY_TYPE, null);\n\t\t\tvar temp = col.iterateNext();\n\t\t\twhile (temp){ \n\t\t\t\tres.push(temp);\n\t\t\t\ttemp = col.iterateNext();\n\t\t\t}\n\t\t\treturn res;\n\t\t}\n\t\telse {\n\t\t\tvar test = true;\n\t\t\ttry {\n\t\t\t\tif (typeof(xml.selectNodes)==\"undefined\")\n\t\t\t\t\ttest = false;\n\t\t\t} catch(e){ /*IE7 and below can't operate with xml object*/ }\n\t\t\t//IE\n\t\t\tif (test)\n\t\t\t\treturn xml.selectNodes(path);\n\t\t\telse {\n\t\t\t\t//there is no interface to do XPath\n\t\t\t\t//use naive approach\n\t\t\t\tvar name = path.split(\"/\").pop();\n\n\t\t\t\treturn xml.getElementsByTagName(name);\n\t\t\t}\n\t\t}\n\t},\n\tassignTypes:function(obj){\n\t\tfor (var k in obj){\n\t\t\tvar test = obj[k];\n\t\t\tif (typeof test == \"object\")\n\t\t\t\tthis.assignTypes(test);\n\t\t\telse if (typeof test == \"string\"){\n\t\t\t\tif (test === \"\") \n\t\t\t\t\tcontinue;\n\t\t\t\tif (test == \"true\")\n\t\t\t\t\tobj[k] = true;\n\t\t\t\telse if (test == \"false\")\n\t\t\t\t\tobj[k] = false;\n\t\t\t\telse if (test == test*1)\n\t\t\t\t\tobj[k] = obj[k]*1;\n\t\t\t}\n\t\t}\n\t\treturn obj;\n\t},\n\t//convert xml tag to js object, all subtags and attributes are mapped to the properties of result object\n\ttagToObject:function(tag,z){\n\t\tvar isArray = tag.nodeType == 1 && tag.getAttribute(\"stack\");\n\t\tvar hasSubTags = 0;\n\n\t\tif (!isArray){\n\t\t\tz=z||{};\n\t\t\t\n\n\t\t\t//map attributes\n\t\t\tlet a=tag.attributes;\n\t\t\tif(a && a.length)\n\t\t\t\tfor (let i=0; i= 400 || x.status === 0;\n\t\t\t\tvar text, data;\n\t\t\t\tif (x.responseType == \"blob\" || x.responseType == \"arraybuffer\"){\n\t\t\t\t\ttext = \"\";\n\t\t\t\t\tdata = x.response;\n\t\t\t\t} else {\n\t\t\t\t\ttext = x.responseText||\"\";\n\t\t\t\t\tdata = self._data(x);\n\t\t\t\t}\n\t\t\t\tif (is_error){\n\t\t\t\t\tcallEvent(\"onAjaxError\", [x]);\n\t\t\t\t\tdefer.reject(x);\n\t\t\t\t\tif(call)\n\t\t\t\t\t\tajax.$callback((self.master || window), call, text, data, x, is_error);\n\t\t\t\t} else {\n\t\t\t\t\tdefer.resolve(data);\n\t\t\t\t\tif(call)\n\t\t\t\t\t\tajax.$callback((self.master || window), call, text, data, x, is_error);\n\t\t\t\t}\t\n\t\t\t}\n\t\t};\n\n\t\tif (this._timeout)\n\t\t\tx.timeout = this._timeout;\n\n\t\t//IE can use sync mode sometimes, fix it\n\t\tif (!this._sync)\n\t\t\tsetTimeout(function(){\n\t\t\t\tx.send(params||null);\n\t\t\t}, 0);\n\t\telse\n\t\t\tx.send(params||null);\n\t\t\n\t\tif (this.master && !this._sync){\n\t\t\tdefer.then(function(data){\n\t\t\t\t//anti-leak\n\t\t\t\tself.master=null;\n\t\t\t\tcall=self=master=null;\t\n\t\t\t\treturn data;\n\t\t\t});\n\t\t}\n\n\t\treturn this._sync?x:defer; //return XHR, which can be used in case of sync. mode\n\t},\n\t_data:function(x){\n\t\treturn {\n\t\t\txml:function(){ \n\t\t\t\ttry{\n\t\t\t\t\treturn xml.tagToObject(xml.toObject(x.responseText, this));\n\t\t\t\t}\n\t\t\t\tcatch(e){\n\t\t\t\t\tlog(x.responseText);\n\t\t\t\t\tlog(e.toString()); assert(0, \"Invalid xml data for parsing\"); \n\t\t\t\t}\n\t\t\t},\n\t\t\trawxml:function(){ \n\t\t\t\tif (!window.XPathResult)\n\t\t\t\t\treturn xml.fromString(x.responseText);\n\t\t\t\treturn x.responseXML;\n\t\t\t},\n\t\t\ttext:function(){ return x.responseText; },\n\t\t\tjson:function(){\n\t\t\t\treturn json.toObject(x.responseText, false);\n\t\t\t}\n\t\t};\n\t},\n\t//GET request\n\tget:function(url,params,call){\n\t\treturn this._send(url,params,call,\"GET\");\n\t},\n\t//POST request\n\tpost:function(url,params,call){\n\t\treturn this._send(url,params,call,\"POST\");\n\t},\n\t//PUT request\n\tput:function(url,params,call){\n\t\treturn this._send(url,params,call,\"PUT\");\n\t},\n\t//DELETE request\n\tdel:function(url,params,call){\n\t\treturn this._send(url,params,call,\"DELETE\");\n\t},\n\t//PATCH request\n\tpatch:function(url,params,call){\n\t\treturn this._send(url,params,call,\"PATCH\");\n\t},\n\n\tsync:function(){\n\t\tthis._sync = true;\n\t\treturn this;\n\t},\n\ttimeout:function(num){\n\t\tthis._timeout = num;\n\t\treturn this;\n\t},\n\tresponse:function(value){\n\t\tthis._response = value;\n\t\treturn this;\n\t},\n\theaders:function(header){\n\t\tthis._header = extend(this._header||{},header);\n\t\treturn this;\n\t},\n\tbind:function(master){\n\t\tthis.master = master;\n\t\treturn this;\n\t}\n};\najax.$callback = function(owner, call, text, data, x, is_error){\n\tif (owner.$destructed) return;\n\n\tif (is_error)\n\t\tcallEvent(\"onAjaxError\", [x]);\n\t\n\tif (call){\n\t\tvar method = call.success || call;\n\t\tif (is_error)\n\t\t\tmethod = call.error;\n\t\tif (method && method.call)\n\t\t\tmethod.call(owner,text,data,x);\n\t}\n};","import {ajax} from \"../ajax\";\n\nconst proxy = {\n\t$proxy:true,\n\tload:function(){\n\t\tvar parts = this.source.split(\"@\");\n\t\tvar ext = parts[0].split(\".\").pop();\n\t\treturn ajax().response(\"arraybuffer\").get(parts[0]).then(function(res){\n\t\t\tvar options = { ext:ext, dataurl : parts[1] };\n\t\t\treturn { data:res, options:options };\n\t\t});\n\t}\n};\n\nexport default proxy;","import {delay} from \"../../webix/helpers\";\n\n\n\nconst proxy = {\n\t$proxy:true,\n\tload:function(){},\n\tsave:function(v,u,d){\n\t\tdelay(function(){\n\t\t\twindow.console.log(\"[DP] \"+u.id+\" -> \"+u.operation, u.data);\n\t\t\tvar data = {\n\t\t\t\tid:u.data.id,\n\t\t\t\tnewid:u.data.id,\n\t\t\t\tstatus:u.data.operation\n\t\t\t};\n\t\t\td.processResult(data, data);\n\t\t});\n\t}\n};\n\nexport default proxy;","import {ajax} from \"../ajax\";\n\nconst proxy = {\n\t$proxy:true,\n\tload:function(){\n\t\treturn ajax(this.source);\n\t},\n\tsave:function(view, update){\n\t\treturn proxy._save_logic.call(this, update, ajax());\n\t},\n\t_save_logic:function(update, ajax){\n\t\tvar url = this.source;\n\t\tvar query = \"\";\n\t\tvar mark = url.indexOf(\"?\");\n\n\t\tif (mark !== -1){\n\t\t\tquery = url.substr(mark);\n\t\t\turl = url.substr(0, mark);\n\t\t}\n\n\t\turl += url.charAt(url.length-1) == \"/\" ? \"\" : \"/\";\n\t\tvar mode = update.operation;\n\n\n\t\tvar data = update.data;\n\t\tif (mode == \"insert\") delete data.id;\n\n\t\t//call rest URI\n\t\tif (mode == \"update\"){\n\t\t\treturn ajax.put(url + data.id + query, data);\n\t\t} else if (mode == \"delete\") {\n\t\t\treturn ajax.del(url + data.id + query, data);\n\t\t} else {\n\t\t\treturn ajax.post(url + query, data);\n\t\t}\n\t}\n};\n\nexport default proxy;\n","import {ajax} from \"../ajax\";\nimport rest from \"./rest\";\n\nconst proxy = {\n\t$proxy:true,\n\tload:function(){\n\t\treturn ajax(this.source);\n\t},\n\tsave:function(view, update){\n\t\tvar xhr = ajax().headers({ \"Content-Type\":\"application/json\" });\n\t\treturn rest._save_logic.call(this, update, xhr);\n\t}\n};\n\nexport default proxy;","import {extend} from \"../../webix/helpers\";\n\nimport {ajax} from \"../ajax\";\n\nconst proxy = {\n\t$proxy:true,\n\tload:function(view, params){\n\t\tparams = extend(params||{}, this.params || {}, true);\n\t\treturn ajax().post(this.source, params);\n\t}\n};\n\nexport default proxy;","import {ajax} from \"../ajax\";\n\nfunction unbox(data){\n\tif (!data || !typeof data === \"object\" || Array.isArray(data))\n\t\treturn data;\n\n\tvar lkey =\"\";\n\tvar count = 0;\n\tfor (var key in data){\n\t\tcount++;\n\t\tif (count == 2) return data;\n\t\tlkey = key;\n\t}\n\n\treturn data[lkey];\n}\n\nconst GraphQL = {\n\t$proxy:true,\n\tsave:function(data){\n\t\treturn this.load(data);\n\t},\n\tload:function(view){\n\t\tvar params = {\n\t\t\tquery: this.source\n\t\t};\n\t\tif (arguments.length === 1){\n\t\t\tparams.variables = view;\n\t\t}\n\n\t\treturn ajax()\n\t\t\t.headers({ \"Content-type\": \"application/json\" })\n\t\t\t.post(this.url, params)\n\t\t\t.then(function(data){\n\t\t\t\treturn unbox(data.json().data);\n\t\t\t});\n\t}\n};\n\nexport default GraphQL;","import {assert} from \"../webix/debug\";\nimport {extend, copy as makeCopy} from \"../webix/helpers\";\n\nimport binary from \"./proxy/binary\";\nimport debug from \"./proxy/debug\";\nimport json from \"./proxy/json\";\nimport post from \"./proxy/post\";\nimport rest from \"./proxy/rest\";\nimport graphql from \"./proxy/graphql\";\n\nfunction proxy(name, source, extra){\n\tassert(proxy[name], \"Invalid proxy name: \"+name);\n\n\tvar copy = makeCopy(proxy[name]);\n\tcopy.source = source;\n\n\tif (extra)\n\t\textend(copy, extra, true);\n\n\tif (copy.init) copy.init();\n\treturn copy;\n}\n\nproxy.$parse = function(value){\n\tif (typeof value == \"string\" && value.indexOf(\"->\") != -1){\n\t\tvar parts = value.split(\"->\");\n\t\treturn proxy(parts[0], parts[1]);\n\t}\n\treturn value;\n};\n\nproxy.binary = binary;\nproxy.debug = debug;\nproxy.json = json;\nproxy.post = post;\nproxy.rest = rest;\nproxy.GraphQL = graphql;\n\nexport default proxy;","const jsarray={\n\t//parse jsarray string to jsarray object if necessary\n\ttoObject:function(data){\n\t\tif (typeof data == \"string\")\n\t\t\treturn JSON.parse(data);\n\t\treturn data;\n\t},\n\t//get array of records\n\tgetRecords:function(data){\n\t\tif (data && data.data)\n\t\t\tdata = data.data;\n\t\treturn data;\n\t},\n\t//get hash of properties for single record, in case of array they will have names as \"data{index}\"\n\tgetDetails:function(data){\n\t\tvar result = {};\n\t\tfor (var i=0; i < data.length; i++)\n\t\t\tresult[\"data\"+i]=data[i];\n\t\tif (this.idColumn !== null)\n\t\t\tresult.id = data[this.idColumn];\n\n\t\treturn result;\n\t},\n\tgetOptions:function(){ return false; },\n\t//dyn loading is not supported by js-array data source\n\tgetInfo:function(){\n\t\treturn {\n\t\t\tsize:0\n\t\t};\n\t},\n\tidColumn:null\n};\n\nexport default jsarray;","import { toNode } from \"../../webix/helpers.js\";\nimport xml from \"./xml.js\";\n\nconst html = {\n\t/*\n\t\tincoming data can be\n\t\t - ID of parent container\n\t\t - HTML text\n\t*/\n\ttoObject:function(data){\n\t\tif (typeof data == \"string\"){\n\t\t\tvar t=null;\n\t\t\tif (data.indexOf(\"<\")==-1)\t//if no tags inside - probably its an ID\n\t\t\t\tt = toNode(data);\n\t\t\tif (!t){\n\t\t\t\tt=document.createElement(\"DIV\");\n\t\t\t\tt.innerHTML = data;\n\t\t\t}\n\t\t\n\t\t\treturn t.firstChild;\n\t\t}\n\t\treturn data;\n\t},\n\t//get array of records\n\tgetRecords:function(node){\n\t\treturn node.getElementsByTagName(this.tag);\n\t},\n\t//get hash of properties for single record\n\tgetDetails:function(data){\n\t\treturn xml.tagToObject(data);\n\t},\n\tgetOptions:function(){ \n\t\treturn false;\n\t},\n\t//dyn loading is not supported by HTML data source\n\tgetInfo:function(){\n\t\treturn {\n\t\t\tsize:0\n\t\t};\n\t},\n\ttag: \"LI\"\n};\n\nexport default html;","const env = {};\n\nenv.cdn = \"//cdn.webix.com\";\nenv.codebase = \"\";\nenv.zIndexBase = 100;\nenv.scrollSize = 17;\nenv.strict = !!window.webix_strict;\nenv.https = document.location.protocol === \"https:\";\n\nvar agent = navigator.userAgent;\nenv.isMac = agent.indexOf(\"Mac\")!=-1;\nif (agent.indexOf(\"Mobile\")!=-1 || agent.indexOf(\"Windows Phone\")!=-1)\n\tenv.mobile = true;\nif (env.mobile || agent.indexOf(\"iPad\")!=-1 || agent.indexOf(\"Android\")!=-1)\n\tenv.touch = true;\nif (!env.touch && (navigator.platform === \"MacIntel\" && navigator.maxTouchPoints > 1))\n\tenv.touch = true;\nif (agent.indexOf(\"Opera\")!=-1)\n\tenv.isOpera=true;\nelse{\n\t//very rough detection, but it is enough for current goals\n\tenv.isIE=!!document.all || (agent.indexOf(\"Trident\") !== -1);\n\tif (env.isIE){\n\t\tvar version = parseFloat(navigator.appVersion.split(\"MSIE\")[1]);\n\t\tif (version == 8)\n\t\t\tenv.isIE8 = true;\n\t}\n\tenv.isEdge=(agent.indexOf(\"Edge\")!=-1);\n\tenv.isFF=(agent.indexOf(\"Firefox\")!=-1);\n\tenv.isWebKit=(agent.indexOf(\"KHTML\")!=-1);\n\tenv.isSafari=env.isWebKit && env.isMac && (agent.indexOf(\"Chrome\")==-1);\n\n\t//maximum height/width for HTML elements in pixels (rough), bigger values will be ignored by browser\n\tif(env.isIE || env.isEdge || env.isFF)\n\t\tenv.maxHTMLElementSize = 10000000;\n\tif(env.isSafari)\n\t\tenv.maxHTMLElementSize = 100000000;\n}\n\nif(agent.toLowerCase().indexOf(\"android\")!=-1){\n\tenv.isAndroid = true;\n\tif(agent.toLowerCase().indexOf(\"trident\")!=-1){\n\t\tenv.isAndroid = false;\n\t\tenv.isIEMobile = true;\n\t}\n}\n\nenv.transform = false;\nenv.transition = false;\n\nvar found_index = -1;\nvar js_list = [\"\", \"webkit\", \"Moz\", \"O\", \"ms\"];\nvar css_list = [\"\", \"-webkit-\", \"-Moz-\", \"-o-\", \"-ms-\"];\n\n\nvar d = document.createElement(\"DIV\");\nfor (var j=0; j < js_list.length; j++) {\n\tvar name = js_list[j] ? (js_list[j]+\"Transform\") : \"transform\";\n\tif(typeof d.style[name] != \"undefined\"){\n\t\tfound_index = j;\n\t\tbreak;\n\t}\n}\n\n\nif (found_index > -1){\n\tenv.cssPrefix = css_list[found_index];\n\tvar jp = env.jsPrefix = js_list[found_index];\n\n\tenv.transform = jp ? jp+\"Transform\" : \"transform\";\n\tenv.transition = jp ? jp+\"Transition\" : \"transition\";\n\tenv.transitionDuration = jp ? jp+\"TransitionDuration\" : \"transitionDuration\";\n\n\td.style[env.transform] = \"translate3d(0,0,0)\";\n\tenv.translate = (d.style[env.transform])?\"translate3d\":\"translate\";\n\tenv.transitionEnd = ((env.cssPrefix == \"-Moz-\")?\"transitionend\":(jp ? jp+\"TransitionEnd\" : \"transitionend\"));\n}\n\nenv.pointerevents = (!env.isIE ||(new RegExp(\"Trident/.*rv:11\")).exec(agent) !== null);\n\n//touch events that can be prevented\nenv.passiveEventListeners = false;\ntry {\n\tvar opts = Object.defineProperty({}, \"passive\", {\n\t\tget: function() { // eslint-disable-line\n\t\t\tenv.passiveEventListeners = true;\n\t\t}\n\t});\n\twindow.addEventListener(\"testPassive\", null, opts);\n\twindow.removeEventListener(\"testPassive\", null, opts);\n} catch (e) {} // eslint-disable-line\n\nenv.svg = (function(){\n\treturn document.implementation.hasFeature(\"http://www.w3.org/TR/SVG11/feature#BasicStructure\", \"1.1\");\n})();\n\nenv.svganimation = (function(){\n\treturn document.implementation.hasFeature(\"https://www.w3.org/TR/SVG11/feature#SVG-animation\", \"1.1\");\n})();\n\nexport default env;","import {delay, uid, toNode, isUndefined} from \"./helpers.js\";\nimport env from \"./env.js\";\n\nlet _native_on_selectstart = 0;\nconst _style_element = {};\nconst _style_cache = {};\n\nexport function denySelect(){\n\tif (!_native_on_selectstart)\n\t\t_native_on_selectstart = document.onselectstart;\n\tdocument.onselectstart = stopEvent;\n}\n\nexport function allowSelect(){\n\tif (_native_on_selectstart !== 0){\n\t\tdocument.onselectstart = _native_on_selectstart||null;\n\t}\n\t_native_on_selectstart = 0;\n\n}\n\nexport function index(node){\n\tvar k=0;\n\t//must be =, it is not a comparation!\n\twhile ((node = node.previousSibling)) k++;\n\treturn k;\n}\n\nexport function createCss(rule, sufix){\n\tvar text = \"\";\n\tsufix = sufix || \"\";\n\n\tfor (var key in rule)\n\t\ttext+= key+\":\"+rule[key]+\";\";\n \n\tvar name = _style_cache[text+sufix];\n\tif (!name){\n\t\tname = \"s\"+uid();\n\t\taddStyle(\".\"+name+(sufix||\"\")+\"{\"+text+\"}\");\n\t\t_style_cache[text+sufix] = name;\n\t}\n\treturn name;\n}\n\nexport function addStyle(rule, group){\n\tvar style = group ? _style_element[group] :_style_element[\"default\"];\n\tif(!style){\n\t\tstyle = document.createElement(\"style\");\n\t\tstyle.setAttribute(\"type\", \"text/css\");\n\t\tstyle.setAttribute(\"media\", \"screen,print\");\n\t\tdocument.getElementsByTagName(\"head\")[0].appendChild(style);\n\n\t\tif (group)\n\t\t\t_style_element[group] = style;\n\t\telse\n\t\t\t_style_element[\"default\"] = style;\n\t}\n\t/*IE8*/\n\tif (style.styleSheet)\n\t\tstyle.styleSheet.cssText += rule;\n\telse\n\t\tstyle.appendChild(document.createTextNode(rule));\n}\n\nexport function removeStyle(group){\n\tvar box = _style_element[group||\"default\"];\n\tif (box)\n\t\tbox.innerHTML = \"\";\n}\n\nexport function create(name,attrs,html){\n\tattrs = attrs || {};\n\tvar node = document.createElement(name);\n\tfor (var attr_name in attrs)\n\t\tnode.setAttribute(attr_name, attrs[attr_name]);\n\tif (attrs.style)\n\t\tnode.style.cssText = attrs.style;\n\tif (attrs[\"class\"])\n\t\tnode.className = attrs[\"class\"];\n\tif (html)\n\t\tnode.innerHTML=html;\n\treturn node;\n}\n\n//return node value, different logic for different html elements\nexport function getValue(node){\n\tnode = toNode(node);\n\tif (!node) return \"\";\n\treturn isUndefined(node.value)?node.innerHTML:node.value;\n}\n\n//remove html node, can process an array of nodes at once\nexport function remove(node){\n\tif (node instanceof Array)\n\t\tfor (var i=0; i < node.length; i++)\n\t\t\tremove(node[i]);\n\telse if (node && node.parentNode)\n\t\tnode.parentNode.removeChild(node);\n}\n\n//insert new node before sibling, or at the end if sibling doesn't exist\nexport function insertBefore(node,before,rescue){\n\tif (!node) return;\n\tif (before && before.parentNode)\n\t\tbefore.parentNode.insertBefore(node, before);\n\telse\n\t\trescue.appendChild(node);\n}\n\n//return custom ID from html element \n//will check all parents starting from event's target\nexport function locate(e,id){\n\tvar trg;\n\tif (e.tagName)\n\t\ttrg = e;\n\telse {\n\t\te=e||event;\n\t\ttrg=e.target;\n\t}\n \n\twhile (trg){\n\t\tif (trg.getAttribute){\t//text nodes has not getAttribute\n\t\t\tvar test = trg.getAttribute(id);\n\t\t\tif (test) return test;\n\t\t}\n\t\ttrg=trg.parentNode;\n\t}\t\n\treturn null;\n}\n\n//returns position of html element on the page\nexport function offset(elem) {\n\tif (elem.getBoundingClientRect) { //HTML5 method\n\t\tconst box = elem.getBoundingClientRect();\n\t\tconst body = document.body;\n\t\tconst docElem = document.documentElement;\n\t\tconst scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop;\n\t\tconst scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft;\n\t\tconst clientTop = docElem.clientTop || body.clientTop || 0;\n\t\tconst clientLeft = docElem.clientLeft || body.clientLeft || 0;\n\t\tconst top = box.top + scrollTop - clientTop;\n\t\tconst left = box.left + scrollLeft - clientLeft;\n\t\treturn { y: Math.round(top), x: Math.round(left), width:elem.offsetWidth, height:elem.offsetHeight };\n\t} else { //fallback to naive approach\n\t\tlet top=0, left=0;\n\t\twhile(elem) {\n\t\t\ttop = top + parseInt(elem.offsetTop,10);\n\t\t\tleft = left + parseInt(elem.offsetLeft,10);\n\t\t\telem = elem.offsetParent;\n\t\t}\n\t\treturn { y: top, x: left, width:elem.offsetHeight, height:elem.offsetWidth };\n\t}\n}\n\n//returns relative position of event\nexport function posRelative(ev){\n\tev = ev || event;\n\tif (!isUndefined(ev.offsetX))\n\t\treturn { x:ev.offsetX, y:ev.offsetY };\t//ie, webkit\n\telse\n\t\treturn { x:ev.layerX, y:ev.layerY };\t//firefox\n}\n\n//returns position of event\nexport function pos(ev){\n\tev = ev || event;\n\tif (ev.touches && ev.touches[0])\n\t\tev = ev.touches[0];\n\n\tif(ev.pageX || ev.pageY)\t//FF, KHTML\n\t\treturn {x:ev.pageX, y:ev.pageY};\n\t//IE\n\tvar d = ((env.isIE)&&(document.compatMode != \"BackCompat\"))?document.documentElement:document.body;\n\treturn {\n\t\tx:ev.clientX + d.scrollLeft - d.clientLeft,\n\t\ty:ev.clientY + d.scrollTop - d.clientTop\n\t};\n}\n\n//prevent event action\nexport function preventEvent(e){\n\tif(e && e.preventDefault) e.preventDefault();\n\tif(e) e.returnValue = false;\n\treturn stopEvent(e);\n}\n\n//stop event bubbling\nexport function stopEvent(e){\n\te = (e||event);\n\tif(e.stopPropagation) e.stopPropagation();\n\te.cancelBubble=true;\n\treturn false;\n}\n\nexport function triggerEvent(node, type, name){\n\tif(document.createEventObject){\n\t\tconst ev = document.createEventObject();\n\t\tif (node.fireEvent)\n\t\t\tnode.fireEvent(\"on\"+name, ev);\n\t} else{\n\t\tconst ev = document.createEvent(type);\n\t\tev.initEvent(name, true, true);\n\t\tif (node.dispatchEvent)\n\t\t\tnode.dispatchEvent(ev);\n\t}\n}\n\n//add css class to the node\nexport function addCss(node,name,check){\n\tif (!check || node.className.indexOf(name) === -1)\n\t\tnode.className+=\" \"+name;\n}\n\n//remove css class from the node\nexport function removeCss(node,name){\n\tnode.className=node.className.replace(RegExp(\" \"+name,\"g\"),\"\");\n}\n\nexport function getTextSize(text, css, basewidth){\n\tvar d = create(\"DIV\",{\"class\":\"webix_view webix_measure_size \"+(css||\"\")},\"\");\n\td.style.cssText = \"height:auto;visibility:hidden; position:absolute; top:0px; left:0px; overflow:hidden;\"+(basewidth?(\"width:\"+basewidth+\"px;\"):\"width:auto;white-space:nowrap;\");\n\tdocument.body.appendChild(d);\n\n\tvar all = (typeof text !== \"object\") ? [text] : text;\n\tvar width = 0;\n\tvar height = 0;\n\n\tfor (var i = 0; i < all.length; i++) {\n\t\td.innerHTML = all[i];\n\t\t//we need to add 1 to offsetWidth/Height because these methods return value as an integer\n\t\t//we can use ie9+ d.getBoundingClientRect().width\n\t\twidth = Math.max(width, d.offsetWidth+1);\n\t\theight = Math.max(height, d.offsetHeight+1);\n\t}\n \n\tremove(d);\n\treturn { width:width, height:height };\n}\n\nexport function download(data, filename){\n\tvar objUrl = false;\n\n\tif(typeof data ==\"object\"){//blob\n\t\tif(window.navigator.msSaveBlob)\n\t\t\treturn window.navigator.msSaveBlob(data, filename);\n\t\telse {\n\t\t\tdata = window.URL.createObjectURL(data);\n\t\t\tobjUrl = true;\n\t\t}\n\t}\n\t//data url or blob url\n\tvar link = document.createElement(\"a\");\n\tlink.href = data;\n\tlink.download = filename;\n\tdocument.body.appendChild(link);\n\tlink.click(); \n\n\tdelay(function(){\n\t\tif(objUrl) window.URL.revokeObjectURL(data);\n\t\tdocument.body.removeChild(link);\n\t\tlink.remove();\n\t});\n}\n\nexport function _getClassName(node){\n\tif(!node) return \"\";\n\n\tvar className = node.className || \"\";\n\tif(className.baseVal)//'className' exist but not a string - IE svg element in DOM\n\t\tclassName = className.baseVal;\n\n\tif(!className.indexOf)\n\t\tclassName = \"\";\n\n\treturn className;\n}\n\nexport function setSelectionRange(node, start, end){\n\tstart = start || 0;\n\tend = end || start;\n\n\tnode.focus();\n\tif(node.setSelectionRange)\n\t\tnode.setSelectionRange(start, end);\n\telse{\n\t\t//ie8\n\t\tvar textRange = node.createTextRange();\n\t\ttextRange.collapse(true);\n\t\ttextRange.moveEnd(\"character\", end);\n\t\ttextRange.moveStart(\"character\", start);\n\t\ttextRange.select();\n\t}\n}\n\nexport function getSelectionRange(node){\n\tif(\"selectionStart\" in node)\n\t\treturn {start:node.selectionStart || 0, end:node.selectionEnd || 0};\n\telse{\n\t\t//ie8\n\t\tnode.focus();\n\t\tvar selection = document.selection.createRange();\n\t\tvar bookmark = selection.getBookmark();\n\t\tvar textRange = node.createTextRange();\n\n\t\ttextRange.moveToBookmark(bookmark);\n\t\tvar length = textRange.text.length;\n \n\t\ttextRange.collapse(true);\n\t\ttextRange.moveStart(\"character\", -node.value.length);\n\n\t\tvar start = textRange.text.length;\n\t\treturn {start:start, end: start + length};\n\t}\n}\n\nexport function addMeta(name, value){\n\tdocument.getElementsByTagName(\"head\").item(0).appendChild(create(\"meta\",{\n\t\tname:name,\n\t\tcontent:value\n\t}));\t\n}\n\n","import {assert} from \"../../webix/debug\";\nimport {toNode, extend} from \"../../webix/helpers\";\nimport {remove} from \"../../webix/html\";\n\nconst htmltable={\n\n\t//convert json string to json object if necessary\n\ttoObject:function(data){\n\t\tdata = toNode(data);\n\t\tassert(data, \"table is not found\");\n\t\tassert(data.tagName.toLowerCase() === \"table\", \"Incorrect table object\");\n\n\t\tvar tr = data.rows;\n\t\tremove(data);\n\t\treturn tr;\n\t},\n\t//get array of records\n\tgetRecords:function(data){\n\t\tvar new_data = [];\n\t\t//skip header rows if necessary\n\t\tvar i = (data[0] && data[0]._webix_skip)?1:0;\n\n\t\tfor (; i < data.length; i++)\n\t\t\tnew_data.push(data[i]);\n\t\treturn new_data;\n\t},\n\t//get hash of properties for single record\n\tgetDetails:function(data){\n\t\tvar td = data.getElementsByTagName(\"td\");\n\t\tdata = {};\n\t\t//get hash of properties for single record, data named as \"data{index}\"\n\t\tfor (var i=0; i < td.length; i++) {\n\t\t\tdata[\"data\" + i] = td[i].innerHTML;\n\t\t}\n\t\treturn data;\n\t},\n\t//get count of data and position at which new data need to be inserted\n\tgetInfo:function(){\n\t\t// dyn loading is not supported for htmltable\n\t\treturn { \n\t\t\tsize:0\n\t\t};\n\t},\n\tgetOptions:function(){},\n\n\t/*! gets header from first table row\n\t **/\n\tgetConfig: function(data) {\n\t\tvar columns = [];\n\t\tvar td = data[0].getElementsByTagName(\"th\");\n\t\tif (td.length) data[0]._webix_skip = true;\n\t\tfor (var i = 0; i < td.length; i++) {\n\t\t\tvar col = {\n\t\t\t\tid: \"data\" + i,\n\t\t\t\theader: this._de_json(td[i].innerHTML)\n\t\t\t};\n\t\t\tvar attrs = this._get_attrs(td[i]);\n\t\t\tcol = extend(col, attrs);\n\t\t\tcolumns.push(col);\n\t\t}\n\t\treturn columns;\n\t},\n\n\t_de_json:function(str){\n\t\tvar pos = str.indexOf(\"json://\");\n\t\t\n\t\tif (pos != -1)\n\t\t\tstr = JSON.parse(str.substr(pos+7));\n\t\treturn str;\n\t},\n\t\n\t/*! gets hash of html-element attributes\n\t **/\n\t_get_attrs: function(el) {\n\t\tvar attr = el.attributes;\n\t\tvar hash = {};\n\t\tfor (var i = 0; i < attr.length; i++) {\n\t\t\thash[attr[i].nodeName] = this._de_json(attr[i].nodeValue);\n\t\t}\n\t\thash.width = parseInt(hash.width, 10);\n\t\treturn hash;\n\t}\n};\n\nexport default htmltable;","import {create} from \"../webix/html.js\";\nimport {exec} from \"../webix/helpers.js\";\nimport {ajax} from \"./ajax.js\";\n\nimport Promise from \"../thirdparty/promiz\";\n\nconst _modules = {};\t//hash of already loaded modules\n\n//loads module from external js file\nexport default function require(module, callback, master){\n\tvar promise = Promise.defer();\n\n\tif (callback && callback !== true)\n\t\tpromise = promise.then(function(){ callback.call(master || this); });\n\n\tif (require.disabled){\n\t\tpromise.resolve();\n\t\treturn promise;\n\t}\n\n\t//multiple files required at once\n\tif (typeof module != \"string\"){\n\t\tvar count = module.length||0;\n\t\t\n\t\tif (!count){\n\t\t\t// { file: true, other: true }\n\t\t\tfor (let file in module) count++; // eslint-disable-line\n\t\t\tlet callback2 = function(){\n\t\t\t\tcount--;\n\t\t\t\tif (count === 0)\n\t\t\t\t\tpromise.resolve();\n\t\t\t};\n\t\t\tfor (let file in module)\n\t\t\t\trequire(file).then(callback2, () => promise.reject());\n\t\t} else {\n\t\t\t// [ file, other ]\n\t\t\tlet callback2 = function(){\n\t\t\t\tif (count){\n\t\t\t\t\tcount--;\n\t\t\t\t\trequire(module[module.length - count - 1])\n\t\t\t\t\t\t.then(callback2, () => promise.reject());\n\n\t\t\t\t} else {\n\t\t\t\t\tpromise.resolve();\n\t\t\t\t}\n\t\t\t};\n\t\t\tcallback2();\n\t\t}\n\t\treturn promise;\n\t}\n\n\tif (_modules[module] !== true){\n\t\tconst fullpath = module;\n\n\t\tif (callback === true){\n\t\t\t//sync mode\n\t\t\texec( ajax().sync().get(fullpath).responseText );\n\t\t\t_modules[module]=true;\n\t\t\treturn promise.resolve();\n\t\t}\n\n\t\tif (!_modules[module])\t//first call\n\t\t\t_modules[module] = [promise];\n\t\telse {\n\t\t\t_modules[module].push(promise);\n\t\t\treturn promise;\n\t\t}\n\n\t\tconst onerror = function(){\n\t\t\tconst calls = _modules[module];\n\t\t\t_modules[module] = false;\n\t\t\tfor (var i=0; i