\";\n\n\t\t\tdocument.body.appendChild(probe);\n\t\t\tvar styles = window.getComputedStyle(probe.querySelector(\".dhx_body\"));\n\t\t\tvar boxSizing = styles.getPropertyValue('box-sizing');\n\t\t\tdocument.body.removeChild(probe);\n\t\t\tcachedBorderBoxValue = !!(boxSizing === \"border-box\");\n\n\t\t\tif(!cachedBorderBoxValue){\n\t\t\t\tsetTimeout(function(){\n\t\t\t\t\tcachedBorderBoxValue = undefined;\n\t\t\t\t}, 1000);// recalculate in case scheduler initialized before skin is loaded\n\t\t\t}\n\t\t}else{\n\t\t\treturn cachedBorderBoxValue;\n\t\t}\n\t}\n}\n\nfunction refreshAfterLoad(){\n\tif(scheduler._is_material_skin() || scheduler._border_box_events()){\n\t\treturn;\n\t}\n\n\tvar oldStyling = cachedBorderBoxValue;\n\tcachedBorderBoxValue = undefined;\n\tcalculatedMaterial = undefined;\n\tvar newStyling = checkIfBorderBoxStyling();\n\n\t// if box styling model changed - means scheduler was rendered before stylesheet was loaded or parsed inline\n\t// repaint scheduler in order to apply new styles\n\tif(oldStyling !== newStyling && scheduler.$container && scheduler.getState().mode){\n\t\tscheduler.setCurrentView();\n\t}\n}\nscheduler.event(window, 'DOMContentLoaded', refreshAfterLoad);\nscheduler.event(window, 'load', refreshAfterLoad);\n\nscheduler._border_box_events = function(){\n\treturn checkIfBorderBoxStyling();\n};\n\nscheduler._configure = function(col, data, skin){\n\tfor (var key in data)\n\t\tif (typeof col[key] == \"undefined\")\n\t\t\tcol[key] = data[key][skin];\n};\n\nscheduler.setSkin = function(value){\n\tthis.skin = value;\n\tscheduler._addThemeClass();\n\tif(scheduler.$container){\n\t\tthis._skin_init();\n\t\tthis.render();\n\t}\n\t\n\t//\n};\n\nfunction flatSkinHourScale(date){\n\tvar min = date.getMinutes();\n\tmin = min < 10 ? \"0\"+min : min;\n\tvar html = \"
\"+ date.getHours() +\" \"+\n\t\t\"
\"+ min +\" \";\n\treturn html;\n}\n\nlet monitorIntervalId = null;\nfunction monitorThemeChange(){\n\tconst container = scheduler.$container;\n\t\n\tclearInterval(monitorIntervalId);\n\tif(container){\n\t\tmonitorIntervalId = setInterval(() => {\n\t\t\tconst csstheme = getComputedStyle(container).getPropertyValue('--dhx-scheduler-theme');\n\t\t\tif(csstheme && csstheme !== scheduler.skin){\n\t\t\t\tscheduler.setSkin(csstheme);\n\t\t\t}\n\n\t\t}, 100);\n\t}\n}\nscheduler.attachEvent(\"onDestroy\", function(){\n\tclearInterval(monitorIntervalId);\n});\n\nscheduler._skin_init = function(){\n\tthis._build_skin_info();\n\n\tif (!this.skin){\n\t\tthis.skin = this._theme_info.theme;\n\t}\n\tscheduler._addThemeClass();\n\tif (scheduler.skin === \"flat\"){\n\t\t// scheduler.xy.scale_height = 35;\n\t\tscheduler.templates.hour_scale = flatSkinHourScale;\n\t}else if (scheduler.templates.hour_scale === flatSkinHourScale){\n\t\tscheduler.templates.hour_scale = scheduler.date.date_to_str(scheduler.config.hour_date);\n\t}\n\n\n\n\t//scheduler._lightbox_template=\"
\";\n\tscheduler.attachEvent(\"onTemplatesReady\", function() {\n\n\t\tvar date_to_str = scheduler.date.date_to_str(\"%d\");\n\t\tif(!scheduler.templates._old_month_day){\n\t\t\tscheduler.templates._old_month_day = scheduler.templates.month_day;\n\t\t}\n\t\tvar old_month_day = scheduler.templates._old_month_day;\n\t\tscheduler.templates.month_day = function(date) {\n\t\t\tif (this._mode == \"month\") {\n\t\t\t\tvar label = date_to_str(date);\n\t\t\t\tif (date.getDate() == 1) {\n\t\t\t\t\tlabel = scheduler.locale.date.month_full[date.getMonth()] + \" \" + label;\n\t\t\t\t}\n\t\t\t\tif (+date == +scheduler.date.date_part(this._currentDate())) {\n\t\t\t\t\tlabel = scheduler.locale.labels.dhx_cal_today_button + \" \" + label;\n\t\t\t\t}\n\t\t\t\treturn label;\n\t\t\t} else {\n\t\t\t\treturn old_month_day.call(this, date);\n\t\t\t}\n\t\t};\n\n\t\t// tab classes\n\t\tif(scheduler.config.fix_tab_position){\n\t\t\tconst tabs = scheduler._els[\"dhx_cal_navline\"][0].querySelectorAll('[data-tab]');\n\t\t\ttabs.forEach((tab) => {\n\t\t\t\tconst view = tab.getAttribute(\"data-tab\") || tab.getAttribute(\"name\");\n\n\t\t\t\tswitch (view) {\n\t\t\t\t\tcase \"day\":\n\t\t\t\t\tcase \"day_tab\":\n\t\t\t\t\t\ttab.classList.add(\"dhx_cal_tab_first\");\n\t\t\t\t\t\ttab.classList.add(\"dhx_cal_tab_segmented\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"week\":\n\t\t\t\t\tcase \"week_tab\":\n\t\t\t\t\t\ttab.classList.add(\"dhx_cal_tab_segmented\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"month\":\n\t\t\t\t\tcase \"month_tab\":\n\t\t\t\t\t\ttab.classList.add(\"dhx_cal_tab_last\");\n\t\t\t\t\t\ttab.classList.add(\"dhx_cal_tab_segmented\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\ttab.classList.add(\"dhx_cal_tab_standalone\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treorderTabs(scheduler._els[\"dhx_cal_navline\"][0]);\n\n\t\t}\n\t}, {once: true});\n\n\tfunction reorderTabs(container) {\n\t\t// segmented tabs should go first\n\n\t\tif(scheduler.config.header){\n\t\t\treturn;\n\t\t\t// don't reorder tabs if header is defined via config\n\t\t}\n\t\tconst tabs = Array.from(container.querySelectorAll('.dhx_cal_tab'));\n\t\n\t\t// segmented tabs\n\t\tconst order = ['day', 'week', 'month'];\n\t\n\t\tconst specialTabs = order.map(tabName => \n\t\t\ttabs.find(tab => tab.getAttribute('data-tab') === tabName)\n\t\t).filter(tab => tab !== undefined);\n\t\n\t\tlet firstTab = tabs.length > 0 ? tabs[0] : null;\n\n\t\tspecialTabs.reverse().forEach(tab => {\n\t\t\tcontainer.insertBefore(tab, firstTab);\n\t\t\tfirstTab = tab;\n\t\t});\n\t}\n\n\t// scheduler._skin_init = function(){\n\t// \tthis._build_skin_info();\n\t// \tthis.skin = this._theme_info.theme;\n\t// };\n};\n\n\n\n}","export default function DataProcessorEvents(scheduler, dp){\n\tthis.$scheduler = scheduler;\n\tthis.$dp = dp;\n\tthis._dataProcessorHandlers = [];\n\n\tthis.attach = function () {\n\t\tvar dp = this.$dp;\n\t\tvar scheduler = this.$scheduler;\n\n\t\tthis._dataProcessorHandlers.push(scheduler.attachEvent(\"onEventAdded\", function(id) {\n\t\t\tif (!this._loading && this._validId(id))\n\t\t\tdp.setUpdated(id,true,\"inserted\");\n\t\t}));\n\n\t\tthis._dataProcessorHandlers.push(scheduler.attachEvent(\"onConfirmedBeforeEventDelete\", function(id) {\n\t\t\tif (!this._validId(id)) return;\n\t\t\tvar z=dp.getState(id);\n\n\t\t\tif (z==\"inserted\" || this._new_event) { dp.setUpdated(id,false); return true; }\n\t\t\tif (z==\"deleted\") return false;\n\t\t\tif (z==\"true_deleted\") return true;\n\n\t\t\tdp.setUpdated(id,true,\"deleted\");\n\t\t\treturn false;\n\t\t}));\n\n\t\tthis._dataProcessorHandlers.push(scheduler.attachEvent(\"onEventChanged\", function(id) { \n\t\t\tif (!this._loading && this._validId(id))\n\t\t\tdp.setUpdated(id,true,\"updated\");\n\t\t}));\n\n\t\tthis._dataProcessorHandlers.push(scheduler.attachEvent(\"onClearAll\", function() { \n\t\t\t// clear dataprocessor state when scheduler is reset\n\t\t\tdp._in_progress={};\n\t\t\tdp._invalid={};\n\t\t\tdp.updatedRows = [];\n\t\t\tdp._waitMode = 0;\n\t\t}));\n\n\t\tdp.attachEvent(\"insertCallback\", scheduler._update_callback);\n\t\tdp.attachEvent(\"updateCallback\", scheduler._update_callback);\n\t\tdp.attachEvent(\"deleteCallback\", function(upd, id) {\n\t\t\tif (scheduler.getEvent(id)){\n\t\t\t\tscheduler.setUserData(id, this.action_param, \"true_deleted\");\n\t\t\t\tscheduler.deleteEvent(id);\n\t\t\t} else if (scheduler._add_rec_marker)\n\t\t\t\tscheduler._update_callback(upd, id);\n\t\t});\n\t};\n\n\tthis.detach = function () {\n\t\tfor (var key in this._dataProcessorHandlers) {\n\t\t\tvar handler = this._dataProcessorHandlers[key];\n\t\t\tthis.$scheduler.detachEvent(handler);\n\t\t}\n\t\tthis._dataProcessorHandlers = [];\n\t};\n}\n\nexport function extendScheduler(scheduler, dp){\n\tscheduler._validId=function(id){\n\t\tif(this._is_virtual_event){\n\t\t\treturn !this._is_virtual_event(id);\n\t\t}\n\t\treturn true;\n\t};\n\tscheduler.setUserData=function(id,name,value){\n\t\tif (id){\n\t\t\tvar ev = this.getEvent(id);\n\t\t\tif(ev) ev[name]=value;\n\t\t}else{\n\t\t\tthis._userdata[name]=value;\n\t\t}\n\t};\n\tscheduler.getUserData=function(id,name){\n\t\tif (id){\n\t\t\tvar ev = this.getEvent(id);\n\t\t\tif(ev)\n\t\t\t\treturn ev[name];\n\t\t\telse\n\t\t\t\treturn null;\n\t\t}else{\n\t\t\treturn this._userdata[name];\n\t\t}\n\t};\n\tscheduler._set_event_text_style=function(id,style){\n\t\tif(!scheduler.getEvent(id))\n\t\t\treturn;\n\t\tthis.for_rendered(id,function(r){\n\t\t\tr.style.cssText+=\";\"+style;\n\t\t});\n\t\tvar ev = this.getEvent(id);\n\t\tev[\"_text_style\"]=style;\n\t\tthis.event_updated(ev);\n\t};\n\tscheduler._update_callback = function(upd,id){\n\t\tvar data = scheduler._xmlNodeToJSON(upd.firstChild);\n\t\t//fix for updates of recurring events\n\t\tif (data.rec_type == \"none\") data.rec_pattern = \"none\";\n\t\tdata.text = data.text||data._tagvalue;\n\t\tdata.start_date = scheduler._helpers.parseDate(data.start_date);\n\t\tdata.end_date = scheduler._helpers.parseDate(data.end_date);\n\t\tscheduler.addEvent(data);\n\t\tif (scheduler._add_rec_marker)\n\t\t\tscheduler.setCurrentView();\n\t};\n\tscheduler._dp_change_event_id = function(id, new_id){\n\t\tif(!scheduler.getEvent(id))\n\t\t\treturn;\n\t\tscheduler.changeEventId(id, new_id);\n\t};\n\tscheduler._dp_hook_delete = function(id, new_id){\n\t\tif(!scheduler.getEvent(id))\n\t\t\treturn;\n\n\t\tif(new_id && id != new_id){\n\t\t\tif(this.getUserData(id, dp.action_param) == \"true_deleted\")\n\t\t\t\tthis.setUserData(id, dp.action_param, \"updated\");\n\n\t\t\tthis.changeEventId(id, new_id);\n\t\t}\n\t\treturn this.deleteEvent(new_id, true);\n\t};\n\n\tscheduler.setDp = function() {\n\t\tthis._dp = dp;\n\t};\n\tscheduler.setDp();\n}","import DataProcessorEvents from \"./dataprocessor_hooks\";\nimport { extendScheduler } from \"./dataprocessor_hooks\";\nimport eventable from \"../../utils/eventable\";\nimport global from \"../../global\";\n\n/**\n *\t@desc: constructor, data processor object\n *\t@param: serverProcessorURL - url used for update\n *\t@type: public\n */\nexport function DataProcessor(serverProcessorURL){\n\tthis.serverProcessor = serverProcessorURL;\n\tthis.action_param = \"!nativeeditor_status\";\n\n\tthis.object = null;\n\tthis.updatedRows = []; // ids of updated rows\n\n\tthis.autoUpdate = true;\n\tthis.updateMode = \"cell\";\n\tthis._tMode = \"GET\";\n\tthis._headers = null;\n\tthis._payload = null;\n\tthis.post_delim = \"_\";\n\n\tthis._waitMode = 0;\n\tthis._in_progress = {};\n\tthis._invalid = {};\n\tthis.messages = [];\n\n\tthis.styles = {\n\t\tupdated: \"font-weight:bold;\",\n\t\tinserted: \"font-weight:bold;\",\n\t\tdeleted: \"text-decoration : line-through;\",\n\t\tinvalid: \"background-color:FFE0E0;\",\n\t\tinvalid_cell: \"border-bottom:2px solid red;\",\n\t\terror: \"color:red;\",\n\t\tclear: \"font-weight:normal;text-decoration:none;\"\n\t};\n\tthis.enableUTFencoding(true);\n\teventable(this); // TODO: need to update\n\n\treturn this;\n}\nDataProcessor.prototype = {\n\tsetTransactionMode: function (mode, total) {\n\t\tif (typeof mode == \"object\") {\n\t\t\tthis._tMode = mode.mode || this._tMode;\n\n\t\t\tif (mode.headers !== undefined) {\n\t\t\t\tthis._headers = mode.headers;\n\t\t\t}\n\n\t\t\tif (mode.payload !== undefined) {\n\t\t\t\tthis._payload = mode.payload;\n\t\t\t}\n\t\t\tthis._tSend = !!total;\n\t\t} else {\n\t\t\tthis._tMode = mode;\n\t\t\tthis._tSend = total;\n\t\t}\n\n\t\tif (this._tMode == \"REST\") {\n\t\t\tthis._tSend = false;\n\t\t\tthis._endnm = true;\n\t\t}\n\n\t\tif (this._tMode === \"JSON\" || this._tMode === \"REST-JSON\") {\n\t\t\tthis._tSend = false;\n\t\t\tthis._endnm = true;\n\t\t\tthis._serializeAsJson = true;\n\t\t\tthis._headers = this._headers || {};\n\t\t\tthis._headers[\"Content-Type\"] = \"application/json\";\n\t\t}else{\n\t\t\tif(this._headers && !this._headers[\"Content-Type\"]){\n\t\t\t\tthis._headers[\"Content-Type\"] = \"application/x-www-form-urlencoded\";\n\t\t\t}\n\t\t}\n\n\t\tif (this._tMode === \"CUSTOM\") {\n\t\t\tthis._tSend = false;\n\t\t\tthis._endnm = true;\n\t\t\tthis._router = mode.router;\n\t\t}\n\t},\n\tescape: function (data) {\n\t\tif (this._utf)\n\t\t\treturn encodeURIComponent(data);\n\t\telse\n\t\t\treturn escape(data);\n\t},\n\t/**\n\t *\t@desc: allows to set escaping mode\n\t *\t@param: true - utf based escaping, simple - use current page encoding\n\t *\t@type: public\n\t */\n\tenableUTFencoding: function (mode) {\n\t\tthis._utf = !!mode;\n\t},\n\t/**\n\t *\t@desc: allows to define, which column may trigger update\n\t *\t@param: val - array or list of true/false values\n\t *\t@type: public\n\t */\n\tsetDataColumns: function (val) {\n\t\tthis._columns = (typeof val == \"string\") ? val.split(\",\") : val;\n\t},\n\t/**\n\t *\t@desc: get state of updating\n\t *\t@returns: true - all in sync with server, false - some items not updated yet.\n\t *\t@type: public\n\t */\n\tgetSyncState: function () {\n\t\treturn !this.updatedRows.length;\n\t},\n\t/**\n\t *\t@desc: enable/disable named field for data syncing, will use column ids for grid\n\t *\t@param: mode - true/false\n\t *\t@type: public\n\t */\n\tenableDataNames: function (mode) {\n\t\tthis._endnm = !!mode;\n\t},\n\t/**\n\t *\t@desc: enable/disable mode , when only changed fields and row id send to the server side, instead of all fields in default mode\n\t *\t@param: mode - true/false\n\t *\t@type: public\n\t */\n\tenablePartialDataSend: function (mode) {\n\t\tthis._changed = !!mode;\n\t},\n\t/**\n\t *\t@desc: set if rows should be send to server automatically\n\t *\t@param: mode - \"row\" - based on row selection changed, \"cell\" - based on cell editing finished, \"off\" - manual data sending\n\t *\t@type: public\n\t */\n\tsetUpdateMode: function (mode, dnd) {\n\t\tthis.autoUpdate = (mode == \"cell\");\n\t\tthis.updateMode = mode;\n\t\tthis.dnd = dnd;\n\t},\n\tignore: function (code, master) {\n\t\tthis._silent_mode = true;\n\t\tcode.call(master || window);\n\t\tthis._silent_mode = false;\n\t},\n\t/**\n\t *\t@desc: mark row as updated/normal. check mandatory fields,initiate autoupdate (if turned on)\n\t *\t@param: rowId - id of row to set update-status for\n\t *\t@param: state - true for \"updated\", false for \"not updated\"\n\t *\t@param: mode - update mode name\n\t *\t@type: public\n\t */\n\tsetUpdated: function (rowId, state, mode) {\n\t\tif (this._silent_mode) return;\n\t\tvar ind = this.findRow(rowId);\n\n\t\tmode = mode || \"updated\";\n\t\tvar existing = this.$scheduler.getUserData(rowId, this.action_param);\n\t\tif (existing && mode == \"updated\") mode = existing;\n\t\tif (state) {\n\t\t\tthis.set_invalid(rowId, false); //clear previous error flag\n\t\t\tthis.updatedRows[ind] = rowId;\n\t\t\tthis.$scheduler.setUserData(rowId, this.action_param, mode);\n\t\t\tif (this._in_progress[rowId])\n\t\t\t\tthis._in_progress[rowId] = \"wait\";\n\t\t} else {\n\t\t\tif (!this.is_invalid(rowId)) {\n\t\t\t\tthis.updatedRows.splice(ind, 1);\n\t\t\t\tthis.$scheduler.setUserData(rowId, this.action_param, \"\");\n\t\t\t}\n\t\t}\n\n\t\tthis.markRow(rowId, state, mode);\n\t\tif (state && this.autoUpdate) this.sendData(rowId);\n\t},\n\n\tmarkRow: function (id, state, mode) {\n\t\tvar str = \"\";\n\t\tvar invalid = this.is_invalid(id);\n\t\tif (invalid) {\n\t\t\tstr = this.styles[invalid];\n\t\t\tstate = true;\n\t\t}\n\t\tif (this.callEvent(\"onRowMark\", [id, state, mode, invalid])) {\n\t\t\t//default logic\n\t\t\tstr = this.styles[state ? mode : \"clear\"] + str;\n\n\t\t\tthis.$scheduler[this._methods[0]](id, str);\n\n\t\t\tif (invalid && invalid.details) {\n\t\t\t\tstr += this.styles[invalid + \"_cell\"];\n\t\t\t\tfor (var i = 0; i < invalid.details.length; i++)\n\t\t\t\t\tif (invalid.details[i])\n\t\t\t\t\t\tthis.$scheduler[this._methods[1]](id, i, str);\n\t\t\t}\n\t\t}\n\t},\n\tgetActionByState: function(state) {\n\t\tif (state === \"inserted\") {\n\t\t\treturn \"create\";\n\t\t}\n\t\tif (state === \"updated\") {\n\t\t\treturn \"update\";\n\t\t}\n\t\tif (state === \"deleted\") {\n\t\t\treturn \"delete\";\n\t\t}\n\t\treturn \"update\";\n\t},\n\n\tgetState: function (id) {\n\t\treturn this.$scheduler.getUserData(id, this.action_param);\n\t},\n\tis_invalid: function (id) {\n\t\treturn this._invalid[id];\n\t},\n\tset_invalid: function (id, mode, details) {\n\t\tif (details) mode = {\n\t\t\tvalue: mode, details: details, toString: function () {\n\t\t\t\treturn this.value.toString();\n\t\t\t}\n\t\t};\n\t\tthis._invalid[id] = mode;\n\t},\n\t/**\n\t *\t@desc: check mandatory fields and varify values of cells, initiate update (if specified)\n\t *\t@param: rowId - id of row to set update-status for\n\t *\t@type: public\n\t */\n\tcheckBeforeUpdate: function (rowId) {\n\t\treturn true;\n\t},\n\t/**\n\t *\t@desc: send row(s) values to server\n\t *\t@param: rowId - id of row which data to send. If not specified, then all \"updated\" rows will be send\n\t *\t@type: public\n\t */\n\tsendData: function (rowId) {\n\t\tif (this.$scheduler.editStop) this.$scheduler.editStop();\n\n\t\tif (typeof rowId == \"undefined\" || this._tSend) return this.sendAllData();\n\t\tif (this._in_progress[rowId]) return false;\n\n\t\tthis.messages = [];\n\t\tif (!this.checkBeforeUpdate(rowId) && this.callEvent(\"onValidationError\", [rowId, this.messages])) return false;\n\t\tthis._beforeSendData(this._getRowData(rowId), rowId);\n\t},\n\t_beforeSendData: function (data, rowId) {\n\t\tif (!this.callEvent(\"onBeforeUpdate\", [rowId, this.getState(rowId), data])) return false;\n\t\tthis._sendData(data, rowId);\n\t},\n\tserialize: function (data, id) {\n\t\tif (this._serializeAsJson) {\n\t\t\treturn this._serializeAsJSON(data);\n\t\t}\n\n\t\tif (typeof data == \"string\")\n\t\t\treturn data;\n\t\tif (typeof id != \"undefined\")\n\t\t\treturn this.serialize_one(data, \"\");\n\t\telse {\n\t\t\tvar stack = [];\n\t\t\tvar keys = [];\n\t\t\tfor (var key in data)\n\t\t\t\tif (data.hasOwnProperty(key)) {\n\t\t\t\t\tstack.push(this.serialize_one(data[key], key + this.post_delim));\n\t\t\t\t\tkeys.push(key);\n\t\t\t\t}\n\t\t\tstack.push(\"ids=\" + this.escape(keys.join(\",\")));\n\t\t\tif (this.$scheduler.security_key)\n\t\t\t\tstack.push(\"dhx_security=\" + (this.$scheduler.security_key));\n\t\t\treturn stack.join(\"&\");\n\t\t}\n\t},\n\tserialize_one: function (data, pref) {\n\t\tif (typeof data == \"string\")\n\t\t\treturn data;\n\t\tvar stack = [];\n\t\tvar serialized = \"\";\n\t\tfor (var key in data)\n\t\t\tif (data.hasOwnProperty(key)) {\n\t\t\t\tif ((key == \"id\" || key == this.action_param) && this._tMode == \"REST\") continue;\n\t\t\t\tif (typeof data[key] === \"string\" || typeof data[key] === \"number\") {\n\t\t\t\t\tserialized = data[key];\n\t\t\t\t} else {\n\t\t\t\t\tserialized = JSON.stringify(data[key]);\n\t\t\t\t}\n\t\t\t\tstack.push(this.escape((pref || \"\") + key) + \"=\" + this.escape(serialized));\n\t\t\t}\n\t\treturn stack.join(\"&\");\n\t},\n\t_applyPayload: function (url) {\n\t\tvar ajax = this.$scheduler.ajax;\n\t\tif (this._payload)\n\t\t\tfor (var key in this._payload)\n\t\t\t\turl = url + ajax.urlSeparator(url) + this.escape(key) + \"=\" + this.escape(this._payload[key]);\n\t\treturn url;\n\t},\n\t_sendData: function (dataToSend, rowId) {\n\t\tif (!dataToSend) {\n\t\t\treturn; // nothing to send\n\t\t}\n\t\tif (!this.callEvent(\"onBeforeDataSending\", rowId ? [rowId, this.getState(rowId), dataToSend] : [null, null, dataToSend])) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (rowId) {\n\t\t\tthis._in_progress[rowId] = (new Date()).valueOf();\n\t\t}\n\n\t\tvar self = this;\n\t\tvar ajax = this.$scheduler.ajax;\n\n\t\tif (this._tMode === \"CUSTOM\") {\n\t\t\tvar state = this.getState(rowId);\n\t\t\tvar action = this.getActionByState(state);\n\t\t\tvar _onResolvedCreateUpdate = function (tag) {\n\t\t\t\tvar resultState = state;\n\t\t\t\tif(tag && tag.responseText && tag.setRequestHeader){\n\t\t\t\t\tif(tag.status !== 200){\n\t\t\t\t\t\tresultState = \"error\";\n\t\t\t\t\t}\n\t\t\t\t\ttry{\n\t\t\t\t\t\ttag = JSON.parse(tag.responseText);\n\t\t\t\t\t} catch (e){}\n\t\t\t\t}\n\n\t\t\t\tresultState = resultState || \"updated\";\n\t\t\t\tvar sid = rowId;\n\t\t\t\tvar tid = rowId;\n\n\t\t\t\tif (tag) {\n\t\t\t\t\tresultState = tag.action || resultState;\n\t\t\t\t\tsid = tag.sid || sid;\n\t\t\t\t\ttid = tag.id || tag.tid || tid;\n\t\t\t\t}\n\t\t\t\tself.afterUpdateCallback(sid, tid, resultState, tag);\n\t\t\t};\n\n\t\t\tconst routerMode = \"event\";\n\t\t\tvar actionPromise;\n\t\t\tif (this._router instanceof Function) {\n\t\t\t\tactionPromise = this._router(routerMode, action, dataToSend, rowId);\n\t\t\t} else {\n\t\t\t\tswitch (state) {\n\t\t\t\t\tcase \"inserted\":\n\t\t\t\t\t\tactionPromise = this._router[routerMode].create(dataToSend);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"deleted\":\n\t\t\t\t\t\tactionPromise = this._router[routerMode].delete(rowId);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tactionPromise = this._router[routerMode].update(dataToSend, rowId);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(actionPromise){\n\t\t\t\t// neither promise nor {tid: newId} response object\n\t\t\t\tif(!actionPromise.then &&\n\t\t\t\t\t(actionPromise.id === undefined && actionPromise.tid === undefined && actionPromise.action === undefined)){\n\t\t\t\t\tthrow new Error(\"Incorrect router return value. A Promise or a response object is expected\");\n\t\t\t\t}\n\n\t\t\t\tif(actionPromise.then){\n\t\t\t\t\tactionPromise.then(_onResolvedCreateUpdate).catch(function(error) {\n\t\t\t\t\t\tif(error && error.action){\n\t\t\t\t\t\t\t_onResolvedCreateUpdate(error);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t_onResolvedCreateUpdate({ action: \"error\", value: error});\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}else{\n\t\t\t\t\t// custom method may return a response object in case of sync action\n\t\t\t\t\t_onResolvedCreateUpdate(actionPromise);\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\t_onResolvedCreateUpdate(null);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tvar queryParams = {\n\t\t\tcallback: function(xml) {\n\t\t\t\tvar ids = [];\n\n\t\t\t\tif (rowId) {\n\t\t\t\t\tids.push(rowId);\n\t\t\t\t} else if (dataToSend) {\n\t\t\t\t\tfor (var key in dataToSend) {\n\t\t\t\t\t\tids.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn self.afterUpdate(self, xml, ids);\n\t\t\t},\n\t\t\theaders: self._headers\n\t\t};\n\n\t\tvar urlParams = this.serverProcessor + (this._user ? (ajax.urlSeparator(this.serverProcessor) + [\"dhx_user=\" + this._user, \"dhx_version=\" + this.$scheduler.getUserData(0, \"version\")].join(\"&\")) : \"\");\n\t\tvar url = this._applyPayload(urlParams);\n\t\tvar data;\n\n\t\tswitch (this._tMode) {\n\t\t\tcase \"GET\":\n\t\t\t\tdata = this._cleanupArgumentsBeforeSend(dataToSend);\n\t\t\t\tqueryParams.url = url + ajax.urlSeparator(url) + this.serialize(data, rowId);\n\t\t\t\tqueryParams.method = \"GET\";\n\t\t\t\tbreak;\n\t\t\tcase \"POST\":\n\t\t\t\tdata = this._cleanupArgumentsBeforeSend(dataToSend);\n\t\t\t\tqueryParams.url = url;\n\t\t\t\tqueryParams.method = \"POST\";\n\t\t\t\tqueryParams.data = this.serialize(data, rowId);\n\t\t\t\tbreak;\n\t\t\tcase \"JSON\":\n\t\t\t\tdata = {};\n\t\t\t\tvar preprocessedData = this._cleanupItemBeforeSend(dataToSend);\n\t\t\t\tfor (var key in preprocessedData) {\n\t\t\t\t\tif (key === this.action_param || key === \"id\" || key === \"gr_id\") {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tdata[key] = preprocessedData[key];\n\t\t\t\t}\n\n\t\t\t\tqueryParams.url = url;\n\t\t\t\tqueryParams.method = \"POST\";\n\t\t\t\tqueryParams.data = JSON.stringify({\n\t\t\t\t\tid: rowId,\n\t\t\t\t\taction: dataToSend[this.action_param],\n\t\t\t\t\tdata: data\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase \"REST\":\n\t\t\tcase \"REST-JSON\":\n\t\t\t\turl = urlParams.replace(/(&|\\?)editing=true/, \"\");\n\t\t\t\tdata = \"\";\n\n\t\t\t\tswitch (this.getState(rowId)) {\n\t\t\t\t\tcase \"inserted\":\n\t\t\t\t\t\tqueryParams.method = \"POST\";\n\t\t\t\t\t\tqueryParams.data = this.serialize(dataToSend, rowId);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"deleted\":\n\t\t\t\t\t\tqueryParams.method = \"DELETE\";\n\t\t\t\t\t\turl = url + (url.slice(-1) === \"/\" ? \"\" : \"/\") + rowId;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tqueryParams.method = \"PUT\";\n\t\t\t\t\t\tqueryParams.data = this.serialize(dataToSend, rowId);\n\t\t\t\t\t\turl = url + (url.slice(-1) === \"/\" ? \"\" : \"/\") + rowId;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tqueryParams.url = this._applyPayload(url);\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis._waitMode++;\n\t\treturn ajax.query(queryParams);\n\t},\n\tsendAllData: function () {\n\t\tif (!this.updatedRows.length || this.updateMode === \"off\") { // FIXME: need to leave checking 'this.updateMode === \"off\"'?\n\t\t\treturn;\n\t\t}\n\n\t\tthis.messages = [];\n\t\tvar valid = true;\n\n\t\tthis._forEachUpdatedRow(function(rowId) {\n\t\t\tvalid = valid && this.checkBeforeUpdate(rowId);\n\t\t});\n\n\t\tif (!valid && !this.callEvent(\"onValidationError\", [\"\", this.messages])) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (this._tSend) {\n\t\t\tthis._sendData(this._getAllData());\n\t\t} else {\n\t\t\tthis._forEachUpdatedRow(function(rowId) {\n\t\t\t\tif (!this._in_progress[rowId]) {\n\t\t\t\t\tif (this.is_invalid(rowId)) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis._beforeSendData(this._getRowData(rowId), rowId);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\n\t_getAllData: function (rowId) {\n\t\tvar out = {};\n\t\tvar has_one = false;\n\t\tthis._forEachUpdatedRow(function(id) {\n\t\t\tif (this._in_progress[id] || this.is_invalid(id)){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar row = this._getRowData(id);\n\t\t\tif (!this.callEvent(\"onBeforeUpdate\", [id, this.getState(id), row])) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tout[id] = row;\n\t\t\thas_one = true;\n\t\t\tthis._in_progress[id] = (new Date()).valueOf();\n\t\t});\n\t\treturn has_one ? out : null;\n\t},\n\n\tfindRow: function (pattern) {\n\t\tvar i = 0;\n\t\tfor (i = 0; i < this.updatedRows.length; i++)\n\t\t\tif (pattern == this.updatedRows[i]) break;\n\t\treturn i;\n\t},\n\n\t/**\n\t *\t@desc: define custom actions\n\t *\t@param: name - name of action, same as value of action attribute\n\t *\t@param: handler - custom function, which receives a XMl response content for action\n\t *\t@type: private\n\t */\n\tdefineAction: function (name, handler) {\n\t\tif (!this._uActions) this._uActions = {};\n\t\tthis._uActions[name] = handler;\n\t},\n\n\t/**\n\t *\t @desc: used in combination with setOnBeforeUpdateHandler to create custom client-server transport system\n\t *\t @param: sid - id of item before update\n\t *\t @param: tid - id of item after up0ate\n\t *\t @param: action - action name\n\t *\t @type: public\n\t *\t @topic: 0\n\t */\n\tafterUpdateCallback: function (sid, tid, action, btag) {\n\t\tif(!this.$scheduler){\n\t\t\t// destructor has been called before the callback\n\t\t\treturn;\n\t\t}\n\n\t\tvar marker = sid;\n\t\tvar correct = (action !== \"error\" && action !== \"invalid\");\n\t\tif (!correct) {\n\t\t\tthis.set_invalid(sid, action);\n\t\t}\n\t\tif ((this._uActions) && (this._uActions[action]) && (!this._uActions[action](btag))) {\n\t\t\treturn (delete this._in_progress[marker]);\n\t\t}\n\n\t\tif (this._in_progress[marker] !== \"wait\") {\n\t\t\tthis.setUpdated(sid, false);\n\t\t}\n\n\t\tvar originalSid = sid;\n\n\t\tswitch (action) {\n\t\t\tcase \"inserted\":\n\t\t\tcase \"insert\":\n\t\t\t\tif (tid != sid) {\n\t\t\t\t\tthis.setUpdated(sid, false);\n\t\t\t\t\tthis.$scheduler[this._methods[2]](sid, tid);\n\t\t\t\t\tsid = tid;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"delete\":\n\t\t\tcase \"deleted\":\n\t\t\t\tthis.$scheduler.setUserData(sid, this.action_param, \"true_deleted\");\n\t\t\t\tthis.$scheduler[this._methods[3]](sid, tid);\n\t\t\t\tdelete this._in_progress[marker];\n\t\t\t\treturn this.callEvent(\"onAfterUpdate\", [sid, action, tid, btag]);\n\t\t}\n\n\t\tif (this._in_progress[marker] !== \"wait\") {\n\t\t\tif (correct) {\n\t\t\t\tthis.$scheduler.setUserData(sid, this.action_param, \"\");\n\t\t\t}\n\t\t\tdelete this._in_progress[marker];\n\t\t} else {\n\t\t\tdelete this._in_progress[marker];\n\t\t\tthis.setUpdated(tid, true, this.$scheduler.getUserData(sid, this.action_param));\n\t\t}\n\n\t\tthis.callEvent(\"onAfterUpdate\", [originalSid, action, tid, btag]);\n\t},\n\n\t_errorResponse: function (xml, id){\n\t\tif(this.$scheduler && this.$scheduler.callEvent){\n\t\t\tthis.$scheduler.callEvent(\"onSaveError\", [id, xml.xmlDoc]);\n\t\t}\n\t\treturn this.cleanUpdate(id);\n\t},\n\n\t_setDefaultTransactionMode: function () {\n\t\tif (this.serverProcessor) {\n\t\t\tthis.setTransactionMode(\"POST\", true);\n\t\t\tthis.serverProcessor += (this.serverProcessor.indexOf(\"?\") !== -1 ? \"&\" : \"?\") + \"editing=true\";\n\t\t\tthis._serverProcessor = this.serverProcessor;\n\t\t}\n\t},\n\t\n\t/**\n\t *\t@desc: response from server\n\t *\t@param: xml - XMLLoader object with response XML\n\t *\t@type: private\n\t */\n\tafterUpdate: function (that, xml, id) {\n\t\tvar ajax = this.$scheduler.ajax;\n\n\t\tif (xml.xmlDoc.status !== 200){\n\t\t\tthis._errorResponse(xml, id);\n\t\t\treturn;\n\t\t}\n\n\t\t// try to use json first\n\t\tvar tag;\n\t\ttry {\n\t\t\ttag = JSON.parse(xml.xmlDoc.responseText);\n\t\t} catch (e) {\n\t\t\t// empty response also can be processed by json handler\n\t\t\tif (!xml.xmlDoc.responseText.length) {\n\t\t\t\ttag = {};\n\t\t\t}\n\t\t}\n\n\t\tif (tag) {\n\t\t\tvar action = tag.action || this.getState(id) || \"updated\";\n\t\t\tvar sid = tag.sid || id[0];\n\t\t\tvar tid = tag.tid || id[0];\n\t\t\tthat.afterUpdateCallback(sid, tid, action, tag);\n\t\t\tthat.finalizeUpdate();\n\t\t\treturn;\n\t\t}\n\n\t\t// xml response\n\t\tvar top = ajax.xmltop(\"data\", xml.xmlDoc); // fix incorrect content type in IE\n\t\tif (!top) {\n\t\t\treturn this._errorResponse(xml, id);\n\t\t}\n\t\tvar atag = ajax.xpath(\"//data/action\", top);\n\t\tif (!atag.length) {\n\t\t\treturn this._errorResponse(xml, id);\n\t\t}\n\n\t\tfor (var i = 0; i < atag.length; i++) {\n\t\t\tvar btag = atag[i];\n\t\t\tvar action = btag.getAttribute(\"type\");\n\t\t\tvar sid = btag.getAttribute(\"sid\");\n\t\t\tvar tid = btag.getAttribute(\"tid\");\n\n\t\t\tthat.afterUpdateCallback(sid, tid, action, btag);\n\t\t}\n\t\tthat.finalizeUpdate();\n\t},\n\tcleanUpdate: function (id) {\n\t\tif (id)\n\t\t\tfor (var i = 0; i < id.length; i++)\n\t\t\t\tdelete this._in_progress[id[i]];\n\t},\n\tfinalizeUpdate: function () {\n\t\tif (this._waitMode) this._waitMode--;\n\n\t\tthis.callEvent(\"onAfterUpdateFinish\", []);\n\t\tif (!this.updatedRows.length)\n\t\t\tthis.callEvent(\"onFullSync\", []);\n\t},\n\n\t/**\n\t *\t@desc: initializes data-processor\n\t *\t@param: scheduler - dhtmlxScheduler object to attach this data-processor to\n\t *\t@type: public\n\t */\n\tinit: function (scheduler) {\n\t\tif (this._initialized) {\n\t\t\treturn;\n\t\t}\n\t\tthis.$scheduler = scheduler;\n\t\tif (this.$scheduler._dp_init) {\n\t\t\tthis.$scheduler._dp_init(this);\n\t\t}\n\n\t\tthis._setDefaultTransactionMode();\n\n\t\tthis._methods=this._methods||[\"_set_event_text_style\",\"\",\"_dp_change_event_id\",\"_dp_hook_delete\"];\n\t\textendScheduler(this.$scheduler, this);\n\t\tvar dataProcessorEvents = new DataProcessorEvents(this.$scheduler, this);\n\t\tdataProcessorEvents.attach();\n\t\tthis.attachEvent(\"onDestroy\", function() {\n\t\t\tdelete this._getRowData;\n\n\t\t\tdelete this.$scheduler._dp;\n\t\t\tdelete this.$scheduler._dataprocessor;\n\t\t\tdelete this.$scheduler._set_event_text_style;\n\t\t\tdelete this.$scheduler._dp_change_event_id;\n\t\t\tdelete this.$scheduler._dp_hook_delete;\n\t\t\tdelete this.$scheduler;\n\t\t\tdataProcessorEvents.detach();\n\t\t});\n\t\tthis.$scheduler.callEvent(\"onDataProcessorReady\", [this]);\n\t\tthis._initialized = true;\n\n\t\tscheduler._dataprocessor=this;\n\t},\n\n\tsetOnAfterUpdate: function (ev) {\n\t\tthis.attachEvent(\"onAfterUpdate\", ev);\n\t},\n\tsetOnBeforeUpdateHandler: function (func) {\n\t\tthis.attachEvent(\"onBeforeDataSending\", func);\n\t},\n\n\t/* starts autoupdate mode\n\t\t@param interval time interval for sending update requests\n\t*/\n\tsetAutoUpdate: function (interval, user) {\n\t\tinterval = interval || 2000;\n\n\t\tthis._user = user || (new Date()).valueOf();\n\t\tthis._need_update = false;\n\t\t//this._loader = null;\n\t\tthis._update_busy = false;\n\n\t\tthis.attachEvent(\"onAfterUpdate\", function (sid, action, tid, xml_node) {\n\t\t\tthis.afterAutoUpdate(sid, action, tid, xml_node);\n\t\t});\n\t\tthis.attachEvent(\"onFullSync\", function () {\n\t\t\tthis.fullSync();\n\t\t});\n\n\t\tvar self = this;\n\t\tlet intervalId = global.setInterval(function () {\n\t\t\tself.loadUpdate();\n\t\t}, interval);\n\t\tthis.attachEvent(\"onDestroy\", function(){\n\t\t\tclearInterval(intervalId);\n\t\t});\n\t},\n\n\t/* process updating request answer\n\t\tif status == collision version is deprecated\n\t\tset flag for autoupdating immediately\n\t*/\n\tafterAutoUpdate: function (sid, action, tid, xml_node) {\n\t\tif (action == 'collision') {\n\t\t\tthis._need_update = true;\n\t\t\treturn false;\n\t\t} else {\n\t\t\treturn true;\n\t\t}\n\t},\n\n\t/* callback function for onFillSync event\n\t\tcall update function if it's need\n\t*/\n\tfullSync: function () {\n\t\tif (this._need_update) {\n\t\t\tthis._need_update = false;\n\t\t\tthis.loadUpdate();\n\t\t}\n\t\treturn true;\n\t},\n\n\t/* sends query to the server and call callback function\n\t*/\n\tgetUpdates: function (url, callback) {\n\t\tvar ajax = this.$scheduler.ajax;\n\t\tif (this._update_busy)\n\t\t\treturn false;\n\t\telse\n\t\t\tthis._update_busy = true;\n\n\t\tajax.get(url, callback);\n\t},\n\n\t/* returns xml node value\n\t\t@param node\n\t\t\txml node\n\t*/\n\t_getXmlNodeValue: function(node) {\n\t\tif (node.firstChild) {\n\t\t\treturn node.firstChild.nodeValue;\n\t\t}\n\t\treturn \"\";\n\t},\n\n\t/* loads updates and processes them\n\t*/\n\tloadUpdate: function () {\n\t\tvar self = this;\n\t\tvar ajax = this.$scheduler.ajax;\n\t\tvar version = this.$scheduler.getUserData(0, \"version\");\n\t\tvar url = this.serverProcessor + ajax.urlSeparator(this.serverProcessor) + [\"dhx_user=\" + this._user, \"dhx_version=\" + version].join(\"&\");\n\t\turl = url.replace(\"editing=true&\", \"\");\n\t\tthis.getUpdates(url, function (xml) {\n\t\t\tvar vers = ajax.xpath(\"//userdata\", xml);\n\t\t\tself.$scheduler.setUserData(0, \"version\", self._getXmlNodeValue(vers[0]));\n\n\t\t\tvar updates = ajax.xpath(\"//update\", xml);\n\t\t\tif (updates.length) {\n\t\t\t\tself._silent_mode = true;\n\n\t\t\t\tfor (var i = 0; i < updates.length; i++) {\n\t\t\t\t\tvar status = updates[i].getAttribute(\"status\");\n\t\t\t\t\tvar id = updates[i].getAttribute(\"id\");\n\t\t\t\t\tvar parent = updates[i].getAttribute(\"parent\");\n\t\t\t\t\tswitch (status) {\n\t\t\t\t\t\tcase \"inserted\":\n\t\t\t\t\t\t\tthis.callEvent(\"insertCallback\", [updates[i], id, parent]);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"updated\":\n\t\t\t\t\t\t\tthis.callEvent(\"updateCallback\", [updates[i], id, parent]);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"deleted\":\n\t\t\t\t\t\t\tthis.callEvent(\"deleteCallback\", [updates[i], id, parent]);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tself._silent_mode = false;\n\t\t\t}\n\t\t\tself._update_busy = false;\n\t\t\tself = null;\n\t\t});\n\t},\n\n\tdestructor: function() {\n\t\tthis.callEvent(\"onDestroy\", []);\n\t\tthis.detachAllEvents();\n\n\t\tthis.updatedRows = [];\n\t\tthis._in_progress = {};\n\t\tthis._invalid = {};\n\t\tthis._headers = null;\n\t\tthis._payload = null;\n\t\tdelete this._initialized;\n\t},\n\n\turl: function(url) {\n\t\tthis.serverProcessor = this._serverProcessor = url;\n\t},\n\n\t_serializeAsJSON: function(data) {\n\t\tif (typeof data === \"string\") {\n\t\t\treturn data;\n\t\t}\n\n\t\tvar copy = this.$scheduler.utils.copy(data);\n\t\tif (this._tMode === \"REST-JSON\") {\n\t\t\tdelete copy.id;\n\t\t\tdelete copy[this.action_param];\n\t\t}\n\n\t\treturn JSON.stringify(copy);\n\t},\n\n\t// GET/POST/JSON modes of the dataProcessor didn't send the whole data items in 'delete' requests\n\t// clear extra info from the data in order not to change the request format\n\t_cleanupArgumentsBeforeSend: function(dataToSend) {\n\t\tvar processedData;\n\t\tif(dataToSend[this.action_param] === undefined){// hash of updated items, and not an individual item\n\t\t\tprocessedData = {};\n\t\t\tfor(var i in dataToSend) {\n\t\t\t\tprocessedData[i] = this._cleanupArgumentsBeforeSend(dataToSend[i]);\n\t\t\t}\n\t\t} else {\n\t\t\tprocessedData = this._cleanupItemBeforeSend(dataToSend);\n\t\t}\n\t\treturn processedData;\n\t},\n\t_cleanupItemBeforeSend: function(updatedItem) {\n\t\tvar output = null;\n\t\tif(updatedItem){\n\t\t\tif(updatedItem[this.action_param] === \"deleted\"){\n\t\t\t\toutput = {};\n\t\t\t\toutput.id = updatedItem.id;\n\t\t\t\toutput[this.action_param] = updatedItem[this.action_param];\n\t\t\t}else{\n\t\t\t\toutput = updatedItem;\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t},\n\n\t_forEachUpdatedRow: function(code) {\n\t\tvar updatedRows = this.updatedRows.slice();\n\t\tfor (var i = 0; i < updatedRows.length; i++) {\n\t\t\tvar rowId = updatedRows[i];\n\t\t\tif (this.$scheduler.getUserData(rowId, this.action_param)) {\n\t\t\t\tcode.call(this, rowId);\n\t\t\t}\n\t\t}\n\t},\n\n\t_prepareDataItem: function(item) {\n\t\tvar processedItem = {};\n\t\tvar scheduler = this.$scheduler;\n\t\tvar copy = scheduler.utils.copy(item);\n\t\tfor (var i in copy) {\n\t\t\tif (i.indexOf(\"_\") === 0) {\n\t\t\t\tcontinue;\n\t\t\t} else if (copy[i]) {\n\t\t\t\tif(copy[i].getUTCFullYear){\n\t\t\t\t\tprocessedItem[i] = scheduler._helpers.formatDate(copy[i]);\n\t\t\t\t} else if(typeof copy[i] == \"object\") {\n\t\t\t\t\tprocessedItem[i] = this._prepareDataItem(copy[i]);\n\t\t\t\t} else if(copy[i] === null) {\n\t\t\t\t\tprocessedItem[i] = \"\";\n\t\t\t\t} else {\n\t\t\t\t\tprocessedItem[i] = copy[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tprocessedItem[this.action_param] = scheduler.getUserData(item.id, this.action_param);\n\t\treturn processedItem;\n\t},\n\t_getRowData: function(id) {\n\t\tvar dataItem = this.$scheduler.getEvent(id);\n\t\tif (!dataItem) {\n\t\t\tdataItem = { id: id };\n\t\t}\n\t\treturn this._prepareDataItem(dataItem);\n\t}\n};\n\n\nexport default function extend(scheduler) {\n\nscheduler.createDataProcessor = function(config) {\n\tvar router;\n\tvar tMode;\n\tif (config instanceof Function) {\n\t\trouter = config;\n\t} else if (config.hasOwnProperty(\"router\")) {\n\t\trouter = config.router;\n\t} else if(config.hasOwnProperty(\"event\")){\n\t\trouter = config;\n\t}\n\n\tif (router) {\n\t\ttMode = \"CUSTOM\";\n\t} else {\n\t\ttMode = config.mode || \"REST-JSON\";\n\t}\n\n\tvar dp = new DataProcessor(config.url);\n\tdp.init(scheduler);\n\tdp.setTransactionMode({\n\t\tmode: tMode,\n\t\trouter: router\n\t}, config.batchUpdate); // FIXME: config.batchUpdate where it is explained?\n\treturn dp;\n};\n\nscheduler.DataProcessor = DataProcessor;\n\n}\n\n//var dataProcessor = global.dataProcessor = DataProcessor; // for old","import utils from \"./utils/utils\";\nimport domHelpers from \"./utils/dom_helpers\";\n\n\nexport default function(scheduler) {\n\n\tvar boxAttribute = \"data-dhxbox\";\n\n\tvar _dhx_msg_cfg = null;\n\n\tfunction callback(config, result) {\n\t\tvar usercall = config.callback;\n\t\tmodalBox.hide(config.box);\n\n\t\t_dhx_msg_cfg = config.box = null;\n\tif (usercall)\n\t\t\tusercall(result);\n\t}\n\n\tfunction modal_key(event) {\n\t\tif (_dhx_msg_cfg) {\n\n\t\t\tvar code = event.which || event.keyCode;\n\t\t\tvar preventDefault = false;\n\n\t\t\tif (messageBox.keyboard) {\n\t\t\t\tif (code == 13 || code == 32) {\n\t\t\t\t\t// default behavior is to confirm/submit popup on space/enter\n\t\t\t\t\t// if browser focus is set on button element - do button click instead of default behavior\n\t\t\t\t\tvar target = event.target || event.srcElement;\n\t\t\t\t\tif (domHelpers.getClassName(target).indexOf(\"scheduler_popup_button\") > -1 && target.click) {\n\t\t\t\t\t\ttarget.click();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcallback(_dhx_msg_cfg, true);\n\t\t\t\t\t\tpreventDefault = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (code == 27) {\n\t\t\t\t\tcallback(_dhx_msg_cfg, false);\n\t\t\t\t\tpreventDefault = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (preventDefault) {\n\t\t\t\tif (event.preventDefault){\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t\treturn !(event.cancelBubble = true);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t}\n\n\tscheduler.event(document, \"keydown\", modal_key, true);\n\n\tfunction modality(mode) {\n\t\tif (!modality.cover) {\n\t\t\tmodality.cover = document.createElement(\"div\");\n\t\t\t//necessary for IE only\n\t\t\tscheduler.event(modality.cover, \"keydown\", modal_key);\n\t\t\tmodality.cover.className = \"dhx_modal_cover\";\n\t\t\tdocument.body.appendChild(modality.cover);\n\t\t}\n\n\t\tmodality.cover.style.display = mode ? \"inline-block\" : \"none\";\n\t}\n\n\tfunction button(text, classValue, result) {\n\t\tvar buttonAriaAttrs = scheduler._waiAria.messageButtonAttrString(text);\n\t\tvar name = (classValue || \"\").toLowerCase().replace(/ /g, \"_\");\n\t\tvar buttonCss = `scheduler_${name}_button dhtmlx_${name}_button`; \n\t\treturn ``;\n\t}\n\n\tfunction info(text) {\n\t\tif (!messageBox.area) {\n\t\t\tmessageBox.area = document.createElement(\"div\");\n\t\t\tmessageBox.area.className = \"scheduler_message_area dhtmlx_message_area\";\n\t\t\tmessageBox.area.style[messageBox.position] = \"5px\";\n\t\t\tdocument.body.appendChild(messageBox.area);\n\t\t}\n\n\t\tmessageBox.hide(text.id);\n\t\tvar message = document.createElement(\"div\");\n\t\tmessage.innerHTML = \"
\" + text.text + \"
\";\n\t\tmessage.className = \"scheduler-info dhtmlx-info scheduler-\" + text.type + \" dhtmlx-\" + text.type;\n\t\tscheduler.event(message, \"click\",function () {\n\t\t\tmessageBox.hide(text.id);\n\t\t\ttext = null;\n\t\t});\n\n\t\tscheduler._waiAria.messageInfoAttr(message);\n\n\t\tif (messageBox.position == \"bottom\" && messageBox.area.firstChild)\n\t\t\tmessageBox.area.insertBefore(message, messageBox.area.firstChild);\n\t\telse\n\t\t\tmessageBox.area.appendChild(message);\n\n\t\tif (text.expire > 0)\n\t\t\tmessageBox.timers[text.id] = window.setTimeout(function () {\n\t\t\t\t// GS-1213: We need that when Scheduler is destroyed\n\t\t\t\tif (messageBox) messageBox.hide(text.id);\n\t\t\t}, text.expire);\n\n\t\tmessageBox.pull[text.id] = message;\n\t\tmessage = null;\n\n\t\treturn text.id;\n\t}\n\n\tfunction getFirstDefined() {\n\t\tvar values = [].slice.apply(arguments, [0]);\n\n\t\tfor (var i = 0; i < values.length; i++) {\n\t\t\tif (values[i]) {\n\t\t\t\treturn values[i];\n\t\t\t}\n\t\t}\n\n\t}\n\n\tfunction _boxStructure(config, ok, cancel) {\n\t\tvar box = document.createElement(\"div\");\n\n\t\tvar contentId = utils.uid();\n\t\tscheduler._waiAria.messageModalAttr(box, contentId);\n\n\n\t\tbox.className = \" scheduler_modal_box dhtmlx_modal_box scheduler-\" + config.type + \" dhtmlx-\" + config.type;\n\t\tbox.setAttribute(boxAttribute, 1);\n\n\t\tvar inner = '';\n\n\t\tif (config.width)\n\t\t\tbox.style.width = config.width;\n\t\tif (config.height)\n\t\t\tbox.style.height = config.height;\n\t\tif (config.title)\n\t\t\tinner += '';\n\t\tinner += '';\n\t\tbox.innerHTML = inner;\n\n\t\tif (config.content) {\n\t\t\tvar node = config.content;\n\t\t\tif (typeof node == \"string\")\n\t\t\t\tnode = document.getElementById(node);\n\t\t\tif (node.style.display == 'none')\n\t\t\t\tnode.style.display = \"\";\n\t\t\tbox.childNodes[config.title ? 1 : 0].appendChild(node);\n\t\t}\n\n\t\tscheduler.event(box, \"click\", function (event) {\n\t\t\tvar source = event.target || event.srcElement;\n\t\t\tif (!source.className) source = source.parentNode;\n\t\t\tif (domHelpers.closest(source, \".scheduler_popup_button\")) {\n\t\t\t\tvar result = source.getAttribute(\"data-result\");\n\t\t\t\tresult = (result == \"true\") || (result == \"false\" ? false : result);\n\t\t\t\tcallback(config, result);\n\t\t\t}\n\t\t});\n\t\tconfig.box = box;\n\t\tif (ok || cancel)\n\t\t\t_dhx_msg_cfg = config;\n\n\t\treturn box;\n\t}\n\n\tfunction _createBox(config, ok, cancel) {\n\t\tvar box = config.tagName ? config : _boxStructure(config, ok, cancel);\n\n\t\tif (!config.hidden)\n\t\t\tmodality(true);\n\t\tdocument.body.appendChild(box);\n\t\tvar x = Math.abs(Math.floor(((window.innerWidth || document.documentElement.offsetWidth) - box.offsetWidth) / 2));\n\t\tvar y = Math.abs(Math.floor(((window.innerHeight || document.documentElement.offsetHeight) - box.offsetHeight) / 2));\n\t\tif (config.position == \"top\")\n\t\t\tbox.style.top = \"-3px\";\n\t\telse\n\t\t\tbox.style.top = y + 'px';\n\t\tbox.style.left = x + 'px';\n\t\t//necessary for IE only\n\t\tscheduler.event(box, \"keydown\", modal_key);\n\n\t\tmodalBox.focus(box);\n\n\t\tif (config.hidden)\n\t\t\tmodalBox.hide(box);\n\n\t\tscheduler.callEvent(\"onMessagePopup\", [box]);\n\t\treturn box;\n\t}\n\n\tfunction alertPopup(config) {\n\t\treturn _createBox(config, true, false);\n\t}\n\n\tfunction confirmPopup(config) {\n\t\treturn _createBox(config, true, true);\n\t}\n\n\tfunction boxPopup(config) {\n\t\treturn _createBox(config);\n\t}\n\n\tfunction box_params(text, type, callback) {\n\t\tif (typeof text != \"object\") {\n\t\t\tif (typeof type == \"function\") {\n\t\t\t\tcallback = type;\n\t\t\t\ttype = \"\";\n\t\t\t}\n\t\t\ttext = {text: text, type: type, callback: callback};\n\t\t}\n\t\treturn text;\n\t}\n\n\tfunction params(text, type, expire, id) {\n\t\tif (typeof text != \"object\")\n\t\t\ttext = {text: text, type: type, expire: expire, id: id};\n\t\ttext.id = text.id || utils.uid();\n\t\ttext.expire = text.expire || messageBox.expire;\n\t\treturn text;\n\t}\n\n\tvar alertBox = function () {\n\t\tvar text = box_params.apply(this, arguments);\n\t\ttext.type = text.type || \"confirm\";\n\t\treturn alertPopup(text);\n\t};\n\tvar confirmBox = function () {\n\t\tvar text = box_params.apply(this, arguments);\n\t\ttext.type = text.type || \"alert\";\n\t\treturn confirmPopup(text);\n\t};\n\tvar modalBox = function () {\n\t\tvar text = box_params.apply(this, arguments);\n\t\ttext.type = text.type || \"alert\";\n\t\treturn boxPopup(text);\n\t};\n\tmodalBox.hide = function (node) {\n\t\twhile (node && node.getAttribute && !node.getAttribute(boxAttribute))\n\t\t\tnode = node.parentNode;\n\t\tif (node) {\n\t\t\tnode.parentNode.removeChild(node);\n\t\t\tmodality(false);\n\n\t\t\tscheduler.callEvent(\"onAfterMessagePopup\", [node]);\n\t\t}\n\t};\n\n\tmodalBox.focus = function (node) {\n\t\tsetTimeout(function () {\n\t\t\tvar focusable = domHelpers.getFocusableNodes(node);\n\t\t\tif (focusable.length) {\n\t\t\t\tif (focusable[0].focus) focusable[0].focus();\n\t\t\t}\n\t\t}, 1);\n\t};\n\n\tvar messageBox = function (text, type, expire, id) {\n\t\ttext = params.apply(this, arguments);\n\t\ttext.type = text.type || \"info\";\n\n\t\tvar subtype = text.type.split(\"-\")[0];\n\t\tswitch (subtype) {\n\t\t\tcase \"alert\":\n\t\t\t\treturn alertPopup(text);\n\t\t\tcase \"confirm\":\n\t\t\t\treturn confirmPopup(text);\n\t\t\tcase \"modalbox\":\n\t\t\t\treturn boxPopup(text);\n\t\t\tdefault:\n\t\t\t\treturn info(text);\n\t\t}\n\t};\n\n\tmessageBox.seed = (new Date()).valueOf();\n\tmessageBox.uid = utils.uid;\n\tmessageBox.expire = 4000;\n\tmessageBox.keyboard = true;\n\tmessageBox.position = \"top\";\n\tmessageBox.pull = {};\n\tmessageBox.timers = {};\n\n\tmessageBox.hideAll = function () {\n\t\tfor (var key in messageBox.pull)\n\t\t\tmessageBox.hide(key);\n\t};\n\tmessageBox.hide = function (id) {\n\t\tvar obj = messageBox.pull[id];\n\t\tif (obj && obj.parentNode) {\n\t\t\twindow.setTimeout(function () {\n\t\t\t\tobj.parentNode.removeChild(obj);\n\t\t\t\tobj = null;\n\t\t\t}, 2000);\n\t\t\tobj.className += \" hidden\";\n\n\t\t\tif (messageBox.timers[id])\n\t\t\t\twindow.clearTimeout(messageBox.timers[id]);\n\t\t\tdelete messageBox.pull[id];\n\t\t}\n\t};\n\n\tvar popups = [];\n\tscheduler.attachEvent(\"onMessagePopup\", function(box){\n\t\tpopups.push(box);\n\t});\n\tscheduler.attachEvent(\"onAfterMessagePopup\", function(box){\n\t\tfor(var i = 0; i < popups.length; i++){\n\t\t\tif(popups[i] === box){\n\t\t\t\tpopups.splice(i, 1);\n\t\t\t\ti--;\n\t\t\t}\n\t\t}\n\t});\n\n\tscheduler.attachEvent(\"onDestroy\", function(){\n\t\tif(modality.cover && modality.cover.parentNode){\n\t\t\tmodality.cover.parentNode.removeChild(modality.cover);\n\t\t}\n\n\t\tfor(var i = 0; i < popups.length; i++){\n\t\t\tif(popups[i].parentNode){\n\t\t\t\tpopups[i].parentNode.removeChild(popups[i]);\n\t\t\t}\n\t\t}\n\t\tpopups = null;\n\n\t\tif(messageBox.area && messageBox.area.parentNode){\n\t\t\tmessageBox.area.parentNode.removeChild(messageBox.area);\n\t\t}\n\t\tmessageBox = null;\n\t});\n\n\treturn {\n\t\talert: alertBox,\n\t\tconfirm: confirmBox,\n\t\tmessage: messageBox,\n\t\tmodalbox: modalBox\n\t};\n}","export default {\n\tdate: {\n\t\tmonth_full: [\"كانون الثاني\", \"شباط\", \"آذار\", \"نيسان\", \"أيار\", \"حزيران\", \"تموز\", \"آب\", \"أيلول\", \"تشرين الأول\", \"تشرين الثاني\", \"كانون الأول\"],\n\t\tmonth_short: [\"يناير\", \"فبراير\", \"مارس\", \"أبريل\", \"مايو\", \"يونيو\", \"يوليو\", \"أغسطس\", \"سبتمبر\", \"أكتوبر\", \"نوفمبر\", \"ديسمبر\"],\n\t\tday_full: [\"الأحد\", \"الأثنين\", \"ألثلاثاء\", \"الأربعاء\", \"ألحميس\", \"ألجمعة\", \"السبت\"],\n\t\tday_short: [\"احد\", \"اثنين\", \"ثلاثاء\", \"اربعاء\", \"خميس\", \"جمعة\", \"سبت\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"اليوم\",\n\t\tday_tab: \"يوم\",\n\t\tweek_tab: \"أسبوع\",\n\t\tmonth_tab: \"شهر\",\n\t\tnew_event: \"حدث جديد\",\n\t\ticon_save: \"اخزن\",\n\t\ticon_cancel: \"الغاء\",\n\t\ticon_details: \"تفاصيل\",\n\t\ticon_edit: \"تحرير\",\n\t\ticon_delete: \"حذف\",\n\t\tconfirm_closing: \"التغييرات سوف تضيع, هل انت متأكد؟\", //Your changes will be lost, are your sure ?\n\t\tconfirm_deleting: \"الحدث سيتم حذفها نهائيا ، هل أنت متأكد؟\",\n\t\tsection_description: \"الوصف\",\n\t\tsection_time: \"الفترة الزمنية\",\n\t\tfull_day: \"طوال اليوم\",\n\n\t\tconfirm_recurring: \"هل تريد تحرير مجموعة كاملة من الأحداث المتكررة؟\",\n\t\tsection_recurring: \"تكرار الحدث\",\n\t\tbutton_recurring: \"تعطيل\",\n\t\tbutton_recurring_open: \"تمكين\",\n\t\tbutton_edit_series: \"تحرير سلسلة\",\n\t\tbutton_edit_occurrence: \"تعديل نسخة\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"جدول\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\"\n\t}\n};\n\n\n","/*\n Translation by Sofya Morozova\n */\nexport default {\n\tdate: {\n\t\tmonth_full: [\"Студзень\", \"Люты\", \"Сакавік\", \"Красавік\", \"Maй\", \"Чэрвень\", \"Ліпень\", \"Жнівень\", \"Верасень\", \"Кастрычнік\", \"Лістапад\", \"Снежань\"],\n\t\tmonth_short: [\"Студз\", \"Лют\", \"Сак\", \"Крас\", \"Maй\", \"Чэр\", \"Ліп\", \"Жнів\", \"Вер\", \"Каст\", \"Ліст\", \"Снеж\"],\n\t\tday_full: [ \"Нядзеля\", \"Панядзелак\", \"Аўторак\", \"Серада\", \"Чацвер\", \"Пятніца\", \"Субота\"],\n\t\tday_short: [\"Нд\", \"Пн\", \"Аўт\", \"Ср\", \"Чцв\", \"Пт\", \"Сб\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"Сёння\",\n\t\tday_tab: \"Дзень\",\n\t\tweek_tab: \"Тыдзень\",\n\t\tmonth_tab: \"Месяц\",\n\t\tnew_event: \"Новая падзея\",\n\t\ticon_save: \"Захаваць\",\n\t\ticon_cancel: \"Адмяніць\",\n\t\ticon_details: \"Дэталі\",\n\t\ticon_edit: \"Змяніць\",\n\t\ticon_delete: \"Выдаліць\",\n\t\tconfirm_closing: \"\", //Унесеныя змены будуць страчаны, працягнуць?\n\t\tconfirm_deleting: \"Падзея будзе выдалена незваротна, працягнуць?\",\n\t\tsection_description: \"Апісанне\",\n\t\tsection_time: \"Перыяд часу\",\n\t\tfull_day: \"Увесь дзень\",\n\n\t\tconfirm_recurring: \"Вы хочаце змяніць усю серыю паўтаральных падзей?\",\n\t\tsection_recurring: \"Паўтарэнне\",\n\t\tbutton_recurring: \"Адключана\",\n\t\tbutton_recurring_open: \"Уключана\",\n\t\tbutton_edit_series: \"Рэдагаваць серыю\",\n\t\tbutton_edit_occurrence: \"Рэдагаваць асобнік\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab: \"Спіс\",\n\t\tdate: \"Дата\",\n\t\tdescription: \"Апісанне\",\n\n\t\t/*year view extension*/\n\t\tyear_tab: \"Год\",\n\n\t\t/*week agenda view extension*/\n\t\tweek_agenda_tab: \"Спіс\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"Спic\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\",\n\n\t\t/* recurring event components */\n\t\trepeat_radio_day: \"Дзень\",\n\t\trepeat_radio_week: \"Тыдзень\",\n\t\trepeat_radio_month: \"Месяц\",\n\t\trepeat_radio_year: \"Год\",\n\t\trepeat_radio_day_type: \"Кожны\",\n\t\trepeat_text_day_count: \"дзень\",\n\t\trepeat_radio_day_type2: \"Кожны працоўны дзень\",\n\t\trepeat_week: \" Паўтараць кожны\",\n\t\trepeat_text_week_count: \"тыдзень\",\n\t\trepeat_radio_month_type: \"Паўтараць\",\n\t\trepeat_radio_month_start: \"\",\n\t\trepeat_text_month_day: \" чысла кожнага\",\n\t\trepeat_text_month_count: \"месяцу\",\n\t\trepeat_text_month_count2_before: \"кожны \",\n\t\trepeat_text_month_count2_after: \"месяц\",\n\t\trepeat_year_label: \"\",\n\t\tselect_year_day2: \"\",\n\t\trepeat_text_year_day: \"дзень\",\n\t\tselect_year_month: \"\",\n\t\trepeat_radio_end: \"Без даты заканчэння\",\n\t\trepeat_text_occurences_count: \"паўтораў\",\n\t\trepeat_radio_end2: \"\",\n\t\trepeat_radio_end3: \"Да \",\n\t\tmonth_for_recurring: [\"Студзеня\", \"Лютага\", \"Сакавіка\", \"Красавіка\", \"Мая\", \"Чэрвеня\", \"Ліпeня\", \"Жніўня\", \"Верасня\", \"Кастрычніка\", \"Лістапада\", \"Снежня\"],\n\t\tday_for_recurring: [\"Нядзелю\", \"Панядзелак\", \"Аўторак\", \"Сераду\", \"Чацвер\", \"Пятніцу\", \"Суботу\"]\n\t}\n};\n","/*\n @Traducido por Vicente Adria Bohigues - vicenteadria@hotmail.com\n */\nexport default {\n\tdate: {\n\t\tmonth_full: [\"Gener\", \"Febrer\", \"Març\", \"Abril\", \"Maig\", \"Juny\", \"Juliol\", \"Agost\", \"Setembre\", \"Octubre\", \"Novembre\", \"Desembre\"],\n\t\tmonth_short: [\"Gen\", \"Feb\", \"Mar\", \"Abr\", \"Mai\", \"Jun\", \"Jul\", \"Ago\", \"Set\", \"Oct\", \"Nov\", \"Des\"],\n\t\tday_full: [\"Diumenge\", \"Dilluns\", \"Dimarts\", \"Dimecres\", \"Dijous\", \"Divendres\", \"Dissabte\"],\n\t\tday_short: [\"Dg\", \"Dl\", \"Dm\", \"Dc\", \"Dj\", \"Dv\", \"Ds\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"Hui\",\n\t\tday_tab: \"Dia\",\n\t\tweek_tab: \"Setmana\",\n\t\tmonth_tab: \"Mes\",\n\t\tnew_event: \"Nou esdeveniment\",\n\t\ticon_save: \"Guardar\",\n\t\ticon_cancel: \"Cancel·lar\",\n\t\ticon_details: \"Detalls\",\n\t\ticon_edit: \"Editar\",\n\t\ticon_delete: \"Esborrar\",\n\t\tconfirm_closing: \"\", //\"Els seus canvis es perdràn, continuar ?\"\n\t\tconfirm_deleting: \"L'esdeveniment s'esborrarà definitivament, continuar ?\",\n\t\tsection_description: \"Descripció\",\n\t\tsection_time: \"Periode de temps\",\n\t\tfull_day: \"Tot el dia\",\n\n\t\tconfirm_recurring: \"¿Desitja modificar el conjunt d'esdeveniments repetits?\",\n\t\tsection_recurring: \"Repeteixca l'esdeveniment\",\n\t\tbutton_recurring: \"Impedit\",\n\t\tbutton_recurring_open: \"Permés\",\n\t\tbutton_edit_series: \"Edit sèrie\",\n\t\tbutton_edit_occurrence: \"Edita Instància\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab: \"Agenda\",\n\t\tdate: \"Data\",\n\t\tdescription: \"Descripció\",\n\n\t\t/*year view extension*/\n\t\tyear_tab: \"Any\",\n\n\t\t/*week agenda view extension*/\n\t\tweek_agenda_tab: \"Agenda\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"Taula\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\"\n\t}\n};","/*\nTranslation by FreezeSoul\n*/\n//scheduler.config.day_date=\"%M %d日 %D\";\n//scheduler.config.default_date=\"%Y年 %M %d日\";\n//scheduler.config.month_date=\"%Y年 %M\";\n\nexport default {\n\tdate: {\n\t\tmonth_full: [\"一月\", \"二月\", \"三月\", \"四月\", \"五月\", \"六月\", \"七月\", \"八月\", \"九月\", \"十月\", \"十一月\", \"十二月\"],\n\t\tmonth_short: [\"1月\", \"2月\", \"3月\", \"4月\", \"5月\", \"6月\", \"7月\", \"8月\", \"9月\", \"10月\", \"11月\", \"12月\"],\n\t\tday_full: [\"星期日\", \"星期一\", \"星期二\", \"星期三\", \"星期四\", \"星期五\", \"星期六\"],\n\t\tday_short: [\"日\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"今天\",\n\t\tday_tab: \"日\",\n\t\tweek_tab: \"周\",\n\t\tmonth_tab: \"月\",\n\t\tnew_event: \"新建日程\",\n\t\ticon_save: \"保存\",\n\t\ticon_cancel: \"关闭\",\n\t\ticon_details: \"详细\",\n\t\ticon_edit: \"编辑\",\n\t\ticon_delete: \"删除\",\n\t\tconfirm_closing: \"请确认是否撤销修改!\", //Your changes will be lost, are your sure?\n\t\tconfirm_deleting: \"是否删除日程?\",\n\t\tsection_description: \"描述\",\n\t\tsection_time: \"时间范围\",\n\t\tfull_day: \"整天\",\n\n\t\tconfirm_recurring:\"请确认是否将日程设为重复模式?\",\n\t\tsection_recurring:\"重复周期\",\n\t\tbutton_recurring:\"禁用\",\n\t\tbutton_recurring_open:\"启用\",\n\t\tbutton_edit_series: \"编辑系列\",\n\t\tbutton_edit_occurrence: \"编辑实例\",\n\t\t\n\t\t/*agenda view extension*/\n\t\tagenda_tab:\"议程\",\n\t\tdate:\"日期\",\n\t\tdescription:\"说明\",\n\t\t\n\t\t/*year view extension*/\n\t\tyear_tab:\"今年\",\n\n\t\t/*week agenda view extension*/\n\t\tweek_agenda_tab: \"议程\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab:\"电网\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\",\n\n\t\t/* recurring event components */\n\t\trepeat_radio_day: \"按天\",\n\t\trepeat_radio_week: \"按周\",\n\t\trepeat_radio_month: \"按月\",\n\t\trepeat_radio_year: \"按年\",\n\t\trepeat_radio_day_type: \"每\",\n\t\trepeat_text_day_count: \"天\",\n\t\trepeat_radio_day_type2: \"每个工作日\",\n\t\trepeat_week: \" 重复 每\",\n\t\trepeat_text_week_count: \"星期的:\",\n\t\trepeat_radio_month_type: \"重复\",\n\t\trepeat_radio_month_start: \"在\",\n\t\trepeat_text_month_day: \"日 每\",\n\t\trepeat_text_month_count: \"月\",\n\t\trepeat_text_month_count2_before: \"每\",\n\t\trepeat_text_month_count2_after: \"月\",\n\t\trepeat_year_label: \"在\",\n\t\tselect_year_day2: \"的\",\n\t\trepeat_text_year_day: \"日\",\n\t\tselect_year_month: \"月\",\n\t\trepeat_radio_end: \"无结束日期\",\n\t\trepeat_text_occurences_count: \"次结束\",\n\t\trepeat_radio_end2: \"重复\",\n\t\trepeat_radio_end3: \"结束于\",\n\t\tmonth_for_recurring: [\"一月\", \"二月\", \"三月\", \"四月\", \"五月\", \"六月\", \"七月\", \"八月\", \"九月\", \"十月\", \"十一月\", \"十二月\"],\n\t\tday_for_recurring: [\"星期日\", \"星期一\", \"星期二\", \"星期三\", \"星期四\", \"星期五\", \"星期六\"]\n\t}\n};\n\n","export default {\n\tdate: {\n\t\tmonth_full: [\"Leden\", \"Únor\", \"Březen\", \"Duben\", \"Květen\", \"Červen\", \"Červenec\", \"Srpen\", \"Září\", \"Říjen\", \"Listopad\", \"Prosinec\"],\n\t\tmonth_short: [\"Led\", \"Ún\", \"Bře\", \"Dub\", \"Kvě\", \"Čer\", \"Čec\", \"Srp\", \"Září\", \"Říj\", \"List\", \"Pro\"],\n\t\tday_full: [\"Neděle\", \"Pondělí\", \"Úterý\", \"Středa\", \"Čtvrtek\", \"Pátek\", \"Sobota\"],\n\t\tday_short: [\"Ne\", \"Po\", \"Út\", \"St\", \"Čt\", \"Pá\", \"So\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"Dnes\",\n\t\tday_tab: \"Den\",\n\t\tweek_tab: \"Týden\",\n\t\tmonth_tab: \"Měsíc\",\n\t\tnew_event: \"Nová událost\",\n\t\ticon_save: \"Uložit\",\n\t\ticon_cancel: \"Zpět\",\n\t\ticon_details: \"Detail\",\n\t\ticon_edit: \"Edituj\",\n\t\ticon_delete: \"Smazat\",\n\t\tconfirm_closing: \"\", //Vaše změny budou ztraceny, opravdu ?\n\t\tconfirm_deleting: \"Událost bude trvale smazána, opravdu?\",\n\t\tsection_description: \"Poznámky\",\n\t\tsection_time: \"Doba platnosti\",\n\n\t\t/*recurring events*/\n\t\tconfirm_recurring: \"Přejete si upravit celou řadu opakovaných událostí?\",\n\t\tsection_recurring: \"Opakování události\",\n\t\tbutton_recurring: \"Vypnuto\",\n\t\tbutton_recurring_open: \"Zapnuto\",\n\t\tbutton_edit_series: \"Edit series\",\n\t\tbutton_edit_occurrence: \"Upravit instance\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab: \"Program\",\n\t\tdate: \"Datum\",\n\t\tdescription: \"Poznámka\",\n\n\t\t/*year view extension*/\n\t\tyear_tab: \"Rok\",\n\t\tfull_day: \"Full day\",\n\n\t\t/*week agenda view extension*/\n\t\tweek_agenda_tab: \"Program\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"Mřížka\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\",\n\n\t\t/* recurring event components */\n\t\trepeat_radio_day: \"Denně\",\n\t\trepeat_radio_week: \"Týdně\",\n\t\trepeat_radio_month: \"Měsíčně\",\n\t\trepeat_radio_year: \"Ročně\",\n\t\trepeat_radio_day_type: \"každý\",\n\t\trepeat_text_day_count: \"Den\",\n\t\trepeat_radio_day_type2: \"pracovní dny\",\n\t\trepeat_week: \"Opakuje každých\",\n\t\trepeat_text_week_count: \"Týdnů na:\",\n\t\trepeat_radio_month_type: \"u každého\",\n\t\trepeat_radio_month_start: \"na\",\n\t\trepeat_text_month_day: \"Den každého\",\n\t\trepeat_text_month_count: \"Měsíc\",\n\t\trepeat_text_month_count2_before: \"každý\",\n\t\trepeat_text_month_count2_after: \"Měsíc\",\n\t\trepeat_year_label: \"na\",\n\t\tselect_year_day2: \"v\",\n\t\trepeat_text_year_day: \"Den v\",\n\t\tselect_year_month: \"\",\n\t\trepeat_radio_end: \"bez data ukončení\",\n\t\trepeat_text_occurences_count: \"Události\",\n\t\trepeat_radio_end2: \"po\",\n\t\trepeat_radio_end3: \"Konec\",\n\t\tmonth_for_recurring: [\"Leden\", \"Únor\", \"Březen\", \"Duben\", \"Květen\", \"Červen\", \"Červenec\", \"Srpen\", \"Září\", \"Říjen\", \"Listopad\", \"Prosinec\"],\n\t\tday_for_recurring: [\"Neděle \", \"Pondělí\", \"Úterý\", \"Středa\", \"Čtvrtek\", \"Pátek\", \"Sobota\"]\n\t}\n};\n\n","export default {\n\tdate: {\n\t\tmonth_full: [\"Januar\", \"Februar\", \"Marts\", \"April\", \"Maj\", \"Juni\", \"Juli\", \"August\", \"September\", \"Oktober\", \"November\", \"December\"],\n\t\tmonth_short: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"Maj\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Dec\"],\n\t\tday_full: [\"Søndag\", \"Mandag\", \"Tirsdag\", \"Onsdag\", \"Torsdag\", \"Fredag\", \"Lørdag\"],\n\t\tday_short: [\"Søn\", \"Man\", \"Tir\", \"Ons\", \"Tor\", \"Fre\", \"Lør\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"Idag\",\n\t\tday_tab: \"Dag\",\n\t\tweek_tab: \"Uge\",\n\t\tmonth_tab: \"Måned\",\n\t\tnew_event: \"Ny begivenhed\",\n\t\ticon_save: \"Gem\",\n\t\ticon_cancel: \"Fortryd\",\n\t\ticon_details: \"Detaljer\",\n\t\ticon_edit: \"Tilret\",\n\t\ticon_delete: \"Slet\",\n\t\tconfirm_closing: \"Dine rettelser vil gå tabt.. Er dy sikker?\", //Your changes will be lost, are your sure ?\n\t\tconfirm_deleting: \"Bigivenheden vil blive slettet permanent. Er du sikker?\",\n\t\tsection_description: \"Beskrivelse\",\n\t\tsection_time: \"Tidsperiode\",\n\n\t\t/*recurring events*/\n\t\tconfirm_recurring: \"Vil du tilrette hele serien af gentagne begivenheder?\",\n\t\tsection_recurring: \"Gentag begivenhed\",\n\t\tbutton_recurring: \"Frakoblet\",\n\t\tbutton_recurring_open: \"Tilkoblet\",\n\t\tbutton_edit_series: \"Rediger serien\",\n\t\tbutton_edit_occurrence: \"Rediger en kopi\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab: \"Dagsorden\",\n\t\tdate: \"Dato\",\n\t\tdescription: \"Beskrivelse\",\n\n\t\t/*year view extension*/\n\t\tyear_tab: \"År\",\n\n\t\t/*week agenda view extension*/\n\t\tweek_agenda_tab: \"Dagsorden\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"Grid\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\",\n\n\t\t/* recurring event components */\n\t\trepeat_radio_day: \"Daglig\",\n\t\trepeat_radio_week: \"Ugenlig\",\n\t\trepeat_radio_month: \"Månedlig\",\n\t\trepeat_radio_year: \"Årlig\",\n\t\trepeat_radio_day_type: \"Hver\",\n\t\trepeat_text_day_count: \"dag\",\n\t\trepeat_radio_day_type2: \"På hver arbejdsdag\",\n\t\trepeat_week: \" Gentager sig hver\",\n\t\trepeat_text_week_count: \"uge på følgende dage:\",\n\t\trepeat_radio_month_type: \"Hver den\",\n\t\trepeat_radio_month_start: \"Den\",\n\t\trepeat_text_month_day: \" i hver\",\n\t\trepeat_text_month_count: \"måned\",\n\t\trepeat_text_month_count2_before: \"hver\",\n\t\trepeat_text_month_count2_after: \"måned\",\n\t\trepeat_year_label: \"Den\",\n\t\tselect_year_day2: \"i\",\n\t\trepeat_text_year_day: \"dag i\",\n\t\tselect_year_month: \"\",\n\t\trepeat_radio_end: \"Ingen slutdato\",\n\t\trepeat_text_occurences_count: \"gentagelse\",\n\t\trepeat_radio_end2: \"Efter\",\n\t\trepeat_radio_end3: \"Slut\",\n\t\tmonth_for_recurring: [\"Januar\", \"Februar\", \"März\", \"April\", \"Mai\", \"Juni\", \"Juli\", \"August\", \"September\", \"Oktober\", \"November\", \"Dezember\"],\n\t\tday_for_recurring: [\"Søndag\", \"Mandag\", \"Tirsdag\", \"Onsdag\", \"Torsdag\", \"Fredag\", \"Lørdag\"]\n\t}\n};\n\n","export default {\n\tdate: {\n\t\tmonth_full: [\" Januar\", \" Februar\", \" März \", \" April\", \" Mai\", \" Juni\", \" Juli\", \" August\", \" September \", \" Oktober\", \" November \", \" Dezember\"],\n\t\tmonth_short: [\"Jan\", \"Feb\", \"Mär\", \"Apr\", \"Mai\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Dez\"],\n\t\tday_full: [ \"Sonntag\", \"Montag\", \"Dienstag\", \" Mittwoch\", \" Donnerstag\", \"Freitag\", \"Samstag\"],\n\t\tday_short: [\"So\", \"Mo\", \"Di\", \"Mi\", \"Do\", \"Fr\", \"Sa\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"Heute\",\n\t\tday_tab: \"Tag\",\n\t\tweek_tab: \"Woche\",\n\t\tmonth_tab: \"Monat\",\n\t\tnew_event: \"neuer Eintrag\",\n\t\ticon_save: \"Speichern\",\n\t\ticon_cancel: \"Abbrechen\",\n\t\ticon_details: \"Details\",\n\t\ticon_edit: \"Ändern\",\n\t\ticon_delete: \"Löschen\",\n\t\tconfirm_closing: \"\", //\"Ihre Veränderungen werden verloren sein, wollen Sie ergänzen? \"\n\t\tconfirm_deleting: \"Der Eintrag wird gelöscht\",\n\t\tsection_description: \"Beschreibung\",\n\t\tsection_time: \"Zeitspanne\",\n\t\tfull_day: \"Ganzer Tag\",\n\n\t\tconfirm_recurring: \"Wollen Sie alle Einträge bearbeiten oder nur diesen einzelnen Eintrag?\",\n\t\tsection_recurring: \"Wiederholung\",\n\t\tbutton_recurring: \"Aus\",\n\t\tbutton_recurring_open: \"An\",\n\t\tbutton_edit_series: \"Bearbeiten Sie die Serie\",\n\t\tbutton_edit_occurrence: \"Bearbeiten Sie eine Kopie\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab: \"Agenda\",\n\t\tdate: \"Datum\",\n\t\tdescription: \"Beschreibung\",\n\n\t\t/*year view extension*/\n\t\tyear_tab: \"Jahre\",\n\n\t\t/*week agenda view extension*/\n\t\tweek_agenda_tab: \"Agenda\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"Grid\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\",\n\n\t\t/* recurring event components */\n\t\trepeat_radio_day: \"Täglich\",\n\t\trepeat_radio_week: \"Wöchentlich\",\n\t\trepeat_radio_month: \"Monatlich\",\n\t\trepeat_radio_year: \"Jährlich\",\n\t\trepeat_radio_day_type: \"jeden\",\n\t\trepeat_text_day_count: \"Tag\",\n\t\trepeat_radio_day_type2: \"an jedem Arbeitstag\",\n\t\trepeat_week: \" Wiederholt sich jede\",\n\t\trepeat_text_week_count: \"Woche am:\",\n\t\trepeat_radio_month_type: \"an jedem\",\n\t\trepeat_radio_month_start: \"am\",\n\t\trepeat_text_month_day: \"Tag eines jeden\",\n\t\trepeat_text_month_count: \"Monats\",\n\t\trepeat_text_month_count2_before: \"jeden\",\n\t\trepeat_text_month_count2_after: \"Monats\",\n\t\trepeat_year_label: \"am\",\n\t\tselect_year_day2: \"im\",\n\t\trepeat_text_year_day: \"Tag im\",\n\t\tselect_year_month: \"\",\n\t\trepeat_radio_end: \"kein Enddatum\",\n\t\trepeat_text_occurences_count: \"Ereignissen\",\n\t\trepeat_radio_end3: \"Schluß\",\n\t\trepeat_radio_end2: \"nach\",\n\t\tmonth_for_recurring: [\"Januar\", \"Februar\", \"März\", \"April\", \"Mai\", \"Juni\", \"Juli\", \"August\", \"September\", \"Oktober\", \"November\", \"Dezember\"],\n\t\tday_for_recurring: [\"Sonntag\", \"Montag\", \"Dienstag\", \"Mittwoch\", \"Donnerstag\", \"Freitag\", \"Samstag\"]\n\t}\n};\n\n","export default {\n\tdate: {\n\t\tmonth_full: [\"Ιανουάριος\", \"Φεβρουάριος\", \"Μάρτιος\", \"Απρίλιος\", \"Μάϊος\", \"Ιούνιος\", \"Ιούλιος\", \"Αύγουστος\", \"Σεπτέμβριος\", \"Οκτώβριος\", \"Νοέμβριος\", \"Δεκέμβριος\"],\n\t\tmonth_short: [\"ΙΑΝ\", \"ΦΕΒ\", \"ΜΑΡ\", \"ΑΠΡ\", \"ΜΑΙ\", \"ΙΟΥΝ\", \"ΙΟΥΛ\", \"ΑΥΓ\", \"ΣΕΠ\", \"ΟΚΤ\", \"ΝΟΕ\", \"ΔΕΚ\"],\n\t\tday_full: [\"Κυριακή\", \"Δευτέρα\", \"Τρίτη\", \"Τετάρτη\", \"Πέμπτη\", \"Παρασκευή\", \"Σάββατο\"],\n\t\tday_short: [\"ΚΥ\", \"ΔΕ\", \"ΤΡ\", \"ΤΕ\", \"ΠΕ\", \"ΠΑ\", \"ΣΑ\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"Σήμερα\",\n\t\tday_tab: \"Ημέρα\",\n\t\tweek_tab: \"Εβδομάδα\",\n\t\tmonth_tab: \"Μήνας\",\n\t\tnew_event: \"Νέο έργο\",\n\t\ticon_save: \"Αποθήκευση\",\n\t\ticon_cancel: \"Άκυρο\",\n\t\ticon_details: \"Λεπτομέρειες\",\n\t\ticon_edit: \"Επεξεργασία\",\n\t\ticon_delete: \"Διαγραφή\",\n\t\tconfirm_closing: \"\", //Your changes will be lost, are your sure ?\n\t\tconfirm_deleting: \"Το έργο θα διαγραφεί οριστικά. Θέλετε να συνεχίσετε;\",\n\t\tsection_description: \"Περιγραφή\",\n\t\tsection_time: \"Χρονική περίοδος\",\n\t\tfull_day: \"Πλήρης Ημέρα\",\n\n\t\t/*recurring events*/\n\t\tconfirm_recurring: \"Θέλετε να επεξεργασθείτε ολόκληρη την ομάδα των επαναλαμβανόμενων έργων;\",\n\t\tsection_recurring: \"Επαναλαμβανόμενο έργο\",\n\t\tbutton_recurring: \"Ανενεργό\",\n\t\tbutton_recurring_open: \"Ενεργό\",\n\t\tbutton_edit_series: \"Επεξεργαστείτε τη σειρά\",\n\t\tbutton_edit_occurrence: \"Επεξεργασία ένα αντίγραφο\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab: \"Ημερήσια Διάταξη\",\n\t\tdate: \"Ημερομηνία\",\n\t\tdescription: \"Περιγραφή\",\n\n\t\t/*year view extension*/\n\t\tyear_tab: \"Έτος\",\n\n\t\t/*week agenda view extension*/\n\t\tweek_agenda_tab: \"Ημερήσια Διάταξη\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"Πλέγμα\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\",\n\n\t\t/* recurring event components */\n\t\trepeat_radio_day: \"Ημερησίως\",\n\t\trepeat_radio_week: \"Εβδομαδιαίως\",\n\t\trepeat_radio_month: \"Μηνιαίως\",\n\t\trepeat_radio_year: \"Ετησίως\",\n\t\trepeat_radio_day_type: \"Κάθε\",\n\t\trepeat_text_day_count: \"ημέρα\",\n\t\trepeat_radio_day_type2: \"Κάθε εργάσιμη\",\n\t\trepeat_week: \" Επανάληψη κάθε\",\n\t\trepeat_text_week_count: \"εβδομάδα τις επόμενες ημέρες:\",\n\t\trepeat_radio_month_type: \"Επανάληψη\",\n\t\trepeat_radio_month_start: \"Την\",\n\t\trepeat_text_month_day: \"ημέρα κάθε\",\n\t\trepeat_text_month_count: \"μήνα\",\n\t\trepeat_text_month_count2_before: \"κάθε\",\n\t\trepeat_text_month_count2_after: \"μήνα\",\n\t\trepeat_year_label: \"Την\",\n\t\tselect_year_day2: \"του\",\n\t\trepeat_text_year_day: \"ημέρα\",\n\t\tselect_year_month: \"μήνα\",\n\t\trepeat_radio_end: \"Χωρίς ημερομηνία λήξεως\",\n\t\trepeat_text_occurences_count: \"επαναλήψεις\",\n\t\trepeat_radio_end3: \"Λήγει την\",\n\t\trepeat_radio_end2: \"Μετά από\",\n\t\tmonth_for_recurring: [\"Ιανουάριος\", \"Φεβρουάριος\", \"Μάρτιος\", \"Απρίλιος\", \"Μάϊος\", \"Ιούνιος\", \"Ιούλιος\", \"Αύγουστος\", \"Σεπτέμβριος\", \"Οκτώβριος\", \"Νοέμβριος\", \"Δεκέμβριος\"],\n\t\tday_for_recurring: [\"Κυριακή\", \"Δευτέρα\", \"Τρίτη\", \"Τετάρτη\", \"Πέμπτη\", \"Παρασκευή\", \"Σάββατο\"]\n\t}\n};\n\n","export default {\n\tdate:{\n\t\tmonth_full:[\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n\t\tmonth_short:[\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n\t\tday_full:[\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n\t\tday_short:[\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"]\n\t},\n\tlabels:{\n\t\tdhx_cal_today_button:\"Today\",\n\t\tday_tab:\"Day\",\n\t\tweek_tab:\"Week\",\n\t\tmonth_tab:\"Month\",\n\t\tnew_event:\"New event\",\n\t\ticon_save:\"Save\",\n\t\ticon_cancel:\"Cancel\",\n\t\ticon_details:\"Details\",\n\t\ticon_edit:\"Edit\",\n\t\ticon_delete:\"Delete\",\n\t\tconfirm_closing:\"\",//Your changes will be lost, are your sure ?\n\t\tconfirm_deleting:\"Event will be deleted permanently, are you sure?\",\n\t\tsection_description:\"Description\",\n\t\tsection_time:\"Time period\",\n\t\tfull_day:\"Full day\",\n\n\t\t/*recurring events*/\n\t\tconfirm_recurring:\"Do you want to edit the whole set of repeated events?\",\n\t\tsection_recurring:\"Repeat event\",\n\t\tbutton_recurring:\"Disabled\",\n\t\tbutton_recurring_open:\"Enabled\",\n\t\tbutton_edit_series: \"Edit series\",\n\t\tbutton_edit_occurrence: \"Edit occurrence\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab:\"Agenda\",\n\t\tdate:\"Date\",\n\t\tdescription:\"Description\",\n\n\t\t/*year view extension*/\n\t\tyear_tab:\"Year\",\n\n\t\t/* week agenda extension */\n\t\tweek_agenda_tab: \"Agenda\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"Grid\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\",\n\n\t\t/* recurring event components */\n\t\trepeat_radio_day: \"Daily\",//name=\"repeat\" value=\"day\"\n\t\trepeat_radio_week: \"Weekly\",//name=\"repeat\" value=\"week\n\t\trepeat_radio_month: \"Monthly\",\n\t\trepeat_radio_year: \"Yearly\",\n\t\trepeat_radio_day_type: \"Every\",\n\t\trepeat_text_day_count: \"day\",\n\t\trepeat_radio_day_type2: \"Every workday\",\n\t\trepeat_week: \" Repeat every\",\n\t\trepeat_text_week_count: \"week next days:\",\n\t\trepeat_radio_month_type: \"Repeat\",\n\t\trepeat_radio_month_start: \"On\",\n\t\trepeat_text_month_day: \"day every\",\n\t\trepeat_text_month_count: \"month\",\n\t\trepeat_text_month_count2_before: \"every\",\n\t\trepeat_text_month_count2_after: \"month\",\n\t\trepeat_year_label: \"On\",\n\t\tselect_year_day2: \"of\",\n\t\trepeat_text_year_day: \"day\",\n\t\tselect_year_month: \"month\",\n\t\trepeat_radio_end: \"No end date\",\n\t\trepeat_text_occurences_count: \"occurrences\",\n\t\trepeat_radio_end2: \"After\",\n\t\trepeat_radio_end3: \"End by\",\n\t\tmonth_for_recurring: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n\t\tday_for_recurring: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"]//\n\t}\n};\n\n","/*\n @Autor Manuel Fernandez Panzuela - www.mfernandez.es\n */\nexport default {\n\tdate: {\n\t\tmonth_full: [\"Enero\", \"Febrero\", \"Marzo\", \"Abril\", \"Mayo\", \"Junio\", \"Julio\", \"Agosto\", \"Septiembre\", \"Octubre\", \"Noviembre\", \"Diciembre\"],\n\t\tmonth_short: [\"Ene\", \"Feb\", \"Mar\", \"Abr\", \"May\", \"Jun\", \"Jul\", \"Ago\", \"Sep\", \"Oct\", \"Nov\", \"Dic\"],\n\t\tday_full: [\"Domingo\", \"Lunes\", \"Martes\", \"Miércoles\", \"Jueves\", \"Viernes\", \"Sábado\"],\n\t\tday_short: [\"Dom\", \"Lun\", \"Mar\", \"Mié\", \"Jue\", \"Vie\", \"Sáb\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"Hoy\",\n\t\tday_tab: \"Día\",\n\t\tweek_tab: \"Semana\",\n\t\tmonth_tab: \"Mes\",\n\t\tnew_event: \"Nuevo evento\",\n\t\ticon_save: \"Guardar\",\n\t\ticon_cancel: \"Cancelar\",\n\t\ticon_details: \"Detalles\",\n\t\ticon_edit: \"Editar\",\n\t\ticon_delete: \"Eliminar\",\n\t\tconfirm_closing: \"\", //\"Sus cambios se perderán, continuar ?\"\n\t\tconfirm_deleting: \"El evento se borrará definitivamente, ¿continuar?\",\n\t\tsection_description: \"Descripción\",\n\t\tsection_time: \"Período\",\n\t\tfull_day: \"Todo el día\",\n\n\t\tconfirm_recurring: \"¿Desea modificar el conjunto de eventos repetidos?\",\n\t\tsection_recurring: \"Repita el evento\",\n\t\tbutton_recurring: \"Impedido\",\n\t\tbutton_recurring_open: \"Permitido\",\n\t\tbutton_edit_series: \"Editar la serie\",\n\t\tbutton_edit_occurrence: \"Editar este evento\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab: \"Día\",\n\t\tdate: \"Fecha\",\n\t\tdescription: \"Descripción\",\n\n\t\t/*year view extension*/\n\t\tyear_tab: \"Año\",\n\n\t\t/*week agenda view extension*/\n\t\tweek_agenda_tab: \"Día\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"Reja\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\",\n\n\t\t/* recurring event components */\n\t\trepeat_radio_day: \"Diariamente\",\n\t\trepeat_radio_week: \"Semanalmente\",\n\t\trepeat_radio_month: \"Mensualmente\",\n\t\trepeat_radio_year: \"Anualmente\",\n\t\trepeat_radio_day_type: \"Cada\",\n\t\trepeat_text_day_count: \"dia\",\n\t\trepeat_radio_day_type2: \"Cada jornada de trabajo\",\n\t\trepeat_week: \" Repetir cada\",\n\t\trepeat_text_week_count: \"semana:\",\n\t\trepeat_radio_month_type: \"Repita\",\n\t\trepeat_radio_month_start: \"El\",\n\t\trepeat_text_month_day: \"dia cada \",\n\t\trepeat_text_month_count: \"mes\",\n\t\trepeat_text_month_count2_before: \"cada\",\n\t\trepeat_text_month_count2_after: \"mes\",\n\t\trepeat_year_label: \"El\",\n\t\tselect_year_day2: \"del\",\n\t\trepeat_text_year_day: \"dia\",\n\t\tselect_year_month: \"mes\",\n\t\trepeat_radio_end: \"Sin fecha de finalización\",\n\t\trepeat_text_occurences_count: \"ocurrencias\",\n\t\trepeat_radio_end3: \"Fin\",\n\t\trepeat_radio_end2: \"Después de\",\n\t\tmonth_for_recurring: [\"Enero\", \"Febrero\", \"Маrzo\", \"Аbril\", \"Mayo\", \"Junio\", \"Julio\", \"Аgosto\", \"Setiembre\", \"Octubre\", \"Noviembre\", \"Diciembre\"],\n\t\tday_for_recurring: [\"Domingo\", \"Lunes\", \"Martes\", \"Miércoles\", \"Jeuves\", \"Viernes\", \"Sabado\"]\n\t}\n};\n","export default {\n\tdate: {\n\t\tmonth_full: [\"Tammikuu\", \"Helmikuu\", \"Maaliskuu\", \"Huhtikuu\", \"Toukokuu\", \"Kesäkuu\", \"Heinäkuu\", \"Elokuu\", \"Syyskuu\", \"Lokakuu\", \"Marraskuu\", \"Joulukuu\"],\n\t\tmonth_short: [\"Tam\", \"Hel\", \"Maa\", \"Huh\", \"Tou\", \"Kes\", \"Hei\", \"Elo\", \"Syy\", \"Lok\", \"Mar\", \"Jou\"],\n\t\tday_full: [\"Sunnuntai\", \"Maanantai\", \"Tiistai\", \"Keskiviikko\", \"Torstai\", \"Perjantai\", \"Lauantai\"],\n\t\tday_short: [\"Su\", \"Ma\", \"Ti\", \"Ke\", \"To\", \"Pe\", \"La\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"Tänään\",\n\t\tday_tab: \"Päivä\",\n\t\tweek_tab: \"Viikko\",\n\t\tmonth_tab: \"Kuukausi\",\n\t\tnew_event: \"Uusi tapahtuma\",\n\t\ticon_save: \"Tallenna\",\n\t\ticon_cancel: \"Peru\",\n\t\ticon_details: \"Tiedot\",\n\t\ticon_edit: \"Muokkaa\",\n\t\ticon_delete: \"Poista\",\n\t\tconfirm_closing: \"\", //Your changes will be lost, are your sure ?\n\t\tconfirm_deleting: \"Haluatko varmasti poistaa tapahtuman?\",\n\t\tsection_description: \"Kuvaus\",\n\t\tsection_time: \"Aikajakso\",\n\t\tfull_day: \"Koko päivä\",\n\n\t\tconfirm_recurring: \"Haluatko varmasti muokata toistuvan tapahtuman kaikkia jaksoja?\",\n\t\tsection_recurring: \"Toista tapahtuma\",\n\t\tbutton_recurring: \"Ei käytössä\",\n\t\tbutton_recurring_open: \"Käytössä\",\n\t\tbutton_edit_series: \"Muokkaa sarja\",\n\t\tbutton_edit_occurrence: \"Muokkaa kopio\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab: \"Esityslista\",\n\t\tdate: \"Päivämäärä\",\n\t\tdescription: \"Kuvaus\",\n\n\t\t/*year view extension*/\n\t\tyear_tab: \"Vuoden\",\n\n\t\t/*week agenda view extension*/\n\t\tweek_agenda_tab: \"Esityslista\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"Ritilä\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Luo uusi vetämällä\",\n\t\tdrag_to_move:\"Siirrä vetämällä\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\",\n\n\t\t/* recurring event components */\n\t\trepeat_radio_day: \"Päivittäin\",\n\t\trepeat_radio_week: \"Viikoittain\",\n\t\trepeat_radio_month: \"Kuukausittain\",\n\t\trepeat_radio_year: \"Vuosittain\",\n\t\trepeat_radio_day_type: \"Joka\",\n\t\trepeat_text_day_count: \"päivä\",\n\t\trepeat_radio_day_type2: \"Joka arkipäivä\",\n\t\trepeat_week: \"Toista joka\",\n\t\trepeat_text_week_count: \"viikko näinä päivinä:\",\n\t\trepeat_radio_month_type: \"Toista\",\n\t\trepeat_radio_month_start: \"\",\n\t\trepeat_text_month_day: \"päivänä joka\",\n\t\trepeat_text_month_count: \"kuukausi\",\n\t\trepeat_text_month_count2_before: \"joka\",\n\t\trepeat_text_month_count2_after: \"kuukausi\",\n\t\trepeat_year_label: \"\",\n\t\tselect_year_day2: \"\",\n\t\trepeat_text_year_day: \"päivä\",\n\t\tselect_year_month: \"kuukausi\",\n\t\trepeat_radio_end: \"Ei loppumisaikaa\",\n\t\trepeat_text_occurences_count: \"Toiston jälkeen\",\n\t\trepeat_radio_end3: \"Loppuu\",\n\t\trepeat_radio_end2: \"\",\n\t\tmonth_for_recurring: [\"Tammikuu\", \"Helmikuu\", \"Maaliskuu\", \"Huhtikuu\", \"Toukokuu\", \"Kesäkuu\", \"Heinäkuu\", \"Elokuu\", \"Syyskuu\", \"Lokakuu\", \"Marraskuu\", \"Joulukuu\"],\n\t\tday_for_recurring: [\"Sunnuntai\", \"Maanantai\", \"Tiistai\", \"Keskiviikko\", \"Torstai\", \"Perjantai\", \"Lauantai\"]\n\t}\n};\n\n\n","export default {\n\tdate: {\n\t\tmonth_full: [\"Janvier\", \"Février\", \"Mars\", \"Avril\", \"Mai\", \"Juin\", \"Juillet\", \"Août\", \"Septembre\", \"Octobre\", \"Novembre\", \"Décembre\"],\n\t\tmonth_short: [\"Jan\", \"Fév\", \"Mar\", \"Avr\", \"Mai\", \"Juin\", \"Juil\", \"Aoû\", \"Sep\", \"Oct\", \"Nov\", \"Déc\"],\n\t\tday_full: [\"Dimanche\", \"Lundi\", \"Mardi\", \"Mercredi\", \"Jeudi\", \"Vendredi\", \"Samedi\"],\n\t\tday_short: [\"Dim\", \"Lun\", \"Mar\", \"Mer\", \"Jeu\", \"Ven\", \"Sam\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"Aujourd'hui\",\n\t\tday_tab: \"Jour\",\n\t\tweek_tab: \"Semaine\",\n\t\tmonth_tab: \"Mois\",\n\t\tnew_event: \"Nouvel événement\",\n\t\ticon_save: \"Enregistrer\",\n\t\ticon_cancel: \"Annuler\",\n\t\ticon_details: \"Détails\",\n\t\ticon_edit: \"Modifier\",\n\t\ticon_delete: \"Effacer\",\n\t\tconfirm_closing: \"\", //Vos modifications seront perdus, êtes-vous sûr ?\n\t\tconfirm_deleting: \"L'événement sera effacé sans appel, êtes-vous sûr ?\",\n\t\tsection_description: \"Description\",\n\t\tsection_time: \"Période\",\n\t\tfull_day: \"Journée complète\",\n\n\t\tconfirm_recurring: \"Voulez-vous éditer toute une série d'évènements répétés?\",\n\t\tsection_recurring: \"Périodicité\",\n\t\tbutton_recurring: \"Désactivé\",\n\t\tbutton_recurring_open: \"Activé\",\n\t\tbutton_edit_series: \"Modifier la série\",\n\t\tbutton_edit_occurrence: \"Modifier une copie\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab: \"Jour\",\n\t\tdate: \"Date\",\n\t\tdescription: \"Description\",\n\n\t\t/*year view extension*/\n\t\tyear_tab: \"Année\",\n\n\t\t/*week agenda view extension*/\n\t\tweek_agenda_tab: \"Jour\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"Grille\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\",\n\n\t\t/* recurring event components */\n\t\trepeat_radio_day: \"Quotidienne\",\n\t\trepeat_radio_week: \"Hebdomadaire\",\n\t\trepeat_radio_month: \"Mensuelle\",\n\t\trepeat_radio_year: \"Annuelle\",\n\t\trepeat_radio_day_type: \"Chaque\",\n\t\trepeat_text_day_count: \"jour\",\n\t\trepeat_radio_day_type2: \"Chaque journée de travail\",\n\t\trepeat_week: \" Répéter toutes les\",\n\t\trepeat_text_week_count: \"semaine:\",\n\t\trepeat_radio_month_type: \"Répéter\",\n\t\trepeat_radio_month_start: \"Le\",\n\t\trepeat_text_month_day: \"jour chaque\",\n\t\trepeat_text_month_count: \"mois\",\n\t\trepeat_text_month_count2_before: \"chaque\",\n\t\trepeat_text_month_count2_after: \"mois\",\n\t\trepeat_year_label: \"Le\",\n\t\tselect_year_day2: \"du\",\n\t\trepeat_text_year_day: \"jour\",\n\t\tselect_year_month: \"mois\",\n\t\trepeat_radio_end: \"Pas de date d"achèvement\",\n\t\trepeat_text_occurences_count: \"occurrences\",\n\t\trepeat_radio_end3: \"Fin\",\n\t\trepeat_radio_end2: \"Après\",\n\t\tmonth_for_recurring: [\"Janvier\", \"Février\", \"Mars\", \"Avril\", \"Mai\", \"Juin\", \"Juillet\", \"Août\", \"Septembre\", \"Octobre\", \"Novembre\", \"Décembre\"],\n\t\tday_for_recurring: [\"Dimanche\", \"Lundi\", \"Mardi\", \"Mercredi\", \"Jeudi\", \"Vendredi\", \"Samedi\"]\n\t}\n};\n","export default {\n\tdate: {\n\t\tmonth_full: [\"ינואר\", \"פברואר\", \"מרץ\", \"אפריל\", \"מאי\", \"יוני\", \"יולי\", \"אוגוסט\", \"ספטמבר\", \"אוקטובר\", \"נובמבר\", \"דצמבר\"],\n\t\tmonth_short: [\"ינו\", \"פבר\", \"מרץ\", \"אפר\", \"מאי\", \"יונ\", \"יול\", \"אוג\", \"ספט\", \"אוק\", \"נוב\", \"דצמ\"],\n\t\tday_full: [\"ראשון\", \"שני\", \"שלישי\", \"רביעי\", \"חמישי\", \"שישי\", \"שבת\"],\n\t\tday_short: [\"א\", \"ב\", \"ג\", \"ד\", \"ה\", \"ו\", \"ש\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"היום\",\n\t\tday_tab: \"יום\",\n\t\tweek_tab: \"שבוע\",\n\t\tmonth_tab: \"חודש\",\n\t\tnew_event: \"ארוע חדש\",\n\t\ticon_save: \"שמור\",\n\t\ticon_cancel: \"בטל\",\n\t\ticon_details: \"פרטים\",\n\t\ticon_edit: \"ערוך\",\n\t\ticon_delete: \"מחק\",\n\t\tconfirm_closing: \"\", //Your changes will be lost, are your sure ?\n\t\tconfirm_deleting: \"ארוע ימחק סופית.להמשיך?\",\n\t\tsection_description: \"תיאור\",\n\t\tsection_time: \"תקופה\",\n\n\t\tconfirm_recurring: \"האם ברצונך לשנות כל סדרת ארועים מתמשכים?\",\n\t\tsection_recurring: \"להעתיק ארוע\",\n\t\tbutton_recurring: \"לא פעיל\",\n\t\tbutton_recurring_open: \"פעיל\",\n\t\tfull_day: \"יום שלם\",\n\t\tbutton_edit_series: \"ערוך את הסדרה\",\n\t\tbutton_edit_occurrence: \"עריכת עותק\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab: \"סדר יום\",\n\t\tdate: \"תאריך\",\n\t\tdescription: \"תיאור\",\n\n\t\t/*year view extension*/\n\t\tyear_tab: \"לשנה\",\n\n\t\t/*week agenda view extension*/\n\t\tweek_agenda_tab: \"סדר יום\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"סורג\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"גרור כדי להזיז\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"בטל\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"הבא\",\n\t\tprev: \"הקודם\",\n\t\tyear: \"שנה\",\n\t\tmonth: \"חודש\",\n\t\tday: \"יום\",\n\t\thour:\"שעה\",\n\t\tminute: \"דקה\",\n\n\t\t/* recurring event components */\n\t\trepeat_radio_day: \"יומי\",\n\t\trepeat_radio_week: \"שבועי\",\n\t\trepeat_radio_month: \"חודשי\",\n\t\trepeat_radio_year: \"שנתי\",\n\t\trepeat_radio_day_type: \"חזור כל\",\n\t\trepeat_text_day_count: \"ימים\",\n\t\trepeat_radio_day_type2: \"חזור כל יום עבודה\",\n\t\trepeat_week: \" חזור כל\",\n\t\trepeat_text_week_count: \"שבוע לפי ימים:\",\n\t\trepeat_radio_month_type: \"חזור כל\",\n\t\trepeat_radio_month_start: \"כל\",\n\t\trepeat_text_month_day: \"ימים כל\",\n\t\trepeat_text_month_count: \"חודשים\",\n\t\trepeat_text_month_count2_before: \"חזור כל\",\n\t\trepeat_text_month_count2_after: \"חודש\",\n\t\trepeat_year_label: \"כל\",\n\t\tselect_year_day2: \"בחודש\",\n\t\trepeat_text_year_day: \"ימים\",\n\t\tselect_year_month: \"חודש\",\n\t\trepeat_radio_end: \"לעולם לא מסתיים\",\n\t\trepeat_text_occurences_count: \"אירועים\",\n\t\trepeat_radio_end3: \"מסתיים ב\",\n\t\trepeat_radio_end2: \"אחרי\",\n\t\tmonth_for_recurring: [\"ינואר\", \"פברואר\", \"מרץ\", \"אפריל\", \"מאי\", \"יוני\", \"יולי\", \"אוגוסט\", \"ספטמבר\", \"אוקטובר\", \"נובמבר\", \"דצמבר\"],\n\t\tday_for_recurring: [\"ראשון\", \"שני\", \"שלישי\", \"רביעי\", \"חמישי\", \"שישי\", \"שבת\"]\n\t}\n};\n\n\n","export default {\n\tdate: {\n\t\tmonth_full: [\"Január\", \"Február\", \"Március\", \"Április\", \"Május\", \"Június\", \"Július\", \"Augusztus\", \"Szeptember\", \"Október\", \"November\", \"December\"],\n\t\tmonth_short: [\"Jan\", \"Feb\", \"Már\", \"Ápr\", \"Máj\", \"Jún\", \"Júl\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Dec\"],\n\t\tday_full: [\"Vasárnap\", \"Hétfõ\", \"Kedd\", \"Szerda\", \"Csütörtök\", \"Péntek\", \"szombat\"],\n\t\tday_short: [\"Va\", \"Hé\", \"Ke\", \"Sze\", \"Csü\", \"Pé\", \"Szo\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"Ma\",\n\t\tday_tab: \"Nap\",\n\t\tweek_tab: \"Hét\",\n\t\tmonth_tab: \"Hónap\",\n\t\tnew_event: \"Új esemény\",\n\t\ticon_save: \"Mentés\",\n\t\ticon_cancel: \"Mégse\",\n\t\ticon_details: \"Részletek\",\n\t\ticon_edit: \"Szerkesztés\",\n\t\ticon_delete: \"Törlés\",\n\t\tconfirm_closing: \"\", //A változások elvesznek, biztosan folytatja? \"\n\t\tconfirm_deleting: \"Az esemény törölve lesz, biztosan folytatja?\",\n\t\tsection_description: \"Leírás\",\n\t\tsection_time: \"Idõszak\",\n\t\tfull_day: \"Egesz napos\",\n\n\t\t/*ismétlõdõ események*/\n\t\tconfirm_recurring: \"Biztosan szerkeszteni akarod az összes ismétlõdõ esemény beállítását?\",\n\t\tsection_recurring: \"Esemény ismétlése\",\n\t\tbutton_recurring: \"Tiltás\",\n\t\tbutton_recurring_open: \"Engedélyezés\",\n\t\tbutton_edit_series: \"Edit series\",\n\t\tbutton_edit_occurrence: \"Szerkesztés bíróság\",\n\n\t\t/*napirendi nézet*/\n\t\tagenda_tab: \"Napirend\",\n\t\tdate: \"Dátum\",\n\t\tdescription: \"Leírás\",\n\n\t\t/*éves nézet*/\n\t\tyear_tab: \"Év\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\"\n\t}\n};\n\n","export default {\n\tdate: {\n\t\tmonth_full: [\"Januari\", \"Februari\", \"Maret\", \"April\", \"Mei\", \"Juni\", \"Juli\", \"Agustus\", \"September\", \"Oktober\", \"November\", \"Desember\"],\n\t\tmonth_short: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"Mei\", \"Jun\", \"Jul\", \"Ags\", \"Sep\", \"Okt\", \"Nov\", \"Des\"],\n\t\tday_full: [\"Minggu\", \"Senin\", \"Selasa\", \"Rabu\", \"Kamis\", \"Jumat\", \"Sabtu\"],\n\t\tday_short: [\"Ming\", \"Sen\", \"Sel\", \"Rab\", \"Kam\", \"Jum\", \"Sab\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"Hari Ini\",\n\t\tday_tab: \"Hari\",\n\t\tweek_tab: \"Minggu\",\n\t\tmonth_tab: \"Bulan\",\n\t\tnew_event: \"Acara Baru\",\n\t\ticon_save: \"Simpan\",\n\t\ticon_cancel: \"Batal\",\n\t\ticon_details: \"Detail\",\n\t\ticon_edit: \"Edit\",\n\t\ticon_delete: \"Hapus\",\n\t\tconfirm_closing: \"\", /*Perubahan tidak akan disimpan ?*/\n\t\tconfirm_deleting: \"Acara akan dihapus\",\n\t\tsection_description: \"Keterangan\",\n\t\tsection_time: \"Periode\",\n\t\tfull_day: \"Hari penuh\",\n\n\t\t/*recurring events*/\n\t\tconfirm_recurring: \"Apakah acara ini akan berulang?\",\n\t\tsection_recurring: \"Acara Rutin\",\n\t\tbutton_recurring: \"Tidak Difungsikan\",\n\t\tbutton_recurring_open: \"Difungsikan\",\n\t\tbutton_edit_series: \"Mengedit seri\",\n\t\tbutton_edit_occurrence: \"Mengedit salinan\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab: \"Agenda\",\n\t\tdate: \"Tanggal\",\n\t\tdescription: \"Keterangan\",\n\n\t\t/*year view extension*/\n\t\tyear_tab: \"Tahun\",\n\n\t\t/*week agenda view extension*/\n\t\tweek_agenda_tab: \"Agenda\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"Tabel\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\"\n\t}\n};","export default {\n\tdate: {\n\t\tmonth_full: [\"Gennaio\", \"Febbraio\", \"Marzo\", \"Aprile\", \"Maggio\", \"Giugno\", \"Luglio\", \"Agosto\", \"Settembre\", \"Ottobre\", \"Novembre\", \"Dicembre\"],\n\t\tmonth_short: [\"Gen\", \"Feb\", \"Mar\", \"Apr\", \"Mag\", \"Giu\", \"Lug\", \"Ago\", \"Set\", \"Ott\", \"Nov\", \"Dic\"],\n\t\tday_full: [\"Domenica\", \"Lunedì\", \"Martedì\", \"Mercoledì\", \"Giovedì\", \"Venerdì\", \"Sabato\"],\n\t\tday_short: [\"Dom\", \"Lun\", \"Mar\", \"Mer\", \"Gio\", \"Ven\", \"Sab\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"Oggi\",\n\t\tday_tab: \"Giorno\",\n\t\tweek_tab: \"Settimana\",\n\t\tmonth_tab: \"Mese\",\n\t\tnew_event: \"Nuovo evento\",\n\t\ticon_save: \"Salva\",\n\t\ticon_cancel: \"Chiudi\",\n\t\ticon_details: \"Dettagli\",\n\t\ticon_edit: \"Modifica\",\n\t\ticon_delete: \"Elimina\",\n\t\tconfirm_closing: \"\", //Le modifiche apportate saranno perse, siete sicuri?\n\t\tconfirm_deleting: \"L'evento sarà eliminato, siete sicuri?\",\n\t\tsection_description: \"Descrizione\",\n\t\tsection_time: \"Periodo di tempo\",\n\t\tfull_day: \"Intera giornata\",\n\n\t\tconfirm_recurring: \"Vuoi modificare l'intera serie di eventi?\",\n\t\tsection_recurring: \"Ripetere l'evento\",\n\t\tbutton_recurring: \"Disattivato\",\n\t\tbutton_recurring_open: \"Attivato\",\n\t\tbutton_edit_series: \"Modificare la serie\",\n\t\tbutton_edit_occurrence: \"Modificare una copia\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab: \"Agenda\",\n\t\tdate: \"Data\",\n\t\tdescription: \"Descrizione\",\n\n\t\t/*year view extension*/\n\t\tyear_tab: \"Anno\",\n\n\t\t/*week agenda view extension*/\n\t\tweek_agenda_tab: \"Agenda\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"Griglia\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\",\n\n\t\t/* recurring event components */\n\t\trepeat_radio_day: \"Quotidiano\",\n\t\trepeat_radio_week: \"Settimanale\",\n\t\trepeat_radio_month: \"Mensile\",\n\t\trepeat_radio_year: \"Annuale\",\n\t\trepeat_radio_day_type: \"Ogni\",\n\t\trepeat_text_day_count: \"giorno\",\n\t\trepeat_radio_day_type2: \"Ogni giornata lavorativa\",\n\t\trepeat_week: \" Ripetere ogni\",\n\t\trepeat_text_week_count: \"settimana:\",\n\t\trepeat_radio_month_type: \"Ripetere\",\n\t\trepeat_radio_month_start: \"Il\",\n\t\trepeat_text_month_day: \"giorno ogni\",\n\t\trepeat_text_month_count: \"mese\",\n\t\trepeat_text_month_count2_before: \"ogni\",\n\t\trepeat_text_month_count2_after: \"mese\",\n\t\trepeat_year_label: \"Il\",\n\t\tselect_year_day2: \"del\",\n\t\trepeat_text_year_day: \"giorno\",\n\t\tselect_year_month: \"mese\",\n\t\trepeat_radio_end: \"Senza data finale\",\n\t\trepeat_text_occurences_count: \"occorenze\",\n\t\trepeat_radio_end3: \"Fine\",\n\t\trepeat_radio_end2: \"Dopo\",\n\t\tmonth_for_recurring: [\"Gennaio\", \"Febbraio\", \"Marzo\", \"Aprile\", \"Maggio\", \"Jiugno\", \"Luglio\", \"Agosto\", \"Settembre\", \"Ottobre\", \"Novembre\", \"Dicembre\"],\n\t\tday_for_recurring: [\"Domenica\", \"Lunedì\", \"Martedì\", \"Mercoledì\", \"Jovedì\", \"Venerdì\", \"Sabato\"]\n\t}\n};\n","/*\n Translation by Genexus Japan Inc.\n */\nexport default {\n\tdate: {\n\t\tmonth_full: [\"1月\", \"2月\", \"3月\", \"4月\", \"5月\", \"6月\", \"7月\", \"8月\", \"9月\", \"10月\", \"11月\", \"12月\"],\n\t\tmonth_short: [ \"1月\", \"2月\", \"3月\", \"4月\", \"5月\", \"6月\", \"7月\", \"8月\", \"9月\", \"10月\", \"11月\", \"12月\"],\n\t\tday_full: [\"日曜日\", \"月曜日\", \"火曜日\", \"水曜日\", \"木曜日\", \"金曜日\", \"土曜日\"],\n\t\tday_short: [\"日\", \"月\", \"火\", \"水\", \"木\", \"金\", \"土\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"今日\",\n\t\tday_tab: \"日\",\n\t\tweek_tab: \"週\",\n\t\tmonth_tab: \"月\",\n\t\tnew_event: \"新イベント\",\n\t\ticon_save: \"保存\",\n\t\ticon_cancel: \"キャンセル\",\n\t\ticon_details: \"詳細\",\n\t\ticon_edit: \"編集\",\n\t\ticon_delete: \"削除\",\n\t\tconfirm_closing: \"\", //変更が取り消されます、宜しいですか?\n\t\tconfirm_deleting: \"イベント完全に削除されます、宜しいですか?\",\n\t\tsection_description: \"デスクリプション\",\n\t\tsection_time: \"期間\",\n\t\tconfirm_recurring: \"繰り返されているイベントを全て編集しますか?\",\n\t\tsection_recurring: \"イベントを繰り返す\",\n\t\tbutton_recurring: \"無効\",\n\t\tbutton_recurring_open: \"有効\",\n\t\tfull_day: \"終日\",\n\t\tbutton_edit_series: \"シリーズを編集します\",\n\t\tbutton_edit_occurrence: \"コピーを編集\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab: \"議題は\",\n\t\tdate: \"日付\",\n\t\tdescription: \"説明\",\n\n\t\t/*year view extension*/\n\t\tyear_tab: \"今年\",\n\n\t\t/*week agenda view extension*/\n\t\tweek_agenda_tab: \"議題は\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"グリッド\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\"\n\t}\n};\n\n\n","export default class LocaleManager{\n\tconstructor(config){\n\t\tthis._locales = {};\n\t\tfor(const i in config){\n\t\t\tthis._locales[i] = config[i];\n\t\t}\n\t}\n\n\taddLocale(name, locale) {\n\t\tthis._locales[name] = locale;\n\t}\n\n\tgetLocale(name) {\n\t\treturn this._locales[name];\n\t}\n}","export default {\n\tdate: {\n\t\tmonth_full: [\"Januar\", \"Februar\", \"Mars\", \"April\", \"Mai\", \"Juni\", \"Juli\", \"August\", \"September\", \"Oktober\", \"November\", \"Desember\"],\n\t\tmonth_short: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"Mai\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Des\"],\n\t\tday_full: [\"Søndag\", \"Mandag\", \"Tirsdag\", \"Onsdag\", \"Torsdag\", \"Fredag\", \"Lørdag\"],\n\t\tday_short: [\"Søn\", \"Mon\", \"Tir\", \"Ons\", \"Tor\", \"Fre\", \"Lør\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"I dag\",\n\t\tday_tab: \"Dag\",\n\t\tweek_tab: \"Uke\",\n\t\tmonth_tab: \"Måned\",\n\t\tnew_event: \"Ny hendelse\",\n\t\ticon_save: \"Lagre\",\n\t\ticon_cancel: \"Avbryt\",\n\t\ticon_details: \"Detaljer\",\n\t\ticon_edit: \"Rediger\",\n\t\ticon_delete: \"Slett\",\n\t\tconfirm_closing: \"\", //Your changes will be lost, are your sure ?\n\t\tconfirm_deleting: \"Hendelsen vil bli slettet permanent. Er du sikker?\",\n\t\tsection_description: \"Beskrivelse\",\n\t\tsection_time: \"Tidsperiode\",\n\n\t\t/*recurring events*/\n\t\tconfirm_recurring: \"Vil du forandre hele dette settet av repeterende hendelser?\",\n\t\tsection_recurring: \"Repeter hendelsen\",\n\t\tbutton_recurring: \"Av\",\n\t\tbutton_recurring_open: \"På\",\n\t\tbutton_edit_series: \"Rediger serien\",\n\t\tbutton_edit_occurrence: \"Redigere en kopi\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab: \"Agenda\",\n\t\tdate: \"Dato\",\n\t\tdescription: \"Beskrivelse\",\n\n\t\t/*year view extension*/\n\t\tyear_tab: \"År\",\n\n\t\t/*week agenda view extension*/\n\t\tweek_agenda_tab: \"Agenda\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"Grid\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\",\n\n\t\t/* recurring event components */\n\t\trepeat_radio_day: \"Daglig\",\n\t\trepeat_radio_week: \"Ukentlig\",\n\t\trepeat_radio_month: \"Månedlig\",\n\t\trepeat_radio_year: \"Årlig\",\n\t\trepeat_radio_day_type: \"Hver\",\n\t\trepeat_text_day_count: \"dag\",\n\t\trepeat_radio_day_type2: \"Alle hverdager\",\n\t\trepeat_week: \" Gjentas hver\",\n\t\trepeat_text_week_count: \"uke på:\",\n\t\trepeat_radio_month_type: \"På hver\",\n\t\trepeat_radio_month_start: \"På\",\n\t\trepeat_text_month_day: \"dag hver\",\n\t\trepeat_text_month_count: \"måned\",\n\t\trepeat_text_month_count2_before: \"hver\",\n\t\trepeat_text_month_count2_after: \"måned\",\n\t\trepeat_year_label: \"på\",\n\t\tselect_year_day2: \"i\",\n\t\trepeat_text_year_day: \"dag i\",\n\t\tselect_year_month: \"\",\n\t\trepeat_radio_end: \"Ingen sluttdato\",\n\t\trepeat_text_occurences_count: \"forekomst\",\n\t\trepeat_radio_end3: \"Stop den\",\n\t\trepeat_radio_end2: \"Etter\",\n\t\tmonth_for_recurring: [\"Januar\", \"Februar\", \"Mars\", \"April\", \"Mai\", \"Juni\", \"Juli\", \"August\", \"September\", \"Oktober\", \"November\", \"Desember\"],\n\t\tday_for_recurring: [\"Sondag\", \"Mandag\", \"Tirsdag\", \"Onsdag\", \"Torsdag\", \"Fredag\", \"Lørdag\"]\n\t}\n};\n","export default {\n\tdate: {\n\t\tmonth_full: [\"Januari\", \"Februari\", \"Maart\", \"April\", \"Mei\", \"Juni\", \"Juli\", \"Augustus\", \"September\", \"Oktober\", \"November\", \"December\"],\n\t\tmonth_short: [\"Jan\", \"Feb\", \"mrt\", \"Apr\", \"Mei\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Dec\"],\n\t\tday_full: [\"Zondag\", \"Maandag\", \"Dinsdag\", \"Woensdag\", \"Donderdag\", \"Vrijdag\", \"Zaterdag\"],\n\t\tday_short: [\"Zo\", \"Ma\", \"Di\", \"Wo\", \"Do\", \"Vr\", \"Za\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"Vandaag\",\n\t\tday_tab: \"Dag\",\n\t\tweek_tab: \"Week\",\n\t\tmonth_tab: \"Maand\",\n\t\tnew_event: \"Nieuw item\",\n\t\ticon_save: \"Opslaan\",\n\t\ticon_cancel: \"Annuleren\",\n\t\ticon_details: \"Details\",\n\t\ticon_edit: \"Bewerken\",\n\t\ticon_delete: \"Verwijderen\",\n\t\tconfirm_closing: \"\", //Your changes will be lost, are your sure ?\n\t\tconfirm_deleting: \"Item zal permanent worden verwijderd, doorgaan?\",\n\t\tsection_description: \"Beschrijving\",\n\t\tsection_time: \"Tijd periode\",\n\t\tfull_day: \"Hele dag\",\n\n\t\tconfirm_recurring: \"Wilt u alle terugkerende items bijwerken?\",\n\t\tsection_recurring: \"Item herhalen\",\n\t\tbutton_recurring: \"Uit\",\n\t\tbutton_recurring_open: \"Aan\",\n\t\tbutton_edit_series: \"Bewerk de serie\",\n\t\tbutton_edit_occurrence: \"Bewerk een kopie\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab: \"Agenda\",\n\t\tdate: \"Datum\",\n\t\tdescription: \"Omschrijving\",\n\n\t\t/*year view extension*/\n\t\tyear_tab: \"Jaar\",\n\n\t\t/*week agenda view extension*/\n\t\tweek_agenda_tab: \"Agenda\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"Tabel\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\",\n\n\t\t/* recurring event components */\n\t\trepeat_radio_day: \"Dagelijks\",\n\t\trepeat_radio_week: \"Wekelijks\",\n\t\trepeat_radio_month: \"Maandelijks\",\n\t\trepeat_radio_year: \"Jaarlijks\",\n\t\trepeat_radio_day_type: \"Elke\",\n\t\trepeat_text_day_count: \"dag(en)\",\n\t\trepeat_radio_day_type2: \"Elke werkdag\",\n\t\trepeat_week: \" Herhaal elke\",\n\t\trepeat_text_week_count: \"week op de volgende dagen:\",\n\t\trepeat_radio_month_type: \"Herhaal\",\n\t\trepeat_radio_month_start: \"Op\",\n\t\trepeat_text_month_day: \"dag iedere\",\n\t\trepeat_text_month_count: \"maanden\",\n\t\trepeat_text_month_count2_before: \"iedere\",\n\t\trepeat_text_month_count2_after: \"maanden\",\n\t\trepeat_year_label: \"Op\",\n\t\tselect_year_day2: \"van\",\n\t\trepeat_text_year_day: \"dag\",\n\t\tselect_year_month: \"maand\",\n\t\trepeat_radio_end: \"Geen eind datum\",\n\t\trepeat_text_occurences_count: \"keren\",\n\t\trepeat_radio_end3: \"Eindigd per\",\n\t\trepeat_radio_end2: \"Na\",\n\t\tmonth_for_recurring: [\"Januari\", \"Februari\", \"Maart\", \"April\", \"Mei\", \"Juni\", \"Juli\", \"Augustus\", \"September\", \"Oktober\", \"November\", \"December\"],\n\t\tday_for_recurring: [\"Zondag\", \"Maandag\", \"Dinsdag\", \"Woensdag\", \"Donderdag\", \"Vrijdag\", \"Zaterdag\"]\n\t}\n};\n\n\n","export default {\n\tdate: {\n\t\tmonth_full: [\"Januar\", \"Februar\", \"Mars\", \"April\", \"Mai\", \"Juni\", \"Juli\", \"August\", \"September\", \"Oktober\", \"November\", \"Desember\"],\n\t\tmonth_short: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"Mai\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Des\"],\n\t\tday_full: [\"Søndag\", \"Mandag\", \"Tirsdag\", \"Onsdag\", \"Torsdag\", \"Fredag\", \"Lørdag\"],\n\t\tday_short: [\"Søn\", \"Man\", \"Tir\", \"Ons\", \"Tor\", \"Fre\", \"Lør\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"Idag\",\n\t\tday_tab: \"Dag\",\n\t\tweek_tab: \"Uke\",\n\t\tmonth_tab: \"Måned\",\n\t\tnew_event: \"Ny\",\n\t\ticon_save: \"Lagre\",\n\t\ticon_cancel: \"Avbryt\",\n\t\ticon_details: \"Detaljer\",\n\t\ticon_edit: \"Endre\",\n\t\ticon_delete: \"Slett\",\n\t\tconfirm_closing: \"Endringer blir ikke lagret, er du sikker?\", //Endringer blir ikke lagret, er du sikker?\n\t\tconfirm_deleting: \"Oppføringen vil bli slettet, er du sikker?\",\n\t\tsection_description: \"Beskrivelse\",\n\t\tsection_time: \"Tidsperiode\",\n\t\tfull_day: \"Full dag\",\n\n\t\t/*recurring events*/\n\t\tconfirm_recurring: \"Vil du endre hele settet med repeterende oppføringer?\",\n\t\tsection_recurring: \"Repeterende oppføring\",\n\t\tbutton_recurring: \"Ikke aktiv\",\n\t\tbutton_recurring_open: \"Aktiv\",\n\t\tbutton_edit_series: \"Rediger serien\",\n\t\tbutton_edit_occurrence: \"Redigere en kopi\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab: \"Agenda\",\n\t\tdate: \"Dato\",\n\t\tdescription: \"Beskrivelse\",\n\n\t\t/*year view extension*/\n\t\tyear_tab: \"År\",\n\n\t\t/*week agenda view extension*/\n\t\tweek_agenda_tab: \"Agenda\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"Grid\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\"\n\t}\n};\n\n","export default {\n\tdate: {\n\t\tmonth_full: [\"Styczeń\", \"Luty\", \"Marzec\", \"Kwiecień\", \"Maj\", \"Czerwiec\", \"Lipiec\", \"Sierpień\", \"Wrzesień\", \"Październik\", \"Listopad\", \"Grudzień\"],\n\t\tmonth_short: [\"Sty\", \"Lut\", \"Mar\", \"Kwi\", \"Maj\", \"Cze\", \"Lip\", \"Sie\", \"Wrz\", \"Paź\", \"Lis\", \"Gru\"],\n\t\tday_full: [\"Niedziela\", \"Poniedziałek\", \"Wtorek\", \"Środa\", \"Czwartek\", \"Piątek\", \"Sobota\"],\n\t\tday_short: [\"Nie\", \"Pon\", \"Wto\", \"Śro\", \"Czw\", \"Pią\", \"Sob\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"Dziś\",\n\t\tday_tab: \"Dzień\",\n\t\tweek_tab: \"Tydzień\",\n\t\tmonth_tab: \"Miesiąc\",\n\t\tnew_event: \"Nowe zdarzenie\",\n\t\ticon_save: \"Zapisz\",\n\t\ticon_cancel: \"Anuluj\",\n\t\ticon_details: \"Szczegóły\",\n\t\ticon_edit: \"Edytuj\",\n\t\ticon_delete: \"Usuń\",\n\t\tconfirm_closing: \"\", //Zmiany zostaną usunięte, jesteś pewien?\n\t\tconfirm_deleting: \"Zdarzenie zostanie usunięte na zawsze, kontynuować?\",\n\t\tsection_description: \"Opis\",\n\t\tsection_time: \"Okres czasu\",\n\t\tfull_day: \"Cały dzień\",\n\n\t\t/*recurring events*/\n\t\tconfirm_recurring: \"Czy chcesz edytować cały zbiór powtarzających się zdarzeń?\",\n\t\tsection_recurring: \"Powtórz zdarzenie\",\n\t\tbutton_recurring: \"Nieaktywne\",\n\t\tbutton_recurring_open: \"Aktywne\",\n\t\tbutton_edit_series: \"Edytuj serię\",\n\t\tbutton_edit_occurrence: \"Edytuj kopię\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab: \"Agenda\",\n\t\tdate: \"Data\",\n\t\tdescription: \"Opis\",\n\n\t\t/*year view extension*/\n\t\tyear_tab: \"Rok\",\n\n\t\t/*week agenda view extension*/\n\t\tweek_agenda_tab: \"Agenda\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"Tabela\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\",\n\n\t\t/* recurring event components */\n\t\trepeat_radio_day: \"Codziennie\",\n\t\trepeat_radio_week: \"Co tydzie\",\n\t\trepeat_radio_month: \"Co miesic\",\n\t\trepeat_radio_year: \"Co rok\",\n\t\trepeat_radio_day_type: \"Kadego\",\n\t\trepeat_text_day_count: \"dnia\",\n\t\trepeat_radio_day_type2: \"Kadego dnia roboczego\",\n\t\trepeat_week: \" Powtarzaj kadego\",\n\t\trepeat_text_week_count: \"tygodnia w dni:\",\n\t\trepeat_radio_month_type: \"Powtrz\",\n\t\trepeat_radio_month_start: \"W\",\n\t\trepeat_text_month_day: \"dnia kadego\",\n\t\trepeat_text_month_count: \"miesica\",\n\t\trepeat_text_month_count2_before: \"kadego\",\n\t\trepeat_text_month_count2_after: \"miesica\",\n\t\trepeat_year_label: \"W\",\n\t\tselect_year_day2: \"miesica\",\n\t\trepeat_text_year_day: \"dnia miesica\",\n\t\tselect_year_month: \"\",\n\t\trepeat_radio_end: \"Bez daty kocowej\",\n\t\trepeat_text_occurences_count: \"wystpieniu/ach\",\n\t\trepeat_radio_end3: \"Zakocz w\",\n\t\trepeat_radio_end2: \"Po\",\n\t\tmonth_for_recurring: [\"Stycznia\", \"Lutego\", \"Marca\", \"Kwietnia\", \"Maja\", \"Czerwca\", \"Lipca\", \"Sierpnia\", \"Wrzenia\", \"Padziernka\", \"Listopada\", \"Grudnia\"],\n\t\tday_for_recurring: [\"Niedziela\", \"Poniedziaek\", \"Wtorek\", \"roda\", \"Czwartek\", \"Pitek\", \"Sobota\"]\n\t}\n};\n\n","/*\n\n TRANSLATION BY MATTHEUS PIROVANI RORIZ GONЗALVES\n\n mattheusroriz@hotmail.com / mattheus.pirovani@gmail.com /\n\n www.atrixian.com.br\n\n */\n\nexport default {\n\tdate: {\n\t\tmonth_full: [\"Janeiro\", \"Fevereiro\", \"Março\", \"Abril\", \"Maio\", \"Junho\", \"Julho\", \"Agosto\", \"Setembro\", \"Outubro\", \"Novembro\", \"Dezembro\"],\n\t\tmonth_short: [\"Jan\", \"Fev\", \"Mar\", \"Abr\", \"Mai\", \"Jun\", \"Jul\", \"Ago\", \"Set\", \"Out\", \"Nov\", \"Dez\"],\n\t\tday_full: [\"Domingo\", \"Segunda\", \"Terça\", \"Quarta\", \"Quinta\", \"Sexta\", \"Sábado\"],\n\t\tday_short: [\"Dom\", \"Seg\", \"Ter\", \"Qua\", \"Qui\", \"Sex\", \"Sab\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"Hoje\",\n\t\tday_tab: \"Dia\",\n\t\tweek_tab: \"Semana\",\n\t\tmonth_tab: \"Mês\",\n\t\tnew_event: \"Novo evento\",\n\t\ticon_save: \"Salvar\",\n\t\ticon_cancel: \"Cancelar\",\n\t\ticon_details: \"Detalhes\",\n\t\ticon_edit: \"Editar\",\n\t\ticon_delete: \"Deletar\",\n\t\tconfirm_closing: \"\", //Your changes will be lost, are your sure ?\n\t\tconfirm_deleting: \"Tem certeza que deseja excluir?\",\n\t\tsection_description: \"Descrição\",\n\t\tsection_time: \"Período de tempo\",\n\t\tfull_day: \"Dia inteiro\",\n\n\t\tconfirm_recurring: \"Deseja editar todos esses eventos repetidos?\",\n\t\tsection_recurring: \"Repetir evento\",\n\t\tbutton_recurring: \"Desabilitar\",\n\t\tbutton_recurring_open: \"Habilitar\",\n\t\tbutton_edit_series: \"Editar a série\",\n\t\tbutton_edit_occurrence: \"Editar uma cópia\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab: \"Dia\",\n\t\tdate: \"Data\",\n\t\tdescription: \"Descrição\",\n\n\t\t/*year view extension*/\n\t\tyear_tab: \"Ano\",\n\n\t\t/*week agenda view extension*/\n\t\tweek_agenda_tab: \"Dia\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"Grade\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\",\n\n\t\t/* recurring event components */\n\t\trepeat_radio_day: \"Diário\",\n\t\trepeat_radio_week: \"Semanal\",\n\t\trepeat_radio_month: \"Mensal\",\n\t\trepeat_radio_year: \"Anual\",\n\t\trepeat_radio_day_type: \"Cada\",\n\t\trepeat_text_day_count: \"dia(s)\",\n\t\trepeat_radio_day_type2: \"Cada trabalho diário\",\n\t\trepeat_week: \" Repita cada\",\n\t\trepeat_text_week_count: \"semana:\",\n\t\trepeat_radio_month_type: \"Repetir\",\n\t\trepeat_radio_month_start: \"Em\",\n\t\trepeat_text_month_day: \"todo dia\",\n\t\trepeat_text_month_count: \"mês\",\n\t\trepeat_text_month_count2_before: \"todo\",\n\t\trepeat_text_month_count2_after: \"mês\",\n\t\trepeat_year_label: \"Em\",\n\t\tselect_year_day2: \"of\",\n\t\trepeat_text_year_day: \"dia\",\n\t\tselect_year_month: \"mês\",\n\t\trepeat_radio_end: \"Sem data final\",\n\t\trepeat_text_occurences_count: \"ocorrências\",\n\t\trepeat_radio_end3: \"Fim\",\n\t\trepeat_radio_end2: \"Depois\",\n\t\tmonth_for_recurring: [\"Janeiro\", \"Fevereiro\", \"Março\", \"Abril\", \"Maio\", \"Junho\", \"Julho\", \"Agosto\", \"Setembro\", \"Outubro\", \"Novembro\", \"Dezembro\"],\n\t\tday_for_recurring: [\"Domingo\", \"Segunda\", \"Terça\", \"Quarta\", \"Quinta\", \"Sexta\", \"Sábado\"]\n\t}\n};\n\n\n","/*\n\tTraducere de Ovidiu Lixandru: http://www.madball.ro\n */\n\nexport default {\n\tdate:{\n\t\tmonth_full:[\"Ianuarie\", \"Februarie\", \"Martie\", \"Aprilie\", \"Mai\", \"Iunie\", \"Iulie\", \"August\", \"Septembrie\", \"Octombrie\", \"November\", \"December\"],\n\t\tmonth_short:[\"Ian\", \"Feb\", \"Mar\", \"Apr\", \"Mai\", \"Iun\", \"Iul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n\t\tday_full:[\"Duminica\", \"Luni\", \"Marti\", \"Miercuri\", \"Joi\", \"Vineri\", \"Sambata\"],\n\t\tday_short:[\"Du\", \"Lu\", \"Ma\", \"Mi\", \"Jo\", \"Vi\", \"Sa\"]\n\t},\n\tlabels:{\n\t\tdhx_cal_today_button:\"Astazi\",\n\t\tday_tab:\"Zi\",\n\t\tweek_tab:\"Saptamana\",\n\t\tmonth_tab:\"Luna\",\n\t\tnew_event:\"Eveniment nou\",\n\t\ticon_save:\"Salveaza\",\n\t\ticon_cancel:\"Anuleaza\",\n\t\ticon_details:\"Detalii\",\n\t\ticon_edit:\"Editeaza\",\n\t\ticon_delete:\"Sterge\",\n\t\tconfirm_closing:\"Schimbarile nu vor fi salvate, esti sigur?\",//Your changes will be lost, are your sure ?\n\t\tconfirm_deleting:\"Evenimentul va fi sters permanent, esti sigur?\",\n\t\tsection_description:\"Descriere\",\n\t\tsection_time:\"Interval\",\n\t\tfull_day:\"Toata ziua\",\n\n\t\t/*recurring events*/\n\t\tconfirm_recurring:\"Vrei sa editezi toata seria de evenimente repetate?\",\n\t\tsection_recurring:\"Repetare\",\n\t\tbutton_recurring:\"Dezactivata\",\n\t\tbutton_recurring_open:\"Activata\",\n\t\tbutton_edit_series: \"Editeaza serie\",\n\t\tbutton_edit_occurrence: \"Editeaza doar intrare\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab:\"Agenda\",\n\t\tdate:\"Data\",\n\t\tdescription:\"Descriere\",\n\n\t\t/*year view extension*/\n\t\tyear_tab:\"An\",\n\n\t\t/* week agenda extension */\n\t\tweek_agenda_tab: \"Agenda\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"Lista\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\",\n\n\t\t/* recurring event components */\n\t\trepeat_radio_day: \"Zilnic\",\n\t\trepeat_radio_week: \"Saptamanal\",\n\t\trepeat_radio_month: \"Lunar\",\n\t\trepeat_radio_year: \"Anual\",\n\t\trepeat_radio_day_type: \"La fiecare\",\n\t\trepeat_text_day_count: \"zi(le)\",\n\t\trepeat_radio_day_type2: \"Fiecare zi lucratoare\",\n\t\trepeat_week: \" Repeta la fiecare\",\n\t\trepeat_text_week_count: \"saptamana in urmatoarele zile:\",\n\t\trepeat_radio_month_type: \"Repeta in\",\n\t\trepeat_radio_month_start: \"In a\",\n\t\trepeat_text_month_day: \"zi la fiecare\",\n\t\trepeat_text_month_count: \"luni\",\n\t\trepeat_text_month_count2_before: \"la fiecare\",\n\t\trepeat_text_month_count2_after: \"luni\",\n\t\trepeat_year_label: \"In\",\n\t\tselect_year_day2: \"a lunii\",\n\t\trepeat_text_year_day: \"zi a lunii\",\n\t\tselect_year_month: \"\",\n\t\trepeat_radio_end: \"Fara data de sfarsit\",\n\t\trepeat_text_occurences_count: \"evenimente\",\n\t\trepeat_radio_end3: \"La data\",\n\t\trepeat_radio_end2: \"Dupa\",\n\t\tmonth_for_recurring: [\"Ianuarie\", \"Februarie\", \"Martie\", \"Aprilie\", \"Mai\", \"Iunie\", \"Iulie\", \"August\", \"Septembrie\", \"Octombrie\", \"Noiembrie\", \"Decembrie\"],\n\t\tday_for_recurring: [\"Duminica\", \"Luni\", \"Marti\", \"Miercuri\", \"Joi\", \"Vineri\", \"Sambata\"]\n\t}\n};\n\n","export default {\n\tdate: {\n\t\tmonth_full: [\"Январь\", \"Февраль\", \"Март\", \"Апрель\", \"Maй\", \"Июнь\", \"Июль\", \"Август\", \"Сентябрь\", \"Oктябрь\", \"Ноябрь\", \"Декабрь\"],\n\t\tmonth_short: [\"Янв\", \"Фев\", \"Maр\", \"Aпр\", \"Maй\", \"Июн\", \"Июл\", \"Aвг\", \"Сен\", \"Окт\", \"Ноя\", \"Дек\"],\n\t\tday_full: [ \"Воскресенье\", \"Понедельник\", \"Вторник\", \"Среда\", \"Четверг\", \"Пятница\", \"Суббота\"],\n\t\tday_short: [\"Вс\", \"Пн\", \"Вт\", \"Ср\", \"Чт\", \"Пт\", \"Сб\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"Сегодня\",\n\t\tday_tab: \"День\",\n\t\tweek_tab: \"Неделя\",\n\t\tmonth_tab: \"Месяц\",\n\t\tnew_event: \"Новое событие\",\n\t\ticon_save: \"Сохранить\",\n\t\ticon_cancel: \"Отменить\",\n\t\ticon_details: \"Детали\",\n\t\ticon_edit: \"Изменить\",\n\t\ticon_delete: \"Удалить\",\n\t\tconfirm_closing: \"\", //Ваши изменения будут потеряны, продолжить?\n\t\tconfirm_deleting: \"Событие будет удалено безвозвратно, продолжить?\",\n\t\tsection_description: \"Описание\",\n\t\tsection_time: \"Период времени\",\n\t\tfull_day: \"Весь день\",\n\n\t\tconfirm_recurring: \"Вы хотите изменить всю серию повторяющихся событий?\",\n\t\tsection_recurring: \"Повторение\",\n\t\tbutton_recurring: \"Отключено\",\n\t\tbutton_recurring_open: \"Включено\",\n\t\tbutton_edit_series: \"Редактировать серию\",\n\t\tbutton_edit_occurrence: \"Редактировать экземпляр\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab: \"Список\",\n\t\tdate: \"Дата\",\n\t\tdescription: \"Описание\",\n\n\t\t/*year view extension*/\n\t\tyear_tab: \"Год\",\n\n\t\t/*week agenda view extension*/\n\t\tweek_agenda_tab: \"Список\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"Таблица\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\",\n\n\t\t/* recurring event components */\n\t\trepeat_radio_day: \"День\",\n\t\trepeat_radio_week: \"Неделя\",\n\t\trepeat_radio_month: \"Месяц\",\n\t\trepeat_radio_year: \"Год\",\n\t\trepeat_radio_day_type: \"Каждый\",\n\t\trepeat_text_day_count: \"день\",\n\t\trepeat_radio_day_type2: \"Каждый рабочий день\",\n\t\trepeat_week: \" Повторять каждую\",\n\t\trepeat_text_week_count: \"неделю , в:\",\n\t\trepeat_radio_month_type: \"Повторять\",\n\t\trepeat_radio_month_start: \"\",\n\t\trepeat_text_month_day: \" числа каждый \",\n\t\trepeat_text_month_count: \"месяц\",\n\t\trepeat_text_month_count2_before: \"каждый \",\n\t\trepeat_text_month_count2_after: \"месяц\",\n\t\trepeat_year_label: \"\",\n\t\tselect_year_day2: \"\",\n\t\trepeat_text_year_day: \"день\",\n\t\tselect_year_month: \"\",\n\t\trepeat_radio_end: \"Без даты окончания\",\n\t\trepeat_text_occurences_count: \"повторений\",\n\t\trepeat_radio_end3: \"До \",\n\t\trepeat_radio_end2: \"\",\n\t\tmonth_for_recurring: [\"Января\", \"Февраля\", \"Марта\", \"Апреля\", \"Мая\", \"Июня\", \"Июля\", \"Августа\", \"Сентября\", \"Октября\", \"Ноября\", \"Декабря\"],\n\t\tday_for_recurring: [\"Воскресенье\", \"Понедельник\", \"Вторник\", \"Среду\", \"Четверг\", \"Пятницу\", \"Субботу\"]\n\t}\n};\n","export default {\n\tdate: {\n\t\tmonth_full: [\"Januar\", \"Februar\", \"Marec\", \"April\", \"Maj\", \"Junij\", \"Julij\", \"Avgust\", \"September\", \"Oktober\", \"November\", \"December\"],\n\t\tmonth_short: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"Maj\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Dec\"],\n\t\tday_full: [\"Nedelja\", \"Ponedeljek\", \"Torek\", \"Sreda\", \"Četrtek\", \"Petek\", \"Sobota\"],\n\t\tday_short: [\"Ned\", \"Pon\", \"Tor\", \"Sre\", \"Čet\", \"Pet\", \"Sob\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"Danes\",\n\t\tday_tab: \"Dan\",\n\t\tweek_tab: \"Teden\",\n\t\tmonth_tab: \"Mesec\",\n\t\tnew_event: \"Nov dogodek\",\n\t\ticon_save: \"Shrani\",\n\t\ticon_cancel: \"Prekliči\",\n\t\ticon_details: \"Podrobnosti\",\n\t\ticon_edit: \"Uredi\",\n\t\ticon_delete: \"Izbriši\",\n\t\tconfirm_closing: \"\", //Spremembe ne bodo shranjene. Želite nadaljevati ?\n\t\tconfirm_deleting: \"Dogodek bo izbrisan. Želite nadaljevati?\",\n\t\tsection_description: \"Opis\",\n\t\tsection_time: \"Časovni okvir\",\n\t\tfull_day: \"Ves dan\",\n\n\t\t/*recurring events*/\n\t\tconfirm_recurring: \"Želite urediti celoten set ponavljajočih dogodkov?\",\n\t\tsection_recurring: \"Ponovi dogodek\",\n\t\tbutton_recurring: \"Onemogočeno\",\n\t\tbutton_recurring_open: \"Omogočeno\",\n\t\tbutton_edit_series: \"Edit series\",\n\t\tbutton_edit_occurrence: \"Edit occurrence\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab: \"Zadeva\",\n\t\tdate: \"Datum\",\n\t\tdescription: \"Opis\",\n\n\t\t/*year view extension*/\n\t\tyear_tab: \"Leto\",\n\n\t\t/*week agenda view extension*/\n\t\tweek_agenda_tab: \"Zadeva\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"Miza\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\"\n\t}\n};\n\n","export default {\n\tdate: {\n\t\tmonth_full: [\"Január\", \"Február\", \"Marec\", \"Apríl\", \"Máj\", \"Jún\", \"Júl\", \"August\", \"September\", \"Október\", \"November\", \"December\"],\n\t\tmonth_short: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"Máj\", \"Jún\", \"Júl\", \"Aug\", \"Sept\", \"Okt\", \"Nov\", \"Dec\"],\n\t\tday_full: [\"Nedeľa\", \"Pondelok\", \"Utorok\", \"Streda\", \"Štvrtok\", \"Piatok\", \"Sobota\"],\n\t\tday_short: [\"Ne\", \"Po\", \"Ut\", \"St\", \"Št\", \"Pi\", \"So\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"Dnes\",\n\t\tday_tab: \"Deň\",\n\t\tweek_tab: \"Týždeň\",\n\t\tmonth_tab: \"Mesiac\",\n\t\tnew_event: \"Nová udalosť\",\n\t\ticon_save: \"Uložiť\",\n\t\ticon_cancel: \"Späť\",\n\t\ticon_details: \"Detail\",\n\t\ticon_edit: \"Edituj\",\n\t\ticon_delete: \"Zmazať\",\n\t\tconfirm_closing: \"Vaše zmeny nebudú uložené. Skutočne?\", //Vaše změny budou ztraceny, opravdu ?\n\t\tconfirm_deleting: \"Udalosť bude natrvalo vymazaná. Skutočne?\",\n\t\tsection_description: \"Poznámky\",\n\t\tsection_time: \"Doba platnosti\",\n\n\t\t/*recurring events*/\n\t\tconfirm_recurring: \"Prajete si upraviť celú radu opakovaných udalostí?\",\n\t\tsection_recurring: \"Opakovanie udalosti\",\n\t\tbutton_recurring: \"Vypnuté\",\n\t\tbutton_recurring_open: \"Zapnuté\",\n\t\tbutton_edit_series: \"Upraviť opakovania\",\n\t\tbutton_edit_occurrence: \"Upraviť inštancie\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab: \"Program\",\n\t\tdate: \"Dátum\",\n\t\tdescription: \"Poznámka\",\n\n\t\t/*year view extension*/\n\t\tyear_tab: \"Rok\",\n\t\tfull_day: \"Celý deň\", // Full day\n\n\t\t/*week agenda view extension*/\n\t\tweek_agenda_tab: \"Program\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"Mriežka\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\",\n\n\t\t/* recurring event components */\n\t\trepeat_radio_day: \"Denne\",\n\t\trepeat_radio_week: \"Týždenne\",\n\t\trepeat_radio_month: \"Mesaène\",\n\t\trepeat_radio_year: \"Roène\",\n\t\trepeat_radio_day_type: \"Každý\",\n\t\trepeat_text_day_count: \"deò\",\n\t\trepeat_radio_day_type2: \"Každý prac. deò\",\n\t\trepeat_week: \"Opakova každý\",\n\t\trepeat_text_week_count: \"týždeò v dòoch:\",\n\t\trepeat_radio_month_type: \"Opakova\",\n\t\trepeat_radio_month_start: \"On\",\n\t\trepeat_text_month_day: \"deò každý\",\n\t\trepeat_text_month_count: \"mesiac\",\n\t\trepeat_text_month_count2_before: \"každý\",\n\t\trepeat_text_month_count2_after: \"mesiac\",\n\t\trepeat_year_label: \"On\",\n\t\tselect_year_day2: \"poèas\",\n\t\trepeat_text_year_day: \"deò\",\n\t\tselect_year_month: \"mesiac\",\n\t\trepeat_radio_end: \"Bez dátumu ukonèenia\",\n\t\trepeat_text_occurences_count: \"udalostiach\",\n\t\trepeat_radio_end3: \"Ukonèi\",\n\t\trepeat_radio_end2: \"Po\",\n\t\tmonth_for_recurring: [\"Január\", \"Február\", \"Marec\", \"Apríl\", \"Máj\", \"Jún\", \"Júl\", \"August\", \"September\", \"Október\", \"November\", \"December\"],\n\t\tday_for_recurring: [\"Nede¾a\", \"Pondelok\", \"Utorok\", \"Streda\", \"Štvrtok\", \"Piatok\", \"Sobota\"]\n\t}\n};\n\n","export default {\n\tdate: {\n\t\tmonth_full: [\"Januari\", \"Februari\", \"Mars\", \"April\", \"Maj\", \"Juni\", \"Juli\", \"Augusti\", \"September\", \"Oktober\", \"November\", \"December\"],\n\t\tmonth_short: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"Maj\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Okt\", \"Nov\", \"Dec\"],\n\t\tday_full: [\"Söndag\", \"Måndag\", \"Tisdag\", \"Onsdag\", \"Torsdag\", \"Fredag\", \"Lördag\"],\n\t\tday_short: [\"Sön\", \"Mån\", \"Tis\", \"Ons\", \"Tor\", \"Fre\", \"Lör\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"Idag\",\n\t\tday_tab: \"Dag\",\n\t\tweek_tab: \"Vecka\",\n\t\tmonth_tab: \"Månad\",\n\t\tnew_event: \"Ny händelse\",\n\t\ticon_save: \"Spara\",\n\t\ticon_cancel: \"Ångra\",\n\t\ticon_details: \"Detaljer\",\n\t\ticon_edit: \"Ändra\",\n\t\ticon_delete: \"Ta bort\",\n\t\tconfirm_closing: \"\", //Dina förändingar kommer gå förlorade, är du säker?\n\t\tconfirm_deleting: \"Är du säker på att du vill ta bort händelsen permanent?\",\n\t\tsection_description: \"Beskrivning\",\n\t\tsection_time: \"Tid\",\n\t\tfull_day: \"Hela dagen\",\n\n\t\t/*recurring events*/\n\t\tconfirm_recurring: \"Vill du redigera hela serien med repeterande händelser?\",\n\t\tsection_recurring: \"Upprepa händelse\",\n\t\tbutton_recurring: \"Inaktiverat\",\n\t\tbutton_recurring_open: \"Aktiverat\",\n\t\tbutton_edit_series: \"Redigera serien\",\n\t\tbutton_edit_occurrence: \"Redigera en kopia\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab: \"Dagordning\",\n\t\tdate: \"Datum\",\n\t\tdescription: \"Beskrivning\",\n\n\t\t/*year view extension*/\n\t\tyear_tab: \"År\",\n\n\t\t/*week agenda view extension*/\n\t\tweek_agenda_tab: \"Dagordning\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"Galler\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Dra för att skapa ny\",\n\t\tdrag_to_move:\"Dra för att flytta\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\",\n\n\t\t/* recurring event components */\n\t\trepeat_radio_day: \"Dagligen\",\n\t\trepeat_radio_week: \"Veckovis\",\n\t\trepeat_radio_month: \"Månadsvis\",\n\t\trepeat_radio_year: \"Årligen\",\n\t\trepeat_radio_day_type: \"Var\",\n\t\trepeat_text_day_count: \"dag\",\n\t\trepeat_radio_day_type2: \"Varje arbetsdag\",\n\t\trepeat_week: \" Upprepa var\",\n\t\trepeat_text_week_count: \"vecka dessa dagar:\",\n\t\trepeat_radio_month_type: \"Upprepa\",\n\t\trepeat_radio_month_start: \"Den\",\n\t\trepeat_text_month_day: \"dagen var\",\n\t\trepeat_text_month_count: \"månad\",\n\t\trepeat_text_month_count2_before: \"var\",\n\t\trepeat_text_month_count2_after: \"månad\",\n\t\trepeat_year_label: \"Den\",\n\t\tselect_year_day2: \"i\",\n\t\trepeat_text_year_day: \"dag i\",\n\t\tselect_year_month: \"månad\",\n\t\trepeat_radio_end: \"Inget slutdatum\",\n\t\trepeat_text_occurences_count: \"upprepningar\",\n\t\trepeat_radio_end3: \"Sluta efter\",\n\t\trepeat_radio_end2: \"Efter\",\n\t\tmonth_for_recurring: [\"Januari\", \"Februari\", \"Mars\", \"April\", \"Maj\", \"Juni\", \"Juli\", \"Augusti\", \"September\", \"Oktober\", \"November\", \"December\"],\n\t\tday_for_recurring: [\"Söndag\", \"Måndag\", \"Tisdag\", \"Onsdag\", \"Torsdag\", \"Fredag\", \"Lördag\"]\n\t}\n};\n","export default {\n\tdate: {\n\t\tmonth_full: [\"Ocak\", \"Þubat\", \"Mart\", \"Nisan\", \"Mayýs\", \"Haziran\", \"Temmuz\", \"Aðustos\", \"Eylül\", \"Ekim\", \"Kasým\", \"Aralýk\"],\n\t\tmonth_short: [\"Oca\", \"Þub\", \"Mar\", \"Nis\", \"May\", \"Haz\", \"Tem\", \"Aðu\", \"Eyl\", \"Eki\", \"Kas\", \"Ara\"],\n\t\tday_full: [\"Pazar\", \"Pazartes,\", \"Salý\", \"Çarþamba\", \"Perþembe\", \"Cuma\", \"Cumartesi\"],\n\t\tday_short: [\"Paz\", \"Pts\", \"Sal\", \"Çar\", \"Per\", \"Cum\", \"Cts\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"Bugün\",\n\t\tday_tab: \"Gün\",\n\t\tweek_tab: \"Hafta\",\n\t\tmonth_tab: \"Ay\",\n\t\tnew_event: \"Uygun\",\n\t\ticon_save: \"Kaydet\",\n\t\ticon_cancel: \"Ýptal\",\n\t\ticon_details: \"Detaylar\",\n\t\ticon_edit: \"Düzenle\",\n\t\ticon_delete: \"Sil\",\n\t\tconfirm_closing: \"\", //Your changes will be lost, are your sure ?\n\t\tconfirm_deleting: \"Etkinlik silinecek, devam?\",\n\t\tsection_description: \"Açýklama\",\n\t\tsection_time: \"Zaman aralýðý\",\n\t\tfull_day: \"Tam gün\",\n\n\t\t/*recurring events*/\n\t\tconfirm_recurring: \"Tüm tekrar eden etkinlikler silinecek, devam?\",\n\t\tsection_recurring: \"Etkinliði tekrarla\",\n\t\tbutton_recurring: \"Pasif\",\n\t\tbutton_recurring_open: \"Aktif\",\n\t\tbutton_edit_series: \"Dizi düzenleme\",\n\t\tbutton_edit_occurrence: \"Bir kopyasını düzenleyin\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab: \"Ajanda\",\n\t\tdate: \"Tarih\",\n\t\tdescription: \"Açýklama\",\n\n\t\t/*year view extension*/\n\t\tyear_tab: \"Yýl\",\n\n\t\t/*week agenda view extension*/\n\t\tweek_agenda_tab: \"Ajanda\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"Izgara\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\"\n\t}\n};","export default {\n\tdate: {\n\t\tmonth_full: [\"Січень\", \"Лютий\", \"Березень\", \"Квітень\", \"Травень\", \"Червень\", \"Липень\", \"Серпень\", \"Вересень\", \"Жовтень\", \"Листопад\", \"Грудень\"],\n\t\tmonth_short: [\"Січ\", \"Лют\", \"Бер\", \"Кві\", \"Тра\", \"Чер\", \"Лип\", \"Сер\", \"Вер\", \"Жов\", \"Лис\", \"Гру\"],\n\t\tday_full: [\"Неділя\", \"Понеділок\", \"Вівторок\", \"Середа\", \"Четвер\", \"П'ятниця\", \"Субота\"],\n\t\tday_short: [\"Нед\", \"Пон\", \"Вів\", \"Сер\", \"Чет\", \"Птн\", \"Суб\"]\n\t},\n\tlabels: {\n\t\tdhx_cal_today_button: \"Сьогодні\",\n\t\tday_tab: \"День\",\n\t\tweek_tab: \"Тиждень\",\n\t\tmonth_tab: \"Місяць\",\n\t\tnew_event: \"Нова подія\",\n\t\ticon_save: \"Зберегти\",\n\t\ticon_cancel: \"Відміна\",\n\t\ticon_details: \"Деталі\",\n\t\ticon_edit: \"Редагувати\",\n\t\ticon_delete: \"Вилучити\",\n\t\tconfirm_closing: \"\", //Ваші зміни втратяться. Ви впевнені ?\n\t\tconfirm_deleting: \"Подія вилучиться назавжди. Ви впевнені?\",\n\t\tsection_description: \"Опис\",\n\t\tsection_time: \"Часовий проміжок\",\n\t\tfull_day: \"Весь день\",\n\n\t\t/*recurring events*/\n\t\tconfirm_recurring: \"Хочете редагувати весь перелік повторюваних подій?\",\n\t\tsection_recurring: \"Повторювана подія\",\n\t\tbutton_recurring: \"Відключено\",\n\t\tbutton_recurring_open: \"Включено\",\n\t\tbutton_edit_series: \"Редагувати серію\",\n\t\tbutton_edit_occurrence: \"Редагувати примірник\",\n\n\t\t/*agenda view extension*/\n\t\tagenda_tab: \"Перелік\",\n\t\tdate: \"Дата\",\n\t\tdescription: \"Опис\",\n\n\t\t/*year view extension*/\n\t\tyear_tab: \"Рік\",\n\n\t\t/*week agenda view extension*/\n\t\tweek_agenda_tab: \"Перелік\",\n\n\t\t/*grid view extension*/\n\t\tgrid_tab: \"Таблиця\",\n\n\t\t/* touch tooltip*/\n\t\tdrag_to_create:\"Drag to create\",\n\t\tdrag_to_move:\"Drag to move\",\n\n\t\t/* dhtmlx message default buttons */\n\t\tmessage_ok:\"OK\",\n\t\tmessage_cancel:\"Cancel\",\n\n\t\t/* wai aria labels for non-text controls */\n\t\tnext: \"Next\",\n\t\tprev: \"Previous\",\n\t\tyear: \"Year\",\n\t\tmonth: \"Month\",\n\t\tday: \"Day\",\n\t\thour:\"Hour\",\n\t\tminute: \"Minute\",\n\n\t\t/* recurring event components */\n\t\trepeat_radio_day: \"День\",\n\t\trepeat_radio_week: \"Тиждень\",\n\t\trepeat_radio_month: \"Місяць\",\n\t\trepeat_radio_year: \"Рік\",\n\t\trepeat_radio_day_type: \"Кожний\",\n\t\trepeat_text_day_count: \"день\",\n\t\trepeat_radio_day_type2: \"Кожний робочий день\",\n\t\trepeat_week: \" Повторювати кожен\",\n\t\trepeat_text_week_count: \"тиждень , по:\",\n\t\trepeat_radio_month_type: \"Повторювати\",\n\t\trepeat_radio_month_start: \"\",\n\t\trepeat_text_month_day: \" числа кожний \",\n\t\trepeat_text_month_count: \"місяць\",\n\t\trepeat_text_month_count2_before: \"кожен \",\n\t\trepeat_text_month_count2_after: \"місяць\",\n\t\trepeat_year_label: \"\",\n\t\tselect_year_day2: \"\",\n\t\trepeat_text_year_day: \"день\",\n\t\tselect_year_month: \"\",\n\t\trepeat_radio_end: \"Без дати закінчення\",\n\t\trepeat_text_occurences_count: \"повторень\",\n\t\trepeat_radio_end3: \"До \",\n\t\trepeat_radio_end2: \"\",\n\t\tmonth_for_recurring: [\"січня\", \"лютого\", \"березня\", \"квітня\", \"травня\", \"червня\", \"липня\", \"серпня\", \"вересня\", \"жовтня\", \"листопада\", \"грудня\"],\n\t\tday_for_recurring: [\"Неділям\", \"Понеділкам\", \"Вівторкам\", \"Середам\", \"Четвергам\", \"П'ятницям\", \"Суботам\"]\n\t}\n};\n","import eventable from \"../utils/eventable\";\n\nexport class DatePicker {\n\tconstructor(scheduler, container, state = {}) {\n\t\tthis.state = {\n\t\t\tdate: new Date(),\n\t\t\tmodes: ['days', 'months', 'years'],\n\t\t\tcurrentRange: [],\n\t\t\teventDates: [],\n\t\t\tcurrentModeIndex: 0,\n\t\t\t...state\n\t\t};\n\t\tthis.container = null;\n\t\tthis.element = null;\n\t\tthis.onStateChangeHandlers = [];\n\t\tthis.scheduler = scheduler;\n\t\tthis._domEvents = scheduler._createDomEventScope();\n\t\tthis.state = this.getState();\n\t\teventable(this);\n\t\tif(container){\n\n\t\t\tthis.container = container;\n\t\t\tthis.render(this.container);\n\t\t}\n\n\t\tthis.onStateChange((oldState, newState) => {\n\t\t\tthis.callEvent(\"onStateChange\", [newState, oldState]);\n\t\t});\n\t}\n\n\tgetState() {\n\t\treturn { \n\t\t\t...this.state,\n\t\t\tmode: this.state.modes[this.state.currentModeIndex]\n\t\t};\n\t}\n\n\tsetState(newState) {\n\t\tconst oldState = { ...this.state };\n\t\tif(newState.mode){\n\t\t\tnewState.currentModeIndex = this.state.modes.indexOf(newState.mode);\n\t\t}\n\t\tthis.state = { ...this.state, ...newState };\n\n\t\tthis._notifyStateChange(oldState, this.state);\n\n\t\tif (this.container) {\n\t\t\tthis.render(this.container);\n\t\t}\n\t}\n\n\tonStateChange(handler) {\n\t\tthis.onStateChangeHandlers.push(handler);\n\n\t\t// function to remove the handler\n\t\treturn () => {\n\t\t\tconst index = this.onStateChangeHandlers.indexOf(handler);\n\t\t\tif (index !== -1) {\n\t\t\t\tthis.onStateChangeHandlers.splice(index, 1);\n\t\t\t}\n\t\t};\n\t}\n\n\t_notifyStateChange(oldState, newState) {\n\t\tthis.onStateChangeHandlers.forEach(handler => handler(oldState, newState));\n\t}\n\n\t_adjustDate(direction) {\n\n\t\tconst {mode, date} = this.getState();\n\t\tconst newDate = new Date(date);\n\t\tif (mode === 'days') {\n\t\t\tnewDate.setMonth(date.getMonth() + direction);\n\t\t} else if (mode === 'months') {\n\t\t\tnewDate.setFullYear(date.getFullYear() + direction);\n\t\t} else {\n\t\t\tnewDate.setFullYear(date.getFullYear() + direction * 10);\n\t\t}\n\t\tthis.setState({ date: newDate });\n\t}\n\n\t_toggleMode() {\n\t\tconst newIndex = (this.state.currentModeIndex + 1) % this.state.modes.length;\n\t\tthis.setState({ currentModeIndex: newIndex });\n\t}\n\n\t_renderCalendarHeader(container) {\n\t\tconst {mode, date} = this.getState();\n\n\t\tconst header = document.createElement('div');\n\t\theader.classList.add('dhx_cal_datepicker_header');\n\n\t\tconst backwardArrow = document.createElement('button');\n\n\t\tbackwardArrow.classList.add(\"dhx_cal_datepicker_arrow\", \"scheduler_icon\", \"arrow_left\");\n\t\theader.appendChild(backwardArrow);\n\n\t\tconst monthLabel = document.createElement('div');\n\t\tmonthLabel.classList.add('dhx_cal_datepicker_title');\n\n\t\tif (mode === 'days') {\n\t\t\tmonthLabel.innerText = date.toLocaleString('default', { month: 'long' }) + ' ' + date.getFullYear();\n\t\t} else if (mode === 'months') {\n\t\t\tmonthLabel.innerText = date.getFullYear();\n\t\t} else {\n\t\t\tconst startYear = Math.floor(date.getFullYear() / 10) * 10;\n\t\t\tmonthLabel.innerText = `${startYear} - ${startYear + 9}`;\n\t\t}\n\n\t\tthis._domEvents.attach(monthLabel, \"click\", this._toggleMode.bind(this));\n\t\theader.appendChild(monthLabel);\n\n\t\tconst forwardArrow = document.createElement('button');\n\n\t\tforwardArrow.classList.add(\"dhx_cal_datepicker_arrow\", \"scheduler_icon\", \"arrow_right\");\n\t\theader.appendChild(forwardArrow);\n\n\t\tcontainer.appendChild(header);\n\n\t\tthis._domEvents.attach(backwardArrow, \"click\", this._adjustDate.bind(this, -1));\n\t\tthis._domEvents.attach(forwardArrow, \"click\", this._adjustDate.bind(this, 1));\n\t}\n\n\trender(container) {\n\t\tthis._domEvents.detachAll();\n\t\tthis.container = container || this.container; \n\t\tthis.container.innerHTML = '';\n\n\t\tif(!this.element){\n\t\t\tthis.element = document.createElement(\"div\");\n\t\t\tthis.element.classList.add(\"dhx_cal_datepicker\");\n\t\t}\n\t\tthis.element.innerHTML = '';\n\t\tthis.container.appendChild(this.element);\n\n\t\tthis._renderCalendarHeader(this.element);\n\t\tconst dataContainer = document.createElement(\"div\");\n\t\tdataContainer.classList.add(\"dhx_cal_datepicker_data\");\n\t\tthis.element.appendChild(dataContainer);\n\n\t\tconst {mode} = this.getState();\n\t\tif (mode === 'days') {\n\t\t\tthis._renderDayGrid(dataContainer);\n\t\t} else if (mode === 'months') {\n\t\t\tthis._renderMonthGrid(dataContainer);\n\t\t} else {\n\t\t\tthis._renderYearGrid(dataContainer);\n\t\t}\n\t}\n\n\t_renderDayGridHeader(daysOfWeekContainer) {\n\t\tconst {date} = this.getState();\n\t\tconst scheduler = this.scheduler;\n\n\t\tlet currentDate = scheduler.date.week_start(new Date(date));\n\t\tconst maxDate = scheduler.date.add(scheduler.date.week_start(new Date(date)), 1, 'week');\n\n\t\tdaysOfWeekContainer.classList.add('dhx_cal_datepicker_days');\n\n\t\tconst labelFormat = scheduler.date.date_to_str(\"%D\");\n\n\t\twhile (currentDate.valueOf() < maxDate.valueOf()) {\n\t\t\tconst label = labelFormat(currentDate);\n\n\t\t\tconst dayElement = document.createElement('div');\n\t\t\tdayElement.setAttribute(\"data-day\", currentDate.getDay());\n\t\t\tdayElement.classList.add('dhx_cal_datepicker_dayname');\n\t\t\tdayElement.innerText = label;\n\t\t\tdaysOfWeekContainer.appendChild(dayElement);\n\n\t\t\tcurrentDate = scheduler.date.add(currentDate, 1, 'day');\n\t\t}\n\n\t}\n\n\t_weeksBetween(min, max) {\n\t\tconst scheduler = this.scheduler;\n\t\tlet weeks = 0;\n\t\tlet currWeek = new Date(min);\n\t\twhile(currWeek.valueOf() < max.valueOf()){\n\t\t\tweeks += 1;\n\t\t\tcurrWeek = scheduler.date.week_start(scheduler.date.add(currWeek, 1, \"week\"));\n\t\t}\n\t\treturn weeks;\n\t}\n\n\t_renderDayGrid(container) {\n\t\tconst {date, currentRange, eventDates, minWeeks} = this.getState();\n\n\t\tlet minSchedulerDate = currentRange[0];\n\t\tlet maxSchedulerDate = currentRange[1];\n\n\t\tconst eventDaysTable = eventDates.reduce((acc, date) => {\n\t\t\tconst dayStart = this.scheduler.date.day_start(new Date(date));\n\t\t\tacc[dayStart.valueOf()] = true;\n\t\t\treturn acc;\n\t\t}, {});\n\n\n\t\t// Render Days of the Week\n\t\tconst daysOfWeekContainer = document.createElement('div');\n\t\tthis._renderDayGridHeader(daysOfWeekContainer);\n\t\tcontainer.appendChild(daysOfWeekContainer);\n\n\t\tconst scheduler = this.scheduler;\n\t\tconst firstDate = scheduler.date.week_start(scheduler.date.month_start(new Date(date)));\n\t\tconst monthStart = scheduler.date.month_start(new Date(date));\n\t\tconst monthEnd = scheduler.date.add(scheduler.date.month_start(new Date(date)), 1, 'month');\n\t\tlet lastDate = scheduler.date.add(scheduler.date.month_start(new Date(date)), 1, 'month');\n\t\tif(lastDate.getDay() !== 0){\n\t\t\tlastDate = scheduler.date.add(scheduler.date.week_start(lastDate), 1, \"week\");\n\t\t}\n\n\t\tlet weeks = this._weeksBetween(firstDate, lastDate);\n\t\tif(minWeeks && weeks < minWeeks){\n\t\t\tlastDate = scheduler.date.add(lastDate, (minWeeks - weeks), \"week\");\n\t\t}\n\n\t\tlet currDate = firstDate;\n\n\t\tconst dayGridContainer = document.createElement('div');\n\t\tdayGridContainer.classList.add('dhx_cal_datepicker_days');\n\n\t\tthis._domEvents.attach(dayGridContainer, \"click\", (event) => {\n\t\t\tconst dateCell = event.target.closest(\"[data-cell-date]\");\n\t\t\tconst date = new Date(dateCell.getAttribute(\"data-cell-date\"));\n\t\t\tthis.callEvent(\"onDateClick\", [date, event]);\n\t\t});\n\n\t\twhile(currDate.valueOf() < lastDate.valueOf()){\n\t\t\tconst dayElement = document.createElement('div');\n\t\t\tdayElement.setAttribute(\"data-cell-date\", scheduler.templates.format_date(currDate));\n\t\t\tdayElement.setAttribute(\"data-day\", currDate.getDay());\n\t\t\tdayElement.innerHTML = currDate.getDate();\n\n\t\t\tif(currDate.valueOf() < monthStart.valueOf()){\n\t\t\t\tdayElement.classList.add('dhx_before');\n\t\t\t}else if(currDate.valueOf() >= monthEnd.valueOf()){\t\n\t\t\t\tdayElement.classList.add('dhx_after');\n\t\t\t}\n\n\t\t\tif(currDate.getDay() === 0 || currDate.getDay() === 6){\n\t\t\t\tdayElement.classList.add(\"dhx_cal_datepicker_weekend\");\n\t\t\t}\n\n\t\t\tif(minSchedulerDate && maxSchedulerDate){\n\t\t\t\tif(currDate.valueOf() >= minSchedulerDate.valueOf() && currDate.valueOf() < maxSchedulerDate.valueOf()){\n\t\t\t\t\tdayElement.classList.add('dhx_cal_datepicker_current');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(eventDaysTable[currDate.valueOf()]){\n\t\t\t\tdayElement.classList.add('dhx_cal_datepicker_event');\n\t\t\t}\n\t\t\t\n\t\t\tdayElement.classList.add('dhx_cal_datepicker_date');\n\n\t\t\tdayGridContainer.appendChild(dayElement);\n\t\t\tcurrDate = scheduler.date.add(currDate, 1, 'day');\n\t\t}\n\n\t\tcontainer.appendChild(dayGridContainer);\n\n\t}\n\n\t_renderMonthGrid(container) {\n\t\tconst {date} = this.getState();\n\n\t\tconst wrapper = document.createElement('div');\n\t\twrapper.classList.add(\"dhx_cal_datepicker_months\");\n\n\t\tconst months = [];\n\t\tfor(let i = 0; i < 12; i++){\n\t\t\tmonths.push(new Date(date.getFullYear(), i, 1));\n\t\t}\n\n\t\tconst formatLabel = this.scheduler.date.date_to_str(\"%M\");\n\t\tmonths.forEach(month => {\n\t\t\tconst monthElement = document.createElement('div');\n\t\t\tmonthElement.classList.add('dhx_cal_datepicker_month');\n\t\t\tif(date.getMonth() === month.getMonth()){\n\t\t\t\tmonthElement.classList.add('dhx_cal_datepicker_current');\n\t\t\t}\n\t\t\tmonthElement.setAttribute(\"data-month\", month.getMonth());\n\t\t\tmonthElement.innerHTML = formatLabel(month);\n\t\t\tthis._domEvents.attach(monthElement, \"click\", () => {\n\t\t\t\tconst newDate = new Date(month);\n\t\t\t\tthis.setState({\n\t\t\t\t\tdate: newDate,\n\t\t\t\t\tmode: 'days'\n\t\t\t\t});\n\t\t\t});\n\t\t\twrapper.appendChild(monthElement);\n\t\t});\n\t\tcontainer.appendChild(wrapper);\n\n\t\tconst doneArea = document.createElement(\"div\");\n\t\tdoneArea.classList.add(\"dhx_cal_datepicker_done\");\n\t\tconst doneBtn = document.createElement(\"button\");\n\t\tdoneBtn.innerText = \"Done\";\n\t\tdoneBtn.classList.add(\"dhx_cal_datepicker_done_btn\");\n\t\tthis._domEvents.attach(doneBtn, \"click\", () => {\n\t\t\tthis.setState({\n\t\t\t\tmode: 'days'\n\t\t\t});\n\t\t});\n\t\tdoneArea.appendChild(doneBtn);\n\t\tcontainer.appendChild(doneArea);\n\t}\n\n\t_renderYearGrid(container) {\n\t\tconst {date} = this.getState();\n\t\tconst startYear = Math.floor(date.getFullYear() / 10) * 10;\n\t\t\n\t\tconst wrapper = document.createElement('div');\n\t\twrapper.classList.add(\"dhx_cal_datepicker_years\");\n\t\tfor (let i = startYear - 1; i <= startYear + 10; i++) {\n\t\t\tconst yearElement = document.createElement('div');\n\t\t\tyearElement.innerText = i;\n\t\t\tyearElement.classList.add('dhx_cal_datepicker_year');\n\t\t\tyearElement.setAttribute(\"data-year\", i);\n\t\t\tif(date.getFullYear() === i){\n\t\t\t\tyearElement.classList.add('dhx_cal_datepicker_current');\n\t\t\t}\n\t\t\tthis._domEvents.attach(yearElement, \"click\", () => {\n\t\t\t\tthis.setState({\n\t\t\t\t\tdate: new Date(i, date.getMonth(), 1),\n\t\t\t\t\tmode: 'months'\n\t\t\t\t});\n\t\t\t});\n\t\t\twrapper.appendChild(yearElement);\n\t\t\t\n\t\t}\n\t\tcontainer.appendChild(wrapper);\n\n\t\tconst doneArea = document.createElement(\"div\");\n\t\tdoneArea.classList.add(\"dhx_cal_datepicker_done\");\n\t\tconst doneBtn = document.createElement(\"button\");\n\t\tdoneBtn.innerText = \"Done\";\n\t\tdoneBtn.classList.add(\"dhx_cal_datepicker_done_btn\");\n\t\tthis._domEvents.attach(doneBtn, \"click\", () => {\n\t\t\tthis.setState({\n\t\t\t\tmode: 'months'\n\t\t\t});\n\t\t});\n\t\tdoneArea.appendChild(doneBtn);\n\t\tcontainer.appendChild(doneArea);\n\t}\n\n\tdestructor(){\n\t\tthis.onStateChangeHandlers = [];\n\t\tif(this.element){\n\t\t\tthis.element.innerHTML = '';\n\t\t\tthis.element.remove();\n\t\t}\n\n\t\tthis._domEvents.detachAll();\n\t\tthis.callEvent(\"onDestroy\", []);\n\t\tthis.detachAllEvents();\n\n\t\tthis.scheduler = null;\n\t}\n}","// import \"./css/dhtmlxscheduler_terrace\";\n// import \"./css/dhtmlxscheduler_material\";\n// import \"./css/dhtmlxscheduler_material_nofont\";\n// import \"./css/dhtmlxscheduler_flat\";\n// import \"./css/dhtmlxscheduler_contrast_black\";\n// import \"./css/dhtmlxscheduler_contrast_white\";\n\n\nimport assert from \"./core/common/assert\";\nimport common_errors from \"./core/common_errors\";\nimport connector from \"./core/connector\";\nimport schedulerCore from \"./core/scheduler\";\nimport common from \"./core/common\";\nimport wai_aria from \"./core/wai_aria\";\nimport utils from \"./core/utils/utils\";\nimport dom_helpers from \"./core/utils/dom_helpers\";\nimport env from \"./utils/env\";\nimport destructor from \"./core/destructor\";\nimport ajax from \"./core/utils/ajax\";\nimport base from \"./core/base\";\nimport config from \"./core/config\";\nimport event from \"./core/event\";\nimport event_highlight from \"./core/event_highlight\";\nimport load from \"./core/load\";\nimport lightbox from \"./core/lightbox\";\nimport touch from \"./core/touch\";\nimport dhtmlx_suite_hooks from \"./core/dhtmlx/dhtmlx_suite_hooks\";\nimport skins from \"./core/skins\";\nimport jquery from \"./core/jquery\";\nimport delay_render from \"./core/delay_render\";\nimport dataProcessorExtend from \"./core/dataprocessor/dataprocessor\";\nimport message from \"./core/message\";\nimport i18nFactory from \"./locale\";\n\nimport voidFirst from \"./publish_helpers/void_script_first\";\nimport voidSecond from \"./publish_helpers/void_script_second\";\nimport voidThird from \"./publish_helpers/void_script_third\";\n\n//import datepickerHeader from \"./core/clickable_header\";\n\nimport { DatePicker } from \"./core/datepicker\";\n\nexport default function(extensionManager) {\n\n\tconst scheduler = { version: VERSION };\n\t\n\tcommon_errors(scheduler);\n\tcommon(scheduler);\n\tschedulerCore(scheduler);\n\twai_aria(scheduler);\n\t//utils(scheduler);\n\n\tscheduler.utils = utils;\n\tscheduler.$domHelpers = dom_helpers;\n\tscheduler.utils.dom = dom_helpers;\n\tscheduler.uid = utils.uid;\n\tscheduler.mixin = utils.mixin;\n\tscheduler.defined = utils.defined;\n\tscheduler.assert = assert(scheduler);\n\tscheduler.copy = utils.copy;\n\n\tscheduler._createDatePicker = function(container, config){\n\t\treturn new DatePicker(scheduler, container, config);\n\t};\n\n\t//datepickerHeader(scheduler);\n\n\n\t//old api compatibility\n\tscheduler._getFocusableNodes = dom_helpers.getFocusableNodes;\n\tscheduler._getClassName = dom_helpers.getClassName;\n\tscheduler._locate_css = dom_helpers.locateCss;\n\n\tconst messageApi = message(scheduler);\n\tscheduler.utils.mixin(scheduler, messageApi);\n\n\tscheduler.env = scheduler.$env = env;\n\tscheduler.Promise = window.Promise;\n\tdestructor(scheduler);\n\tajax(scheduler);\n\tvoidFirst(scheduler);\n\tbase(scheduler);\n\tconfig(scheduler);\n\tevent(scheduler);\n\tevent_highlight(scheduler);\n\tload(scheduler);\n\tlightbox(scheduler);\n\ttouch(scheduler);\n\tdhtmlx_suite_hooks(scheduler);\n\tvoidSecond(scheduler);\n\tskins(scheduler);\n\tjquery(scheduler);\n\tdelay_render(scheduler);\n\tdataProcessorExtend(scheduler);\n\tvoidThird(scheduler);\n\tconnector(scheduler);\n\tconst i18n = i18nFactory();\n\tscheduler.i18n = {\n\t\taddLocale: i18n.addLocale,\n\t\tsetLocale: function(locale){\n\t\t\tif(typeof locale === \"string\"){\n\t\t\t\tvar localeObject = i18n.getLocale(locale);\n\t\t\t\tif(!localeObject){\n\t\t\t\t\tlocaleObject = i18n.getLocale(\"en\");\n\t\t\t\t}\n\n\t\t\t\tscheduler.locale = localeObject;\n\t\t\t}else if(locale){\n\t\t\t\tif(!scheduler.locale){\n\t\t\t\t\tscheduler.locale = locale;\n\t\t\t\t}else{\n\t\t\t\t\tfor(var i in locale){\n\t\t\t\t\t\tif(locale[i] && typeof locale[i] === \"object\"){\n\t\t\t\t\t\t\tif(!scheduler.locale[i]){\n\t\t\t\t\t\t\t\tscheduler.locale[i] = {};\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tscheduler.mixin(scheduler.locale[i], locale[i], true);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tscheduler.locale[i] = locale[i];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar labels = scheduler.locale.labels;\n\t\t\tlabels.dhx_save_btn \t= labels.icon_save;\n\t\t\tlabels.dhx_cancel_btn \t= labels.icon_cancel;\n\t\t\tlabels.dhx_delete_btn \t= labels.icon_delete;\n\n\t\t\tif(scheduler.$container){\n\t\t\t\tscheduler.get_elements();\n\t\t\t}\n\t\t\t\n\t\t},\n\t\tgetLocale: i18n.getLocale\n\t};\n\tscheduler.i18n.setLocale(\"en\");\n\n\tscheduler.ext = {};\n\n\tconst activePlugins = {};\n\tscheduler.plugins = function(config){\n\t\tconst extensionList = getExtensionList(config, {\n\t\t\t\ttreetimeline: [\"timeline\"],\n\t\t\t\tdaytimeline: [\"timeline\"],\n\t\t\t\touterdrag: [\"legacy\"]\n\t\t\t}, {\n\t\t\t\tlegacy: 1,\n\t\t\t\tlimit: 1,\n\t\t\t\ttimeline: 2,\n\t\t\t\tdaytimeline: 3,\n\t\t\t\ttreetimeline: 3,\n\t\t\t\touterdrag:6\n\t\t\t});\n\n\t\textensionList.forEach(function(name){\n\t\t\tif(!activePlugins[name]){\n\t\t\t\tconst plugin = extensionManager.getExtension(name);\n\t\t\t\tif(plugin){\n\t\t\t\t\tplugin(scheduler);\n\t\t\t\t\tactivePlugins[name] = true;\n\t\t\t\t}else{\n\t\t\t\t\tthrow new Error(\"unknown plugin \" + name);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n\tfunction getExtensionList(config, dependencies, priorities){\n\t\tconst result = [];\n\n\t\tfor(const i in config){\n\t\t\tif(config[i]){\n\t\t\t\tconst extension = i.toLowerCase();\n\t\t\t\tif(dependencies[extension]){\n\t\t\t\t\tdependencies[extension].forEach(function(dep){\n\t\t\t\t\t\tconst dependencyName = dep.toLowerCase();\n\t\t\t\t\t\tif(!config[dependencyName]){\n\t\t\t\t\t\t\tresult.push(dependencyName);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tresult.push(extension);\n\t\t\t}\n\t\t}\n\t\t\n\t\tresult.sort(function(a, b){\n\t\t\tconst orderA = priorities[a] || 0;\n\t\t\tconst orderB = priorities[b] || 0;\n\t\t\tif(orderA > orderB){\n\t\t\t\treturn 1;\n\t\t\t}else if(orderA < orderB){\n\t\t\t\treturn -1;\n\t\t\t}else{\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t});\n\n\t\treturn result;\n\t}\n\n\treturn scheduler;\n\n}","export default function extend(scheduler) {\n\nvar commonViews = {\n\tagenda: \"https://docs.dhtmlx.com/scheduler/agenda_view.html\",\n\tgrid: \"https://docs.dhtmlx.com/scheduler/grid_view.html\",\n\tmap: \"https://docs.dhtmlx.com/scheduler/map_view.html\",\n\tunit: \"https://docs.dhtmlx.com/scheduler/units_view.html\",\n\ttimeline: \"https://docs.dhtmlx.com/scheduler/timeline_view.html\",\n\tweek_agenda: \"https://docs.dhtmlx.com/scheduler/weekagenda_view.html\",\n\tyear: \"https://docs.dhtmlx.com/scheduler/year_view.html\",\n\tanythingElse: \"https://docs.dhtmlx.com/scheduler/views.html\"\n};\n\nvar requiredExtensions = {\n\tagenda: \"ext/dhtmlxscheduler_agenda_view.js\",\n\tgrid: \"ext/dhtmlxscheduler_grid_view.js\",\n\tmap: \"ext/dhtmlxscheduler_map_view.js\",\n\tunit: \"ext/dhtmlxscheduler_units.js\",\n\ttimeline: \"ext/dhtmlxscheduler_timeline.js, ext/dhtmlxscheduler_treetimeline.js, ext/dhtmlxscheduler_daytimeline.js\",\n\tweek_agenda: \"ext/dhtmlxscheduler_week_agenda.js\",\n\tyear: \"ext/dhtmlxscheduler_year_view.js\",\n\tlimit: \"ext/dhtmlxscheduler_limit.js\"\n};\n\nscheduler._commonErrorMessages = {\n\tunknownView: function(view){\n\t\tvar relatedDoc = \"Related docs: \" + (commonViews[view] || commonViews.anythingElse); \n\t\tvar relatedExtension = requiredExtensions[view] ? (\"You're probably missing \" + requiredExtensions[view] + \".\") : \"\";\n\t\treturn (\n\t\t\t\"`\"+view+\"` view is not defined. \\n\" +\n\t\t\t\"Please check parameters you pass to `scheduler.init` or `scheduler.setCurrentView` in your code and ensure you've imported appropriate extensions. \\n\" + \n\t\t\trelatedDoc + \"\\n\" + (relatedExtension ? (relatedExtension + \"\\n\") : \"\"));\n\t},\n\tcollapsedContainer: function(div){\n\t\treturn \"Scheduler container height is set to *100%* but the rendered height is zero and the scheduler is not visible. \\n\"+\n\t\t\"Make sure that the container has some initial height or use different units. For example:\\n\" +\n\t\t\"
\\n\";\n\t}\n};\n\nscheduler.createTimelineView = function() {\n\tthrow new Error(\"scheduler.createTimelineView is not implemented. Be sure to add the required extension: \" + requiredExtensions.timeline + \n\t\"\\n\" +\n\t\"Related docs: \" + commonViews.timeline);\n};\n\nscheduler.createUnitsView = function() {\n\tthrow new Error(\"scheduler.createUnitsView is not implemented. Be sure to add the required extension: \" + requiredExtensions.unit + \n\t\"\\n\" +\n\t\"Related docs: \" + commonViews.unit);\n};\n\nscheduler.createGridView = function() {\n\tthrow new Error(\"scheduler.createGridView is not implemented. Be sure to add the required extension: \" + requiredExtensions.grid + \n\t\"\\n\" +\n\t\"Related docs: \" + commonViews.grid);\n};\n\nscheduler.addMarkedTimespan = function() {\n\tthrow new Error(\"scheduler.addMarkedTimespan is not implemented. Be sure to add the required extension: ext/dhtmlxscheduler_limit.js\" + \n\t\"\\n\" +\n\t\"Related docs: https://docs.dhtmlx.com/scheduler/limits.html\");\n};\n\nscheduler.renderCalendar = function() {\n\tthrow new Error(\"scheduler.renderCalendar is not implemented. Be sure to add the required extension: ext/dhtmlxscheduler_minical.js\" + \n\t\"\\n\" +\n\t\"https://docs.dhtmlx.com/scheduler/minicalendar.html\");\n};\n\nscheduler.exportToPNG = function() {\n\tthrow new Error([\n\t\t\"scheduler.exportToPNG is not implemented.\",\n\t\t\"This feature requires an additional module, be sure to check the related doc here https://docs.dhtmlx.com/scheduler/png.html\",\n\t\t\"Licensing info: https://dhtmlx.com/docs/products/dhtmlxScheduler/export.shtml\"\n\t].join(\"\\n\"));\n};\n\nscheduler.exportToPDF = function() {\n\tthrow new Error([\n\t\t\"scheduler.exportToPDF is not implemented.\",\n\t\t\"This feature requires an additional module, be sure to check the related doc here https://docs.dhtmlx.com/scheduler/pdf.html\",\n\t\t\"Licensing info: https://dhtmlx.com/docs/products/dhtmlxScheduler/export.shtml\"\n\t].join(\"\\n\"));\n};\n\n\n}","\nimport nav_bar from \"./nav_bar\";\nimport scheduler_resize_listener from \"./scheduler_resize_listener\";\nimport eventable from \"../utils/eventable\";\n\n\nexport default function extend(scheduler) {\n\neventable(scheduler);\n\nnav_bar(scheduler);\n\nscheduler._detachDomEvent = function(el, event, handler){\n\tif (el.removeEventListener){\n\t\tel.removeEventListener(event, handler, false);\n\n\t}else if (el.detachEvent){\n\t\tel.detachEvent(\"on\"+event, handler);\n\t}\n};\n\n\nscheduler._init_once = function(){\n\tscheduler_resize_listener(scheduler);\n\n\tscheduler._init_once = function(){};\n};\n\nvar layout = {\n\t\"navbar\": {\n\t\trender: function (config) {\n\t\t\treturn scheduler._init_nav_bar(config);\n\t\t}\n\t},\n\t\"header\": {\n\t\trender: function (config) {\n\t\t\tvar element = document.createElement(\"div\");\n\t\t\telement.className = \"dhx_cal_header\";\n\t\t\treturn element;\n\t\t}\n\t},\n\t\"dataArea\": {\n\t\trender: function (config) {\n\t\t\tvar element = document.createElement(\"div\");\n\t\t\telement.className = \"dhx_cal_data\";\n\t\t\treturn element;\n\t\t}\n\t},\n\t\"html_element\": {\n\t\trender: function (config) {\n\t\t\treturn config.html;\n\t\t}\n\t}\n};\n\nfunction hasSchedulerMarkup(element){\n\treturn !!(\n\t\telement.querySelector(\".dhx_cal_header\") &&\n\t\telement.querySelector(\".dhx_cal_data\") &&\n\t\telement.querySelector(\".dhx_cal_navline\")\n\t\t);\n}\n\nfunction createDefaultHeader(scheduler){\n\tvar views = [\n\t\t\"day\",\n\t\t\"week\",\n\t\t\"month\"\n\t];\n\tvar date = [\n\t\t\"date\"\n\t];\n\tvar nav = [\n\t\t\"prev\",\n\t\t\"today\",\n\t\t\"next\"\n\t];\n\n\tif(scheduler.matrix){\n\t\tfor(var i in scheduler.matrix){\n\t\t\tviews.push(i);\n\t\t}\n\t}\n\tif(scheduler._props){\n\t\tfor(var i in scheduler._props){\n\t\t\tviews.push(i);\n\t\t}\n\t}\n\n\tif(scheduler._grid && scheduler._grid.names){\n\t\tfor(var i in scheduler._grid.names){\n\t\t\tviews.push(i);\n\t\t}\n\t}\n\n\tvar optionalViews = [\n\t\t\"map\",\n\t\t\"agenda\",\n\t\t\"week_agenda\",\n\t\t\"year\"\n\t];\n\n\toptionalViews.forEach(function(viewName){\n\t\tif(scheduler[viewName + \"_view\"]){\n\t\t\tviews.push(viewName);\n\t\t}\n\t});\n\n\treturn views.concat(date).concat(nav);\n}\n\nscheduler.init=function(id,date,mode){\n\tif(this.$destroyed){\n\t\treturn; // not have errors when try to reinit destroyed scheduler\n\t}\n\tdate=date||(scheduler._currentDate());\n\tmode=mode||\"week\";\n\n\tif(this._obj){\n\t\tthis.unset_actions();\n\t}\n\n\tthis._obj=(typeof id == \"string\")?document.getElementById(id):id;\n\tthis.$container = this._obj;\n\tthis.$root = this._obj;\n\n\tif(!this.$container.offsetHeight && this.$container.offsetWidth && this.$container.style.height === \"100%\"){\n\t\t// scheduler container has zero height and non-zero width\n\t\twindow.console.error(scheduler._commonErrorMessages.collapsedContainer(), this.$container);\n\t}\n\n\tif(this.config.wai_aria_attributes && this.config.wai_aria_application_role){\n\t\tthis.$container.setAttribute(\"role\", \"application\");\n\t}\n\n\tif(!this.config.header && !hasSchedulerMarkup(this.$container)){\n\t\t// if no header config and no required markup - use the default header\n\t\t// so the scheduler could be initialized in an empty div\n\t\tthis.config.header = createDefaultHeader(this);\n\t\twindow.console.log([// jshint ignore:line\n\t\t\t\"Required DOM elements are missing from the scheduler container and **scheduler.config.header** is not specified.\",\n\t\t\t\"Using a default header configuration: \",\n\t\t\t\"scheduler.config.header = \" + JSON.stringify(this.config.header, null, 2),\n\t\t\t\"Check this article for the details: https://docs.dhtmlx.com/scheduler/initialization.html\"\n\t\t].join(\"\\n\"));// jshint ignore:line\n\t}\n\n\tif (this.config.header) {\n\t\tthis.$container.innerHTML = \"\";\n\t\tthis.$container.classList.add(\"dhx_cal_container\");\n\t\tif(this.config.header.height){\n\t\t\tthis.xy.nav_height = this.config.header.height;\n\t\t}\n\t\tthis.$container.appendChild(layout.navbar.render(this.config.header));\n\t\tthis.$container.appendChild(layout.header.render());\n\t\tthis.$container.appendChild(layout.dataArea.render());\n\t} else {\n\t\t// if no header config provided - make sure scheduler container has all necessary elements\n\t\tif(!hasSchedulerMarkup(this.$container)){\n\t\t\tthrow new Error([\n\t\t\t\t\"Required DOM elements are missing from the scheduler container.\",\n\t\t\t\t\"Be sure to either specify them manually in the markup: https://docs.dhtmlx.com/scheduler/initialization.html#initializingschedulerviamarkup\",\n\t\t\t\t\"Or to use **scheduler.config.header** setting so they could be created automatically: https://docs.dhtmlx.com/scheduler/initialization.html#initializingschedulerviaheaderconfig\"\n\t\t\t].join(\"\\n\"));\n\t\t}\n\t}\n\n\tif (this.config.rtl) this.$container.className += \" dhx_cal_container_rtl\";\n\n\t//hook for terrace skin\n\tif (this._skin_init)\n\t\tscheduler._skin_init();\n\n\tscheduler.date.init();\n\n\tthis._scroll=true;\n\n\tthis._els=[];\n\tthis.get_elements();\n\tthis.init_templates();\n\tthis.set_actions();\n\n\tthis._init_once();\n\tthis._init_touch_events();\n\n\tthis.set_sizes();\n\tscheduler.callEvent('onSchedulerReady', []);\n\tscheduler.$initialized = true;\n\tthis.setCurrentView(date,mode);\n\n};\n\nscheduler.xy={\n\tmin_event_height:20,\n\tbar_height: 24,\n\tscale_width:50,\n\tscroll_width:18,\n\tscale_height:20,\n\tmonth_scale_height:20,\n\tmenu_width:25,\n\tmargin_top:0,\n\tmargin_left:0,\n\teditor_width:140,\n\tmonth_head_height:22,\n\tevent_header_height: 14\n};\nscheduler.keys={\n\tedit_save:13,\n\tedit_cancel:27\n};\n\nscheduler.bind = function bind(functor, object){\n\tif(functor.bind)\n\t\treturn functor.bind(object);\n\telse\n\t\treturn function(){ return functor.apply(object,arguments); };\n};\n\nscheduler.set_sizes=function(){\n\n\tvar w = this._x = this._obj.clientWidth-this.xy.margin_left;\n\n\t//not-table mode always has scroll - need to be fixed in future\n\tvar scale_x=this._table_view?0:(this.xy.scale_width+this.xy.scroll_width);\n\n\tvar materialScalePlaceholder = this.$container.querySelector(\".dhx_cal_scale_placeholder\");\n\tif(scheduler._is_material_skin()){\n\t\tif(!materialScalePlaceholder) {\n\t\t\tmaterialScalePlaceholder = document.createElement(\"div\");\n\t\t\tmaterialScalePlaceholder.className = \"dhx_cal_scale_placeholder\";\n\t\t\tthis.$container.insertBefore(materialScalePlaceholder, this._els[\"dhx_cal_header\"][0]);\n\t\t}\n\t\tmaterialScalePlaceholder.style.display = \"block\";\n\n\t\tthis.set_xy(materialScalePlaceholder,w,this.xy.scale_height + 1,0, this._els[\"dhx_cal_header\"][0].offsetTop);\n\n\t}else{\n\t\tif(materialScalePlaceholder){\n\t\t\tmaterialScalePlaceholder.parentNode.removeChild(materialScalePlaceholder);\n\t\t}\n\t}\n\n\tif (this._lightbox) {\n\t\tif (scheduler.$container.offsetWidth < 1200) {\n\t\t} else {\n\t\t\tthis._setLbPosition(document.querySelector(\".dhx_cal_light\"));\n\t\t}\n\t}\n\n\tthis._data_width = w-scale_x;\n\n\tthis._els[\"dhx_cal_navline\"][0].style.width = w + \"px\";\n\tconst header = this._els[\"dhx_cal_header\"][0];\n\tthis.set_xy(header, this._data_width, this.xy.scale_height);\n\t// this._els[\"dhx_cal_header\"][0].style.marginLeft = `${scheduler.xy.scale_width}px`;\n\theader.style.left = ``;\n\theader.style.right = ``;\n\tif(!this._table_view){\n\t\tif(this.config.rtl){\n\t\t\theader.style.right = `${this.xy.scale_width}px`;\n\t\t}else{\n\t\t\theader.style.left = `${this.xy.scale_width}px`;\n\t\t}\n\t} else {\n\t\tif(!this.config.rtl){\n\t\t\theader.style.left = `-1px`;\n\t\t} else {\n\t\t\theader.style.right = `-1px`;\n\t\t}\n\t}\n};\nscheduler.set_xy=function(node,w,h,x,y){\n\tfunction prepareValue(val){\n\t\tlet prepared = val;\n\t\tif(!isNaN(Number(prepared))){\n\t\t\tprepared = Math.max(0,prepared) + \"px\";\n\t\t}\n\t\treturn prepared;\n\t}\n\n\tvar direction = 'left';\n\n\tif(w !== undefined) {\n\t\tnode.style.width = prepareValue(w);\n\t}\n\n\tif(h !== undefined){\n\t\tnode.style.height = prepareValue(h);\n\t}\n\n\tif (arguments.length>3){\n\n\t\tif(x !== undefined){\n\t\t\tif (this.config.rtl) direction = 'right';\n\t\t\tnode.style[direction]=x+\"px\";\n\t\t}\n\t\tif(y !== undefined){\n\t\t\tnode.style.top=y+\"px\";\n\t\t}\n\t}\n};\nscheduler.get_elements=function(){\n\t//get all child elements as named hash\n\tvar els=this._obj.getElementsByTagName(\"DIV\");\n\tfor (var i=0; i < els.length; i++){\n\t\tvar class_name= scheduler._getClassName(els[i]);\n\t\tvar attr_value = els[i].getAttribute(\"data-tab\") || els[i].getAttribute(\"name\") || \"\";\n\t\tif (class_name) class_name = class_name.split(\" \")[0];\n\t\tif (!this._els[class_name]) this._els[class_name]=[];\n\t\tthis._els[class_name].push(els[i]);\n\n\t\t//check if name need to be changed\n\t\t// scheduler.locale.labels[attr_value+\"_tab\"] - to fix getting labels for data-tab\n\t\tvar label = scheduler.locale.labels[attr_value+\"_tab\"] || scheduler.locale.labels[attr_value||class_name];\n\t\tif (typeof label !== \"string\" && attr_value && !els[i].innerHTML)\n\t\t\tlabel = attr_value.split(\"_\")[0];\n\t\tif (label) {\n\t\t\tthis._waiAria.labelAttr(els[i], label);\n\t\t\tels[i].innerHTML = label;\n\t\t}\n\t}\n};\n\n\nvar domEventsScope = scheduler._createDomEventScope();\n\nscheduler.unset_actions = function(){\n\tdomEventsScope.detachAll();\n\n};\n\nscheduler.set_actions=function(){\n\tfor (var a in this._els){\n\t\tif (this._click[a]){\n\t\t\tfor (var i=0; i < this._els[a].length; i++){\n\t\t\t\tconst element = this._els[a][i];\n\t\t\t\tconst handler = this._click[a].bind(element);\n\t\t\t\tdomEventsScope.attach(element, \"click\", handler);\n\t\t\t}\n\t\t}\n\t}\n\n\tdomEventsScope.attach(this._obj, \"selectstart\", function(e){\n\t\te.preventDefault();\n\t\treturn false;\n\t});\n\t//this._obj.onselectstart=function(e){ return false; };\n\tdomEventsScope.attach(this._obj, \"mousemove\", function(e){\n\t\tif (!scheduler._temp_touch_block)\n\t\t\tscheduler._on_mouse_move(e);\n\t});\n\tdomEventsScope.attach(this._obj, \"mousedown\", function(e){\n\t\tif (!scheduler._ignore_next_click)\n\t\t\tscheduler._on_mouse_down(e);\n\t});\n\tdomEventsScope.attach(this._obj, \"mouseup\", function(e){\n\t\tif (!scheduler._ignore_next_click)\n\t\t\tscheduler._on_mouse_up(e);\n\t});\n\tdomEventsScope.attach(this._obj, \"dblclick\", function(e){\n\t\tscheduler._on_dbl_click(e);\n\t});\n\tdomEventsScope.attach(this._obj, \"contextmenu\", function(e) {\n\t\tif(scheduler.checkEvent(\"onContextMenu\")){\n\t\t\t// block the default browser context menu \n\t\t\te.preventDefault();\n\t\t}\n\t\tvar ev = e;\n\t\tvar src = ev.target||ev.srcElement;\n\t\tvar returnValue = scheduler.callEvent(\"onContextMenu\", [scheduler._locate_event(src), ev]);\n\t\treturn returnValue;\n\t});\n};\nscheduler.select=function(id){\n\tif (this._select_id==id) return;\n\tscheduler._close_not_saved();\n\tthis.editStop(false);\n\tif(this._select_id){\n\t\tthis.unselect();\n\t}\n\tthis._select_id = id;\n\tthis.updateEvent(id);\n\tthis.callEvent(\"onEventSelected\", [id]);\n};\nscheduler.unselect=function(id){\n\tif (id && id!=this._select_id) return;\n\tvar t=this._select_id;\n\tthis._select_id = null;\n\tif (t && this.getEvent(t)) this.updateEvent(t);\n\tthis.callEvent(\"onEventUnselected\", [t]);\n};\nscheduler.getState=function(){\n\treturn {\n\t\tmode: this._mode,\n\t\tdate: new Date(this._date),\n\t\tmin_date: new Date(this._min_date),\n\t\tmax_date: new Date(this._max_date),\n\t\teditor_id: this._edit_id,\n\t\tlightbox_id: this._lightbox_id,\n\t\tnew_event: this._new_event,\n\t\tselect_id: this._select_id,\n\t\texpanded: this.expanded,\n\t\tdrag_id: this._drag_id,\n\t\tdrag_mode: this._drag_mode\n\t};\n};\nscheduler._click={\n\tdhx_cal_data:function(e){\n\t\t//in case of touch disable click processing\n\t\tif (scheduler._ignore_next_click){\n\t\t\tif (e.preventDefault)\n\t\t\t\te.preventDefault();\n\t\t\te.cancelBubble = true;\n\t\t\tscheduler._ignore_next_click = false;\n\t\t\treturn false;\n\t\t}\n\n\t\tvar trg = e.target;\n\t\tvar id = scheduler._locate_event(trg);\n\n\t\tif (!id) {\n\t\t\tscheduler.callEvent(\"onEmptyClick\",[scheduler.getActionData(e).date, e]);\n\t\t} else {\n\t\t\tif ( !scheduler.callEvent(\"onClick\",[id,e]) || scheduler.config.readonly ) return;\n\t\t}\n\n\t\tif (id && scheduler.config.select) {\n\n\t\t\tscheduler.select(id);\n\t\t\tconst icon = trg.closest(\".dhx_menu_icon\");\n\n\t\t\tvar mask = scheduler._getClassName(icon);\n\t\t\tif (mask.indexOf(\"_icon\")!=-1)\n\t\t\t\tscheduler._click.buttons[mask.split(\" \")[1].replace(\"icon_\",\"\")](id);\n\t\t} else{\n\t\t\tscheduler._close_not_saved();\n\t\t\tif (scheduler.getState().select_id && new Date().valueOf()-(scheduler._new_event||0) > 500){\n\t\t\t\tscheduler.unselect();\n\t\t\t}\n\t\t}\n\t},\n\tdhx_cal_prev_button:function(){\n\t\tscheduler._click.dhx_cal_next_button(0,-1);\n\t},\n\tdhx_cal_next_button:function(dummy,step){\n\t\tvar def_step = 1;\n\t\tif (scheduler.config.rtl){\n\t\t\tstep = -step;\n\t\t\tdef_step = -def_step;\n\t\t}\n\t\tscheduler.setCurrentView(scheduler.date.add( //next line changes scheduler._date , but seems it has not side-effects\n\t\t\tscheduler.date[scheduler._mode+\"_start\"](new Date(scheduler._date)),(step||def_step),scheduler._mode));\n\t},\n\tdhx_cal_today_button:function(){\n\t\tif (scheduler.callEvent(\"onBeforeTodayDisplayed\", [])) {\n\t\t\tscheduler.setCurrentView(scheduler._currentDate());\n\t\t}\n\t},\n\tdhx_cal_tab:function(){\n\t\tvar name = this.getAttribute(\"data-tab\");\n\t\tvar deprecated_name = this.getAttribute(\"name\");\n\t\tvar mode = name || deprecated_name.substring(0, deprecated_name.search(\"_tab\"));\n\t\tscheduler.setCurrentView(scheduler._date,mode);\n\t},\n\tbuttons:{\n\t\t\"delete\":function(id){\n\t\t\tvar c = scheduler.locale.labels.confirm_deleting;\n\t\t\tscheduler._dhtmlx_confirm({message: c, title: scheduler.locale.labels.title_confirm_deleting, callback:function(){ scheduler.deleteEvent(id); },\n\t\t\tconfig: {ok: scheduler.locale.labels.icon_delete}\n\t\t});\n\t\t},\n\t\tedit:function(id){ scheduler.edit(id); },\n\t\tsave:function(id){ scheduler.editStop(true); },\n\t\tdetails:function(id){ scheduler.showLightbox(id); },\n\t\tform:function(id){ scheduler.showLightbox(id); },\n\t\tcancel:function(id){ scheduler.editStop(false); }\n\t}\n};\nscheduler._dhtmlx_confirm = function({message, title, callback, config}) {\n\tif (!message)\n\t\treturn callback();\n\n\tconfig = config || {};\n\tvar opts = { ...config, text: message };\n\tif (title)\n\t\topts.title = title;\n\tif (callback) {\n\t\topts.callback = function(result) {\n\t\t\tif (result)\n\t\t\t\tcallback();\n\t\t};\n\t}\n\tscheduler.confirm(opts);\n};\nscheduler.addEventNow=function(start,end,e){\n\tvar base = {};\n\tif (scheduler._isObject(start) && !scheduler._isDate(start)){\n\t\tbase = start;\n\t\tstart = null;\n\t}\n\n\tvar d = (this.config.event_duration||this.config.time_step)*60000;\n\tif (!start) start = base.start_date||Math.round((scheduler._currentDate()).valueOf()/d)*d;\n\tvar start_date = new Date(start);\n\tif (!end){\n\t\tvar start_hour = this.config.first_hour;\n\t\tif (start_hour > start_date.getHours()){\n\t\t\tstart_date.setHours(start_hour);\n\t\t\tstart = start_date.valueOf();\n\t\t}\n\t\tend = start.valueOf()+d;\n\t}\n\tvar end_date = new Date(end);\n\n\t// scheduler.addEventNow(new Date(), new Date()) + collision though get_visible events defect (such event was not retrieved)\n\tif(start_date.valueOf() == end_date.valueOf())\n\t\tend_date.setTime(end_date.valueOf()+d);\n\tbase.start_date = base.start_date||start_date;\n\tbase.end_date = base.end_date||end_date;\n\tbase.text = base.text||this.locale.labels.new_event;\n\tbase.id = this._drag_id = base.id || this.uid();\n\tthis._drag_mode=\"new-size\";\n\tthis._loading=true;\n\tvar eventId = this.addEvent(base);\n\tthis.callEvent(\"onEventCreated\",[this._drag_id,e]);\n\tthis._loading=false;\n\n\tthis._drag_event={}; //dummy , to trigger correct event updating logic\n\tthis._on_mouse_up(e);\n\treturn eventId;\n};\nscheduler._on_dbl_click=function(e,src){\n\tsrc = src||(e.target||e.srcElement);\n\tif (this.config.readonly) return;\n\tvar name = scheduler._getClassName(src).split(\" \")[0];\n\tswitch(name){\n\t\tcase \"dhx_scale_holder\":\n\t\tcase \"dhx_scale_holder_now\":\n\t\tcase \"dhx_month_body\":\n\t\tcase \"dhx_wa_day_data\":\n\t\t\tif (!scheduler.config.dblclick_create) break;\n\t\t\tthis.addEventNow(this.getActionData(e).date,null,e);\n\t\t\tbreak;\n\t\tcase \"dhx_cal_event\":\n\t\tcase \"dhx_wa_ev_body\":\n\t\tcase \"dhx_agenda_line\":\n\t\tcase \"dhx_cal_agenda_event_line\":\n\t\tcase \"dhx_grid_event\":\n\t\tcase \"dhx_cal_event_line\":\n\t\tcase \"dhx_cal_event_clear\":\n\t\t\tvar id = this._locate_event(src);\n\t\t\tif (!this.callEvent(\"onDblClick\",[id,e])) return;\n\t\t\tif (this.config.details_on_dblclick || this._table_view || !this.getEvent(id)._timed || !this.config.select)\n\t\t\t\tthis.showLightbox(id);\n\t\t\telse\n\t\t\t\tthis.edit(id);\n\t\t\tbreak;\n\t\tcase \"dhx_time_block\":\n\t\tcase \"dhx_cal_container\":\n\t\t\treturn;\n\t\tdefault:\n\t\t\tvar t = this[\"dblclick_\"+name];\n\t\t\tif (t) {\n\t\t\t\tt.call(this,e);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (src.parentNode && src != this)\n\t\t\t\t\treturn scheduler._on_dbl_click(e,src.parentNode);\n\t\t\t}\n\t\t\tbreak;\n\t}\n};\n//column index by mouse x-coordinate\nscheduler._get_column_index = function(x_pos){\n\tvar column = 0;\n\tif (this._cols){\n\t\tvar width = 0;\n\t\tvar i = 0;\n\t\twhile (width + this._cols[i] < x_pos && i < this._cols.length){\n\t\t\twidth += this._cols[i];\n\t\t\ti++;\n\t\t}\n\t\tcolumn = i + (this._cols[i] ? ((x_pos - width)/ this._cols[i]) : 0);\n\n\t\tif (this._ignores){\n\t\t\tif(column >= this._cols.length){\n\t\t\t\twhile(column >= 1 && this._ignores[Math.floor(column)]){\n\t\t\t\t\tcolumn--;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\treturn column;\n};\n\n//transform mouse coordinates to day-time indexes of week based view\nscheduler._week_indexes_from_pos = function(pos){\n\t//\"get position\" can be invoked before columns are loaded into the units view(e.g. by onMouseMove handler in key_nav.js)\n\tif(!this._cols){\n\t\treturn pos;\n\t}else{\n\t\tvar column = this._get_column_index(pos.x);\n\n\t\tpos.x=Math.min(this._cols.length-1, Math.max(0,Math.ceil(column)-1));\n\t\tpos.y=Math.max(0,Math.ceil(pos.y*60/(this.config.time_step*this.config.hour_size_px))-1)+this.config.first_hour*(60/this.config.time_step);\n\t\treturn pos;\n\t}\n};\n\nscheduler._mouse_coords=function(ev){\n\tvar pos;\n\tvar b=document.body;\n\tvar d = document.documentElement;\n\tif (!this.$env.isIE && (ev.pageX || ev.pageY))\n\t\tpos={x:ev.pageX, y:ev.pageY};\n\telse pos={\n\t\tx:ev.clientX + (b.scrollLeft||d.scrollLeft||0) - b.clientLeft,\n\t\ty:ev.clientY + (b.scrollTop||d.scrollTop||0) - b.clientTop\n\t};\n\t//apply layout\n\tif (this.config.rtl && this._colsS) {\n\t\tpos.x = this.$container.querySelector(\".dhx_cal_data\").offsetWidth - pos.x;\n\t\tpos.x += this.$domHelpers.getAbsoluteLeft(this._obj);\n\t\tif (this._mode !== \"month\") {\n\t\t\tpos.x -= this.xy.scale_width;\n\t\t}\n\t} else {\n\t\tpos.x-=this.$domHelpers.getAbsoluteLeft(this._obj)+(this._table_view?0:this.xy.scale_width);\n\t}\n\n\tvar dataArea = this.$container.querySelector(\".dhx_cal_data\");\n\t//pos.y-=this.$domHelpers.getAbsoluteTop(this._obj)+this.xy.nav_height+(this._dy_shift||0)+this.xy.scale_height-this._els[\"dhx_cal_data\"][0].scrollTop;\n\tpos.y-=this.$domHelpers.getAbsoluteTop(dataArea)-this._els[\"dhx_cal_data\"][0].scrollTop;\n\tpos.ev = ev;\n\tvar handler = this[\"mouse_\"+this._mode];\n\tif (handler){\n\t\tpos = handler.call(this,pos);\n\t}else{\n\t\t//transform to date\n\t\tif (!this._table_view) {\n\t\t\tpos = this._week_indexes_from_pos(pos);\n\t\t} else {\n\t\t\tvar column = this._get_column_index(pos.x);\n\t\t\tif (!this._cols || !this._colsS) // agenda/map views\n\t\t\t\treturn pos;\n\t\t\tvar dy=0;\n\t\t\tfor (dy=1; dy < this._colsS.heights.length; dy++)\n\t\t\t\tif (this._colsS.heights[dy]>pos.y) break;\n\n\t\t\tpos.y=Math.ceil( (Math.max(0, column)+Math.max(0,dy-1)*7)*24*60/this.config.time_step );\n\n\t\t\tif (scheduler._drag_mode || this._mode == \"month\")\n\t\t\t\tpos.y=(Math.max(0,Math.ceil(column)-1)+Math.max(0,dy-1)*7)*24*60/this.config.time_step;\n\n\t\t\t//we care about ignored days only during event moving in month view\n\t\t\tif (this._drag_mode == \"move\"){\n\t\t\t\tif (scheduler._ignores_detected && scheduler.config.preserve_length){\n\t\t\t\t\tpos._ignores = true;\n\t\t\t\t\t//get real lengtn of event\n\t\t\t\t\tif (!this._drag_event._event_length)\n\t\t\t\t\t\tthis._drag_event._event_length = this._get_real_event_length(this._drag_event.start_date, this._drag_event.end_date, { x_step:1, x_unit:\"day\"});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpos.x=0;\n\t\t}\n\t}\n\tpos.timestamp = +new Date();\n\treturn pos;\n};\nscheduler._close_not_saved=function(){\n\tif (new Date().valueOf()-(scheduler._new_event||0) > 500 && scheduler._edit_id){\n\t\tvar c=scheduler.locale.labels.confirm_closing;\n\n\t\tscheduler._dhtmlx_confirm({message: c, title: scheduler.locale.labels.title_confirm_closing, callback: function() { scheduler.editStop(scheduler.config.positive_closing); }});\n\t\tif(c){\n\t\t\tthis._drag_id = this._drag_pos = this._drag_mode = null;\n\t\t}\n\t}\n};\nscheduler._correct_shift=function(start, back){\n\treturn start-=((new Date(scheduler._min_date)).getTimezoneOffset()-(new Date(start)).getTimezoneOffset())*60000*(back?-1:1);\n};\n\nscheduler._is_pos_changed = function(old_pos, new_pos){\n\tfunction diff(old_val, new_val, acc){\n\t\treturn !!(Math.abs(old_val - new_val) > acc);\n\t}\n\n\tif(!(old_pos && this._drag_pos)){\n\t\treturn true;\n\t}\n\tvar delay = 100,\n\t\td_pos = 5;\n\n\t// start drag only if passed some time since mouse down, or if mouse position changed sufficiently\n\treturn !!(this._drag_pos.has_moved || !this._drag_pos.timestamp || (new_pos.timestamp - this._drag_pos.timestamp > delay) || diff(old_pos.ev.clientX, new_pos.ev.clientX, d_pos) || diff(old_pos.ev.clientY, new_pos.ev.clientY, d_pos));\n};\n\nscheduler._correct_drag_start_date = function(start){\n\tvar obj;\n\tif (scheduler.matrix)\n\t\tobj = scheduler.matrix[scheduler._mode];\n\tobj = obj || { x_step:1, x_unit:\"day\" };\n\n\tstart = new Date(start);\n\tvar len = 1;\n\tif(obj._start_correction || obj._end_correction)\n\t\tlen = (obj.last_hour||0)*60 - (start.getHours()*60+start.getMinutes()) || 1;\n\n\treturn start*1 + (scheduler._get_fictional_event_length(start, len, obj) - len);\n};\nscheduler._correct_drag_end_date = function(start, duration){\n\tvar obj;\n\tif (scheduler.matrix)\n\t\tobj = scheduler.matrix[scheduler._mode];\n\tobj = obj || { x_step:1, x_unit:\"day\" };\n\n\tvar end = start*1 + scheduler._get_fictional_event_length(start, duration, obj);\n\treturn new Date(end*1 - (scheduler._get_fictional_event_length(end, -1, obj, -1) + 1));\n};\n\nscheduler._on_mouse_move=function(e){\n\tif (this._drag_mode){\n\t\tvar pos=this._mouse_coords(e);\n\t\tif (this._is_pos_changed(this._drag_pos, pos)){\n\t\t\tvar start, end;\n\t\t\tif (this._edit_id!=this._drag_id)\n\t\t\t\tthis._close_not_saved();\n\n\t\t\tif(!this._drag_mode)\n\t\t\t\treturn;\n\n\t\t\tvar mousedownPos = null;\n\t\t\tif(this._drag_pos && !this._drag_pos.has_moved){\n\t\t\t\tmousedownPos = this._drag_pos;\n\t\t\t\tmousedownPos.has_moved = true;\n\t\t\t}\n\n\t\t\tthis._drag_pos = pos;\n\n\t\t\tthis._drag_pos.has_moved = true;\n\n\t\t\tif (this._drag_mode==\"create\"){\n\n\t\t\t\t// use mouse down position as a starting point for drag-create\n\t\t\t\tif(mousedownPos){\n\t\t\t\t\tpos = mousedownPos;\n\t\t\t\t}\n\n\t\t\t\tthis._close_not_saved();\n\t\t\t\tthis.unselect(this._select_id);\n\t\t\t\tthis._loading=true; //will be ignored by dataprocessor\n\n\t\t\t\tstart = this._get_date_from_pos(pos).valueOf();\n\n\t\t\t\tif (!this._drag_start) {\n\t\t\t\t\tvar res = this.callEvent(\"onBeforeEventCreated\", [e, this._drag_id]);\n\t\t\t\t\tif (!res){\n\t\t\t\t\t\tthis._loading=false;\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._loading=false;\n\t\t\t\t\tthis._drag_start=start;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tend = start;\n\t\t\t\tif (end == this._drag_start) {\n\t\t\t\t}\n\n\t\t\t\tvar start_date = new Date(this._drag_start);\n\t\t\t\tvar end_date = new Date(end);\n\t\t\t\tif ( (this._mode == \"day\" || this._mode == \"week\") &&\n\t\t\t\t\t(start_date.getHours() == end_date.getHours() &&\n\t\t\t\t\tstart_date.getMinutes() == end_date.getMinutes()) ) {\n\t\t\t\t\t\tend_date = new Date(this._drag_start+1000);\n\t\t\t\t}\n\n\n\t\t\t\tthis._drag_id=this.uid();\n\t\t\t\tthis.addEvent(start_date, end_date, this.locale.labels.new_event, this._drag_id, pos.fields);\n\n\t\t\t\tthis.callEvent(\"onEventCreated\",[this._drag_id,e]);\n\t\t\t\tthis._loading=false;\n\t\t\t\tthis._drag_mode=\"new-size\";\n\n\t\t\t}\n\n\t\t\tvar timeStep = this.config.time_step;\n\t\t\tvar ev=this.getEvent(this._drag_id);\n\t\t\tvar obj;\n\t\t\tif (scheduler.matrix)\n\t\t\t\tobj = scheduler.matrix[scheduler._mode];\n\t\t\tobj = obj || { x_step:1, x_unit:\"day\" };\n\n\t\t\tif (this._drag_mode==\"move\"){\n\t\t\t\tstart = this._min_date.valueOf()+(pos.y*this.config.time_step+pos.x*24*60)*60000;\n\t\t\t\tif (!pos.custom && this._table_view) {\n\t\t\t\t\tstart += this.date.time_part(ev.start_date) * 1000;\n\t\t\t\t}\n\n\t\t\t\tif (!this._table_view && this._dragEventBody && this._drag_event._move_event_shift === undefined) {\n\t\t\t\t\tthis._drag_event._move_event_shift = start - ev.start_date;\n\t\t\t\t}\n\n\t\t\t\tif (this._drag_event._move_event_shift) {\n\t\t\t\t\tstart -= this._drag_event._move_event_shift;\n\t\t\t\t}\n\n\t\t\t\tstart = this._correct_shift(start);\n\n\t\t\t\tif (pos._ignores && this.config.preserve_length && this._table_view && obj){\n\n\t\t\t\t\tstart = scheduler._correct_drag_start_date(start);\n\t\t\t\t\tend = scheduler._correct_drag_end_date(start,this._drag_event._event_length);\n\n\t\t\t\t} else\n\t\t\t\t\tend = ev.end_date.valueOf()-(ev.start_date.valueOf()-start);\n\t\t\t} else { // resize\n\t\t\t\tstart = ev.start_date.valueOf();\n\t\t\t\tend = ev.end_date.valueOf();\n\t\t\t\tif (this._table_view) {\n\t\t\t\t\tvar resize_date = this._min_date.valueOf()+pos.y*this.config.time_step*60000 + (pos.custom?0:24*60*60000);\n\t\t\t\t\tif (this._mode == \"month\") {\n\t\t\t\t\t\tresize_date = this._correct_shift(resize_date, false);\n\t\t\t\t\t\tif( this._drag_from_start ) {\n\t\t\t\t\t\t\tvar day = 24*60*60000;\n\t\t\t\t\t\t\tif( resize_date <= scheduler.date.date_part(new Date(end+day-1)).valueOf() ) // to get end time as 23:59:59 and then the day start\n\t\t\t\t\t\t\t\tstart = resize_date - day;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tend = resize_date;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(this.config.preserve_length) {\n\t\t\t\t\t\t\tif (pos.resize_from_start) {\n\t\t\t\t\t\t\t\tstart = scheduler._correct_drag_start_date(resize_date);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tend = scheduler._correct_drag_end_date(resize_date, 0);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tif (pos.resize_from_start) {\n\t\t\t\t\t\t\t\tstart = resize_date;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tend = resize_date;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tvar end_day_start = this.date.date_part(new Date(ev.end_date.valueOf() - 1)).valueOf();\n\t\t\t\t\tvar end_day_date = new Date(end_day_start);\n\t\t\t\t\tvar firstHour = this.config.first_hour;\n\t\t\t\t\tvar lastHour = this.config.last_hour;\n\t\t\t\t\tvar maxY = (lastHour - firstHour) * (60/timeStep);\n\n\t\t\t\t\tthis.config.time_step = 1;\n\t\t\t\t\tvar precisePos = this._mouse_coords(e);\n\t\t\t\t\tthis.config.time_step = timeStep;\n\n\t\t\t\t\tvar minDate = pos.y*timeStep*60000;\n\t\t\t\t\tvar maxDate = Math.min(pos.y + 1, maxY)*timeStep*60000;\n\t\t\t\t\tvar preciseDate = precisePos.y*60000;\n\n\t\t\t\t\t// rounding end date to the closest time step\n\t\t\t\t\tif(Math.abs(minDate - preciseDate) > Math.abs(maxDate - preciseDate)){\n\t\t\t\t\t\tend = end_day_start + maxDate;\n\t\t\t\t\t}else{\n\t\t\t\t\t\tend = end_day_start + minDate;\n\t\t\t\t\t}\n\t\t\t\t\tend = end + ((new Date(end)).getTimezoneOffset() - end_day_date.getTimezoneOffset()) * 60000;\n\t\t\t\t\tthis._els[\"dhx_cal_data\"][0].style.cursor=\"s-resize\";\n\t\t\t\t\tif (this._mode == \"week\" || this._mode == \"day\")\n\t\t\t\t\t\tend = this._correct_shift(end);\n\t\t\t\t}\n\t\t\t\tif (this._drag_mode == \"new-size\") {\n\t\t\t\t\tif (end <= this._drag_start){\n\t\t\t\t\t\tvar shift = pos.shift||((this._table_view && !pos.custom)?24*60*60000:0);\n\t\t\t\t\t\tstart = end-(pos.shift?0:shift);\n\t\t\t\t\t\tend = this._drag_start+(shift||(timeStep*60000));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstart = this._drag_start;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (end<=start)\n\t\t\t\t\t\tend=start+timeStep*60000;\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar new_end = new Date(end-1);\n\t\t\tvar new_start = new Date(start);\n\t\t\t//deny drag out of visible scheduler scale in timeline view\n\t\t\tif(this._drag_mode==\"move\" && scheduler.config.limit_drag_out &&\n\t\t\t\t(+new_start < +scheduler._min_date || +end > +scheduler._max_date)){\n\n\t\t\t\tif(+ev.start_date < +scheduler._min_date || +ev.end_date > +scheduler._max_date){\n\t\t\t\t\t// not move event if it's already outside time scale\n\t\t\t\t\tnew_start = new Date(ev.start_date);\n\t\t\t\t\tend = new Date(ev.end_date);\n\t\t\t\t}else{\n\n\t\t\t\t\tvar duration = end - new_start;\n\n\t\t\t\t\tif(+new_start < +scheduler._min_date){\n\t\t\t\t\t\tnew_start = new Date(scheduler._min_date);\n\t\t\t\t\t\tif (pos._ignores && this.config.preserve_length && this._table_view){\n\t\t\t\t\t\t\tnew_start = new Date(scheduler._correct_drag_start_date(new_start));\n\t\t\t\t\t\t\tif(obj._start_correction)\n\t\t\t\t\t\t\t\tnew_start = new Date(new_start.valueOf() + obj._start_correction);\n\t\t\t\t\t\t\tend = new Date(new_start*1 + this._get_fictional_event_length(new_start, this._drag_event._event_length, obj));\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tend = new Date(+new_start + duration);\n\t\t\t\t\t\t}\n\t\t\t\t\t}else{\n\t\t\t\t\t\tend = new Date(scheduler._max_date);\n\n\t\t\t\t\t\tif (pos._ignores && this.config.preserve_length && this._table_view){\n\t\t\t\t\t\t\tif(obj._end_correction)\n\t\t\t\t\t\t\t\tend = new Date(end.valueOf() - obj._end_correction);\n\t\t\t\t\t\t\tend = new Date(end*1 - this._get_fictional_event_length(end, 0, obj, true));\n\t\t\t\t\t\t\tnew_start = new Date(end*1 - this._get_fictional_event_length(end, this._drag_event._event_length, obj, true));\n\t\t\t\t\t\t\tif(this._ignores_detected){\n\t\t\t\t\t\t\t\tnew_start = scheduler.date.add(new_start, obj.x_step, obj.x_unit);\n\t\t\t\t\t\t\t\tend = new Date(end*1 - this._get_fictional_event_length(end, 0, obj, true));\n\t\t\t\t\t\t\t\tend = scheduler.date.add(end, obj.x_step, obj.x_unit);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tnew_start = new Date(+end - duration);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\tvar new_end = new Date(end-1);\n\t\t\t}\n\n\n\n\t\t\t// fix event dates when resized to bottom of the column (day/week views)\n\t\t\tif(!this._table_view && this._dragEventBody &&\n\t\t\t\t!scheduler.config.all_timed &&\n\t\t\t\t((!scheduler._get_section_view() && pos.x != this._get_event_sday({start_date: new Date(start), end_date:new Date(start)})) || new Date(start).getHours() < this.config.first_hour)){\n\t\t\t\tvar duration = end - new_start;\n\t\t\t\tif (this._drag_mode == \"move\") {\n\t\t\t\t\tvar day = this._min_date.valueOf() + (pos.x * 24 * 60) * 60000;\n\t\t\t\t\tnew_start = new Date(day);\n\t\t\t\t\tnew_start.setHours(this.config.first_hour);\n\t\t\t\t\tend = new Date(new_start.valueOf() + duration);\n\t\t\t\t\tnew_end = new Date(end-1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// fix event dates when resized to bottom of the column (day/week views)\n\t\t\tif(!this._table_view &&\n\t\t\t\t!scheduler.config.all_timed &&\n\t\t\t\t((!scheduler.getView() && pos.x != this._get_event_sday({start_date: new Date(end), end_date:new Date(end)})) || new Date(end).getHours() >= this.config.last_hour)){\n\t\t\t\tvar duration = end - new_start;\n\t\t\t\tvar day = this._min_date.valueOf()+(pos.x*24*60)*60000;\n\t\t\t\tend = scheduler.date.date_part(new Date(day));\n\t\t\t\tend.setHours(this.config.last_hour);\n\t\t\t\tnew_end = new Date(end-1);\n\t\t\t\tif(this._drag_mode == \"move\"){\n\t\t\t\t\tnew_start = new Date(+end - duration);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//prevent out-of-borders situation for day|week view\n\t\t\tif ( this._table_view || (new_end.getDate()==new_start.getDate() && new_end.getHours()
=ed)\n\t\t\t\tcls += ' dhx_after';\n\t\t\telse if (sd.valueOf()==cd.valueOf())\n\t\t\t\tcls += ' dhx_now';\n\n\t\t\tif (this._ignores_detected && this._ignores[j]){\n\t\t\t\tcls += \" dhx_scale_ignore\";\n\t\t\t}\n\n\t\t\tcell.className = cls + \" \" + this.templates.month_date_class(sd, cd);\n\n\t\t\tcell.setAttribute(\"data-cell-date\", scheduler.templates.format_date(sd));\n\t\t\tvar body_class = \"dhx_month_body\";\n\t\t\tvar head_class = \"dhx_month_head\";\n\t\t\tif (j === 0 && this.config.left_border) {\n\t\t\t\tbody_class += \" dhx_month_body_border\";\n\t\t\t\thead_class += \" dhx_month_head_border\";\n\t\t\t}\n\t\t\tif (!this._ignores_detected || !this._ignores[j]){\n\t\t\t\tcell.style.width = tdwidths[j];\n\t\t\t\tthis._waiAria.monthCellAttr(cell, sd);\n\n\t\t\t\tvar cellHead = document.createElement(\"div\");\n\t\t\t\tcellHead.style.height = scheduler.xy.month_head_height + \"px\";\n\t\t\t\tcellHead.className = head_class;\n\t\t\t\tcellHead.innerHTML = this.templates.month_day(sd);\n\t\t\t\tcell.appendChild(cellHead);\n\n\t\t\t\tvar cellBody = document.createElement(\"div\");\n\t\t\t\tcellBody.className = body_class;\n\t\t\t\t// cellBody.style.height = row_height + \"px\";\n\t\t\t\t// cellBody.style.width = tdwidths[j];\n\t\t\t\tcell.appendChild(cellBody);\n\n\t\t\t} else {\n\t\t\t\tcell.appendChild(document.createElement(\"div\"));\n\t\t\t\tcell.appendChild(document.createElement(\"div\"));\n\t\t\t}\n\t\t\trendered_dates.push(sd);\n\t\t\tvar bf1 = sd.getDate();\n\t\t\tsd=this.date.add(sd,1,\"day\");\n\t\t\tif (sd.getDate() - bf1 > 1)\n\t\t\t\tsd = new Date(sd.getFullYear(), sd.getMonth(), bf1 + 1, 12, 0);\n\t\t}\n\n\t\tscheduler._colsS.heights[i] = cellheight;\n\t\tcellheight += getCellHeight(i);\n\t}\n\n\tthis._min_date = view_start;\n\tthis._max_date = sd;\n\n\tdiv.innerHTML = \"\";\n\tdiv.appendChild(table);\n\n\tthis._scales = {};\n\tvar cells = div.querySelectorAll('[data-cell-date]');\n\tcells.forEach((cell) => {\n\t\tconst date = scheduler.templates.parse_date(cell.getAttribute(\"data-cell-date\"));\n\t\tconst body = cell.querySelector(\".dhx_month_body\");\n\t\tthis._scales[+date] = body;\n\t\tthis.callEvent(\"onScaleAdd\", [this._scales[+date], date]);\n\t});\n\n\treturn this._max_date;\n};\n\nscheduler._reset_month_scale=function(b,dd,sd,rows){\n\t//recalculates rows height and redraws month layout\n\tvar ed=scheduler.date.add(dd,1,\"month\");\n\n\t//trim time part for comparison reasons\n\tvar cd = scheduler._currentDate();\n\tthis.date.date_part(cd);\n\tthis.date.date_part(sd);\n\n\trows = rows || Math.ceil(Math.round((ed.valueOf()-sd.valueOf()) / (60*60*24*1000) ) / 7);\n\n\tvar height = (Math.floor(b.clientHeight/rows) - this.xy.month_head_height);\n\n\tthis._colsS.height = height + this.xy.month_head_height;\n\tthis._colsS.heights = [];\n\n\treturn scheduler._render_month_scale(b, dd, sd, rows);\n\n};\n\nscheduler.getView = function (viewName) {\n\tif (!viewName) {\n\t\tviewName = scheduler.getState().mode;\n\t}\n\tif (scheduler.matrix && scheduler.matrix[viewName]) {\n\t\treturn scheduler.matrix[viewName];\n\t}\n\n\tif (scheduler._props && scheduler._props[viewName]) {\n\t\treturn scheduler._props[viewName];\n\t}\n\n\treturn null;\n};\n\nscheduler.getLabel = function(property, key) {\n\tvar sections = this.config.lightbox.sections;\n\tfor (var i=0; i scheduler.getState().max_date.valueOf()){\n\t\t\tendColumnIndex += getDaysDifference(endDate, scheduler.getState().max_date);\n\t\t}\n\t} else{\n\t\tendColumnIndex = Math.round(eventLength/60/60/1000/24);\n\t}\n\n\tvar last_column = true;\n\twhile (startColumnIndex < endColumnIndex){\n\t\tvar check = scheduler.date.add(endDate, -config.x_step, config.x_unit);\n\t\tif (ignore && ignore(endDate) && (!last_column || (last_column && ignore(check) ))){\n\t\t\teventLength -= (endDate-check);\n\n\t\t}else{\n\t\t\tlet excludedDuration = 0;\n\t\t\tconst intervalStart = new Date(Math.max(check.valueOf(), startDate.valueOf()));\n\t\t\tconst intervalEnd = endDate;\n\t\t\tconst leftCellCutOffStart = new Date(intervalStart.getFullYear(), intervalStart.getMonth(), intervalStart.getDate(), config.first_hour);\n\t\t\tconst leftCellCutOffEnd = new Date(intervalStart.getFullYear(), intervalStart.getMonth(), intervalStart.getDate(), config.last_hour);\n\t\t\tconst rightCellCutOffStart = new Date(endDate.getFullYear(), endDate.getMonth(), endDate.getDate(), config.first_hour);\n\t\t\tconst rightCellCutOffEnd = new Date(endDate.getFullYear(), endDate.getMonth(), endDate.getDate(), config.last_hour);\n\n\t\t\tif(intervalEnd.valueOf() > rightCellCutOffEnd.valueOf()){\n\t\t\t\texcludedDuration += intervalEnd - rightCellCutOffEnd;\n\t\t\t}\n\n\t\t\tif(intervalEnd.valueOf() > rightCellCutOffStart.valueOf()){\n\t\t\t\texcludedDuration += config._start_correction;\n\t\t\t} else {\n\t\t\t\texcludedDuration += intervalEnd.getHours()*60*60*1000 + intervalEnd.getMinutes()*60*1000;\n\t\t\t}\n\n\t\t\tif(intervalStart.valueOf() < leftCellCutOffEnd.valueOf()){\n\t\t\t\texcludedDuration += config._end_correction;\n\t\t\t}\n\n\t\t\tif(intervalStart.valueOf() < leftCellCutOffStart.valueOf()){\n\t\t\t\texcludedDuration += (leftCellCutOffStart.valueOf() - intervalStart.valueOf());\n\t\t\t}\n\t\t\t\n\n\t\t\teventLength -= excludedDuration;\n\t\t\tlast_column = false;\n\t\t}\n\t\tendDate = check;\n\t\tendColumnIndex--;\n\t}\n\treturn eventLength;\n};\nscheduler._get_fictional_event_length=function(end_date, ev_length, obj, back){\n\tvar sd = new Date(end_date);\n\tvar dir = back ? -1 : 1;\n\n\t//get difference caused by first|last hour\n\tif (obj._start_correction || obj._end_correction){\n\t\tvar today;\n\t\tif (back)\n\t\t\ttoday = (sd.getHours()*60+sd.getMinutes()) - (obj.first_hour||0)*60;\n\t\telse\n\t\t\ttoday = (obj.last_hour||0)*60 - (sd.getHours()*60+sd.getMinutes());\n\t\tvar per_day = (obj.last_hour - obj.first_hour)*60;\n\t\tvar days = Math.ceil( (ev_length / (60*1000) - today ) / per_day);\n\t\tif(days < 0) days = 0;\n\t\tev_length += days * (24*60 - per_day) * 60 * 1000;\n\t}\n\n\tvar fd = new Date(end_date*1+ev_length*dir);\n\tvar ignore = this[\"ignore_\"+this._mode];\n\n\tvar start_slot = 0,\n\t\tend_slot;\n\tif (obj.render){\n\t\tstart_slot = this._get_date_index(obj, sd);\n\t\tend_slot = this._get_date_index(obj, fd);\n\t} else{\n\t\tend_slot = Math.round(ev_length/60/60/1000/24);\n\t}\n\n\twhile (start_slot*dir <= end_slot*dir){\n\t\tvar check = scheduler.date.add(sd, obj.x_step*dir, obj.x_unit);\n\t\tif (ignore && ignore(sd)){\n\t\t\tev_length += (check-sd)*dir;\n\t\t\tend_slot += dir;\n\t\t}\n\n\t\tsd = check;\n\t\tstart_slot+=dir;\n\t}\n\n\treturn ev_length;\n};\n\nscheduler._get_section_view = function(){\n\treturn this.getView();\n};\n\nscheduler._get_section_property = function(){\n\tif(this.matrix && this.matrix[this._mode]){\n\t\treturn this.matrix[this._mode].y_property;\n\t}else if(this._props && this._props[this._mode]){\n\t\treturn this._props[this._mode].map_to;\n\t}\n\treturn null;\n};\n\nscheduler._is_initialized = function(){\n\tvar state = this.getState();\n\treturn (this._obj && state.date && state.mode);\n};\nscheduler._is_lightbox_open = function(){\n\tvar state = this.getState();\n\treturn state.lightbox_id !== null && state.lightbox_id !== undefined;\n};\n\n}","export default function extend(scheduler) {\n\n(function(){\n\n\t// eslint-disable-next-line no-control-regex\n\tvar htmlTags = new RegExp(\"<(?:.|\\n)*?>\", \"gm\");\n\tvar extraSpaces = new RegExp(\" +\", \"gm\");\n\n\tfunction stripHTMLLite(htmlText){\n\t\treturn (htmlText + \"\")\n\t\t\t.replace(htmlTags, \" \").\n\t\t\treplace(extraSpaces, \" \");\n\t}\n\n\tvar singleQuotes = new RegExp(\"'\", \"gm\");\n\tfunction escapeQuotes(text){\n\t\treturn (text + \"\").replace(singleQuotes, \"'\");\n\t}\n\n\tscheduler._waiAria = {\n\t\tgetAttributeString: function(attr){\n\t\t\tvar attributes = [\" \"];\n\t\t\tfor(var i in attr){\n\t\t\t\tif(typeof attr[i] != \"function\" && typeof attr[i] != \"object\") {\n\t\t\t\t\tvar text = escapeQuotes(stripHTMLLite(attr[i]));\n\t\t\t\t\tattributes.push(i + \"='\" + text + \"'\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tattributes.push(\" \");\n\t\t\treturn attributes.join(\" \");\n\t\t},\n\t\tsetAttributes: function(div, values){\n\t\t\tfor(var i in values){\n\t\t\t\tdiv.setAttribute(i, stripHTMLLite(values[i]));\n\t\t\t}\n\t\t\treturn div;\n\t\t},\n\n\t\tlabelAttr: function(div, content){\n\t\t\treturn this.setAttributes(div, {\"aria-label\": content});\n\t\t},\n\t\tlabel: function(label){\n\t\t\treturn scheduler._waiAria.getAttributeString({\"aria-label\": label});\n\t\t},\n\n\t\t// day/week/units\n\n\t\thourScaleAttr: function(div, content){\n\t\t\tthis.labelAttr(div, content);\n\n\t\t},\n\t\tmonthCellAttr: function(div, date){\n\t\t\tthis.labelAttr(div, scheduler.templates.day_date(date));\n\t\t},\n\n\t\tnavBarDateAttr: function(div, content){\n\t\t\tthis.labelAttr(div, content);\n\t\t},\n\t\tdayHeaderAttr: function(div, content){\n\t\t\tthis.labelAttr(div, content);\n\t\t},\n\n\t\tdayColumnAttr: function(div, date){\n\t\t\tthis.dayHeaderAttr(div, scheduler.templates.day_date(date));\n\t\t},\n\n\t\theaderButtonsAttributes: function(div, label){\n\t\t\treturn this.setAttributes(div, {\"role\":\"button\", \"aria-label\":label});\n\t\t},\n\n\t\theaderToggleState: function(div, isActive){\n\t\t\treturn this.setAttributes(div, {\"aria-pressed\": isActive ? \"true\" : \"false\"});\n\t\t},\n\n\n\t\tgetHeaderCellAttr:function(dateString){\n\n\t\t\treturn scheduler._waiAria.getAttributeString({\"aria-label\": dateString});\n\t\t},\n\n\n\t\teventAttr: function(event, div){\n\t\t\tthis._eventCommonAttr(event, div);\n\t\t},\n\n\n\t\t_eventCommonAttr: function(event, div){\n\t\t\tdiv.setAttribute(\"aria-label\", stripHTMLLite(scheduler.templates.event_text(event.start_date, event.end_date, event)));\n\n\t\t\tif(scheduler.config.readonly){\n\t\t\t\tdiv.setAttribute(\"aria-readonly\", true);\n\n\t\t\t}\n\n\t\t\tif(event.$dataprocessor_class){\n\t\t\t\tdiv.setAttribute(\"aria-busy\", true);\n\t\t\t}\n\n\n\t\t\tdiv.setAttribute(\"aria-selected\",\n\t\t\t\t(scheduler.getState().select_id == event.id) ? \"true\" : \"false\");\n\t\t},\n\n\t\tsetEventBarAttr: function(event, div){\n\t\t\tthis._eventCommonAttr(event, div);\n\t\t},\n\n\t\t_getAttributes: function(attributeSetter, arg){\n\t\t\tvar result = {\n\t\t\t\tsetAttribute:function(name, value){\n\t\t\t\t\tthis[name] = value;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tattributeSetter.apply(this, [arg, result]);\n\t\t\treturn result;\n\n\t\t},\n\n\t\teventBarAttrString: function(event){\n\t\t\treturn this.getAttributeString(this._getAttributes(this.setEventBarAttr, event));\n\t\t},\n\n\n\n\t\tagendaHeadAttrString :function(){\n\t\t\treturn this.getAttributeString({role: \"row\"});\n\t\t},\n\t\tagendaHeadDateString :function(label){\n\t\t\treturn this.getAttributeString({role: \"columnheader\", \"aria-label\": label});\n\t\t},\n\t\tagendaHeadDescriptionString :function(label){\n\t\t\treturn this.agendaHeadDateString(label);\n\t\t},\n\t\tagendaDataAttrString: function(){\n\t\t\treturn this.getAttributeString({role: \"grid\"});\n\t\t},\n\t\tagendaEventAttrString: function(event){\n\t\t\tvar attrs = this._getAttributes(this._eventCommonAttr, event);\n\n\t\t\tattrs[\"role\"] = \"row\";\n\n\t\t\treturn this.getAttributeString(attrs);\n\n\t\t},\n\t\tagendaDetailsBtnString: function(){\n\t\t\treturn this.getAttributeString({\"role\":\"button\", \"aria-label\":scheduler.locale.labels.icon_details});\n\t\t},\n\n\n\t\tgridAttrString: function(){\n\t\t\treturn this.getAttributeString({role: \"grid\"});\n\t\t},\n\n\t\tgridRowAttrString: function(event){\n\t\t\treturn this.agendaEventAttrString(event);\n\t\t},\n\n\t\tgridCellAttrString: function(event, column, value){\n\t\t\treturn this.getAttributeString({\"role\":\"gridcell\", \"aria-label\": [\n\t\t\t\t(column.label === undefined ? column.id : column.label),\n\t\t\t\t\": \",\n\t\t\t\tvalue\n\t\t\t]});\n\t\t},\n\n\t\tmapAttrString: function(){\n\t\t\treturn this.gridAttrString();\n\t\t},\n\t\tmapRowAttrString: function(event){\n\t\t\treturn this.gridRowAttrString(event);\n\t\t},\n\t\tmapDetailsBtnString: function(){\n\t\t\treturn this.agendaDetailsBtnString();\n\t\t},\n\n\t\tminicalHeader: function(div, headerId){\n\t\t\tthis.setAttributes(div, {\n\t\t\t\t\"id\":headerId+\"\",\n\t\t\t\t\"aria-live\":\"assertice\",\n\t\t\t\t\"aria-atomic\":\"true\"\n\n\t\t\t});\n\t\t},\n\t\tminicalGrid: function(div, headerId){\n\t\t\tthis.setAttributes(div, {\n\t\t\t\t\"aria-labelledby\":headerId+\"\",\n\t\t\t\t\"role\":\"grid\"\n\t\t\t});\n\t\t},\n\t\tminicalRow: function(div){\n\t\t\tthis.setAttributes(div, {\n\t\t\t\t\"role\":\"row\"\n\t\t\t});\n\t\t},\n\t\tminicalDayCell: function(div, date){\n\t\t\tvar selected = (date.valueOf() < scheduler._max_date.valueOf() && date.valueOf() >= scheduler._min_date.valueOf());\n\t\t\tthis.setAttributes(div, {\n\t\t\t\t\"role\":\"gridcell\",\n\t\t\t\t\"aria-label\": scheduler.templates.day_date(date),\n\t\t\t\t\"aria-selected\": selected ? \"true\" : \"false\"\n\t\t\t});\n\t\t},\n\t\tminicalHeadCell: function(div){\n\t\t\tthis.setAttributes(div, {\n\t\t\t\t\"role\":\"columnheader\"\n\t\t\t});\n\t\t},\n\n\n\t\tweekAgendaDayCell: function(div, date){\n\t\t\tvar header = div.querySelector(\".dhx_wa_scale_bar\");\n\t\t\tvar content = div.querySelector(\".dhx_wa_day_data\");\n\t\t\tvar headerId = scheduler.uid() + \"\";\n\t\t\tthis.setAttributes(header, { \"id\": headerId});\n\t\t\tthis.setAttributes(content, { \"aria-labelledby\": headerId});\n\n\t\t},\n\t\tweekAgendaEvent: function(div, event){\n\t\t\tthis.eventAttr(event, div);\n\t\t},\n\n\t\tlightboxHiddenAttr: function(div){\n\t\t\tdiv.setAttribute(\"aria-hidden\", \"true\");\n\t\t},\n\n\t\tlightboxVisibleAttr: function(div){\n\t\t\tdiv.setAttribute(\"aria-hidden\", \"false\");\n\t\t},\n\n\t\tlightboxSectionButtonAttrString: function(label){\n\t\t\treturn this.getAttributeString({\"role\":\"button\", \"aria-label\":label, \"tabindex\":\"0\"});\n\t\t},\n\n\t\tyearHeader: function(div, headerId){\n\t\t\tthis.setAttributes(div, {\n\t\t\t\t\"id\":headerId+\"\"\n\t\t\t});\n\t\t},\n\t\tyearGrid: function(div, headerId){\n\t\t\tthis.minicalGrid(div, headerId);\n\t\t},\n\t\tyearHeadCell: function(div){\n\t\t\treturn this.minicalHeadCell(div);\n\t\t},\n\t\tyearRow: function(div){\n\t\t\treturn this.minicalRow(div);\n\t\t},\n\t\tyearDayCell: function(div){\n\t\t\tthis.setAttributes(div, {\n\t\t\t\t\"role\":\"gridcell\"\n\t\t\t});\n\t\t},\n\n\t\tlightboxAttr: function(div){\n\t\t\tdiv.setAttribute(\"role\", \"dialog\");\n\t\t\tdiv.setAttribute(\"aria-hidden\", \"true\");\n\t\t\tdiv.firstChild.setAttribute(\"role\", \"heading\");\n\t\t},\n\n\t\tlightboxButtonAttrString:function(buttonName){\n\t\t\treturn this.getAttributeString({\"role\":\"button\", \"aria-label\":scheduler.locale.labels[buttonName], \"tabindex\":\"0\"});\n\t\t},\n\t\teventMenuAttrString: function(iconName){\n\t\t\treturn this.getAttributeString({\"role\":\"button\", \"aria-label\":scheduler.locale.labels[iconName]});\n\t\t},\n\t\tlightboxHeader: function(div, headerText){\n\t\t\tdiv.setAttribute(\"aria-label\", headerText);\n\t\t},\n\n\t\tlightboxSelectAttrString: function(time_option){\n\t\t\tvar label = \"\";\n\n\t\t\tswitch (time_option) {\n\t\t\t\tcase \"%Y\":\n\t\t\t\t\tlabel = scheduler.locale.labels.year;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"%m\":\n\t\t\t\t\tlabel = scheduler.locale.labels.month;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"%d\":\n\t\t\t\t\tlabel = scheduler.locale.labels.day;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"%H:%i\":\n\t\t\t\t\tlabel = scheduler.locale.labels.hour + \" \" + scheduler.locale.labels.minute;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\treturn scheduler._waiAria.getAttributeString({\"aria-label\": label});\n\t\t},\n\n\n\t\tmessageButtonAttrString: function(buttonLabel){\n\t\t\treturn \"tabindex='0' role='button' aria-label='\"+buttonLabel+\"'\";\n\t\t},\n\n\t\tmessageInfoAttr: function(div){\n\t\t\tdiv.setAttribute(\"role\", \"alert\");\n\t\t\t//div.setAttribute(\"tabindex\", \"-1\");\n\t\t},\n\n\t\tmessageModalAttr: function(div, uid){\n\t\t\tdiv.setAttribute(\"role\", \"dialog\");\n\t\t\tif(uid){\n\t\t\t\tdiv.setAttribute(\"aria-labelledby\", uid);\n\t\t\t}\n\n\t\t\t//\tdiv.setAttribute(\"tabindex\", \"-1\");\n\t\t},\n\n\t\tquickInfoAttr: function(div){\n\t\t\tdiv.setAttribute(\"role\", \"dialog\");\n\t\t},\n\n\t\tquickInfoHeaderAttrString: function(){\n\t\t\treturn \" role='heading' \";\n\t\t},\n\n\t\tquickInfoHeader: function(div, header){\n\t\t\tdiv.setAttribute(\"aria-label\", header);\n\t\t},\n\n\t\tquickInfoButtonAttrString: function(label){\n\t\t\treturn scheduler._waiAria.getAttributeString({\"role\":\"button\", \"aria-label\":label, \"tabindex\":\"0\"});\n\t\t},\n\n\t\ttooltipAttr: function(div){\n\t\t\tdiv.setAttribute(\"role\", \"tooltip\");\n\t\t},\n\n\t\ttooltipVisibleAttr: function(div){\n\t\t\tdiv.setAttribute(\"aria-hidden\", \"false\");\n\t\t},\n\n\t\ttooltipHiddenAttr: function(div){\n\t\t\tdiv.setAttribute(\"aria-hidden\", \"true\");\n\t\t}\n\t};\n\n\tfunction isDisabled(){\n\t\treturn !scheduler.config.wai_aria_attributes;\n\t}\n\n\tfor(var i in scheduler._waiAria){\n\t\tscheduler._waiAria[i] = (function(payload){\n\t\t\treturn function(){\n\t\t\t\tif(isDisabled()){\n\t\t\t\t\treturn \" \";\n\t\t\t\t}\n\t\t\t\treturn payload.apply(this, arguments);\n\t\t\t};\n\t\t})(scheduler._waiAria[i]);\n\t}\n\n\n})();\n\n}","export default function(scheduler){\n\treturn function assert(check, message){\n\t\tif (!check){\n\t\t\tif(scheduler.config.show_errors && scheduler.callEvent(\"onError\",[message]) !== false) {\n\t\t\t\tif (scheduler.message) {\n\t\t\t\t\tscheduler.message({type: \"error\", text: message, expire: -1});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// eslint-disable-next-line\n\t\t\t\t\tconsole.log(message);\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-debugger\n\t\t\t\tdebugger;\n\t\t\t}\n\t\t}\n\t};\n}","export default function extend(scheduler) {\n\nif (window.jQuery){\n\n(function( $ ){\n\tvar counter = 0;\n\tvar methods = [];\n\t$.fn.dhx_scheduler = function(config){\n\t\tif (typeof(config) === 'string') {\n\t\t\tif (methods[config] ) {\n\t\t\t\treturn methods[config].apply(this, []);\n\t\t\t}else {\n\t\t\t\t$.error('Method ' + config + ' does not exist on jQuery.dhx_scheduler');\n\t\t\t}\n\t\t} else {\n\t\t\tvar views = [];\n\t\t\tthis.each(function() {\n\t\t\t\tif (this && this.getAttribute){\n\t\t\t\t\tif (!this.getAttribute(\"dhxscheduler\")){\n\t\t\t\t\t\tvar name = \"scheduler\";\n\t\t\t\t\t\tif (counter){\n\t\t\t\t\t\t\tname = \"scheduler\" + (counter+1);\n\t\t\t\t\t\t\twindow[name] = Scheduler.getSchedulerInstance();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar comp = window[name];\n\n\t\t\t\t\t\tthis.setAttribute(\"dhxscheduler\", name);\n\t\t\t\t\t\tfor (var key in config)\n\t\t\t\t\t\t\tif (key!=\"data\")\n\t\t\t\t\t\t\t\tcomp.config[key] = config[key];\n\n\t\t\t\t\t\tif (!this.getElementsByTagName(\"div\").length){\n\t\t\t\t\t\t\tthis.innerHTML = '
';\n\t\t\t\t\t\t\tthis.className += \" dhx_cal_container\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcomp.init(this, comp.config.date, comp.config.mode);\n\t\t\t\t\t\tif (config.data)\n\t\t\t\t\t\t\tcomp.parse(config.data);\n\n\t\t\t\t\t\tviews.push(comp);\n\t\t\t\t\t\tcounter++;\n\t\t\t\t\t} else\n\t\t\t\t\t\tviews.push(window[this.getAttribute(\"dhxscheduler\")]);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (views.length === 1) return views[0];\n\t\t\treturn views;\n\t\t}\n\t};\n\n\n\n\n})(window.jQuery);\n\n}\n\n}","export default function extend(scheduler) {\n\nscheduler.destructor = function(){\n\tscheduler.callEvent(\"onDestroy\", []);\n\tthis.clearAll();\n\n\tif(this.$container){\n\t\t// FIXME: clear container or remove container\n\t\tthis.$container.innerHTML = \"\";\n\t\t// scheduler.$domHelpers.remove(this.$container);\n\t}\n\n\tif(this._eventRemoveAll){\n\t\tthis._eventRemoveAll();\n\t}\n\n\tif(this.resetLightbox){\n\t\tthis.resetLightbox();\n\t}\n\n\tif(this._dp && this._dp.destructor){\n\t\tthis._dp.destructor();\n\t}\n\n\t// detachAllEvents should be called last, because in components may be attached events\n\tthis.detachAllEvents();\n\n\tfor(var i in this){\n\t\tif(i.indexOf(\"$\") === 0){\n\t\t\tdelete this[i];\n\t\t}\n\t}\n\tscheduler.$destroyed = true;\n};\n\n}","import serialize from \"../common/url_serialize.js\";\n\nexport default function extend(scheduler) {\n\nscheduler.Promise = window.Promise; \n\nfunction createConfig(method, args) {\n\tvar result = {\n\t\tmethod: method\n\t};\n\n\tif (args.length === 0) {\n\t\tthrow new Error(\"Arguments list of query is wrong.\");\n\t}\n\tif (args.length === 1) {\n\t\tif (typeof args[0] === \"string\") {\n\t\t\tresult.url = args[0];\n\t\t\tresult.async = true;\n\t\t} else {\n\t\t\tresult.url = args[0].url;\n\t\t\tresult.async = (args[0].async || true);\n\t\t\tresult.callback = args[0].callback;\n\t\t\tresult.headers = args[0].headers;\n\t\t}\n\t\tif (method === \"POST\" || \"PUT\") {\n\t\t\tif (args[0].data) {\n\t\t\t\tif (typeof args[0].data !== \"string\") {\n\t\t\t\t\tresult.data = serialize(args[0].data);\n\t\t\t\t} else {\n\t\t\t\t\tresult.data = args[0].data;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresult.data = \"\";\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tresult.url = args[0];\n\tswitch(method) {\n\t\tcase \"GET\":\n\t\tcase \"DELETE\":\n\t\t\tresult.callback = args[1];\n\t\t\tresult.headers = args[2];\n\t\tbreak;\n\t\tcase \"POST\":\n\t\tcase \"PUT\":\n\t\t\tif (args[1]) {\n\t\t\t\tif (typeof args[1] !== \"string\") {\n\t\t\t\t\tresult.data = serialize(args[1]);\n\t\t\t\t} else {\n\t\t\t\t\tresult.data = args[1];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresult.data = \"\";\n\t\t\t}\n\t\t\tresult.callback = args[2];\n\t\t\tresult.headers = args[3];\n\t\tbreak;\n\t}\n\treturn result;\n}\nscheduler.ajax = {\n\t// if false - dhxr param will added to prevent caching on client side (default),\n\t// if true - do not add extra params\n\tcache: true,\n\n\t// default method for load/loadStruct, post/get allowed\n\tmethod: \"get\",\n\n\tserializeRequestParams: serialize,\n\tparse: function(data) {\n\t\tif (typeof data !== \"string\") return data;\n\n\t\tvar obj;\n\t\tdata = data.replace(/^[\\s]+/,\"\");\n\t\tif (typeof DOMParser !== \"undefined\" && !scheduler.$env.isIE) { // ff,ie9\n\t\t\tobj = (new DOMParser()).parseFromString(data, \"text/xml\");\n\t\t} else if (typeof window.ActiveXObject !== \"undefined\") {\n\t\t\tobj = new window.ActiveXObject(\"Microsoft.XMLDOM\");\n\t\t\tobj.async = \"false\";\n\t\t\tobj.loadXML(data);\n\t\t}\n\t\treturn obj;\n\t},\n\txmltop: function(tagname, xhr, obj) {\n\t\tif (typeof xhr.status == \"undefined\" || xhr.status < 400) {\n\t\t\tvar xml = (!xhr.responseXML) ? this.parse(xhr.responseText || xhr) : (xhr.responseXML || xhr);\n\t\t\tif (xml && xml.documentElement !== null && !xml.getElementsByTagName(\"parsererror\").length) {\n\t\t\t\treturn xml.getElementsByTagName(tagname)[0];\n\t\t\t}\n\t\t}\n\t\tif (obj !== -1) scheduler.callEvent(\"onLoadXMLError\",[\"Incorrect XML\", arguments[1], obj]);\n\t\treturn document.createElement(\"DIV\");\n\t},\n\txpath: function(xpathExp, docObj) {\n\t\tif (!docObj.nodeName) docObj = docObj.responseXML || docObj;\n\t\tif (scheduler.$env.isIE) {\n\t\t\treturn docObj.selectNodes(xpathExp)||[];\n\t\t} else {\n\t\t\tvar rows = [];\n\t\t\tvar first;\n\t\t\tvar col = (docObj.ownerDocument||docObj).evaluate(xpathExp, docObj, null, XPathResult.ANY_TYPE, null);\n\n\t\t\twhile (true){\n\t\t\t\tfirst = col.iterateNext();\n\t\t\t\tif(first){\n\t\t\t\t\trows.push(first);\n\t\t\t\t}else{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn rows;\n\t\t}\n\t},\n\tquery: function(config) {\n\t\treturn this._call(\n\t\t\t(config.method || \"GET\"),\n\t\t\tconfig.url,\n\t\t\tconfig.data || \"\",\n\t\t\t(config.async || true),\n\t\t\tconfig.callback,\n\t\t\tconfig.headers\n\t\t);\n\t},\n\tget: function(url, onLoad, headers) {\n\t\tvar config = createConfig(\"GET\", arguments);\n\t\treturn this.query(config);\n\t},\n\tgetSync: function(url, headers) {\n\t\tvar config = createConfig(\"GET\", arguments);\n\t\tconfig.async = false;\n\t\treturn this.query(config);\n\t},\n\tput: function(url, postData, onLoad, headers) {\n\t\tvar config = createConfig(\"PUT\", arguments);\n\t\treturn this.query(config);\n\t},\n\tdel: function(url, onLoad, headers) {\n\t\t/**\n\t\t * https://tools.ietf.org/html/rfc7231#section-4.3.5\n\t\t * A payload within a DELETE request message has no defined semantics;\n\t\t * sending a payload body on a DELETE request might cause some existing\n\t\t * implementations to reject the request.\n\t\t */\n\t\tvar config = createConfig(\"DELETE\", arguments);\n\t\treturn this.query(config);\n\t},\n\tpost: function(url, postData, onLoad, headers) {\n\t\tif (arguments.length == 1) {\n\t\t\tpostData = \"\";\n\t\t} else if (arguments.length == 2 && typeof(postData) == \"function\") {\n\t\t\tonLoad = postData;\n\t\t\tpostData = \"\";\n\t\t}\n\t\tvar config = createConfig(\"POST\", arguments);\n\t\treturn this.query(config);\n\t},\n\tpostSync: function(url, postData, headers) {\n\t\tpostData = (postData === null ? \"\" : String(postData));\n\n\t\tvar config = createConfig(\"POST\", arguments);\n\t\tconfig.async = false;\n\t\treturn this.query(config);\n\t},\n\t_call: function(method, url, postData, async, onLoad, headers) {\n\t\treturn new scheduler.Promise((function(resolve, reject) {\n\t\t\tvar t = (typeof XMLHttpRequest !== undefined && !scheduler.$env.isIE ? new XMLHttpRequest() : new window.ActiveXObject(\"Microsoft.XMLHTTP\"));\n\t\t\tvar isQt = (navigator.userAgent.match(/AppleWebKit/) !== null && navigator.userAgent.match(/Qt/) !== null && navigator.userAgent.match(/Safari/) !== null);\n\n\t\t\tif (!!async) {\n\t\t\t\tt.addEventListener(\"readystatechange\", function() {\n\t\t\t\t\tif ((t.readyState == 4) || (isQt && t.readyState == 3)) { // what for long response and status 404?\n\t\t\t\t\t\tif (t.status != 200 || t.responseText === \"\")\n\t\t\t\t\t\t\tif (!scheduler.callEvent(\"onAjaxError\", [t])) return;\n\n\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\tif (typeof(onLoad) == \"function\") {\n\t\t\t\t\t\t\t\tonLoad.apply(window, [{xmlDoc:t, filePath:url}]); // dhtmlx-compat, response.xmlDoc.responseXML/responseText\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tresolve(t);\n\t\t\t\t\t\t\tif (typeof(onLoad) == \"function\") {\n\t\t\t\t\t\t\t\tonLoad = null;\n\t\t\t\t\t\t\t\tt = null;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (method == \"GET\" && !this.cache) {\n\t\t\t\turl += (url.indexOf(\"?\")>=0?\"&\":\"?\")+\"dhxr\"+new Date().getTime()+\"=1\";\n\t\t\t}\n\n\t\t\tt.open(method, url, async);\n\n\t\t\tif (headers){\n\t\t\t\tfor (var key in headers)\n\t\t\t\t\tt.setRequestHeader(key, headers[key]);\n\t\t\t} else if (method.toUpperCase() == \"POST\" || method == \"PUT\" || method == \"DELETE\") {\n\t\t\t\tt.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n\t\t\t} else if (method == \"GET\") {\n\t\t\t\tpostData = null;\n\t\t\t}\n\n\t\t\tt.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n\n\t\t\tt.send(postData);\n\n\t\t\tif (!async) return {xmlDoc:t, filePath:url}; // dhtmlx-compat, response.xmlDoc.responseXML/responseText\n\t\t}.bind(this)));\n\t},\n\turlSeparator: function(str){\n\t\tif (str.indexOf(\"?\") != -1)\n\t\t\treturn \"&\";\n\t\telse\n\t\t\treturn \"?\";\n\t}\n};\n\nscheduler.$ajax = scheduler.ajax; // for old\n\n}","export default function extend(scheduler) {\n\n/*\n%e\tDay of the month without leading zeros (01..31)\n%d\tDay of the month, 2 digits with leading zeros (01..31)\n%j\tDay of the year, 3 digits with leading zeros (001..366)\n%a\tA textual representation of a day, two letters\n%W\tA full textual representation of the day of the week\n\n%c\tNumeric representation of a month, without leading zeros (0..12)\n%m\tNumeric representation of a month, with leading zeros (00..12)\n%b\tA short textual representation of a month, three letters (Jan..Dec)\n%M\tA full textual representation of a month, such as January or March (January..December)\n\n%y\tA two digit representation of a year (93..03)\n%Y\tA full numeric representation of a year, 4 digits (1993..03)\n*/\n\nscheduler.config={\n\tdefault_date: \"%j %M %Y\",\n\tmonth_date: \"%F %Y\",\n\tload_date: \"%Y-%m-%d\",\n\tweek_date: \"%l\",\n\tday_date: \"%D %j\",\n\thour_date: \"%H:%i\",\n\tmonth_day: \"%d\",\n\t//xml_date: \"%m/%d/%Y %H:%i\",\n\tdate_format: \"%Y-%m-%d %H:%i\",\n\tapi_date: \"%d-%m-%Y %H:%i\",\n\tparse_exact_format: false,\n\tpreserve_length:true,\n\ttime_step: 5,\n\tdisplayed_event_color: \"#ff4a4a\",\n\tdisplayed_event_text_color: \"#ffef80\",\n\twide_form: 0,\n\tday_column_padding: 8,\n\tuse_select_menu_space: true,\n\tfix_tab_position: true,\n\tstart_on_monday: true,\n\tfirst_hour: 0,\n\tlast_hour: 24,\n\treadonly: false,\n\tdrag_resize: true,\n\tdrag_move: true,\n\tdrag_create: true,\n\tdrag_event_body: true,\n\tdblclick_create: true,\n\tdetails_on_dblclick: true,\n\tedit_on_create: true,\n\tdetails_on_create: true,\n\theader: null,\n\thour_size_px: 44,\n\tresize_month_events:false,\n\tresize_month_timed:false,\n\t\n\tresponsive_lightbox: false,\n\tseparate_short_events: true,\n\trtl:false,\n\n\tcascade_event_display: false,\n\tcascade_event_count: 4,\n\tcascade_event_margin: 30,\n\n\tmulti_day:true,\n\tmulti_day_height_limit: 200,\n\n\tdrag_lightbox: true,\n\tpreserve_scroll: true,\n\tselect: true,\n\n\tserver_utc: false,\n\ttouch:true,\n\ttouch_tip:true,\n\ttouch_drag:500,\n\ttouch_swipe_dates: false,\n\tquick_info_detached:true,\n\n\tpositive_closing: false,\n\t//header_datepicker: true,\n\tdrag_highlight: true,\n\tlimit_drag_out: false,\n\ticons_edit: [\"icon_save\", \"icon_cancel\"],\n\ticons_select: [\"icon_details\", \"icon_edit\", \"icon_delete\"],\n\tbuttons_left: [\"dhx_save_btn\", \"dhx_cancel_btn\"],\n\tbuttons_right: [\"dhx_delete_btn\"],\n\tlightbox: {\n\t\tsections: [\n\t\t\t{name: \"description\", map_to: \"text\", type: \"textarea\", focus: true},\n\t\t\t{name: \"time\", height: 72, type: \"time\", map_to: \"auto\"}\n\t\t]\n\t},\n\thighlight_displayed_event: true,\n\tleft_border: false,\n\n\tajax_error: \"alert\",//\"ignore\"|\"console\"\n\tdelay_render: 0,\n\ttimeline_swap_resize: true,\n\twai_aria_attributes: true,\n\twai_aria_application_role: true,\n\n\tcsp: \"auto\",\n\tevent_attribute: \"data-event-id\",\n\tshow_errors: true\n};\n\nscheduler.config.buttons_left.$initial = scheduler.config.buttons_left.join();\nscheduler.config.buttons_right.$initial = scheduler.config.buttons_right.join();\n\nscheduler._helpers = {\n\tparseDate: function parseDate(date) {\n\t\tvar parse = scheduler.templates.xml_date || scheduler.templates.parse_date;\n\t\treturn parse(date);\n\t},\n\tformatDate: function formatDate(date) {\n\t\tvar format = scheduler.templates.xml_format || scheduler.templates.format_date;\n\t\treturn format(date);\n\t}\n};\n\nscheduler.templates={};\nscheduler.init_templates=function(){\n\n\n\n\tvar d=scheduler.date.date_to_str;\n\tvar c=scheduler.config;\n\tvar f = function(a,b){\n\t\tfor (var c in b)\n\t\t\tif (!a[c]) a[c]=b[c];\n\t};\n\tf(scheduler.templates,{\n\t\tday_date:d(c.default_date),\n\t\tmonth_date:d(c.month_date),\n\t\tweek_date:function(d1,d2){\n\t\t\tif(c.rtl) {\n\t\t\t\treturn scheduler.templates.day_date(scheduler.date.add(d2,-1,\"day\"))+\" – \"+scheduler.templates.day_date(d1);\n\t\t\t} \n\t\t\treturn scheduler.templates.day_date(d1)+\" – \"+scheduler.templates.day_date(scheduler.date.add(d2,-1,\"day\"));\n\t\t},\n\t\tday_scale_date:d(c.default_date),\n\t\ttime_slot_text: function(date){\n\t\t\treturn \"\";\n\t\t},\n\t\ttime_slot_class: function(date){\n\t\t\treturn \"\";\n\t\t},\n\n\t\tmonth_scale_date:d(c.week_date),\n\t\tweek_scale_date:d(c.day_date),\n\t\thour_scale:d(c.hour_date),\n\t\ttime_picker:d(c.hour_date),\n\t\tevent_date:d(c.hour_date),\n\t\tmonth_day:d(c.month_day),\n\n\t\tload_format: d(c.load_date),\n\t//\txml_date:scheduler.date.str_to_date(c.xml_date,c.server_utc),\n\t//\txml_format:d(c.date_format,c.server_utc),\n\t\tformat_date: d(c.date_format, c.server_utc),\n\t\tparse_date:scheduler.date.str_to_date(c.date_format,c.server_utc),\n\t\tapi_date:scheduler.date.str_to_date(c.api_date, false, false),\n\t\tevent_header:function(start,end,ev){\n\n\t\t\tif(ev._mode === \"small\" || ev._mode === \"smallest\"){\n\t\t\t\treturn scheduler.templates.event_date(start);\n\t\t\t}else{\n\t\t\t\treturn scheduler.templates.event_date(start)+\" - \"+scheduler.templates.event_date(end);\n\t\t\t}\n\t\t},\n\t\tevent_text:function(start,end,ev){\n\t\t\treturn ev.text;\n\t\t},\n\t\tevent_class:function(start,end,ev){\n\t\t\treturn \"\";\n\t\t},\n\t\tmonth_date_class:function(d){\n\t\t\treturn \"\";\n\t\t},\n\t\tweek_date_class:function(d){\n\t\t\treturn \"\";\n\t\t},\n\t\tevent_bar_date:function(start,end,ev) {\n\t\t\treturn scheduler.templates.event_date(start);\n\t\t},\n\t\tevent_bar_text:function(start,end,ev){\n\t\t\treturn ev.text;\n\t\t},\n\t\tmonth_events_link : function(date, count){\n\t\t\treturn \"View more(\"+count+\" events) \";\n\t\t},\n\t\tdrag_marker_class : function(start, end, event){\n\t\t\treturn \"\";\n\t\t},\n\t\tdrag_marker_content : function(start, end, event){\n\t\t\treturn \"\";\n\t\t},\n\t\t/* Could be redifined */\n\t\ttooltip_date_format: scheduler.date.date_to_str(\"%Y-%m-%d %H:%i\"),\n\t\ttooltip_text: function(start, end, event) {\n\t\t\treturn \"Event: \" + event.text + \"Start date: \" + scheduler.templates.tooltip_date_format(start) + \"End date: \" + scheduler.templates.tooltip_date_format(end);\n\t\t},\n\n\t\tcalendar_month: d(\"%F %Y\"),\n\t\tcalendar_scale_date: d(\"%D\"),\n\t\tcalendar_date: d(\"%d\"),\n\t\tcalendar_time: d(\"%d-%m-%Y\")\n\n\t});\n\tthis.callEvent(\"onTemplatesReady\",[]);\n};\n\n\n}","export default function extend(scheduler) {\n\nscheduler._events = {};\nscheduler.clearAll = function() {\n\tthis._events = {};\n\tthis._loaded = {};\n\n\tthis._edit_id = null;\n\tthis._select_id = null;\n\tthis._drag_id = null;\n\tthis._drag_mode = null;\n\tthis._drag_pos = null;\n\tthis._new_event = null;\n\n\tthis.clear_view();\n\tthis.callEvent(\"onClearAll\", []);\n};\nscheduler.addEvent = function(start_date, end_date, text, id, extra_data) {\n\tif (!arguments.length)\n\t\treturn this.addEventNow();\n\tvar ev = start_date;\n\tif (arguments.length != 1) {\n\t\tev = extra_data || {};\n\t\tev.start_date = start_date;\n\t\tev.end_date = end_date;\n\t\tev.text = text;\n\t\tev.id = id;\n\t}\n\tev.id = ev.id || scheduler.uid();\n\tev.text = ev.text || \"\";\n\n\tif (typeof ev.start_date == \"string\") ev.start_date = this.templates.api_date(ev.start_date);\n\tif (typeof ev.end_date == \"string\") ev.end_date = this.templates.api_date(ev.end_date);\n\tvar d = (this.config.event_duration || this.config.time_step) * 60000;\n\tif (ev.start_date.valueOf() == ev.end_date.valueOf())\n\t\tev.end_date.setTime(ev.end_date.valueOf() + d);\n\n\tev.start_date.setMilliseconds(0);\n\tev.end_date.setMilliseconds(0);\n\n\tev._timed = this.isOneDayEvent(ev);\n\n\tvar is_new = !this._events[ev.id];\n\tthis._events[ev.id] = ev;\n\tthis.event_updated(ev);\n\tif (!this._loading)\n\t\tthis.callEvent(is_new ? \"onEventAdded\" : \"onEventChanged\", [ev.id, ev]);\n\treturn ev.id;\n};\nscheduler.deleteEvent = function(id, silent) {\n\tvar ev = this._events[id];\n\tif (!silent && (!this.callEvent(\"onBeforeEventDelete\", [id, ev]) || !this.callEvent(\"onConfirmedBeforeEventDelete\", [id, ev])))\n\t\treturn;\n\tif (ev) {\n\t\tif(scheduler.getState().select_id == id){\n\t\t\tscheduler.unselect();\n\t\t}\n\t\tdelete this._events[id];\n\t\tthis.event_updated(ev);\n\n\t\tif(this._drag_id == ev.id){\n\t\t\tthis._drag_id = null;\n\t\t\tthis._drag_mode=null;\n\t\t\tthis._drag_pos=null;\n\t\t}\n\t}\n\n\tthis.callEvent(\"onEventDeleted\", [id, ev]);\n};\nscheduler.getEvent = function(id) {\n\treturn this._events[id];\n};\nscheduler.setEvent = function(id, hash) {\n\tif(!hash.id)\n\t\thash.id = id;\n\n\tthis._events[id] = hash;\n};\nscheduler.for_rendered = function(id, method) {\n\tfor (var i = this._rendered.length - 1; i >= 0; i--)\n\t\tif (this._rendered[i].getAttribute(this.config.event_attribute) == id)\n\t\t\tmethod(this._rendered[i], i);\n};\nscheduler.changeEventId = function(id, new_id) {\n\tif (id == new_id) return;\n\tvar ev = this._events[id];\n\tif (ev) {\n\t\tev.id = new_id;\n\t\tthis._events[new_id] = ev;\n\t\tdelete this._events[id];\n\t}\n\tthis.for_rendered(id, function(r) {\n\t\tr.setAttribute(\"event_id\", new_id); // for backward compatibility\n\t\tr.setAttribute(scheduler.config.event_attribute, new_id);\n\t});\n\tif (this._select_id == id) this._select_id = new_id;\n\tif (this._edit_id == id) this._edit_id = new_id;\n\t//if (this._drag_id==id) this._drag_id=new_id;\n\tthis.callEvent(\"onEventIdChange\", [id, new_id]);\n};\n\n(function() {\n\tvar attrs = [\"text\", \"Text\", \"start_date\", \"StartDate\", \"end_date\", \"EndDate\"];\n\tvar create_getter = function(name) {\n\t\treturn function(id) { return (scheduler.getEvent(id))[name]; };\n\t};\n\tvar create_setter = function(name) {\n\t\treturn function(id, value) {\n\t\t\tvar ev = scheduler.getEvent(id);\n\t\t\tev[name] = value;\n\t\t\tev._changed = true;\n\t\t\tev._timed = this.isOneDayEvent(ev);\n\t\t\tscheduler.event_updated(ev, true);\n\t\t};\n\t};\n\tfor (var i = 0; i < attrs.length; i += 2) {\n\t\tscheduler[\"getEvent\" + attrs[i + 1]] = create_getter(attrs[i]);\n\t\tscheduler[\"setEvent\" + attrs[i + 1]] = create_setter(attrs[i]);\n\t}\n})();\n\nscheduler.event_updated = function(ev, force) {\n\tif (this.is_visible_events(ev))\n\t\tthis.render_view_data();\n\telse\n\t\tthis.clear_event(ev.id);\n};\nscheduler.is_visible_events = function(ev) {\n\tif(!this._min_date || !this._max_date){\n\t\treturn false;\n\t}\n\n\t//if in displayed dates\n\tvar in_visible_range = (ev.start_date.valueOf() < this._max_date.valueOf() && this._min_date.valueOf() < ev.end_date.valueOf());\n\n\tif(in_visible_range){\n\n\t\t//end dates are not between last/first hours\n\t\tvar evFirstHour = ev.start_date.getHours(),\n\t\t\tevLastHour = ev.end_date.getHours() + (ev.end_date.getMinutes()/60),\n\t\t\tlastHour = this.config.last_hour,\n\t\t\tfirstHour = this.config.first_hour;\n\n\t\tvar end_dates_visible = (this._table_view || !((evLastHour > lastHour || evLastHour <= firstHour) && (evFirstHour >= lastHour || evFirstHour < firstHour)));\n\n\t\tif(end_dates_visible){\n\t\t\treturn true;\n\t\t}else{\n\n\t\t\t//event is bigger than area hidden between last/first hours\n\t\t\tvar event_duration = (ev.end_date.valueOf() - ev.start_date.valueOf()) / (1000*60*60),//hours\n\t\t\t\thidden_duration = 24 - (this.config.last_hour - this.config.first_hour);\n\n\t\t\treturn !!((event_duration > hidden_duration) || (evFirstHour < lastHour && evLastHour > firstHour));\n\n\t\t}\n\t}else{\n\t\treturn false;\n\t}\n};\nscheduler.isOneDayEvent = function(ev) {\n\t// decrease by one ms so events that ends on midnight on the next day were still considered one day events\n\t// e.g. (09-02-2018 19:00 - 10-02-2018 00:00)\n\t// events >= 24h long are considered multiday\n\tvar checkEndDate = new Date(ev.end_date.valueOf() - 1);\n\treturn (\n\t\tev.start_date.getFullYear() === checkEndDate.getFullYear() &&\n\t\tev.start_date.getMonth() === checkEndDate.getMonth() &&\n\t\tev.start_date.getDate() === checkEndDate.getDate()\n\t) && ((ev.end_date.valueOf() - ev.start_date.valueOf()) < (1000 * 60 * 60 * 24));\n};\n\nscheduler.get_visible_events = function(only_timed) {\n\t//not the best strategy for sure\n\tvar stack = [];\n\n\tfor (var id in this._events)\n\t\tif (this.is_visible_events(this._events[id]))\n\t\t\tif (!only_timed || this._events[id]._timed)\n\t\t\t\tif (this.filter_event(id, this._events[id]))\n\t\t\t\t\tstack.push(this._events[id]);\n\n\treturn stack;\n};\nscheduler.filter_event = function(id, ev) {\n\tvar filter = this[\"filter_\" + this._mode];\n\treturn (filter) ? filter(id, ev) : true;\n};\nscheduler._is_main_area_event = function(ev){\n\treturn !!ev._timed;\n};\nscheduler.render_view_data = function(evs, hold) {\n\tvar full = false;\n\tif (!evs) {\n\t\tfull = true;\n\t\tif (this._not_render) {\n\t\t\tthis._render_wait = true;\n\t\t\treturn;\n\t\t}\n\t\tthis._render_wait = false;\n\n\t\tthis.clear_view();\n\t\tevs = this.get_visible_events(!(this._table_view || this.config.multi_day));\n\t}\n\tfor(var i= 0, len = evs.length; i < len; i++){\n\t\tthis._recalculate_timed(evs[i]);\n\t}\n\n\tif (this.config.multi_day && !this._table_view) {\n\n\t\tvar tvs = [];\n\t\tvar tvd = [];\n\t\tfor (var i = 0; i < evs.length; i++) {\n\t\t\tif (this._is_main_area_event(evs[i]))\n\t\t\t\ttvs.push(evs[i]);\n\t\t\telse\n\t\t\t\ttvd.push(evs[i]);\n\t\t}\n\n\t\tif(!this._els['dhx_multi_day']){\n\t\t\tvar message = scheduler._commonErrorMessages.unknownView(this._mode);\n\t\t\tthrow new Error(message);\n\t\t}\n\n\t\t// multiday events\n\t\tthis._rendered_location = this._els['dhx_multi_day'][0];\n\t\tthis._table_view = true;\n\t\tthis.render_data(tvd, hold);\n\t\tthis._table_view = false;\n\n\t\t// normal events\n\t\tthis._rendered_location = this._els['dhx_cal_data'][0];\n\t\tthis._table_view = false;\n\t\tthis.render_data(tvs, hold);\n\n\t} else {\n\t\tvar buffer = document.createDocumentFragment();\n\t\tvar renderedLocation = this._els['dhx_cal_data'][0];\n\t\tthis._rendered_location = buffer;\n\t\tthis.render_data(evs, hold);\n\t\trenderedLocation.appendChild(buffer);\n\t\tthis._rendered_location = renderedLocation;\n\n\t}\n\n\tif(full){\n\t\tthis.callEvent(\"onDataRender\", []);\n\t}\n};\n\n\nscheduler._view_month_day = function(e){\n\tvar date = scheduler.getActionData(e).date;\n\tif(!scheduler.callEvent(\"onViewMoreClick\", [date]))\n\t\treturn;\n\tscheduler.setCurrentView(date, \"day\");\n};\n\nscheduler._render_month_link = function(ev){\n\tvar parent = this._rendered_location;\n\tvar toRender = this._lame_clone(ev);\n\n\t//render links in each cell of multiday events\n\tfor(var d = ev._sday; d < ev._eday; d++){\n\n\t\ttoRender._sday = d;\n\t\ttoRender._eday = d+1;\n\n\t\tvar date = scheduler.date;\n\t\tvar curr = scheduler._min_date;\n\t\tcurr = date.add(curr, toRender._sweek, \"week\");\n\t\tcurr = date.add(curr, toRender._sday, \"day\");\n\t\tvar count = scheduler.getEvents(curr, date.add(curr, 1, \"day\")).length;\n\n\t\tvar pos = this._get_event_bar_pos(toRender);\n\t\tvar widt = (pos.x2 - pos.x);\n\n\t\tvar el = document.createElement(\"div\");\n\t\tscheduler.event(el, \"click\", function(e){scheduler._view_month_day(e);});\n\t\tel.className = \"dhx_month_link\";\n\t\tel.style.top = pos.y + \"px\";\n\t\tel.style.left = pos.x + \"px\";\n\t\tel.style.width = widt + \"px\";\n\t\tel.innerHTML = scheduler.templates.month_events_link(curr, count);\n\t\tthis._rendered.push(el);\n\n\t\tparent.appendChild(el);\n\t}\n};\n\nscheduler._recalculate_timed = function(id){\n\tif(!id) return;\n\tvar ev;\n\tif(typeof(id) != \"object\")\n\t\tev = this._events[id];\n\telse\n\t\tev = id;\n\tif(!ev) return;\n\tev._timed = scheduler.isOneDayEvent(ev);\n};\nscheduler.attachEvent(\"onEventChanged\", scheduler._recalculate_timed);\nscheduler.attachEvent(\"onEventAdded\", scheduler._recalculate_timed);\n\nscheduler.render_data = function(evs, hold) {\n\tevs = this._pre_render_events(evs, hold);\n\tvar containers = {};\n\tfor (var i = 0; i < evs.length; i++)\n\t\tif (this._table_view){\n\t\t\tif(scheduler._mode != 'month'){\n\t\t\t\tthis.render_event_bar(evs[i]);//may be multiday section on other views\n\t\t\t}else{\n\n\t\t\t\tvar max_evs = scheduler.config.max_month_events;\n\t\t\t\tif(max_evs !== max_evs*1 || evs[i]._sorder < max_evs){\n\t\t\t\t\t//of max number events per month cell is set and event can be rendered\n\t\t\t\t\tthis.render_event_bar(evs[i]);\n\t\t\t\t}else if(max_evs !== undefined && evs[i]._sorder == max_evs){\n\t\t\t\t\t//render 'view more' links\n\t\t\t\t\tscheduler._render_month_link(evs[i]);\n\t\t\t\t}else{\n\t\t\t\t\t//do not render events with ordinal number > maximum events per cell\n\t\t\t\t}\n\t\t\t}\n\n\n\n\t\t}else{\n\t\t\tvar ev = evs[i];\n\t\t\tvar parent = scheduler.locate_holder(ev._sday);\n\t\t\tif (!parent) continue; //attempt to render non-visible event\n\n\t\t\tif(!containers[ev._sday]){\n\t\t\t\tcontainers[ev._sday] = {\n\t\t\t\t\treal: parent,\n\t\t\t\t\tbuffer: document.createDocumentFragment(),\n\t\t\t\t\twidth: parent.clientWidth\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tvar container = containers[ev._sday];\n\t\t\tthis.render_event(ev, container.buffer, container.width);\n\t\t}\n\n\t\tfor(var i in containers){\n\t\t\tvar container = containers[i];\n\t\t\tif(container.real && container.buffer){\n\t\t\t\tcontainer.real.appendChild(container.buffer);\n\t\t\t}\n\t\t}\n};\n\nscheduler._get_first_visible_cell = function(cells) {\n\tfor (var i = 0; i < cells.length; i++) {\n\t\tif ((cells[i].className || \"\").indexOf(\"dhx_scale_ignore\") == -1) {\n\t\t\treturn cells[i];\n\t\t}\n\t}\n\t// if no visible cell found, return cells[0] to be more tolerant, since it's the original logic\n\treturn cells[0];\n};\n\nscheduler._pre_render_events = function(evs, hold) {\n\tvar hb = this.xy.bar_height;\n\tvar h_old = this._colsS.heights;\n\tvar h = this._colsS.heights = [0, 0, 0, 0, 0, 0, 0];\n\tvar data = this._els[\"dhx_cal_data\"][0];\n\n\tif (!this._table_view) {\n\t\tevs = this._pre_render_events_line(evs, hold); //ignore long events for now\n\t}\n\telse {\n\t\tevs = this._pre_render_events_table(evs, hold);\n\t}\n\tif (this._table_view) {\n\t\tif (hold)\n\t\t\tthis._colsS.heights = h_old;\n\t\telse {\n\t\t\tvar monthRows = data.querySelectorAll(\".dhx_cal_month_row\");\n\t\t\tif (monthRows.length) {\n\t\t\t\tfor (var i = 0; i < monthRows.length; i++) {\n\t\t\t\t\th[i]++;\n\t\t\t\t\tvar cells = monthRows[i].querySelectorAll(\".dhx_cal_month_cell\");\n\t\t\t\t\tvar cellHeight = this._colsS.height - this.xy.month_head_height;\n\t\t\t\t\tif ((h[i]) * hb > cellHeight) { // 22 - height of cell's header\n\t\t\t\t\t\t//we have overflow, update heights\n\n\t\t\t\t\t\tvar cHeight = cellHeight;\n\t\t\t\t\t\tif(this.config.max_month_events*1 !== this.config.max_month_events || h[i] <= this.config.max_month_events){\n\t\t\t\t\t\t\tcHeight = h[i] * hb;\n\t\t\t\t\t\t}else if( (this.config.max_month_events + 1) * hb > cellHeight){\n\t\t\t\t\t\t\tcHeight = (this.config.max_month_events + 1) * hb;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmonthRows[i].style.height = (cHeight + this.xy.month_head_height) + \"px\";\n\t\t\t\t\t}\n\n\t\t\t\t\th[i] = (h[i - 1] || 0) + scheduler._get_first_visible_cell(cells).offsetHeight;\n\t\t\t\t}\n\t\t\t\th.unshift(0);\n\t\t\t\tconst dataArea = this.$container.querySelector(\".dhx_cal_data\");\n\t\t\t\tif (dataArea.offsetHeight < dataArea.scrollHeight && !scheduler._colsS.scroll_fix && scheduler.xy.scroll_width) {\n\n\t\t\t\t\tvar scale_settings = scheduler._colsS,\n\t\t\t\t\t\tsum_width = scale_settings[scale_settings.col_length],\n\t\t\t\t\t\trow_heights = scale_settings.heights.slice();\n\n\t\t\t\t\tsum_width -= (scheduler.xy.scroll_width || 0);\n\t\t\t\t\tthis._calc_scale_sizes(sum_width, this._min_date, this._max_date);\n\t\t\t\t\tscheduler._colsS.heights = row_heights;\n\n\t\t\t\t\tthis.set_xy(this._els[\"dhx_cal_header\"][0], sum_width/*, this.xy.scale_height*/);\n\t\t\t\t\tscheduler._render_scales(this._els[\"dhx_cal_header\"][0]);\n\t\t\t\t\tscheduler._render_month_scale(this._els[\"dhx_cal_data\"][0], this._get_timeunit_start(), this._min_date);\n\n\t\t\t\t\tscale_settings.scroll_fix = true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (!evs.length && this._els[\"dhx_multi_day\"][0].style.visibility == \"visible\")\n\t\t\t\t\th[0] = -1;\n\t\t\t\tif (evs.length || h[0] == -1) {\n\t\t\t\t\t//shift days to have space for multiday events\n\t\t\t\t\t//var childs = evl.parentNode.childNodes;\n\n\t\t\t\t\t// +1 so multiday events would have 2px from top and 2px from bottom by default\n\t\t\t\t\tvar full_multi_day_height = (h[0] + 1) * hb + 4;\n\n\t\t\t\t\tvar used_multi_day_height = full_multi_day_height;\n\t\t\t\t\tvar used_multi_day_height_css = full_multi_day_height + \"px\";\n\t\t\t\t\tif (this.config.multi_day_height_limit) {\n\t\t\t\t\t\tused_multi_day_height = Math.min(full_multi_day_height, this.config.multi_day_height_limit) ;\n\t\t\t\t\t\tused_multi_day_height_css = used_multi_day_height + \"px\";\n\t\t\t\t\t}\n\n\t\t\t\t\tvar multi_day_section = this._els[\"dhx_multi_day\"][0];\n\t\t\t\t\tmulti_day_section.style.height = used_multi_day_height_css;\n\t\t\t\t\tmulti_day_section.style.visibility = (h[0] == -1 ? \"hidden\" : \"visible\");\n\t\t\t\t\tmulti_day_section.style.display = (h[0] == -1 ? \"none\" : \"\");\n\n\t\t\t\t\t// icon\n\t\t\t\t\tvar multi_day_icon = this._els[\"dhx_multi_day\"][1];\n\t\t\t\t\tmulti_day_icon.style.height = used_multi_day_height_css;\n\t\t\t\t\tmulti_day_icon.style.visibility = (h[0] == -1 ? \"hidden\" : \"visible\");\n\t\t\t\t\tmulti_day_icon.style.display = (h[0] == -1 ? \"none\" : \"\");\n\t\t\t\t\tmulti_day_icon.className = h[0] ? \"dhx_multi_day_icon\" : \"dhx_multi_day_icon_small\";\n\t\t\t\t\tthis._dy_shift = (h[0] + 1) * hb;\n\t\t\t\t\tif(this.config.multi_day_height_limit){\n\t\t\t\t\t\tthis._dy_shift = Math.min(this.config.multi_day_height_limit, this._dy_shift);\n\t\t\t\t\t}\n\t\t\t\t\th[0] = 0;\n\n\t\t\t\t\tif (used_multi_day_height != full_multi_day_height) {\n\n\t\t\t\t\t\tmulti_day_section.style.overflowY = \"auto\";\n\t\t\t\t\t//\tmulti_day_section.style.width = (parseInt(this._els[\"dhx_cal_navline\"][0].style.width)) + \"px\";\n\n\t\t\t\t\t\tmulti_day_icon.style.position = \"fixed\";\n\t\t\t\t\t\tmulti_day_icon.style.top = \"\";\n\t\t\t\t\t\tmulti_day_icon.style.left = \"\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn evs;\n};\nscheduler._get_event_sday = function(ev) {\n\t// get day in current view\n\t// use rounding for 23 or 25 hour days on DST\n\tvar datePart = this.date.day_start(new Date(ev.start_date));\n\treturn Math.round((datePart.valueOf() - this._min_date.valueOf()) / (24 * 60 * 60 * 1000));\n};\nscheduler._get_event_mapped_end_date = function(ev) {\n\tvar end_date = ev.end_date;\n\tif (this.config.separate_short_events) {\n\t\tvar ev_duration = (ev.end_date - ev.start_date) / 60000; // minutes\n\t\tif (ev_duration < this._min_mapped_duration) {\n\t\t\tend_date = this.date.add(end_date, this._min_mapped_duration - ev_duration, \"minute\");\n\t\t}\n\t}\n\treturn end_date;\n};\nscheduler._pre_render_events_line = function(evs, hold){\n\tevs.sort(function(a, b) {\n\t\tif (a.start_date.valueOf() == b.start_date.valueOf())\n\t\t\treturn a.id > b.id ? 1 : -1;\n\t\treturn a.start_date > b.start_date ? 1 : -1;\n\t});\n\tvar days = []; //events by weeks\n\tvar evs_originals = [];\n\n\tthis._min_mapped_duration = Math.floor(this.xy.min_event_height * 60 / this.config.hour_size_px); // values could change along the way\n\n\tfor (var i = 0; i < evs.length; i++) {\n\t\tvar ev = evs[i];\n\n\t\t//check date overflow\n\t\tvar sd = ev.start_date;\n\t\tvar ed = ev.end_date;\n\t\t//check scale overflow\n\t\tvar sh = sd.getHours();\n\t\tvar eh = ed.getHours();\n\t\tev._sday = this._get_event_sday(ev); // sday based on event start_date\n\t\tif (this._ignores[ev._sday]){\n\t\t\t//ignore event\n\t\t\tevs.splice(i,1);\n\t\t\ti--;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!days[ev._sday]) days[ev._sday] = [];\n\n\t\tif (!hold) {\n\t\t\tev._inner = false;\n\n\t\t\tvar stack = days[ev._sday];\n\n\t\t\twhile (stack.length) {\n\t\t\t\tvar t_ev = stack[stack.length - 1];\n\t\t\t\tvar t_end_date = this._get_event_mapped_end_date(t_ev);\n\t\t\t\tif (t_end_date.valueOf() <= ev.start_date.valueOf()) {\n\t\t\t\t\tstack.splice(stack.length - 1, 1);\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar slot_index = stack.length;\n\t\t\tvar sorderSet = false;\n\t\t\tfor (var j = 0; j < stack.length; j++) {\n\t\t\t\tvar t_ev = stack[j];\n\t\t\t\tvar t_end_date = this._get_event_mapped_end_date(t_ev);\n\t\t\t\tif (t_end_date.valueOf() <= ev.start_date.valueOf()) {\n\t\t\t\t\tsorderSet = true;\n\t\t\t\t\tev._sorder = t_ev._sorder;\n\t\t\t\t\tslot_index = j;\n\t\t\t\t\tev._inner = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (stack.length)\n\t\t\t\tstack[stack.length - 1]._inner = true;\n\n\t\t\tif (!sorderSet) {\n\t\t\t\tif (stack.length) {\n\t\t\t\t\tif (stack.length <= stack[stack.length - 1]._sorder) {\n\t\t\t\t\t\tif (!stack[stack.length - 1]._sorder)\n\t\t\t\t\t\t\tev._sorder = 0;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tfor (j = 0; j < stack.length; j++) {\n\t\t\t\t\t\t\t\tvar _is_sorder = false;\n\t\t\t\t\t\t\t\tfor (var k = 0; k < stack.length; k++) {\n\t\t\t\t\t\t\t\t\tif (stack[k]._sorder == j) {\n\t\t\t\t\t\t\t\t\t\t_is_sorder = true;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (!_is_sorder) {\n\t\t\t\t\t\t\t\t\tev._sorder = j;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\tev._inner = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar _max_sorder = stack[0]._sorder;\n\t\t\t\t\t\tfor (j = 1; j < stack.length; j++) {\n\t\t\t\t\t\t\tif (stack[j]._sorder > _max_sorder)\n\t\t\t\t\t\t\t\t_max_sorder = stack[j]._sorder;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tev._sorder = _max_sorder + 1;\n\t\t\t\t\t\tev._inner = false;\n\t\t\t\t\t}\n\n\t\t\t\t} else\n\t\t\t\t\tev._sorder = 0;\n\t\t\t}\n\n\t\t\tstack.splice(slot_index, slot_index == stack.length ? 0 : 1, ev);\n\n\t\t\tif (stack.length > (stack.max_count || 0)) {\n\t\t\t\tstack.max_count = stack.length;\n\t\t\t\tev._count = stack.length;\n\t\t\t} else {\n\t\t\t\tev._count = (ev._count) ? ev._count : 1;\n\t\t\t}\n\t\t}\n\n\t\tif (sh < this.config.first_hour || eh >= this.config.last_hour) {\n\t\t\t// Need to create copy of event as we will be changing it's start/end date\n\t\t\t// e.g. first_hour = 11 and event.start_date hours = 9. Need to preserve that info\n\t\t\tevs_originals.push(ev);\n\t\t\tevs[i] = ev = this._copy_event(ev);\n\n\t\t\tif (sh < this.config.first_hour) {\n\t\t\t\tev.start_date.setHours(this.config.first_hour);\n\t\t\t\tev.start_date.setMinutes(0);\n\t\t\t}\n\t\t\tif (eh >= this.config.last_hour) {\n\t\t\t\tev.end_date.setMinutes(0);\n\t\t\t\tev.end_date.setHours(this.config.last_hour);\n\t\t\t}\n\n\t\t\tif (ev.start_date > ev.end_date || sh == this.config.last_hour) {\n\t\t\t\tevs.splice(i, 1);\n\t\t\t\ti--;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t}\n\tif (!hold) {\n\t\tfor (var i = 0; i < evs.length; i++) {\n\t\t\tevs[i]._count = days[evs[i]._sday].max_count;\n\t\t}\n\t\tfor (var i = 0; i < evs_originals.length; i++)\n\t\t\tevs_originals[i]._count = days[evs_originals[i]._sday].max_count;\n\t}\n\n\treturn evs;\n};\nscheduler._time_order = function(evs) {\n\tevs.sort(function(a, b) {\n\t\tif (a.start_date.valueOf() == b.start_date.valueOf()) {\n\t\t\tif (a._timed && !b._timed) return 1;\n\t\t\tif (!a._timed && b._timed) return -1;\n\t\t\treturn a.id > b.id ? 1 : -1;\n\t\t}\n\t\treturn a.start_date > b.start_date ? 1 : -1;\n\t});\n};\n\nscheduler._is_any_multiday_cell_visible = function(from, to, event){\n\tvar cols = this._cols.length;\n\tvar isAnyCellVisible = false;\n\tvar checkDate = from;\n\tvar noCells = true;\n\tvar lastDayEnd = new Date(to);\n\tif(scheduler.date.day_start(new Date(to)).valueOf() != to.valueOf()){\n\t\tlastDayEnd = scheduler.date.day_start(lastDayEnd);\n\t\tlastDayEnd = scheduler.date.add(lastDayEnd, 1, \"day\");\n\t}\n\twhile(checkDate < lastDayEnd){\n\t\tnoCells = false;\n\t\tvar cellIndex = this.locate_holder_day(checkDate, false, event);\n\t\tvar weekCellIndex = cellIndex % cols;\n\t\tif(!this._ignores[weekCellIndex]){\n\t\t\tisAnyCellVisible = true;\n\t\t\tbreak;\n\t\t}\n\t\tcheckDate = scheduler.date.add(checkDate, 1, \"day\");\n\t}\n\treturn noCells || isAnyCellVisible;\n};\n\nscheduler._pre_render_events_table = function(evs, hold) { // max - max height of week slot\n\tthis._time_order(evs);\n\tvar out = [];\n\tvar weeks = [\n\t\t[],\n\t\t[],\n\t\t[],\n\t\t[],\n\t\t[],\n\t\t[],\n\t\t[]\n\t]; //events by weeks\n\tvar max = this._colsS.heights;\n\tvar start_date;\n\tvar cols = this._cols.length;\n\tvar chunks_info = {};\n\n\tfor (var i = 0; i < evs.length; i++) {\n\t\tvar ev = evs[i];\n\t\tvar id = ev.id;\n\t\tif (!chunks_info[id]) {\n\t\t\tchunks_info[id] = {\n\t\t\t\tfirst_chunk: true,\n\t\t\t\tlast_chunk: true\n\t\t\t};\n\t\t}\n\t\tvar chunk_info = chunks_info[id];\n\t\tvar sd = (start_date || ev.start_date);\n\t\tvar ed = ev.end_date;\n\t\t//trim events which are crossing through current view\n\t\tif (sd < this._min_date) {\n\t\t\tchunk_info.first_chunk = false;\n\t\t\tsd = this._min_date;\n\t\t}\n\t\tif (ed > this._max_date) {\n\t\t\tchunk_info.last_chunk = false;\n\t\t\ted = this._max_date;\n\t\t}\n\n\t\tvar locate_s = this.locate_holder_day(sd, false, ev);\n\t\tev._sday = locate_s % cols;\n\t\t//skip single day events for ignored dates\n\t\tif (this._ignores[ev._sday] && ev._timed) continue;\n\n\t\tvar locate_e = this.locate_holder_day(ed, true, ev) || cols;\n\t\tev._eday = (locate_e % cols) || cols; //cols used to fill full week, when event end on monday\n\t\tev._length = locate_e - locate_s;\n\t\t//3600000 - compensate 1 hour during winter|summer time shift\n\t\tev._sweek = Math.floor((this._correct_shift(sd.valueOf(), 1) - this._min_date.valueOf()) / (60 * 60 * 1000 * 24 * cols));\n\n\t\tvar isAnyCellVisible = scheduler._is_any_multiday_cell_visible(sd, ed, ev);\n\n\t\tif(!isAnyCellVisible){\n\t\t\tcontinue;\n\t\t}\n\n\t\t//current slot\n\t\tvar stack = weeks[ev._sweek];\n\t\t//check order position\n\t\tvar stack_line;\n\n\t\tfor (stack_line = 0; stack_line < stack.length; stack_line++)\n\t\t\tif (stack[stack_line]._eday <= ev._sday)\n\t\t\t\tbreak;\n\n\t\tif (!ev._sorder || !hold) {\n\t\t\tev._sorder = stack_line;\n\t\t}\n\n\t\tif (ev._sday + ev._length <= cols) {\n\t\t\tstart_date = null;\n\t\t\tout.push(ev);\n\t\t\tstack[stack_line] = ev;\n\t\t\t//get max height of slot\n\t\t\tmax[ev._sweek] = stack.length - 1;\n\t\t\tev._first_chunk = chunk_info.first_chunk;\n\t\t\tev._last_chunk = chunk_info.last_chunk;\n\t\t} else { // split long event in chunks\n\t\t\tvar copy = this._copy_event(ev);\n\t\t\tcopy.id = ev.id;\n\t\t\tcopy._length = cols - ev._sday;\n\t\t\tcopy._eday = cols;\n\t\t\tcopy._sday = ev._sday;\n\t\t\tcopy._sweek = ev._sweek;\n\t\t\tcopy._sorder = ev._sorder;\n\t\t\tcopy.end_date = this.date.add(sd, copy._length, \"day\");\n\t\t\tcopy._first_chunk = chunk_info.first_chunk;\n\t\t\tif (chunk_info.first_chunk) {\n\t\t\t\tchunk_info.first_chunk = false;\n\t\t\t}\n\n\t\t\tout.push(copy);\n\t\t\tstack[stack_line] = copy;\n\t\t\tstart_date = copy.end_date;\n\t\t\t//get max height of slot\n\t\t\tmax[ev._sweek] = stack.length - 1;\n\t\t\ti--;\n\t\t\tcontinue; //repeat same step\n\t\t}\n\t}\n\treturn out;\n};\nscheduler._copy_dummy = function() {\n\tvar a = new Date(this.start_date);\n\tvar b = new Date(this.end_date);\n\tthis.start_date = a;\n\tthis.end_date = b;\n};\nscheduler._copy_event = function(ev) {\n\tthis._copy_dummy.prototype = ev;\n\treturn new this._copy_dummy();\n\t//return {start_date:ev.start_date, end_date:ev.end_date, text:ev.text, id:ev.id}\n};\nscheduler._rendered = [];\nscheduler.clear_view = function() {\n\tfor (var i = 0; i < this._rendered.length; i++) {\n\t\tvar obj = this._rendered[i];\n\t\tif (obj.parentNode) obj.parentNode.removeChild(obj);\n\t}\n\tthis._rendered = [];\n};\nscheduler.updateEvent = function(id) {\n\tvar ev = this.getEvent(id);\n\tthis.clear_event(id);\n\n\tif (ev && this.is_visible_events(ev) && this.filter_event(id, ev) && (this._table_view || this.config.multi_day || ev._timed)) {\n\t\tif (this.config.update_render){\n\t\t\tthis.render_view_data();\n\t\t}else{\n\t\t\tif(this.getState().mode == \"month\" && !this.getState().drag_id && !this.isOneDayEvent(ev)){\n\t\t\t\tthis.render_view_data();\n\t\t\t}else{\n\t\t\t\tthis.render_view_data([ev], true);\n\t\t\t}\n\t\t}\n\t}\n};\nscheduler.clear_event = function(id) {\n\tthis.for_rendered(id, function(node, i) {\n\t\tif (node.parentNode)\n\t\t\tnode.parentNode.removeChild(node);\n\t\tscheduler._rendered.splice(i, 1);\n\t});\n};\nscheduler._y_from_date = function(date){\n\tvar sm = date.getHours() * 60 + date.getMinutes();\n\treturn ((Math.round((sm * 60 * 1000 - this.config.first_hour * 60 * 60 * 1000) * this.config.hour_size_px / (60 * 60 * 1000))) % (this.config.hour_size_px * 24)); //42px/hour\n};\nscheduler._calc_event_y = function(ev, min_height){\n\tmin_height = min_height || 0;\n\tvar sm = ev.start_date.getHours() * 60 + ev.start_date.getMinutes();\n\tvar em = (ev.end_date.getHours() * 60 + ev.end_date.getMinutes()) || (scheduler.config.last_hour * 60);\n\tvar top = this._y_from_date(ev.start_date);\n\n\tvar height = Math.max(min_height, (em - sm) * this.config.hour_size_px / 60); //42px/hour\n\treturn {\n\t\ttop: top,\n\t\theight: height\n\t};\n};\nscheduler.render_event = function(ev, buffer, parentWidth) {\n\tvar menu = scheduler.xy.menu_width;\n\tvar menu_offset = (this.config.use_select_menu_space) ? 0 : menu;\n\tif (ev._sday < 0) return; //can occur in case of recurring event during time shift\n\n\tvar parent = scheduler.locate_holder(ev._sday);\n\tif (!parent) return; //attempt to render non-visible event\n\n\tbuffer = buffer || parent;\n\n\tvar pos_y = this._calc_event_y(ev, scheduler.xy.min_event_height);\n\tvar top = pos_y.top,\n\t\theight = pos_y.height;\n\n\tvar ev_count = ev._count || 1;\n\tvar ev_sorder = ev._sorder || 0;\n\n\tparentWidth = parentWidth || parent.clientWidth;\n\tif(this.config.day_column_padding){\n\t\tparentWidth -= this.config.day_column_padding;\n\t}\n\n\tvar width = Math.floor((parentWidth - menu_offset) / ev_count);\n\tvar left = ev_sorder * width + (ev_sorder > 0 ? 2 : 1);\n\tif (!ev._inner) width = width * (ev_count - ev_sorder);\n\tif (this.config.cascade_event_display) {\n\t\tvar limit = this.config.cascade_event_count;\n\t\tvar margin = this.config.cascade_event_margin;\n\t\tleft = ev_sorder % limit * margin;\n\t\tvar right = (ev._inner) ? (ev_count - ev_sorder - 1) % limit * margin / 2 : 0;\n\t\twidth = Math.floor(parentWidth - menu_offset - left - right);\n\t}\n\n\tif(height < 30){\n\t\tev._mode = \"smallest\";\n\t}else if(height < 42){\n\t\tev._mode = \"small\";\n\t}else{\n\t\tev._mode = null;\n\t}\n\n\tvar d = this._render_v_bar(ev, menu_offset + left, top, width, height, ev._text_style, scheduler.templates.event_header(ev.start_date, ev.end_date, ev), scheduler.templates.event_text(ev.start_date, ev.end_date, ev));\n\t\n\tif(ev._mode === \"smallest\"){\n\t\td.classList.add(\"dhx_cal_event--xsmall\");\n\t}else if (ev._mode === \"small\"){\n\t\td.classList.add(\"dhx_cal_event--small\");\n\t}\n\n\tthis._waiAria.eventAttr(ev, d);\n\tthis._rendered.push(d);\n\tbuffer.appendChild(d);\n\n\tvar parentPosition = parseInt( this.config.rtl ? parent.style.right : parent.style.left, 10);\n\n\tleft = left + parentPosition + menu_offset;\n\n\tif (this._edit_id == ev.id) {\n\n\t\td.style.zIndex = 1; //fix overlapping issue\n\t\twidth = Math.max(width, scheduler.xy.editor_width);\n\t\td = document.createElement(\"div\");\n\t\td.setAttribute(\"event_id\", ev.id); // for backward compatibility\n\t\td.setAttribute(this.config.event_attribute, ev.id);\n\n\t\tthis._waiAria.eventAttr(ev, d);\n\n\t\td.className = \"dhx_cal_event dhx_cal_editor\";\n\t\tif (this.config.rtl) left++;\n\t\tthis.set_xy(d, width, height, left, top);\n\n\n\t\tif(ev.color){\n\t\t\td.style.setProperty(\"--dhx-scheduler-event-background\", ev.color);\n\t\t}\n\t\tvar tplClass = scheduler.templates.event_class(ev.start_date, ev.end_date, ev);\n\n\t\tif(tplClass){\n\t\t\td.className += \" \" + tplClass;\n\t\t}\n\t\tvar d2 = document.createElement(\"div\");\n\t\td2.style.cssText += \"overflow:hidden;height:100%\";\n\n\t\td.appendChild(d2);\n\t\tthis._els[\"dhx_cal_data\"][0].appendChild(d);\n\t\tthis._rendered.push(d);\n\n\t\td2.innerHTML = \"\";\n\t\tthis._editor = d2.querySelector(\"textarea\");\n\t\t\n\t\tscheduler.event(this._editor, \"keydown\", function(e) {\n\t\t\tif (e.shiftKey) return true;\n\t\t\tvar code = e.keyCode;\n\t\t\tif (code == scheduler.keys.edit_save) scheduler.editStop(true);\n\t\t\tif (code == scheduler.keys.edit_cancel) scheduler.editStop(false);\n\n\t\t\tif(code == scheduler.keys.edit_save || code == scheduler.keys.edit_cancel){\n\t\t\t\tif(e.preventDefault) e.preventDefault();\n\t\t\t}\n\t\t});\n\t\tscheduler.event(this._editor, \"selectstart\", function (e) {\n\t\t\te.cancelBubble = true;\n\t\t\treturn true;\n\t\t});\n\t\tscheduler._focus(this._editor, true);\n\t\t//IE and opera can add x-scroll during focusing\n\t\tthis._els[\"dhx_cal_data\"][0].scrollLeft = 0;\n\t}\n\tif (this.xy.menu_width !== 0 && this._select_id == ev.id) {\n\n\t\tif (this.config.cascade_event_display && this._drag_mode)\n\t\t\td.style.zIndex = 1; //fix overlapping issue for cascade view in case of dnd of selected event\n\t\tvar icons = this.config[\"icons_\" + ((this._edit_id == ev.id) ? \"edit\" : \"select\")];\n\t\tvar icons_str = \"\";\n\n\t\tvar ariaAttr;\n\n\t\tfor (var i = 0; i < icons.length; i++) {\n\t\t\tconst currentIcon = icons[i];\n\t\t\tariaAttr = this._waiAria.eventMenuAttrString(currentIcon);\n\t\t\ticons_str += ``;\n\t\t}\n\t\tvar obj = this._render_v_bar(ev, left - menu - 1, top, menu, null, \"\", \"\", icons_str, true);\n\n\t\tif(ev.color){\n\t\t\tobj.style.setProperty(\"--dhx-scheduler-event-background\", ev.color);\n\t\t}\n\t\tif(ev.textColor){\n\t\t\tobj.style.setProperty(\"--dhx-scheduler-event-color\", ev.textColor);\n\t\t}\n\n\t\t//obj.style.left = left - menu + 1;\n\t\tthis._els[\"dhx_cal_data\"][0].appendChild(obj);\n\t\tthis._rendered.push(obj);\n\t}\n\tif(this.config.drag_highlight && this._drag_id == ev.id){\n\t\tthis.highlightEventPosition(ev);\n\t}\n};\nscheduler._render_v_bar = function (ev, x, y, w, h, style, contentA, contentB, bottom) {\n\tvar d = document.createElement(\"div\");\n\tvar id = ev.id;\n\tvar cs = (bottom) ? \"dhx_cal_event dhx_cal_select_menu\" : \"dhx_cal_event\";\n\n\tvar state = scheduler.getState();\n\tif(state.drag_id == ev.id){\n\t\tcs += \" dhx_cal_event_drag\";\n\t}\n\n\tif(state.select_id == ev.id){\n\t\tcs += \" dhx_cal_event_selected\";\n\t}\n\n\tvar cse = scheduler.templates.event_class(ev.start_date, ev.end_date, ev);\n\tif (cse) cs = cs + \" \" + cse;\n\n\tif(this.config.cascade_event_display) {\n\t\tcs += \" dhx_cal_event_cascade\";\n\t}\n\n\tvar boxWidth = w;\n\n\tvar html = '
';\n\td.innerHTML = html;\n\n\tvar container = d.cloneNode(true).firstChild;\n\n\tif (!bottom && scheduler.renderEvent(container, ev, w, h, contentA, contentB)) {\n\t\tif(ev.color){\n\t\t\tcontainer.style.setProperty(\"--dhx-scheduler-event-background\", ev.color);\n\t\t}\n\t\tif(ev.textColor){\n\t\t\tcontainer.style.setProperty(\"--dhx-scheduler-event-color\", ev.textColor);\n\t\t}\n\n\t\treturn container;\n\t} else {\n\t\tcontainer = d.firstChild;\n\t\tif(ev.color){\n\t\t\tcontainer.style.setProperty(\"--dhx-scheduler-event-background\", ev.color);\n\t\t}\n\t\tif(ev.textColor){\n\t\t\tcontainer.style.setProperty(\"--dhx-scheduler-event-color\", ev.textColor);\n\t\t}\n\n\t\tvar inner_html = '
';\n\t\tinner_html += '' + contentA + '
';\n\t\tinner_html += '' + contentB + '
'; // +2 css specific, moved from render_event\n\n\t\tvar footer_class = \"dhx_event_resize dhx_footer\";\n\t\tif (bottom || ev._drag_resize === false)\n\t\t\tfooter_class = \"dhx_resize_denied \" + footer_class;\n\n\t\tinner_html += '
';\n\n\t\tcontainer.innerHTML = inner_html;\n\t}\n\n\treturn container;\n};\nscheduler.renderEvent = function(){\n\treturn false;\n};\nscheduler.locate_holder = function(day) {\n\tif (this._mode == \"day\") return this._els[\"dhx_cal_data\"][0].firstChild; //dirty\n\treturn this._els[\"dhx_cal_data\"][0].childNodes[day];\n};\nscheduler.locate_holder_day = function(date, past) {\n\tvar day = Math.floor((this._correct_shift(date, 1) - this._min_date) / (60 * 60 * 24 * 1000));\n\t//when locating end data of event , we need to use next day if time part was defined\n\tif (past && this.date.time_part(date)) day++;\n\treturn day;\n};\n\n\n\nscheduler._get_dnd_order = function(order, ev_height, max_height){\n\tif(!this._drag_event)\n\t\treturn order;\n\tif(!this._drag_event._orig_sorder)\n\t\tthis._drag_event._orig_sorder = order;\n\telse\n\t\torder = this._drag_event._orig_sorder;\n\n\tvar evTop = ev_height * order;\n\twhile((evTop + ev_height) > max_height){\n\t\torder--;\n\t\tevTop -= ev_height;\n\t}\n\torder = Math.max(order, 0);\n\treturn order;\n};\n//scheduler._get_event_bar_pos = function(sday, eday, week, drag){\nscheduler._get_event_bar_pos = function(ev){\n\tvar rtl = this.config.rtl;\n\tvar columns = this._colsS;\n\tvar x = columns[ev._sday];\n\tvar x2 = columns[ev._eday];\n\tif (rtl) {\n\t\tx = columns[columns.col_length] - columns[ev._eday] + columns[0];\n\t\tx2 = columns[columns.col_length] - columns[ev._sday] + columns[0];\n\t}\n\n\tif (x2 == x) x2 = columns[ev._eday + 1];\n\tvar hb = this.xy.bar_height;\n\n\tvar order = ev._sorder;\n\tif(ev.id == this._drag_id){\n\t\tvar cellHeight = columns.heights[ev._sweek + 1] - columns.heights[ev._sweek]- this.xy.month_head_height;//22 for month head height\n\t\torder = scheduler._get_dnd_order(order, hb, cellHeight);\n\t}\n\tvar y_event_offset = order * hb;\n\tvar y = columns.heights[ev._sweek] + (columns.height ? (this.xy.month_scale_height + 2) : 2 ) + y_event_offset;\n\treturn {x:x, x2:x2, y:y};\n};\n\nscheduler.render_event_bar = function (ev) {\n\tvar parent = this._rendered_location;\n\tvar pos = this._get_event_bar_pos(ev);\n\tvar y = pos.y;\n\tvar x = pos.x;\n\tvar x2 = pos.x2;\n\t// resize for month mutliday events\n\tvar resize_handle = \"\";\n\n\t//events in ignored dates\n\n\tif (!x2) return;\n\n\tvar resizable = scheduler.config.resize_month_events && this._mode == \"month\" &&\n\t\t(!ev._timed || scheduler.config.resize_month_timed);\n\n\tvar d = document.createElement(\"div\");\n\tvar left_chunk = (ev.hasOwnProperty(\"_first_chunk\") && ev._first_chunk),\n\t\tright_chunk = (ev.hasOwnProperty(\"_last_chunk\") && ev._last_chunk);\n\n\tvar resize_left = resizable && (ev._timed || left_chunk);\n\tvar resize_right = resizable && (ev._timed || right_chunk);\n\n\tvar timed = true;\n\tvar cs = \"dhx_cal_event_clear\";\n\tif (!ev._timed || resizable) {\n\t\ttimed = false;\n\t\tcs = \"dhx_cal_event_line\";\n\t}\n\tif(left_chunk){\n\t\tcs += \" dhx_cal_event_line_start\";\n\t}\n\tif(right_chunk){\n\t\tcs += \" dhx_cal_event_line_end\";\n\t}\n\tif(resize_left){\n\t\tresize_handle += \"
\";\n\t}\n\tif(resize_right){\n\t\tresize_handle += \"
\";\n\t}\n\n\tvar cse = scheduler.templates.event_class(ev.start_date, ev.end_date, ev);\n\tif (cse){\n\t\tcs += \" \" + cse;\n\t}\n\n\tvar bg_color = (ev.color ? (\"--dhx-scheduler-event-background:\" + ev.color + \";\") : \"\");\n\tvar color = (ev.textColor ? (\"--dhx-scheduler-event-color:\" + ev.textColor + \";\") : \"\");\n\n\tvar style_text = [\n\t\t\"position:absolute\",\n\t\t\"top:\" + y + \"px\",\n\t\t\"left:\" + x + \"px\",\n\t\t\"width:\" + (x2 - x - (timed ? 1 : 0)) + \"px\",\n\t\t\"height:\" + (this.xy.bar_height - 2) + \"px\",\n\t\tcolor,\n\t\tbg_color,\n\t\t(ev._text_style || \"\")\n\t].join(\";\");\n\n\tvar html = \"\";\n\tif (resizable) {\n\t\thtml += resize_handle;\n\t}\n\tif(scheduler.getState().mode == \"month\"){\n\t\tev = scheduler.getEvent(ev.id); // ev at this point could be a part (row in a month view) of a larger event\n\t}\n\n\tif (ev._timed){\n\t\thtml += `
${scheduler.templates.event_bar_date(ev.start_date, ev.end_date, ev)} `;\n\t}\n\n\thtml += \"
\";\n\thtml += scheduler.templates.event_bar_text(ev.start_date, ev.end_date, ev) + '
';\n\thtml += \"
\";\n\thtml += ' ';\n\n\td.innerHTML = html;\n\n\tthis._rendered.push(d.firstChild);\n\tparent.appendChild(d.firstChild);\n};\n\nscheduler._locate_event = function(node) {\n\tvar id = null;\n\twhile (node && !id && node.getAttribute) {\n\t\tid = node.getAttribute(this.config.event_attribute);\n\t\tnode = node.parentNode;\n\t}\n\treturn id;\n};\n\nscheduler.edit = function(id) {\n\tif (this._edit_id == id) return;\n\tthis.editStop(false, id);\n\tthis._edit_id = id;\n\tthis.updateEvent(id);\n};\nscheduler.editStop = function(mode, id) {\n\tif (id && this._edit_id == id) return;\n\tvar ev = this.getEvent(this._edit_id);\n\tif (ev) {\n\t\tif (mode) ev.text = this._editor.value;\n\t\tthis._edit_id = null;\n\t\tthis._editor = null;\n\t\tthis.updateEvent(ev.id);\n\t\tthis._edit_stop_event(ev, mode);\n\t}\n};\nscheduler._edit_stop_event = function(ev, mode) {\n\tif (this._new_event) {\n\t\tif (!mode) {\n\t\t\tif (ev) // in case of custom lightbox user can already delete event\n\t\t\t\tthis.deleteEvent(ev.id, true);\n\t\t} else {\n\t\t\tthis.callEvent(\"onEventAdded\", [ev.id, ev]);\n\t\t}\n\t\tthis._new_event = null;\n\t} else {\n\t\tif (mode){\n\t\t\tthis.callEvent(\"onEventChanged\", [ev.id, ev]);\n\t\t}\n\t}\n};\n\nscheduler.getEvents = function(from, to) {\n\tvar result = [];\n\tfor (var a in this._events) {\n\t\tvar ev = this._events[a];\n\t\tif (ev && ( (!from && !to) || (ev.start_date < to && ev.end_date > from) ))\n\t\t\tresult.push(ev);\n\t}\n\treturn result;\n};\nscheduler.getRenderedEvent = function(id) {\n\tif (!id)\n\t\treturn;\n\tvar rendered_events = scheduler._rendered;\n\tfor (var i=0; i
-1){\n\t\t\t\t\tsection = section.split(scheduler.config.section_delimiter)[0];\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar top = timeline.getSectionTop(section);\n\t\t\tvar left = timeline.posFromDate(event.start_date);\n\t\t\tvar container = scheduler.$container.querySelector(\".dhx_timeline_data_wrapper\");\n\t\t\tleft = left - (container.offsetWidth - timeline.dx) / 2;\n\t\t\ttop = top - container.offsetHeight / 2 + timeline.dy/2;\n\n\t\t\tif (timeline._smartRenderingEnabled()) {\n\t\t\t\tvar handlerId = timeline.attachEvent(\"onScroll\", function(){\n\t\t\t\t\trestoreOriginalColors();\n\t\t\t\t\ttimeline.detachEvent(handlerId);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\ttimeline.scrollTo({\n\t\t\t\tleft: left,\n\t\t\t\ttop: top\n\t\t\t});\n\t\t\tif (!timeline._smartRenderingEnabled()) {\n\t\t\t\trestoreOriginalColors();\n\t\t\t}\n\t\t}\n\t}else{\n\t\trestoreOriginalColors();\n\t}\n\n\tscheduler.callEvent(\"onAfterEventDisplay\", [ev, mode]);\n};\n\n\n}","export default function extend(scheduler) {\n\n\nscheduler._append_drag_marker = function(m){\n\tif(m.parentNode) return;\n\tvar zone = scheduler._els[\"dhx_cal_data\"][0];\n\n\tvar scale = zone.lastChild;\n\tvar className = scheduler._getClassName(scale);\n\tif(className.indexOf(\"dhx_scale_holder\") < 0 && scale.previousSibling){\n\t\tscale = scale.previousSibling;\n\t}\n\n\tclassName = scheduler._getClassName(scale);\n\tif (scale && className.indexOf(\"dhx_scale_holder\") === 0) {\n\t\tscale.appendChild(m);\n\t}\n};\n\nscheduler._update_marker_position = function(m, event){\n\tvar size = scheduler._calc_event_y(event, 0);\n\tm.style.top = size.top + \"px\";\n\tm.style.height = size.height + \"px\";\n};\n\nscheduler.highlightEventPosition = function(event){\n\tvar m = document.createElement(\"div\");\n\n\tm.setAttribute(\"event_id\", event.id); // for backward compatibility\n\tm.setAttribute(this.config.event_attribute, event.id);\n\tthis._rendered.push(m);\n\tthis._update_marker_position(m, event);\n\n\tvar css = this.templates.drag_marker_class(event.start_date, event.end_date, event);\n\tvar html = this.templates.drag_marker_content(event.start_date, event.end_date, event);\n\tm.className = \"dhx_drag_marker\";\n\tif(css)\n\t\tm.className += \" \" + css;\n\tif(html)\n\t\tm.innerHTML = html;\n\tthis._append_drag_marker(m);\n};\n\n}","export default function extend(scheduler) {\n\nscheduler._lightbox_controls = {};\nscheduler.formSection = function(name){\n\tvar config = this.config.lightbox.sections;\n\tvar i = 0;\n\tfor (i; i < config.length; i++) {\n\t\tif (config[i].name == name) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (i === config.length) {\n\t\t// GS-1662 section not found, should exit here instead of throwing an error\n\t\treturn null;\n\t}\n\n\tvar section = config[i];\n\tif (!scheduler._lightbox) {\n\t\tscheduler.getLightbox();\n\t}\n\tvar header = scheduler._lightbox.querySelector(`#${section.id}`);\n\tvar node = header.nextSibling;\n\n\tvar result = {\n\t\tsection: section,\n\t\theader: header,\n\t\tnode: node,\n\t\tgetValue:function(ev){\n\t\t\treturn scheduler.form_blocks[section.type].get_value(node, (ev||{}), section);\n\t\t},\n\t\tsetValue:function(value, ev){\n\t\t\treturn scheduler.form_blocks[section.type].set_value(node, value, (ev||{}), section);\n\t\t}\n\t};\n\n\tvar handler = scheduler._lightbox_controls[\"get_\"+section.type+\"_control\"];\n\treturn handler?handler(result):result;\n};\nscheduler._lightbox_controls.get_template_control = function(result) {\n\tresult.control = result.node;\n\treturn result;\n};\nscheduler._lightbox_controls.get_select_control = function(result) {\n\tresult.control = result.node.getElementsByTagName('select')[0];\n\treturn result;\n};\nscheduler._lightbox_controls.get_textarea_control = function(result) {\n\tresult.control = result.node.getElementsByTagName('textarea')[0];\n\treturn result;\n};\nscheduler._lightbox_controls.get_time_control = function(result) {\n\tresult.control = result.node.getElementsByTagName('select'); // array\n\treturn result;\n};\n\nscheduler._lightbox_controls.defaults = {\n\ttemplate: {\n\t\theight:30\n\t},\n\ttextarea: {\n\t\theight: 200\n\t},\n\tselect: {\n\t\theight: 23\n\t},\n\ttime: {\n\t\theight: 20\n\t}\n};\n\n\nscheduler.form_blocks={\n\ttemplate:{\n\t\trender: function(sns){\n\t\t\treturn \"
\";\n\t\t},\n\t\tset_value:function(node,value,ev,config){\n\t\t\tnode.innerHTML = value||\"\";\n\t\t},\n\t\tget_value:function(node,ev,config){\n\t\t\treturn node.innerHTML||\"\";\n\t\t},\n\t\tfocus: function(node){\n\t\t}\n\t},\n\ttextarea:{\n\t\trender:function(sns){\n\t\t\treturn \"
\";\n\t\t},\n\t\tset_value:function(node,value,ev){\n\t\t\tscheduler.form_blocks.textarea._get_input(node).value=value||\"\";\n\t\t},\n\t\tget_value:function(node,ev){\n\t\t\treturn scheduler.form_blocks.textarea._get_input(node).value;\n\t\t},\n\t\tfocus:function(node){\n\t\t\tvar a = scheduler.form_blocks.textarea._get_input(node);\n\t\t\tscheduler._focus(a, true);\n\t\t},\n\t\t_get_input: function(node){\n\t\t\treturn node.getElementsByTagName(\"textarea\")[0];\n\t\t}\n\t},\n\tselect:{\n\t\trender:function(sns){\n\t\t\t//var defaults = scheduler._lightbox_controls.defaults.select;\n\t\t\tvar html=\"\";\n\t\t\tfor (var i=0; i < sns.options.length; i++)\n\t\t\t\thtml+=\"\"+sns.options[i].label+\" \";\n\t\t\thtml+=\"
\";\n\t\t\treturn html;\n\t\t},\n\t\tset_value:function(node,value,ev,sns){\n\t\t\tvar select = node.firstChild;\n\t\t\tif (!select._dhx_onchange && sns.onchange) {\n\t\t\t\tscheduler.event(select, \"change\", sns.onchange);\n\t\t\t\tselect._dhx_onchange = true;\n\t\t\t}\n\t\t\tif (typeof value == \"undefined\")\n\t\t\t\tvalue = (select.options[0]||{}).value;\n\t\t\tselect.value=value||\"\";\n\t\t},\n\t\tget_value:function(node,ev){\n\t\t\treturn node.firstChild.value;\n\t\t},\n\t\tfocus:function(node){\n\t\t\tvar a=node.firstChild; scheduler._focus(a, true);\n\t\t}\n\t},\n\ttime:{\n\t\trender:function(sns) {\n\t\t\tif (!sns.time_format) {\n\t\t\t\t// default order\n\t\t\t\tsns.time_format = [\"%H:%i\", \"%d\", \"%m\", \"%Y\"];\n\t\t\t}\n\t\t\t// map: default order => real one\n\t\t\tsns._time_format_order = {};\n\t\t\tvar time_format = sns.time_format;\n\n\t\t\tvar cfg = scheduler.config;\n\t\t\tvar dt = scheduler.date.date_part(scheduler._currentDate());\n\t\t\tvar last = 24*60, first = 0;\n\t\t\tif(scheduler.config.limit_time_select){\n\t\t\t\tlast = 60*cfg.last_hour+1;\n\t\t\t\tfirst = 60*cfg.first_hour;\n\t\t\t\tdt.setHours(cfg.first_hour);\n\t\t\t}\n\t\t\tvar html = \"\";\n\n\t\t\tfor (var p = 0; p < time_format.length; p++) {\n\t\t\t\tvar time_option = time_format[p];\n\n\t\t\t\t// adding spaces between selects\n\t\t\t\tif (p > 0) {\n\t\t\t\t\thtml += \" \";\n\t\t\t\t}\n\t\t\t\tvar selectBoxClass = \"\";\n\t\t\t\tvar options = \"\";\n\t\t\t\tswitch (time_option) {\n\t\t\t\t\tcase \"%Y\":\n\t\t\t\t\t\tselectBoxClass = \"dhx_lightbox_year_select\";\n\t\t\t\t\t\tsns._time_format_order[3] = p;\n\t\t\t\t\t\t//year\n\t\t\t\t\t\tvar range;\n\t\t\t\t\t\tvar start_year;\n\t\t\t\t\t\tvar end_year;\n\t\t\t\t\t\tif(sns.year_range){\n\t\t\t\t\t\t\tif (!isNaN(sns.year_range)) {\n\t\t\t\t\t\t\t\trange = sns.year_range;\n\t\t\t\t\t\t\t} else if (sns.year_range.push) {\n\t\t\t\t\t\t\t\t// if\n\t\t\t\t\t\t\t\tstart_year = sns.year_range[0];\n\t\t\t\t\t\t\t\tend_year = sns.year_range[1];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\trange = range || 10;\n\t\t\t\t\t\tvar offset = offset || Math.floor(range / 2);\n\t\t\t\t\t\tstart_year = start_year || dt.getFullYear() - offset;\n\t\t\t\t\t\tend_year = end_year || start_year + range;\n\n\t\t\t\t\t\tfor (var i = start_year; i < end_year; i++)\n\t\t\t\t\t\t\toptions += \"\" + (i) + \" \";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"%m\":\n\t\t\t\t\t\tselectBoxClass = \"dhx_lightbox_month_select\";\n\t\t\t\t\t\tsns._time_format_order[2] = p;\n\t\t\t\t\t\t//month\n\t\t\t\t\t\tfor (var i=0; i < 12; i++)\n\t\t\t\t\t\t\toptions+=\"\"+this.locale.date.month_full[i]+\" \";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"%d\":\n\t\t\t\t\t\tselectBoxClass = \"dhx_lightbox_day_select\";\n\t\t\t\t\t\tsns._time_format_order[1] = p;\n\t\t\t\t\t\t//days\n\t\t\t\t\t\tfor (var i=1; i < 32; i++)\n\t\t\t\t\t\t\toptions+=\"\"+i+\" \";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"%H:%i\":\n\t\t\t\t\t\tselectBoxClass = \"dhx_lightbox_time_select\";\n\t\t\t\t\t\tsns._time_format_order[0] = p;\n\t\t\t\t\t\t//hours\n\t\t\t\t\t\tvar i = first;\n\t\t\t\t\t\tvar tdate = dt.getDate();\n\t\t\t\t\t\tsns._time_values = [];\n\n\t\t\t\t\t\twhile(i\"+time+\"\";\n\t\t\t\t\t\t\tsns._time_values.push(i);\n\t\t\t\t\t\t\tdt.setTime(dt.valueOf()+this.config.time_step*60*1000);\n\t\t\t\t\t\t\tvar diff = (dt.getDate()!=tdate)?1:0; // moved or not to the next day\n\t\t\t\t\t\t\ti=diff*24*60+dt.getHours()*60+dt.getMinutes();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif(options){\n\n\t\t\t\t\tvar ariaAttrs = scheduler._waiAria.lightboxSelectAttrString(time_option);\n\t\t\t\t\tvar readonly = sns.readonly ? \"disabled='disabled'\" : \"\";\n\t\t\t\t\thtml += \"\"+options+\" \";\n\t\t\t\t}\n\t\t\t}\n\t\t\t//var defaults = scheduler._lightbox_controls.defaults.select;\n\n\t\t\treturn \"\"+html+\" – \"+html+\"
\";\n\t\t},\n\t\tset_value:function(node,value,ev,config){\n\t\t\tvar cfg = scheduler.config;\n\t\t\tvar s=node.getElementsByTagName(\"select\");\n\t\t\tvar map = config._time_format_order;\n\t\t\tvar start_date, end_date;\n\n\t\t\tif(cfg.full_day) {\n\t\t\t\tif (!node._full_day){\n\t\t\t\t\tvar html = \" \"+scheduler.locale.labels.full_day+\" \";\n\t\t\t\t\tif (!scheduler.config.wide_form)\n\t\t\t\t\t\thtml = node.previousSibling.innerHTML+html;\n\t\t\t\t\tnode.previousSibling.innerHTML=html;\n\t\t\t\t\tnode._full_day=true;\n\t\t\t\t}\n\t\t\t\tvar input=node.previousSibling.getElementsByTagName(\"input\")[0];\n\t\t\t\tinput.checked = (scheduler.date.time_part(ev.start_date)===0 && scheduler.date.time_part(ev.end_date)===0);\n\n\t\t\t\ts[map[0]].disabled=input.checked;\n\t\t\t\ts[ map[0] + s.length/2 ].disabled=input.checked;\n\n\t\t\t\tif(!input.$_eventAttached){\n\t\t\t\t\tinput.$_eventAttached = true;\n\n\t\t\t\t\t\tscheduler.event(input, \"click\", function(){\n\t\t\t\t\t\tif(input.checked) {\n\t\t\t\t\t\t\tvar obj = {};\n\t\t\t\t\t\t\tscheduler.form_blocks.time.get_value(node,obj,config);\n\n\t\t\t\t\t\t\tstart_date = scheduler.date.date_part(obj.start_date);\n\t\t\t\t\t\t\tend_date = scheduler.date.date_part(obj.end_date);\n\n\t\t\t\t\t\t\tif (+end_date == +start_date || (+end_date >= +start_date && (ev.end_date.getHours() !== 0 || ev.end_date.getMinutes() !== 0)))\n\t\t\t\t\t\t\t\tend_date = scheduler.date.add(end_date, 1, \"day\");\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tstart_date = null;\n\t\t\t\t\t\t\tend_date = null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ts[map[0]].disabled=input.checked;\n\t\t\t\t\t\ts[ map[0] + s.length/2 ].disabled=input.checked;\n\n\t\t\t\t\t\t_fill_lightbox_select(s,0,start_date||ev.start_date);\n\t\t\t\t\t\t_fill_lightbox_select(s,4,end_date||ev.end_date);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(cfg.auto_end_date && cfg.event_duration) {\n\t\t\t\tvar _update_lightbox_select = function () {\n\t\t\t\t\t\n\t\t\t\t\tif (!(cfg.auto_end_date && cfg.event_duration)){\n\t\t\t\t\t\t// setting may be disabled after the handler is attached\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tstart_date = new Date(s[map[3]].value,s[map[2]].value,s[map[1]].value,0,s[map[0]].value);\n\t\t\t\t\tend_date = new Date(start_date.getTime() + (scheduler.config.event_duration * 60 * 1000));\n\t\t\t\t\t_fill_lightbox_select(s, 4, end_date);\n\t\t\t\t};\n\t\t\t\tfor(var i=0; i<4; i++) {\n\t\t\t\t\tif(!s[i].$_eventAttached) {\n\t\t\t\t\t\ts[i].$_eventAttached = true;\n\t\t\t\t\t\tscheduler.event(s[i], \"change\", _update_lightbox_select);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction _fill_lightbox_select(s,i,d) {\n\t\t\t\tvar time_values = config._time_values;\n\t\t\t\tvar direct_value = d.getHours()*60+d.getMinutes();\n\t\t\t\tvar fixed_value = direct_value;\n\t\t\t\tvar value_found = false;\n\t\t\t\tfor (var k=0; k\";\n\t\tvar ariaAttr = \"\";\n\t\tfor (var i = 0; i < buttons.length; i++) {\n\t\t\tariaAttr = this._waiAria.lightboxButtonAttrString(buttons[i]);\n\t\t\thtml += \"\";\n\t\t}\n\n\t\tbuttons = this.config.buttons_right;\n\t\tvar rtl = scheduler.config.rtl;\n\t\tfor (var i = 0; i < buttons.length; i++) {\n\t\t\tariaAttr = this._waiAria.lightboxButtonAttrString(buttons[i]);\n\n\t\t\thtml += \"
\";\n\n\t\t\thtml += \"\";\n\t\t}\n\t\thtml += \"