summaryrefslogtreecommitdiffstats
path: root/codebase/sources
diff options
context:
space:
mode:
authorAlexKlimenkov <shurick.klimenkov@gmail.com>2014-06-10 20:50:30 +0300
committerAlexKlimenkov <shurick.klimenkov@gmail.com>2014-06-10 20:50:30 +0300
commitb5a0589955460a44c5428c4cb5429fcfce265d23 (patch)
tree87db58400a3e036de646fb630cbb358beeac3bc1 /codebase/sources
parente2aaaef8540fabd0b5200a4959c269d6f1ae352e (diff)
downloadscheduler-b5a0589955460a44c5428c4cb5429fcfce265d23.zip
scheduler-b5a0589955460a44c5428c4cb5429fcfce265d23.tar.gz
scheduler-b5a0589955460a44c5428c4cb5429fcfce265d23.tar.bz2
[update] version 4.1.0
Diffstat (limited to 'codebase/sources')
-rw-r--r--codebase/sources/dhtmlxscheduler.js6148
-rw-r--r--codebase/sources/dhtmlxscheduler.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_active_links.js43
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_active_links.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_agenda_view.js123
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_agenda_view.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_all_timed.js148
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_all_timed.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_collision.js131
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_collision.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_container_autoresize.js164
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_container_autoresize.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_cookie.js73
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_cookie.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_editors.js161
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_editors.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_expand.js76
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_expand.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_grid_view.js483
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_grid_view.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_html_templates.js22
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_html_templates.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_key_nav.js115
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_key_nav.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_layer.js407
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_layer.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_limit.js965
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_limit.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_map_view.js492
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_map_view.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_minical.js472
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_minical.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_monthheight.js34
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_monthheight.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_multisection.js254
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_multisection.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_multiselect.js69
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_multiselect.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_multisource.js29
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_multisource.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_mvc.js147
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_mvc.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_offline.js83
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_offline.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_outerdrag.js60
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_outerdrag.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_pdf.js363
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_pdf.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_quick_info.js199
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_quick_info.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_readonly.js160
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_readonly.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_recurring.js818
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_recurring.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_serialize.js110
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_serialize.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_timeline.js1277
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_timeline.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_tooltip.js223
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_tooltip.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_treetimeline.js313
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_treetimeline.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_units.js259
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_units.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_url.js37
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_url.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_week_agenda.js261
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_week_agenda.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_wp.js20
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_wp.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_year_view.js391
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_year_view.js.map1
-rw-r--r--codebase/sources/skins/dhtmlxscheduler.css2238
-rw-r--r--codebase/sources/skins/dhtmlxscheduler_classic.css1560
-rw-r--r--codebase/sources/skins/dhtmlxscheduler_flat.css2343
-rw-r--r--codebase/sources/skins/dhtmlxscheduler_glossy.css1882
76 files changed, 23189 insertions, 0 deletions
diff --git a/codebase/sources/dhtmlxscheduler.js b/codebase/sources/dhtmlxscheduler.js
new file mode 100644
index 0000000..4656403
--- /dev/null
+++ b/codebase/sources/dhtmlxscheduler.js
@@ -0,0 +1,6148 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+window.dhtmlXScheduler = window.scheduler = { version: "4.1.0" };
+
+if (!window.dhtmlx) {
+ dhtmlx = function(obj){
+ for (var a in obj) dhtmlx[a]=obj[a];
+ return dhtmlx; //simple singleton
+ };
+}
+dhtmlx.extend_api=function(name,map,ext){
+ var t = window[name];
+ if (!t) return; //component not defined
+ window[name]=function(obj){
+ var that;
+
+ if (obj && typeof obj == "object" && !obj.tagName){
+ that = t.apply(this,(map._init?map._init(obj):arguments));
+ //global settings
+ for (var a in dhtmlx)
+ if (map[a]) this[map[a]](dhtmlx[a]);
+ //local settings
+ for (var a in obj){
+ if (map[a]) this[map[a]](obj[a]);
+ else if (a.indexOf("on")===0){
+ this.attachEvent(a,obj[a]);
+ }
+ }
+ } else
+ that = t.apply(this,arguments);
+ if (map._patch) map._patch(this);
+ return that||this;
+ };
+ window[name].prototype=t.prototype;
+ if (ext)
+ dhtmlXHeir(window[name].prototype,ext);
+};
+
+dhtmlxAjax={
+ get:function(url,callback){
+ var t=new dtmlXMLLoaderObject(true);
+ t.async=(arguments.length<3);
+ t.waitCall=callback;
+ t.loadXML(url);
+ return t;
+ },
+ post:function(url,post,callback){
+ var t=new dtmlXMLLoaderObject(true);
+ t.async=(arguments.length<4);
+ t.waitCall=callback;
+ t.loadXML(url,true,post);
+ return t;
+ },
+ getSync:function(url){
+ return this.get(url,null,true);
+ },
+ postSync:function(url,post){
+ return this.post(url,post,null,true);
+ }
+};
+
+/**
+ * @desc: xmlLoader object
+ * @type: private
+ * @param: funcObject - xml parser function
+ * @param: object - jsControl object
+ * @param: async - sync/async mode (async by default)
+ * @param: rSeed - enable/disable random seed ( prevent IE caching)
+ * @topic: 0
+ */
+function dtmlXMLLoaderObject(funcObject, dhtmlObject, async, rSeed){
+ this.xmlDoc="";
+
+ if (typeof (async) != "undefined")
+ this.async=async;
+ else
+ this.async=true;
+
+ this.onloadAction=funcObject||null;
+ this.mainObject=dhtmlObject||null;
+ this.waitCall=null;
+ this.rSeed=rSeed||false;
+ return this;
+}
+
+dtmlXMLLoaderObject.count = 0;
+
+/**
+ * @desc: xml loading handler
+ * @type: private
+ * @param: dtmlObject - xmlLoader object
+ * @topic: 0
+ */
+dtmlXMLLoaderObject.prototype.waitLoadFunction=function(dhtmlObject){
+ var once = true;
+ this.check=function (){
+ if ((dhtmlObject)&&(dhtmlObject.onloadAction)){
+ if ((!dhtmlObject.xmlDoc.readyState)||(dhtmlObject.xmlDoc.readyState == 4)){
+ if (!once)
+ return;
+
+ once=false; //IE 5 fix
+ dtmlXMLLoaderObject.count++;
+ if (typeof dhtmlObject.onloadAction == "function")
+ dhtmlObject.onloadAction(dhtmlObject.mainObject, null, null, null, dhtmlObject);
+
+ if (dhtmlObject.waitCall){
+ dhtmlObject.waitCall.call(this,dhtmlObject);
+ dhtmlObject.waitCall=null;
+ }
+ }
+ }
+ };
+ return this.check;
+};
+
+/**
+ * @desc: return XML top node
+ * @param: tagName - top XML node tag name (not used in IE, required for Safari and Mozilla)
+ * @type: private
+ * @returns: top XML node
+ * @topic: 0
+ */
+dtmlXMLLoaderObject.prototype.getXMLTopNode=function(tagName, oldObj){
+ var z;
+
+ if (this.xmlDoc.responseXML){
+ var temp = this.xmlDoc.responseXML.getElementsByTagName(tagName);
+ if(temp.length === 0 && tagName.indexOf(":")!=-1)
+ var temp = this.xmlDoc.responseXML.getElementsByTagName((tagName.split(":"))[1]);
+ z = temp[0];
+ } else
+ z = this.xmlDoc.documentElement;
+
+ if (z){
+ this._retry=false;
+ return z;
+ }
+
+ if (!this._retry&&_isIE){
+ this._retry=true;
+ var oldObj = this.xmlDoc;
+ this.loadXMLString(this.xmlDoc.responseText.replace(/^[\s]+/,""), true);
+ return this.getXMLTopNode(tagName, oldObj);
+ }
+
+ dhtmlxError.throwError("LoadXML", "Incorrect XML", [
+ (oldObj||this.xmlDoc),
+ this.mainObject
+ ]);
+
+ return document.createElement("DIV");
+};
+
+/**
+ * @desc: load XML from string
+ * @type: private
+ * @param: xmlString - xml string
+ * @topic: 0
+ */
+dtmlXMLLoaderObject.prototype.loadXMLString=function(xmlString, silent){
+
+ if (!_isIE){
+ var parser = new DOMParser();
+ this.xmlDoc=parser.parseFromString(xmlString, "text/xml");
+ } else {
+ this.xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
+ this.xmlDoc.async=this.async;
+ this.xmlDoc.onreadystatechange = function(){};
+ this.xmlDoc["loadXM"+"L"](xmlString);
+ }
+
+ if (silent)
+ return;
+
+ if (this.onloadAction)
+ this.onloadAction(this.mainObject, null, null, null, this);
+
+ if (this.waitCall){
+ this.waitCall();
+ this.waitCall=null;
+ }
+};
+/**
+ * @desc: load XML
+ * @type: private
+ * @param: filePath - xml file path
+ * @param: postMode - send POST request
+ * @param: postVars - list of vars for post request
+ * @topic: 0
+ */
+dtmlXMLLoaderObject.prototype.loadXML=function(filePath, postMode, postVars, rpc){
+ if (this.rSeed)
+ filePath+=((filePath.indexOf("?") != -1) ? "&" : "?")+"a_dhx_rSeed="+(new Date()).valueOf();
+ this.filePath=filePath;
+
+ if ((!_isIE)&&(window.XMLHttpRequest))
+ this.xmlDoc=new XMLHttpRequest();
+ else {
+ this.xmlDoc=new ActiveXObject("Microsoft.XMLHTTP");
+ }
+
+ if (this.async)
+ this.xmlDoc.onreadystatechange=new this.waitLoadFunction(this);
+ this.xmlDoc.open(postMode ? "POST" : "GET", filePath, this.async);
+
+ if (rpc){
+ this.xmlDoc.setRequestHeader("User-Agent", "dhtmlxRPC v0.1 ("+navigator.userAgent+")");
+ this.xmlDoc.setRequestHeader("Content-type", "text/xml");
+ }
+
+ else if (postMode)
+ this.xmlDoc.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
+
+ this.xmlDoc.setRequestHeader("X-Requested-With","XMLHttpRequest");
+ this.xmlDoc.send(null||postVars);
+
+ if (!this.async)
+ (new this.waitLoadFunction(this))();
+};
+/**
+ * @desc: destructor, cleans used memory
+ * @type: private
+ * @topic: 0
+ */
+dtmlXMLLoaderObject.prototype.destructor=function(){
+ this._filterXPath = null;
+ this._getAllNamedChilds = null;
+ this._retry = null;
+ this.async = null;
+ this.rSeed = null;
+ this.filePath = null;
+ this.onloadAction = null;
+ this.mainObject = null;
+ this.xmlDoc = null;
+ this.doXPath = null;
+ this.doXPathOpera = null;
+ this.doXSLTransToObject = null;
+ this.doXSLTransToString = null;
+ this.loadXML = null;
+ this.loadXMLString = null;
+ // this.waitLoadFunction = null;
+ this.doSerialization = null;
+ this.xmlNodeToJSON = null;
+ this.getXMLTopNode = null;
+ this.setXSLParamValue = null;
+ return null;
+};
+
+dtmlXMLLoaderObject.prototype.xmlNodeToJSON = function(node){
+ var t={};
+ for (var i=0; i<node.attributes.length; i++)
+ t[node.attributes[i].name]=node.attributes[i].value;
+ t["_tagvalue"]=node.firstChild?node.firstChild.nodeValue:"";
+ for (var i=0; i<node.childNodes.length; i++){
+ var name=node.childNodes[i].tagName;
+ if (name){
+ if (!t[name]) t[name]=[];
+ t[name].push(this.xmlNodeToJSON(node.childNodes[i]));
+ }
+ }
+ return t;
+};
+
+/**
+ * @desc: Call wrapper
+ * @type: private
+ * @param: funcObject - action handler
+ * @param: dhtmlObject - user data
+ * @returns: function handler
+ * @topic: 0
+ */
+function callerFunction(funcObject, dhtmlObject){
+ this.handler=function(e){
+ if (!e)
+ e=window.event;
+ funcObject(e, dhtmlObject);
+ return true;
+ };
+ return this.handler;
+}
+
+/**
+ * @desc: Calculate absolute position of html object
+ * @type: private
+ * @param: htmlObject - html object
+ * @topic: 0
+ */
+function getAbsoluteLeft(htmlObject){
+ return getOffset(htmlObject).left;
+}
+/**
+ * @desc: Calculate absolute position of html object
+ * @type: private
+ * @param: htmlObject - html object
+ * @topic: 0
+ */
+function getAbsoluteTop(htmlObject){
+ return getOffset(htmlObject).top;
+}
+
+function getOffsetSum(elem) {
+ var top=0, left=0;
+ while(elem) {
+ top = top + parseInt(elem.offsetTop);
+ left = left + parseInt(elem.offsetLeft);
+ elem = elem.offsetParent;
+ }
+ return {top: top, left: left};
+}
+function getOffsetRect(elem) {
+ var box = elem.getBoundingClientRect();
+ var body = document.body;
+ var docElem = document.documentElement;
+ var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop;
+ var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft;
+ var clientTop = docElem.clientTop || body.clientTop || 0;
+ var clientLeft = docElem.clientLeft || body.clientLeft || 0;
+ var top = box.top + scrollTop - clientTop;
+ var left = box.left + scrollLeft - clientLeft;
+ return { top: Math.round(top), left: Math.round(left) };
+}
+function getOffset(elem) {
+ if (elem.getBoundingClientRect) {
+ return getOffsetRect(elem);
+ } else {
+ return getOffsetSum(elem);
+ }
+}
+
+/**
+ * @desc: Convert string to it boolean representation
+ * @type: private
+ * @param: inputString - string for covertion
+ * @topic: 0
+ */
+function convertStringToBoolean(inputString){
+ if (typeof (inputString) == "string")
+ inputString=inputString.toLowerCase();
+
+ switch (inputString){
+ case "1":
+ case "true":
+ case "yes":
+ case "y":
+ case 1:
+ case true:
+ return true;
+ default:
+ return false;
+ }
+}
+
+/**
+ * @desc: find out what symbol to use as url param delimiters in further params
+ * @type: private
+ * @param: str - current url string
+ * @topic: 0
+ */
+function getUrlSymbol(str){
+ if (str.indexOf("?") != -1)
+ return "&";
+ else
+ return "?";
+}
+
+function dhtmlDragAndDropObject(){
+ if (window.dhtmlDragAndDrop)
+ return window.dhtmlDragAndDrop;
+
+ this.lastLanding=0;
+ this.dragNode=0;
+ this.dragStartNode=0;
+ this.dragStartObject=0;
+ this.tempDOMU=null;
+ this.tempDOMM=null;
+ this.waitDrag=0;
+ window.dhtmlDragAndDrop=this;
+
+ return this;
+}
+
+dhtmlDragAndDropObject.prototype.removeDraggableItem=function(htmlNode){
+ htmlNode.onmousedown=null;
+ htmlNode.dragStarter=null;
+ htmlNode.dragLanding=null;
+};
+
+dhtmlDragAndDropObject.prototype.addDraggableItem=function(htmlNode, dhtmlObject){
+ htmlNode.onmousedown=this.preCreateDragCopy;
+ htmlNode.dragStarter=dhtmlObject;
+ this.addDragLanding(htmlNode, dhtmlObject);
+};
+
+dhtmlDragAndDropObject.prototype.addDragLanding=function(htmlNode, dhtmlObject){
+ htmlNode.dragLanding=dhtmlObject;
+};
+
+dhtmlDragAndDropObject.prototype.preCreateDragCopy=function(e){
+ if ((e||window.event) && (e||event).button == 2)
+ return;
+
+ if (window.dhtmlDragAndDrop.waitDrag){
+ window.dhtmlDragAndDrop.waitDrag=0;
+ document.body.onmouseup=window.dhtmlDragAndDrop.tempDOMU;
+ document.body.onmousemove=window.dhtmlDragAndDrop.tempDOMM;
+ return false;
+ }
+
+ if (window.dhtmlDragAndDrop.dragNode)
+ window.dhtmlDragAndDrop.stopDrag(e);
+
+ window.dhtmlDragAndDrop.waitDrag=1;
+ window.dhtmlDragAndDrop.tempDOMU=document.body.onmouseup;
+ window.dhtmlDragAndDrop.tempDOMM=document.body.onmousemove;
+ window.dhtmlDragAndDrop.dragStartNode=this;
+ window.dhtmlDragAndDrop.dragStartObject=this.dragStarter;
+ document.body.onmouseup=window.dhtmlDragAndDrop.preCreateDragCopy;
+ document.body.onmousemove=window.dhtmlDragAndDrop.callDrag;
+ window.dhtmlDragAndDrop.downtime = new Date().valueOf();
+
+
+ if ((e)&&(e.preventDefault)){
+ e.preventDefault();
+ return false;
+ }
+ return false;
+};
+
+dhtmlDragAndDropObject.prototype.callDrag=function(e){
+ if (!e)
+ e=window.event;
+ var dragger=window.dhtmlDragAndDrop;
+ if ((new Date()).valueOf()-dragger.downtime<100) return;
+
+ //if ((e.button == 0)&&(_isIE))
+ // return dragger.stopDrag();
+
+ if (!dragger.dragNode){
+ if (dragger.waitDrag){
+ dragger.dragNode=dragger.dragStartObject._createDragNode(dragger.dragStartNode, e);
+
+ if (!dragger.dragNode)
+ return dragger.stopDrag();
+
+ dragger.dragNode.onselectstart=function(){return false;};
+ dragger.gldragNode=dragger.dragNode;
+ document.body.appendChild(dragger.dragNode);
+ document.body.onmouseup=dragger.stopDrag;
+ dragger.waitDrag=0;
+ dragger.dragNode.pWindow=window;
+ dragger.initFrameRoute();
+ }
+ else return dragger.stopDrag(e, true);
+ }
+
+ if (dragger.dragNode.parentNode != window.document.body && dragger.gldragNode){
+ var grd = dragger.gldragNode;
+
+ if (dragger.gldragNode.old)
+ grd=dragger.gldragNode.old;
+
+ //if (!document.all) dragger.calculateFramePosition();
+ grd.parentNode.removeChild(grd);
+ var oldBody = dragger.dragNode.pWindow;
+
+ if (grd.pWindow && grd.pWindow.dhtmlDragAndDrop.lastLanding)
+ grd.pWindow.dhtmlDragAndDrop.lastLanding.dragLanding._dragOut(grd.pWindow.dhtmlDragAndDrop.lastLanding);
+
+ // var oldp=dragger.dragNode.parentObject;
+ if (_isIE){
+ var div = document.createElement("Div");
+ div.innerHTML=dragger.dragNode.outerHTML;
+ dragger.dragNode=div.childNodes[0];
+ } else
+ dragger.dragNode=dragger.dragNode.cloneNode(true);
+
+ dragger.dragNode.pWindow=window;
+ // dragger.dragNode.parentObject=oldp;
+
+ dragger.gldragNode.old=dragger.dragNode;
+ document.body.appendChild(dragger.dragNode);
+ oldBody.dhtmlDragAndDrop.dragNode=dragger.dragNode;
+ }
+
+ dragger.dragNode.style.left=e.clientX+15 +
+ (dragger.fx ? dragger.fx*(-1) : 0) +
+ (document.body.scrollLeft||document.documentElement.scrollLeft)+"px";
+ dragger.dragNode.style.top=e.clientY+3+
+ (dragger.fy ? dragger.fy*(-1) : 0) +
+ (document.body.scrollTop||document.documentElement.scrollTop)+"px";
+
+ var z;
+ if (!e.srcElement)
+ z = e.target;
+ else
+ z=e.srcElement;
+ dragger.checkLanding(z, e);
+};
+
+dhtmlDragAndDropObject.prototype.calculateFramePosition=function(n){
+ //this.fx = 0, this.fy = 0;
+ if (window.name){
+ var el = parent.frames[window.name].frameElement.offsetParent;
+ var fx = 0;
+ var fy = 0;
+
+ while (el){
+ fx+=el.offsetLeft;
+ fy+=el.offsetTop;
+ el=el.offsetParent;
+ }
+
+ if ((parent.dhtmlDragAndDrop)){
+ var ls = parent.dhtmlDragAndDrop.calculateFramePosition(1);
+ fx+=ls.split('_')[0]*1;
+ fy+=ls.split('_')[1]*1;
+ }
+
+ if (n)
+ return fx+"_"+fy;
+ else
+ this.fx=fx;
+ this.fy=fy;
+ }
+ return "0_0";
+};
+
+dhtmlDragAndDropObject.prototype.checkLanding=function(htmlObject, e){
+ if ((htmlObject)&&(htmlObject.dragLanding)){
+ if (this.lastLanding)
+ this.lastLanding.dragLanding._dragOut(this.lastLanding);
+ this.lastLanding=htmlObject;
+ this.lastLanding=this.lastLanding.dragLanding._dragIn(this.lastLanding, this.dragStartNode, e.clientX,
+ e.clientY, e);
+ this.lastLanding_scr=(_isIE ? e.srcElement : e.target);
+ } else {
+ if ((htmlObject)&&(htmlObject.tagName != "BODY"))
+ this.checkLanding(htmlObject.parentNode, e);
+ else {
+ if (this.lastLanding)
+ this.lastLanding.dragLanding._dragOut(this.lastLanding, e.clientX, e.clientY, e);
+ this.lastLanding=0;
+
+ if (this._onNotFound)
+ this._onNotFound();
+ }
+ }
+};
+
+dhtmlDragAndDropObject.prototype.stopDrag=function(e, mode){
+ var dragger=window.dhtmlDragAndDrop;
+
+ if (!mode){
+ dragger.stopFrameRoute();
+ var temp = dragger.lastLanding;
+ dragger.lastLanding=null;
+
+ if (temp)
+ temp.dragLanding._drag(dragger.dragStartNode, dragger.dragStartObject, temp,
+ (_isIE ? event.srcElement : e.target));
+ }
+ dragger.lastLanding=null;
+
+ if ((dragger.dragNode)&&(dragger.dragNode.parentNode == document.body))
+ dragger.dragNode.parentNode.removeChild(dragger.dragNode);
+ dragger.dragNode=0;
+ dragger.gldragNode=0;
+ dragger.fx=0;
+ dragger.fy=0;
+ dragger.dragStartNode=0;
+ dragger.dragStartObject=0;
+ document.body.onmouseup=dragger.tempDOMU;
+ document.body.onmousemove=dragger.tempDOMM;
+ dragger.tempDOMU=null;
+ dragger.tempDOMM=null;
+ dragger.waitDrag=0;
+};
+
+dhtmlDragAndDropObject.prototype.stopFrameRoute=function(win){
+ if (win)
+ window.dhtmlDragAndDrop.stopDrag(1, 1);
+
+ for (var i = 0; i < window.frames.length; i++){
+ try{
+ if ((window.frames[i] != win)&&(window.frames[i].dhtmlDragAndDrop))
+ window.frames[i].dhtmlDragAndDrop.stopFrameRoute(window);
+ } catch(e){}
+ }
+
+ try{
+ if ((parent.dhtmlDragAndDrop)&&(parent != window)&&(parent != win))
+ parent.dhtmlDragAndDrop.stopFrameRoute(window);
+ } catch(e){}
+};
+
+dhtmlDragAndDropObject.prototype.initFrameRoute=function(win, mode){
+ if (win){
+ window.dhtmlDragAndDrop.preCreateDragCopy();
+ window.dhtmlDragAndDrop.dragStartNode=win.dhtmlDragAndDrop.dragStartNode;
+ window.dhtmlDragAndDrop.dragStartObject=win.dhtmlDragAndDrop.dragStartObject;
+ window.dhtmlDragAndDrop.dragNode=win.dhtmlDragAndDrop.dragNode;
+ window.dhtmlDragAndDrop.gldragNode=win.dhtmlDragAndDrop.dragNode;
+ window.document.body.onmouseup=window.dhtmlDragAndDrop.stopDrag;
+ window.waitDrag=0;
+
+ if (((!_isIE)&&(mode))&&((!_isFF)||(_FFrv < 1.8)))
+ window.dhtmlDragAndDrop.calculateFramePosition();
+ }
+ try{
+ if ((parent.dhtmlDragAndDrop)&&(parent != window)&&(parent != win))
+ parent.dhtmlDragAndDrop.initFrameRoute(window);
+ }catch(e){}
+
+ for (var i = 0; i < window.frames.length; i++){
+ try{
+ if ((window.frames[i] != win)&&(window.frames[i].dhtmlDragAndDrop))
+ window.frames[i].dhtmlDragAndDrop.initFrameRoute(window, ((!win||mode) ? 1 : 0));
+ } catch(e){}
+ }
+};
+
+_isFF = false;
+_isIE = false;
+_isOpera = false;
+_isKHTML = false;
+_isMacOS = false;
+_isChrome = false;
+_FFrv = false;
+_KHTMLrv = false;
+_OperaRv = false;
+
+if (navigator.userAgent.indexOf('Macintosh') != -1)
+ _isMacOS=true;
+
+
+if (navigator.userAgent.toLowerCase().indexOf('chrome')>-1)
+ _isChrome=true;
+
+if ((navigator.userAgent.indexOf('Safari') != -1)||(navigator.userAgent.indexOf('Konqueror') != -1)){
+ _KHTMLrv = parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf('Safari')+7, 5));
+
+ if (_KHTMLrv > 525){ //mimic FF behavior for Safari 3.1+
+ _isFF=true;
+ _FFrv = 1.9;
+ } else
+ _isKHTML=true;
+} else if (navigator.userAgent.indexOf('Opera') != -1){
+ _isOpera=true;
+ _OperaRv=parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf('Opera')+6, 3));
+}
+
+
+else if (navigator.appName.indexOf("Microsoft") != -1){
+ _isIE=true;
+ if ((navigator.appVersion.indexOf("MSIE 8.0")!= -1 || navigator.appVersion.indexOf("MSIE 9.0")!= -1 || navigator.appVersion.indexOf("MSIE 10.0")!= -1 ) && document.compatMode != "BackCompat"){
+ _isIE=8;
+ }
+} else if (navigator.appName == 'Netscape' && navigator.userAgent.indexOf("Trident") != -1){
+ //ie11
+ _isIE=8;
+} else {
+ _isFF=true;
+ _FFrv = parseFloat(navigator.userAgent.split("rv:")[1]);
+}
+
+
+//multibrowser Xpath processor
+dtmlXMLLoaderObject.prototype.doXPath=function(xpathExp, docObj, namespace, result_type){
+ if (_isKHTML || (!_isIE && !window.XPathResult))
+ return this.doXPathOpera(xpathExp, docObj);
+
+ if (_isIE){ //IE
+ if (!docObj)
+ if (!this.xmlDoc.nodeName)
+ docObj=this.xmlDoc.responseXML;
+ else
+ docObj=this.xmlDoc;
+
+ if (!docObj)
+ dhtmlxError.throwError("LoadXML", "Incorrect XML", [
+ (docObj||this.xmlDoc),
+ this.mainObject
+ ]);
+
+ if (namespace)
+ docObj.setProperty("SelectionNamespaces", "xmlns:xsl='"+namespace+"'"); //
+
+ if (result_type == 'single'){
+ return docObj.selectSingleNode(xpathExp);
+ }
+ else {
+ return docObj.selectNodes(xpathExp)||new Array(0);
+ }
+ } else { //Mozilla
+ var nodeObj = docObj;
+
+ if (!docObj){
+ if (!this.xmlDoc.nodeName){
+ docObj=this.xmlDoc.responseXML;
+ }
+ else {
+ docObj=this.xmlDoc;
+ }
+ }
+
+ if (!docObj)
+ dhtmlxError.throwError("LoadXML", "Incorrect XML", [
+ (docObj||this.xmlDoc),
+ this.mainObject
+ ]);
+
+ if (docObj.nodeName.indexOf("document") != -1){
+ nodeObj=docObj;
+ }
+ else {
+ nodeObj=docObj;
+ docObj=docObj.ownerDocument;
+ }
+ var retType = XPathResult.ANY_TYPE;
+
+ if (result_type == 'single')
+ retType=XPathResult.FIRST_ORDERED_NODE_TYPE;
+ var rowsCol = [];
+ var col = docObj.evaluate(xpathExp, nodeObj, function(pref){
+ return namespace;
+ }, retType, null);
+
+ if (retType == XPathResult.FIRST_ORDERED_NODE_TYPE){
+ return col.singleNodeValue;
+ }
+ var thisColMemb = col.iterateNext();
+
+ while (thisColMemb){
+ rowsCol[rowsCol.length]=thisColMemb;
+ thisColMemb=col.iterateNext();
+ }
+ return rowsCol;
+ }
+};
+
+function _dhtmlxError(type, name, params){
+ if (!this.catches)
+ this.catches=[];
+
+ return this;
+}
+
+_dhtmlxError.prototype.catchError=function(type, func_name){
+ this.catches[type]=func_name;
+};
+
+_dhtmlxError.prototype.throwError=function(type, name, params){
+ if (this.catches[type])
+ return this.catches[type](type, name, params);
+
+ if (this.catches["ALL"])
+ return this.catches["ALL"](type, name, params);
+
+ window.alert("Error type: "+arguments[0]+"\nDescription: "+arguments[1]);
+ return null;
+};
+
+window.dhtmlxError=new _dhtmlxError();
+
+
+//opera fake, while 9.0 not released
+//multibrowser Xpath processor
+dtmlXMLLoaderObject.prototype.doXPathOpera=function(xpathExp, docObj){
+ //this is fake for Opera
+ var z = xpathExp.replace(/[\/]+/gi, "/").split('/');
+ var obj = null;
+ var i = 1;
+
+ if (!z.length)
+ return [];
+
+ if (z[0] == ".")
+ obj=[docObj]; else if (z[0] === ""){
+ obj=(this.xmlDoc.responseXML||this.xmlDoc).getElementsByTagName(z[i].replace(/\[[^\]]*\]/g, ""));
+ i++;
+ } else
+ return [];
+
+ for (i; i < z.length; i++)obj=this._getAllNamedChilds(obj, z[i]);
+
+ if (z[i-1].indexOf("[") != -1)
+ obj=this._filterXPath(obj, z[i-1]);
+ return obj;
+};
+
+dtmlXMLLoaderObject.prototype._filterXPath=function(a, b){
+ var c = [];
+ var b = b.replace(/[^\[]*\[\@/g, "").replace(/[\[\]\@]*/g, "");
+
+ for (var i = 0; i < a.length; i++)
+ if (a[i].getAttribute(b))
+ c[c.length]=a[i];
+
+ return c;
+};
+
+dtmlXMLLoaderObject.prototype._getAllNamedChilds=function(a, b){
+ var c = [];
+
+ if (_isKHTML)
+ b=b.toUpperCase();
+
+ for (var i = 0; i < a.length; i++)for (var j = 0; j < a[i].childNodes.length; j++){
+ if (_isKHTML){
+ if (a[i].childNodes[j].tagName&&a[i].childNodes[j].tagName.toUpperCase() == b)
+ c[c.length]=a[i].childNodes[j];
+ }
+
+ else if (a[i].childNodes[j].tagName == b)
+ c[c.length]=a[i].childNodes[j];
+ }
+
+ return c;
+};
+
+function dhtmlXHeir(a, b){
+ for (var c in b)
+ if (typeof (b[c]) == "function")
+ a[c]=b[c];
+ return a;
+}
+
+function dhtmlxEvent(el, event, handler){
+ if (el.addEventListener)
+ el.addEventListener(event, handler, false);
+
+ else if (el.attachEvent)
+ el.attachEvent("on"+event, handler);
+}
+
+//============= XSL Extension ===================================
+
+dtmlXMLLoaderObject.prototype.xslDoc=null;
+dtmlXMLLoaderObject.prototype.setXSLParamValue=function(paramName, paramValue, xslDoc){
+ if (!xslDoc)
+ xslDoc=this.xslDoc;
+
+ if (xslDoc.responseXML)
+ xslDoc=xslDoc.responseXML;
+ var item =
+ this.doXPath("/xsl:stylesheet/xsl:variable[@name='"+paramName+"']", xslDoc,
+ "http:/\/www.w3.org/1999/XSL/Transform", "single");
+
+ if (item)
+ item.firstChild.nodeValue=paramValue;
+};
+
+dtmlXMLLoaderObject.prototype.doXSLTransToObject=function(xslDoc, xmlDoc){
+ if (!xslDoc)
+ xslDoc=this.xslDoc;
+
+ if (xslDoc.responseXML)
+ xslDoc=xslDoc.responseXML;
+
+ if (!xmlDoc)
+ xmlDoc=this.xmlDoc;
+
+ if (xmlDoc.responseXML)
+ xmlDoc=xmlDoc.responseXML;
+
+
+ var result;
+ //Mozilla
+ if (!_isIE){
+ if (!this.XSLProcessor){
+ this.XSLProcessor=new XSLTProcessor();
+ this.XSLProcessor.importStylesheet(xslDoc);
+ }
+ result = this.XSLProcessor.transformToDocument(xmlDoc);
+ } else {
+ result = new ActiveXObject("Msxml2.DOMDocument.3.0");
+ try{
+ xmlDoc.transformNodeToObject(xslDoc, result);
+ }catch(e){
+ result = xmlDoc.transformNode(xslDoc);
+ }
+ }
+ return result;
+};
+
+dtmlXMLLoaderObject.prototype.doXSLTransToString=function(xslDoc, xmlDoc){
+ var res = this.doXSLTransToObject(xslDoc, xmlDoc);
+ if(typeof(res)=="string")
+ return res;
+ return this.doSerialization(res);
+};
+
+dtmlXMLLoaderObject.prototype.doSerialization=function(xmlDoc){
+ if (!xmlDoc)
+ xmlDoc=this.xmlDoc;
+ if (xmlDoc.responseXML)
+ xmlDoc=xmlDoc.responseXML;
+ if (!_isIE){
+ var xmlSerializer = new XMLSerializer();
+ return xmlSerializer.serializeToString(xmlDoc);
+ } else
+ return xmlDoc.xml;
+};
+
+/**
+ * @desc:
+ * @type: private
+ */
+dhtmlxEventable=function(obj){
+ obj.attachEvent=function(name, catcher, callObj){
+ name='ev_'+name.toLowerCase();
+ if (!this[name])
+ this[name]=new this.eventCatcher(callObj||this);
+
+ return(name+':'+this[name].addEvent(catcher)); //return ID (event name & event ID)
+ };
+ obj.callEvent=function(name, arg0){
+ name='ev_'+name.toLowerCase();
+ if (this[name])
+ return this[name].apply(this, arg0);
+ return true;
+ };
+ obj.checkEvent=function(name){
+ return (!!this['ev_'+name.toLowerCase()]);
+ };
+ obj.eventCatcher=function(obj){
+ var dhx_catch = [];
+ var z = function(){
+ var res = true;
+ for (var i = 0; i < dhx_catch.length; i++){
+ if (dhx_catch[i]){
+ var zr = dhx_catch[i].apply(obj, arguments);
+ res=res&&zr;
+ }
+ }
+ return res;
+ };
+ z.addEvent=function(ev){
+ if (typeof (ev) != "function")
+ ev=eval(ev);
+ if (ev)
+ return dhx_catch.push(ev)-1;
+ return false;
+ };
+ z.removeEvent=function(id){
+ dhx_catch[id]=null;
+ };
+ return z;
+ };
+ obj.detachEvent=function(id){
+ if (id){
+ var list = id.split(':'); //get EventName and ID
+ this[list[0]].removeEvent(list[1]); //remove event
+ }
+ };
+ obj.detachAllEvents = function(){
+ for (var name in this){
+ if (name.indexOf("ev_")===0){
+ this.detachEvent(name);
+ this[name] = null;
+ }
+ }
+ };
+ obj = null;
+};
+if(!window.dhtmlx)
+ window.dhtmlx = {};
+
+(function(){
+ var _dhx_msg_cfg = null;
+ function callback(config, result){
+ var usercall = config.callback;
+ modality(false);
+ config.box.parentNode.removeChild(config.box);
+ _dhx_msg_cfg = config.box = null;
+ if (usercall)
+ usercall(result);
+ }
+ function modal_key(e){
+ if (_dhx_msg_cfg){
+ e = e||event;
+ var code = e.which||event.keyCode;
+ if (dhtmlx.message.keyboard){
+ if (code == 13 || code == 32)
+ callback(_dhx_msg_cfg, true);
+ if (code == 27)
+ callback(_dhx_msg_cfg, false);
+ }
+ if (e.preventDefault)
+ e.preventDefault();
+ return !(e.cancelBubble = true);
+ }
+ }
+ if (document.attachEvent)
+ document.attachEvent("onkeydown", modal_key);
+ else
+ document.addEventListener("keydown", modal_key, true);
+
+ function modality(mode){
+ if(!modality.cover){
+ modality.cover = document.createElement("DIV");
+ //necessary for IE only
+ modality.cover.onkeydown = modal_key;
+ modality.cover.className = "dhx_modal_cover";
+ document.body.appendChild(modality.cover);
+ }
+ var height = document.body.scrollHeight;
+ modality.cover.style.display = mode?"inline-block":"none";
+ }
+
+ function button(text, result, css){
+ // css - for locale-independent class name
+ var className = css ? css : (text || "");
+ var button_css = "dhtmlx_"+(className).toLowerCase().replace(/ /g, "_")+"_button"; // dhtmlx_ok_button, dhtmlx_click_me_button
+ return "<div class='dhtmlx_popup_button "+button_css+"' result='"+result+"' ><div>"+text+"</div></div>";
+ }
+
+ function info(text){
+ if (!t.area){
+ t.area = document.createElement("DIV");
+ t.area.className = "dhtmlx_message_area";
+ t.area.style[t.position]="5px";
+ document.body.appendChild(t.area);
+ }
+
+ t.hide(text.id);
+ var message = document.createElement("DIV");
+ message.innerHTML = "<div>"+text.text+"</div>";
+ message.className = "dhtmlx-info dhtmlx-" + text.type;
+ message.onclick = function(){
+ t.hide(text.id);
+ text = null;
+ };
+
+ if (t.position == "bottom" && t.area.firstChild)
+ t.area.insertBefore(message,t.area.firstChild);
+ else
+ t.area.appendChild(message);
+
+ if (text.expire > 0)
+ t.timers[text.id]=window.setTimeout(function(){
+ t.hide(text.id);
+ }, text.expire);
+
+ t.pull[text.id] = message;
+ message = null;
+
+ return text.id;
+ }
+ function _boxStructure(config, ok, cancel){
+ var box = document.createElement("DIV");
+ box.className = " dhtmlx_modal_box dhtmlx-"+config.type;
+ box.setAttribute("dhxbox", 1);
+
+ var inner = '';
+
+ if (config.width)
+ box.style.width = config.width;
+ if (config.height)
+ box.style.height = config.height;
+ if (config.title)
+ inner+='<div class="dhtmlx_popup_title">'+config.title+'</div>';
+ inner+='<div class="dhtmlx_popup_text"><span>'+(config.content?'':config.text)+'</span></div><div class="dhtmlx_popup_controls">';
+ if (ok){
+ var ok_text = (config.ok || scheduler.locale.labels.message_ok);
+ //default value for compatibility with custom locales some people have
+ if(ok_text === undefined) ok_text = "OK";
+ inner += button(ok_text, true, "ok");
+ }
+ if (cancel){
+ var cancel_text = (config.cancel || scheduler.locale.labels.message_cancel);
+ if(cancel_text === undefined) cancel_text = "Cancel";
+ inner += button(cancel_text, false, "cancel");
+ }
+ if (config.buttons){
+ for (var i=0; i<config.buttons.length; i++)
+ inner += button(config.buttons[i],i);
+ }
+ inner += '</div>';
+ box.innerHTML = inner;
+
+ if (config.content){
+ var node = config.content;
+ if (typeof node == "string")
+ node = document.getElementById(node);
+ if (node.style.display == 'none')
+ node.style.display = "";
+ box.childNodes[config.title?1:0].appendChild(node);
+ }
+
+ box.onclick = function(e){
+ e = e ||event;
+ var source = e.target || e.srcElement;
+ if (!source.className) source = source.parentNode;
+ if (source.className.split(" ")[0] == "dhtmlx_popup_button"){
+ var result = source.getAttribute("result");
+ result = (result == "true")||(result == "false"?false:result);
+ callback(config, result);
+ }
+ };
+ config.box = box;
+ if (ok||cancel)
+ _dhx_msg_cfg = config;
+
+ return box;
+ }
+ function _createBox(config, ok, cancel){
+ var box = config.tagName ? config : _boxStructure(config, ok, cancel);
+
+ if (!config.hidden)
+ modality(true);
+ document.body.appendChild(box);
+ var x = Math.abs(Math.floor(((window.innerWidth||document.documentElement.offsetWidth) - box.offsetWidth)/2));
+ var y = Math.abs(Math.floor(((window.innerHeight||document.documentElement.offsetHeight) - box.offsetHeight)/2));
+ if (config.position == "top")
+ box.style.top = "-3px";
+ else
+ box.style.top = y+'px';
+ box.style.left = x+'px';
+ //necessary for IE only
+ box.onkeydown = modal_key;
+
+ box.focus();
+ if (config.hidden)
+ dhtmlx.modalbox.hide(box);
+
+ return box;
+ }
+
+ function alertPopup(config){
+ return _createBox(config, true, false);
+ }
+ function confirmPopup(config){
+ return _createBox(config, true, true);
+ }
+ function boxPopup(config){
+ return _createBox(config);
+ }
+ function box_params(text, type, callback){
+ if (typeof text != "object"){
+ if (typeof type == "function"){
+ callback = type;
+ type = "";
+ }
+ text = {text:text, type:type, callback:callback };
+ }
+ return text;
+ }
+ function params(text, type, expire, id){
+ if (typeof text != "object")
+ text = {text:text, type:type, expire:expire, id:id};
+ text.id = text.id||t.uid();
+ text.expire = text.expire||t.expire;
+ return text;
+ }
+ dhtmlx.alert = function(){
+ var text = box_params.apply(this, arguments);
+ text.type = text.type || "confirm";
+ return alertPopup(text);
+ };
+ dhtmlx.confirm = function(){
+ var text = box_params.apply(this, arguments);
+ text.type = text.type || "alert";
+ return confirmPopup(text);
+ };
+ dhtmlx.modalbox = function(){
+ var text = box_params.apply(this, arguments);
+ text.type = text.type || "alert";
+ return boxPopup(text);
+ };
+ dhtmlx.modalbox.hide = function(node){
+ while (node && node.getAttribute && !node.getAttribute("dhxbox"))
+ node = node.parentNode;
+ if (node){
+ node.parentNode.removeChild(node);
+ modality(false);
+ }
+ };
+ var t = dhtmlx.message = function(text, type, expire, id){
+ text = params.apply(this, arguments);
+ text.type = text.type||"info";
+
+ var subtype = text.type.split("-")[0];
+ switch (subtype){
+ case "alert":
+ return alertPopup(text);
+ case "confirm":
+ return confirmPopup(text);
+ case "modalbox":
+ return boxPopup(text);
+ default:
+ return info(text);
+ }
+ };
+
+ t.seed = (new Date()).valueOf();
+ t.uid = function(){return t.seed++;};
+ t.expire = 4000;
+ t.keyboard = true;
+ t.position = "top";
+ t.pull = {};
+ t.timers = {};
+
+ t.hideAll = function(){
+ for (var key in t.pull)
+ t.hide(key);
+ };
+ t.hide = function(id){
+ var obj = t.pull[id];
+ if (obj && obj.parentNode){
+ window.setTimeout(function(){
+ obj.parentNode.removeChild(obj);
+ obj = null;
+ },2000);
+ obj.className+=" hidden";
+
+ if(t.timers[id])
+ window.clearTimeout(t.timers[id]);
+ delete t.pull[id];
+ }
+ };
+})();
+/**
+ * @desc: constructor, data processor object
+ * @param: serverProcessorURL - url used for update
+ * @type: public
+ */
+function dataProcessor(serverProcessorURL){
+ this.serverProcessor = serverProcessorURL;
+ this.action_param="!nativeeditor_status";
+
+ this.object = null;
+ this.updatedRows = []; //ids of updated rows
+
+ this.autoUpdate = true;
+ this.updateMode = "cell";
+ this._tMode="GET";
+ this.post_delim = "_";
+
+ this._waitMode=0;
+ this._in_progress={};//?
+ this._invalid={};
+ this.mandatoryFields=[];
+ this.messages=[];
+
+ this.styles={
+ updated:"font-weight:bold;",
+ inserted:"font-weight:bold;",
+ deleted:"text-decoration : line-through;",
+ invalid:"background-color:FFE0E0;",
+ invalid_cell:"border-bottom:2px solid red;",
+ error:"color:red;",
+ clear:"font-weight:normal;text-decoration:none;"
+ };
+
+ this.enableUTFencoding(true);
+ dhtmlxEventable(this);
+
+ return this;
+ }
+
+dataProcessor.prototype={
+ /**
+ * @desc: select GET or POST transaction model
+ * @param: mode - GET/POST
+ * @param: total - true/false - send records row by row or all at once (for grid only)
+ * @type: public
+ */
+ setTransactionMode:function(mode,total){
+ this._tMode=mode;
+ this._tSend=total;
+ },
+ escape:function(data){
+ if (this._utf)
+ return encodeURIComponent(data);
+ else
+ return escape(data);
+ },
+ /**
+ * @desc: allows to set escaping mode
+ * @param: true - utf based escaping, simple - use current page encoding
+ * @type: public
+ */
+ enableUTFencoding:function(mode){
+ this._utf=convertStringToBoolean(mode);
+ },
+ /**
+ * @desc: allows to define, which column may trigger update
+ * @param: val - array or list of true/false values
+ * @type: public
+ */
+ setDataColumns:function(val){
+ this._columns=(typeof val == "string")?val.split(","):val;
+ },
+ /**
+ * @desc: get state of updating
+ * @returns: true - all in sync with server, false - some items not updated yet.
+ * @type: public
+ */
+ getSyncState:function(){
+ return !this.updatedRows.length;
+ },
+ /**
+ * @desc: enable/disable named field for data syncing, will use column ids for grid
+ * @param: mode - true/false
+ * @type: public
+ */
+ enableDataNames:function(mode){
+ this._endnm=convertStringToBoolean(mode);
+ },
+ /**
+ * @desc: enable/disable mode , when only changed fields and row id send to the server side, instead of all fields in default mode
+ * @param: mode - true/false
+ * @type: public
+ */
+ enablePartialDataSend:function(mode){
+ this._changed=convertStringToBoolean(mode);
+ },
+ /**
+ * @desc: set if rows should be send to server automaticaly
+ * @param: mode - "row" - based on row selection changed, "cell" - based on cell editing finished, "off" - manual data sending
+ * @type: public
+ */
+ setUpdateMode:function(mode,dnd){
+ this.autoUpdate = (mode=="cell");
+ this.updateMode = mode;
+ this.dnd=dnd;
+ },
+ ignore:function(code,master){
+ this._silent_mode=true;
+ code.call(master||window);
+ this._silent_mode=false;
+ },
+ /**
+ * @desc: mark row as updated/normal. check mandatory fields,initiate autoupdate (if turned on)
+ * @param: rowId - id of row to set update-status for
+ * @param: state - true for "updated", false for "not updated"
+ * @param: mode - update mode name
+ * @type: public
+ */
+ setUpdated:function(rowId,state,mode){
+ if (this._silent_mode) return;
+ var ind=this.findRow(rowId);
+
+ mode=mode||"updated";
+ var existing = this.obj.getUserData(rowId,this.action_param);
+ if (existing && mode == "updated") mode=existing;
+ if (state){
+ this.set_invalid(rowId,false); //clear previous error flag
+ this.updatedRows[ind]=rowId;
+ this.obj.setUserData(rowId,this.action_param,mode);
+ if (this._in_progress[rowId])
+ this._in_progress[rowId]="wait";
+ } else{
+ if (!this.is_invalid(rowId)){
+ this.updatedRows.splice(ind,1);
+ this.obj.setUserData(rowId,this.action_param,"");
+ }
+ }
+
+ //clear changed flag
+ if (!state)
+ this._clearUpdateFlag(rowId);
+
+ this.markRow(rowId,state,mode);
+ if (state && this.autoUpdate) this.sendData(rowId);
+ },
+ _clearUpdateFlag:function(id){},
+ markRow:function(id,state,mode){
+ var str="";
+ var invalid=this.is_invalid(id);
+ if (invalid){
+ str=this.styles[invalid];
+ state=true;
+ }
+ if (this.callEvent("onRowMark",[id,state,mode,invalid])){
+ //default logic
+ str=this.styles[state?mode:"clear"]+str;
+
+ this.obj[this._methods[0]](id,str);
+
+ if (invalid && invalid.details){
+ str+=this.styles[invalid+"_cell"];
+ for (var i=0; i < invalid.details.length; i++)
+ if (invalid.details[i])
+ this.obj[this._methods[1]](id,i,str);
+ }
+ }
+ },
+ getState:function(id){
+ return this.obj.getUserData(id,this.action_param);
+ },
+ is_invalid:function(id){
+ return this._invalid[id];
+ },
+ set_invalid:function(id,mode,details){
+ if (details) mode={value:mode, details:details, toString:function(){ return this.value.toString(); }};
+ this._invalid[id]=mode;
+ },
+ /**
+ * @desc: check mandatory fields and varify values of cells, initiate update (if specified)
+ * @param: rowId - id of row to set update-status for
+ * @type: public
+ */
+ checkBeforeUpdate:function(rowId){
+ return true;
+ },
+ /**
+ * @desc: send row(s) values to server
+ * @param: rowId - id of row which data to send. If not specified, then all "updated" rows will be send
+ * @type: public
+ */
+ sendData:function(rowId){
+ if (this._waitMode && (this.obj.mytype=="tree" || this.obj._h2)) return;
+ if (this.obj.editStop) this.obj.editStop();
+
+
+ if(typeof rowId == "undefined" || this._tSend) return this.sendAllData();
+ if (this._in_progress[rowId]) return false;
+
+ this.messages=[];
+ if (!this.checkBeforeUpdate(rowId) && this.callEvent("onValidationError",[rowId,this.messages])) return false;
+ this._beforeSendData(this._getRowData(rowId),rowId);
+ },
+ _beforeSendData:function(data,rowId){
+ if (!this.callEvent("onBeforeUpdate",[rowId,this.getState(rowId),data])) return false;
+ this._sendData(data,rowId);
+ },
+ serialize:function(data, id){
+ if (typeof data == "string")
+ return data;
+ if (typeof id != "undefined")
+ return this.serialize_one(data,"");
+ else{
+ var stack = [];
+ var keys = [];
+ for (var key in data)
+ if (data.hasOwnProperty(key)){
+ stack.push(this.serialize_one(data[key],key+this.post_delim));
+ keys.push(key);
+ }
+ stack.push("ids="+this.escape(keys.join(",")));
+ if (dhtmlx.security_key)
+ stack.push("dhx_security="+dhtmlx.security_key);
+ return stack.join("&");
+ }
+ },
+ serialize_one:function(data, pref){
+ if (typeof data == "string")
+ return data;
+ var stack = [];
+ for (var key in data)
+ if (data.hasOwnProperty(key))
+ stack.push(this.escape((pref||"")+key)+"="+this.escape(data[key]));
+ return stack.join("&");
+ },
+ _sendData:function(a1,rowId){
+ if (!a1) return; //nothing to send
+ if (!this.callEvent("onBeforeDataSending",rowId?[rowId,this.getState(rowId),a1]:[null, null, a1])) return false;
+
+ if (rowId)
+ this._in_progress[rowId]=(new Date()).valueOf();
+ var a2=new dtmlXMLLoaderObject(this.afterUpdate,this,true);
+
+ var a3 = this.serverProcessor+(this._user?(getUrlSymbol(this.serverProcessor)+["dhx_user="+this._user,"dhx_version="+this.obj.getUserData(0,"version")].join("&")):"");
+
+ if (this._tMode!="POST")
+ a2.loadXML(a3+((a3.indexOf("?")!=-1)?"&":"?")+this.serialize(a1,rowId));
+ else
+ a2.loadXML(a3,true,this.serialize(a1,rowId));
+
+ this._waitMode++;
+ },
+ sendAllData:function(){
+ if (!this.updatedRows.length) return;
+
+ this.messages=[]; var valid=true;
+ for (var i=0; i<this.updatedRows.length; i++)
+ valid&=this.checkBeforeUpdate(this.updatedRows[i]);
+ if (!valid && !this.callEvent("onValidationError",["",this.messages])) return false;
+
+ if (this._tSend)
+ this._sendData(this._getAllData());
+ else
+ for (var i=0; i<this.updatedRows.length; i++)
+ if (!this._in_progress[this.updatedRows[i]]){
+ if (this.is_invalid(this.updatedRows[i])) continue;
+ this._beforeSendData(this._getRowData(this.updatedRows[i]),this.updatedRows[i]);
+ if (this._waitMode && (this.obj.mytype=="tree" || this.obj._h2)) return; //block send all for tree
+ }
+ },
+
+
+
+
+
+
+
+
+ _getAllData:function(rowId){
+ var out={};
+ var has_one = false;
+ for(var i=0;i<this.updatedRows.length;i++){
+ var id=this.updatedRows[i];
+ if (this._in_progress[id] || this.is_invalid(id)) continue;
+ if (!this.callEvent("onBeforeUpdate",[id,this.getState(id)])) continue;
+ out[id]=this._getRowData(id,id+this.post_delim);
+ has_one = true;
+ this._in_progress[id]=(new Date()).valueOf();
+ }
+ return has_one?out:null;
+ },
+
+
+ /**
+ * @desc: specify column which value should be varified before sending to server
+ * @param: ind - column index (0 based)
+ * @param: verifFunction - function (object) which should verify cell value (if not specified, then value will be compared to empty string). Two arguments will be passed into it: value and column name
+ * @type: public
+ */
+ setVerificator:function(ind,verifFunction){
+ this.mandatoryFields[ind] = verifFunction||(function(value){return (value !== "");});
+ },
+ /**
+ * @desc: remove column from list of those which should be verified
+ * @param: ind - column Index (0 based)
+ * @type: public
+ */
+ clearVerificator:function(ind){
+ this.mandatoryFields[ind] = false;
+ },
+
+
+
+
+
+ findRow:function(pattern){
+ var i=0;
+ for(i=0;i<this.updatedRows.length;i++)
+ if(pattern==this.updatedRows[i]) break;
+ return i;
+ },
+
+
+
+
+
+
+
+
+
+
+
+ /**
+ * @desc: define custom actions
+ * @param: name - name of action, same as value of action attribute
+ * @param: handler - custom function, which receives a XMl response content for action
+ * @type: private
+ */
+ defineAction:function(name,handler){
+ if (!this._uActions) this._uActions=[];
+ this._uActions[name]=handler;
+ },
+
+
+
+
+ /**
+* @desc: used in combination with setOnBeforeUpdateHandler to create custom client-server transport system
+* @param: sid - id of item before update
+* @param: tid - id of item after up0ate
+* @param: action - action name
+* @type: public
+* @topic: 0
+*/
+ afterUpdateCallback:function(sid, tid, action, btag) {
+ var marker = sid;
+ var correct=(action!="error" && action!="invalid");
+ if (!correct) this.set_invalid(sid,action);
+ if ((this._uActions)&&(this._uActions[action])&&(!this._uActions[action](btag)))
+ return (delete this._in_progress[marker]);
+
+ if (this._in_progress[marker]!="wait")
+ this.setUpdated(sid, false);
+
+ var soid = sid;
+
+ switch (action) {
+ case "inserted":
+ case "insert":
+ if (tid != sid) {
+ this.obj[this._methods[2]](sid, tid);
+ sid = tid;
+ }
+ break;
+ case "delete":
+ case "deleted":
+ this.obj.setUserData(sid, this.action_param, "true_deleted");
+ this.obj[this._methods[3]](sid);
+ delete this._in_progress[marker];
+ return this.callEvent("onAfterUpdate", [sid, action, tid, btag]);
+ }
+
+ if (this._in_progress[marker]!="wait"){
+ if (correct) this.obj.setUserData(sid, this.action_param,'');
+ delete this._in_progress[marker];
+ } else {
+ delete this._in_progress[marker];
+ this.setUpdated(tid,true,this.obj.getUserData(sid,this.action_param));
+ }
+
+ this.callEvent("onAfterUpdate", [soid, action, tid, btag]);
+ },
+
+ /**
+ * @desc: response from server
+ * @param: xml - XMLLoader object with response XML
+ * @type: private
+ */
+ afterUpdate:function(that,b,c,d,xml){
+ xml.getXMLTopNode("data"); //fix incorrect content type in IE
+ if (!xml.xmlDoc.responseXML) return;
+ var atag=xml.doXPath("//data/action");
+ for (var i=0; i<atag.length; i++){
+ var btag=atag[i];
+ var action = btag.getAttribute("type");
+ var sid = btag.getAttribute("sid");
+ var tid = btag.getAttribute("tid");
+
+ that.afterUpdateCallback(sid,tid,action,btag);
+ }
+ that.finalizeUpdate();
+ },
+ finalizeUpdate:function(){
+ if (this._waitMode) this._waitMode--;
+
+ if ((this.obj.mytype=="tree" || this.obj._h2) && this.updatedRows.length)
+ this.sendData();
+ this.callEvent("onAfterUpdateFinish",[]);
+ if (!this.updatedRows.length)
+ this.callEvent("onFullSync",[]);
+ },
+
+
+
+
+
+ /**
+ * @desc: initializes data-processor
+ * @param: anObj - dhtmlxGrid object to attach this data-processor to
+ * @type: public
+ */
+ init:function(anObj){
+ this.obj = anObj;
+ if (this.obj._dp_init)
+ this.obj._dp_init(this);
+ },
+
+
+ setOnAfterUpdate:function(ev){
+ this.attachEvent("onAfterUpdate",ev);
+ },
+ enableDebug:function(mode){
+ },
+ setOnBeforeUpdateHandler:function(func){
+ this.attachEvent("onBeforeDataSending",func);
+ },
+
+
+
+ /*! starts autoupdate mode
+ @param interval
+ time interval for sending update requests
+ */
+ setAutoUpdate: function(interval, user) {
+ interval = interval || 2000;
+
+ this._user = user || (new Date()).valueOf();
+ this._need_update = false;
+ this._loader = null;
+ this._update_busy = false;
+
+ this.attachEvent("onAfterUpdate",function(sid,action,tid,xml_node){
+ this.afterAutoUpdate(sid, action, tid, xml_node);
+ });
+ this.attachEvent("onFullSync",function(){
+ this.fullSync();
+ });
+
+ var self = this;
+ window.setInterval(function(){
+ self.loadUpdate();
+ }, interval);
+ },
+
+
+ /*! process updating request answer
+ if status == collision version is depricated
+ set flag for autoupdating immidiatly
+ */
+ afterAutoUpdate: function(sid, action, tid, xml_node) {
+ if (action == 'collision') {
+ this._need_update = true;
+ return false;
+ } else {
+ return true;
+ }
+ },
+
+
+ /*! callback function for onFillSync event
+ call update function if it's need
+ */
+ fullSync: function() {
+ if (this._need_update === true) {
+ this._need_update = false;
+ this.loadUpdate();
+ }
+ return true;
+ },
+
+
+ /*! sends query to the server and call callback function
+ */
+ getUpdates: function(url,callback){
+ if (this._update_busy)
+ return false;
+ else
+ this._update_busy = true;
+
+ this._loader = this._loader || new dtmlXMLLoaderObject(true);
+
+ this._loader.async=true;
+ this._loader.waitCall=callback;
+ this._loader.loadXML(url);
+ },
+
+
+ /*! returns xml node value
+ @param node
+ xml node
+ */
+ _v: function(node) {
+ if (node.firstChild) return node.firstChild.nodeValue;
+ return "";
+ },
+
+
+ /*! returns values array of xml nodes array
+ @param arr
+ array of xml nodes
+ */
+ _a: function(arr) {
+ var res = [];
+ for (var i=0; i < arr.length; i++) {
+ res[i]=this._v(arr[i]);
+ }
+ return res;
+ },
+
+
+ /*! loads updates and processes them
+ */
+ loadUpdate: function(){
+ var self = this;
+ var version = this.obj.getUserData(0,"version");
+ var url = this.serverProcessor+getUrlSymbol(this.serverProcessor)+["dhx_user="+this._user,"dhx_version="+version].join("&");
+ url = url.replace("editing=true&","");
+ this.getUpdates(url, function(){
+ var vers = self._loader.doXPath("//userdata");
+ self.obj.setUserData(0,"version",self._v(vers[0]));
+
+ var upds = self._loader.doXPath("//update");
+ if (upds.length){
+ self._silent_mode = true;
+
+ for (var i=0; i<upds.length; i++) {
+ var status = upds[i].getAttribute('status');
+ var id = upds[i].getAttribute('id');
+ var parent = upds[i].getAttribute('parent');
+ switch (status) {
+ case 'inserted':
+ self.callEvent("insertCallback",[upds[i], id, parent]);
+ break;
+ case 'updated':
+ self.callEvent("updateCallback",[upds[i], id, parent]);
+ break;
+ case 'deleted':
+ self.callEvent("deleteCallback",[upds[i], id, parent]);
+ break;
+ }
+ }
+
+ self._silent_mode = false;
+ }
+
+ self._update_busy = false;
+ self = null;
+ });
+ }
+
+};
+/*
+ dhx_sort[index]=direction
+ dhx_filter[index]=mask
+*/
+if (window.dhtmlXGridObject){
+ dhtmlXGridObject.prototype._init_point_connector=dhtmlXGridObject.prototype._init_point;
+ dhtmlXGridObject.prototype._init_point=function(){
+ var clear_url=function(url){
+ url=url.replace(/(\?|\&)connector[^\f]*/g,"");
+ return url+(url.indexOf("?")!=-1?"&":"?")+"connector=true"+(this.hdr.rows.length > 0 ? "&dhx_no_header=1":"");
+ };
+ var combine_urls=function(url){
+ return clear_url.call(this,url)+(this._connector_sorting||"")+(this._connector_filter||"");
+ };
+ var sorting_url=function(url,ind,dir){
+ this._connector_sorting="&dhx_sort["+ind+"]="+dir;
+ return combine_urls.call(this,url);
+ };
+ var filtering_url=function(url,inds,vals){
+ for (var i=0; i<inds.length; i++)
+ inds[i]="dhx_filter["+inds[i]+"]="+encodeURIComponent(vals[i]);
+ this._connector_filter="&"+inds.join("&");
+ return combine_urls.call(this,url);
+ };
+ this.attachEvent("onCollectValues",function(ind){
+ if (this._con_f_used[ind]){
+ if (typeof(this._con_f_used[ind]) == "object")
+ return this._con_f_used[ind];
+ else
+ return false;
+ }
+ return true;
+ });
+ this.attachEvent("onDynXLS",function(){
+ this.xmlFileUrl=combine_urls.call(this,this.xmlFileUrl);
+ return true;
+ });
+ this.attachEvent("onBeforeSorting",function(ind,type,dir){
+ if (type=="connector"){
+ var self=this;
+ this.clearAndLoad(sorting_url.call(this,this.xmlFileUrl,ind,dir),function(){
+ self.setSortImgState(true,ind,dir);
+ });
+ return false;
+ }
+ return true;
+ });
+ this.attachEvent("onFilterStart",function(a,b){
+ if (this._con_f_used.length){
+ this.clearAndLoad(filtering_url.call(this,this.xmlFileUrl,a,b));
+ return false;
+ }
+ return true;
+ });
+ this.attachEvent("onXLE",function(a,b,c,xml){
+ if (!xml) return;
+ });
+
+ if (this._init_point_connector) this._init_point_connector();
+ };
+ dhtmlXGridObject.prototype._con_f_used=[];
+ dhtmlXGridObject.prototype._in_header_connector_text_filter=function(t,i){
+ if (!this._con_f_used[i])
+ this._con_f_used[i]=1;
+ return this._in_header_text_filter(t,i);
+ };
+ dhtmlXGridObject.prototype._in_header_connector_select_filter=function(t,i){
+ if (!this._con_f_used[i])
+ this._con_f_used[i]=2;
+ return this._in_header_select_filter(t,i);
+ };
+ dhtmlXGridObject.prototype.load_connector=dhtmlXGridObject.prototype.load;
+ dhtmlXGridObject.prototype.load=function(url, call, type){
+ var data = [].concat(arguments);
+ if (!this._colls_loaded && this.cellType){
+ var ar=[];
+ for (var i=0; i < this.cellType.length; i++)
+ if (this.cellType[i].indexOf("co") === 0 || this._con_f_used[i]==2) ar.push(i);
+ if (ar.length)
+ data[0] += (data[0].indexOf("?")!=-1?"&":"?")+"connector=true&dhx_colls="+ar.join(",");
+ }
+ return this.load_connector.apply(this, data);
+ };
+ dhtmlXGridObject.prototype._parseHead_connector=dhtmlXGridObject.prototype._parseHead;
+ dhtmlXGridObject.prototype._parseHead=function(url, call, type){
+ this._parseHead_connector.apply(this,arguments);
+ if (!this._colls_loaded){
+ var cols = this.xmlLoader.doXPath("./coll_options", arguments[0]);
+ for (var i=0; i < cols.length; i++){
+ var f = cols[i].getAttribute("for");
+ var v = [];
+ var combo=null;
+ if (this.cellType[f] == "combo")
+ combo = this.getColumnCombo(f);
+ if (this.cellType[f].indexOf("co") === 0)
+ combo=this.getCombo(f);
+
+ var os = this.xmlLoader.doXPath("./item",cols[i]);
+ for (var j=0; j<os.length; j++){
+ var val=os[j].getAttribute("value");
+
+ if (combo){
+ var lab=os[j].getAttribute("label")||val;
+
+ if (combo.addOption)
+ combo.addOption([[val, lab]]);
+ else
+ combo.put(val,lab);
+
+ v[v.length]=lab;
+ } else
+ v[v.length]=val;
+ }
+ if (this._con_f_used[f*1])
+ this._con_f_used[f*1]=v;
+ }
+ this._colls_loaded=true;
+ }
+ };
+}
+
+if (window.dataProcessor){
+ dataProcessor.prototype.init_original=dataProcessor.prototype.init;
+ dataProcessor.prototype.init=function(obj){
+ this.init_original(obj);
+ obj._dataprocessor=this;
+
+ this.setTransactionMode("POST",true);
+ this.serverProcessor+=(this.serverProcessor.indexOf("?")!=-1?"&":"?")+"editing=true";
+ };
+}
+dhtmlxError.catchError("LoadXML",function(a,b,c){
+ if (c[0].status) {
+ window.alert(c[0].responseText);
+ }
+});
+
+
+dhtmlxEventable(scheduler);
+
+scheduler._detachDomEvent = function(el, event, handler){
+ if (el.removeEventListener){
+ el.removeEventListener(event, handler, false);
+
+ }else if (el.detachEvent){
+ el.detachEvent("on"+event, handler);
+ }
+};
+
+scheduler._init_once = function(){
+
+ var oldSize = getWindowSize();
+ dhtmlxEvent(window,"resize",function(){
+ var newSize = getWindowSize();
+
+ // ie7-8 triggers "resize" when window's elements are resized, it messes container-autoresize extension
+ // check if it's actually resized
+ if(!equals(oldSize, newSize)){
+ window.clearTimeout(scheduler._resize_timer);
+ scheduler._resize_timer=window.setTimeout(function(){
+ if (scheduler.callEvent("onSchedulerResize",[])) {
+ scheduler.update_view();
+ scheduler.callEvent("onAfterSchedulerResize", []);
+ }
+ }, 100);
+ }
+ oldSize = newSize;
+
+ });
+ function getWindowSize(){
+ return {
+ w : window.innerWidth || document.documentElement.clientWidth,
+ h : window.innerHeight || document.documentElement.clientHeight
+ };
+ }
+ function equals(a,b){
+ return a.w == b.w && a.h == b.h;
+ }
+
+ scheduler._init_once = function(){};
+};
+scheduler.init=function(id,date,mode){
+ date=date||(scheduler._currentDate());
+ mode=mode||"week";
+
+ if(this._obj){
+ this.unset_actions();
+ this._obj.innerHTML = "";
+ }
+
+ this._obj=(typeof id == "string")?document.getElementById(id):id;
+
+ //hook for terrace skin
+ if (this._skin_init)
+ scheduler._skin_init();
+
+ scheduler.date.init();
+
+
+ this._els=[];
+ this._scroll=true;
+ this._quirks=(_isIE && document.compatMode == "BackCompat");
+ this._quirks7=(_isIE && navigator.appVersion.indexOf("MSIE 8")==-1);
+
+ this.get_elements();
+ this.init_templates();
+ this.set_actions();
+
+ this._init_once();
+ this._init_touch_events();
+
+ this.set_sizes();
+ scheduler.callEvent('onSchedulerReady', []);
+ this.setCurrentView(date,mode);
+
+};
+
+scheduler.xy={
+ min_event_height:40,
+ scale_width:50,
+ scroll_width:18,
+ scale_height:20,
+ month_scale_height:20,
+ menu_width:25,
+ margin_top:0,
+ margin_left:0,
+ editor_width:140,
+ month_head_height:22
+};
+scheduler.keys={
+ edit_save:13,
+ edit_cancel:27
+};
+scheduler.set_sizes=function(){
+ var w = this._x = this._obj.clientWidth-this.xy.margin_left;
+ var h = this._y = this._obj.clientHeight-this.xy.margin_top;
+
+ //not-table mode always has scroll - need to be fixed in future
+ var scale_x=this._table_view?0:(this.xy.scale_width+this.xy.scroll_width);
+ var scale_s=this._table_view?-1:this.xy.scale_width;
+
+ this.set_xy(this._els["dhx_cal_navline"][0],w,this.xy.nav_height,0,0);
+ this.set_xy(this._els["dhx_cal_header"][0],w-scale_x,this.xy.scale_height,scale_s,this.xy.nav_height+(this._quirks?-1:1));
+ //to support alter-skin, we need a way to alter height directly from css
+ var actual_height = this._els["dhx_cal_navline"][0].offsetHeight;
+ if (actual_height > 0) this.xy.nav_height = actual_height;
+
+ var data_y=this.xy.scale_height+this.xy.nav_height+(this._quirks?-2:0);
+ this.set_xy(this._els["dhx_cal_data"][0],w,h-(data_y+2),0,data_y+2);
+};
+scheduler.set_xy=function(node,w,h,x,y){
+ node.style.width=Math.max(0,w)+"px";
+ node.style.height=Math.max(0,h)+"px";
+ if (arguments.length>3){
+ node.style.left=x+"px";
+ node.style.top=y+"px";
+ }
+};
+scheduler.get_elements=function(){
+ //get all child elements as named hash
+ var els=this._obj.getElementsByTagName("DIV");
+ for (var i=0; i < els.length; i++){
+ var class_name=els[i].className || "";
+ var attr_value = els[i].getAttribute("name") || "";
+ if (class_name) class_name = class_name.split(" ")[0];
+ if (!this._els[class_name]) this._els[class_name]=[];
+ this._els[class_name].push(els[i]);
+
+ //check if name need to be changed
+ var label = scheduler.locale.labels[attr_value||class_name];
+ if (typeof label !== "string" && attr_value && !els[i].innerHTML)
+ label = attr_value.split("_")[0];
+ if (label)
+ els[i].innerHTML= label;
+ }
+};
+
+scheduler.unset_actions = function(){
+ for (var a in this._els)
+ if (this._click[a])
+ for (var i=0; i < this._els[a].length; i++)
+ this._els[a][i].onclick = null;
+ this._obj.onselectstart = null;
+ this._obj.onmousemove = null;
+ this._obj.onmousedown = null;
+ this._obj.onmouseup = null;
+ this._obj.ondblclick = null;
+ this._obj.oncontextmenu = null;
+};
+
+scheduler.set_actions=function(){
+ for (var a in this._els)
+ if (this._click[a])
+ for (var i=0; i < this._els[a].length; i++)
+ this._els[a][i].onclick=scheduler._click[a];
+ this._obj.onselectstart=function(e){ return false; };
+ this._obj.onmousemove=function(e){
+ if (!scheduler._temp_touch_block)
+ scheduler._on_mouse_move(e||event);
+ };
+ this._obj.onmousedown=function(e){
+ if (!scheduler._ignore_next_click)
+ scheduler._on_mouse_down(e||event);
+ };
+ this._obj.onmouseup=function(e){
+ if (!scheduler._ignore_next_click)
+ scheduler._on_mouse_up(e||event);
+ };
+ this._obj.ondblclick=function(e){
+ scheduler._on_dbl_click(e||event);
+ };
+ this._obj.oncontextmenu = function(e) {
+ var ev = e||event;
+ var src = ev.target||ev.srcElement;
+ var returnValue = scheduler.callEvent("onContextMenu", [scheduler._locate_event(src), ev]);
+ return returnValue;
+ };
+};
+scheduler.select=function(id){
+ if (this._select_id==id) return;
+ this.editStop(false);
+ this.unselect();
+ this._select_id = id;
+ this.updateEvent(id);
+};
+scheduler.unselect=function(id){
+ if (id && id!=this._select_id) return;
+ var t=this._select_id;
+ this._select_id = null;
+ if (t && this.getEvent(t)) this.updateEvent(t);
+};
+scheduler.getState=function(){
+ return {
+ mode: this._mode,
+ date: new Date(this._date),
+ min_date: new Date(this._min_date),
+ max_date: new Date(this._max_date),
+ editor_id: this._edit_id,
+ lightbox_id: this._lightbox_id,
+ new_event: this._new_event,
+ select_id: this._select_id,
+ expanded: this.expanded,
+ drag_id: this._drag_id,
+ drag_mode: this._drag_mode
+ };
+};
+scheduler._click={
+ dhx_cal_data:function(e){
+ //in case of touch disable click processing
+ if (scheduler._ignore_next_click){
+ if (e.preventDefault)
+ e.preventDefault();
+ e.cancelBubble = true;
+ scheduler._ignore_next_click = false;
+ return false;
+ }
+
+ var trg = e?e.target:event.srcElement;
+ var id = scheduler._locate_event(trg);
+
+ e = e || event;
+
+ if (!id) {
+ scheduler.callEvent("onEmptyClick",[scheduler.getActionData(e).date, e]);
+ } else {
+ if ( !scheduler.callEvent("onClick",[id,e]) || scheduler.config.readonly ) return;
+ }
+
+ if (id && scheduler.config.select) {
+
+ scheduler.select(id);
+ var mask = trg.className;
+ if (mask.indexOf("_icon")!=-1)
+ scheduler._click.buttons[mask.split(" ")[1].replace("icon_","")](id);
+ } else{
+ scheduler._close_not_saved();
+ scheduler.unselect();
+ }
+ },
+ dhx_cal_prev_button:function(){
+ scheduler._click.dhx_cal_next_button(0,-1);
+ },
+ dhx_cal_next_button:function(dummy,step){
+ scheduler.setCurrentView(scheduler.date.add( //next line changes scheduler._date , but seems it has not side-effects
+ scheduler.date[scheduler._mode+"_start"](scheduler._date),(step||1),scheduler._mode));
+ },
+ dhx_cal_today_button:function(){
+ if (scheduler.callEvent("onBeforeTodayDisplayed", [])) {
+ scheduler.setCurrentView(scheduler._currentDate());
+ }
+ },
+ dhx_cal_tab:function(){
+ var name = this.getAttribute("name");
+ var mode = name.substring(0, name.search("_tab"));
+ scheduler.setCurrentView(scheduler._date,mode);
+ },
+ buttons:{
+ "delete":function(id){
+ var c = scheduler.locale.labels.confirm_deleting;
+ scheduler._dhtmlx_confirm(c, scheduler.locale.labels.title_confirm_deleting, function(){ scheduler.deleteEvent(id); });
+ },
+ edit:function(id){ scheduler.edit(id); },
+ save:function(id){ scheduler.editStop(true); },
+ details:function(id){ scheduler.showLightbox(id); },
+ cancel:function(id){ scheduler.editStop(false); }
+ }
+};
+scheduler._dhtmlx_confirm = function(message, title, callback) {
+ if (!message)
+ return callback();
+ var opts = { text: message };
+ if (title)
+ opts.title = title;
+ if (callback) {
+ opts.callback = function(result) {
+ if (result)
+ callback();
+ };
+ }
+ dhtmlx.confirm(opts);
+};
+scheduler.addEventNow=function(start,end,e){
+ var base = {};
+ if (start && start.constructor.toString().match(/object/i) !== null){
+ base = start;
+ start = null;
+ }
+
+ var d = (this.config.event_duration||this.config.time_step)*60000;
+ if (!start) start = base.start_date||Math.round((scheduler._currentDate()).valueOf()/d)*d;
+ var start_date = new Date(start);
+ if (!end){
+ var start_hour = this.config.first_hour;
+ if (start_hour > start_date.getHours()){
+ start_date.setHours(start_hour);
+ start = start_date.valueOf();
+ }
+ end = start.valueOf()+d;
+ }
+ var end_date = new Date(end);
+
+ // scheduler.addEventNow(new Date(), new Date()) + collision though get_visible events defect (such event was not retrieved)
+ if(start_date.valueOf() == end_date.valueOf())
+ end_date.setTime(end_date.valueOf()+d);
+
+ base.start_date = base.start_date||start_date;
+ base.end_date = base.end_date||end_date;
+ base.text = base.text||this.locale.labels.new_event;
+ base.id = this._drag_id = this.uid();
+ this._drag_mode="new-size";
+
+ this._loading=true;
+ this.addEvent(base);
+ this.callEvent("onEventCreated",[this._drag_id,e]);
+ this._loading=false;
+
+ this._drag_event={}; //dummy , to trigger correct event updating logic
+ this._on_mouse_up(e);
+};
+scheduler._on_dbl_click=function(e,src){
+ src = src||(e.target||e.srcElement);
+ if (this.config.readonly) return;
+ var name = (src.className||"").split(" ")[0];
+ switch(name){
+ case "dhx_scale_holder":
+ case "dhx_scale_holder_now":
+ case "dhx_month_body":
+ case "dhx_wa_day_data":
+ if (!scheduler.config.dblclick_create) break;
+ this.addEventNow(this.getActionData(e).date,null,e);
+ break;
+ case "dhx_cal_event":
+ case "dhx_wa_ev_body":
+ case "dhx_agenda_line":
+ case "dhx_grid_event":
+ case "dhx_cal_event_line":
+ case "dhx_cal_event_clear":
+ var id = this._locate_event(src);
+ if (!this.callEvent("onDblClick",[id,e])) return;
+ if (this.config.details_on_dblclick || this._table_view || !this.getEvent(id)._timed || !this.config.select)
+ this.showLightbox(id);
+ else
+ this.edit(id);
+ break;
+ case "dhx_time_block":
+ case "dhx_cal_container":
+ return;
+ default:
+ var t = this["dblclick_"+name];
+ if (t) {
+ t.call(this,e);
+ }
+ else {
+ if (src.parentNode && src != this)
+ return scheduler._on_dbl_click(e,src.parentNode);
+ }
+ break;
+ }
+};
+//column index by mouse x-coordinate
+scheduler._get_column_index = function(x_pos){
+ var column = 0;
+ if (this._cols){
+
+ var width = 0;
+ for(var i=0; i < this._cols.length && !width; i++){
+ width = this._cols[i];
+ }
+
+ if(width){
+ column = x_pos / width;
+ }else{
+ column = 0;
+ }
+
+ if (this._ignores)
+ for (var i=0; i<=column; i++)
+ if (this._ignores[i])
+ column++;
+ }
+ return column;
+};
+//transform mouse coordinates to day-time indexes of week based view
+scheduler._week_indexes_from_pos = function(pos){
+ //"get position" can be invoked before columns are loaded into the units view(e.g. by onMouseMove handler in key_nav.js)
+ if(!this._cols){
+ return pos;
+ }else{
+ var column = this._get_column_index(pos.x);
+ pos.x=Math.min(this._cols.length-1, Math.max(0,Math.ceil(column)-1));
+
+ pos.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);
+ return pos;
+ }
+};
+
+scheduler._mouse_coords=function(ev){
+ var pos;
+ var b=document.body;
+ var d = document.documentElement;
+ if (!_isIE && (ev.pageX || ev.pageY))
+ pos={x:ev.pageX, y:ev.pageY};
+ else pos={
+ x:ev.clientX + (b.scrollLeft||d.scrollLeft||0) - b.clientLeft,
+ y:ev.clientY + (b.scrollTop||d.scrollTop||0) - b.clientTop
+ };
+
+ //apply layout
+ pos.x-=getAbsoluteLeft(this._obj)+(this._table_view?0:this.xy.scale_width);
+ pos.y-=getAbsoluteTop(this._obj)+this.xy.nav_height+(this._dy_shift||0)+this.xy.scale_height-this._els["dhx_cal_data"][0].scrollTop;
+ pos.ev = ev;
+
+ var handler = this["mouse_"+this._mode];
+ if (handler)
+ return handler.call(this,pos);
+
+
+ //transform to date
+ if (!this._table_view) {
+ pos = this._week_indexes_from_pos(pos);
+ } else {
+ var column = this._get_column_index(pos.x);
+ if (!this._cols || !this._colsS) // agenda/map views
+ return pos;
+ var dy=0;
+ for (dy=1; dy < this._colsS.heights.length; dy++)
+ if (this._colsS.heights[dy]>pos.y) break;
+
+ pos.y=Math.ceil( (Math.max(0, column)+Math.max(0,dy-1)*7)*24*60/this.config.time_step );
+
+ if (scheduler._drag_mode || this._mode == "month")
+ pos.y=(Math.max(0,Math.ceil(column)-1)+Math.max(0,dy-1)*7)*24*60/this.config.time_step;
+
+ //we care about ignored days only during event moving in month view
+ if (this._drag_mode == "move"){
+ if (scheduler._ignores_detected && scheduler.config.preserve_length){
+ pos._ignores = true;
+ //get real lengtn of event
+ if (!this._drag_event._event_length)
+ this._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"});
+ }
+ }
+
+ pos.x=0;
+ }
+ return pos;
+};
+scheduler._close_not_saved=function(){
+ if (new Date().valueOf()-(scheduler._new_event||0) > 500 && scheduler._edit_id){
+ var c=scheduler.locale.labels.confirm_closing;
+
+ scheduler._dhtmlx_confirm(c, scheduler.locale.labels.title_confirm_closing, function() { scheduler.editStop(scheduler.config.positive_closing); });
+ }
+};
+scheduler._correct_shift=function(start, back){
+ return start-=((new Date(scheduler._min_date)).getTimezoneOffset()-(new Date(start)).getTimezoneOffset())*60000*(back?-1:1);
+};
+scheduler._on_mouse_move=function(e){
+ if (this._drag_mode){
+ var pos=this._mouse_coords(e);
+ if (!this._drag_pos || pos.force_redraw || this._drag_pos.x!=pos.x || this._drag_pos.y!=pos.y ){
+ var start, end;
+ if (this._edit_id!=this._drag_id)
+ this._close_not_saved();
+
+ this._drag_pos=pos;
+
+ if (this._drag_mode=="create"){
+ this._close_not_saved();
+ this.unselect(this._select_id);
+ this._loading=true; //will be ignored by dataprocessor
+
+ start = this._get_date_from_pos(pos).valueOf();
+
+ if (!this._drag_start) {
+ var res = this.callEvent("onBeforeEventCreated", [e, this._drag_id]);
+ if (!res)
+ return;
+
+
+ this._drag_start=start;
+ return;
+ }
+
+ end = start;
+ if (end == this._drag_start) {
+ }
+
+ var start_date = new Date(this._drag_start);
+ var end_date = new Date(end);
+ if ( (this._mode == "day" || this._mode == "week") &&
+ (start_date.getHours() == end_date.getHours() &&
+ start_date.getMinutes() == end_date.getMinutes()) ) {
+ end_date = new Date(this._drag_start+1000);
+ }
+
+
+ this._drag_id=this.uid();
+ this.addEvent(start_date, end_date, this.locale.labels.new_event, this._drag_id, pos.fields);
+
+ this.callEvent("onEventCreated",[this._drag_id,e]);
+ this._loading=false;
+ this._drag_mode="new-size";
+
+ }
+
+ var ev=this.getEvent(this._drag_id);
+ var obj;
+
+ if (this._drag_mode=="move"){
+ start = this._min_date.valueOf()+(pos.y*this.config.time_step+pos.x*24*60 -(scheduler._move_pos_shift||0) )*60000;
+ if (!pos.custom && this._table_view) start+=this.date.time_part(ev.start_date)*1000;
+ start = this._correct_shift(start);
+
+ if (pos._ignores && this.config.preserve_length && this._table_view){
+ if (this.matrix)
+ obj = this.matrix[this._mode];
+ obj = obj || { x_step:1, x_unit:"day" };
+ end = start*1 + this._get_fictional_event_length(start, this._drag_event._event_length, obj);
+ } else
+ end = ev.end_date.valueOf()-(ev.start_date.valueOf()-start);
+ } else { // resize
+ start = ev.start_date.valueOf();
+ end = ev.end_date.valueOf();
+ if (this._table_view) {
+ var resize_date = this._min_date.valueOf()+pos.y*this.config.time_step*60000 + (pos.custom?0:24*60*60000);
+ if (this._mode == "month") {
+ resize_date = this._correct_shift(resize_date, false);
+ if( this._drag_from_start ) {
+ var day = 24*60*60000;
+ if( 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
+ start = resize_date - day;
+ } else {
+ end = resize_date;
+ }
+ } else {
+ if (pos.resize_from_start)
+ start = resize_date;
+ else
+ end = resize_date;
+ }
+ } else {
+ end = this.date.date_part(new Date(ev.end_date.valueOf() - 1)).valueOf()+pos.y*this.config.time_step*60000;
+ this._els["dhx_cal_data"][0].style.cursor="s-resize";
+ if (this._mode == "week" || this._mode == "day")
+ end = this._correct_shift(end);
+ }
+ if (this._drag_mode == "new-size") {
+ if (end <= this._drag_start){
+ var shift = pos.shift||((this._table_view && !pos.custom)?24*60*60000:0);
+ start = end-(pos.shift?0:shift);
+ end = this._drag_start+(shift||(this.config.time_step*60000));
+ } else {
+ start = this._drag_start;
+ }
+ } else {
+ if (end<=start)
+ end=start+this.config.time_step*60000;
+ }
+ }
+ var new_end = new Date(end-1);
+ var new_start = new Date(start);
+ //deny drag out of visible scheduler scale in timeline view
+ if(scheduler.config.limit_drag_out &&
+ (+new_start < +scheduler._min_date || +end > +scheduler._max_date)){
+ var duration = end - new_start;
+ if(+new_start < +scheduler._min_date){
+ new_start = new Date(scheduler._min_date);
+ end = new Date(+new_start + duration);
+ }else{
+ end = new Date(scheduler._max_date);
+ new_start = new Date(+end - duration);
+ }
+ var new_end = new Date(end-1);
+ }
+
+
+
+ // fix event dates when resized to bottom of the column (day/week views)
+ if(!this._table_view &&
+ (pos.x != this._get_event_sday({start_date: new Date(end), end_date:new Date(end)}) || new Date(end).getHours() >= this.config.last_hour)){
+ var duration = end - new_start;
+ var day = this._min_date.valueOf()+(pos.x*24*60)*60000;
+ end = scheduler.date.date_part(new Date(day));
+ end.setHours(this.config.last_hour);
+ new_end = new Date(end-1);
+ if(this._drag_mode == "move"){
+ new_start = new Date(+end - duration);
+ }
+ }
+
+ //prevent out-of-borders situation for day|week view
+ if ( this._table_view || (new_end.getDate()==new_start.getDate() && new_end.getHours()<this.config.last_hour) || scheduler._allow_dnd ){
+ ev.start_date=new_start;
+ ev.end_date=new Date(end);
+ if (this.config.update_render){
+ //fix for repaint after dnd and scroll issue, #231
+ var sx = scheduler._els["dhx_cal_data"][0].scrollTop;
+ this.update_view();
+ scheduler._els["dhx_cal_data"][0].scrollTop = sx;
+ } else
+ this.updateEvent(this._drag_id);
+ }
+ if (this._table_view) {
+ this.for_rendered(this._drag_id,function(r){
+ r.className+=" dhx_in_move";
+ });
+ }
+
+ this.callEvent("onEventDrag", [this._drag_id, this._drag_mode, e]);
+ }
+ } else {
+ if (scheduler.checkEvent("onMouseMove")){
+ var id = this._locate_event(e.target||e.srcElement);
+ this.callEvent("onMouseMove",[id,e]);
+ }
+ }
+};
+scheduler._on_mouse_down=function(e,src) {
+ // on Mac we do not get onmouseup event when clicking right mouse button leaving us in dnd state
+ // let's ignore right mouse button then
+ if (e.button == 2)
+ return;
+
+ if (this.config.readonly || this._drag_mode) return;
+ src = src||(e.target||e.srcElement);
+ var classname = src.className && src.className.split(" ")[0];
+
+ switch (classname) {
+ case "dhx_cal_event_line":
+ case "dhx_cal_event_clear":
+ if (this._table_view)
+ this._drag_mode="move"; //item in table mode
+ break;
+ case "dhx_event_move":
+ case "dhx_wa_ev_body":
+ this._drag_mode="move";
+ break;
+ case "dhx_event_resize":
+ this._drag_mode="resize";
+ if((src.className||"").indexOf("dhx_event_resize_end") < 0){
+ scheduler._drag_from_start = true;
+ }else{
+ scheduler._drag_from_start = false;
+ }
+ break;
+ case "dhx_scale_holder":
+ case "dhx_scale_holder_now":
+ case "dhx_month_body":
+ case "dhx_matrix_cell":
+ case "dhx_marked_timespan":
+ this._drag_mode="create";
+ break;
+ case "":
+ if (src.parentNode)
+ return scheduler._on_mouse_down(e,src.parentNode);
+ break;
+ default:
+ if (!scheduler.checkEvent("onMouseDown") || scheduler.callEvent("onMouseDown", [classname])) {
+ if (src.parentNode && src != this && classname != "dhx_body") {
+ return scheduler._on_mouse_down(e,src.parentNode);
+ }
+ }
+ this._drag_mode=null;
+ this._drag_id=null;
+ break;
+ }
+ if (this._drag_mode){
+ var id = this._locate_event(src);
+ if (!this.config["drag_"+this._drag_mode] || !this.callEvent("onBeforeDrag",[id, this._drag_mode, e]))
+ this._drag_mode=this._drag_id=0;
+ else {
+ this._drag_id= id;
+ this._drag_event = scheduler._lame_clone(this.getEvent(this._drag_id) || {});
+ }
+ }
+ this._drag_start=null;
+};
+
+
+scheduler._get_private_properties = function(event){
+ var fields = {};
+ for(var i in event){
+ if(i.indexOf("_") === 0){
+ fields[i] = true;
+ }
+ }
+ return fields;
+};
+scheduler._clear_temporary_properties = function(clean, flagged_event){
+ var initial = this._get_private_properties(clean);
+ var current_state = this._get_private_properties(flagged_event);
+ for(var i in current_state){
+ if(!initial[i]){
+ delete flagged_event[i];
+ }
+ }
+};
+
+
+scheduler._on_mouse_up=function(e){
+ if (e && e.button == 2 && scheduler.config.touch) return;
+ if (this._drag_mode && this._drag_id){
+ this._els["dhx_cal_data"][0].style.cursor="default";
+ //drop
+ var ev=this.getEvent(this._drag_id);
+ if (this._drag_event._dhx_changed || !this._drag_event.start_date || ev.start_date.valueOf()!=this._drag_event.start_date.valueOf() || ev.end_date.valueOf()!=this._drag_event.end_date.valueOf()){
+ var is_new=(this._drag_mode=="new-size");
+ if (!this.callEvent("onBeforeEventChanged",[ev, e, is_new, this._drag_event])){
+ if (is_new)
+ this.deleteEvent(ev.id, true);
+ else {
+ this._drag_event._dhx_changed = false;
+ this._clear_temporary_properties(ev, this._drag_event);
+ scheduler._lame_copy(ev, this._drag_event);
+ this.updateEvent(ev.id);
+ }
+ } else {
+ var drag_id = this._drag_id;
+ var mode = this._drag_mode;
+ this._drag_id = this._drag_mode = null;
+ if (is_new && this.config.edit_on_create){
+ this.unselect();
+ this._new_event=new Date();//timestamp of creation
+ //if selection disabled - force lightbox usage
+ if (this._table_view || this.config.details_on_create || !this.config.select) {
+ scheduler.callEvent("onDragEnd", [drag_id, mode, e]);
+ return this.showLightbox(drag_id);
+ }
+ this._drag_pos = true; //set flag to trigger full redraw
+ this._select_id = this._edit_id = drag_id;
+ } else {
+ if (!this._new_event)
+ this.callEvent(is_new?"onEventAdded":"onEventChanged",[drag_id,this.getEvent(drag_id)]);
+ }
+ }
+ }
+ if (this._drag_pos) this.render_view_data(); //redraw even if there is no real changes - necessary for correct positioning item after drag
+ scheduler.callEvent("onDragEnd", [this._drag_id, this._drag_mode, e]);
+ }
+ this._drag_id = null;
+ this._drag_mode=null;
+ this._drag_pos=null;
+};
+
+scheduler._trigger_dyn_loading = function(){
+ if (this._load_mode && this._load()){
+ this._render_wait = true;
+ return true;
+ }else{
+ return false;
+ }
+};
+scheduler.update_view=function(){
+ var view = this[this._mode + "_view"];
+ if(view){
+ view(true);
+ }else{
+ this._reset_scale();
+ }
+
+ if (this._trigger_dyn_loading()){
+ return true;
+ }
+ this.render_view_data();
+};
+
+scheduler.isViewExists = function(mode){
+ return !!(scheduler[mode+ "_view"] ||
+ (scheduler.date[mode+ "_start"] && scheduler.templates[mode+ "_date"] && scheduler.templates[mode+ "_scale_date"]));
+};
+
+scheduler.updateView = function(date, mode) {
+ date = date || this._date;
+ mode = mode || this._mode;
+ var dhx_cal_data = 'dhx_cal_data';
+
+ if (!this._mode)
+ this._obj.className += " dhx_scheduler_" + mode; else {
+ this._obj.className = this._obj.className.replace("dhx_scheduler_" + this._mode, "dhx_scheduler_" + mode);
+ }
+
+ var prev_scroll = (this._mode == mode && this.config.preserve_scroll) ? this._els[dhx_cal_data][0].scrollTop : false; // saving current scroll
+
+ //hide old custom view
+ if (this[this._mode + "_view"] && mode && this._mode != mode)
+ this[this._mode + "_view"](false);
+
+ this._close_not_saved();
+
+ var dhx_multi_day = 'dhx_multi_day';
+ if (this._els[dhx_multi_day]) {
+ this._els[dhx_multi_day][0].parentNode.removeChild(this._els[dhx_multi_day][0]);
+ this._els[dhx_multi_day] = null;
+ }
+
+ this._mode = mode;
+ this._date = date;
+ this._table_view = (this._mode == "month");
+
+ this._dy_shift = 0;//correction for multiday section in week/day views
+
+ var tabs = this._els["dhx_cal_tab"];
+ if(tabs){//calendar can work without view tabs
+ for (var i = 0; i < tabs.length; i++) {
+ var name = tabs[i].className;
+ name = name.replace(/ active/g, "");
+ if (tabs[i].getAttribute("name") == this._mode + "_tab")
+ name = name + " active";
+ tabs[i].className = name;
+ }
+ }
+ //show new view
+ this.update_view();
+
+ if (typeof prev_scroll == "number") // if we are updating or working with the same view scrollTop should be saved
+ this._els[dhx_cal_data][0].scrollTop = prev_scroll; // restoring original scroll
+};
+scheduler.setCurrentView = function(date, mode) {
+ if (!this.callEvent("onBeforeViewChange", [this._mode, this._date, mode || this._mode, date || this._date])) return;
+ this.updateView(date, mode);
+ this.callEvent("onViewChange", [this._mode, this._date]);
+};
+scheduler._render_x_header = function(i,left,d,h){
+ //header scale
+ var head=document.createElement("DIV");
+ head.className = "dhx_scale_bar";
+
+ if(this.templates[this._mode+"_scalex_class"]){
+ //'_scalex_class' - timeline already have similar template, use the same name
+ head.className += ' ' + this.templates[this._mode+"_scalex_class"](d);
+ }
+
+ var width = this._cols[i]-1;
+
+ if (this._mode == "month" && i === 0 && this.config.left_border) {
+ head.className += " dhx_scale_bar_border";
+ left = left+1;
+ }
+ this.set_xy(head, width, this.xy.scale_height-2, left, 0);//-1 for border
+ head.innerHTML=this.templates[this._mode+"_scale_date"](d,this._mode); //TODO - move in separate method
+ h.appendChild(head);
+};
+
+scheduler._get_columns_num = function(from, to){
+ var count = 7;
+ if (!scheduler._table_view){
+ var count_n = scheduler.date["get_"+scheduler._mode+"_end"];
+ if (count_n) to = count_n(from);
+ count = Math.round((to.valueOf()-from.valueOf())/(1000*60*60*24));
+ }
+ return count;
+};
+scheduler._get_timeunit_start = function(){
+ //start date of currently displayed time unit(day, week,...)
+ return this.date[this._mode+"_start"](new Date(this._date.valueOf()));
+};
+
+scheduler._get_view_end = function(){
+ var dd = this._get_timeunit_start();
+ var ed = scheduler.date.add(dd, 1, this._mode);
+ if (!scheduler._table_view){
+ var count_n = scheduler.date["get_"+scheduler._mode+"_end"];
+ if (count_n) ed = count_n(dd);
+ }
+ return ed;
+};
+scheduler._calc_scale_sizes = function(width, from, to){
+ //calculates number of displayed columns(days/units/month view cols) and their widths
+ var summ = width; //border delta
+ var count = this._get_columns_num(from, to);
+
+ this._process_ignores(from, count, "day", 1);
+ var realcount = count - this._ignores_detected;
+
+ for (var i=0; i<count; i++){
+ if (this._ignores[i]){
+ this._cols[i] = 0;
+ realcount++;
+ } else {
+ this._cols[i]=Math.floor(summ/(realcount-i));
+ }
+ summ-=this._cols[i];
+ this._colsS[i]=(this._cols[i-1]||0)+(this._colsS[i-1]||(this._table_view?0:this.xy.scale_width+2));
+ this._colsS['col_length'] = count;
+ }
+
+ this._colsS[count]=this._cols[count-1]+this._colsS[count-1];
+};
+scheduler._set_scale_col_size = function(div, width, left){
+ var c = this.config;
+ this.set_xy(div, width-1, c.hour_size_px*(c.last_hour-c.first_hour), left+this.xy.scale_width+1, 0);//-1 for border
+};
+
+scheduler._render_scales = function(header, data_area){
+ //render columns in week/units view, or header in month view
+ var sd = new Date(scheduler._min_date),
+ ed = new Date(scheduler._max_date),
+ today = this.date.date_part( scheduler._currentDate());
+
+ var summ = parseInt(header.style.width,10); //border delta
+ var d = new Date(this._min_date);
+ var count = this._get_columns_num(sd, ed);
+ this._calc_scale_sizes(summ, sd, ed);
+ var left=0;
+
+ header.innerHTML = "";
+ for (var i=0; i<count; i++){
+ if (!this._ignores[i]){
+ this._render_x_header(i,left,d,header);
+ }
+ if (!this._table_view){
+ var scales=document.createElement("DIV");
+ var cls = "dhx_scale_holder";
+ if (d.valueOf() == today.valueOf()) cls = "dhx_scale_holder_now";
+
+ if (this._ignores_detected && this._ignores[i]){
+ cls += " dhx_scale_ignore";
+ }
+
+ scales.className = cls+" "+this.templates.week_date_class(d,today);
+
+ this._set_scale_col_size(scales, this._cols[i], left);
+
+ data_area.appendChild(scales);
+ this.callEvent("onScaleAdd",[scales, d]);
+ }
+
+ left+=this._cols[i];
+ d=this.date.add(d,1,"day");
+ }
+};
+
+scheduler._reset_scale=function(){
+ //current mode doesn't support scales
+ //we mustn't call reset_scale for such modes, so it just to be sure
+ if (!this.templates[this._mode + "_date"]) return;
+
+ var h = this._els["dhx_cal_header"][0];
+ var data_area = this._els["dhx_cal_data"][0];
+ var c = this.config;
+
+ h.innerHTML = "";
+ //data_area.scrollTop = 0; //fix flickering in FF; makes IE8 flicker instead
+ data_area.innerHTML = "";
+
+ var str = ((c.readonly || (!c.drag_resize)) ? " dhx_resize_denied" : "") + ((c.readonly || (!c.drag_move)) ? " dhx_move_denied" : "");
+ if (str) data_area.className = "dhx_cal_data" + str;
+
+ this._scales = {};
+ this._cols = []; //store for data section
+ this._colsS = {height: 0};
+ this._dy_shift = 0;
+
+ this.set_sizes();
+
+ var d,sd,today;
+ var dd = this._get_timeunit_start(),
+ ed = scheduler._get_view_end();
+
+ d = sd = this._table_view ? scheduler.date.week_start(dd) : dd;
+
+
+ this._min_date=d;
+ this._els["dhx_cal_date"][0].innerHTML=this.templates[this._mode+"_date"](dd,ed,this._mode);
+
+ this._max_date = ed;
+ scheduler._render_scales(h, data_area);
+
+ if (this._table_view) // month view
+ this._reset_month_scale(data_area,dd,sd);
+ else{
+ this._reset_hours_scale(data_area,dd,sd);
+ if (c.multi_day) {
+ var dhx_multi_day = 'dhx_multi_day';
+
+ if(this._els[dhx_multi_day]) {
+ this._els[dhx_multi_day][0].parentNode.removeChild(this._els[dhx_multi_day][0]);
+ this._els[dhx_multi_day] = null;
+ }
+
+ var navline = this._els["dhx_cal_navline"][0];
+ var top = navline.offsetHeight + this._els["dhx_cal_header"][0].offsetHeight+1;
+
+ var c1 = document.createElement("DIV");
+ c1.className = dhx_multi_day;
+ c1.style.visibility="hidden";
+ this.set_xy(c1, this._colsS[this._colsS.col_length]+this.xy.scroll_width, 0, 0, top); // 2 extra borders, dhx_header has -1 bottom margin
+ data_area.parentNode.insertBefore(c1,data_area);
+
+ var c2 = c1.cloneNode(true);
+ c2.className = dhx_multi_day+"_icon";
+ c2.style.visibility="hidden";
+ this.set_xy(c2, this.xy.scale_width, 0, 0, top); // dhx_header has -1 bottom margin
+
+ c1.appendChild(c2);
+ this._els[dhx_multi_day]=[c1,c2];
+ this._els[dhx_multi_day][0].onclick = this._click.dhx_cal_data;
+ }
+ }
+};
+scheduler._reset_hours_scale=function(b,dd,sd){
+ var c=document.createElement("DIV");
+ c.className="dhx_scale_holder";
+
+ var date = new Date(1980,1,1,this.config.first_hour,0,0);
+ for (var i=this.config.first_hour*1; i < this.config.last_hour; i++) {
+ var cc=document.createElement("DIV");
+ cc.className="dhx_scale_hour";
+ cc.style.height=this.config.hour_size_px-(this._quirks?0:1)+"px";
+ var width = this.xy.scale_width;
+ if (this.config.left_border) {
+ width = width - 1;
+ cc.className += " dhx_scale_hour_border";
+ }
+ cc.style.width = width + "px";
+ cc.innerHTML=scheduler.templates.hour_scale(date);
+
+ c.appendChild(cc);
+ date=this.date.add(date,1,"hour");
+ }
+ b.appendChild(c);
+ if (this.config.scroll_hour)
+ b.scrollTop = this.config.hour_size_px*(this.config.scroll_hour-this.config.first_hour);
+};
+
+scheduler._currentDate = function(){
+ if(scheduler.config.now_date){
+ return new Date(scheduler.config.now_date);
+ }
+ return new Date();
+};
+
+scheduler._process_ignores = function(sd, n, mode, step, preserve){
+ this._ignores={};
+ this._ignores_detected = 0;
+ var ignore = scheduler["ignore_"+this._mode];
+
+ if (ignore){
+ var ign_date = new Date(sd);
+ for (var i=0; i<n; i++){
+ if (ignore(ign_date)){
+ this._ignores_detected += 1;
+ this._ignores[i] = true;
+ if (preserve)
+ n++;
+ }
+ ign_date = scheduler.date.add(ign_date, step, mode);
+ }
+ }
+};
+
+scheduler._render_month_scale = function(div, dd/*month start*/, sd/*view start*/ ){
+ //renders month view layout
+
+ var ed=scheduler.date.add(dd,1,"month"),
+ view_start = new Date(sd);
+ var cd = scheduler._currentDate();
+ this.date.date_part(cd);
+ this.date.date_part(sd);
+
+ var rows=Math.ceil(Math.round((ed.valueOf()-sd.valueOf()) / (60*60*24*1000) ) / 7);
+ var tdcss=[];
+
+ for (var i=0; i<=7; i++) {
+ var cell_width = ((this._cols[i]||0)-1);
+ if (i === 0 && this.config.left_border) {
+ cell_width = cell_width - 1;
+ }
+ tdcss[i]=" style='width:"+cell_width+"px;";
+ }
+
+ function getCellHeight(row){
+ var h = scheduler._colsS.height;
+ if(scheduler._colsS.heights[row + 1] !== undefined ){
+ h = scheduler._colsS.heights[row + 1] - (scheduler._colsS.heights[row]||0);
+ }
+ return h;
+ }
+
+
+ var cellheight = 0;
+
+ var html="<table cellpadding='0' cellspacing='0'>";
+ var rendered_dates = [];
+ for (var i=0; i<rows; i++){
+ html+="<tr>";
+ var row_height = Math.max(getCellHeight(i) - scheduler.xy.month_head_height, 0);
+ for (var j=0; j<7; j++) {
+ html+="<td";
+
+ var cls = "";
+ if (sd<dd)
+ cls='dhx_before';
+ else if (sd>=ed)
+ cls='dhx_after';
+ else if (sd.valueOf()==cd.valueOf())
+ cls='dhx_now';
+
+ if (this._ignores_detected && this._ignores[j]){
+ cls += " dhx_scale_ignore";
+ }
+
+ html+=" class='"+cls+" "+this.templates.month_date_class(sd,cd)+"' >";
+ var body_class = "dhx_month_body";
+ var head_class = "dhx_month_head";
+ if (j === 0 && this.config.left_border) {
+ body_class += " dhx_month_body_border";
+ head_class += " dhx_month_head_border";
+ }
+ if (!this._ignores_detected || !this._ignores[j]){
+ html+="<div class='"+head_class+"'>"+this.templates.month_day(sd)+"</div>";
+ html+="<div class='"+body_class+"' "+tdcss[j] + ";height:"+row_height + "px;'></div></td>";
+ } else {
+ html+="<div></div><div></div>";
+ }
+ rendered_dates.push(sd);
+ var bf1 = sd.getDate();
+ sd=this.date.add(sd,1,"day");
+ if (sd.getDate() - bf1 > 1)
+ sd = new Date(sd.getFullYear(), sd.getMonth(), bf1 + 1, 12, 0);
+ }
+ html+="</tr>";
+
+ scheduler._colsS.heights[i] = cellheight;
+ cellheight += getCellHeight(i);
+ }
+ html+="</table>";
+
+ this._min_date = view_start;
+ this._max_date = sd;
+
+ div.innerHTML=html;
+
+ this._scales = {};
+ var divs = div.getElementsByTagName('div');
+ for (var i=0; i<rendered_dates.length; i++) { // [header, body, header, body, ...]
+ var div = divs[(i*2)+1];
+ var date = rendered_dates[i];
+ this._scales[+date] = div;
+ }
+ for (var i=0; i<rendered_dates.length; i++) {
+ var date = rendered_dates[i];
+ this.callEvent("onScaleAdd", [this._scales[+date], date]);
+ }
+
+
+
+ return this._max_date;
+};
+
+scheduler._reset_month_scale=function(b,dd,sd){
+ //recalculates rows height and redraws month layout
+ var ed=scheduler.date.add(dd,1,"month");
+
+ //trim time part for comparation reasons
+ var cd = scheduler._currentDate();
+ this.date.date_part(cd);
+ this.date.date_part(sd);
+
+ var rows=Math.ceil(Math.round((ed.valueOf()-sd.valueOf()) / (60*60*24*1000) ) / 7);
+
+ var height = (Math.floor(b.clientHeight/rows) - this.xy.month_head_height);
+
+ this._colsS.height = height + this.xy.month_head_height;
+ this._colsS.heights = [];
+
+ return scheduler._render_month_scale(b, dd, sd);
+
+};
+scheduler.getLabel = function(property, key) {
+ var sections = this.config.lightbox.sections;
+ for (var i=0; i<sections.length; i++) {
+ if(sections[i].map_to == property) {
+ var options = sections[i].options;
+ for (var j=0; j<options.length; j++) {
+ if(options[j].key == key) {
+ return options[j].label;
+ }
+ }
+ }
+ }
+ return "";
+};
+scheduler.updateCollection = function(list_name, collection) {
+ var list = scheduler.serverList(list_name);
+ if (!list) return false;
+ list.splice(0, list.length);
+ list.push.apply(list, collection || []);
+ scheduler.callEvent("onOptionsLoad", []);
+ scheduler.resetLightbox();
+ return true;
+};
+scheduler._lame_clone = function(object, cache) {
+ var i, t, result; // iterator, types array, result
+
+ cache = cache || [];
+
+ for (i=0; i<cache.length; i+=2)
+ if(object === cache[i])
+ return cache[i+1];
+
+ if (object && typeof object == "object") {
+ result = {};
+ t = [Array,Date,Number,String,Boolean];
+ for (i=0; i<t.length; i++) {
+ if (object instanceof t[i])
+ result = i ? new t[i](object) : new t[i](); // first one is array
+ }
+ cache.push(object, result);
+ for (i in object) {
+ if (Object.prototype.hasOwnProperty.apply(object, [i]))
+ result[i] = scheduler._lame_clone(object[i], cache);
+ }
+ }
+ return result || object;
+};
+scheduler._lame_copy = function(target, source) {
+ for (var key in source) {
+ if (source.hasOwnProperty(key)) {
+ target[key] = source[key];
+ }
+ }
+ return target;
+};
+scheduler._get_date_from_pos = function(pos) {
+ var start=this._min_date.valueOf()+(pos.y*this.config.time_step+(this._table_view?0:pos.x)*24*60)*60000;
+ return new Date(this._correct_shift(start));
+};
+// n_ev - native event
+scheduler.getActionData = function(n_ev) {
+ var pos = this._mouse_coords(n_ev);
+ return {
+ date:this._get_date_from_pos(pos),
+ section:pos.section
+ };
+};
+scheduler._focus = function(node, select){
+ if (node && node.focus){
+ if (this.config.touch){
+ window.setTimeout(function(){
+ node.focus();
+ },100);
+ } else {
+ if (select && node.select) node.select();
+ node.focus();
+ }
+ }
+};
+
+//non-linear scales
+scheduler._get_real_event_length=function(sd, fd, obj){
+ var ev_length = fd -sd;
+ var hours = (obj._start_correction + obj._end_correction)||0;
+ var ignore = this["ignore_"+this._mode];
+
+ var start_slot = 0,
+ end_slot;
+ if (obj.render){
+ start_slot = this._get_date_index(obj, sd);
+ end_slot = this._get_date_index(obj, fd);
+ } else{
+ end_slot = Math.round(ev_length/60/60/1000/24);
+ }
+
+ while (start_slot < end_slot){
+ var check = scheduler.date.add(fd, -obj.x_step, obj.x_unit);
+ if (ignore && ignore(fd))
+ ev_length -= (fd-check);
+ else
+ ev_length -= hours;
+
+ fd = check;
+ end_slot--;
+ }
+ return ev_length;
+};
+scheduler._get_fictional_event_length=function(end_date, ev_length, obj, back){
+ var sd = new Date(end_date);
+ var dir = back ? -1 : 1;
+
+ //get difference caused by first|last hour
+ if (obj._start_correction || obj._end_correction){
+ var today;
+ if (back)
+ today = (sd.getHours()*60+sd.getMinutes()) - (obj.first_hour||0)*60;
+ else
+ today = (obj.last_hour||0)*60 - (sd.getHours()*60+sd.getMinutes());
+ var per_day = (obj.last_hour - obj.first_hour)*60;
+ var days = Math.ceil( (ev_length / (60*1000) - today ) / per_day);
+ ev_length += days * (24*60 - per_day) * 60 * 1000;
+ }
+
+ var fd = new Date(end_date*1+ev_length*dir);
+ var ignore = this["ignore_"+this._mode];
+
+ var start_slot = 0,
+ end_slot;
+ if (obj.render){
+ start_slot = this._get_date_index(obj, sd);
+ end_slot = this._get_date_index(obj, fd);
+ } else{
+ end_slot = Math.round(ev_length/60/60/1000/24);
+ }
+
+ while (start_slot*dir <= end_slot*dir){
+ var check = scheduler.date.add(sd, obj.x_step*dir, obj.x_unit);
+ if (ignore && ignore(sd)){
+ ev_length += (check-sd)*dir;
+ end_slot += dir;
+ }
+
+ sd = check;
+ start_slot+=dir;
+ }
+
+ return ev_length;
+};
+
+scheduler._get_section_view = function(){
+ if(this.matrix && this.matrix[this._mode]){
+ return this.matrix[this._mode];
+ }else if(this._props && this._props[this._mode]){
+ return this._props[this._mode];
+ }
+ return null;
+};
+
+scheduler._get_section_property = function(){
+ if(this.matrix && this.matrix[this._mode]){
+ return this.matrix[this._mode].y_property;
+ }else if(this._props && this._props[this._mode]){
+ return this._props[this._mode].map_to;
+ }
+ return null;
+};
+
+scheduler._is_initialized = function(){
+ var state = this.getState();
+ return (this._obj && state.date && state.mode);
+};
+scheduler._is_lightbox_open = function(){
+ var state = this.getState();
+ return state.lightbox_id !== null && state.lightbox_id !== undefined;
+};
+scheduler.date={
+ init:function(){
+ var s = scheduler.locale.date.month_short;
+ var t = scheduler.locale.date.month_short_hash = {};
+ for (var i = 0; i < s.length; i++)
+ t[s[i]]=i;
+
+ var s = scheduler.locale.date.month_full;
+ var t = scheduler.locale.date.month_full_hash = {};
+ for (var i = 0; i < s.length; i++)
+ t[s[i]]=i;
+ },
+ date_part:function(date){
+ date.setHours(0);
+ date.setMinutes(0);
+ date.setSeconds(0);
+ date.setMilliseconds(0);
+ if (date.getHours() !== 0)
+ date.setTime(date.getTime() + 60 * 60 * 1000 * (24 - date.getHours()));
+ return date;
+ },
+ time_part:function(date){
+ return (date.valueOf()/1000 - date.getTimezoneOffset()*60)%86400;
+ },
+ week_start:function(date){
+ var shift=date.getDay();
+ if (scheduler.config.start_on_monday){
+ if (shift===0) shift=6;
+ else shift--;
+ }
+ return this.date_part(this.add(date,-1*shift,"day"));
+ },
+ month_start:function(date){
+ date.setDate(1);
+ return this.date_part(date);
+ },
+ year_start:function(date){
+ date.setMonth(0);
+ return this.month_start(date);
+ },
+ day_start:function(date){
+ return this.date_part(date);
+ },
+ _add_days:function(date, inc){
+ var ndate = new Date(date.valueOf());
+
+ ndate.setDate(ndate.getDate() + inc);
+ if (!date.getHours() && ndate.getHours()) //shift to yesterday
+ ndate.setTime(ndate.getTime() + 60 * 60 * 1000 * (24 - ndate.getHours()));
+ return ndate;
+ },
+ add:function(date,inc,mode){
+ var ndate=new Date(date.valueOf());
+ switch(mode){
+ case "day":
+ ndate = scheduler.date._add_days(ndate, inc);
+ break;
+ case "week":
+ ndate = scheduler.date._add_days(ndate, inc * 7);
+ break;
+ case "month": ndate.setMonth(ndate.getMonth()+inc); break;
+ case "year": ndate.setYear(ndate.getFullYear()+inc); break;
+ case "hour": ndate.setHours(ndate.getHours()+inc); break;
+ case "minute": ndate.setMinutes(ndate.getMinutes()+inc); break;
+ default:
+ return scheduler.date["add_"+mode](date,inc,mode);
+ }
+ return ndate;
+ },
+ to_fixed:function(num){
+ if (num<10) return "0"+num;
+ return num;
+ },
+ copy:function(date){
+ return new Date(date.valueOf());
+ },
+ date_to_str:function(format,utc){
+ format=format.replace(/%[a-zA-Z]/g,function(a){
+ switch(a){
+ case "%d": return "\"+scheduler.date.to_fixed(date.getDate())+\"";
+ case "%m": return "\"+scheduler.date.to_fixed((date.getMonth()+1))+\"";
+ case "%j": return "\"+date.getDate()+\"";
+ case "%n": return "\"+(date.getMonth()+1)+\"";
+ case "%y": return "\"+scheduler.date.to_fixed(date.getFullYear()%100)+\"";
+ case "%Y": return "\"+date.getFullYear()+\"";
+ case "%D": return "\"+scheduler.locale.date.day_short[date.getDay()]+\"";
+ case "%l": return "\"+scheduler.locale.date.day_full[date.getDay()]+\"";
+ case "%M": return "\"+scheduler.locale.date.month_short[date.getMonth()]+\"";
+ case "%F": return "\"+scheduler.locale.date.month_full[date.getMonth()]+\"";
+ case "%h": return "\"+scheduler.date.to_fixed((date.getHours()+11)%12+1)+\"";
+ case "%g": return "\"+((date.getHours()+11)%12+1)+\"";
+ case "%G": return "\"+date.getHours()+\"";
+ case "%H": return "\"+scheduler.date.to_fixed(date.getHours())+\"";
+ case "%i": return "\"+scheduler.date.to_fixed(date.getMinutes())+\"";
+ case "%a": return "\"+(date.getHours()>11?\"pm\":\"am\")+\"";
+ case "%A": return "\"+(date.getHours()>11?\"PM\":\"AM\")+\"";
+ case "%s": return "\"+scheduler.date.to_fixed(date.getSeconds())+\"";
+ case "%W": return "\"+scheduler.date.to_fixed(scheduler.date.getISOWeek(date))+\"";
+ default: return a;
+ }
+ });
+ if (utc) format=format.replace(/date\.get/g,"date.getUTC");
+ return new Function("date","return \""+format+"\";");
+ },
+ str_to_date:function(format,utc){
+ var splt="var temp=date.match(/[a-zA-Z]+|[0-9]+/g);";
+ var mask=format.match(/%[a-zA-Z]/g);
+ for (var i=0; i<mask.length; i++){
+ switch(mask[i]){
+ case "%j":
+ case "%d": splt+="set[2]=temp["+i+"]||1;";
+ break;
+ case "%n":
+ case "%m": splt+="set[1]=(temp["+i+"]||1)-1;";
+ break;
+ case "%y": splt+="set[0]=temp["+i+"]*1+(temp["+i+"]>50?1900:2000);";
+ break;
+ case "%g":
+ case "%G":
+ case "%h":
+ case "%H":
+ splt+="set[3]=temp["+i+"]||0;";
+ break;
+ case "%i":
+ splt+="set[4]=temp["+i+"]||0;";
+ break;
+ case "%Y": splt+="set[0]=temp["+i+"]||0;";
+ break;
+ case "%a":
+ case "%A": splt+="set[3]=set[3]%12+((temp["+i+"]||'').toLowerCase()=='am'?0:12);";
+ break;
+ case "%s": splt+="set[5]=temp["+i+"]||0;";
+ break;
+ case "%M": splt+="set[1]=scheduler.locale.date.month_short_hash[temp["+i+"]]||0;";
+ break;
+ case "%F": splt+="set[1]=scheduler.locale.date.month_full_hash[temp["+i+"]]||0;";
+ break;
+ default:
+ break;
+ }
+ }
+ var code ="set[0],set[1],set[2],set[3],set[4],set[5]";
+ if (utc) code =" Date.UTC("+code+")";
+ return new Function("date","var set=[0,0,1,0,0,0]; "+splt+" return new Date("+code+");");
+ },
+ getISOWeek: function(ndate) {
+ if(!ndate) return false;
+ var nday = ndate.getDay();
+ if (nday === 0) {
+ nday = 7;
+ }
+ var first_thursday = new Date(ndate.valueOf());
+ first_thursday.setDate(ndate.getDate() + (4 - nday));
+ var year_number = first_thursday.getFullYear(); // year of the first Thursday
+ var ordinal_date = Math.round( (first_thursday.getTime() - new Date(year_number, 0, 1).getTime()) / 86400000); //ordinal date of the first Thursday - 1 (so not really ordinal date)
+ var week_number = 1 + Math.floor( ordinal_date / 7);
+ return week_number;
+ },
+ getUTCISOWeek: function(ndate){
+ return this.getISOWeek(this.convert_to_utc(ndate));
+ },
+ convert_to_utc: function(date) {
+ return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
+ }
+};
+scheduler.locale = {
+ date:{
+ month_full:["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
+ month_short:["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
+ day_full:["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
+ day_short:["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
+ },
+ labels:{
+ dhx_cal_today_button:"Today",
+ day_tab:"Day",
+ week_tab:"Week",
+ month_tab:"Month",
+ new_event:"New event",
+ icon_save:"Save",
+ icon_cancel:"Cancel",
+ icon_details:"Details",
+ icon_edit:"Edit",
+ icon_delete:"Delete",
+ confirm_closing:"",//Your changes will be lost, are your sure ?
+ confirm_deleting:"Event will be deleted permanently, are you sure?",
+ section_description:"Description",
+ section_time:"Time period",
+ full_day:"Full day",
+
+ /*recurring events*/
+ confirm_recurring:"Do you want to edit the whole set of repeated events?",
+ section_recurring:"Repeat event",
+ button_recurring:"Disabled",
+ button_recurring_open:"Enabled",
+ button_edit_series: "Edit series",
+ button_edit_occurrence: "Edit occurrence",
+
+ /*agenda view extension*/
+ agenda_tab:"Agenda",
+ date:"Date",
+ description:"Description",
+
+ /*year view extension*/
+ year_tab:"Year",
+
+ /* week agenda extension */
+ week_agenda_tab: "Agenda",
+
+ /*grid view extension*/
+ grid_tab: "Grid",
+
+ /* touch tooltip*/
+ drag_to_create:"Drag to create",
+ drag_to_move:"Drag to move",
+
+ /* dhtmlx message default buttons */
+ message_ok:"OK",
+ message_cancel:"Cancel"
+ }
+};
+
+
+/*
+%e Day of the month without leading zeros (01..31)
+%d Day of the month, 2 digits with leading zeros (01..31)
+%j Day of the year, 3 digits with leading zeros (001..366)
+%a A textual representation of a day, two letters
+%W A full textual representation of the day of the week
+
+%c Numeric representation of a month, without leading zeros (0..12)
+%m Numeric representation of a month, with leading zeros (00..12)
+%b A short textual representation of a month, three letters (Jan..Dec)
+%M A full textual representation of a month, such as January or March (January..December)
+
+%y A two digit representation of a year (93..03)
+%Y A full numeric representation of a year, 4 digits (1993..03)
+*/
+
+scheduler.config={
+ default_date: "%j %M %Y",
+ month_date: "%F %Y",
+ load_date: "%Y-%m-%d",
+ week_date: "%l",
+ day_date: "%D, %F %j",
+ hour_date: "%H:%i",
+ month_day: "%d",
+ xml_date: "%m/%d/%Y %H:%i",
+ api_date: "%d-%m-%Y %H:%i",
+ preserve_length:true,
+ time_step: 5,
+
+ start_on_monday: 1,
+ first_hour: 0,
+ last_hour: 24,
+ readonly: false,
+ drag_resize: 1,
+ drag_move: 1,
+ drag_create: 1,
+ dblclick_create: 1,
+ edit_on_create: 1,
+ details_on_create: 0,
+ resize_month_events:false,
+ resize_month_timed:false,
+
+ cascade_event_display: false,
+ cascade_event_count: 4,
+ cascade_event_margin: 30,
+
+ multi_day:true,
+ multi_day_height_limit: 0,
+
+ drag_lightbox: true,
+ preserve_scroll: true,
+ select: true,
+
+ server_utc: false,
+ touch:true,
+ touch_tip:true,
+ touch_drag:500,
+ quick_info_detached:true,
+
+ positive_closing: false,
+
+ drag_highlight: true,
+ limit_drag_out: false,
+ icons_edit: ["icon_save", "icon_cancel"],
+ icons_select: ["icon_details", "icon_edit", "icon_delete"],
+ buttons_left: ["dhx_save_btn", "dhx_cancel_btn"],
+ buttons_right: ["dhx_delete_btn"],
+ lightbox: {
+ sections: [
+ {name: "description", height: 200, map_to: "text", type: "textarea", focus: true},
+ {name: "time", height: 72, type: "time", map_to: "auto"}
+ ]
+ },
+ highlight_displayed_event: true,
+ left_border: false
+};
+scheduler.templates={};
+scheduler.init_templates=function(){
+ var labels = scheduler.locale.labels;
+ labels.dhx_save_btn = labels.icon_save;
+ labels.dhx_cancel_btn = labels.icon_cancel;
+ labels.dhx_delete_btn = labels.icon_delete;
+
+
+ var d=scheduler.date.date_to_str;
+ var c=scheduler.config;
+ var f = function(a,b){
+ for (var c in b)
+ if (!a[c]) a[c]=b[c];
+ };
+ f(scheduler.templates,{
+ day_date:d(c.default_date),
+ month_date:d(c.month_date),
+ week_date:function(d1,d2){
+ return scheduler.templates.day_date(d1)+" &ndash; "+scheduler.templates.day_date(scheduler.date.add(d2,-1,"day"));
+ },
+ day_scale_date:d(c.default_date),
+ month_scale_date:d(c.week_date),
+ week_scale_date:d(c.day_date),
+ hour_scale:d(c.hour_date),
+ time_picker:d(c.hour_date),
+ event_date:d(c.hour_date),
+ month_day:d(c.month_day),
+ xml_date:scheduler.date.str_to_date(c.xml_date,c.server_utc),
+ load_format:d(c.load_date,c.server_utc),
+ xml_format:d(c.xml_date,c.server_utc),
+ api_date:scheduler.date.str_to_date(c.api_date),
+ event_header:function(start,end,ev){
+ return scheduler.templates.event_date(start)+" - "+scheduler.templates.event_date(end);
+ },
+ event_text:function(start,end,ev){
+ return ev.text;
+ },
+ event_class:function(start,end,ev){
+ return "";
+ },
+ month_date_class:function(d){
+ return "";
+ },
+ week_date_class:function(d){
+ return "";
+ },
+ event_bar_date:function(start,end,ev){
+ return scheduler.templates.event_date(start)+" ";
+ },
+ event_bar_text:function(start,end,ev){
+ return ev.text;
+ },
+ month_events_link : function(date, count){
+ return "<a>View more("+count+" events)</a>";
+ },
+ drag_marker_class : function(start, end, event){
+ return "";
+ },
+ drag_marker_content : function(start, end, event){
+ return "";
+ }
+ });
+ this.callEvent("onTemplatesReady",[]);
+};
+
+
+
+scheduler.uid = function() {
+ if (!this._seed) this._seed = (new Date()).valueOf();
+ return this._seed++;
+};
+scheduler._events = {};
+scheduler.clearAll = function() {
+ this._events = {};
+ this._loaded = {};
+ this.clear_view();
+ this.callEvent("onClearAll", []);
+};
+scheduler.addEvent = function(start_date, end_date, text, id, extra_data) {
+ if (!arguments.length)
+ return this.addEventNow();
+ var ev = start_date;
+ if (arguments.length != 1) {
+ ev = extra_data || {};
+ ev.start_date = start_date;
+ ev.end_date = end_date;
+ ev.text = text;
+ ev.id = id;
+ }
+ ev.id = ev.id || scheduler.uid();
+ ev.text = ev.text || "";
+
+ if (typeof ev.start_date == "string") ev.start_date = this.templates.api_date(ev.start_date);
+ if (typeof ev.end_date == "string") ev.end_date = this.templates.api_date(ev.end_date);
+
+ var d = (this.config.event_duration || this.config.time_step) * 60000;
+ if (ev.start_date.valueOf() == ev.end_date.valueOf())
+ ev.end_date.setTime(ev.end_date.valueOf() + d);
+
+ ev._timed = this.isOneDayEvent(ev);
+
+ var is_new = !this._events[ev.id];
+ this._events[ev.id] = ev;
+ this.event_updated(ev);
+ if (!this._loading)
+ this.callEvent(is_new ? "onEventAdded" : "onEventChanged", [ev.id, ev]);
+ return ev.id;
+};
+scheduler.deleteEvent = function(id, silent) {
+ var ev = this._events[id];
+ if (!silent && (!this.callEvent("onBeforeEventDelete", [id, ev]) || !this.callEvent("onConfirmedBeforeEventDelete", [id, ev])))
+ return;
+ if (ev) {
+ this._select_id = null;
+ delete this._events[id];
+ this.event_updated(ev);
+ }
+
+ this.callEvent("onEventDeleted", [id, ev]);
+};
+scheduler.getEvent = function(id) {
+ return this._events[id];
+};
+scheduler.setEvent = function(id, hash) {
+ if(!hash.id)
+ hash.id = id;
+
+ this._events[id] = hash;
+};
+scheduler.for_rendered = function(id, method) {
+ for (var i = this._rendered.length - 1; i >= 0; i--)
+ if (this._rendered[i].getAttribute("event_id") == id)
+ method(this._rendered[i], i);
+};
+scheduler.changeEventId = function(id, new_id) {
+ if (id == new_id) return;
+ var ev = this._events[id];
+ if (ev) {
+ ev.id = new_id;
+ this._events[new_id] = ev;
+ delete this._events[id];
+ }
+ this.for_rendered(id, function(r) {
+ r.setAttribute("event_id", new_id);
+ });
+ if (this._select_id == id) this._select_id = new_id;
+ if (this._edit_id == id) this._edit_id = new_id;
+ //if (this._drag_id==id) this._drag_id=new_id;
+ this.callEvent("onEventIdChange", [id, new_id]);
+};
+
+(function() {
+ var attrs = ["text", "Text", "start_date", "StartDate", "end_date", "EndDate"];
+ var create_getter = function(name) {
+ return function(id) { return (scheduler.getEvent(id))[name]; };
+ };
+ var create_setter = function(name) {
+ return function(id, value) {
+ var ev = scheduler.getEvent(id);
+ ev[name] = value;
+ ev._changed = true;
+ ev._timed = this.isOneDayEvent(ev);
+ scheduler.event_updated(ev, true);
+ };
+ };
+ for (var i = 0; i < attrs.length; i += 2) {
+ scheduler["getEvent" + attrs[i + 1]] = create_getter(attrs[i]);
+ scheduler["setEvent" + attrs[i + 1]] = create_setter(attrs[i]);
+ }
+})();
+
+scheduler.event_updated = function(ev, force) {
+ if (this.is_visible_events(ev))
+ this.render_view_data();
+ else
+ this.clear_event(ev.id);
+};
+scheduler.is_visible_events = function(ev) {
+ //if in displayed dates
+ var in_visible_range = (ev.start_date < this._max_date && this._min_date < ev.end_date);
+
+ if(in_visible_range){
+ //end dates are not between last/first hours
+ var end_dates_visible = (ev.end_date.getHours() >= this.config.first_hour && ev.end_date.getHours() < this.config.last_hour) ||
+ (ev.start_date.getHours() >= this.config.first_hour && ev.start_date.getHours() < this.config.last_hour);
+
+ if(end_dates_visible){
+ return true;
+ }else{
+
+ //event is bigger than area hidden between last/first hours
+ var event_duration = (ev.end_date.valueOf() - ev.start_date.valueOf()) / (1000*60*60),//hours
+ hidden_duration = 24 - (this.config.last_hour - this.config.first_hour);
+
+ return (event_duration > hidden_duration);
+
+ }
+ }else{
+ return false;
+ }
+};
+scheduler.isOneDayEvent = function(ev) {
+ var delta = ev.end_date.getDate() - ev.start_date.getDate();
+
+ if (!delta)
+ return ev.start_date.getMonth() == ev.end_date.getMonth() && ev.start_date.getFullYear() == ev.end_date.getFullYear();
+ else {
+ if (delta < 0) delta = Math.ceil((ev.end_date.valueOf() - ev.start_date.valueOf()) / (24 * 60 * 60 * 1000));
+ return (delta == 1 && !ev.end_date.getHours() && !ev.end_date.getMinutes() && (ev.start_date.getHours() || ev.start_date.getMinutes() ));
+ }
+
+};
+scheduler.get_visible_events = function(only_timed) {
+ //not the best strategy for sure
+ var stack = [];
+
+ for (var id in this._events)
+ if (this.is_visible_events(this._events[id]))
+ if (!only_timed || this._events[id]._timed)
+ if (this.filter_event(id, this._events[id]))
+ stack.push(this._events[id]);
+
+ return stack;
+};
+scheduler.filter_event = function(id, ev) {
+ var filter = this["filter_" + this._mode];
+ return (filter) ? filter(id, ev) : true;
+};
+scheduler._is_main_area_event = function(ev){
+ return !!ev._timed;
+};
+scheduler.render_view_data = function(evs, hold) {
+ if (!evs) {
+ if (this._not_render) {
+ this._render_wait = true;
+ return;
+ }
+ this._render_wait = false;
+
+ this.clear_view();
+ evs = this.get_visible_events(!(this._table_view || this.config.multi_day));
+ }
+ for(var i= 0, len = evs.length; i < len; i++){
+ this._recalculate_timed(evs[i]);
+ }
+
+ if (this.config.multi_day && !this._table_view) {
+
+ var tvs = [];
+ var tvd = [];
+ for (var i = 0; i < evs.length; i++) {
+ if (this._is_main_area_event(evs[i]))
+ tvs.push(evs[i]);
+ else
+ tvd.push(evs[i]);
+ }
+
+ // multiday events
+ this._rendered_location = this._els['dhx_multi_day'][0];
+ this._table_view = true;
+ this.render_data(tvd, hold);
+ this._table_view = false;
+
+ // normal events
+ this._rendered_location = this._els['dhx_cal_data'][0];
+ this._table_view = false;
+ this.render_data(tvs, hold);
+
+ } else {
+ this._rendered_location = this._els['dhx_cal_data'][0];
+ this.render_data(evs, hold);
+ }
+};
+
+
+scheduler._view_month_day = function(e){
+ var date = scheduler.getActionData(e).date;
+ if(!scheduler.callEvent("onViewMoreClick", [date]))
+ return;
+ scheduler.setCurrentView(date, "day");
+};
+
+scheduler._render_month_link = function(ev){
+ var parent = this._rendered_location;
+ var toRender = this._lame_clone(ev);
+
+ //render links in each cell of multiday events
+ for(var d = ev._sday; d < ev._eday; d++){
+
+ toRender._sday = d;
+ toRender._eday = d+1;
+
+ var date = scheduler.date;
+ var curr = scheduler._min_date;
+ curr = date.add(curr, toRender._sweek, "week");
+ curr = date.add(curr, toRender._sday, "day");
+ var count = scheduler.getEvents(curr, date.add(curr, 1, "day")).length;
+
+ var pos = this._get_event_bar_pos(toRender);
+ var widt = (pos.x2 - pos.x);
+
+ var el = document.createElement("div");
+ el.onclick = function(e){scheduler._view_month_day(e||event);};
+ el.className = "dhx_month_link";
+ el.style.top = pos.y + "px";
+ el.style.left = pos.x + "px";
+ el.style.width = widt + "px";
+ el.innerHTML = scheduler.templates.month_events_link(curr, count);
+ this._rendered.push(el);
+
+ parent.appendChild(el);
+ }
+};
+
+scheduler._recalculate_timed = function(id){
+ if(!id) return;
+ var ev;
+ if(typeof(id) != "object")
+ ev = this._events[id];
+ else
+ ev = id;
+ if(!ev) return;
+ ev._timed = scheduler.isOneDayEvent(ev);
+};
+scheduler.attachEvent("onEventChanged", scheduler._recalculate_timed);
+scheduler.attachEvent("onEventAdded", scheduler._recalculate_timed);
+
+scheduler.render_data = function(evs, hold) {
+ evs = this._pre_render_events(evs, hold);
+
+ for (var i = 0; i < evs.length; i++)
+ if (this._table_view){
+ if(scheduler._mode != 'month'){
+ this.render_event_bar(evs[i]);//may be multiday section on other views
+ }else{
+
+ var max_evs = scheduler.config.max_month_events;
+ if(max_evs !== max_evs*1 || evs[i]._sorder < max_evs){
+ //of max number events per month cell is set and event can be rendered
+ this.render_event_bar(evs[i]);
+ }else if(max_evs !== undefined && evs[i]._sorder == max_evs){
+ //render 'view more' links
+ scheduler._render_month_link(evs[i]);
+ }else{
+ //do not render events with ordinal number > maximum events per cell
+ }
+ }
+
+
+
+ }else
+ this.render_event(evs[i]);
+};
+scheduler._pre_render_events = function(evs, hold) {
+ var hb = this.xy.bar_height;
+ var h_old = this._colsS.heights;
+ var h = this._colsS.heights = [0, 0, 0, 0, 0, 0, 0];
+ var data = this._els["dhx_cal_data"][0];
+
+ if (!this._table_view)
+ evs = this._pre_render_events_line(evs, hold); //ignore long events for now
+ else
+ evs = this._pre_render_events_table(evs, hold);
+
+ if (this._table_view) {
+ if (hold)
+ this._colsS.heights = h_old;
+ else {
+ var evl = data.firstChild;
+ if (evl.rows) {
+ for (var i = 0; i < evl.rows.length; i++) {
+ h[i]++;
+ var cellHeight = this._colsS.height - this.xy.month_head_height;
+ if ((h[i]) * hb > cellHeight) { // 22 - height of cell's header
+ //we have overflow, update heights
+ var cells = evl.rows[i].cells;
+ var cHeight = cellHeight;
+ if(this.config.max_month_events*1 !== this.config.max_month_events || h[i] <= this.config.max_month_events){
+ cHeight = h[i] * hb;
+ }else if( (this.config.max_month_events + 1) * hb > cellHeight){
+ cHeight = (this.config.max_month_events + 1) * hb;
+ }
+
+ for (var j = 0; j < cells.length; j++) {
+ cells[j].childNodes[1].style.height = cHeight + "px";
+ }
+ h[i] = (h[i - 1] || 0) + cells[0].offsetHeight;
+ }
+ h[i] = (h[i - 1] || 0) + evl.rows[i].cells[0].offsetHeight;
+ }
+ h.unshift(0);
+ if (evl.parentNode.offsetHeight < evl.parentNode.scrollHeight && !scheduler._colsS.scroll_fix && scheduler.xy.scroll_width) {
+
+ var scale_settings = scheduler._colsS,
+ sum_width = scale_settings[scale_settings.col_length],
+ row_heights = scale_settings.heights.slice();
+
+ sum_width -= (scheduler.xy.scroll_width || 0);
+ this._calc_scale_sizes(sum_width, this._min_date, this._max_date);
+ scheduler._colsS.heights = row_heights;
+
+ this.set_xy(this._els["dhx_cal_header"][0], sum_width, this.xy.scale_height);
+ scheduler._render_scales(this._els["dhx_cal_header"][0]);
+ scheduler._render_month_scale(this._els["dhx_cal_data"][0], this._get_timeunit_start(), this._min_date);
+
+ scale_settings.scroll_fix = true;
+ }
+ } else {
+ if (!evs.length && this._els["dhx_multi_day"][0].style.visibility == "visible")
+ h[0] = -1;
+ if (evs.length || h[0] == -1) {
+ //shift days to have space for multiday events
+ var childs = evl.parentNode.childNodes;
+
+ // +1 so multiday events would have 2px from top and 2px from bottom by default
+ var full_multi_day_height = (h[0] + 1) * hb + 1;
+
+ var used_multi_day_height = full_multi_day_height;
+ var used_multi_day_height_css = full_multi_day_height + "px";
+ if (this.config.multi_day_height_limit) {
+ used_multi_day_height = Math.min(full_multi_day_height, this.config.multi_day_height_limit) ;
+ used_multi_day_height_css = used_multi_day_height + "px";
+ }
+
+ data.style.top = (this._els["dhx_cal_navline"][0].offsetHeight + this._els["dhx_cal_header"][0].offsetHeight + used_multi_day_height ) + 'px';
+ data.style.height = (this._obj.offsetHeight - parseInt(data.style.top, 10) - (this.xy.margin_top || 0)) + 'px';
+
+ var multi_day_section = this._els["dhx_multi_day"][0];
+ multi_day_section.style.height = used_multi_day_height_css;
+ multi_day_section.style.visibility = (h[0] == -1 ? "hidden" : "visible");
+
+ // icon
+ var multi_day_icon = this._els["dhx_multi_day"][1];
+ multi_day_icon.style.height = used_multi_day_height_css;
+ multi_day_icon.style.visibility = (h[0] == -1 ? "hidden" : "visible");
+ multi_day_icon.className = h[0] ? "dhx_multi_day_icon" : "dhx_multi_day_icon_small";
+ this._dy_shift = (h[0] + 1) * hb;
+ h[0] = 0;
+
+ if (used_multi_day_height != full_multi_day_height) {
+ data.style.top = (parseInt(data.style.top) + 2) + "px";
+
+ multi_day_section.style.overflowY = "auto";
+ multi_day_section.style.width = (parseInt(multi_day_section.style.width) - 2) + "px";
+
+ multi_day_icon.style.position = "fixed";
+ multi_day_icon.style.top = "";
+ multi_day_icon.style.left = "";
+ }
+ }
+ }
+ }
+ }
+
+ return evs;
+};
+scheduler._get_event_sday = function(ev) {
+ return Math.floor((ev.start_date.valueOf() - this._min_date.valueOf()) / (24 * 60 * 60 * 1000));
+};
+scheduler._get_event_mapped_end_date = function(ev) {
+ var end_date = ev.end_date;
+ if (this.config.separate_short_events) {
+ var ev_duration = (ev.end_date - ev.start_date) / 60000; // minutes
+ if (ev_duration < this._min_mapped_duration) {
+ end_date = this.date.add(end_date, this._min_mapped_duration - ev_duration, "minute");
+ }
+ }
+ return end_date;
+};
+scheduler._pre_render_events_line = function(evs, hold){
+ evs.sort(function(a, b) {
+ if (a.start_date.valueOf() == b.start_date.valueOf())
+ return a.id > b.id ? 1 : -1;
+ return a.start_date > b.start_date ? 1 : -1;
+ });
+ var days = []; //events by weeks
+ var evs_originals = [];
+
+ this._min_mapped_duration = Math.ceil(this.xy.min_event_height * 60 / this.config.hour_size_px); // values could change along the way
+
+ for (var i = 0; i < evs.length; i++) {
+ var ev = evs[i];
+
+ //check date overflow
+ var sd = ev.start_date;
+ var ed = ev.end_date;
+ //check scale overflow
+ var sh = sd.getHours();
+ var eh = ed.getHours();
+
+ ev._sday = this._get_event_sday(ev); // sday based on event start_date
+ if (this._ignores[ev._sday]){
+ //ignore event
+ evs.splice(i,1);
+ i--;
+ continue;
+ }
+
+ if (!days[ev._sday]) days[ev._sday] = [];
+
+ if (!hold) {
+ ev._inner = false;
+
+ var stack = days[ev._sday];
+
+ while (stack.length) {
+ var t_ev = stack[stack.length - 1];
+ var t_end_date = this._get_event_mapped_end_date(t_ev);
+ if (t_end_date.valueOf() <= ev.start_date.valueOf()) {
+ stack.splice(stack.length - 1, 1);
+ } else {
+ break;
+ }
+ }
+ var slot_index = stack.length;
+ var sorderSet = false;
+ for (var j = 0; j < stack.length; j++) {
+ var t_ev = stack[j];
+ var t_end_date = this._get_event_mapped_end_date(t_ev);
+ if (t_end_date.valueOf() <= ev.start_date.valueOf()) {
+ sorderSet = true;
+ ev._sorder = t_ev._sorder;
+ slot_index = j;
+ ev._inner = true;
+ break;
+ }
+ }
+
+ if (stack.length)
+ stack[stack.length - 1]._inner = true;
+
+ if (!sorderSet) {
+ if (stack.length) {
+ if (stack.length <= stack[stack.length - 1]._sorder) {
+ if (!stack[stack.length - 1]._sorder)
+ ev._sorder = 0;
+ else
+ for (j = 0; j < stack.length; j++) {
+ var _is_sorder = false;
+ for (var k = 0; k < stack.length; k++) {
+ if (stack[k]._sorder == j) {
+ _is_sorder = true;
+ break;
+ }
+ }
+ if (!_is_sorder) {
+ ev._sorder = j;
+ break;
+ }
+ }
+ ev._inner = true;
+ } else {
+ var _max_sorder = stack[0]._sorder;
+ for (j = 1; j < stack.length; j++) {
+ if (stack[j]._sorder > _max_sorder)
+ _max_sorder = stack[j]._sorder;
+ }
+ ev._sorder = _max_sorder + 1;
+ ev._inner = false;
+ }
+
+ } else
+ ev._sorder = 0;
+ }
+
+ stack.splice(slot_index, slot_index == stack.length ? 0 : 1, ev);
+
+ if (stack.length > (stack.max_count || 0)) {
+ stack.max_count = stack.length;
+ ev._count = stack.length;
+ } else {
+ ev._count = (ev._count) ? ev._count : 1;
+ }
+ }
+
+ if (sh < this.config.first_hour || eh >= this.config.last_hour) {
+ // Need to create copy of event as we will be changing it's start/end date
+ // e.g. first_hour = 11 and event.start_date hours = 9. Need to preserve that info
+ evs_originals.push(ev);
+ evs[i] = ev = this._copy_event(ev);
+
+ if (sh < this.config.first_hour) {
+ ev.start_date.setHours(this.config.first_hour);
+ ev.start_date.setMinutes(0);
+ }
+ if (eh >= this.config.last_hour) {
+ ev.end_date.setMinutes(0);
+ ev.end_date.setHours(this.config.last_hour);
+ }
+
+ if (ev.start_date > ev.end_date || sh == this.config.last_hour) {
+ evs.splice(i, 1);
+ i--;
+ continue;
+ }
+ }
+ }
+ if (!hold) {
+ for (var i = 0; i < evs.length; i++) {
+ evs[i]._count = days[evs[i]._sday].max_count;
+ }
+ for (var i = 0; i < evs_originals.length; i++)
+ evs_originals[i]._count = days[evs_originals[i]._sday].max_count;
+ }
+
+ return evs;
+};
+scheduler._time_order = function(evs) {
+ evs.sort(function(a, b) {
+ if (a.start_date.valueOf() == b.start_date.valueOf()) {
+ if (a._timed && !b._timed) return 1;
+ if (!a._timed && b._timed) return -1;
+ return a.id > b.id ? 1 : -1;
+ }
+ return a.start_date > b.start_date ? 1 : -1;
+ });
+};
+scheduler._pre_render_events_table = function(evs, hold) { // max - max height of week slot
+ this._time_order(evs);
+ var out = [];
+ var weeks = [
+ [],
+ [],
+ [],
+ [],
+ [],
+ [],
+ []
+ ]; //events by weeks
+ var max = this._colsS.heights;
+ var start_date;
+ var cols = this._cols.length;
+ var chunks_info = {};
+
+ for (var i = 0; i < evs.length; i++) {
+ var ev = evs[i];
+ var id = ev.id;
+ if (!chunks_info[id]) {
+ chunks_info[id] = {
+ first_chunk: true,
+ last_chunk: true
+ };
+ }
+ var chunk_info = chunks_info[id];
+ var sd = (start_date || ev.start_date);
+ var ed = ev.end_date;
+ //trim events which are crossing through current view
+ if (sd < this._min_date) {
+ chunk_info.first_chunk = false;
+ sd = this._min_date;
+ }
+ if (ed > this._max_date) {
+ chunk_info.last_chunk = false;
+ ed = this._max_date;
+ }
+
+ var locate_s = this.locate_holder_day(sd, false, ev);
+ ev._sday = locate_s % cols;
+
+ //skip single day events for ignored dates
+ if (this._ignores[ev._sday] && ev._timed) continue;
+
+ var locate_e = this.locate_holder_day(ed, true, ev) || cols;
+ ev._eday = (locate_e % cols) || cols; //cols used to fill full week, when event end on monday
+ ev._length = locate_e - locate_s;
+
+ //3600000 - compensate 1 hour during winter|summer time shift
+ ev._sweek = Math.floor((this._correct_shift(sd.valueOf(), 1) - this._min_date.valueOf()) / (60 * 60 * 1000 * 24 * cols));
+
+ //current slot
+ var stack = weeks[ev._sweek];
+ //check order position
+ var stack_line;
+
+ for (stack_line = 0; stack_line < stack.length; stack_line++)
+ if (stack[stack_line]._eday <= ev._sday)
+ break;
+
+ if (!ev._sorder || !hold) {
+ ev._sorder = stack_line;
+ }
+
+ if (ev._sday + ev._length <= cols) {
+ start_date = null;
+ out.push(ev);
+ stack[stack_line] = ev;
+ //get max height of slot
+ max[ev._sweek] = stack.length - 1;
+ ev._first_chunk = chunk_info.first_chunk;
+ ev._last_chunk = chunk_info.last_chunk;
+ } else { // split long event in chunks
+ var copy = this._copy_event(ev);
+ copy.id = ev.id;
+ copy._length = cols - ev._sday;
+ copy._eday = cols;
+ copy._sday = ev._sday;
+ copy._sweek = ev._sweek;
+ copy._sorder = ev._sorder;
+ copy.end_date = this.date.add(sd, copy._length, "day");
+ copy._first_chunk = chunk_info.first_chunk;
+ if (chunk_info.first_chunk) {
+ chunk_info.first_chunk = false;
+ }
+
+ out.push(copy);
+ stack[stack_line] = copy;
+ start_date = copy.end_date;
+ //get max height of slot
+ max[ev._sweek] = stack.length - 1;
+ i--;
+ continue; //repeat same step
+ }
+ }
+ return out;
+};
+scheduler._copy_dummy = function() {
+ var a = new Date(this.start_date);
+ var b = new Date(this.end_date);
+ this.start_date = a;
+ this.end_date = b;
+};
+scheduler._copy_event = function(ev) {
+ this._copy_dummy.prototype = ev;
+ return new this._copy_dummy();
+ //return {start_date:ev.start_date, end_date:ev.end_date, text:ev.text, id:ev.id}
+};
+scheduler._rendered = [];
+scheduler.clear_view = function() {
+ for (var i = 0; i < this._rendered.length; i++) {
+ var obj = this._rendered[i];
+ if (obj.parentNode) obj.parentNode.removeChild(obj);
+ }
+ this._rendered = [];
+};
+scheduler.updateEvent = function(id) {
+ var ev = this.getEvent(id);
+ this.clear_event(id);
+
+ if (ev && this.is_visible_events(ev) && this.filter_event(id, ev) && (this._table_view || this.config.multi_day || ev._timed)) {
+ if (this.config.update_render)
+ this.render_view_data();
+ else
+ this.render_view_data([ev], true);
+ }
+};
+scheduler.clear_event = function(id) {
+ this.for_rendered(id, function(node, i) {
+ if (node.parentNode)
+ node.parentNode.removeChild(node);
+ scheduler._rendered.splice(i, 1);
+ });
+};
+scheduler._y_from_date = function(date){
+ var sm = date.getHours() * 60 + date.getMinutes();
+ return ((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
+};
+scheduler._calc_event_y = function(ev, min_height){
+ min_height = min_height || 0;
+ var sm = ev.start_date.getHours() * 60 + ev.start_date.getMinutes();
+ var em = (ev.end_date.getHours() * 60 + ev.end_date.getMinutes()) || (scheduler.config.last_hour * 60);
+ var top = this._y_from_date(ev.start_date);
+
+ var height = Math.max(min_height, (em - sm) * this.config.hour_size_px / 60); //42px/hour
+ return {
+ top: top,
+ height: height
+ };
+};
+scheduler.render_event = function(ev) {
+ var menu = scheduler.xy.menu_width;
+ var menu_offset = (this.config.use_select_menu_space) ? 0 : menu;
+ if (ev._sday < 0) return; //can occur in case of recurring event during time shift
+
+ var parent = scheduler.locate_holder(ev._sday);
+ if (!parent) return; //attempt to render non-visible event
+
+ var pos_y = this._calc_event_y(ev, scheduler.xy.min_event_height);
+ var top = pos_y.top,
+ height = pos_y.height;
+
+ var ev_count = ev._count || 1;
+ var ev_sorder = ev._sorder || 0;
+
+ var width = Math.floor((parent.clientWidth - menu_offset) / ev_count);
+ var left = ev_sorder * width + 1;
+ if (!ev._inner) width = width * (ev_count - ev_sorder);
+ if (this.config.cascade_event_display) {
+ var limit = this.config.cascade_event_count;
+ var margin = this.config.cascade_event_margin;
+ left = ev_sorder % limit * margin;
+ var right = (ev._inner) ? (ev_count - ev_sorder - 1) % limit * margin / 2 : 0;
+ width = Math.floor(parent.clientWidth - menu_offset - left - right);
+ }
+
+ var 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));
+
+ this._rendered.push(d);
+ parent.appendChild(d);
+
+ left = left + parseInt(parent.style.left, 10) + menu_offset;
+
+ if (this._edit_id == ev.id) {
+
+ d.style.zIndex = 1; //fix overlapping issue
+ width = Math.max(width - 4, scheduler.xy.editor_width);
+ d = document.createElement("DIV");
+ d.setAttribute("event_id", ev.id);
+ this.set_xy(d, width, height - 20, left, top + 14);
+ d.className = "dhx_cal_event dhx_cal_editor";
+
+ var tplClass = scheduler.templates.event_class(ev.start_date, ev.end_date, ev);
+
+ if(tplClass){
+ d.className += " " + tplClass;
+ }
+ var d2 = document.createElement("DIV");
+ this.set_xy(d2, width - 6, height - 26);
+ d2.style.cssText += ";margin:2px 2px 2px 2px;overflow:hidden;";
+
+ d.appendChild(d2);
+ this._els["dhx_cal_data"][0].appendChild(d);
+ this._rendered.push(d);
+
+ d2.innerHTML = "<textarea class='dhx_cal_editor'>" + ev.text + "</textarea>";
+ if (this._quirks7) d2.firstChild.style.height = height - 12 + "px"; //IEFIX
+ this._editor = d2.firstChild;
+ this._editor.onkeydown = function(e) {
+ if ((e || event).shiftKey) return true;
+ var code = (e || event).keyCode;
+ if (code == scheduler.keys.edit_save) scheduler.editStop(true);
+ if (code == scheduler.keys.edit_cancel) scheduler.editStop(false);
+ };
+ this._editor.onselectstart = function (e) {
+ (e || event).cancelBubble = true;
+ return true;
+ };
+ scheduler._focus(d2.firstChild, true);
+ //IE and opera can add x-scroll during focusing
+ this._els["dhx_cal_data"][0].scrollLeft = 0;
+ }
+ if (this.xy.menu_width !== 0 && this._select_id == ev.id) {
+ if (this.config.cascade_event_display && this._drag_mode)
+ d.style.zIndex = 1; //fix overlapping issue for cascade view in case of dnd of selected event
+ var icons = this.config["icons_" + ((this._edit_id == ev.id) ? "edit" : "select")];
+ var icons_str = "";
+ var bg_color = (ev.color ? ("background-color: " + ev.color + ";") : "");
+ var color = (ev.textColor ? ("color: " + ev.textColor + ";") : "");
+ for (var i = 0; i < icons.length; i++)
+ icons_str += "<div class='dhx_menu_icon " + icons[i] + "' style='" + bg_color + "" + color + "' title='" + this.locale.labels[icons[i]] + "'></div>";
+ var obj = this._render_v_bar(ev, left - menu + 1, top, menu, icons.length * 20 + 26 - 2, "", "<div style='" + bg_color + "" + color + "' class='dhx_menu_head'></div>", icons_str, true);
+ obj.style.left = left - menu + 1;
+ this._els["dhx_cal_data"][0].appendChild(obj);
+ this._rendered.push(obj);
+ }
+ if(this.config.drag_highlight && this._drag_id == ev.id){
+ this.highlightEventPosition(ev);
+ }
+};
+scheduler._render_v_bar = function (ev, x, y, w, h, style, contentA, contentB, bottom) {
+ var d = document.createElement("DIV");
+ var id = ev.id;
+ var cs = (bottom) ? "dhx_cal_event dhx_cal_select_menu" : "dhx_cal_event";
+
+ var cse = scheduler.templates.event_class(ev.start_date, ev.end_date, ev);
+ if (cse) cs = cs + " " + cse;
+
+ var bg_color = (ev.color ? ("background:" + ev.color + ";") : "");
+ var color = (ev.textColor ? ("color:" + ev.textColor + ";") : "");
+
+ var html = '<div event_id="' + id + '" class="' + cs + '" style="position:absolute; top:' + y + 'px; left:' + x + 'px; width:' + (w - 4) + 'px; height:' + h + 'px;' + (style || "") + '"></div>';
+ d.innerHTML = html;
+
+ var container = d.cloneNode(true).firstChild;
+
+ if (!bottom && scheduler.renderEvent(container, ev, w, h, contentA, contentB)) {
+ return container;
+ } else {
+ container = d.firstChild;
+
+ var inner_html = '<div class="dhx_event_move dhx_header" style=" width:' + (w - 6) + 'px;' + bg_color + '" >&nbsp;</div>';
+ inner_html += '<div class="dhx_event_move dhx_title" style="' + bg_color + '' + color + '">' + contentA + '</div>';
+ inner_html += '<div class="dhx_body" style=" width:' + (w - (this._quirks ? 4 : 14)) + 'px; height:' + (h - (this._quirks ? 20 : 30) + 1) + 'px;' + bg_color + '' + color + '">' + contentB + '</div>'; // +2 css specific, moved from render_event
+
+ var footer_class = "dhx_event_resize dhx_footer";
+ if (bottom)
+ footer_class = "dhx_resize_denied " + footer_class;
+
+ inner_html += '<div class="' + footer_class + '" style=" width:' + (w - 8) + 'px;' + (bottom ? ' margin-top:-1px;' : '') + '' + bg_color + '' + color + '" ></div>';
+
+ container.innerHTML = inner_html;
+ }
+
+ return container;
+};
+scheduler.renderEvent = function(){
+ return false;
+};
+scheduler.locate_holder = function(day) {
+ if (this._mode == "day") return this._els["dhx_cal_data"][0].firstChild; //dirty
+ return this._els["dhx_cal_data"][0].childNodes[day];
+};
+scheduler.locate_holder_day = function(date, past) {
+ var day = Math.floor((this._correct_shift(date, 1) - this._min_date) / (60 * 60 * 24 * 1000));
+ //when locating end data of event , we need to use next day if time part was defined
+ if (past && this.date.time_part(date)) day++;
+ return day;
+};
+
+
+
+scheduler._get_dnd_order = function(order, ev_height, max_height){
+ if(!this._drag_event)
+ return order;
+ if(!this._drag_event._orig_sorder)
+ this._drag_event._orig_sorder = order;
+ else
+ order = this._drag_event._orig_sorder;
+
+ var evTop = ev_height * order;
+ while((evTop + ev_height) > max_height){
+ order--;
+ evTop -= ev_height;
+ }
+ order = Math.max(order, 0);
+ return order;
+};
+//scheduler._get_event_bar_pos = function(sday, eday, week, drag){
+scheduler._get_event_bar_pos = function(ev){
+ var x = this._colsS[ev._sday];
+ var x2 = this._colsS[ev._eday];
+ if (x2 == x) x2 = this._colsS[ev._eday + 1];
+ var hb = this.xy.bar_height;
+
+ var order = ev._sorder;
+ if(ev.id == this._drag_id){
+ var cellHeight = this._colsS.heights[ev._sweek + 1] - this._colsS.heights[ev._sweek]- this.xy.month_head_height;//22 for month head height
+ order = scheduler._get_dnd_order(order, hb, cellHeight);
+ }
+ var y_event_offset = order * hb;
+ var y = this._colsS.heights[ev._sweek] + (this._colsS.height ? (this.xy.month_scale_height + 2) : 2 ) + y_event_offset;
+ return {x:x, x2:x2, y:y};
+};
+
+scheduler.render_event_bar = function (ev) {
+ var parent = this._rendered_location;
+ var pos = this._get_event_bar_pos(ev);
+
+ var y = pos.y;
+ var x = pos.x;
+ var x2 = pos.x2;
+
+ // resize for month mutliday events
+ var resize_handle = "";
+
+ //events in ignored dates
+
+ if (!x2) return;
+
+ var resizable = scheduler.config.resize_month_events && this._mode == "month" &&
+ (!ev._timed || scheduler.config.resize_month_timed);
+
+ var d = document.createElement("DIV");
+ var left_chunk = (ev.hasOwnProperty("_first_chunk") && ev._first_chunk),
+ right_chunk = (ev.hasOwnProperty("_last_chunk") && ev._last_chunk);
+
+ var resize_left = resizable && (ev._timed || left_chunk);
+ var resize_right = resizable && (ev._timed || right_chunk);
+
+ var cs = "dhx_cal_event_clear";
+ if (!ev._timed || resizable) {
+ cs = "dhx_cal_event_line";
+ }
+ if(left_chunk){
+ cs += " dhx_cal_event_line_start";
+ }
+ if(right_chunk){
+ cs += " dhx_cal_event_line_end";
+ }
+ if(resize_left){
+ resize_handle += "<div class='dhx_event_resize dhx_event_resize_start'></div>";
+ }
+ if(resize_right){
+ resize_handle += "<div class='dhx_event_resize dhx_event_resize_end'></div>";
+ }
+
+ var cse = scheduler.templates.event_class(ev.start_date, ev.end_date, ev);
+ if (cse){
+ cs += " " + cse;
+ }
+
+ var bg_color = (ev.color ? ("background:" + ev.color + ";") : "");
+ var color = (ev.textColor ? ("color:" + ev.textColor + ";") : "");
+
+ var style_text = [
+ "position:absolute",
+ "top:" + y + "px",
+ "left:" + x + "px",
+ "width:" + (x2 - x - 15) + "px",
+ color,
+ bg_color,
+ (ev._text_style || "")
+ ].join(";");
+
+ var html = '<div event_id="' + ev.id + '" class="' + cs + '" style="'+style_text+'">';
+ if (resizable) {
+ html += resize_handle;
+ }
+ if(scheduler.getState().mode == "month"){
+ ev = scheduler.getEvent(ev.id); // ev at this point could be a part (row in a month view) of a larger event
+ }
+
+ if (ev._timed)
+ html += scheduler.templates.event_bar_date(ev.start_date, ev.end_date, ev);
+ html += scheduler.templates.event_bar_text(ev.start_date, ev.end_date, ev) + '</div>';
+ html += '</div>';
+
+ d.innerHTML = html;
+
+ this._rendered.push(d.firstChild);
+ parent.appendChild(d.firstChild);
+};
+
+scheduler._locate_event = function(node) {
+ var id = null;
+ while (node && !id && node.getAttribute) {
+ id = node.getAttribute("event_id");
+ node = node.parentNode;
+ }
+ return id;
+};
+
+scheduler.edit = function(id) {
+ if (this._edit_id == id) return;
+ this.editStop(false, id);
+ this._edit_id = id;
+ this.updateEvent(id);
+};
+scheduler.editStop = function(mode, id) {
+ if (id && this._edit_id == id) return;
+ var ev = this.getEvent(this._edit_id);
+ if (ev) {
+ if (mode) ev.text = this._editor.value;
+ this._edit_id = null;
+ this._editor = null;
+ this.updateEvent(ev.id);
+ this._edit_stop_event(ev, mode);
+ }
+};
+scheduler._edit_stop_event = function(ev, mode) {
+ if (this._new_event) {
+ if (!mode) {
+ if (ev) // in case of custom lightbox user can already delete event
+ this.deleteEvent(ev.id, true);
+ } else {
+ this.callEvent("onEventAdded", [ev.id, ev]);
+ }
+ this._new_event = null;
+ } else {
+ if (mode){
+ this.callEvent("onEventChanged", [ev.id, ev]);
+ }
+ }
+};
+
+scheduler.getEvents = function(from, to) {
+ var result = [];
+ for (var a in this._events) {
+ var ev = this._events[a];
+ if (ev && ( (!from && !to) || (ev.start_date < to && ev.end_date > from) ))
+ result.push(ev);
+ }
+ return result;
+};
+scheduler.getRenderedEvent = function(id) {
+ if (!id)
+ return;
+ var rendered_events = scheduler._rendered;
+ for (var i=0; i<rendered_events.length; i++) {
+ var rendered_event = rendered_events[i];
+ if (rendered_event.getAttribute("event_id") == id) {
+ return rendered_event;
+ }
+ }
+ return null;
+};
+scheduler.showEvent = function(id, mode) {
+ var ev = (typeof id == "number" || typeof id == "string") ? scheduler.getEvent(id) : id;
+ mode = mode||scheduler._mode;
+
+ if (!ev || (this.checkEvent("onBeforeEventDisplay") && !this.callEvent("onBeforeEventDisplay", [ev, mode])))
+ return;
+
+ var scroll_hour = scheduler.config.scroll_hour;
+ scheduler.config.scroll_hour = ev.start_date.getHours();
+ var preserve_scroll = scheduler.config.preserve_scroll;
+ scheduler.config.preserve_scroll = false;
+
+ var original_color = ev.color;
+ var original_text_color = ev.textColor;
+ if (scheduler.config.highlight_displayed_event) {
+ ev.color = scheduler.config.displayed_event_color;
+ ev.textColor = scheduler.config.displayed_event_text_color;
+ }
+
+ scheduler.setCurrentView(new Date(ev.start_date), mode);
+
+ ev.color = original_color;
+ ev.textColor = original_text_color;
+ scheduler.config.scroll_hour = scroll_hour;
+ scheduler.config.preserve_scroll = preserve_scroll;
+
+ if (scheduler.matrix && scheduler.matrix[mode]) {
+ scheduler._els.dhx_cal_data[0].scrollTop = getAbsoluteTop(scheduler.getRenderedEvent(ev.id)) - getAbsoluteTop(scheduler._els.dhx_cal_data[0]) - 20;
+ }
+
+ scheduler.callEvent("onAfterEventDisplay", [ev, mode]);
+};
+
+scheduler._append_drag_marker = function(m){
+ if(m.parentNode) return;
+ var zone = scheduler._els["dhx_cal_data"][0];
+
+ var scale = zone.lastChild;
+ if(scale.className && scale.className.indexOf("dhx_scale_holder") < 0 && scale.previousSibling){
+ scale = scale.previousSibling;
+ }
+ if (scale && scale.className.indexOf("dhx_scale_holder") === 0) {
+ scale.appendChild(m);
+ }
+};
+
+scheduler._update_marker_position = function(m, event){
+ var size = scheduler._calc_event_y(event, 0);
+ m.style.top = size.top + "px";
+ m.style.height = size.height + "px";
+};
+
+scheduler.highlightEventPosition = function(event){
+ var m = document.createElement("div");
+
+ m.setAttribute("event_id", event.id);
+ this._rendered.push(m);
+ this._update_marker_position(m, event);
+
+ var css = this.templates.drag_marker_class(event.start_date, event.end_date, event);
+ var html = this.templates.drag_marker_content(event.start_date, event.end_date, event);
+ m.className = "dhx_drag_marker";
+ if(css)
+ m.className += " " + css;
+ if(html)
+ m.innerHTML = html;
+ this._append_drag_marker(m);
+};
+scheduler._loaded = {};
+scheduler._load = function(url, from) {
+ url = url || this._load_url;
+
+ if(!url){
+ //if scheduler.setLoadMode is called before scheduler.init, initial rendering will invoke data loading while url is undefined
+ return;
+ }
+
+ url += (url.indexOf("?") == -1 ? "?" : "&") + "timeshift=" + (new Date()).getTimezoneOffset();
+ if (this.config.prevent_cache) url += "&uid=" + this.uid();
+ var to;
+ from = from || this._date;
+
+ if (this._load_mode) {
+ var lf = this.templates.load_format;
+
+ from = this.date[this._load_mode + "_start"](new Date(from.valueOf()));
+ while (from > this._min_date) from = this.date.add(from, -1, this._load_mode);
+ to = from;
+
+ var cache_line = true;
+ while (to < this._max_date) {
+ to = this.date.add(to, 1, this._load_mode);
+ if (this._loaded[lf(from)] && cache_line)
+ from = this.date.add(from, 1, this._load_mode); else cache_line = false;
+ }
+
+ var temp_to = to;
+ do {
+ to = temp_to;
+ temp_to = this.date.add(to, -1, this._load_mode);
+ } while (temp_to > from && this._loaded[lf(temp_to)]);
+
+ if (to <= from)
+ return false; //already loaded
+ dhtmlxAjax.get(url + "&from=" + lf(from) + "&to=" + lf(to), function(l) {scheduler.on_load(l);});
+ while (from < to) {
+ this._loaded[lf(from)] = true;
+ from = this.date.add(from, 1, this._load_mode);
+ }
+ } else
+ dhtmlxAjax.get(url, function(l) {scheduler.on_load(l);});
+ this.callEvent("onXLS", []);
+ return true;
+};
+scheduler.on_load = function(loader) {
+ var evs;
+ if (this._process && this._process != "xml") {
+ evs = this[this._process].parse(loader.xmlDoc.responseText);
+ } else {
+ evs = this._magic_parser(loader);
+ }
+
+ scheduler._process_loading(evs);
+
+ this.callEvent("onXLE", []);
+};
+scheduler._process_loading = function(evs) {
+ this._loading = true;
+ this._not_render = true;
+ for (var i = 0; i < evs.length; i++) {
+ if (!this.callEvent("onEventLoading", [evs[i]])) continue;
+ this.addEvent(evs[i]);
+ }
+ this._not_render = false;
+ if (this._render_wait) this.render_view_data();
+
+ this._loading = false;
+ if (this._after_call) this._after_call();
+ this._after_call = null;
+};
+scheduler._init_event = function(event) {
+ event.text = (event.text || event._tagvalue) || "";
+ event.start_date = scheduler._init_date(event.start_date);
+ event.end_date = scheduler._init_date(event.end_date);
+};
+
+scheduler._init_date = function(date){
+ if(!date)
+ return null;
+ if(typeof date == "string")
+ return scheduler.templates.xml_date(date);
+ else return new Date(date);
+};
+
+scheduler.json = {};
+scheduler.json.parse = function(data) {
+ if (typeof data == "string") {
+ scheduler._temp = eval("(" + data + ")");
+ data = (scheduler._temp) ? scheduler._temp.data || scheduler._temp.d || scheduler._temp : [];
+ }
+
+ if (data.dhx_security)
+ dhtmlx.security_key = data.dhx_security;
+
+ var collections = (scheduler._temp && scheduler._temp.collections) ? scheduler._temp.collections : {};
+ var collections_loaded = false;
+ for (var key in collections) {
+ if (collections.hasOwnProperty(key)) {
+ collections_loaded = true;
+ var collection = collections[key];
+ var arr = scheduler.serverList[key];
+ if (!arr) continue;
+ arr.splice(0, arr.length); //clear old options
+ for (var j = 0; j < collection.length; j++) {
+ var option = collection[j];
+ var obj = { key: option.value, label: option.label }; // resulting option object
+ for (var option_key in option) {
+ if (option.hasOwnProperty(option_key)) {
+ if (option_key == "value" || option_key == "label")
+ continue;
+ obj[option_key] = option[option_key]; // obj['value'] = option['value']
+ }
+ }
+ arr.push(obj);
+ }
+ }
+ }
+ if (collections_loaded)
+ scheduler.callEvent("onOptionsLoad", []);
+
+ var evs = [];
+ for (var i = 0; i < data.length; i++) {
+ var event = data[i];
+ scheduler._init_event(event);
+ evs.push(event);
+ }
+ return evs;
+};
+scheduler.parse = function(data, type) {
+ this._process = type;
+ this.on_load({xmlDoc: {responseText: data}});
+};
+scheduler.load = function(url, call) {
+ if (typeof call == "string") {
+ this._process = call;
+ call = arguments[2];
+ }
+
+ this._load_url = url;
+ this._after_call = call;
+ this._load(url, this._date);
+};
+//possible values - day,week,month,year,all
+scheduler.setLoadMode = function(mode) {
+ if (mode == "all") mode = "";
+ this._load_mode = mode;
+};
+
+scheduler.serverList = function(name, array) {
+ if (array) {
+ this.serverList[name] = array.slice(0);
+ return this.serverList[name];
+ }
+ this.serverList[name] = (this.serverList[name] || []);
+ return this.serverList[name];
+};
+scheduler._userdata = {};
+scheduler._magic_parser = function(loader) {
+ var xml;
+ if (!loader.getXMLTopNode) { //from a string
+ var xml_string = loader.xmlDoc.responseText;
+ loader = new dtmlXMLLoaderObject(function() {});
+ loader.loadXMLString(xml_string);
+ }
+
+ xml = loader.getXMLTopNode("data");
+ if (xml.tagName != "data") return [];//not an xml
+ var skey = xml.getAttribute("dhx_security");
+ if (skey)
+ dhtmlx.security_key = skey;
+
+ var opts = loader.doXPath("//coll_options");
+ for (var i = 0; i < opts.length; i++) {
+ var bind = opts[i].getAttribute("for");
+ var arr = this.serverList[bind];
+ if (!arr) continue;
+ arr.splice(0, arr.length); //clear old options
+ var itms = loader.doXPath(".//item", opts[i]);
+ for (var j = 0; j < itms.length; j++) {
+ var itm = itms[j];
+ var attrs = itm.attributes;
+ var obj = { key: itms[j].getAttribute("value"), label: itms[j].getAttribute("label")};
+ for (var k = 0; k < attrs.length; k++) {
+ var attr = attrs[k];
+ if (attr.nodeName == "value" || attr.nodeName == "label")
+ continue;
+ obj[attr.nodeName] = attr.nodeValue;
+ }
+ arr.push(obj);
+ }
+ }
+ if (opts.length)
+ scheduler.callEvent("onOptionsLoad", []);
+
+ var ud = loader.doXPath("//userdata");
+ for (var i = 0; i < ud.length; i++) {
+ var udx = this._xmlNodeToJSON(ud[i]);
+ this._userdata[udx.name] = udx.text;
+ }
+
+ var evs = [];
+ xml = loader.doXPath("//event");
+
+ for (var i = 0; i < xml.length; i++) {
+ var ev = evs[i] = this._xmlNodeToJSON(xml[i]);
+ scheduler._init_event(ev);
+ }
+ return evs;
+};
+scheduler._xmlNodeToJSON = function(node) {
+ var t = {};
+ for (var i = 0; i < node.attributes.length; i++)
+ t[node.attributes[i].name] = node.attributes[i].value;
+
+ for (var i = 0; i < node.childNodes.length; i++) {
+ var child = node.childNodes[i];
+ if (child.nodeType == 1)
+ t[child.tagName] = child.firstChild ? child.firstChild.nodeValue : "";
+ }
+
+ if (!t.text) t.text = node.firstChild ? node.firstChild.nodeValue : "";
+
+ return t;
+};
+scheduler.attachEvent("onXLS", function() {
+ if (this.config.show_loading === true) {
+ var t;
+ t = this.config.show_loading = document.createElement("DIV");
+ t.className = 'dhx_loading';
+ t.style.left = Math.round((this._x - 128) / 2) + "px";
+ t.style.top = Math.round((this._y - 15) / 2) + "px";
+ this._obj.appendChild(t);
+ }
+});
+scheduler.attachEvent("onXLE", function() {
+ var t = this.config.show_loading;
+ if (t && typeof t == "object") {
+ this._obj.removeChild(t);
+ this.config.show_loading = true;
+ }
+});
+
+/*
+This software is allowed to use under GPL or you need to obtain Commercial or Enterise License
+to use it in not GPL project. Please contact sales@dhtmlx.com for details
+*/
+scheduler.ical={
+ parse:function(str){
+ var data = str.match(RegExp(this.c_start+"[^\f]*"+this.c_end,""));
+ if (!data.length) return;
+
+ //unfolding
+ data[0]=data[0].replace(/[\r\n]+(?=[a-z \t])/g," ");
+ //drop property
+ data[0]=data[0].replace(/\;[^:\r\n]*:/g,":");
+
+
+ var incoming=[];
+ var match;
+ var event_r = RegExp("(?:"+this.e_start+")([^\f]*?)(?:"+this.e_end+")","g");
+ while ((match=event_r.exec(data)) !== null){
+ var e={};
+ var param;
+ var param_r = /[^\r\n]+[\r\n]+/g;
+ while ((param=param_r.exec(match[1])) !== null)
+ this.parse_param(param.toString(),e);
+ if (e.uid && !e.id) e.id = e.uid; //fallback to UID, when ID is not defined
+ incoming.push(e);
+ }
+ return incoming;
+ },
+ parse_param:function(str,obj){
+ var d = str.indexOf(":");
+ if (d==-1) return;
+
+ var name = str.substr(0,d).toLowerCase();
+ var value = str.substr(d+1).replace(/\\\,/g,",").replace(/[\r\n]+$/,"");
+ if (name=="summary")
+ name="text";
+ else if (name=="dtstart"){
+ name = "start_date";
+ value = this.parse_date(value,0,0);
+ }
+ else if (name=="dtend"){
+ name = "end_date";
+ value = this.parse_date(value,0,0);
+ }
+ obj[name]=value;
+ },
+ parse_date:function(value,dh,dm){
+ var t = value.split("T");
+ if (t[1]){
+ dh=t[1].substr(0,2);
+ dm=t[1].substr(2,2);
+ }
+ var dy = t[0].substr(0,4);
+ var dn = parseInt(t[0].substr(4,2),10)-1;
+ var dd = t[0].substr(6,2);
+ if (scheduler.config.server_utc && !t[1]) { // if no hours/minutes were specified == full day event
+ return new Date(Date.UTC(dy,dn,dd,dh,dm)) ;
+ }
+ return new Date(dy,dn,dd,dh,dm);
+ },
+ c_start:"BEGIN:VCALENDAR",
+ e_start:"BEGIN:VEVENT",
+ e_end:"END:VEVENT",
+ c_end:"END:VCALENDAR"
+};
+scheduler._lightbox_controls = {};
+scheduler.formSection = function(name){
+ var config = this.config.lightbox.sections;
+ var i =0;
+ for (i; i < config.length; i++)
+ if (config[i].name == name)
+ break;
+ var section = config[i];
+ if (!scheduler._lightbox)
+ scheduler.getLightbox();
+ var header = document.getElementById(section.id);
+ var node = header.nextSibling;
+
+ var result = {
+ section: section,
+ header: header,
+ node: node,
+ getValue:function(ev){
+ return scheduler.form_blocks[section.type].get_value(node, (ev||{}), section);
+ },
+ setValue:function(value, ev){
+ return scheduler.form_blocks[section.type].set_value(node, value, (ev||{}), section);
+ }
+ };
+
+ var handler = scheduler._lightbox_controls["get_"+section.type+"_control"];
+ return handler?handler(result):result;
+};
+scheduler._lightbox_controls.get_template_control = function(result) {
+ result.control = result.node;
+ return result;
+};
+scheduler._lightbox_controls.get_select_control = function(result) {
+ result.control = result.node.getElementsByTagName('select')[0];
+ return result;
+};
+scheduler._lightbox_controls.get_textarea_control = function(result) {
+ result.control = result.node.getElementsByTagName('textarea')[0];
+ return result;
+};
+scheduler._lightbox_controls.get_time_control = function(result) {
+ result.control = result.node.getElementsByTagName('select'); // array
+ return result;
+};
+scheduler.form_blocks={
+ template:{
+ render: function(sns){
+ var height=(sns.height||"30")+"px";
+ return "<div class='dhx_cal_ltext dhx_cal_template' style='height:"+height+";'></div>";
+ },
+ set_value:function(node,value,ev,config){
+ node.innerHTML = value||"";
+ },
+ get_value:function(node,ev,config){
+ return node.innerHTML||"";
+ },
+ focus: function(node){
+ }
+ },
+ textarea:{
+ render:function(sns){
+ var height=(sns.height||"130")+"px";
+ return "<div class='dhx_cal_ltext' style='height:"+height+";'><textarea></textarea></div>";
+ },
+ set_value:function(node,value,ev){
+ node.firstChild.value=value||"";
+ },
+ get_value:function(node,ev){
+ return node.firstChild.value;
+ },
+ focus:function(node){
+ var a=node.firstChild; scheduler._focus(a, true);
+ }
+ },
+ select:{
+ render:function(sns){
+ var height=(sns.height||"23")+"px";
+ var html="<div class='dhx_cal_ltext' style='height:"+height+";'><select style='width:100%;'>";
+ for (var i=0; i < sns.options.length; i++)
+ html+="<option value='"+sns.options[i].key+"'>"+sns.options[i].label+"</option>";
+ html+="</select></div>";
+ return html;
+ },
+ set_value:function(node,value,ev,sns){
+ var select = node.firstChild;
+ if (!select._dhx_onchange && sns.onchange) {
+ select.onchange = sns.onchange;
+ select._dhx_onchange = true;
+ }
+ if (typeof value == "undefined")
+ value = (select.options[0]||{}).value;
+ select.value=value||"";
+ },
+ get_value:function(node,ev){
+ return node.firstChild.value;
+ },
+ focus:function(node){
+ var a=node.firstChild; scheduler._focus(a, true);
+ }
+ },
+ time:{
+ render:function(sns) {
+ if (!sns.time_format) {
+ // default order
+ sns.time_format = ["%H:%i", "%d", "%m", "%Y"];
+ }
+ // map: default order => real one
+ sns._time_format_order = {};
+ var time_format = sns.time_format;
+
+ var cfg = scheduler.config;
+ var dt = this.date.date_part(scheduler._currentDate());
+ var last = 24*60, first = 0;
+ if(scheduler.config.limit_time_select){
+ last = 60*cfg.last_hour+1;
+ first = 60*cfg.first_hour;
+ dt.setHours(cfg.first_hour);
+ }
+ var html = "";
+
+ for (var p = 0; p < time_format.length; p++) {
+ var time_option = time_format[p];
+
+ // adding spaces between selects
+ if (p > 0) {
+ html += " ";
+ }
+
+ switch (time_option) {
+ case "%Y":
+ sns._time_format_order[3] = p;
+ //year
+ html+="<select>";
+ var year = dt.getFullYear()-5; //maybe take from config?
+ for (var i=0; i < 10; i++)
+ html+="<option value='"+(year+i)+"'>"+(year+i)+"</option>";
+ html+="</select> ";
+ break;
+ case "%m":
+ sns._time_format_order[2] = p;
+ //month
+ html+="<select>";
+ for (var i=0; i < 12; i++)
+ html+="<option value='"+i+"'>"+this.locale.date.month_full[i]+"</option>";
+ html += "</select>";
+ break;
+ case "%d":
+ sns._time_format_order[1] = p;
+ //days
+ html+="<select>";
+ for (var i=1; i < 32; i++)
+ html+="<option value='"+i+"'>"+i+"</option>";
+ html += "</select>";
+ break;
+ case "%H:%i":
+ sns._time_format_order[0] = p;
+ //hours
+ html += "<select>";
+ var i = first;
+ var tdate = dt.getDate();
+ sns._time_values = [];
+
+ while(i<last){
+ var time=this.templates.time_picker(dt);
+ html+="<option value='"+i+"'>"+time+"</option>";
+ sns._time_values.push(i);
+ dt.setTime(dt.valueOf()+this.config.time_step*60*1000);
+ var diff = (dt.getDate()!=tdate)?1:0; // moved or not to the next day
+ i=diff*24*60+dt.getHours()*60+dt.getMinutes();
+ }
+ html += "</select>";
+ break;
+ }
+ }
+
+ return "<div style='height:30px;padding-top:0px;font-size:inherit;' class='dhx_section_time'>"+html+"<span style='font-weight:normal; font-size:10pt;'> &nbsp;&ndash;&nbsp; </span>"+html+"</div>";
+ },
+ set_value:function(node,value,ev,config){
+ var cfg = scheduler.config;
+ var s=node.getElementsByTagName("select");
+ var map = config._time_format_order;
+ var start_date, end_date;
+
+ if(cfg.full_day) {
+ if (!node._full_day){
+ var html = "<label class='dhx_fullday'><input type='checkbox' name='full_day' value='true'> "+scheduler.locale.labels.full_day+"&nbsp;</label></input>";
+ if (!scheduler.config.wide_form)
+ html = node.previousSibling.innerHTML+html;
+ node.previousSibling.innerHTML=html;
+ node._full_day=true;
+ }
+ var input=node.previousSibling.getElementsByTagName("input")[0];
+ input.checked = (scheduler.date.time_part(ev.start_date)===0 && scheduler.date.time_part(ev.end_date)===0);
+
+ s[map[0]].disabled=input.checked;
+ s[ map[0] + s.length/2 ].disabled=input.checked;
+
+ input.onclick = function(){
+ if(input.checked) {
+ var obj = {};
+ scheduler.form_blocks.time.get_value(node,obj,config);
+
+ start_date = scheduler.date.date_part(obj.start_date);
+ end_date = scheduler.date.date_part(obj.end_date);
+
+ if (+end_date == +start_date || (+end_date >= +start_date && (ev.end_date.getHours() !== 0 || ev.end_date.getMinutes() !== 0)))
+ end_date = scheduler.date.add(end_date, 1, "day");
+ }
+
+ s[map[0]].disabled=input.checked;
+ s[ map[0] + s.length/2 ].disabled=input.checked;
+
+ _fill_lightbox_select(s,0,start_date||ev.start_date);
+ _fill_lightbox_select(s,4,end_date||ev.end_date);
+ };
+ }
+
+ if(cfg.auto_end_date && cfg.event_duration) {
+ var _update_lightbox_select = function () {
+ start_date = new Date(s[map[3]].value,s[map[2]].value,s[map[1]].value,0,s[map[0]].value);
+ end_date = new Date(start_date.getTime() + (scheduler.config.event_duration * 60 * 1000));
+ _fill_lightbox_select(s, 4, end_date);
+ };
+ for(var i=0; i<4; i++) {
+ s[i].onchange = _update_lightbox_select;
+ }
+ }
+
+ function _fill_lightbox_select(s,i,d) {
+ var time_values = config._time_values;
+ var direct_value = d.getHours()*60+d.getMinutes();
+ var fixed_value = direct_value;
+ var value_found = false;
+ for (var k=0; k<time_values.length; k++) {
+ var t_v = time_values[k];
+ if (t_v === direct_value) {
+ value_found = true;
+ break;
+ }
+ if (t_v < direct_value)
+ fixed_value = t_v;
+ }
+
+ s[i+map[0]].value=(value_found)?direct_value:fixed_value;
+ if(!(value_found || fixed_value)){
+ s[i+map[0]].selectedIndex = -1;//show empty select in FF
+ }
+ s[i+map[1]].value=d.getDate();
+ s[i+map[2]].value=d.getMonth();
+ s[i+map[3]].value=d.getFullYear();
+ }
+
+ _fill_lightbox_select(s,0,ev.start_date);
+ _fill_lightbox_select(s,4,ev.end_date);
+ },
+ get_value:function(node, ev, config) {
+ var s = node.getElementsByTagName("select");
+ var map = config._time_format_order;
+
+ ev.start_date=new Date(s[map[3]].value,s[map[2]].value,s[map[1]].value,0,s[map[0]].value);
+ ev.end_date=new Date(s[map[3]+4].value,s[map[2]+4].value,s[map[1]+4].value,0,s[map[0]+4].value);
+
+ if (ev.end_date<=ev.start_date)
+ ev.end_date=scheduler.date.add(ev.start_date,scheduler.config.time_step,"minute");
+ return {
+ start_date: new Date(ev.start_date),
+ end_date: new Date(ev.end_date)
+ };
+ },
+ focus:function(node){
+ scheduler._focus(node.getElementsByTagName("select")[0]);
+ }
+ }
+};
+scheduler.showCover=function(box){
+ if (box){
+ box.style.display="block";
+
+ var scroll_top = window.pageYOffset||document.body.scrollTop||document.documentElement.scrollTop;
+ var scroll_left = window.pageXOffset||document.body.scrollLeft||document.documentElement.scrollLeft;
+
+ var view_height = window.innerHeight||document.documentElement.clientHeight;
+
+ if(scroll_top) // if vertical scroll on window
+ box.style.top=Math.round(scroll_top+Math.max((view_height-box.offsetHeight)/2, 0))+"px";
+ else // vertical scroll on body
+ box.style.top=Math.round(Math.max(((view_height-box.offsetHeight)/2), 0) + 9)+"px"; // +9 for compatibility with auto tests
+
+ // not quite accurate but used for compatibility reasons
+ if(document.documentElement.scrollWidth > document.body.offsetWidth) // if horizontal scroll on the window
+ box.style.left=Math.round(scroll_left+(document.body.offsetWidth-box.offsetWidth)/2)+"px";
+ else // horizontal scroll on the body
+ box.style.left=Math.round((document.body.offsetWidth-box.offsetWidth)/2)+"px";
+ }
+ this.show_cover();
+};
+scheduler.showLightbox=function(id){
+ if (!id) return;
+ if (!this.callEvent("onBeforeLightbox",[id])) {
+ if (this._new_event)
+ this._new_event = null;
+ return;
+ }
+ var box = this.getLightbox();
+ this.showCover(box);
+ this._fill_lightbox(id,box);
+ this.callEvent("onLightbox",[id]);
+};
+scheduler._fill_lightbox = function(id, box) {
+ var ev = this.getEvent(id);
+ var s = box.getElementsByTagName("span");
+ if (scheduler.templates.lightbox_header) {
+ s[1].innerHTML = "";
+ s[2].innerHTML = scheduler.templates.lightbox_header(ev.start_date, ev.end_date, ev);
+ } else {
+ s[1].innerHTML = this.templates.event_header(ev.start_date, ev.end_date, ev);
+ s[2].innerHTML = (this.templates.event_bar_text(ev.start_date, ev.end_date, ev) || "").substr(0, 70); //IE6 fix
+ }
+
+ var sns = this.config.lightbox.sections;
+ for (var i = 0; i < sns.length; i++) {
+ var current_sns = sns[i];
+ var node = document.getElementById(current_sns.id).nextSibling;
+ var block = this.form_blocks[current_sns.type];
+ var value = (ev[current_sns.map_to] !== undefined) ? ev[current_sns.map_to] : current_sns.default_value;
+ block.set_value.call(this, node, value, ev, current_sns);
+ if (sns[i].focus)
+ block.focus.call(this, node);
+ }
+
+ scheduler._lightbox_id = id;
+};
+scheduler._lightbox_out=function(ev){
+ var sns = this.config.lightbox.sections;
+ for (var i=0; i < sns.length; i++) {
+ var node = document.getElementById(sns[i].id);
+ node=(node?node.nextSibling:node);
+ var block=this.form_blocks[sns[i].type];
+ var res=block.get_value.call(this,node,ev, sns[i]);
+ if (sns[i].map_to!="auto")
+ ev[sns[i].map_to]=res;
+ }
+ return ev;
+};
+scheduler._empty_lightbox=function(data){
+ var id=scheduler._lightbox_id;
+ var ev=this.getEvent(id);
+ var box=this.getLightbox();
+
+ this._lame_copy(ev, data);
+
+ this.setEvent(ev.id,ev);
+ this._edit_stop_event(ev,true);
+ this.render_view_data();
+};
+scheduler.hide_lightbox=function(id){
+ this.hideCover(this.getLightbox());
+ this._lightbox_id = null;
+ this.callEvent("onAfterLightbox",[]);
+};
+scheduler.hideCover=function(box){
+ if (box) box.style.display="none";
+ this.hide_cover();
+};
+scheduler.hide_cover=function(){
+ if (this._cover)
+ this._cover.parentNode.removeChild(this._cover);
+ this._cover=null;
+};
+scheduler.show_cover=function(){
+ if(this._cover)
+ return;
+
+ this._cover=document.createElement("DIV");
+ this._cover.className="dhx_cal_cover";
+ var _document_height = ((document.height !== undefined) ? document.height : document.body.offsetHeight);
+ var _scroll_height = ((document.documentElement) ? document.documentElement.scrollHeight : 0);
+ this._cover.style.height = Math.max(_document_height, _scroll_height) + 'px';
+ document.body.appendChild(this._cover);
+};
+scheduler.save_lightbox=function(){
+ var data = this._lightbox_out({}, this._lame_copy(this.getEvent(this._lightbox_id)));
+ if (this.checkEvent("onEventSave") && !this.callEvent("onEventSave",[this._lightbox_id, data, this._new_event]))
+ return;
+ this._empty_lightbox(data);
+ this.hide_lightbox();
+};
+scheduler.startLightbox = function(id, box){
+ this._lightbox_id = id;
+ this._custom_lightbox = true;
+
+ this._temp_lightbox = this._lightbox;
+ this._lightbox = box;
+ this.showCover(box);
+};
+scheduler.endLightbox = function(mode, box){
+ this._edit_stop_event(scheduler.getEvent(this._lightbox_id),mode);
+ if (mode)
+ scheduler.render_view_data();
+ this.hideCover(box);
+
+ if (this._custom_lightbox){
+ this._lightbox = this._temp_lightbox;
+ this._custom_lightbox = false;
+ }
+ this._temp_lightbox = this._lightbox_id = null; // in case of custom lightbox user only calls endLightbox so we need to reset _lightbox_id
+};
+scheduler.resetLightbox = function(){
+ if (scheduler._lightbox && !scheduler._custom_lightbox)
+ scheduler._lightbox.parentNode.removeChild(scheduler._lightbox);
+ scheduler._lightbox = null;
+};
+scheduler.cancel_lightbox=function(){
+ this.callEvent("onEventCancel",[this._lightbox_id, this._new_event]);
+ this.endLightbox(false);
+ this.hide_lightbox();
+};
+scheduler._init_lightbox_events=function(){
+ this.getLightbox().onclick=function(e){
+ var src=e?e.target:event.srcElement;
+ if (!src.className) src=src.previousSibling;
+ if (src && src.className)
+ switch(src.className){
+ case "dhx_save_btn":
+ scheduler.save_lightbox();
+ break;
+ case "dhx_delete_btn":
+ var c=scheduler.locale.labels.confirm_deleting;
+
+ scheduler._dhtmlx_confirm(c, scheduler.locale.labels.title_confirm_deleting, function(){
+ scheduler.deleteEvent(scheduler._lightbox_id);
+ scheduler._new_event = null; //clear flag, if it was unsaved event
+ scheduler.hide_lightbox();
+ });
+
+ break;
+ case "dhx_cancel_btn":
+ scheduler.cancel_lightbox();
+ break;
+
+ default:
+ if (src.getAttribute("dhx_button")) {
+ scheduler.callEvent("onLightboxButton", [src.className, src, e]);
+ } else {
+ var index, block, sec;
+ if (src.className.indexOf("dhx_custom_button") != -1) {
+ if (src.className.indexOf("dhx_custom_button_") != -1) {
+ index = src.parentNode.getAttribute("index");
+ sec = src.parentNode.parentNode;
+ } else {
+ index = src.getAttribute("index");
+ sec = src.parentNode;
+ src = src.firstChild;
+ }
+ }
+ if (index) {
+ block = scheduler.form_blocks[scheduler.config.lightbox.sections[index].type];
+ block.button_click(index, src, sec, sec.nextSibling);
+ }
+ }
+ break;
+ }
+ };
+ this.getLightbox().onkeydown=function(e){
+ switch((e||event).keyCode){
+ case scheduler.keys.edit_save:
+ if ((e||event).shiftKey) return;
+ scheduler.save_lightbox();
+ break;
+ case scheduler.keys.edit_cancel:
+ scheduler.cancel_lightbox();
+ break;
+ default:
+ break;
+ }
+ };
+};
+scheduler.setLightboxSize=function(){
+ var d = this._lightbox;
+ if (!d) return;
+
+ var con = d.childNodes[1];
+ con.style.height="0px";
+ con.style.height=con.scrollHeight+"px";
+ d.style.height=con.scrollHeight+scheduler.xy.lightbox_additional_height+"px";
+ con.style.height=con.scrollHeight+"px"; //it is incredible , how ugly IE can be
+};
+
+scheduler._init_dnd_events = function(){
+ dhtmlxEvent(document.body, "mousemove", scheduler._move_while_dnd);
+ dhtmlxEvent(document.body, "mouseup", scheduler._finish_dnd);
+ scheduler._init_dnd_events = function(){};
+};
+scheduler._move_while_dnd = function(e){
+ if (scheduler._dnd_start_lb){
+ if (!document.dhx_unselectable){
+ document.body.className += " dhx_unselectable";
+ document.dhx_unselectable = true;
+ }
+ var lb = scheduler.getLightbox();
+ var now = (e&&e.target)?[e.pageX, e.pageY]:[event.clientX, event.clientY];
+ lb.style.top = scheduler._lb_start[1]+now[1]-scheduler._dnd_start_lb[1]+"px";
+ lb.style.left = scheduler._lb_start[0]+now[0]-scheduler._dnd_start_lb[0]+"px";
+ }
+};
+scheduler._ready_to_dnd = function(e){
+ var lb = scheduler.getLightbox();
+ scheduler._lb_start = [parseInt(lb.style.left,10), parseInt(lb.style.top,10)];
+ scheduler._dnd_start_lb = (e&&e.target)?[e.pageX, e.pageY]:[event.clientX, event.clientY];
+};
+scheduler._finish_dnd = function(){
+ if (scheduler._lb_start){
+ scheduler._lb_start = scheduler._dnd_start_lb = false;
+ document.body.className = document.body.className.replace(" dhx_unselectable","");
+ document.dhx_unselectable = false;
+ }
+};
+scheduler.getLightbox=function(){ //scheduler.config.wide_form=true;
+ if (!this._lightbox){
+ var d=document.createElement("DIV");
+ d.className="dhx_cal_light";
+ if (scheduler.config.wide_form)
+ d.className+=" dhx_cal_light_wide";
+ if (scheduler.form_blocks.recurring)
+ d.className+=" dhx_cal_light_rec";
+
+ if (/msie|MSIE 6/.test(navigator.userAgent))
+ d.className+=" dhx_ie6";
+ d.style.visibility="hidden";
+ var html = this._lightbox_template;
+
+ var buttons = this.config.buttons_left;
+ for (var i = 0; i < buttons.length; i++)
+ html+="<div class='dhx_btn_set dhx_left_btn_set "+buttons[i]+"_set'><div dhx_button='1' class='"+buttons[i]+"'></div><div>"+scheduler.locale.labels[buttons[i]]+"</div></div>";
+
+ buttons = this.config.buttons_right;
+ for (var i = 0; i < buttons.length; i++)
+ html+="<div class='dhx_btn_set dhx_right_btn_set "+buttons[i]+"_set' style='float:right;'><div dhx_button='1' class='"+buttons[i]+"'></div><div>"+scheduler.locale.labels[buttons[i]]+"</div></div>";
+
+ html+="</div>";
+ d.innerHTML=html;
+ if (scheduler.config.drag_lightbox){
+ d.firstChild.onmousedown = scheduler._ready_to_dnd;
+ d.firstChild.onselectstart = function(){ return false; };
+ d.firstChild.style.cursor = "pointer";
+ scheduler._init_dnd_events();
+
+ }
+ document.body.insertBefore(d,document.body.firstChild);
+ this._lightbox=d;
+
+ var sns=this.config.lightbox.sections;
+ html="";
+ for (var i=0; i < sns.length; i++) {
+ var block=this.form_blocks[sns[i].type];
+ if (!block) continue; //ignore incorrect blocks
+ sns[i].id="area_"+this.uid();
+ var button = "";
+ if (sns[i].button){
+ button = "<div class='dhx_custom_button' index='"+i+"'><div class='dhx_custom_button_"+sns[i].button+"'></div><div>"+this.locale.labels["button_"+sns[i].button]+"</div></div>";
+ }
+
+ if (this.config.wide_form){
+ html+="<div class='dhx_wrap_section'>";
+ }
+
+ var label_name = this.locale.labels["section_"+sns[i].name];
+ if(typeof label_name !== "string"){
+ label_name = sns[i].name;
+ }
+ html+="<div id='"+sns[i].id+"' class='dhx_cal_lsection'>"+button+label_name+"</div>"+block.render.call(this,sns[i]);
+ html+="</div>";
+ }
+
+ var ds=d.getElementsByTagName("div");
+ for (var i=0; i<ds.length; i++) {
+ var t_ds = ds[i];
+ if (t_ds.className == "dhx_cal_larea") {
+ t_ds.innerHTML = html;
+ break;
+ }
+ }
+
+ //sizes
+ this.setLightboxSize();
+
+ this._init_lightbox_events(this);
+ d.style.display="none";
+ d.style.visibility="visible";
+ }
+ return this._lightbox;
+};
+scheduler._lightbox_template="<div class='dhx_cal_ltitle'><span class='dhx_mark'>&nbsp;</span><span class='dhx_time'></span><span class='dhx_title'></span></div><div class='dhx_cal_larea'></div>";
+
+scheduler._init_touch_events = function(){
+ if (this.config.touch != "force")
+ this.config.touch = this.config.touch &&
+ ( (navigator.userAgent.indexOf("Mobile")!=-1) ||
+ (navigator.userAgent.indexOf("iPad")!=-1) ||
+ (navigator.userAgent.indexOf("Android")!=-1) ||
+ (navigator.userAgent.indexOf("Touch")!=-1));
+
+ if (this.config.touch){
+ this.xy.scroll_width = 0;
+ if (window.navigator.msPointerEnabled){
+ this._touch_events(["MSPointerMove", "MSPointerDown", "MSPointerUp"], function(ev){
+ if (ev.pointerType == ev.MSPOINTER_TYPE_MOUSE ) return null;
+ return ev;
+ }, function(ev){
+ return (!ev || ev.pointerType == ev.MSPOINTER_TYPE_MOUSE);
+ });
+ this._obj.ondblclick = function(){};
+ } else
+ this._touch_events(["touchmove", "touchstart", "touchend"], function(ev){
+ if (ev.touches && ev.touches.length > 1) return null;
+ if (ev.touches[0])
+ return { target:ev.target, pageX:ev.touches[0].pageX, pageY:ev.touches[0].pageY };
+ else
+ return ev;
+ }, function(){ return false; });
+ }
+};
+
+scheduler._touch_events = function(names, accessor, ignore){
+ //webkit on android need to be handled separately
+ var a_webkit = (navigator.userAgent.indexOf("Android")!=-1) && (navigator.userAgent.indexOf("WebKit")!=-1);
+ var source, tracker, timer, drag_mode, scroll_mode, action_mode;
+ var dblclicktime = 0;
+
+ function attachTouchEvent(element, name, callback){
+ //touch gestures must be disabled when ligthbox is opened
+ dhtmlxEvent(element, name, function(e){
+ if(scheduler._is_lightbox_open()){
+ return true;
+ }else{
+ return callback(e);
+ }
+ });
+ }
+
+ function check_direction_swipe(s_ev, e_ev, step){
+ if (!s_ev || !e_ev) return;
+
+ var dy = Math.abs(s_ev.pageY - e_ev.pageY);
+ var dx = Math.abs(s_ev.pageX - e_ev.pageX);
+ if (dx>step && (!dy || (dx/dy > 3))){
+ if (s_ev.pageX > e_ev.pageX)
+ scheduler._click.dhx_cal_next_button();
+ else
+ scheduler._click.dhx_cal_prev_button();
+ }
+ }
+
+ attachTouchEvent(document.body, names[0], function(e){
+ if (ignore(e)) return;
+
+ if (drag_mode){
+ scheduler._on_mouse_move(accessor(e));
+ scheduler._update_global_tip();
+ if (e.preventDefault)
+ e.preventDefault();
+ e.cancelBubble = true;
+ return false;
+ }
+
+ if (tracker && a_webkit){
+ check_direction_swipe(tracker, accessor(e), 0);
+ }
+
+ tracker = accessor(e);
+ //ignore common and scrolling moves
+ if (!action_mode) return;
+
+ //multitouch
+ if (!tracker){
+ scroll_mode = true;
+ return;
+ }
+
+ //target changed - probably in scroll mode
+
+ if (source.target != tracker.target || (Math.abs(source.pageX - tracker.pageX) > 5) || (Math.abs(source.pageY - tracker.pageY) > 5)){
+ scroll_mode = true;
+ clearTimeout(timer);
+ }
+
+ });
+
+ attachTouchEvent(this._els["dhx_cal_data"][0], "scroll", drag_cancel);
+ attachTouchEvent(this._els["dhx_cal_data"][0], "touchcancel", drag_cancel);
+ attachTouchEvent(this._els["dhx_cal_data"][0], "contextmenu", function(e){
+ if (action_mode){
+ if (e && e.preventDefault)
+ e.preventDefault();
+ (e||event).cancelBubble = true;
+ return false;
+ }
+ });
+ attachTouchEvent(this._els["dhx_cal_data"][0], names[1], function(e){
+ if (ignore(e)) return;
+
+ var fake_event;
+ drag_mode = scroll_mode = false;
+ action_mode = true;
+ scheduler._temp_touch_block = true;
+ fake_event = tracker = accessor(e);
+
+ if (!fake_event){
+ scroll_mode = true;
+ return;
+ }
+
+ //dbl click
+ var now = new Date();
+
+ if (!scroll_mode && !drag_mode && now - dblclicktime < 250){
+ scheduler._click.dhx_cal_data(fake_event);
+ window.setTimeout(function(){
+ scheduler._on_dbl_click(fake_event);
+ }, 50);
+
+ if (e.preventDefault)
+ e.preventDefault();
+ e.cancelBubble = true;
+ scheduler._block_next_stop = true;
+ return false;
+ }
+ dblclicktime = now;
+
+ //drag
+
+ if (scroll_mode || drag_mode || !scheduler.config.touch_drag)
+ return;
+
+ //there is no target
+ timer = setTimeout(function(){
+
+ drag_mode = true;
+ var target = source.target;
+ if (target && target.className && target.className.indexOf("dhx_body") != -1)
+ target = target.previousSibling;
+
+ scheduler._on_mouse_down(source, target);
+ if (scheduler._drag_mode && scheduler._drag_mode != "create"){
+ var pos = -1;
+ scheduler.for_rendered(scheduler._drag_id, function(node, i) {
+ pos = node.getBoundingClientRect().top;
+ node.style.display='none';
+ scheduler._rendered.splice(i, 1);
+ });
+ if (pos>=0){
+ var step = scheduler.config.time_step;
+ scheduler._move_pos_shift = step* Math.round((fake_event.pageY - pos)*60/(scheduler.config.hour_size_px*step));
+ }
+ }
+
+ if (scheduler.config.touch_tip)
+ scheduler._show_global_tip();
+ scheduler._on_mouse_move(source);
+ },scheduler.config.touch_drag);
+
+ source = fake_event;
+ });
+ function drag_cancel(e){
+ scheduler._hide_global_tip();
+ if (drag_mode){
+ scheduler._on_mouse_up( accessor(e||event) );
+ scheduler._temp_touch_block = false;
+ }
+ scheduler._drag_id = null;
+ scheduler._drag_mode=null;
+ scheduler._drag_pos=null;
+
+ clearTimeout(timer);
+ drag_mode = action_mode = false;
+ scroll_mode = true;
+ }
+ attachTouchEvent(this._els["dhx_cal_data"][0], names[2], function(e){
+ if (ignore(e)) return;
+
+ if (!drag_mode)
+ check_direction_swipe(source, tracker, 200);
+
+ if (drag_mode)
+ scheduler._ignore_next_click = true;
+
+ drag_cancel(e);
+ if (scheduler._block_next_stop){
+ scheduler._block_next_stop = false;
+ if (e.preventDefault)
+ e.preventDefault();
+ e.cancelBubble = true;
+ return false;
+ }
+ });
+
+ dhtmlxEvent(document.body, names[2], drag_cancel);
+};
+
+scheduler._show_global_tip = function(){
+ scheduler._hide_global_tip();
+
+ var toptip = scheduler._global_tip = document.createElement("DIV");
+ toptip.className='dhx_global_tip';
+
+ scheduler._update_global_tip(1);
+
+ document.body.appendChild(toptip);
+};
+scheduler._update_global_tip = function(init){
+ var toptip = scheduler._global_tip;
+ if (toptip){
+ var time = "";
+ if (scheduler._drag_id && !init){
+ var ev = scheduler.getEvent(scheduler._drag_id);
+ if (ev)
+ time = "<div>" + (ev._timed ? scheduler.templates.event_header(ev.start_date, ev.end_date, ev):scheduler.templates.day_date(ev.start_date, ev.end_date, ev)) + "</div>";
+ }
+
+ if (scheduler._drag_mode == "create" || scheduler._drag_mode == "new-size")
+ toptip.innerHTML = (scheduler.locale.drag_to_create || "Drag to create")+time;
+ else
+ toptip.innerHTML = (scheduler.locale.drag_to_move || "Drag to move")+time;
+ }
+};
+scheduler._hide_global_tip = function(){
+ var toptip = scheduler._global_tip;
+ if (toptip && toptip.parentNode){
+ toptip.parentNode.removeChild(toptip);
+ scheduler._global_tip = 0;
+ }
+};
+
+scheduler._dp_init=function(dp){
+ dp._methods=["_set_event_text_style","","changeEventId","_dp_hook_delete"];
+
+ this._dp_hook_delete = function(id){
+ return this.deleteEvent(id, true);
+ };
+ this.attachEvent("onEventAdded",function(id){
+ if (!this._loading && this._validId(id))
+ dp.setUpdated(id,true,"inserted");
+ });
+ this.attachEvent("onConfirmedBeforeEventDelete", function(id){
+ if (!this._validId(id)) return;
+ var z=dp.getState(id);
+
+ if (z=="inserted" || this._new_event) { dp.setUpdated(id,false); return true; }
+ if (z=="deleted") return false;
+ if (z=="true_deleted") return true;
+
+ dp.setUpdated(id,true,"deleted");
+ return false;
+ });
+ this.attachEvent("onEventChanged",function(id){
+ if (!this._loading && this._validId(id))
+ dp.setUpdated(id,true,"updated");
+ });
+
+ dp._getRowData=function(id,pref){
+ var ev=this.obj.getEvent(id);
+ var data = {};
+
+ for (var a in ev){
+ if (a.indexOf("_") === 0) continue;
+ if (ev[a] && ev[a].getUTCFullYear) //not very good, but will work
+ data[a] = this.obj.templates.xml_format(ev[a]);
+ else
+ data[a] = ev[a];
+ }
+
+ return data;
+ };
+ dp._clearUpdateFlag=function(){};
+
+ dp.attachEvent("insertCallback", scheduler._update_callback);
+ dp.attachEvent("updateCallback", scheduler._update_callback);
+ dp.attachEvent("deleteCallback", function(upd, id) {
+ this.obj.setUserData(id, this.action_param, "true_deleted");
+ this.obj.deleteEvent(id);
+ });
+
+};
+
+scheduler._validId=function(id){
+ return true;
+};
+
+scheduler.setUserData=function(id,name,value){
+ if (id)
+ this.getEvent(id)[name]=value;
+ else
+ this._userdata[name]=value;
+};
+scheduler.getUserData=function(id,name){
+ return id?this.getEvent(id)[name]:this._userdata[name];
+};
+scheduler._set_event_text_style=function(id,style){
+ this.for_rendered(id,function(r){
+ r.style.cssText+=";"+style;
+ });
+ var ev = this.getEvent(id);
+ ev["_text_style"]=style;
+ this.event_updated(ev);
+};
+
+scheduler._update_callback = function(upd,id){
+ var data = scheduler._xmlNodeToJSON(upd.firstChild);
+ data.text = data.text||data._tagvalue;
+ data.start_date = scheduler.templates.xml_date(data.start_date);
+ data.end_date = scheduler.templates.xml_date(data.end_date);
+
+ scheduler.addEvent(data);
+};
+scheduler._skin_settings = {
+ fix_tab_position: [1,0],
+ use_select_menu_space: [1,0],
+ wide_form: [1,0],
+
+ hour_size_px: [44,42],
+ displayed_event_color: ["#ff4a4a", "ffc5ab"],
+ displayed_event_text_color: ["#ffef80", "7e2727"]
+};
+
+scheduler._skin_xy = {
+ lightbox_additional_height: [90,50],
+ nav_height: [59,22],
+ bar_height: [24,20]
+};
+
+scheduler._configure = function(col, data, skin){
+ for (var key in data)
+ if (typeof col[key] == "undefined")
+ col[key] = data[key][skin];
+};
+scheduler._skin_init = function(){
+ if (!scheduler.skin){
+ var links = document.getElementsByTagName("link");
+ for (var i = 0; i < links.length; i++) {
+ var res = links[i].href.match("dhtmlxscheduler_([a-z]+).css");
+ if (res){
+ scheduler.skin = res[1];
+ break;
+ }
+ }
+ }
+
+
+
+ var set = 0;
+ if (scheduler.skin && (scheduler.skin === "classic" || scheduler.skin === "glossy")) set = 1;
+
+ //apply skin related settings
+ this._configure(scheduler.config, scheduler._skin_settings, set);
+ this._configure(scheduler.xy, scheduler._skin_xy, set);
+
+ //classic skin need not any further customization
+ if (set) return;
+
+
+ var minic = scheduler.config.minicalendar;
+ if (minic) minic.padding = 14;
+
+ scheduler.templates.event_bar_date = function(start,end,ev) {
+ return "• <b>"+scheduler.templates.event_date(start)+"</b> ";
+ };
+
+ //scheduler._lightbox_template="<div class='dhx_cal_ltitle'><span class='dhx_mark'>&nbsp;</span><span class='dhx_time'></span><span class='dhx_title'></span><div class='dhx_close_icon'></div></div><div class='dhx_cal_larea'></div>";
+ scheduler.attachEvent("onTemplatesReady", function() {
+
+ var date_to_str = scheduler.date.date_to_str("%d");
+ if(!scheduler.templates._old_month_day){
+ scheduler.templates._old_month_day = scheduler.templates.month_day;
+ }
+ var old_month_day = scheduler.templates._old_month_day;
+ scheduler.templates.month_day = function(date) {
+ if (this._mode == "month") {
+ var label = date_to_str(date);
+ if (date.getDate() == 1) {
+ label = scheduler.locale.date.month_full[date.getMonth()] + " " + label;
+ }
+ if (+date == +scheduler.date.date_part(new Date())) {
+ label = scheduler.locale.labels.dhx_cal_today_button + " " + label;
+ }
+ return label;
+ } else {
+ return old_month_day.call(this, date);
+ }
+ };
+
+
+ if (scheduler.config.fix_tab_position){
+ var navline_divs = scheduler._els["dhx_cal_navline"][0].getElementsByTagName('div');
+ var minical = null;
+ var tabs = [];
+ var last = 211;
+ for (var i=0; i<navline_divs.length; i++) {
+ var div = navline_divs[i];
+ var name = div.getAttribute("name");
+ if (name) { // mode tab
+ div.style.right = "auto";
+ switch (name) {
+ case "day_tab":
+ div.style.left = "14px";
+ div.className += " dhx_cal_tab_first";
+ break;
+ case "week_tab":
+ div.style.left = "75px";
+ break;
+ case "month_tab":
+ div.style.left = "136px";
+ div.className += " dhx_cal_tab_last";
+ break;
+ default:
+ div.style.left = last+"px";
+ div.className += " dhx_cal_tab_standalone";
+ last = last + 14 + div.offsetWidth;
+ break;
+ }
+ }else{
+ if((div.className || "").indexOf("dhx_minical_icon") === 0 &&
+ div.parentNode == scheduler._els["dhx_cal_navline"][0]){
+ // if default minicalendar icon
+ minical = div;
+ }
+ }
+
+ }
+
+ if(minical){
+ minical.style.left = last+"px";
+ }
+ }
+
+ if (scheduler.skin && scheduler.skin === "flat"){
+ scheduler.xy.scale_height = 35;
+ scheduler.templates.hour_scale = function(date){
+ var min = date.getMinutes();
+ min = min < 10 ? "0"+min : min;
+ var html = "<span class='dhx_scale_h'>"+ date.getHours() +"</span>"+
+ "<span class='dhx_scale_m'>&nbsp;"+ min +"</span>";
+ return html;
+ };
+ }
+ });
+ scheduler._skin_init = function(){};
+};
+
+
+if (window.jQuery){
+
+(function( $ ){
+
+ var methods = [];
+ $.fn.dhx_scheduler = function(config){
+ if (typeof(config) === 'string') {
+ if (methods[config] ) {
+ return methods[config].apply(this, []);
+ }else {
+ $.error('Method ' + config + ' does not exist on jQuery.dhx_scheduler');
+ }
+ } else {
+ var views = [];
+ this.each(function() {
+ if (this && this.getAttribute){
+ if (!this.getAttribute("dhxscheduler")){
+ for (var key in config)
+ if (key!="data")
+ scheduler.config[key] = config[key];
+
+ if (!this.getElementsByTagName("div").length){
+ this.innerHTML = '<div class="dhx_cal_navline"><div class="dhx_cal_prev_button">&nbsp;</div><div class="dhx_cal_next_button">&nbsp;</div><div class="dhx_cal_today_button"></div><div class="dhx_cal_date"></div><div class="dhx_cal_tab" name="day_tab" style="right:204px;"></div><div class="dhx_cal_tab" name="week_tab" style="right:140px;"></div><div class="dhx_cal_tab" name="month_tab" style="right:76px;"></div></div><div class="dhx_cal_header"></div><div class="dhx_cal_data"></div>';
+ this.className += " dhx_cal_container";
+ }
+ scheduler.init(this, scheduler.config.date, scheduler.config.mode);
+ if (config.data)
+ scheduler.parse(config.data);
+
+ views.push(scheduler);
+ }
+ }
+ });
+
+ if (views.length === 1) return views[0];
+ return views;
+ }
+ };
+
+
+
+
+})(jQuery);
+
+} \ No newline at end of file
diff --git a/codebase/sources/dhtmlxscheduler.js.map b/codebase/sources/dhtmlxscheduler.js.map
new file mode 100644
index 0000000..8ab2925
--- /dev/null
+++ b/codebase/sources/dhtmlxscheduler.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler.js.map","sources":["dhtmlxscheduler.js"],"names":["dtmlXMLLoaderObject","funcObject","dhtmlObject","async","rSeed","this","xmlDoc","onloadAction","mainObject","waitCall","callerFunction","handler","e","window","event","getAbsoluteLeft","htmlObject","getOffset","left","getAbsoluteTop","top","getOffsetSum","elem","parseInt","offsetTop","offsetLeft","offsetParent","getOffsetRect","box","getBoundingClientRect","body","document","docElem","documentElement","scrollTop","pageYOffset","scrollLeft","pageXOffset","clientTop","clientLeft","Math","round","convertStringToBoolean","inputString","toLowerCase","getUrlSymbol","str","indexOf","dhtmlDragAndDropObject","dhtmlDragAndDrop","lastLanding","dragNode","dragStartNode","dragStartObject","tempDOMU","tempDOMM","waitDrag","_dhtmlxError","catches","dhtmlXHeir","a","b","c","dhtmlxEvent","el","addEventListener","attachEvent","dataProcessor","serverProcessorURL","serverProcessor","action_param","object","updatedRows","autoUpdate","updateMode","_tMode","post_delim","_waitMode","_in_progress","_invalid","mandatoryFields","messages","styles","updated","inserted","deleted","invalid","invalid_cell","error","clear","enableUTFencoding","dhtmlxEventable","dhtmlXScheduler","scheduler","version","dhtmlx","obj","extend_api","name","map","ext","t","that","tagName","apply","_init","arguments","_patch","prototype","dhtmlxAjax","get","url","callback","length","loadXML","post","getSync","postSync","count","waitLoadFunction","once","check","readyState","call","getXMLTopNode","oldObj","z","responseXML","temp","getElementsByTagName","split","_retry","_isIE","loadXMLString","responseText","replace","dhtmlxError","throwError","createElement","xmlString","silent","ActiveXObject","onreadystatechange","parser","DOMParser","parseFromString","filePath","postMode","postVars","rpc","Date","valueOf","XMLHttpRequest","open","setRequestHeader","navigator","userAgent","send","destructor","_filterXPath","_getAllNamedChilds","doXPath","doXPathOpera","doXSLTransToObject","doXSLTransToString","doSerialization","xmlNodeToJSON","setXSLParamValue","node","i","attributes","value","firstChild","nodeValue","childNodes","push","removeDraggableItem","htmlNode","onmousedown","dragStarter","dragLanding","addDraggableItem","preCreateDragCopy","addDragLanding","button","onmouseup","onmousemove","stopDrag","callDrag","downtime","preventDefault","dragger","_createDragNode","onselectstart","gldragNode","appendChild","pWindow","initFrameRoute","parentNode","grd","old","removeChild","oldBody","_dragOut","div","innerHTML","outerHTML","cloneNode","style","clientX","fx","clientY","fy","srcElement","target","checkLanding","calculateFramePosition","n","parent","frames","frameElement","ls","_dragIn","lastLanding_scr","_onNotFound","mode","stopFrameRoute","_drag","win","_isFF","_FFrv","_isOpera","_isKHTML","_isMacOS","_isChrome","_KHTMLrv","_OperaRv","parseFloat","substr","appName","appVersion","compatMode","xpathExp","docObj","namespace","result_type","XPathResult","nodeName","setProperty","selectSingleNode","selectNodes","Array","nodeObj","ownerDocument","retType","ANY_TYPE","FIRST_ORDERED_NODE_TYPE","rowsCol","col","evaluate","singleNodeValue","thisColMemb","iterateNext","catchError","type","func_name","params","alert","getAttribute","toUpperCase","j","xslDoc","paramName","paramValue","item","result","transformNodeToObject","transformNode","XSLProcessor","XSLTProcessor","importStylesheet","transformToDocument","res","xml","xmlSerializer","XMLSerializer","serializeToString","catcher","callObj","eventCatcher","addEvent","callEvent","arg0","checkEvent","dhx_catch","zr","ev","eval","removeEvent","id","detachEvent","list","detachAllEvents","config","usercall","modality","_dhx_msg_cfg","modal_key","code","which","keyCode","message","keyboard","cancelBubble","cover","onkeydown","className","scrollHeight","display","text","css","button_css","info","area","position","hide","onclick","insertBefore","expire","timers","setTimeout","pull","_boxStructure","ok","cancel","setAttribute","inner","width","height","title","content","ok_text","locale","labels","message_ok","undefined","cancel_text","message_cancel","buttons","getElementById","source","_createBox","hidden","x","abs","floor","innerWidth","offsetWidth","y","innerHeight","offsetHeight","focus","modalbox","alertPopup","confirmPopup","boxPopup","box_params","uid","confirm","subtype","seed","hideAll","key","clearTimeout","setTransactionMode","total","_tSend","escape","data","_utf","encodeURIComponent","setDataColumns","val","_columns","getSyncState","enableDataNames","_endnm","enablePartialDataSend","_changed","setUpdateMode","dnd","ignore","master","_silent_mode","setUpdated","rowId","state","ind","findRow","existing","getUserData","set_invalid","setUserData","is_invalid","splice","_clearUpdateFlag","markRow","sendData","_methods","details","getState","toString","checkBeforeUpdate","mytype","_h2","editStop","sendAllData","_beforeSendData","_getRowData","_sendData","serialize","serialize_one","stack","keys","hasOwnProperty","join","security_key","pref","a1","a2","afterUpdate","a3","_user","valid","_getAllData","out","has_one","setVerificator","verifFunction","clearVerificator","pattern","defineAction","_uActions","afterUpdateCallback","sid","tid","action","btag","marker","correct","soid","d","atag","finalizeUpdate","init","anObj","_dp_init","setOnAfterUpdate","enableDebug","setOnBeforeUpdateHandler","func","setAutoUpdate","interval","user","_need_update","_loader","_update_busy","xml_node","afterAutoUpdate","fullSync","self","setInterval","loadUpdate","getUpdates","_v","_a","arr","vers","upds","status","dhtmlXGridObject","_init_point_connector","_init_point","clear_url","hdr","rows","combine_urls","_connector_sorting","_connector_filter","sorting_url","dir","filtering_url","inds","vals","_con_f_used","xmlFileUrl","clearAndLoad","setSortImgState","_in_header_connector_text_filter","_in_header_text_filter","_in_header_connector_select_filter","_in_header_select_filter","load_connector","load","concat","_colls_loaded","cellType","ar","_parseHead_connector","_parseHead","cols","xmlLoader","f","v","combo","getColumnCombo","getCombo","os","lab","addOption","put","init_original","_dataprocessor","_detachDomEvent","removeEventListener","_init_once","getWindowSize","w","clientWidth","h","clientHeight","equals","oldSize","newSize","_resize_timer","update_view","date","_currentDate","_obj","unset_actions","_skin_init","_els","_scroll","_quirks","_quirks7","get_elements","init_templates","set_actions","_init_touch_events","set_sizes","setCurrentView","xy","min_event_height","scale_width","scroll_width","scale_height","month_scale_height","menu_width","margin_top","margin_left","editor_width","month_head_height","edit_save","edit_cancel","_x","_y","scale_x","_table_view","scale_s","set_xy","nav_height","actual_height","data_y","max","els","class_name","attr_value","label","_click","ondblclick","oncontextmenu","_temp_touch_block","_on_mouse_move","_ignore_next_click","_on_mouse_down","_on_mouse_up","_on_dbl_click","src","returnValue","_locate_event","select","_select_id","unselect","updateEvent","getEvent","_mode","_date","min_date","_min_date","max_date","_max_date","editor_id","_edit_id","lightbox_id","_lightbox_id","new_event","_new_event","select_id","expanded","drag_id","_drag_id","drag_mode","_drag_mode","dhx_cal_data","trg","readonly","getActionData","mask","_close_not_saved","dhx_cal_prev_button","dhx_cal_next_button","dummy","step","add","dhx_cal_today_button","dhx_cal_tab","substring","search","delete","confirm_deleting","_dhtmlx_confirm","title_confirm_deleting","deleteEvent","edit","save","showLightbox","opts","addEventNow","start","end","base","constructor","match","event_duration","time_step","start_date","start_hour","first_hour","getHours","setHours","end_date","setTime","_loading","_drag_event","dblclick_create","details_on_dblclick","_timed","_get_column_index","x_pos","column","_cols","_ignores","_week_indexes_from_pos","pos","min","ceil","hour_size_px","_mouse_coords","pageX","pageY","_dy_shift","_colsS","dy","heights","_ignores_detected","preserve_length","_event_length","_get_real_event_length","x_step","x_unit","confirm_closing","title_confirm_closing","positive_closing","_correct_shift","back","getTimezoneOffset","_drag_pos","force_redraw","_get_date_from_pos","_drag_start","getMinutes","fields","_move_pos_shift","custom","time_part","matrix","_get_fictional_event_length","resize_date","_drag_from_start","day","date_part","resize_from_start","cursor","shift","new_end","new_start","limit_drag_out","duration","_get_event_sday","last_hour","getDate","_allow_dnd","update_render","sx","for_rendered","r","classname","_lame_clone","_get_private_properties","_clear_temporary_properties","clean","flagged_event","initial","current_state","touch","_dhx_changed","is_new","edit_on_create","details_on_create","_lame_copy","render_view_data","_trigger_dyn_loading","_load_mode","_load","_render_wait","view","_reset_scale","isViewExists","templates","updateView","prev_scroll","preserve_scroll","dhx_multi_day","tabs","_render_x_header","head","left_border","_get_columns_num","from","to","count_n","_get_timeunit_start","_get_view_end","dd","ed","_calc_scale_sizes","summ","_process_ignores","realcount","_set_scale_col_size","_render_scales","header","data_area","sd","today","scales","cls","week_date_class","drag_resize","drag_move","_scales","week_start","_reset_month_scale","_reset_hours_scale","multi_day","navline","c1","visibility","col_length","c2","cc","hour_scale","scroll_hour","now_date","preserve","ign_date","_render_month_scale","getCellHeight","row","view_start","cd","tdcss","cell_width","cellheight","html","rendered_dates","row_height","month_date_class","body_class","head_class","month_day","bf1","getFullYear","getMonth","divs","getLabel","property","sections","lightbox","map_to","options","updateCollection","list_name","collection","serverList","resetLightbox","cache","Number","String","Boolean","Object","n_ev","section","_focus","fd","end_slot","ev_length","hours","_start_correction","_end_correction","start_slot","render","_get_date_index","per_day","days","_get_section_view","_props","_get_section_property","y_property","_is_initialized","_is_lightbox_open","s","month_short","month_short_hash","month_full","month_full_hash","setMinutes","setSeconds","setMilliseconds","getTime","getDay","start_on_monday","month_start","setDate","year_start","setMonth","day_start","_add_days","inc","ndate","setYear","to_fixed","num","copy","date_to_str","format","utc","Function","str_to_date","splt","getISOWeek","nday","first_thursday","year_number","ordinal_date","week_number","getUTCISOWeek","convert_to_utc","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","day_full","day_short","day_tab","week_tab","month_tab","icon_save","icon_cancel","icon_details","icon_edit","icon_delete","section_description","section_time","full_day","confirm_recurring","section_recurring","button_recurring","button_recurring_open","button_edit_series","button_edit_occurrence","agenda_tab","description","year_tab","week_agenda_tab","grid_tab","drag_to_create","drag_to_move","default_date","month_date","load_date","week_date","day_date","hour_date","xml_date","api_date","drag_create","resize_month_events","resize_month_timed","cascade_event_display","cascade_event_count","cascade_event_margin","multi_day_height_limit","drag_lightbox","server_utc","touch_tip","touch_drag","quick_info_detached","drag_highlight","icons_edit","icons_select","buttons_left","buttons_right","highlight_displayed_event","dhx_save_btn","dhx_cancel_btn","dhx_delete_btn","d1","d2","day_scale_date","month_scale_date","week_scale_date","time_picker","event_date","load_format","xml_format","event_header","event_text","event_class","event_bar_date","event_bar_text","month_events_link","drag_marker_class","drag_marker_content","_seed","_events","clearAll","_loaded","clear_view","extra_data","isOneDayEvent","event_updated","setEvent","hash","method","_rendered","changeEventId","new_id","attrs","create_getter","create_setter","is_visible_events","clear_event","in_visible_range","end_dates_visible","hidden_duration","delta","get_visible_events","only_timed","filter_event","filter","_is_main_area_event","evs","hold","_not_render","len","_recalculate_timed","tvs","tvd","_rendered_location","render_data","_view_month_day","_render_month_link","toRender","_sday","_eday","curr","_sweek","getEvents","_get_event_bar_pos","widt","x2","_pre_render_events","render_event_bar","max_evs","max_month_events","_sorder","render_event","hb","bar_height","h_old","_pre_render_events_table","_pre_render_events_line","evl","cellHeight","cells","cHeight","unshift","scroll_fix","scale_settings","sum_width","row_heights","slice","full_multi_day_height","used_multi_day_height","used_multi_day_height_css","multi_day_section","multi_day_icon","overflowY","_get_event_mapped_end_date","separate_short_events","ev_duration","_min_mapped_duration","sort","evs_originals","sh","eh","_inner","t_ev","t_end_date","slot_index","sorderSet","_is_sorder","k","_max_sorder","max_count","_count","_copy_event","_time_order","weeks","chunks_info","first_chunk","last_chunk","chunk_info","locate_s","locate_holder_day","locate_e","_length","stack_line","_first_chunk","_last_chunk","_copy_dummy","_y_from_date","sm","_calc_event_y","min_height","em","menu","menu_offset","locate_holder","pos_y","ev_count","ev_sorder","limit","margin","right","_render_v_bar","_text_style","zIndex","tplClass","cssText","_editor","shiftKey","icons","icons_str","bg_color","color","textColor","highlightEventPosition","contentA","contentB","bottom","cs","cse","container","renderEvent","inner_html","footer_class","past","_get_dnd_order","order","ev_height","max_height","_orig_sorder","evTop","y_event_offset","resize_handle","resizable","left_chunk","right_chunk","resize_left","resize_right","style_text","_edit_stop_event","getRenderedEvent","rendered_events","rendered_event","showEvent","original_color","original_text_color","displayed_event_color","displayed_event_text_color","_append_drag_marker","m","zone","scale","lastChild","previousSibling","_update_marker_position","size","_load_url","prevent_cache","lf","cache_line","temp_to","l","on_load","loader","_process","parse","_magic_parser","_process_loading","_after_call","_init_event","_tagvalue","_init_date","json","_temp","dhx_security","collections","collections_loaded","option","option_key","setLoadMode","array","_userdata","xml_string","skey","bind","itms","itm","attr","ud","udx","_xmlNodeToJSON","child","nodeType","show_loading","ical","RegExp","c_start","c_end","incoming","event_r","e_start","e_end","exec","param","param_r","parse_param","parse_date","dh","dm","dn","UTC","_lightbox_controls","formSection","_lightbox","getLightbox","nextSibling","getValue","form_blocks","get_value","setValue","set_value","get_template_control","control","get_select_control","get_textarea_control","get_time_control","template","sns","textarea","_dhx_onchange","onchange","time","time_format","_time_format_order","cfg","dt","last","first","limit_time_select","p","time_option","year","tdate","_time_values","diff","_fill_lightbox_select","time_values","direct_value","fixed_value","value_found","t_v","selectedIndex","_full_day","wide_form","input","checked","disabled","auto_end_date","_update_lightbox_select","showCover","scroll_top","scroll_left","view_height","scrollWidth","show_cover","_fill_lightbox","lightbox_header","current_sns","block","default_value","_lightbox_out","_empty_lightbox","hide_lightbox","hideCover","hide_cover","_cover","_document_height","_scroll_height","save_lightbox","startLightbox","_custom_lightbox","_temp_lightbox","endLightbox","cancel_lightbox","_init_lightbox_events","index","sec","button_click","setLightboxSize","con","lightbox_additional_height","_init_dnd_events","_move_while_dnd","_finish_dnd","_dnd_start_lb","dhx_unselectable","lb","now","_lb_start","_ready_to_dnd","recurring","test","_lightbox_template","label_name","ds","t_ds","msPointerEnabled","_touch_events","pointerType","MSPOINTER_TYPE_MOUSE","touches","names","accessor","attachTouchEvent","element","check_direction_swipe","s_ev","e_ev","dx","drag_cancel","_hide_global_tip","timer","action_mode","scroll_mode","tracker","a_webkit","dblclicktime","_update_global_tip","fake_event","_block_next_stop","_show_global_tip","toptip","_global_tip","dp","_dp_hook_delete","_validId","_update_callback","upd","_set_event_text_style","_skin_settings","fix_tab_position","use_select_menu_space","_skin_xy","_configure","skin","links","href","set","minic","minicalendar","padding","_old_month_day","old_month_day","navline_divs","minical","jQuery","$","methods","fn","dhx_scheduler","views","each"],"mappings":"AAoEA,QAASA,qBAAoBC,EAAYC,EAAaC,EAAOC,GAYzD,MAXAC,MAAKC,OAAO,GAGRD,KAAKF,MADa,mBAAX,GACIA,GAEA,EAEfE,KAAKE,aAAaN,GAAY,KAC9BI,KAAKG,WAAWN,GAAa,KAC7BG,KAAKI,SAAS,KACdJ,KAAKD,MAAMA,IAAO,EACXC,KA8LX,QAASK,gBAAeT,EAAYC,GAOhC,MANAG,MAAKM,QAAQ,SAASC,GAIlB,MAHKA,KACDA,EAAEC,OAAOC,OACbb,EAAWW,EAAGV,IACP,GAEJG,KAAKM,QAShB,QAASI,iBAAgBC,GACrB,MAAOC,WAAUD,GAAYE,KAQjC,QAASC,gBAAeH,GACpB,MAAOC,WAAUD,GAAYI,IAGjC,QAASC,cAAaC,GAElB,IADA,GAAIF,GAAI,EAAGF,EAAK,EACVI,GACFF,GAAYG,SAASD,EAAKE,WAC1BN,GAAcK,SAASD,EAAKG,YAC5BH,EAAOA,EAAKI,YAEhB;OAAQN,IAAKA,EAAKF,KAAMA,GAE5B,QAASS,eAAcL,GACnB,GAAIM,GAAMN,EAAKO,wBACXC,EAAOC,SAASD,KAChBE,EAAUD,SAASE,gBACnBC,EAAYrB,OAAOsB,aAAeH,EAAQE,WAAaJ,EAAKI,UAC5DE,EAAavB,OAAOwB,aAAeL,EAAQI,YAAcN,EAAKM,WAC9DE,EAAYN,EAAQM,WAAaR,EAAKQ,WAAa,EACnDC,EAAaP,EAAQO,YAAcT,EAAKS,YAAc,EACtDnB,EAAOQ,EAAIR,IAAOc,EAAYI,EAC9BpB,EAAOU,EAAIV,KAAOkB,EAAaG,CACnC,QAASnB,IAAKoB,KAAKC,MAAMrB,GAAMF,KAAMsB,KAAKC,MAAMvB,IAEpD,QAASD,WAAUK,GACf,MAAIA,GAAKO,sBACEF,cAAcL,GAEdD,aAAaC,GAU5B,QAASoB,wBAAuBC,GAI5B,OAH4B,gBAAjB,KACPA,EAAYA,EAAYC,eAEpBD,GACJ,IAAK,IACL,IAAK,OACL,IAAK,MACL,IAAK,IACL,IAAK,GACL,KAAK,EACD,OAAO,CACX;QACI,OAAO,GAUnB,QAASE,cAAaC,GAClB,MAAwB,IAApBA,EAAIC,QAAQ,KACL,IAEA,IAGf,QAASC,0BACL,MAAInC,QAAOoC,iBACApC,OAAOoC,kBAElB5C,KAAK6C,YAAY,EACjB7C,KAAK8C,SAAS,EACd9C,KAAK+C,cAAc,EACnB/C,KAAKgD,gBAAgB,EACrBhD,KAAKiD,SAAS,KACdjD,KAAKkD,SAAS,KACdlD,KAAKmD,SAAS,EACd3C,OAAOoC,iBAAiB5C,KAEjBA,MA0WX,QAASoD,gBAIL,MAHKpD,MAAKqD,UACNrD,KAAKqD,YAEFrD,KA4EX,QAASsD,YAAWC,EAAGC,GACnB,IAAK,GAAIC,KAAKD,GACW,kBAATA,GAAEC,KACVF,EAAEE,GAAGD,EAAEC,GACf,OAAOF,GAGX,QAASG,aAAYC,EAAIlD,EAAOH,GACxBqD,EAAGC,iBACHD,EAAGC,iBAAiBnD,EAAOH,GAAS,GAE/BqD,EAAGE,aACRF,EAAGE,YAAY,KAAKpD,EAAOH;CA2YnC,QAASwD,eAAcC,GA+BnB,MA9BA/D,MAAKgE,gBAAkBD,EACvB/D,KAAKiE,aAAa,uBAErBjE,KAAKkE,OAAS,KACdlE,KAAKmE,eAELnE,KAAKoE,YAAa,EAClBpE,KAAKqE,WAAa,OAClBrE,KAAKsE,OAAO,MACZtE,KAAKuE,WAAa,IAEfvE,KAAKwE,UAAU,EACfxE,KAAKyE,gBACLzE,KAAK0E,YACL1E,KAAK2E,mBACL3E,KAAK4E,YAEL5E,KAAK6E,QACJC,QAAQ,oBACRC,SAAS,oBACTC,QAAQ,kCACRC,QAAQ,2BACRC,aAAa,+BACbC,MAAM,aACNC,MAAM,4CAGPpF,KAAKqF,mBAAkB,GACvBC,gBAAgBtF,MAETA;CAzuCXQ,OAAO+E,gBAAkB/E,OAAOgF,WAAcC,QAAS,SAElDjF,OAAOkF,SACXA,OAAS,SAASC,GACjB,IAAK,GAAIpC,KAAKoC,GAAKD,OAAOnC,GAAGoC,EAAIpC,EACjC,OAAOmC,UAGTA,OAAOE,WAAW,SAASC,EAAKC,EAAIC,GAChC,GAAIC,GAAIxF,OAAOqF,EACVG,KACLxF,OAAOqF,GAAM,SAASF,GAClB,GAAIM,EAEJ,IAAIN,GAAqB,gBAAPA,KAAoBA,EAAIO,QAAQ,CAC9CD,EAAOD,EAAEG,MAAMnG,KAAM8F,EAAIM,MAAMN,EAAIM,MAAMT,GAAKU,UAE9C,KAAK,GAAI9C,KAAKmC,QACNI,EAAIvC,IAAIvD,KAAK8F,EAAIvC,IAAImC,OAAOnC,GAEpC,KAAK,GAAIA,KAAKoC,GACNG,EAAIvC,GAAIvD,KAAK8F,EAAIvC,IAAIoC,EAAIpC,IACF,IAAlBA,EAAEb,QAAQ,OACf1C,KAAK6D,YAAYN,EAAEoC,EAAIpC,QAI/B0C,GAAOD,EAAEG,MAAMnG,KAAKqG,UAExB,OADIP,GAAIQ,QAAQR,EAAIQ,OAAOtG,MACpBiG,GAAMjG;EAEjBQ,OAAOqF,GAAMU,UAAUP,EAAEO,UACrBR,GACAzC,WAAW9C,OAAOqF,GAAMU,UAAUR,KAG1CS,YACIC,IAAI,SAASC,EAAIC,GACb,GAAIX,GAAE,GAAIrG,sBAAoB,EAI9B,OAHAqG,GAAElG,MAAOuG,UAAUO,OAAO,EAC1BZ,EAAE5F,SAASuG,EACXX,EAAEa,QAAQH,GACHV,GAEXc,KAAK,SAASJ,EAAII,EAAKH,GACnB,GAAIX,GAAE,GAAIrG,sBAAoB,EAI9B,OAHAqG,GAAElG,MAAOuG,UAAUO,OAAO,EAC1BZ,EAAE5F,SAASuG,EACXX,EAAEa,QAAQH,GAAI,EAAKI,GACZd,GAEXe,QAAQ,SAASL,GACb,MAAO1G,MAAKyG,IAAIC,EAAI,MAAK,IAE7BM,SAAS,SAASN,EAAII,GAClB,MAAO9G,MAAK8G,KAAKJ,EAAII,EAAK,MAAK,KA4BvCnH,oBAAoBsH,MAAQ,EAQ5BtH,oBAAoB4G,UAAUW,iBAAiB,SAASrH,GACpD,GAAIsH,IAAO,CAmBX;MAlBAnH,MAAKoH,MAAM,WACP,GAAI,GAAgBvH,EAAwB,gBAClCA,EAAYI,OAAOoH,YAA+C,GAAjCxH,EAAYI,OAAOoH,YAAiB,CACvE,IAAKF,EACD,MAEJA,IAAK,EACLxH,oBAAoBsH,QACmB,kBAA5BpH,GAAYK,cACnBL,EAAYK,aAAaL,EAAYM,WAAY,KAAM,KAAM,KAAMN,GAEnEA,EAAYO,WACZP,EAAYO,SAASkH,KAAKtH,KAAKH,GAC/BA,EAAYO,SAAS,QAK9BJ,KAAKoH,OAUhBzH,oBAAoB4G,UAAUgB,cAAc,SAASrB,EAASsB,GAC1D,GAAIC,EAEJ,IAAIzH,KAAKC,OAAOyH,YAAY,CACxB,GAAIC,GAAO3H,KAAKC,OAAOyH,YAAYE,qBAAqB1B,EACxD,IAAmB,IAAhByB,EAAKf,QAAsC,IAAtBV,EAAQxD,QAAQ,KACpC,GAAIiF,GAAO3H,KAAKC,OAAOyH,YAAYE,qBAAsB1B,EAAQ2B,MAAM,KAAM,GACjFJ;EAAIE,EAAK,OAETF,GAAIzH,KAAKC,OAAO2B,eAEpB,IAAI6F,EAEA,MADAzH,MAAK8H,QAAO,EACLL,CAGX,KAAKzH,KAAK8H,QAAQC,MAAM,CACpB/H,KAAK8H,QAAO,CACZ,IAAIN,GAASxH,KAAKC,MAElB,OADAD,MAAKgI,cAAchI,KAAKC,OAAOgI,aAAaC,QAAQ,SAAS,KAAK,GAC3DlI,KAAKuH,cAAcrB,EAASsB,GAQvC,MALAW,aAAYC,WAAW,UAAW,iBAC7BZ,GAAQxH,KAAKC,OACdD,KAAKG,aAGFuB,SAAS2G,cAAc,QASlC1I,oBAAoB4G,UAAUyB,cAAc,SAASM,EAAWC,GAE5D,GAAKR,MAID/H,KAAKC,OAAO,GAAIuI,eAAc,oBAC9BxI,KAAKC,OAAOH,MAAME,KAAKF,MACvBE,KAAKC,OAAOwI,mBAAqB,aACjCzI,KAAKC,OAAmB,QAAEqI;IAPnB,CACP,GAAII,GAAS,GAAIC,UACjB3I,MAAKC,OAAOyI,EAAOE,gBAAgBN,EAAW,YAQ9CC,IAGAvI,KAAKE,cACLF,KAAKE,aAAaF,KAAKG,WAAY,KAAM,KAAM,KAAMH,MAErDA,KAAKI,WACLJ,KAAKI,WACLJ,KAAKI,SAAS,QAWtBT,oBAAoB4G,UAAUM,QAAQ,SAASgC,EAAUC,EAAUC,EAAUC,GACrEhJ,KAAKD,QACL8I,IAAqC,IAAzBA,EAASnG,QAAQ,KAAc,IAAM,KAAK,gBAAe,GAAKuG,OAAQC,WACtFlJ,KAAK6I,SAASA,EAGV7I,KAAKC,QADH8H,OAASvH,OAAqB,eACpB,GAAI2I,gBAEJ,GAAIX,eAAc,qBAG9BxI,KAAKF,QACLE,KAAKC,OAAOwI,mBAAmB,GAAIzI,MAAKkH,iBAAiBlH,OAC7DA,KAAKC,OAAOmJ,KAAKN,EAAW,OAAS,MAAOD,EAAU7I,KAAKF,OAEvDkJ,GACAhJ,KAAKC,OAAOoJ,iBAAiB,aAAc,mBAAmBC,UAAUC,UAAU,KAClFvJ,KAAKC,OAAOoJ,iBAAiB,eAAgB,aAGxCP,GACL9I,KAAKC,OAAOoJ,iBAAiB,eAAgB,qCAEjDrJ,KAAKC,OAAOoJ,iBAAiB,mBAAmB,kBAChDrJ,KAAKC,OAAOuJ,KAAK,MAAMT,GAElB/I,KAAKF,OACN,GAAKE,MAAKkH,iBAAiBlH;EAOnCL,oBAAoB4G,UAAUkD,WAAW,WAqBrC,MApBAzJ,MAAK0J,aAAe,KACpB1J,KAAK2J,mBAAqB,KAC1B3J,KAAK8H,OAAS,KACd9H,KAAKF,MAAQ,KACbE,KAAKD,MAAQ,KACbC,KAAK6I,SAAW,KAChB7I,KAAKE,aAAe,KACpBF,KAAKG,WAAa,KAClBH,KAAKC,OAAS,KACdD,KAAK4J,QAAU,KACf5J,KAAK6J,aAAe,KACpB7J,KAAK8J,mBAAqB,KAC1B9J,KAAK+J,mBAAqB,KAC1B/J,KAAK6G,QAAU,KACf7G,KAAKgI,cAAgB,KAErBhI,KAAKgK,gBAAkB,KACvBhK,KAAKiK,cAAgB,KACrBjK,KAAKuH,cAAgB,KACrBvH,KAAKkK,iBAAmB,KACjB,MAGXvK,oBAAoB4G,UAAU0D,cAAgB,SAASE,GAEnD,IAAK,GADDnE,MACKoE,EAAE,EAAGA,EAAED,EAAKE,WAAWzD,OAAQwD,IACpCpE,EAAEmE,EAAKE,WAAWD,GAAGvE,MAAMsE,EAAKE,WAAWD,GAAGE,KAClDtE;EAAa,UAAEmE,EAAKI,WAAWJ,EAAKI,WAAWC,UAAU,EACzD,KAAK,GAAIJ,GAAE,EAAGA,EAAED,EAAKM,WAAW7D,OAAQwD,IAAI,CACxC,GAAIvE,GAAKsE,EAAKM,WAAWL,GAAGlE,OACxBL,KACKG,EAAEH,KAAOG,EAAEH,OAChBG,EAAEH,GAAM6E,KAAK1K,KAAKiK,cAAcE,EAAKM,WAAWL,MAGxD,MAAOpE,IAyHXrD,uBAAuB4D,UAAUoE,oBAAoB,SAASC,GAC1DA,EAASC,YAAY,KACrBD,EAASE,YAAY,KACrBF,EAASG,YAAY,MAGzBpI,uBAAuB4D,UAAUyE,iBAAiB,SAASJ,EAAU/K,GACjE+K,EAASC,YAAY7K,KAAKiL,kBAC1BL,EAASE,YAAYjL,EACrBG,KAAKkL,eAAeN,EAAU/K,IAGlC8C,uBAAuB4D,UAAU2E,eAAe,SAASN,EAAU/K,GAC/D+K,EAASG,YAAYlL;EAGzB8C,uBAAuB4D,UAAU0E,kBAAkB,SAAS1K,GACxD,OAAKA,IAAGC,OAAOC,OAA+B,IAApBF,GAAGE,OAAO0K,OAGhC3K,OAAOoC,iBAAiBO,UACxB3C,OAAOoC,iBAAiBO,SAAS,EACjCzB,SAASD,KAAK2J,UAAU5K,OAAOoC,iBAAiBK,SAChDvB,SAASD,KAAK4J,YAAY7K,OAAOoC,iBAAiBM,UAC3C,IAGP1C,OAAOoC,iBAAiBE,UACxBtC,OAAOoC,iBAAiB0I,SAAS/K,GAErCC,OAAOoC,iBAAiBO,SAAS,EACjC3C,OAAOoC,iBAAiBK,SAASvB,SAASD,KAAK2J,UAC/C5K,OAAOoC,iBAAiBM,SAASxB,SAASD,KAAK4J,YAC/C7K,OAAOoC,iBAAiBG,cAAc/C,KACtCQ,OAAOoC,iBAAiBI,gBAAgBhD,KAAK8K,YAC7CpJ,SAASD,KAAK2J,UAAU5K,OAAOoC,iBAAiBqI,kBAChDvJ,SAASD,KAAK4J,YAAY7K,OAAOoC,iBAAiB2I,SAClD/K,OAAOoC,iBAAiB4I,UAAW,GAAIvC,OAAOC,UAG1C,GAAM3I,EAAgB,gBACtBA,EAAEkL,kBACK,IAEJ,GA3BP;EA8BJ9I,uBAAuB4D,UAAUgF,SAAS,SAAShL,GAC1CA,IACDA,EAAEC,OAAOC,MACb,IAAIiL,GAAQlL,OAAOoC,gBACnB,OAAI,GAAKqG,OAAQC,UAAUwC,EAAQF,SAAS,KAA5C,CAKA,IAAKE,EAAQ5I,SAAS,CAClB,IAAI4I,EAAQvI,SAcP,MAAOuI,GAAQJ,SAAS/K,GAAG,EAX5B,IAFAmL,EAAQ5I,SAAS4I,EAAQ1I,gBAAgB2I,gBAAgBD,EAAQ3I,cAAexC,IAE3EmL,EAAQ5I,SACT,MAAO4I,GAAQJ,UAEnBI,GAAQ5I,SAAS8I,cAAc,WAAW,OAAO,GACjDF,EAAQG,WAAWH,EAAQ5I,SAC3BpB,SAASD,KAAKqK,YAAYJ,EAAQ5I,UAClCpB,SAASD,KAAK2J,UAAUM,EAAQJ,SAChCI,EAAQvI,SAAS,EACjBuI,EAAQ5I,SAASiJ,QAAQvL,OACzBkL,EAAQM;CAKhB,GAAIN,EAAQ5I,SAASmJ,YAAczL,OAAOkB,SAASD,MAAQiK,EAAQG,WAAW,CAC1E,GAAIK,GAAMR,EAAQG,UAEdH,GAAQG,WAAWM,MACnBD,EAAIR,EAAQG,WAAWM,KAG3BD,EAAID,WAAWG,YAAYF,EAC3B,IAAIG,GAAUX,EAAQ5I,SAASiJ,OAM/B,IAJIG,EAAIH,SAAWG,EAAIH,QAAQnJ,iBAAiBC,aAC5CqJ,EAAIH,QAAQnJ,iBAAiBC,YAAYkI,YAAYuB,SAASJ,EAAIH,QAAQnJ,iBAAiBC,aAG3FkF,MAAM,CACN,GAAIwE,GAAM7K,SAAS2G,cAAc,MACjCkE,GAAIC,UAAUd,EAAQ5I,SAAS2J,UAC/Bf,EAAQ5I,SAASyJ,EAAI9B,WAAW,OAEhCiB,GAAQ5I,SAAS4I,EAAQ5I,SAAS4J,WAAU,EAEhDhB,GAAQ5I,SAASiJ,QAAQvL,OAGzBkL,EAAQG,WAAWM,IAAIT,EAAQ5I,SAC/BpB,SAASD,KAAKqK,YAAYJ,EAAQ5I,UAClCuJ,EAAQzJ,iBAAiBE,SAAS4I,EAAQ5I;CAG9C4I,EAAQ5I,SAAS6J,MAAM9L,KAAKN,EAAEqM,QAAQ,IACjClB,EAAQmB,GAAgB,GAAXnB,EAAQmB,GAAU,IAC/BnL,SAASD,KAAKM,YAAYL,SAASE,gBAAgBG,YAAY,KACpE2J,EAAQ5I,SAAS6J,MAAM5L,IAAIR,EAAEuM,QAAQ,GAChCpB,EAAQqB,GAAgB,GAAXrB,EAAQqB,GAAU,IAC/BrL,SAASD,KAAKI,WAAWH,SAASE,gBAAgBC,WAAW,IAElE,IAAI4F,EAIAA,GAHClH,EAAEyM,WAGDzM,EAAEyM,WAFAzM,EAAE0M,OAGVvB,EAAQwB,aAAazF,EAAGlH,KAG5BoC,uBAAuB4D,UAAU4G,uBAAuB,SAASC,GAE7D,GAAI5M,OAAOqF,KAAK,CAKZ,IAJA,GAAIlC,GAAK0J,OAAOC,OAAO9M,OAAOqF,MAAM0H,aAAalM,aAC7CwL,EAAK,EACLE,EAAK,EAEFpJ,GACHkJ,GAAIlJ,EAAGvC,WACP2L,GAAIpJ,EAAGxC,UACPwC,EAAGA,EAAGtC,YAGV;GAAKgM,OAAuB,iBAAE,CAC1B,GAAIG,GAAKH,OAAOzK,iBAAiBuK,uBAAuB,EACxDN,IAAqB,EAAjBW,EAAG3F,MAAM,KAAK,GAClBkF,GAAqB,EAAjBS,EAAG3F,MAAM,KAAK,GAGtB,GAAIuF,EACA,MAAOP,GAAG,IAAIE,CAEd/M,MAAK6M,GAAGA,EACZ7M,KAAK+M,GAAGA,EAEZ,MAAO,OAGXpK,uBAAuB4D,UAAU2G,aAAa,SAASvM,EAAYJ,GAC3D,GAAeI,EAAsB,aACjCX,KAAK6C,aACL7C,KAAK6C,YAAYkI,YAAYuB,SAAStM,KAAK6C,aAC/C7C,KAAK6C,YAAYlC,EACjBX,KAAK6C,YAAY7C,KAAK6C,YAAYkI,YAAY0C,QAAQzN,KAAK6C,YAAa7C,KAAK+C,cAAexC,EAAEqM,QAC1FrM,EAAEuM,QAASvM,GACfP,KAAK0N,gBAAiB3F,MAAQxH,EAAEyM,WAAazM,EAAE0M,QAE3C,GAAqC,QAAtBtM,EAAWuF,QAC1BlG,KAAKkN,aAAavM,EAAWsL,WAAY1L,IAErCP,KAAK6C,aACL7C,KAAK6C,YAAYkI,YAAYuB,SAAStM,KAAK6C,YAAatC,EAAEqM,QAASrM,EAAEuM,QAASvM,GAClFP,KAAK6C,YAAY,EAEb7C,KAAK2N,aACL3N,KAAK2N;EAKrBhL,uBAAuB4D,UAAU+E,SAAS,SAAS/K,EAAGqN,GAClD,GAAIlC,GAAQlL,OAAOoC,gBAEnB,KAAKgL,EAAK,CACNlC,EAAQmC,gBACR,IAAIlG,GAAO+D,EAAQ7I,WACnB6I,GAAQ7I,YAAY,KAEhB8E,GACAA,EAAKoD,YAAY+C,MAAMpC,EAAQ3I,cAAe2I,EAAQ1I,gBAAiB2E,EAClEI,MAAQtH,MAAMuM,WAAazM,EAAE0M,QAE1CvB,EAAQ7I,YAAY,KAEf6I,EAAgB,UAAIA,EAAQ5I,SAASmJ,YAAcvK,SAASD,MAC7DiK,EAAQ5I,SAASmJ,WAAWG,YAAYV,EAAQ5I,UACpD4I,EAAQ5I,SAAS,EACjB4I,EAAQG,WAAW,EACnBH,EAAQmB,GAAG,EACXnB,EAAQqB,GAAG,EACXrB,EAAQ3I,cAAc,EACtB2I,EAAQ1I,gBAAgB,EACxBtB,SAASD,KAAK2J,UAAUM,EAAQzI,SAChCvB,SAASD,KAAK4J,YAAYK,EAAQxI,SAClCwI,EAAQzI,SAAS,KACjByI,EAAQxI,SAAS,KACjBwI,EAAQvI,SAAS;EAGrBR,uBAAuB4D,UAAUsH,eAAe,SAASE,GACjDA,GACAvN,OAAOoC,iBAAiB0I,SAAS,EAAG,EAExC,KAAK,GAAIlB,GAAI,EAAGA,EAAI5J,OAAO8M,OAAO1G,OAAQwD,IACtC,IACS5J,OAAO8M,OAAOlD,IAAM2D,GAAOvN,OAAO8M,OAAOlD,GAAmB,kBAC7D5J,OAAO8M,OAAOlD,GAAGxH,iBAAiBiL,eAAerN,QACvD,MAAMD,IAGZ,IACS8M,OAAuB,kBAAIA,QAAU7M,QAAU6M,QAAUU,GAC1DV,OAAOzK,iBAAiBiL,eAAerN,QAC7C,MAAMD,MAGZoC,uBAAuB4D,UAAUyF,eAAe,SAAS+B,EAAKH,GACtDG,IACAvN,OAAOoC,iBAAiBqI,oBACxBzK,OAAOoC,iBAAiBG,cAAcgL,EAAInL,iBAAiBG,cAC3DvC,OAAOoC,iBAAiBI,gBAAgB+K,EAAInL,iBAAiBI,gBAC7DxC,OAAOoC,iBAAiBE,SAASiL,EAAInL,iBAAiBE,SACtDtC,OAAOoC,iBAAiBiJ,WAAWkC,EAAInL,iBAAiBE,SACxDtC,OAAOkB,SAASD,KAAK2J,UAAU5K,OAAOoC,iBAAiB0I,SACvD9K,OAAO2C,SAAS,GAET4E,OAAQ,KAAYiG,OAAiB,IAARC,QAChCzN,OAAOoC,iBAAiBuK,yBAEhC;IACSE,OAAuB,kBAAIA,QAAU7M,QAAU6M,QAAUU,GAC1DV,OAAOzK,iBAAiBoJ,eAAexL,QAC9C,MAAMD,IAEP,IAAK,GAAI6J,GAAI,EAAGA,EAAI5J,OAAO8M,OAAO1G,OAAQwD,IACtC,IACS5J,OAAO8M,OAAOlD,IAAM2D,GAAOvN,OAAO8M,OAAOlD,GAAmB,kBAC7D5J,OAAO8M,OAAOlD,GAAGxH,iBAAiBoJ,eAAexL,QAAWuN,GAAKH,EAAQ,EAAI,GACnF,MAAMrN,MAIhByN,OAAQ,EACRjG,OAAQ,EACRmG,UAAW,EACXC,UAAW,EACXC,UAAW,EACXC,WAAY,EACZJ,OAAQ,EACRK,UAAW,EACXC,UAAW,EAEqC,IAA5CjF,UAAUC,UAAU7G,QAAQ,eAC5B0L,UAAS,GAGT9E,UAAUC,UAAUhH,cAAcG,QAAQ,UAAU,KACpD2L,WAAU,GAEgC,IAAzC/E,UAAUC,UAAU7G,QAAQ,WAA+D,IAA5C4G,UAAUC,UAAU7G,QAAQ,cAC5E4L,SAAWE,WAAWlF,UAAUC,UAAUkF,OAAOnF,UAAUC,UAAU7G,QAAQ,UAAU,EAAG,IAEtF4L,SAAW,KACXN,OAAM,EACNC,MAAQ,KAERE,UAAS,GACkC,IAAxC7E,UAAUC,UAAU7G,QAAQ,UACnCwL,UAAS,EACTK,SAASC,WAAWlF,UAAUC,UAAUkF,OAAOnF,UAAUC,UAAU7G,QAAQ,SAAS,EAAG,KAIxC,IAA1C4G,UAAUoF,QAAQhM,QAAQ,cAC/BqF,OAAM,EAC0C,IAA3CuB,UAAUqF,WAAWjM,QAAQ,aAA+D,IAA3C4G,UAAUqF,WAAWjM,QAAQ,aAAgE,IAA5C4G,UAAUqF,WAAWjM,QAAQ,cAA8C,cAAvBhB,SAASkN,aAChK7G,MAAM,IAEmB,YAAtBuB,UAAUoF,SAAoE,IAA1CpF,UAAUC,UAAU7G,QAAQ,WAE1EqF,MAAM,GAEHiG,OAAM,EACNC,MAAQO,WAAWlF,UAAUC,UAAU1B,MAAM,OAAO,KAKxDlI,oBAAoB4G,UAAUqD,QAAQ,SAASiF,EAAUC,EAAQC,EAAWC,GACxE,GAAIb,WAAcpG,QAAUvH,OAAOyO,YAC/B,MAAOjP,MAAK6J,aAAagF,EAAUC,EAEvC;GAAI/G,MAgBA,MAfK+G,KAIGA,EAHC9O,KAAKC,OAAOiP,SAGNlP,KAAKC,OAFLD,KAAKC,OAAOyH,aAItBoH,GACD3G,YAAYC,WAAW,UAAW,iBAC7B0G,GAAQ9O,KAAKC,OACdD,KAAKG,aAGT4O,GACAD,EAAOK,YAAY,sBAAuB,cAAcJ,EAAU,KAEnD,UAAfC,EACOF,EAAOM,iBAAiBP,GAGxBC,EAAOO,YAAYR,IAAW,GAAIS,OAAM,EAGnD,IAAIC,GAAUT,CAETA,KAKGA,EAJC9O,KAAKC,OAAOiP,SAINlP,KAAKC,OAHLD,KAAKC,OAAOyH,aAOtBoH,GACD3G,YAAYC,WAAW,UAAW,iBAC7B0G,GAAQ9O,KAAKC,OACdD,KAAKG,aAG8B,IAAvC2O,EAAOI,SAASxM,QAAQ,YACxB6M,EAAQT,GAGRS,EAAQT,EACRA,EAAOA,EAAOU,cAElB;GAAIC,GAAUR,YAAYS,QAEP,WAAfV,IACAS,EAAQR,YAAYU,wBACxB,IAAIC,MACAC,EAAMf,EAAOgB,SAASjB,EAAUU,EAAS,WACzC,MAAOR,IACRU,EAAS,KAEZ,IAAIA,GAAWR,YAAYU,wBACvB,MAAOE,GAAIE,eAIf,KAFA,GAAIC,GAAcH,EAAII,cAEfD,GACHJ,EAAQA,EAAQhJ,QAAQoJ,EACxBA,EAAYH,EAAII,aAEpB,OAAOL,IAWfxM,aAAamD,UAAU2J,WAAW,SAASC,EAAMC,GAC7CpQ,KAAKqD,QAAQ8M,GAAMC,GAGvBhN,aAAamD,UAAU6B,WAAW,SAAS+H,EAAMtK,EAAMwK,GACnD,MAAIrQ,MAAKqD,QAAQ8M,GACNnQ,KAAKqD,QAAQ8M,GAAMA,EAAMtK,EAAMwK,GAEtCrQ,KAAKqD,QAAa,IACXrD,KAAKqD,QAAa,IAAE8M,EAAMtK,EAAMwK,IAE3C7P,OAAO8P,MAAM,eAAejK,UAAU,GAAG,kBAAkBA,UAAU,IAC9D;EAGX7F,OAAO2H,YAAY,GAAI/E,cAKvBzD,oBAAoB4G,UAAUsD,aAAa,SAASgF,EAAUC,GAE1D,GAAIrH,GAAIoH,EAAS3G,QAAQ,UAAW,KAAKL,MAAM,KAC3ClC,EAAM,KACNyE,EAAI,CAER,KAAK3C,EAAEb,OACH,QAEJ,IAAY,KAARa,EAAE,GACF9B,GAAKmJ,OAAc,CAAA,GAAa,KAATrH,EAAE,GAIzB,QAHA9B,IAAK3F,KAAKC,OAAOyH,aAAa1H,KAAKC,QAAQ2H,qBAAqBH,EAAE2C,GAAGlC,QAAQ,cAAe,KAC5FkC,IAIJ,IAAKA,EAAGA,EAAI3C,EAAEb,OAAQwD,IAAIzE,EAAI3F,KAAK2J,mBAAmBhE,EAAK8B,EAAE2C,GAI7D,OAF2B,IAAvB3C,EAAE2C,EAAE,GAAG1H,QAAQ,OACfiD,EAAI3F,KAAK0J,aAAa/D,EAAK8B,EAAE2C,EAAE,KAC5BzE,GAGXhG,oBAAoB4G,UAAUmD,aAAa,SAASnG,EAAGC,GAInD,IAAK,GAHDC,MACAD,EAAIA,EAAE0E,QAAQ,cAAe,IAAIA,QAAQ,aAAc,IAElDkC,EAAI,EAAGA,EAAI7G,EAAEqD,OAAQwD,IACtB7G,EAAE6G,GAAGmG,aAAa/M,KAClBC,EAAEA,EAAEmD,QAAQrD,EAAE6G,GAEtB;MAAO3G,IAGX9D,oBAAoB4G,UAAUoD,mBAAmB,SAASpG,EAAGC,GACzD,GAAIC,KAEA0K,YACA3K,EAAEA,EAAEgN,cAER,KAAK,GAAIpG,GAAI,EAAGA,EAAI7G,EAAEqD,OAAQwD,IAAI,IAAK,GAAIqG,GAAI,EAAGA,EAAIlN,EAAE6G,GAAGK,WAAW7D,OAAQ6J,IACtEtC,SACI5K,EAAE6G,GAAGK,WAAWgG,GAAGvK,SAAS3C,EAAE6G,GAAGK,WAAWgG,GAAGvK,QAAQsK,eAAiBhN,IACxEC,EAAEA,EAAEmD,QAAQrD,EAAE6G,GAAGK,WAAWgG,IAG3BlN,EAAE6G,GAAGK,WAAWgG,GAAGvK,SAAW1C,IACnCC,EAAEA,EAAEmD,QAAQrD,EAAE6G,GAAGK,WAAWgG,GAGpC,OAAOhN,IAoBX9D,oBAAoB4G,UAAUmK,OAAO,KACrC/Q,oBAAoB4G,UAAU2D,iBAAiB,SAASyG,EAAWC,EAAYF,GACtEA,IACDA,EAAO1Q,KAAK0Q,QAEZA,EAAOhJ,cACPgJ,EAAOA,EAAOhJ,YAClB;GAAImJ,GACA7Q,KAAK4J,QAAQ,uCAAuC+G,EAAU,KAAMD,EAChE,uCAAyC,SAE7CG,KACAA,EAAKtG,WAAWC,UAAUoG,IAGlCjR,oBAAoB4G,UAAUuD,mBAAmB,SAAS4G,EAAQzQ,GACzDyQ,IACDA,EAAO1Q,KAAK0Q,QAEZA,EAAOhJ,cACPgJ,EAAOA,EAAOhJ,aAEbzH,IACDA,EAAOD,KAAKC,QAEZA,EAAOyH,cACPzH,EAAOA,EAAOyH,YAGlB,IAAIoJ,EAEJ,IAAK/I,MAME,CACH+I,EAAS,GAAItI,eAAc,yBAC3B,KACIvI,EAAO8Q,sBAAsBL,EAAQI,GACxC,MAAMvQ,GACHuQ,EAAS7Q,EAAO+Q,cAAcN,QAV7B1Q,MAAKiR,eACNjR,KAAKiR,aAAa,GAAIC,eACtBlR,KAAKiR,aAAaE,iBAAiBT,IAEvCI,EAAS9Q,KAAKiR,aAAaG,oBAAoBnR,EASnD;MAAO6Q,IAGXnR,oBAAoB4G,UAAUwD,mBAAmB,SAAS2G,EAAQzQ,GAC9D,GAAIoR,GAAMrR,KAAK8J,mBAAmB4G,EAAQzQ,EAC1C,OAAgB,gBAAP,GACEoR,EACJrR,KAAKgK,gBAAgBqH,IAGhC1R,oBAAoB4G,UAAUyD,gBAAgB,SAAS/J,GAKnD,GAJKA,IACDA,EAAOD,KAAKC,QACZA,EAAOyH,cACPzH,EAAOA,EAAOyH,aACbK,MAID,MAAO9H,GAAOqR,GAHd,IAAIC,GAAgB,GAAIC,cACxB,OAAOD,GAAcE,kBAAkBxR,IAS/CqF,gBAAgB,SAASK,KACrBA,IAAI9B,YAAY,SAASgC,EAAM6L,EAASC,GAKpC,MAJA9L,GAAK,MAAMA,EAAKtD,cACXvC,KAAK6F,KACN7F,KAAK6F,GAAM,GAAI7F,MAAK4R,aAAaD,GAAS3R,OAEvC6F,EAAK,IAAI7F,KAAK6F,GAAMgM,SAASH;EAExC/L,IAAImM,UAAU,SAASjM,EAAMkM,GAEzB,MADAlM,GAAK,MAAMA,EAAKtD,cACZvC,KAAK6F,GACE7F,KAAK6F,GAAMM,MAAMnG,KAAM+R,IAC3B,GAEXpM,IAAIqM,WAAW,SAASnM,GACpB,QAAU7F,KAAK,MAAM6F,EAAKtD,gBAE9BoD,IAAIiM,aAAa,SAASjM,KACtB,GAAIsM,cACAxK,EAAI,WAEJ,IAAK,GADD4J,IAAM,EACDjH,EAAI,EAAGA,EAAI6H,UAAUrL,OAAQwD,IAClC,GAAI6H,UAAU7H,GAAG,CACb,GAAI8H,GAAKD,UAAU7H,GAAGjE,MAAMR,IAAKU,UACjCgL,GAAIA,GAAKa,EAGjB,MAAOb,GAYX,OAVA5J,GAAEoK,SAAS,SAASM,IAGhB,MAFmB,kBAAR,MACPA,GAAGC,KAAKD,KACRA,GACOF,UAAUvH,KAAKyH,IAAI,GACvB,GAEX1K,EAAE4K,YAAY,SAASC,GACnBL,UAAUK,GAAI,MAEX7K,GAEX9B,IAAI4M,YAAY,SAASD,GACrB,GAAIA,EAAG,CACH,GAAIE,GAAOF,EAAGzK,MAAM,IACpB7H;KAAKwS,EAAK,IAAIH,YAAYG,EAAK,MAGvC7M,IAAI8M,gBAAkB,WAClB,IAAK,GAAI5M,KAAQ7F,MACa,IAAtB6F,EAAKnD,QAAQ,SACb1C,KAAKuS,YAAY1M,GACjB7F,KAAK6F,GAAQ,OAIzBF,IAAM,MAENnF,OAAOkF,SACVlF,OAAOkF,WAER,WAEC,QAASiB,GAAS+L,EAAQ5B,GACxB,GAAI6B,GAAWD,EAAO/L,QACtBiM,IAAS,GACTF,EAAOnR,IAAI0K,WAAWG,YAAYsG,EAAOnR,KACzCsR,EAAeH,EAAOnR,IAAM,KACxBoR,GACHA,EAAS7B,GAEZ,QAASgC,GAAUvS,GAClB,GAAIsS,EAAa,CAChBtS,EAAIA,GAAGE,KACP,IAAIsS,GAAOxS,EAAEyS,OAAOvS,MAAMwS,OAS1B,OARIvN,QAAOwN,QAAQC,YACN,IAARJ,GAAsB,IAARA,IACjBpM,EAASkM,GAAc,GACZ,IAARE,GACHpM,EAASkM,GAAc,IAErBtS,EAAEkL,gBACLlL,EAAEkL,mBACMlL,EAAE6S,cAAe,IAQ5B,QAASR,GAAShF,GACbgF,EAASS,QACZT,EAASS,MAAQ3R,SAAS2G,cAAc,OAExCuK,EAASS,MAAMC,UAAYR,EAC3BF,EAASS,MAAME,UAAY,kBAC3B7R,SAASD,KAAKqK,YAAY8G,EAASS,OAEtB3R;SAASD,KAAK+R,YAC5BZ,GAASS,MAAM1G,MAAM8G,QAAU7F,EAAK,eAAe,OAGpD,QAASzC,GAAOuI,EAAM5C,EAAQ6C,GAE7B,GAAIJ,GAAYI,EAAMA,EAAOD,GAAQ,GACjCE,EAAa,UAAU,EAAYrR,cAAc2F,QAAQ,KAAM,KAAK,SACxE,OAAO,mCAAmC0L,EAAW,aAAa9C,EAAO,WAAW4C,EAAK,eAG1F,QAASG,GAAKH,GACR1N,EAAE8N,OACN9N,EAAE8N,KAAOpS,SAAS2G,cAAc,OAChCrC,EAAE8N,KAAKP,UAAY,sBACnBvN,EAAE8N,KAAKnH,MAAM3G,EAAE+N,UAAU,MACzBrS,SAASD,KAAKqK,YAAY9F,EAAE8N,OAG7B9N,EAAEgO,KAAKN,EAAKpB,GACZ,IAAIY,GAAUxR,SAAS2G,cAAc,MAqBrC,OApBA6K,GAAQ1G,UAAY,QAAQkH,EAAKA,KAAK,SACtCR,EAAQK,UAAY,sBAAwBG,EAAKvD,KACjD+C,EAAQe,QAAU,WACjBjO,EAAEgO,KAAKN,EAAKpB,IACZoB,EAAO;EAGU,UAAd1N,EAAE+N,UAAwB/N,EAAE8N,KAAKvJ,WACpCvE,EAAE8N,KAAKI,aAAahB,EAAQlN,EAAE8N,KAAKvJ,YAEnCvE,EAAE8N,KAAKhI,YAAYoH,GAEhBQ,EAAKS,OAAS,IACjBnO,EAAEoO,OAAOV,EAAKpB,IAAI9R,OAAO6T,WAAW,WACnCrO,EAAEgO,KAAKN,EAAKpB,KACVoB,EAAKS,SAETnO,EAAEsO,KAAKZ,EAAKpB,IAAMY,EAClBA,EAAU,KAEHQ,EAAKpB,GAEb,QAASiC,GAAc7B,EAAQ8B,EAAIC,GAClC,GAAIlT,GAAMG,SAAS2G,cAAc,MACjC9G,GAAIgS,UAAY,4BAA4Bb,EAAOvC,KACnD5O,EAAImT,aAAa,SAAU,EAE3B,IAAIC,GAAQ,EASZ,IAPIjC,EAAOkC,QACVrT,EAAIoL,MAAMiI,MAAQlC,EAAOkC,OACtBlC,EAAOmC,SACVtT,EAAIoL,MAAMkI,OAASnC,EAAOmC,QACvBnC,EAAOoC,QACVH,GAAO,mCAAmCjC,EAAOoC,MAAM,UACxDH,GAAO,yCAAyCjC,EAAOqC,QAAQ,GAAGrC,EAAOgB,MAAM,oDAC3Ec,EAAG,CACN,GAAIQ,GAAWtC,EAAO8B,IAAMhP,UAAUyP,OAAOC,OAAOC,UAErCC;SAAZJ,IAAuBA,EAAU,MACpCL,GAASxJ,EAAO6J,GAAS,EAAM,MAEhC,GAAIP,EAAO,CACV,GAAIY,GAAe3C,EAAO+B,QAAUjP,UAAUyP,OAAOC,OAAOI,cACzCF,UAAhBC,IAA2BA,EAAc,UAC5CV,GAASxJ,EAAOkK,GAAa,EAAO,UAErC,GAAI3C,EAAO6C,QACV,IAAK,GAAInL,GAAE,EAAGA,EAAEsI,EAAO6C,QAAQ3O,OAAQwD,IACtCuK,GAASxJ,EAAOuH,EAAO6C,QAAQnL,GAAGA,EAKpC,IAHAuK,GAAS,SACTpT,EAAIiL,UAAYmI,EAEZjC,EAAOqC,QAAQ,CAClB,GAAI5K,GAAOuI,EAAOqC,OACC,iBAAR5K,KACVA,EAAOzI,SAAS8T,eAAerL,IACN,QAAtBA,EAAKwC,MAAM8G,UACdtJ,EAAKwC,MAAM8G,QAAU,IACtBlS,EAAIkJ,WAAWiI,EAAOoC,MAAM,EAAE,GAAGhJ,YAAY3B,GAiB9C,MAdA5I,GAAI0S,QAAU,SAAS1T,GACtBA,EAAIA,GAAIE,KACR,IAAIgV,GAASlV,EAAE0M,QAAU1M,EAAEyM,UAE3B,IADKyI,EAAOlC,YAAWkC,EAASA,EAAOxJ,YACD,uBAAlCwJ,EAAOlC,UAAU1L,MAAM,KAAK,GAA4B,CAC3D,GAAIiJ,GAAS2E,EAAOlF,aAAa,SACjCO;EAAoB,QAAVA,IAA8B,SAAVA,GAAkB,EAAMA,GACtDnK,EAAS+L,EAAQ5B,KAGnB4B,EAAOnR,IAAMA,GACTiT,GAAIC,KACP5B,EAAeH,GAETnR,EAER,QAASmU,GAAWhD,EAAQ8B,EAAIC,GAC/B,GAAIlT,GAAMmR,EAAOxM,QAAUwM,EAAS6B,EAAc7B,EAAQ8B,EAAIC,EAEzD/B,GAAOiD,QACX/C,GAAS,GACVlR,SAASD,KAAKqK,YAAYvK,EAC1B,IAAIqU,GAAIzT,KAAK0T,IAAI1T,KAAK2T,QAAQtV,OAAOuV,YAAYrU,SAASE,gBAAgBoU,aAAezU,EAAIyU,aAAa,IACtGC,EAAI9T,KAAK0T,IAAI1T,KAAK2T,QAAQtV,OAAO0V,aAAaxU,SAASE,gBAAgBuU,cAAgB5U,EAAI4U,cAAc,GAa7G,OAXC5U,GAAIoL,MAAM5L,IADY,OAAnB2R,EAAOqB,SACM,OAEAkC,EAAE,KACnB1U,EAAIoL,MAAM9L,KAAO+U,EAAE,KAEnBrU,EAAI+R,UAAYR,EAEhBvR,EAAI6U,QACA1D,EAAOiD,QACVjQ,OAAO2Q,SAASrC,KAAKzS,GAEfA,EAGR,QAAS+U,GAAW5D,GACnB,MAAOgD,GAAWhD,GAAQ,GAAM;CAEjC,QAAS6D,GAAa7D,GACrB,MAAOgD,GAAWhD,GAAQ,GAAM,GAEjC,QAAS8D,GAAS9D,GACjB,MAAOgD,GAAWhD,GAEnB,QAAS+D,GAAW/C,EAAMvD,EAAMxJ,GAQ/B,MAPmB,gBAAR+M,KACS,kBAARvD,KACVxJ,EAAWwJ,EACXA,EAAO,IAERuD,GAAQA,KAAKA,EAAMvD,KAAKA,EAAMxJ,SAASA,IAEjC+M,EAER,QAASrD,GAAOqD,EAAMvD,EAAMgE,EAAQ7B,GAKnC,MAJmB,gBAARoB,KACVA,GAAQA,KAAKA,EAAMvD,KAAKA,EAAMgE,OAAOA,EAAQ7B,GAAGA,IACjDoB,EAAKpB,GAAKoB,EAAKpB,IAAItM,EAAE0Q,MACrBhD,EAAKS,OAAST,EAAKS,QAAQnO,EAAEmO,OACtBT,EAxLR,GAAIb,GAAe,IAwBfnR,UAASmC,YACZnC,SAASmC,YAAY,YAAaiP,GAElCpR,SAASkC,iBAAiB,UAAWkP,GAAW,GA+JjDpN,OAAO4K,MAAQ,WACd,GAAIoD,GAAO+C,EAAWtQ,MAAMnG,KAAMqG,UAElC,OADAqN,GAAKvD,KAAOuD,EAAKvD,MAAQ,UAClBmG,EAAW5C,IAEnBhO,OAAOiR,QAAU,WAChB,GAAIjD,GAAO+C,EAAWtQ,MAAMnG,KAAMqG,UAElC;MADAqN,GAAKvD,KAAOuD,EAAKvD,MAAQ,QAClBoG,EAAa7C,IAErBhO,OAAO2Q,SAAW,WACjB,GAAI3C,GAAO+C,EAAWtQ,MAAMnG,KAAMqG,UAElC,OADAqN,GAAKvD,KAAOuD,EAAKvD,MAAQ,QAClBqG,EAAS9C,IAEjBhO,OAAO2Q,SAASrC,KAAO,SAAS7J,GAC/B,KAAOA,GAAQA,EAAKoG,eAAiBpG,EAAKoG,aAAa,WACtDpG,EAAOA,EAAK8B,UACT9B,KACHA,EAAK8B,WAAWG,YAAYjC,GAC5ByI,GAAS,IAGX,IAAI5M,GAAIN,OAAOwN,QAAU,SAASQ,GACjCA,EAAOrD,EAAOlK,MAAMnG,KAAMqG,WAC1BqN,EAAKvD,KAAOuD,EAAKvD,MAAM,MAEvB,IAAIyG,GAAUlD,EAAKvD,KAAKtI,MAAM,KAAK,EACnC,QAAQ+O,GACP,IAAK,QACJ,MAAON,GAAW5C,EACnB,KAAK,UACJ,MAAO6C,GAAa7C,EACrB,KAAK,WACJ,MAAO8C,GAAS9C,EACjB,SACC,MAAOG,GAAKH,IAIf1N,GAAE6Q,MAAO,GAAK5N,OAAQC,UACtBlD,EAAE0Q,IAAM,WAAW,MAAO1Q,GAAE6Q;EAC5B7Q,EAAEmO,OAAS,IACXnO,EAAEmN,UAAW,EACbnN,EAAE+N,SAAW,MACb/N,EAAEsO,QACFtO,EAAEoO,UAEFpO,EAAE8Q,QAAU,WACX,IAAK,GAAIC,KAAO/Q,GAAEsO,KACjBtO,EAAEgO,KAAK+C,IAET/Q,EAAEgO,KAAO,SAAS1B,GACjB,GAAI3M,GAAMK,EAAEsO,KAAKhC,EACb3M,IAAOA,EAAIsG,aACdzL,OAAO6T,WAAW,WACjB1O,EAAIsG,WAAWG,YAAYzG,GAC3BA,EAAM,MACL,KACFA,EAAI4N,WAAW,UAEZvN,EAAEoO,OAAO9B,IACX9R,OAAOwW,aAAahR,EAAEoO,OAAO9B,UACvBtM,GAAEsO,KAAKhC,QA2CjBxO,cAAcyC,WAOb0Q,mBAAmB,SAASrJ,EAAKsJ,GAC1BlX,KAAKsE,OAAOsJ,EAClB5N,KAAKmX,OAAOD,GAEVE,OAAO,SAASC,GACf,MAAIrX,MAAKsX,KACDC,mBAAmBF,GAEhBD,OAAOC,IAOtBhS,kBAAkB,SAASuI,GACpB5N,KAAKsX,KAAKjV,uBAAuBuL;EAOxC4J,eAAe,SAASC,GACvBzX,KAAK0X,SAAwB,gBAAPD,GAAiBA,EAAI5P,MAAM,KAAK4P,GAOvDE,aAAa,WACZ,OAAQ3X,KAAKmE,YAAYyC,QAO1BgR,gBAAgB,SAAShK,GACxB5N,KAAK6X,OAAOxV,uBAAuBuL,IAOpCkK,sBAAsB,SAASlK,GAC9B5N,KAAK+X,SAAS1V,uBAAuBuL,IAOtCoK,cAAc,SAASpK,EAAKqK,GAC3BjY,KAAKoE,WAAoB,QAANwJ,EACnB5N,KAAKqE,WAAauJ,EAClB5N,KAAKiY,IAAIA,GAEVC,OAAO,SAASnF,EAAKoF,GACpBnY,KAAKoY,cAAa,EAClBrF,EAAKzL,KAAK6Q,GAAQ3X,QAClBR,KAAKoY,cAAa,GASnBC,WAAW,SAASC,EAAMC,EAAM3K,GAC/B,IAAI5N,KAAKoY,aAAT,CACA,GAAII,GAAIxY,KAAKyY,QAAQH,EAErB1K;EAAKA,GAAM,SACX,IAAI8K,GAAW1Y,KAAK2F,IAAIgT,YAAYL,EAAMtY,KAAKiE,aAC3CyU,IAAoB,WAAR9K,IAAmBA,EAAK8K,GACpCH,GACHvY,KAAK4Y,YAAYN,GAAM,GACvBtY,KAAKmE,YAAYqU,GAAKF,EACtBtY,KAAK2F,IAAIkT,YAAYP,EAAMtY,KAAKiE,aAAa2J,GACzC5N,KAAKyE,aAAa6T,KACrBtY,KAAKyE,aAAa6T,GAAO,SAErBtY,KAAK8Y,WAAWR,KACpBtY,KAAKmE,YAAY4U,OAAOP,EAAI,GAC5BxY,KAAK2F,IAAIkT,YAAYP,EAAMtY,KAAKiE,aAAa,KAK1CsU,GACJvY,KAAKgZ,iBAAiBV,GAEvBtY,KAAKiZ,QAAQX,EAAMC,EAAM3K,GACrB2K,GAASvY,KAAKoE,YAAYpE,KAAKkZ,SAASZ,KAE7CU,iBAAiB,aACjBC,QAAQ,SAAS3G,EAAGiG,EAAM3K,GACzB,GAAInL,GAAI,GACJwC,EAAQjF,KAAK8Y,WAAWxG,EAK5B,IAJIrN,IACGxC,EAAIzC,KAAK6E,OAAOI,GAChBsT,GAAM,GAETvY,KAAK8R,UAAU,aAAaQ,EAAGiG,EAAM3K,EAAK3I,MAE7CxC,EAAIzC,KAAK6E,OAAO0T,EAAM3K,EAAK,SAASnL,EAE9BzC,KAAK2F,IAAI3F,KAAKmZ,SAAS,IAAI7G,EAAG7P,GAEhCwC,GAAWA,EAAQmU,SAAQ,CAC9B3W,GAAKzC,KAAK6E,OAAOI,EAAQ,QACzB;IAAK,GAAImF,GAAE,EAAGA,EAAInF,EAAQmU,QAAQxS,OAAQwD,IACrCnF,EAAQmU,QAAQhP,IACbpK,KAAK2F,IAAI3F,KAAKmZ,SAAS,IAAI7G,EAAGlI,EAAE3H,KAI3C4W,SAAS,SAAS/G,GACjB,MAAOtS,MAAK2F,IAAIgT,YAAYrG,EAAGtS,KAAKiE,eAErC6U,WAAW,SAASxG,GACnB,MAAOtS,MAAK0E,SAAS4N,IAEtBsG,YAAY,SAAStG,EAAG1E,EAAKwL,GACxBA,IAASxL,GAAMtD,MAAMsD,EAAMwL,QAAQA,EAASE,SAAS,WAAY,MAAOtZ,MAAKsK,MAAMgP,cACvFtZ,KAAK0E,SAAS4N,GAAI1E,GAOnB2L,kBAAkB,WACjB,OAAO,GAORL,SAAS,SAASZ,GACjB,OAAItY,KAAKwE,WAA+B,QAAjBxE,KAAK2F,IAAI6T,SAAkBxZ,KAAK2F,IAAI8T,KACvDzZ,KAAK2F,IAAI+T,UAAU1Z,KAAK2F,IAAI+T,WAGb,mBAATpB,IAAwBtY,KAAKmX,OAAenX,KAAK2Z,cACvD3Z,KAAKyE,aAAa6T,IAAe,GAErCtY,KAAK4E,aACA5E,KAAKuZ,kBAAkBjB,IAAUtY,KAAK8R,UAAU,qBAAqBwG,EAAMtY,KAAK4E,YAAmB,MACxG5E,MAAK4Z,gBAAgB5Z,KAAK6Z,YAAYvB,GAAOA,KAT7C;EAWEsB,gBAAgB,SAASvC,EAAKiB,GAC7B,MAAKtY,MAAK8R,UAAU,kBAAkBwG,EAAMtY,KAAKqZ,SAASf,GAAOjB,QACpErX,MAAK8Z,UAAUzC,EAAKiB,IAD+D,GAGjFyB,UAAU,SAAS1C,EAAM/E,GACxB,GAAmB,gBAAR+E,GACV,MAAOA,EACR,IAAiB,mBAAN/E,GACV,MAAOtS,MAAKga,cAAc3C,EAAK,GAE/B,IAAI4C,MACAC,IACJ,KAAK,GAAInD,KAAOM,GACXA,EAAK8C,eAAepD,KACvBkD,EAAMvP,KAAK1K,KAAKga,cAAc3C,EAAKN,GAAKA,EAAI/W,KAAKuE,aACjD2V,EAAKxP,KAAKqM,GAKZ,OAHAkD,GAAMvP,KAAK,OAAO1K,KAAKoX,OAAO8C,EAAKE,KAAK,OACpC1U,OAAO2U,cACbJ,EAAMvP,KAAK,gBAAgBhF,OAAO2U,cACzBJ,EAAMG,KAAK,MAGpBJ,cAAc,SAAS3C,EAAMiD,GAC5B,GAAmB,gBAARjD,GACV,MAAOA,EACR;GAAI4C,KACJ,KAAK,GAAIlD,KAAOM,GACXA,EAAK8C,eAAepD,IACvBkD,EAAMvP,KAAK1K,KAAKoX,QAAQkD,GAAM,IAAIvD,GAAK,IAAI/W,KAAKoX,OAAOC,EAAKN,IACjE,OAAOkD,GAAMG,KAAK,MAEhBN,UAAU,SAASS,EAAGjC,GACrB,GAAKiC,EAAL,CACH,IAAKva,KAAK8R,UAAU,sBAAsBwG,GAAOA,EAAMtY,KAAKqZ,SAASf,GAAOiC,IAAK,KAAM,KAAMA,IAAM,OAAO,CAEnGjC,KACNtY,KAAKyE,aAAa6T,IAAO,GAAKrP,OAAQC,UACvC,IAAIsR,GAAG,GAAI7a,qBAAoBK,KAAKya,YAAYza,MAAK,GAEjD0a,EAAK1a,KAAKgE,iBAAiBhE,KAAK2a,MAAOnY,aAAaxC,KAAKgE,kBAAkB,YAAYhE,KAAK2a,MAAM,eAAe3a,KAAK2F,IAAIgT,YAAY,EAAE,YAAYyB,KAAK,KAAM,GAElJ,SAAbpa,KAAKsE,OACFkW,EAAG3T,QAAQ6T,GAAsB,IAAjBA,EAAGhY,QAAQ,KAAU,IAAI,KAAK1C,KAAK+Z,UAAUQ,EAAGjC,IAEhEkC,EAAG3T,QAAQ6T,GAAG,EAAK1a,KAAK+Z,UAAUQ,EAAGjC,IAE5CtY,KAAKwE;GAENmV,YAAY,WACX,GAAK3Z,KAAKmE,YAAYyC,OAAtB,CAEA5G,KAAK4E,WACL,KAAK,GADiBgW,IAAM,EACnBxQ,EAAE,EAAGA,EAAEpK,KAAKmE,YAAYyC,OAAQwD,IACxCwQ,GAAO5a,KAAKuZ,kBAAkBvZ,KAAKmE,YAAYiG,GAChD,KAAKwQ,IAAU5a,KAAK8R,UAAU,qBAAqB,GAAG9R,KAAK4E,WAAY,OAAO,CAE9E,IAAI5E,KAAKmX,OACRnX,KAAK8Z,UAAU9Z,KAAK6a,mBAEpB,KAAK,GAAIzQ,GAAE,EAAGA,EAAEpK,KAAKmE,YAAYyC,OAAQwD,IACxC,IAAKpK,KAAKyE,aAAazE,KAAKmE,YAAYiG,IAAI,CAC3C,GAAIpK,KAAK8Y,WAAW9Y,KAAKmE,YAAYiG,IAAK,QAE1C,IADApK,KAAK4Z,gBAAgB5Z,KAAK6Z,YAAY7Z,KAAKmE,YAAYiG,IAAIpK,KAAKmE,YAAYiG,IACxEpK,KAAKwE,YAA+B,QAAjBxE,KAAK2F,IAAI6T,QAAkBxZ,KAAK2F,IAAI8T,KAAM;IAWrEoB,YAAY,WAGX,IAAI,GAFAC,MACAC,GAAU,EACN3Q,EAAE,EAAEA,EAAEpK,KAAKmE,YAAYyC,OAAOwD,IAAI,CACzC,GAAIkI,GAAGtS,KAAKmE,YAAYiG,EACpBpK,MAAKyE,aAAa6N,IAAOtS,KAAK8Y,WAAWxG,IACxCtS,KAAK8R,UAAU,kBAAkBQ,EAAGtS,KAAKqZ,SAAS/G,OACvDwI,EAAIxI,GAAItS,KAAK6Z,YAAYvH,EAAGA,EAAGtS,KAAKuE,YACpCwW,GAAU,EACV/a,KAAKyE,aAAa6N,IAAI,GAAKrJ,OAAQC,WAEpC,MAAO6R,GAAQD,EAAI,MAUpBE,eAAe,SAASxC,EAAIyC,GAC3Bjb,KAAK2E,gBAAgB6T,GAAOyC,GAAe,SAAU3Q,GAAO,MAAkB,KAAVA,IAOrE4Q,iBAAiB,SAAS1C,GACzBxY,KAAK2E,gBAAgB6T,IAAO,GAO7BC,QAAQ,SAAS0C,GAChB,GAAI/Q,GAAE,CACH,KAAIA,EAAE,EAAEA,EAAEpK,KAAKmE,YAAYyC,QACvBuU,GAASnb,KAAKmE,YAAYiG,GADIA,KAElC,MAAOA;EAmBXgR,aAAa,SAASvV,EAAKvF,GACfN,KAAKqb,YAAWrb,KAAKqb,cACtBrb,KAAKqb,UAAUxV,GAAMvF,GAchCgb,oBAAoB,SAASC,EAAKC,EAAKC,EAAQC,GAC9C,GAAIC,GAASJ,EACTK,EAAiB,SAARH,GAA2B,WAARA,CAEhC,IADKG,GAAS5b,KAAK4Y,YAAY2C,EAAIE,GAC9Bzb,KAAc,WAAIA,KAAKqb,UAAUI,KAAYzb,KAAKqb,UAAUI,GAAQC,GACxE,aAAe1b,MAAKyE,aAAakX,EAEH,SAA3B3b,KAAKyE,aAAakX,IAClB3b,KAAKqY,WAAWkD,GAAK,EAEtB,IAAIM,GAAON,CAEX,QAAQE,GACR,IAAK,WACL,IAAK,SACGD,GAAOD,IACPvb,KAAK2F,IAAI3F,KAAKmZ,SAAS,IAAIoC,EAAKC,GAChCD,EAAMC,EAEV,MACJ,KAAK,SACL,IAAK,UAID,MAHHxb,MAAK2F,IAAIkT,YAAY0C,EAAKvb,KAAKiE,aAAc,gBAC1CjE,KAAK2F,IAAI3F,KAAKmZ,SAAS,IAAIoC,SACpBvb,MAAKyE,aAAakX,GAClB3b,KAAK8R,UAAU,iBAAkByJ,EAAKE,EAAQD,EAAKE;CAG/B,QAA3B1b,KAAKyE,aAAakX,IACjBC,GAAS5b,KAAK2F,IAAIkT,YAAY0C,EAAKvb,KAAKiE,aAAa,UAClDjE,MAAKyE,aAAakX,WAElB3b,MAAKyE,aAAakX,GACzB3b,KAAKqY,WAAWmD,GAAI,EAAKxb,KAAK2F,IAAIgT,YAAY4C,EAAIvb,KAAKiE,gBAGxDjE,KAAK8R,UAAU,iBAAkB+J,EAAMJ,EAAQD,EAAKE,KAQxDjB,YAAY,SAASxU,EAAKzC,EAAEC,EAAEqY,EAAExK,GAE/B,GADAA,EAAI/J,cAAc,QACb+J,EAAIrR,OAAOyH,YAAhB,CAEA,IAAK,GADDqU,GAAKzK,EAAI1H,QAAQ,iBACZQ,EAAE,EAAGA,EAAE2R,EAAKnV,OAAQwD,IAAI,CAC1B,GAAIsR,GAAKK,EAAK3R,GAChBqR,EAASC,EAAKnL,aAAa,QAC3BgL,EAAMG,EAAKnL,aAAa,OACxBiL,EAAME,EAAKnL,aAAa,MAE5BtK,GAAKqV,oBAAoBC,EAAIC,EAAIC,EAAOC,GAEzCzV,EAAK+V;GAENA,eAAe,WACVhc,KAAKwE,WAAWxE,KAAKwE,aAEH,QAAjBxE,KAAK2F,IAAI6T,QAAkBxZ,KAAK2F,IAAI8T,MAAQzZ,KAAKmE,YAAYyC,QACjE5G,KAAKkZ,WACNlZ,KAAK8R,UAAU,0BACV9R,KAAKmE,YAAYyC,QACrB5G,KAAK8R,UAAU,kBAYjBmK,KAAK,SAASC,GACblc,KAAK2F,IAAMuW,EACPlc,KAAK2F,IAAIwW,UACZnc,KAAK2F,IAAIwW,SAASnc,OAIpBoc,iBAAiB,SAASjK,GACzBnS,KAAK6D,YAAY,gBAAgBsO,IAElCkK,YAAY,aAEZC,yBAAyB,SAASC,GACjCvc,KAAK6D,YAAY,sBAAsB0Y,IASxCC,cAAe,SAASC,EAAUC,GACjCD,EAAWA,GAAY,IAEvBzc,KAAK2a,MAAQ+B,IAAQ,GAAKzT,OAAQC,UAClClJ,KAAK2c,cAAe,EACpB3c,KAAK4c,QAAU,KACf5c,KAAK6c,cAAe,EAEpB7c,KAAK6D,YAAY,gBAAgB,SAAS0X,EAAIE,EAAOD,EAAIsB,GACxD9c,KAAK+c,gBAAgBxB,EAAKE,EAAQD,EAAKsB;GAExC9c,KAAK6D,YAAY,aAAa,WAC7B7D,KAAKgd,YAGN,IAAIC,GAAOjd,IACXQ,QAAO0c,YAAY,WAClBD,EAAKE,cACHV,IAQJM,gBAAiB,SAASxB,EAAKE,GAC9B,MAAc,aAAVA,GACHzb,KAAK2c,cAAe,GACb,IAEA,GAQTK,SAAU,WAKT,MAJIhd,MAAK2c,gBAAiB,IACzB3c,KAAK2c,cAAe,EACpB3c,KAAKmd,eAEC,GAMRC,WAAY,SAAS1W,EAAIC,GACxB,MAAI3G,MAAK6c,cACD,GAEP7c,KAAK6c,cAAe,EAErB7c,KAAK4c,QAAU5c,KAAK4c,SAAW,GAAIjd,sBAAoB,GAEvDK,KAAK4c,QAAQ9c,OAAM,EACnBE,KAAK4c,QAAQxc,SAASuG,MACtB3G,MAAK4c,QAAQ/V,QAAQH;EAQtB2W,GAAI,SAASlT,GACZ,MAAIA,GAAKI,WAAmBJ,EAAKI,WAAWC,UACrC,IAQR8S,GAAI,SAASC,GAEZ,IAAK,GADDlM,MACKjH,EAAE,EAAGA,EAAImT,EAAI3W,OAAQwD,IAC7BiH,EAAIjH,GAAGpK,KAAKqd,GAAGE,EAAInT,GAEpB,OAAOiH,IAMR8L,WAAY,WACX,GAAIF,GAAOjd,KACPyF,EAAUzF,KAAK2F,IAAIgT,YAAY,EAAE,WACjCjS,EAAM1G,KAAKgE,gBAAgBxB,aAAaxC,KAAKgE,kBAAkB,YAAYhE,KAAK2a,MAAM,eAAelV,GAAS2U,KAAK,IACvH1T,GAAMA,EAAIwB,QAAQ,gBAAgB,IAClClI,KAAKod,WAAW1W,EAAK,WACpB,GAAI8W,GAAOP,EAAKL,QAAQhT,QAAQ,aAChCqT,GAAKtX,IAAIkT,YAAY,EAAE,UAAUoE,EAAKI,GAAGG,EAAK,IAE9C,IAAIC,GAAOR,EAAKL,QAAQhT,QAAQ,WAChC,IAAI6T,EAAK7W,OAAO,CACfqW,EAAK7E,cAAe,CAEpB;IAAK,GAAIhO,GAAE,EAAGA,EAAEqT,EAAK7W,OAAQwD,IAAK,CACjC,GAAIsT,GAASD,EAAKrT,GAAGmG,aAAa,UAC9B+B,EAAKmL,EAAKrT,GAAGmG,aAAa,MAC1BlD,EAASoQ,EAAKrT,GAAGmG,aAAa,SAClC,QAAQmN,GACP,IAAK,WACJT,EAAKnL,UAAU,kBAAkB2L,EAAKrT,GAAIkI,EAAIjF,GAC9C,MACD,KAAK,UACJ4P,EAAKnL,UAAU,kBAAkB2L,EAAKrT,GAAIkI,EAAIjF,GAC9C,MACD,KAAK,UACJ4P,EAAKnL,UAAU,kBAAkB2L,EAAKrT,GAAIkI,EAAIjF,KAKjD4P,EAAK7E,cAAe,EAGrB6E,EAAKJ,cAAe,EACpBI,EAAO,SASNzc,OAAOmd,mBACVA,iBAAiBpX,UAAUqX,sBAAsBD,iBAAiBpX,UAAUsX,YAC5EF,iBAAiBpX,UAAUsX,YAAY,WACtC,GAAIC,GAAU,SAASpX,GAEtB,MADAA,GAAIA,EAAIwB,QAAQ,0BAA0B,IACnCxB,GAAuB,IAAlBA,EAAIhE,QAAQ,KAAS,IAAI,KAAK,kBAAkB1C,KAAK+d,IAAIC,KAAKpX,OAAS,EAAI,mBAAmB;EAEvGqX,EAAa,SAASvX,GACzB,MAAOoX,GAAUxW,KAAKtH,KAAK0G,IAAM1G,KAAKke,oBAAoB,KAAKle,KAAKme,mBAAmB,KAEpFC,EAAY,SAAS1X,EAAI8R,EAAI6F,GAEhC,MADAre,MAAKke,mBAAmB,aAAa1F,EAAI,KAAK6F,EACvCJ,EAAa3W,KAAKtH,KAAK0G,IAE3B4X,EAAc,SAAS5X,EAAI6X,EAAKC,GACnC,IAAK,GAAIpU,GAAE,EAAGA,EAAEmU,EAAK3X,OAAQwD,IAC5BmU,EAAKnU,GAAG,cAAcmU,EAAKnU,GAAG,KAAKmN,mBAAmBiH,EAAKpU,GAE5D,OADApK,MAAKme,kBAAkB,IAAII,EAAKnE,KAAK,KAC9B6D,EAAa3W,KAAKtH,KAAK0G,GAE/B1G,MAAK6D,YAAY,kBAAkB,SAAS2U,GAC3C,MAAIxY,MAAKye,YAAYjG,GACiB,gBAA1BxY,MAAKye,YAAYjG,GACpBxY,KAAKye,YAAYjG,IAEjB,GAEF,IAERxY,KAAK6D,YAAY,WAAW,WAE1B,MADA7D,MAAK0e,WAAWT,EAAa3W,KAAKtH,KAAKA,KAAK0e,aACrC;GAET1e,KAAK6D,YAAY,kBAAkB,SAAS2U,EAAIrI,EAAKkO,GACpD,GAAU,aAANlO,EAAkB,CACrB,GAAI8M,GAAKjd,IAIT,OAHAA,MAAK2e,aAAaP,EAAY9W,KAAKtH,KAAKA,KAAK0e,WAAWlG,EAAI6F,GAAK,WAChEpB,EAAK2B,iBAAgB,EAAKpG,EAAI6F,MAExB,EAER,OAAO,IAERre,KAAK6D,YAAY,gBAAgB,SAASN,EAAEC,GAC3C,MAAIxD,MAAKye,YAAY7X,QACpB5G,KAAK2e,aAAaL,EAAchX,KAAKtH,KAAKA,KAAK0e,WAAWnb,EAAEC,KACrD,IAED,IAERxD,KAAK6D,YAAY,QAAQ,SAASN,EAAEC,EAAEC,EAAE6N,MAIpCtR,KAAK4d,uBAAuB5d,KAAK4d,yBAEtCD,iBAAiBpX,UAAUkY,eAC3Bd,iBAAiBpX,UAAUsY,iCAAiC,SAAS7Y,EAAEoE,GAGtE,MAFKpK,MAAKye,YAAYrU,KACrBpK,KAAKye,YAAYrU,GAAG,GACdpK,KAAK8e,uBAAuB9Y,EAAEoE;EAEtCuT,iBAAiBpX,UAAUwY,mCAAmC,SAAS/Y,EAAEoE,GAGxE,MAFKpK,MAAKye,YAAYrU,KACrBpK,KAAKye,YAAYrU,GAAG,GACdpK,KAAKgf,yBAAyBhZ,EAAEoE,IAExCuT,iBAAiBpX,UAAU0Y,eAAetB,iBAAiBpX,UAAU2Y,KACrEvB,iBAAiBpX,UAAU2Y,KAAK,WAC/B,GAAI7H,MAAU8H,OAAO9Y,UACrB,KAAKrG,KAAKof,eAAiBpf,KAAKqf,SAAS,CAExC,IAAK,GADDC,MACKlV,EAAE,EAAGA,EAAIpK,KAAKqf,SAASzY,OAAQwD,KACA,IAAnCpK,KAAKqf,SAASjV,GAAG1H,QAAQ,OAAoC,GAArB1C,KAAKye,YAAYrU,KAAOkV,EAAG5U,KAAKN,EACzEkV,GAAG1Y,SACNyQ,EAAK,KAA6B,IAAtBA,EAAK,GAAG3U,QAAQ,KAAS,IAAI,KAAK,4BAA4B4c,EAAGlF,KAAK;CAEpF,MAAOpa,MAAKif,eAAe9Y,MAAMnG,KAAMqX,IAExCsG,iBAAiBpX,UAAUgZ,qBAAqB5B,iBAAiBpX,UAAUiZ,WAC3E7B,iBAAiBpX,UAAUiZ,WAAW,WAErC,GADAxf,KAAKuf,qBAAqBpZ,MAAMnG,KAAKqG,YAChCrG,KAAKof,cAAc,CAEvB,IAAK,GADDK,GAAOzf,KAAK0f,UAAU9V,QAAQ,iBAAkBvD,UAAU,IACrD+D,EAAE,EAAGA,EAAIqV,EAAK7Y,OAAQwD,IAAI,CAClC,GAAIuV,GAAIF,EAAKrV,GAAGmG,aAAa,OACzBqP,KACAC,EAAM,IACc,UAApB7f,KAAKqf,SAASM,KACjBE,EAAQ7f,KAAK8f,eAAeH,IACU,IAAnC3f,KAAKqf,SAASM,GAAGjd,QAAQ,QAC5Bmd,EAAM7f,KAAK+f,SAASJ,GAGrB,KAAK,GADDK,GAAKhgB,KAAK0f,UAAU9V,QAAQ,SAAS6V,EAAKrV,IACrCqG,EAAE,EAAGA,EAAEuP,EAAGpZ,OAAQ6J,IAAI,CAC9B,GAAIgH,GAAIuI,EAAGvP,GAAGF,aAAa,QAE3B;GAAIsP,EAAM,CACT,GAAII,GAAID,EAAGvP,GAAGF,aAAa,UAAUkH,CAEjCoI,GAAMK,UACTL,EAAMK,YAAYzI,EAAKwI,KAEvBJ,EAAMM,IAAI1I,EAAIwI,GAEfL,EAAEA,EAAEhZ,QAAQqZ,MAEZL,GAAEA,EAAEhZ,QAAQ6Q,EAEVzX,KAAKye,YAAc,EAAFkB,KACpB3f,KAAKye,YAAc,EAAFkB,GAAKC,GAExB5f,KAAKof,eAAc,KAKlB5e,OAAOsD,gBACVA,cAAcyC,UAAU6Z,cAActc,cAAcyC,UAAU0V,KAC9DnY,cAAcyC,UAAU0V,KAAK,SAAStW,GACrC3F,KAAKogB,cAAcza,GACnBA,EAAI0a,eAAergB,KAEnBA,KAAKiX,mBAAmB,QAAO,GAC/BjX,KAAKgE,kBAAqD,IAAnChE,KAAKgE,gBAAgBtB,QAAQ,KAAS,IAAI,KAAK,iBAGxEyF,YAAY+H,WAAW,UAAU,SAAS3M,EAAEC,EAAEC,GACtCA,EAAE,GAAGia,QACLld,OAAO8P,MAAM7M,EAAE,GAAGwE;GAK1B3C,gBAAgBE,WAEhBA,UAAU8a,gBAAkB,SAAS3c,EAAIlD,EAAOH,GAC3CqD,EAAG4c,oBACN5c,EAAG4c,oBAAoB9f,EAAOH,GAAS,GAE9BqD,EAAG4O,aACZ5O,EAAG4O,YAAY,KAAK9R,EAAOH,IAI7BkF,UAAUgb,WAAa,WAoBtB,QAASC,KACR,OACCC,EAAIlgB,OAAOuV,YAAcrU,SAASE,gBAAgB+e,YAClDC,EAAIpgB,OAAO0V,aAAexU,SAASE,gBAAgBif,cAGrD,QAASC,GAAOvd,EAAEC,GACjB,MAAOD,GAAEmd,GAAKld,EAAEkd,GAAKnd,EAAEqd,GAAKpd,EAAEod,EAzB/B,GAAIG,GAAUN,GACd/c,aAAYlD,OAAO,SAAS,WAC3B,GAAIwgB,GAAUP,GAIVK,GAAOC,EAASC,KACnBxgB,OAAOwW,aAAaxR,UAAUyb,eAC9Bzb,UAAUyb,cAAczgB,OAAO6T,WAAW,WACrC7O,UAAUsM,UAAU,0BACvBtM,UAAU0b,cACV1b,UAAUsM,UAAU;EAEnB,MAEJiP,EAAUC,IAaXxb,UAAUgb,WAAa,cAExBhb,UAAUyW,KAAK,SAAS3J,EAAG6O,EAAKvT,GAC/BuT,EAAKA,GAAO3b,UAAU4b,eACtBxT,EAAKA,GAAM,OAER5N,KAAKqhB,OACPrhB,KAAKshB,gBACLthB,KAAKqhB,KAAK7U,UAAY,IAGvBxM,KAAKqhB,KAAmB,gBAAN/O,GAAgB5Q,SAAS8T,eAAelD,GAAIA,EAG1DtS,KAAKuhB,YACR/b,UAAU+b,aAEX/b,UAAU2b,KAAKlF,OAGfjc,KAAKwhB,QACLxhB,KAAKyhB,SAAQ,EACbzhB,KAAK0hB,QAAS3Z,OAAgC,cAAvBrG,SAASkN,WAChC5O,KAAK2hB,SAAU5Z,OAAiD,IAAxCuB,UAAUqF,WAAWjM,QAAQ,UAErD1C,KAAK4hB,eACL5hB,KAAK6hB,iBACL7hB,KAAK8hB,cAEL9hB,KAAKwgB,aACLxgB,KAAK+hB,qBAEL/hB,KAAKgiB,YACLxc,UAAUsM,UAAU,uBACpB9R,KAAKiiB,eAAed,EAAKvT;EAI1BpI,UAAU0c,IACTC,iBAAiB,GACjBC,YAAY,GACZC,aAAa,GACbC,aAAa,GACbC,mBAAmB,GACnBC,WAAW,GACXC,WAAW,EACXC,YAAY,EACZC,aAAa,IACbC,kBAAkB,IAEnBpd,UAAU0U,MACT2I,UAAU,GACVC,YAAY,IAEbtd,UAAUwc,UAAU,WACnB,GAAItB,GAAI1gB,KAAK+iB,GAAK/iB,KAAKqhB,KAAKV,YAAY3gB,KAAKkiB,GAAGQ,YAC5C9B,EAAI5gB,KAAKgjB,GAAKhjB,KAAKqhB,KAAKR,aAAa7gB,KAAKkiB,GAAGO,WAG7CQ,EAAQjjB,KAAKkjB,YAAY,EAAGljB,KAAKkiB,GAAGE,YAAYpiB,KAAKkiB,GAAGG,aACxDc,EAAQnjB,KAAKkjB,YAAY,GAAGljB,KAAKkiB,GAAGE,WAExCpiB,MAAKojB,OAAOpjB,KAAKwhB,KAAsB,gBAAE,GAAGd,EAAE1gB,KAAKkiB,GAAGmB,WAAW,EAAE,GACnErjB,KAAKojB,OAAOpjB,KAAKwhB,KAAqB,eAAE,GAAGd,EAAEuC,EAAQjjB,KAAKkiB,GAAGI,aAAaa,EAAQnjB,KAAKkiB,GAAGmB,YAAYrjB,KAAK0hB,QAAQ,GAAG,GAEtH;GAAI4B,GAAgBtjB,KAAKwhB,KAAsB,gBAAE,GAAGrL,YAChDmN,GAAgB,IAAGtjB,KAAKkiB,GAAGmB,WAAaC,EAE5C,IAAIC,GAAOvjB,KAAKkiB,GAAGI,aAAatiB,KAAKkiB,GAAGmB,YAAYrjB,KAAK0hB,QAAQ,GAAG,EACpE1hB,MAAKojB,OAAOpjB,KAAKwhB,KAAmB,aAAE,GAAGd,EAAEE,GAAG2C,EAAO,GAAG,EAAEA,EAAO,IAElE/d,UAAU4d,OAAO,SAASjZ,EAAKuW,EAAEE,EAAEhL,EAAEK,GACpC9L,EAAKwC,MAAMiI,MAAMzS,KAAKqhB,IAAI,EAAE9C,GAAG,KAC/BvW,EAAKwC,MAAMkI,OAAO1S,KAAKqhB,IAAI,EAAE5C,GAAG,KAC5Bva,UAAUO,OAAO,IACpBuD,EAAKwC,MAAM9L,KAAK+U,EAAE,KAClBzL,EAAKwC,MAAM5L,IAAIkV,EAAE,OAGnBzQ,UAAUoc,aAAa,WAGtB,IAAK,GADD6B,GAAIzjB,KAAKqhB,KAAKzZ,qBAAqB,OAC9BwC,EAAE,EAAGA,EAAIqZ,EAAI7c,OAAQwD,IAAI,CACjC,GAAIsZ,GAAWD,EAAIrZ,GAAGmJ,WAAa,GAC/BoQ,EAAaF,EAAIrZ,GAAGmG,aAAa,SAAW,EAC5CmT;IAAYA,EAAaA,EAAW7b,MAAM,KAAK,IAC9C7H,KAAKwhB,KAAKkC,KAAa1jB,KAAKwhB,KAAKkC,OACtC1jB,KAAKwhB,KAAKkC,GAAYhZ,KAAK+Y,EAAIrZ,GAG/B,IAAIwZ,GAAQpe,UAAUyP,OAAOC,OAAOyO,GAAYD,EAC3B,iBAAVE,IAAsBD,IAAeF,EAAIrZ,GAAGoC,YACrDoX,EAAQD,EAAW9b,MAAM,KAAK,IAC5B+b,IACHH,EAAIrZ,GAAGoC,UAAWoX,KAIrBpe,UAAU8b,cAAgB,WACzB,IAAK,GAAI/d,KAAKvD,MAAKwhB,KAClB,GAAIxhB,KAAK6jB,OAAOtgB,GACf,IAAK,GAAI6G,GAAE,EAAGA,EAAIpK,KAAKwhB,KAAKje,GAAGqD,OAAQwD,IACtCpK,KAAKwhB,KAAKje,GAAG6G,GAAG6J,QAAU,IAC7BjU,MAAKqhB,KAAKzV,cAAgB,KAC1B5L,KAAKqhB,KAAKhW,YAAc,KACxBrL,KAAKqhB,KAAKxW,YAAc,KACxB7K,KAAKqhB,KAAKjW,UAAY,KACtBpL,KAAKqhB,KAAKyC,WAAa,KACvB9jB,KAAKqhB,KAAK0C,cAAgB;EAG3Bve,UAAUsc,YAAY,WACrB,IAAK,GAAIve,KAAKvD,MAAKwhB,KAClB,GAAIxhB,KAAK6jB,OAAOtgB,GACf,IAAK,GAAI6G,GAAE,EAAGA,EAAIpK,KAAKwhB,KAAKje,GAAGqD,OAAQwD,IACtCpK,KAAKwhB,KAAKje,GAAG6G,GAAG6J,QAAQzO,UAAUqe,OAAOtgB,EAC5CvD,MAAKqhB,KAAKzV,cAAc,WAAa,OAAO,GAC5C5L,KAAKqhB,KAAKhW,YAAY,SAAS9K,GACzBiF,UAAUwe,mBACdxe,UAAUye,eAAe1jB,GAAGE,QAE9BT,KAAKqhB,KAAKxW,YAAY,SAAStK,GACzBiF,UAAU0e,oBACd1e,UAAU2e,eAAe5jB,GAAGE,QAE9BT,KAAKqhB,KAAKjW,UAAU,SAAS7K,GACvBiF,UAAU0e,oBACd1e,UAAU4e,aAAa7jB,GAAGE,QAE5BT,KAAKqhB,KAAKyC,WAAW,SAASvjB,GAC7BiF,UAAU6e,cAAc9jB,GAAGE;EAE5BT,KAAKqhB,KAAK0C,cAAgB,SAASxjB,GAClC,GAAI4R,GAAK5R,GAAGE,MACR6jB,EAAMnS,EAAGlF,QAAQkF,EAAGnF,WACpBuX,EAAc/e,UAAUsM,UAAU,iBAAkBtM,UAAUgf,cAAcF,GAAMnS,GACtF,OAAOoS,KAGT/e,UAAUif,OAAO,SAASnS,GACrBtS,KAAK0kB,YAAYpS,IACrBtS,KAAK0Z,UAAS,GACd1Z,KAAK2kB,WACL3kB,KAAK0kB,WAAapS,EAClBtS,KAAK4kB,YAAYtS,KAElB9M,UAAUmf,SAAS,SAASrS,GAC3B,IAAIA,GAAMA,GAAItS,KAAK0kB,WAAnB,CACA,GAAI1e,GAAEhG,KAAK0kB,UACX1kB,MAAK0kB,WAAa,KACd1e,GAAKhG,KAAK6kB,SAAS7e,IAAIhG,KAAK4kB,YAAY5e,KAE7CR,UAAU6T,SAAS,WAClB,OACCzL,KAAM5N,KAAK8kB,MACX3D,KAAM,GAAIlY,MAAKjJ,KAAK+kB,OACpBC,SAAU,GAAI/b,MAAKjJ,KAAKilB,WACxBC,SAAU,GAAIjc,MAAKjJ,KAAKmlB,WACxBC,UAAWplB,KAAKqlB,SAChBC,YAAatlB,KAAKulB,aAClBC,UAAWxlB,KAAKylB,WAChBC,UAAW1lB,KAAK0kB,WAChBiB,SAAU3lB,KAAK2lB,SACfC,QAAS5lB,KAAK6lB,SACdC,UAAW9lB,KAAK+lB;EAGlBvgB,UAAUqe,QACTmC,aAAa,SAASzlB,GAErB,GAAIiF,UAAU0e,mBAKb,MAJI3jB,GAAEkL,gBACLlL,EAAEkL,iBACHlL,EAAE6S,cAAe,EACjB5N,UAAU0e,oBAAqB,GACxB,CAGR,IAAI+B,GAAM1lB,EAAEA,EAAE0M,OAAOxM,MAAMuM,WACvBsF,EAAK9M,UAAUgf,cAAcyB,EAIjC,IAFA1lB,EAAIA,GAAKE,MAEJ6R,GAGJ,IAAM9M,UAAUsM,UAAU,WAAWQ,EAAG/R,KAAOiF,UAAUkN,OAAOwT,SAAW,WAF3E1gB,WAAUsM,UAAU,gBAAgBtM,UAAU2gB,cAAc5lB,GAAG4gB,KAAM5gB,GAKtE,IAAI+R,GAAM9M,UAAUkN,OAAO+R,OAAQ,CAElCjf,UAAUif,OAAOnS,EACjB,IAAI8T,GAAOH,EAAI1S,SACY,KAAvB6S,EAAK1jB,QAAQ,UAChB8C,UAAUqe,OAAOtO,QAAQ6Q,EAAKve,MAAM,KAAK,GAAGK,QAAQ,QAAQ,KAAKoK;KAElE9M,WAAU6gB,mBACV7gB,UAAUmf,YAGZ2B,oBAAoB,WACnB9gB,UAAUqe,OAAO0C,oBAAoB,EAAE,KAExCA,oBAAoB,SAASC,EAAMC,GAClCjhB,UAAUyc,eAAezc,UAAU2b,KAAKuF,IACvClhB,UAAU2b,KAAK3b,UAAUsf,MAAM,UAAUtf,UAAUuf,OAAQ0B,GAAM,EAAGjhB,UAAUsf,SAEhF6B,qBAAqB,WAChBnhB,UAAUsM,UAAU,8BACvBtM,UAAUyc,eAAezc,UAAU4b,iBAGrCwF,YAAY,WACX,GAAI/gB,GAAO7F,KAAKuQ,aAAa,QACzB3C,EAAO/H,EAAKghB,UAAU,EAAGhhB,EAAKihB,OAAO,QACzCthB;UAAUyc,eAAezc,UAAUuf,MAAMnX,IAE1C2H,SACCwR,SAAS,SAASzU,GACjB,GAAI7O,GAAI+B,UAAUyP,OAAOC,OAAO8R,gBAChCxhB,WAAUyhB,gBAAgBxjB,EAAG+B,UAAUyP,OAAOC,OAAOgS,uBAAwB,WAAY1hB,UAAU2hB,YAAY7U,MAEhH8U,KAAK,SAAS9U,GAAK9M,UAAU4hB,KAAK9U,IAClC+U,KAAK,WAAc7hB,UAAUkU,UAAS,IACtCN,QAAQ,SAAS9G,GAAK9M,UAAU8hB,aAAahV,IAC7CmC,OAAO,WAAcjP,UAAUkU,UAAS,MAG1ClU,UAAUyhB,gBAAkB,SAAS/T,EAAS4B,EAAOnO,GACpD,IAAKuM,EACJ,MAAOvM,IACR,IAAI4gB,IAAS7T,KAAMR,EACf4B,KACHyS,EAAKzS,MAAQA,GACVnO,IACH4gB,EAAK5gB,SAAW,SAASmK,GACpBA,GACHnK;GAGHjB,OAAOiR,QAAQ4Q,IAEhB/hB,UAAUgiB,YAAY,SAASC,EAAMC,EAAInnB,GACxC,GAAIonB,KACAF,IAA2D,OAAlDA,EAAMG,YAAYtO,WAAWuO,MAAM,aAC/CF,EAAOF,EACPA,EAAQ,KAGT,IAAI3L,GAAwD,KAAnD9b,KAAK0S,OAAOoV,gBAAgB9nB,KAAK0S,OAAOqV,UAC5CN,KAAOA,EAAQE,EAAKK,YAAY7lB,KAAKC,MAAOoD,UAAU4b,eAAgBlY,UAAU4S,GAAGA,EACxF,IAAIkM,GAAa,GAAI/e,MAAKwe,EAC1B,KAAKC,EAAI,CACR,GAAIO,GAAajoB,KAAK0S,OAAOwV,UACzBD,GAAaD,EAAWG,aAC3BH,EAAWI,SAASH,GACpBR,EAAQO,EAAW9e,WAEpBwe,EAAMD,EAAMve,UAAU4S,EAEvB,GAAIuM,GAAW,GAAIpf,MAAKye,EAGrBM,GAAW9e,WAAamf,EAASnf,WACnCmf,EAASC,QAAQD,EAASnf,UAAU4S,GAErC6L,EAAKK,WAAaL,EAAKK,YAAYA,EACnCL,EAAKU,SAAYV,EAAKU,UAAUA,EAChCV,EAAKjU,KAAOiU,EAAKjU,MAAM1T,KAAKiV,OAAOC,OAAOsQ,UAC1CmC,EAAKrV,GAAKtS,KAAK6lB,SAAW7lB,KAAK0W,MAC/B1W,KAAK+lB,WAAW,WAEhB/lB,KAAKuoB,UAAS,EACdvoB,KAAK6R,SAAS8V,GACd3nB,KAAK8R,UAAU,kBAAkB9R,KAAK6lB,SAAStlB,IAC/CP,KAAKuoB,UAAS,EAEdvoB,KAAKwoB,eACLxoB,KAAKokB,aAAa7jB;EAEnBiF,UAAU6e,cAAc,SAAS9jB,EAAE+jB,GAElC,GADAA,EAAMA,GAAM/jB,EAAE0M,QAAQ1M,EAAEyM,YACpBhN,KAAK0S,OAAOwT,SAAhB,CACA,GAAIrgB,IAAQye,EAAI/Q,WAAW,IAAI1L,MAAM,KAAK,EAC1C,QAAOhC,GACN,IAAK,mBACL,IAAK,uBACL,IAAK,iBACL,IAAK,kBACJ,IAAKL,UAAUkN,OAAO+V,gBAAiB,KACvCzoB,MAAKwnB,YAAYxnB,KAAKmmB,cAAc5lB,GAAG4gB,KAAK,KAAK5gB,EACjD,MACD,KAAK,gBACL,IAAK,iBACL,IAAK,kBACL,IAAK,iBACL,IAAK,qBACL,IAAK,sBACJ,GAAI+R,GAAKtS,KAAKwkB,cAAcF,EAC5B,KAAKtkB,KAAK8R,UAAU,cAAcQ,EAAG/R,IAAK,MACtCP;KAAK0S,OAAOgW,qBAAuB1oB,KAAKkjB,cAAgBljB,KAAK6kB,SAASvS,GAAIqW,SAAW3oB,KAAK0S,OAAO+R,OACpGzkB,KAAKsnB,aAAahV,GAElBtS,KAAKonB,KAAK9U,EACX,MACD,KAAK,iBACL,IAAK,oBACJ,MACD,SACC,GAAItM,GAAIhG,KAAK,YAAY6F,EACzB,IAAIG,EACHA,EAAEsB,KAAKtH,KAAKO,OAGZ,IAAI+jB,EAAIrY,YAAcqY,GAAOtkB,KAC5B,MAAOwF,WAAU6e,cAAc9jB,EAAE+jB,EAAIrY,eAM1CzG,UAAUojB,kBAAoB,SAASC,GACtC,GAAIC,GAAS,CACb,IAAI9oB,KAAK+oB,MAAM,CAGd,IAAI,GADAnU,GAAQ,EACJxK,EAAE,EAAGA,EAAIpK,KAAK+oB,MAAMniB,SAAWgO,EAAOxK,IAC7CwK,EAAQ5U,KAAK+oB,MAAM3e,EASpB,IALC0e,EADElU,EACOiU,EAAQjU,EAER,EAGN5U,KAAKgpB,SACR,IAAK,GAAI5e,GAAE,EAAM0e,GAAH1e,EAAWA,IACpBpK,KAAKgpB,SAAS5e,IACjB0e;CAEJ,MAAOA,IAGRtjB,UAAUyjB,uBAAyB,SAASC,GAE3C,GAAIlpB,KAAK+oB,MAEJ,CACJ,GAAID,GAAS9oB,KAAK4oB,kBAAkBM,EAAItT,EAIxC,OAHAsT,GAAItT,EAAEzT,KAAKgnB,IAAInpB,KAAK+oB,MAAMniB,OAAO,EAAGzE,KAAKqhB,IAAI,EAAErhB,KAAKinB,KAAKN,GAAQ,IAEjEI,EAAIjT,EAAE9T,KAAKqhB,IAAI,EAAErhB,KAAKinB,KAAW,GAANF,EAAIjT,GAAMjW,KAAK0S,OAAOqV,UAAU/nB,KAAK0S,OAAO2W,eAAe,GAAGrpB,KAAK0S,OAAOwV,YAAY,GAAGloB,KAAK0S,OAAOqV,WACzHmB,EANP,MAAOA,IAUT1jB,UAAU8jB,cAAc,SAASnX,GAChC,GAAI+W,GACA1lB,EAAE9B,SAASD,KACXqa,EAAIpa,SAASE,eAGZsnB,GAFAnhB,QAAUoK,EAAGoX,QAASpX,EAAGqX,OAG1B5T,EAAEzD,EAAGvF,SAAWpJ,EAAEzB,YAAY+Z,EAAE/Z,YAAY,GAAKyB,EAAEtB,WACnD+T,EAAE9D,EAAGrF,SAAWtJ,EAAE3B,WAAWia,EAAEja,WAAW,GAAK2B,EAAEvB,YAH5C2T,EAAEzD,EAAGoX,MAAOtT,EAAE9D,EAAGqX,OAO1BN,EAAItT,GAAGlV,gBAAgBV,KAAKqhB,OAAOrhB,KAAKkjB,YAAY,EAAEljB,KAAKkiB,GAAGE,aAC9D8G,EAAIjT,GAAGnV,eAAed,KAAKqhB,MAAMrhB,KAAKkiB,GAAGmB,YAAYrjB,KAAKypB,WAAW,GAAGzpB,KAAKkiB,GAAGI,aAAatiB,KAAKwhB,KAAmB,aAAE,GAAG3f,UAC1HqnB,EAAI/W,GAAKA,CAET;GAAI7R,GAAUN,KAAK,SAASA,KAAK8kB,MACjC,IAAIxkB,EACH,MAAOA,GAAQgH,KAAKtH,KAAKkpB,EAI1B,IAAKlpB,KAAKkjB,YAEH,CACN,GAAI4F,GAAS9oB,KAAK4oB,kBAAkBM,EAAItT,EACxC,KAAK5V,KAAK+oB,QAAU/oB,KAAK0pB,OACxB,MAAOR,EACR,IAAIS,GAAG,CACP,KAAKA,EAAG,EAAGA,EAAK3pB,KAAK0pB,OAAOE,QAAQhjB,UAC/B5G,KAAK0pB,OAAOE,QAAQD,GAAIT,EAAIjT,GADW0T,KAG5CT,EAAIjT,EAAE9T,KAAKinB,KAA+C,IAAxCjnB,KAAKqhB,IAAI,EAAGsF,GAAyB,EAAjB3mB,KAAKqhB,IAAI,EAAEmG,EAAG,IAAS,GAAG3pB,KAAK0S,OAAOqV,YAExEviB,UAAUugB,YAA4B,SAAd/lB,KAAK8kB,SAChCoE,EAAIjT,EAAuD,IAApD9T,KAAKqhB,IAAI,EAAErhB,KAAKinB,KAAKN,GAAQ,GAAoB,EAAjB3mB,KAAKqhB,IAAI,EAAEmG,EAAG,IAAS,GAAG3pB,KAAK0S,OAAOqV,WAGvD,QAAnB/nB,KAAK+lB,YACJvgB,UAAUqkB,mBAAqBrkB,UAAUkN,OAAOoX,kBACnDZ,EAAIF,UAAW,EAEVhpB,KAAKwoB,YAAYuB,gBACrB/pB,KAAKwoB,YAAYuB,cAAgB/pB,KAAKgqB,uBAAuBhqB,KAAKwoB,YAAYR,WAAYhoB,KAAKwoB,YAAYH,UAAY4B,OAAO,EAAGC,OAAO,UAI3IhB,EAAItT,EAAE;KAxBNsT,GAAMlpB,KAAKipB,uBAAuBC,EA0BnC,OAAOA,IAER1jB,UAAU6gB,iBAAiB,WAC1B,IAAI,GAAIpd,OAAOC,WAAW1D,UAAUigB,YAAY,GAAK,KAAOjgB,UAAU6f,SAAS,CAC9E,GAAI5hB,GAAE+B,UAAUyP,OAAOC,OAAOiV,eAE9B3kB,WAAUyhB,gBAAgBxjB,EAAG+B,UAAUyP,OAAOC,OAAOkV,sBAAuB,WAAa5kB,UAAUkU,SAASlU,UAAUkN,OAAO2X,sBAG/H7kB,UAAU8kB,eAAe,SAAS7C,EAAO8C,GACxC,MAAO9C,IAAmG,KAA3F,GAAKxe,MAAKzD,UAAUyf,WAAYuF,oBAAoB,GAAKvhB,MAAKwe,GAAQ+C,sBAA4BD,EAAK,GAAG,IAE1H/kB,UAAUye,eAAe,SAAS1jB,GACjC,GAAIP,KAAK+lB,WAAW,CACnB,GAAImD,GAAIlpB,KAAKspB,cAAc/oB,EAC3B;IAAKP,KAAKyqB,WAAavB,EAAIwB,cAAgB1qB,KAAKyqB,UAAU7U,GAAGsT,EAAItT,GAAK5V,KAAKyqB,UAAUxU,GAAGiT,EAAIjT,EAAG,CAC9F,GAAIwR,GAAOC,CAMX,IALI1nB,KAAKqlB,UAAUrlB,KAAK6lB,UACvB7lB,KAAKqmB,mBAENrmB,KAAKyqB,UAAUvB,EAEM,UAAjBlpB,KAAK+lB,WAAqB,CAO7B,GANA/lB,KAAKqmB,mBACLrmB,KAAK2kB,SAAS3kB,KAAK0kB,YACnB1kB,KAAKuoB,UAAS,EAEdd,EAAQznB,KAAK2qB,mBAAmBzB,GAAKhgB,WAEhClJ,KAAK4qB,YAAa,CACtB,GAAIvZ,GAAMrR,KAAK8R,UAAU,wBAAyBvR,EAAGP,KAAK6lB,UAC1D,KAAKxU,EACJ,MAID,aADArR,KAAK4qB,YAAYnD,GAIlBC,EAAMD,EACFC,GAAO1nB,KAAK4qB,WAGhB,IAAI5C,GAAa,GAAI/e,MAAKjJ,KAAK4qB,aAC3BvC,EAAW,GAAIpf,MAAKye,EACJ;OAAd1nB,KAAK8kB,OAAgC,QAAd9kB,KAAK8kB,OAChCkD,EAAWG,YAAcE,EAASF,YACnCH,EAAW6C,cAAgBxC,EAASwC,eACnCxC,EAAW,GAAIpf,MAAKjJ,KAAK4qB,YAAY,MAIvC5qB,KAAK6lB,SAAS7lB,KAAK0W,MACnB1W,KAAK6R,SAASmW,EAAYK,EAAUroB,KAAKiV,OAAOC,OAAOsQ,UAAWxlB,KAAK6lB,SAAUqD,EAAI4B,QAErF9qB,KAAK8R,UAAU,kBAAkB9R,KAAK6lB,SAAStlB,IAC/CP,KAAKuoB,UAAS,EACdvoB,KAAK+lB,WAAW,WAIjB,GACIpgB,GADAwM,EAAGnS,KAAK6kB,SAAS7kB,KAAK6lB,SAG1B,IAAqB,QAAjB7lB,KAAK+lB,WACR0B,EAAQznB,KAAKilB,UAAU/b,UAAqF,KAA1EggB,EAAIjT,EAAEjW,KAAK0S,OAAOqV,UAAgB,GAANmB,EAAItT,EAAK,IAAKpQ,UAAUulB,iBAAiB,KAClG7B,EAAI8B,QAAUhrB,KAAKkjB,cAAauE,GAA0C,IAAnCznB,KAAKmhB,KAAK8J,UAAU9Y,EAAG6V,aACnEP,EAAQznB,KAAKsqB,eAAe7C,GAExByB,EAAIF,UAAYhpB,KAAK0S,OAAOoX,iBAAmB9pB,KAAKkjB,aACnDljB,KAAKkrB,SACRvlB,EAAM3F,KAAKkrB,OAAOlrB,KAAK8kB,QACxBnf,EAAMA,IAAUskB,OAAO,EAAGC,OAAO,OACjCxC,EAAY,EAAND,EAAUznB,KAAKmrB,4BAA4B1D,EAAOznB,KAAKwoB,YAAYuB,cAAepkB,IAExF+hB,EAAMvV,EAAGkW,SAASnf,WAAWiJ,EAAG6V,WAAW9e,UAAUue;IAChD,CAGN,GAFAA,EAAQtV,EAAG6V,WAAW9e,UACtBwe,EAAMvV,EAAGkW,SAASnf,UACdlJ,KAAKkjB,YAAa,CACrB,GAAIkI,GAAcprB,KAAKilB,UAAU/b,UAAUggB,EAAIjT,EAAEjW,KAAK0S,OAAOqV,UAAU,KAASmB,EAAI8B,OAAO,EAAE,MAC7F,IAAkB,SAAdhrB,KAAK8kB,MAER,GADAsG,EAAcprB,KAAKsqB,eAAec,GAAa,GAC3CprB,KAAKqrB,iBAAmB,CAC3B,GAAIC,GAAM,KACNF,IAAe5lB,UAAU2b,KAAKoK,UAAU,GAAItiB,MAAKye,EAAI4D,EAAI,IAAIpiB,YAChEue,EAAQ2D,EAAcE,OAEvB5D,GAAM0D,MAGHlC,GAAIsC,kBACP/D,EAAQ2D,EAER1D,EAAM0D,MAGR1D,GAAM1nB,KAAKmhB,KAAKoK,UAAU,GAAItiB,MAAKkJ,EAAGkW,SAASnf,UAAY,IAAIA,UAAUggB,EAAIjT,EAAEjW,KAAK0S,OAAOqV,UAAU,IACrG/nB,KAAKwhB,KAAmB,aAAE,GAAG7U,MAAM8e,OAAO,YACxB,QAAdzrB,KAAK8kB,OAAiC,OAAd9kB,KAAK8kB,SAChC4C,EAAM1nB,KAAKsqB,eAAe5C,GAE5B;GAAuB,YAAnB1nB,KAAK+lB,WACR,GAAI2B,GAAO1nB,KAAK4qB,YAAY,CAC3B,GAAIc,GAAQxC,EAAIwC,QAAS1rB,KAAKkjB,cAAgBgG,EAAI8B,OAAQ,MAAY,EACtEvD,GAAQC,GAAKwB,EAAIwC,MAAM,EAAEA,GACzBhE,EAAM1nB,KAAK4qB,aAAac,GAA8B,IAAtB1rB,KAAK0S,OAAOqV,eAE5CN,GAAQznB,KAAK4qB,gBAGLnD,IAALC,IACHA,EAAID,EAA4B,IAAtBznB,KAAK0S,OAAOqV,WAGzB,GAAI4D,GAAU,GAAI1iB,MAAKye,EAAI,GACvBkE,EAAY,GAAI3iB,MAAKwe,EAEzB,IAAGjiB,UAAUkN,OAAOmZ,kBACjBD,GAAapmB,UAAUyf,YAAcyC,GAAOliB,UAAU2f,WAAW,CAClE,GAAI2G,GAAWpE,EAAMkE,GACjBA,GAAapmB,UAAUyf,WAC1B2G,EAAY,GAAI3iB,MAAKzD,UAAUyf,WAC/ByC,EAAM,GAAIze,OAAM2iB,EAAYE,KAE5BpE,EAAM,GAAIze,MAAKzD,UAAU2f,WACzByG,EAAY,GAAI3iB,OAAMye,EAAMoE,GAE7B;GAAIH,GAAU,GAAI1iB,MAAKye,EAAI,GAM7B,IAAI1nB,KAAKkjB,cACPgG,EAAItT,GAAK5V,KAAK+rB,iBAAiB/D,WAAY,GAAI/e,MAAKye,GAAMW,SAAS,GAAIpf,MAAKye,MAAU,GAAIze,MAAKye,GAAKS,YAAcnoB,KAAK0S,OAAOsZ,WAAW,CAC1I,GAAIF,GAAWpE,EAAMkE,EACjBN,EAAMtrB,KAAKilB,UAAU/b,UAAiB,GAANggB,EAAItT,EAAK,GAAI,GACjD8R,GAAMliB,UAAU2b,KAAKoK,UAAU,GAAItiB,MAAKqiB,IACxC5D,EAAIU,SAASpoB,KAAK0S,OAAOsZ,WACzBL,EAAU,GAAI1iB,MAAKye,EAAI,GACD,QAAnB1nB,KAAK+lB,aACP6F,EAAY,GAAI3iB,OAAMye,EAAMoE,IAK9B,GAAK9rB,KAAKkjB,aAAgByI,EAAQM,WAAWL,EAAUK,WAAaN,EAAQxD,WAAWnoB,KAAK0S,OAAOsZ,WAAcxmB,UAAU0mB,WAG1H,GAFA/Z,EAAG6V,WAAW4D,EACdzZ,EAAGkW,SAAS,GAAIpf,MAAKye,GACjB1nB,KAAK0S,OAAOyZ,cAAc,CAE7B,GAAIC,GAAK5mB,UAAUgc,KAAmB,aAAE,GAAG3f,SAC3C7B;KAAKkhB,cACL1b,UAAUgc,KAAmB,aAAE,GAAG3f,UAAYuqB,MAE9CpsB,MAAK4kB,YAAY5kB,KAAK6lB,SAEpB7lB,MAAKkjB,aACRljB,KAAKqsB,aAAarsB,KAAK6lB,SAAS,SAASyG,GACxCA,EAAE/Y,WAAW,iBAIfvT,KAAK8R,UAAU,eAAgB9R,KAAK6lB,SAAU7lB,KAAK+lB,WAAYxlB,SAGhE,IAAIiF,UAAUwM,WAAW,eAAe,CACvC,GAAIM,GAAKtS,KAAKwkB,cAAcjkB,EAAE0M,QAAQ1M,EAAEyM,WACxChN,MAAK8R,UAAU,eAAeQ,EAAG/R,MAIpCiF,UAAU2e,eAAe,SAAS5jB,EAAE+jB,GAGnC,GAAgB,GAAZ/jB,EAAE4K,SAGFnL,KAAK0S,OAAOwT,WAAYlmB,KAAK+lB,WAAjC,CACAzB,EAAMA,GAAM/jB,EAAE0M,QAAQ1M,EAAEyM,UACxB;GAAIuf,GAAYjI,EAAI/Q,WAAa+Q,EAAI/Q,UAAU1L,MAAM,KAAK,EAE1D,QAAQ0kB,GACP,IAAK,qBACL,IAAK,sBACAvsB,KAAKkjB,cACRljB,KAAK+lB,WAAW,OACjB,MACD,KAAK,iBACL,IAAK,iBACJ/lB,KAAK+lB,WAAW,MAChB,MACD,KAAK,mBACJ/lB,KAAK+lB,WAAW,SAEfvgB,UAAU6lB,kBADP/G,EAAI/Q,WAAW,IAAI7Q,QAAQ,wBAA0B,GAC3B,GAEA,CAE9B,MACD,KAAK,mBACL,IAAK,uBACL,IAAK,iBACL,IAAK,kBACL,IAAK,sBACJ1C,KAAK+lB,WAAW,QAChB;KACD,KAAK,GACJ,GAAIzB,EAAIrY,WACP,MAAOzG,WAAU2e,eAAe5jB,EAAE+jB,EAAIrY,WACvC,MACD,SACC,KAAKzG,UAAUwM,WAAW,gBAAkBxM,UAAUsM,UAAU,eAAgBya,MAC3EjI,EAAIrY,YAAcqY,GAAOtkB,MAAqB,YAAbusB,EACpC,MAAO/mB,WAAU2e,eAAe5jB,EAAE+jB,EAAIrY,WAGxCjM,MAAK+lB,WAAW,KAChB/lB,KAAK6lB,SAAS,KAGhB,GAAI7lB,KAAK+lB,WAAW,CACnB,GAAIzT,GAAKtS,KAAKwkB,cAAcF,EACvBtkB,MAAK0S,OAAO,QAAQ1S,KAAK+lB,aAAgB/lB,KAAK8R,UAAU,gBAAgBQ,EAAItS,KAAK+lB,WAAYxlB,KAGjGP,KAAK6lB,SAAUvT,EACftS,KAAKwoB,YAAchjB,UAAUgnB,YAAYxsB,KAAK6kB,SAAS7kB,KAAK6lB,gBAH5D7lB,KAAK+lB,WAAW/lB,KAAK6lB,SAAS;CAMhC7lB,KAAK4qB,YAAY,OAIlBplB,UAAUinB,wBAA0B,SAAShsB,GAC5C,GAAIqqB,KACJ,KAAI,GAAI1gB,KAAK3J,GACU,IAAnB2J,EAAE1H,QAAQ,OACZooB,EAAO1gB,IAAK,EAGd,OAAO0gB,IAERtlB,UAAUknB,4BAA8B,SAASC,EAAOC,GACvD,GAAIC,GAAU7sB,KAAKysB,wBAAwBE,GACvCG,EAAgB9sB,KAAKysB,wBAAwBG,EACjD,KAAI,GAAIxiB,KAAK0iB,GACRD,EAAQziB,UACJwiB,GAAcxiB,IAMxB5E,UAAU4e,aAAa,SAAS7jB,GAC/B,IAAIA,GAAiB,GAAZA,EAAE4K,SAAe3F,UAAUkN,OAAOqa,MAA3C,CACA,GAAI/sB,KAAK+lB,YAAc/lB,KAAK6lB,SAAS,CACpC7lB,KAAKwhB,KAAmB,aAAE,GAAG7U,MAAM8e,OAAO,SAE1C,IAAItZ,GAAGnS,KAAK6kB,SAAS7kB,KAAK6lB,SAC1B,IAAI7lB,KAAKwoB,YAAYwE,eAAiBhtB,KAAKwoB,YAAYR,YAAc7V,EAAG6V,WAAW9e,WAAWlJ,KAAKwoB,YAAYR,WAAW9e,WAAaiJ,EAAGkW,SAASnf,WAAWlJ,KAAKwoB,YAAYH,SAASnf,UAAU,CACjM,GAAI+jB,GAAyB,YAAjBjtB,KAAK+lB,UACjB;GAAK/lB,KAAK8R,UAAU,wBAAwBK,EAAI5R,EAAG0sB,EAAQjtB,KAAKwoB,cASzD,CACN,GAAI5C,GAAU5lB,KAAK6lB,SACfjY,EAAO5N,KAAK+lB,UAEhB,IADA/lB,KAAK6lB,SAAW7lB,KAAK+lB,WAAa,KAC9BkH,GAAUjtB,KAAK0S,OAAOwa,eAAe,CAIxC,GAHAltB,KAAK2kB,WACL3kB,KAAKylB,WAAW,GAAIxc,MAEhBjJ,KAAKkjB,aAAeljB,KAAK0S,OAAOya,oBAAsBntB,KAAK0S,OAAO+R,OAErE,MADAjf,WAAUsM,UAAU,aAAc8T,EAAShY,EAAMrN,IAC1CP,KAAKsnB,aAAa1B,EAE1B5lB,MAAKyqB,WAAY,EACjBzqB,KAAK0kB,WAAa1kB,KAAKqlB,SAAWO,MAE7B5lB,MAAKylB,YACTzlB,KAAK8R,UAAUmb,EAAO,eAAe,kBAAkBrH,EAAQ5lB,KAAK6kB,SAASe,SAxB3EqH,GACHjtB,KAAKmnB,YAAYhV,EAAGG,IAAI,IAExBtS,KAAKwoB,YAAYwE,cAAe,EAChChtB,KAAK0sB,4BAA4Bva,EAAInS,KAAKwoB,aAC1ChjB,UAAU4nB,WAAWjb,EAAInS,KAAKwoB,aAC9BxoB,KAAK4kB,YAAYzS,EAAGG;CAsBnBtS,KAAKyqB,WAAWzqB,KAAKqtB,mBACzB7nB,UAAUsM,UAAU,aAAc9R,KAAK6lB,SAAU7lB,KAAK+lB,WAAYxlB,IAEnEP,KAAK6lB,SAAW,KAChB7lB,KAAK+lB,WAAW,KAChB/lB,KAAKyqB,UAAU,OAGhBjlB,UAAU8nB,qBAAuB,WAChC,MAAIttB,MAAKutB,YAAcvtB,KAAKwtB,SAC3BxtB,KAAKytB,cAAe,GACb,IAEA,GAGTjoB,UAAU0b,YAAY,WACrB,GAAIwM,GAAO1tB,KAAKA,KAAK8kB,MAAQ,QAO7B,OANG4I,GACFA,GAAK,GAEL1tB,KAAK2tB,eAGF3tB,KAAKstB,wBACD,MAERttB,MAAKqtB,oBAGN7nB,UAAUooB,aAAe,SAAShgB,GACjC,SAAUpI,UAAUoI,EAAM,UACxBpI,UAAU2b,KAAKvT,EAAM,WAAapI,UAAUqoB,UAAUjgB,EAAM,UAAYpI,UAAUqoB,UAAUjgB,EAAM;EAGrGpI,UAAUsoB,WAAa,SAAS3M,EAAMvT,GACrCuT,EAAOA,GAAQnhB,KAAK+kB,MACpBnX,EAAOA,GAAQ5N,KAAK8kB,KACpB,IAAIkB,GAAe,cAEdhmB,MAAK8kB,MAET9kB,KAAKqhB,KAAK9N,UAAYvT,KAAKqhB,KAAK9N,UAAUrL,QAAQ,iBAAmBlI,KAAK8kB,MAAO,iBAAmBlX,GADpG5N,KAAKqhB,KAAK9N,WAAa,kBAAoB3F,CAI5C,IAAImgB,GAAe/tB,KAAK8kB,OAASlX,GAAQ5N,KAAK0S,OAAOsb,gBAAmBhuB,KAAKwhB,KAAKwE,GAAc,GAAGnkB,WAAY,CAG3G7B,MAAKA,KAAK8kB,MAAQ,UAAYlX,GAAQ5N,KAAK8kB,OAASlX,GACvD5N,KAAKA,KAAK8kB,MAAQ,UAAS,GAE5B9kB,KAAKqmB,kBAEL,IAAI4H,GAAgB,eAChBjuB,MAAKwhB,KAAKyM,KACbjuB,KAAKwhB,KAAKyM,GAAe,GAAGhiB,WAAWG,YAAYpM,KAAKwhB,KAAKyM,GAAe,IAC5EjuB,KAAKwhB,KAAKyM,GAAiB,MAG5BjuB,KAAK8kB,MAAQlX,EACb5N,KAAK+kB,MAAQ5D,EACbnhB,KAAKkjB,YAA6B,SAAdljB,KAAK8kB,MAEzB9kB,KAAKypB,UAAY,CAEjB;GAAIyE,GAAOluB,KAAKwhB,KAAkB,WAClC,IAAG0M,EACF,IAAK,GAAI9jB,GAAI,EAAGA,EAAI8jB,EAAKtnB,OAAQwD,IAAK,CACrC,GAAIvE,GAAOqoB,EAAK9jB,GAAGmJ,SACnB1N,GAAOA,EAAKqC,QAAQ,WAAY,IAC5BgmB,EAAK9jB,GAAGmG,aAAa,SAAWvQ,KAAK8kB,MAAQ,SAChDjf,GAAc,WACfqoB,EAAK9jB,GAAGmJ,UAAY1N,EAItB7F,KAAKkhB,cAEqB,gBAAf6M,KACV/tB,KAAKwhB,KAAKwE,GAAc,GAAGnkB,UAAYksB,IAEzCvoB,UAAUyc,eAAiB,SAASd,EAAMvT,GACpC5N,KAAK8R,UAAU,sBAAuB9R,KAAK8kB,MAAO9kB,KAAK+kB,MAAOnX,GAAQ5N,KAAK8kB,MAAO3D,GAAQnhB,KAAK+kB,UACpG/kB,KAAK8tB,WAAW3M,EAAMvT,GACtB5N,KAAK8R,UAAU,gBAAiB9R,KAAK8kB,MAAO9kB,KAAK+kB,UAElDvf,UAAU2oB,iBAAmB,SAAS/jB,EAAEvJ,EAAKib,EAAE8E,GAE9C,GAAIwN,GAAK1sB,SAAS2G,cAAc,MAChC+lB;EAAK7a,UAAY,gBAEdvT,KAAK6tB,UAAU7tB,KAAK8kB,MAAM,mBAE5BsJ,EAAK7a,WAAa,IAAMvT,KAAK6tB,UAAU7tB,KAAK8kB,MAAM,iBAAiBhJ,GAGpE,IAAIlH,GAAQ5U,KAAK+oB,MAAM3e,GAAG,CAER,UAAdpK,KAAK8kB,OAA0B,IAAN1a,GAAWpK,KAAK0S,OAAO2b,cACnDD,EAAK7a,WAAa,wBAClB1S,GAAY,GAEbb,KAAKojB,OAAOgL,EAAMxZ,EAAO5U,KAAKkiB,GAAGI,aAAa,EAAGzhB,EAAM,GACvDutB,EAAK5hB,UAAUxM,KAAK6tB,UAAU7tB,KAAK8kB,MAAM,eAAehJ,EAAE9b,KAAK8kB,OAC/DlE,EAAE9U,YAAYsiB,IAGf5oB,UAAU8oB,iBAAmB,SAASC,EAAMC,GAC3C,GAAIvnB,GAAQ,CACZ,KAAKzB,UAAU0d,YAAY,CAC1B,GAAIuL,GAAUjpB,UAAU2b,KAAK,OAAO3b,UAAUsf,MAAM,OAChD2J;IAASD,EAAKC,EAAQF,IAC1BtnB,EAAQ9E,KAAKC,OAAOosB,EAAGtlB,UAAUqlB,EAAKrlB,WAAW,OAElD,MAAOjC,IAERzB,UAAUkpB,oBAAsB,WAE/B,MAAO1uB,MAAKmhB,KAAKnhB,KAAK8kB,MAAM,UAAU,GAAI7b,MAAKjJ,KAAK+kB,MAAM7b,aAG3D1D,UAAUmpB,cAAgB,WACzB,GAAIC,GAAK5uB,KAAK0uB,sBACVG,EAAKrpB,UAAU2b,KAAKuF,IAAIkI,EAAI,EAAG5uB,KAAK8kB,MACxC,KAAKtf,UAAU0d,YAAY,CAC1B,GAAIuL,GAAUjpB,UAAU2b,KAAK,OAAO3b,UAAUsf,MAAM,OAChD2J,KAASI,EAAKJ,EAAQG,IAE3B,MAAOC,IAERrpB,UAAUspB,kBAAoB,SAASla,EAAO2Z,EAAMC,GAEnD,GAAIO,GAAOna,EACP3N,EAAQjH,KAAKsuB,iBAAiBC,EAAMC,EAExCxuB,MAAKgvB,iBAAiBT,EAAMtnB,EAAO,MAAO,EAG1C;IAAK,GAFDgoB,GAAYhoB,EAAQjH,KAAK6pB,kBAEpBzf,EAAE,EAAKnD,EAAFmD,EAASA,IAClBpK,KAAKgpB,SAAS5e,IACjBpK,KAAK+oB,MAAM3e,GAAK,EAChB6kB,KAEAjvB,KAAK+oB,MAAM3e,GAAGjI,KAAK2T,MAAMiZ,GAAME,EAAU7kB,IAE1C2kB,GAAM/uB,KAAK+oB,MAAM3e,GACjBpK,KAAK0pB,OAAOtf,IAAIpK,KAAK+oB,MAAM3e,EAAE,IAAI,IAAIpK,KAAK0pB,OAAOtf,EAAE,KAAKpK,KAAKkjB,YAAY,EAAEljB,KAAKkiB,GAAGE,YAAY,IAC/FpiB,KAAK0pB,OAAmB,WAAIziB,CAG7BjH,MAAK0pB,OAAOziB,GAAOjH,KAAK+oB,MAAM9hB,EAAM,GAAGjH,KAAK0pB,OAAOziB,EAAM,IAE1DzB,UAAU0pB,oBAAsB,SAAS3iB,EAAKqI,EAAO/T,GACpD,GAAI4C,GAAIzD,KAAK0S,MACb1S,MAAKojB,OAAO7W,EAAKqI,EAAM,EAAGnR,EAAE4lB,cAAc5lB,EAAEuoB,UAAUvoB,EAAEykB,YAAarnB,EAAKb,KAAKkiB,GAAGE,YAAY,EAAG,IAGlG5c,UAAU2pB,eAAiB,SAASC,EAAQC,GAE3C,GAAIC,GAAK,GAAIrmB,MAAKzD,UAAUyf,WAC3B4J,EAAK,GAAI5lB,MAAKzD,UAAU2f,WACxBoK,EAAQvvB,KAAKmhB,KAAKoK,UAAW/lB,UAAU4b,gBAEpC2N,EAAO7tB,SAASkuB,EAAOziB,MAAMiI,MAAM,IACnCkH,EAAI,GAAI7S,MAAKjJ,KAAKilB,WAClBhe,EAAQjH,KAAKsuB,iBAAiBgB,EAAIT,EACtC7uB;KAAK8uB,kBAAkBC,EAAMO,EAAIT,EACjC,IAAIhuB,GAAK,CAETuuB,GAAO5iB,UAAY,EACnB,KAAK,GAAIpC,GAAE,EAAKnD,EAAFmD,EAASA,IAAI,CAI1B,GAHKpK,KAAKgpB,SAAS5e,IAClBpK,KAAKmuB,iBAAiB/jB,EAAEvJ,EAAKib,EAAEsT,IAE3BpvB,KAAKkjB,YAAY,CACrB,GAAIsM,GAAO9tB,SAAS2G,cAAc,OAC9BonB,EAAM,kBACN3T,GAAE5S,WAAaqmB,EAAMrmB,YAAWumB,EAAM,wBAEtCzvB,KAAK6pB,mBAAqB7pB,KAAKgpB,SAAS5e,KAC3CqlB,GAAO,qBAGRD,EAAOjc,UAAYkc,EAAI,IAAIzvB,KAAK6tB,UAAU6B,gBAAgB5T,EAAEyT,GAE5DvvB,KAAKkvB,oBAAoBM,EAAQxvB,KAAK+oB,MAAM3e,GAAIvJ,GAEhDwuB,EAAUvjB,YAAY0jB,GACtBxvB,KAAK8R,UAAU,cAAc0d,EAAQ1T,IAGtCjb,GAAMb,KAAK+oB,MAAM3e,GACjB0R,EAAE9b,KAAKmhB,KAAKuF,IAAI5K,EAAE,EAAE;GAItBtW,UAAUmoB,aAAa,WAGtB,GAAK3tB,KAAK6tB,UAAU7tB,KAAK8kB,MAAQ,SAAjC,CAEA,GAAIlE,GAAI5gB,KAAKwhB,KAAqB,eAAE,GAChC6N,EAAYrvB,KAAKwhB,KAAmB,aAAE,GACtC/d,EAAIzD,KAAK0S,MAEbkO,GAAEpU,UAAY,GAEd6iB,EAAU7iB,UAAY,EAEtB,IAAI/J,IAAQgB,EAAEyiB,WAAcziB,EAAEksB,YAAgB,qBAAuB,KAAQlsB,EAAEyiB,WAAcziB,EAAEmsB,UAAc,mBAAqB,GAC9HntB,KAAK4sB,EAAU9b,UAAY,eAAiB9Q,GAEhDzC,KAAK6vB,WACL7vB,KAAK+oB,SACL/oB,KAAK0pB,QAAU7U,OAAQ,GACvB7U,KAAKypB,UAAY,EAEjBzpB,KAAKgiB,WAEL,IAAIlG,GAAEwT,EACFV,EAAK5uB,KAAK0uB,sBACbG,EAAKrpB,UAAUmpB,eAWhB,IATA7S,EAAIwT,EAAKtvB,KAAKkjB,YAAc1d,UAAU2b,KAAK2O,WAAWlB,GAAMA,EAG5D5uB,KAAKilB,UAAUnJ,EACf9b,KAAKwhB,KAAmB,aAAE,GAAGhV,UAAUxM,KAAK6tB,UAAU7tB,KAAK8kB,MAAM,SAAS8J,EAAGC,EAAG7uB,KAAK8kB,OAErF9kB,KAAKmlB,UAAY0J,EACjBrpB,UAAU2pB,eAAevO,EAAGyO,GAExBrvB,KAAKkjB,YACRljB,KAAK+vB,mBAAmBV,EAAUT,EAAGU;IAGrC,IADAtvB,KAAKgwB,mBAAmBX,EAAUT,EAAGU,GACjC7rB,EAAEwsB,UAAW,CAChB,GAAIhC,GAAgB,eAEjBjuB,MAAKwhB,KAAKyM,KACZjuB,KAAKwhB,KAAKyM,GAAe,GAAGhiB,WAAWG,YAAYpM,KAAKwhB,KAAKyM,GAAe,IAC5EjuB,KAAKwhB,KAAKyM,GAAiB,KAG5B,IAAIiC,GAAUlwB,KAAKwhB,KAAsB,gBAAE,GACvCzgB,EAAMmvB,EAAQ/Z,aAAenW,KAAKwhB,KAAqB,eAAE,GAAGrL,aAAa,EAEzEga,EAAKzuB,SAAS2G,cAAc,MAChC8nB,GAAG5c,UAAY0a,EACfkC,EAAGxjB,MAAMyjB,WAAW,SACpBpwB,KAAKojB,OAAO+M,EAAInwB,KAAK0pB,OAAO1pB,KAAK0pB,OAAO2G,YAAYrwB,KAAKkiB,GAAGG,aAAc,EAAG,EAAGthB,GAChFsuB,EAAUpjB,WAAWiI,aAAaic,EAAGd,EAErC,IAAIiB,GAAKH,EAAGzjB,WAAU,EACtB4jB,GAAG/c,UAAY0a,EAAc,QAC7BqC,EAAG3jB,MAAMyjB,WAAW,SACpBpwB,KAAKojB,OAAOkN,EAAItwB,KAAKkiB,GAAGE,YAAa,EAAG,EAAGrhB,GAE3CovB,EAAGrkB,YAAYwkB,GACftwB,KAAKwhB,KAAKyM,IAAgBkC,EAAGG,GAC7BtwB,KAAKwhB,KAAKyM,GAAe,GAAGha,QAAUjU,KAAK6jB,OAAOmC;IAIrDxgB,UAAUwqB,mBAAmB,SAASxsB,GACrC,GAAIC,GAAE/B,SAAS2G,cAAc,MAC7B5E,GAAE8P,UAAU,kBAGZ,KAAK,GADD4N,GAAO,GAAIlY,MAAK,KAAK,EAAE,EAAEjJ,KAAK0S,OAAOwV,WAAW,EAAE,GAC7C9d,EAAyB,EAAvBpK,KAAK0S,OAAOwV,WAAc9d,EAAIpK,KAAK0S,OAAOsZ,UAAW5hB,IAAK,CACpE,GAAImmB,GAAG7uB,SAAS2G,cAAc,MAC9BkoB,GAAGhd,UAAU,iBACbgd,EAAG5jB,MAAMkI,OAAO7U,KAAK0S,OAAO2W,cAAcrpB,KAAK0hB,QAAQ,EAAE,GAAG,IAC5D,IAAI9M,GAAQ5U,KAAKkiB,GAAGE,WAChBpiB,MAAK0S,OAAO2b,cACfzZ,GAAgB,EAChB2b,EAAGhd,WAAa,0BAEjBgd,EAAG5jB,MAAMiI,MAAQA,EAAQ,KACzB2b,EAAG/jB,UAAUhH,UAAUqoB,UAAU2C,WAAWrP,GAE5C1d,EAAEqI,YAAYykB,GACdpP,EAAKnhB,KAAKmhB,KAAKuF,IAAIvF,EAAK,EAAE;CAE3B3d,EAAEsI,YAAYrI,GACVzD,KAAK0S,OAAO+d,cACfjtB,EAAE3B,UAAY7B,KAAK0S,OAAO2W,cAAcrpB,KAAK0S,OAAO+d,YAAYzwB,KAAK0S,OAAOwV,cAG9E1iB,UAAU4b,aAAe,WACxB,MAAG5b,WAAUkN,OAAOge,SACZ,GAAIznB,MAAKzD,UAAUkN,OAAOge,UAE3B,GAAIznB,OAGZzD,UAAUwpB,iBAAmB,SAASM,EAAIliB,EAAGQ,EAAM6Y,EAAMkK,GACxD3wB,KAAKgpB,YACLhpB,KAAK6pB,kBAAoB,CACzB,IAAI3R,GAAS1S,UAAU,UAAUxF,KAAK8kB,MAEtC,IAAI5M,EAEH,IAAK,GADD0Y,GAAW,GAAI3nB,MAAKqmB,GACfllB,EAAE,EAAKgD,EAAFhD,EAAKA,IACd8N,EAAO0Y,KACV5wB,KAAK6pB,mBAAqB,EAC1B7pB,KAAKgpB,SAAS5e,IAAK,EACfumB,GACHvjB,KAEFwjB,EAAWprB,UAAU2b,KAAKuF,IAAIkK,EAAUnK,EAAM7Y,IAKjDpI,UAAUqrB,oBAAsB,SAAStkB,EAAKqiB,EAAmBU,GAoBhE,QAASwB,GAAcC,GACtB,GAAInQ,GAAIpb,UAAUkkB,OAAO7U,MAIzB;MAHyCO,UAAtC5P,UAAUkkB,OAAOE,QAAQmH,EAAM,KACjCnQ,EAAIpb,UAAUkkB,OAAOE,QAAQmH,EAAM,IAAMvrB,UAAUkkB,OAAOE,QAAQmH,IAAM,IAElEnQ,EAtBR,GAAIiO,GAAGrpB,UAAU2b,KAAKuF,IAAIkI,EAAG,EAAE,SAC9BoC,EAAa,GAAI/nB,MAAKqmB,GACnB2B,EAAKzrB,UAAU4b,cACnBphB,MAAKmhB,KAAKoK,UAAU0F,GACpBjxB,KAAKmhB,KAAKoK,UAAU+D,EAKpB,KAAK,GAHDtR,GAAK7b,KAAKinB,KAAKjnB,KAAKC,OAAOysB,EAAG3lB,UAAUomB,EAAGpmB,WAAa,OAAoB,GAC5EgoB,KAEK9mB,EAAE,EAAM,GAAHA,EAAMA,IAAK,CACxB,GAAI+mB,IAAenxB,KAAK+oB,MAAM3e,IAAI,GAAG,CAC3B,KAANA,GAAWpK,KAAK0S,OAAO2b,cAC1B8C,GAA0B,GAE3BD,EAAM9mB,GAAG,iBAAiB+mB,EAAW,MAgBtC,IAAK,GAJDC,GAAa,EAEbC,EAAK,0CACLC,KACKlnB,EAAE,EAAK4T,EAAF5T,EAAQA,IAAI,CACzBinB,GAAM,MAEN;IAAK,GADDE,GAAapvB,KAAKqhB,IAAIsN,EAAc1mB,GAAK5E,UAAU0c,GAAGU,kBAAmB,GACpEnS,EAAE,EAAK,EAAFA,EAAKA,IAAK,CACvB4gB,GAAM,KAEN,IAAI5B,GAAM,EACHb,GAAHU,EACHG,EAAI,aACIH,GAAIT,EACZY,EAAI,YACIH,EAAGpmB,WAAW+nB,EAAG/nB,YACzBumB,EAAI,WAEDzvB,KAAK6pB,mBAAqB7pB,KAAKgpB,SAASvY,KAC3Cgf,GAAO,qBAGR4B,GAAM,WAAW5B,EAAI,IAAIzvB,KAAK6tB,UAAU2D,iBAAiBlC,EAAG2B,GAAI,KAChE,IAAIQ,GAAa,iBACbC,EAAa,gBACP,KAANjhB,GAAWzQ,KAAK0S,OAAO2b,cAC1BoD,GAAc,yBACdC,GAAc,0BAEV1xB,KAAK6pB,mBAAsB7pB,KAAKgpB,SAASvY,GAI7C4gB,GAAM,0BAHNA,GAAM,eAAeK,EAAW,KAAK1xB,KAAK6tB,UAAU8D,UAAUrC,GAAI,SAClE+B,GAAM,eAAeI,EAAW,KAAKP,EAAMzgB,GAAK,WAAW8gB,EAAa,oBAIzED,EAAe5mB,KAAK4kB,EACpB;GAAIsC,GAAMtC,EAAGrD,SACbqD,GAAGtvB,KAAKmhB,KAAKuF,IAAI4I,EAAG,EAAE,OAClBA,EAAGrD,UAAY2F,EAAM,IACxBtC,EAAK,GAAIrmB,MAAKqmB,EAAGuC,cAAevC,EAAGwC,WAAYF,EAAM,EAAG,GAAI,IAE9DP,GAAM,QAEN7rB,UAAUkkB,OAAOE,QAAQxf,GAAKgnB,EAC9BA,GAAcN,EAAc1mB,GAE7BinB,GAAM,WAENrxB,KAAKilB,UAAY+L,EACjBhxB,KAAKmlB,UAAYmK,EAEjB/iB,EAAIC,UAAU6kB,EAEdrxB,KAAK6vB,UAEL,KAAK,GADDkC,GAAOxlB,EAAI3E,qBAAqB,OAC3BwC,EAAE,EAAGA,EAAEknB,EAAe1qB,OAAQwD,IAAK,CAC3C,GAAImC,GAAMwlB,EAAQ,EAAF3nB,EAAK,GACjB+W,EAAOmQ,EAAelnB,EAC1BpK,MAAK6vB,SAAS1O,GAAQ5U,EAEvB,IAAK,GAAInC,GAAE,EAAGA,EAAEknB,EAAe1qB,OAAQwD,IAAK,CAC3C,GAAI+W,GAAOmQ,EAAelnB,EAC1BpK,MAAK8R,UAAU,cAAe9R,KAAK6vB,SAAS1O,GAAOA,IAKpD,MAAOnhB,MAAKmlB,WAGb3f,UAAUuqB,mBAAmB,SAASvsB,EAAEorB,EAAGU,GAE1C,GAAIT,GAAGrpB,UAAU2b,KAAKuF,IAAIkI,EAAG,EAAE,SAG3BqC,EAAKzrB,UAAU4b,cACnBphB;KAAKmhB,KAAKoK,UAAU0F,GACpBjxB,KAAKmhB,KAAKoK,UAAU+D,EAEpB,IAAItR,GAAK7b,KAAKinB,KAAKjnB,KAAKC,OAAOysB,EAAG3lB,UAAUomB,EAAGpmB,WAAa,OAAoB,GAE5E2L,EAAU1S,KAAK2T,MAAMtS,EAAEqd,aAAa7C,GAAQhe,KAAKkiB,GAAGU,iBAKxD,OAHA5iB,MAAK0pB,OAAO7U,OAASA,EAAS7U,KAAKkiB,GAAGU,kBACtC5iB,KAAK0pB,OAAOE,WAELpkB,UAAUqrB,oBAAoBrtB,EAAGorB,EAAIU,IAG7C9pB,UAAUwsB,SAAW,SAASC,EAAUlb,GAEvC,IAAK,GADDmb,GAAWlyB,KAAK0S,OAAOyf,SAASD,SAC3B9nB,EAAE,EAAGA,EAAE8nB,EAAStrB,OAAQwD,IAChC,GAAG8nB,EAAS9nB,GAAGgoB,QAAUH,EAExB,IAAK,GADDI,GAAUH,EAAS9nB,GAAGioB,QACjB5hB,EAAE,EAAGA,EAAE4hB,EAAQzrB,OAAQ6J,IAC/B,GAAG4hB,EAAQ5hB,GAAGsG,KAAOA,EACpB,MAAOsb,GAAQ5hB,GAAGmT,KAKtB,OAAO,IAERpe,UAAU8sB,iBAAmB,SAASC,EAAWC,GAChD,GAAIhgB,GAAOhN,UAAUitB,WAAWF,EAChC;MAAK/f,IACLA,EAAKuG,OAAO,EAAGvG,EAAK5L,QACpB4L,EAAK9H,KAAKvE,MAAMqM,EAAMggB,OACtBhtB,UAAUsM,UAAU,oBACpBtM,UAAUktB,iBACH,IALW,GAOnBltB,UAAUgnB,YAAc,SAAStoB,EAAQyuB,GACxC,GAAIvoB,GAAGpE,EAAG8K,CAIV,KAFA6hB,EAAQA,MAEHvoB,EAAE,EAAGA,EAAEuoB,EAAM/rB,OAAQwD,GAAG,EAC5B,GAAGlG,IAAWyuB,EAAMvoB,GACnB,MAAOuoB,GAAMvoB,EAAE,EAEjB,IAAIlG,GAA2B,gBAAVA,GAAoB,CAGxC,IAFA4M,KACA9K,GAAKsJ,MAAMrG,KAAK2pB,OAAOC,OAAOC,SACzB1oB,EAAE,EAAGA,EAAEpE,EAAEY,OAAQwD,IACjBlG,YAAkB8B,GAAEoE,KACvB0G,EAAS1G,EAAI,GAAIpE,GAAEoE,GAAGlG,GAAU,GAAI8B,GAAEoE,GAExCuoB,GAAMjoB,KAAKxG,EAAQ4M,EACnB,KAAK1G,IAAKlG,GACL6uB,OAAOxsB,UAAU4T,eAAehU,MAAMjC,GAASkG,MAClD0G,EAAO1G,GAAK5E,UAAUgnB,YAAYtoB,EAAOkG,GAAIuoB,IAGhD,MAAO7hB,IAAU5M,GAElBsB,UAAU4nB,WAAa,SAASngB,EAAQwI,GACvC,IAAK,GAAIsB,KAAOtB,GACXA,EAAO0E,eAAepD,KACzB9J,EAAO8J,GAAOtB,EAAOsB,GAGvB;MAAO9J,IAERzH,UAAUmlB,mBAAqB,SAASzB,GACvC,GAAIzB,GAAMznB,KAAKilB,UAAU/b,UAAyE,KAA9DggB,EAAIjT,EAAEjW,KAAK0S,OAAOqV,UAAqC,IAA1B/nB,KAAKkjB,YAAY,EAAEgG,EAAItT,GAAM,GAC9F,OAAO,IAAI3M,MAAKjJ,KAAKsqB,eAAe7C,KAGrCjiB,UAAU2gB,cAAgB,SAAS6M,GAClC,GAAI9J,GAAMlpB,KAAKspB,cAAc0J,EAC7B,QACC7R,KAAKnhB,KAAK2qB,mBAAmBzB,GAC7B+J,QAAQ/J,EAAI+J,UAGdztB,UAAU0tB,OAAS,SAAS/oB,EAAMsa,GAC7Bta,GAAQA,EAAKiM,QACZpW,KAAK0S,OAAOqa,MACfvsB,OAAO6T,WAAW,WACjBlK,EAAKiM,SACJ,MAEEqO,GAAUta,EAAKsa,QAAQta,EAAKsa,SAChCta,EAAKiM,WAMR5Q,UAAUwkB,uBAAuB,SAASsF,EAAI6D,EAAIxtB,GACjD,GAKCytB,GALGC,EAAYF,EAAI7D,EAChBgE,EAAS3tB,EAAI4tB,kBAAoB5tB,EAAI6tB,iBAAkB,EACvDtb,EAASlY,KAAK,UAAUA,KAAK8kB,OAE7B2O,EAAa,CASjB;IAPI9tB,EAAI+tB,QACPD,EAAazzB,KAAK2zB,gBAAgBhuB,EAAK2pB,GACvC8D,EAAWpzB,KAAK2zB,gBAAgBhuB,EAAKwtB,IAErCC,EAAWjxB,KAAKC,MAAMixB,EAAU,GAAG,GAAG,IAAK,IAGxBD,EAAbK,GAAsB,CAC5B,GAAIrsB,GAAQ5B,UAAU2b,KAAKuF,IAAIyM,GAAKxtB,EAAIskB,OAAQtkB,EAAIukB,OAEnDmJ,IADGnb,GAAUA,EAAOib,GACNA,EAAG/rB,EAEJksB,EAEdH,EAAK/rB,EACLgsB,IAED,MAAOC,IAER7tB,UAAU2lB,4BAA4B,SAAS9C,EAAUgL,EAAW1tB,EAAK4kB,GACxE,GAAI+E,GAAK,GAAIrmB,MAAKof,GACdhK,EAAMkM,EAAO,GAAK,CAGtB,IAAI5kB,EAAI4tB,mBAAqB5tB,EAAI6tB,gBAAgB,CAChD,GAAIjE,EAEHA,GADGhF,EACoB,GAAd+E,EAAGnH,WAAcmH,EAAGzE,aAAoC,IAAnBllB,EAAIuiB,YAAY,GAEnC,IAAlBviB,EAAIqmB,WAAW,IAAuB,GAAdsD,EAAGnH,WAAcmH,EAAGzE,aACtD,IAAI+I,GAA2C,IAAhCjuB,EAAIqmB,UAAYrmB,EAAIuiB,YAC/B2L,EAAO1xB,KAAKinB,MAAOiK,EAAY,IAAY9D,GAAUqE,EACzDP,IAAaQ,GAAQ,KAAQD,GAAW,GAAK;CAG9C,GAICR,GAJGD,EAAK,GAAIlqB,MAAc,EAATof,EAAWgL,EAAUhV,GACnCnG,EAASlY,KAAK,UAAUA,KAAK8kB,OAE7B2O,EAAa,CASjB,KAPI9tB,EAAI+tB,QACPD,EAAazzB,KAAK2zB,gBAAgBhuB,EAAK2pB,GACvC8D,EAAWpzB,KAAK2zB,gBAAgBhuB,EAAKwtB,IAErCC,EAAWjxB,KAAKC,MAAMixB,EAAU,GAAG,GAAG,IAAK,IAGnBD,EAAS/U,GAA3BoV,EAAWpV,GAAoB,CACrC,GAAIjX,GAAQ5B,UAAU2b,KAAKuF,IAAI4I,EAAI3pB,EAAIskB,OAAO5L,EAAK1Y,EAAIukB,OACnDhS,IAAUA,EAAOoX,KACpB+D,IAAcjsB,EAAMkoB,GAAIjR,EACxB+U,GAAY/U,GAGbiR,EAAKloB,EACLqsB,GAAYpV,EAGb,MAAOgV,IAGR7tB,UAAUsuB,kBAAoB,WAC7B,MAAG9zB,MAAKkrB,QAAUlrB,KAAKkrB,OAAOlrB,KAAK8kB,OAC3B9kB,KAAKkrB,OAAOlrB,KAAK8kB,OAChB9kB,KAAK+zB,QAAU/zB,KAAK+zB,OAAO/zB,KAAK8kB,OACjC9kB,KAAK+zB,OAAO/zB,KAAK8kB,OAElB,MAGRtf,UAAUwuB,sBAAwB,WACjC,MAAGh0B,MAAKkrB,QAAUlrB,KAAKkrB,OAAOlrB,KAAK8kB,OAC3B9kB,KAAKkrB,OAAOlrB,KAAK8kB,OAAOmP,WACvBj0B,KAAK+zB,QAAU/zB,KAAK+zB,OAAO/zB,KAAK8kB,OACjC9kB,KAAK+zB,OAAO/zB,KAAK8kB,OAAOsN,OAEzB;EAGR5sB,UAAU0uB,gBAAkB,WAC3B,GAAI3b,GAAQvY,KAAKqZ,UACjB,OAAQrZ,MAAKqhB,MAAQ9I,EAAM4I,MAAQ5I,EAAM3K,MAE1CpI,UAAU2uB,kBAAoB,WAC7B,GAAI5b,GAAQvY,KAAKqZ,UACjB,OAA6B,QAAtBd,EAAM+M,aAA8ClQ,SAAtBmD,EAAM+M,aAE5C9f,UAAU2b,MACTlF,KAAK,WAGJ,IAAK,GAFDmY,GAAI5uB,UAAUyP,OAAOkM,KAAKkT,YAC1BruB,EAAIR,UAAUyP,OAAOkM,KAAKmT,oBACrBlqB,EAAI,EAAGA,EAAIgqB,EAAExtB,OAAQwD,IAC7BpE,EAAEouB,EAAEhqB,IAAIA,CAIT,KAAK,GAFDgqB,GAAI5uB,UAAUyP,OAAOkM,KAAKoT,WAC1BvuB,EAAIR,UAAUyP,OAAOkM,KAAKqT,mBACrBpqB,EAAI,EAAGA,EAAIgqB,EAAExtB,OAAQwD,IAC7BpE,EAAEouB,EAAEhqB,IAAIA,GAEVmhB,UAAU,SAASpK,GAOlB,MANAA,GAAKiH,SAAS,GACdjH,EAAKsT,WAAW,GAChBtT,EAAKuT,WAAW,GAChBvT,EAAKwT,gBAAgB,GACG,IAApBxT,EAAKgH,YACRhH,EAAKmH,QAAQnH,EAAKyT,UAAY,MAAkB,GAAKzT,EAAKgH,aACpDhH;EAER8J,UAAU,SAAS9J,GAClB,OAAQA,EAAKjY,UAAU,IAAgC,GAAzBiY,EAAKqJ,qBAAwB,OAE5DsF,WAAW,SAAS3O,GACnB,GAAIuK,GAAMvK,EAAK0T,QAKf,OAJIrvB,WAAUkN,OAAOoiB,kBACR,IAARpJ,EAAWA,EAAM,EAChBA,KAEC1rB,KAAKurB,UAAUvrB,KAAK0mB,IAAIvF,EAAK,GAAGuK,EAAM,SAE9CqJ,YAAY,SAAS5T,GAEpB,MADAA,GAAK6T,QAAQ,GACNh1B,KAAKurB,UAAUpK,IAEvB8T,WAAW,SAAS9T,GAEnB,MADAA,GAAK+T,SAAS,GACPl1B,KAAK+0B,YAAY5T,IAEzBgU,UAAU,SAAShU,GAClB,MAAOnhB,MAAKurB,UAAUpK,IAEvBiU,UAAU,SAASjU,EAAMkU,GACxB,GAAIC,GAAQ,GAAIrsB,MAAKkY,EAAKjY,UAKvB,OAHHosB,GAAMN,QAAQM,EAAMrJ,UAAYoJ,IAC3BlU,EAAKgH,YAAcmN,EAAMnN,YAC3BmN,EAAMhN,QAAQgN,EAAMV,UAAY,MAAkB,GAAKU,EAAMnN,aACtDmN;EAEX5O,IAAI,SAASvF,EAAKkU,EAAIznB,GACrB,GAAI0nB,GAAM,GAAIrsB,MAAKkY,EAAKjY,UACxB,QAAO0E,GACN,IAAK,MACJ0nB,EAAQ9vB,UAAU2b,KAAKiU,UAAUE,EAAOD,EACxC,MACD,KAAK,OACJC,EAAQ9vB,UAAU2b,KAAKiU,UAAUE,EAAa,EAAND,EACxC,MACD,KAAK,QAASC,EAAMJ,SAASI,EAAMxD,WAAWuD,EAAM,MACpD,KAAK,OAAQC,EAAMC,QAAQD,EAAMzD,cAAcwD,EAAM,MACrD,KAAK,OAAQC,EAAMlN,SAASkN,EAAMnN,WAAWkN,EAAM,MACnD,KAAK,SAAUC,EAAMb,WAAWa,EAAMzK,aAAawK,EAAM,MACzD,SACC,MAAO7vB,WAAU2b,KAAK,OAAOvT,GAAMuT,EAAKkU,EAAIznB,GAE9C,MAAO0nB,IAERE,SAAS,SAASC,GACjB,MAAQ,IAAJA,EAAe,IAAIA,EAChBA,GAERC,KAAK,SAASvU,GACb,MAAO,IAAIlY,MAAKkY,EAAKjY,YAEtBysB,YAAY,SAASC,EAAOC,GA0B3B,MAzBAD,GAAOA,EAAO1tB,QAAQ,aAAa,SAAS3E,GAC3C,OAAOA,GACN,IAAK,KAAM,MAAO,6CAClB;IAAK,KAAM,MAAO,kDAClB,KAAK,KAAM,MAAO,oBAClB,KAAK,KAAM,MAAO,yBAClB,KAAK,KAAM,MAAO,qDAClB,KAAK,KAAM,MAAO,wBAClB,KAAK,KAAM,MAAO,oDAClB,KAAK,KAAM,MAAO,mDAClB,KAAK,KAAM,MAAO,wDAClB,KAAK,KAAM,MAAO,uDAClB;IAAK,KAAM,MAAO,wDAClB,KAAK,KAAM,MAAO,iCAClB,KAAK,KAAM,MAAO,qBAClB,KAAK,KAAM,MAAO,8CAClB,KAAK,KAAM,MAAO,gDAClB,KAAK,KAAM,MAAO,oCAClB,KAAK,KAAM,MAAO,oCAClB,KAAK,KAAM,MAAO,gDAClB,KAAK,KAAM,MAAO,8DAClB;QAAS,MAAOA,MAGdsyB,IAAKD,EAAOA,EAAO1tB,QAAQ,aAAa,gBACrC,GAAI4tB,UAAS,OAAO,WAAYF,EAAO,OAE/CG,YAAY,SAASH,EAAOC,GAG3B,IAAK,GAFDG,GAAK,4CACL5P,EAAKwP,EAAO/N,MAAM,cACbzd,EAAE,EAAGA,EAAEgc,EAAKxf,OAAQwD,IAC5B,OAAOgc,EAAKhc,IACX,IAAK,KACL,IAAK,KAAM4rB,GAAM,eAAe5rB,EAAE,OACjC,MACD,KAAK,KACL,IAAK,KAAM4rB,GAAM,gBAAgB5rB,EAAE,UAClC,MACD,KAAK,KAAM4rB,GAAM,eAAe5rB,EAAE,aAAaA,EAAE,kBAChD,MACD,KAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACF4rB,GAAM,eAAe5rB,EAAE,OACzB,MACD,KAAK,KACF4rB,GAAM,eAAe5rB,EAAE,OACzB;KACD,KAAK,KAAM4rB,GAAM,eAAe5rB,EAAE,OACjC,MACD,KAAK,KACL,IAAK,KAAM4rB,GAAM,2BAA2B5rB,EAAE,mCAC7C,MACD,KAAK,KAAM4rB,GAAM,eAAe5rB,EAAE,OACjC,MACD,KAAK,KAAM4rB,GAAM,sDAAsD5rB,EAAE,QACxE,MACD,KAAK,KAAM4rB,GAAM,qDAAqD5rB,EAAE,SAM1E,GAAI2I,GAAM,2CAEV,OADI8iB,KAAK9iB,EAAM,aAAaA,EAAK,KAC1B,GAAI+iB,UAAS,OAAO,0BAA0BE,EAAK,oBAAoBjjB,EAAK;EAEpFkjB,WAAY,SAASX,GACpB,IAAIA,EAAO,OAAO,CAClB,IAAIY,GAAOZ,EAAMT,QACJ,KAATqB,IACHA,EAAO,EAER,IAAIC,GAAiB,GAAIltB,MAAKqsB,EAAMpsB,UACpCitB,GAAenB,QAAQM,EAAMrJ,WAAa,EAAIiK,GAC9C,IAAIE,GAAcD,EAAetE,cAC7BwE,EAAel0B,KAAKC,OAAQ+zB,EAAevB,UAAY,GAAI3rB,MAAKmtB,EAAa,EAAG,GAAGxB,WAAa,OAChG0B,EAAc,EAAIn0B,KAAK2T,MAAOugB,EAAe,EACjD,OAAOC,IAERC,cAAe,SAASjB,GACvB,MAAOt1B,MAAKi2B,WAAWj2B,KAAKw2B,eAAelB,KAE5CkB,eAAgB,SAASrV,GACxB,MAAO,IAAIlY,MAAKkY,EAAKsV,iBAAkBtV,EAAKuV,cAAevV,EAAKwV,aAAcxV,EAAKyV,cAAezV,EAAK0V,gBAAiB1V,EAAK2V,mBAG/HtxB,UAAUyP,QACTkM,MACCoT,YAAY,UAAW,WAAY,QAAS,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YAC1HF,aAAa,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC1F0C,UAAU,SAAU,SAAU,UAAW,YAAa,WAAY,SAAU,YAC5EC,WAAW,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,QAEtD9hB,QACCyR,qBAAqB,QACrBsQ,QAAQ,MACRC,SAAS,OACTC,UAAU,QACV3R,UAAU,YACV4R,UAAU,OACVC,YAAY,SACZC,aAAa,UACbC,UAAU,OACVC,YAAY,SACZrN,gBAAgB,GAChBnD,iBAAiB,mDACjByQ,oBAAoB,cACpBC,aAAa,cACbC,SAAS,WAGTC,kBAAkB,wDAClBC,kBAAkB,eAClBC,iBAAiB,WACjBC,sBAAsB,UACtBC,mBAAoB,cACpBC,uBAAwB,kBAGxBC,WAAW,SACX/W,KAAK,OACLgX,YAAY,cAGZC,SAAS,OAGTC,gBAAiB,SAGjBC,SAAU,OAGVC,eAAe,iBACfC,aAAa,eAGbrjB,WAAW,KACXG,eAAe,WAqBjB9P,UAAUkN,QACT+lB,aAAc,WACdC,WAAY,QACZC,UAAW,WACXC,UAAW,KACXC,SAAU,YACVC,UAAW,QACXnH,UAAW,KACXoH,SAAU,iBACVC,SAAU,iBACVlP,iBAAgB,EAChB/B,UAAW,EAEX+M,gBAAiB,EACjB5M,WAAY,EACZ8D,UAAW,GACX9F,UAAU,EACVyJ,YAAa,EACbC,UAAW,EACXqJ,YAAa,EACbxQ,gBAAiB,EACjByE,eAAgB,EAChBC,kBAAmB,EACnB+L,qBAAoB,EACpBC,oBAAmB,EAEnBC,uBAAuB,EACvBC,oBAAqB,EACrBC,qBAAsB,GAEtBrJ,WAAU,EACVsJ,uBAAwB,EAExBC,eAAe,EACfxL,iBAAiB,EACjBvJ,QAAQ,EAERgV,YAAY,EACZ1M,OAAM,EACN2M,WAAU,EACVC,WAAW,IACXC,qBAAoB,EAEpBvP,kBAAkB,EAElBwP,gBAAgB,EAChBhO,gBAAgB,EAChBiO,YAAa,YAAa,eAC1BC,cAAe,eAAgB,YAAa,eAC5CC,cAAe,eAAgB,kBAC/BC,eAAgB,kBAChB9H,UACCD,WACErsB,KAAM,cAAegP,OAAQ,IAAKud,OAAQ,OAAQjiB,KAAM,WAAYiG,OAAO,IAC3EvQ,KAAM,OAAQgP,OAAQ,GAAI1E,KAAM,OAAQiiB,OAAQ,UAGnD8H,2BAA2B,EAC3B7L,aAAa,GAEd7oB,UAAUqoB,aACVroB,UAAUqc,eAAe,WACxB,GAAI3M,GAAS1P,UAAUyP,OAAOC,MAC9BA;EAAOilB,aAAgBjlB,EAAOkiB,UAC9BliB,EAAOklB,eAAkBllB,EAAOmiB,YAChCniB,EAAOmlB,eAAkBnlB,EAAOsiB,WAGhC,IAAI1b,GAAEtW,UAAU2b,KAAKwU,YACjBlyB,EAAE+B,UAAUkN,OACZiN,EAAI,SAASpc,EAAEC,GAClB,IAAK,GAAIC,KAAKD,GACRD,EAAEE,KAAIF,EAAEE,GAAGD,EAAEC,IAEpBkc,GAAEna,UAAUqoB,WACXgL,SAAS/c,EAAErY,EAAEg1B,cACbC,WAAW5c,EAAErY,EAAEi1B,YACfE,UAAU,SAAS0B,EAAGC,GACrB,MAAO/0B,WAAUqoB,UAAUgL,SAASyB,GAAI,YAAY90B,UAAUqoB,UAAUgL,SAASrzB,UAAU2b,KAAKuF,IAAI6T,EAAG,GAAG,SAE3GC,eAAe1e,EAAErY,EAAEg1B,cACnBgC,iBAAiB3e,EAAErY,EAAEm1B,WACrB8B,gBAAgB5e,EAAErY,EAAEo1B,UACpBrI,WAAW1U,EAAErY,EAAEq1B,WACf6B,YAAY7e,EAAErY,EAAEq1B,WAChB8B,WAAW9e,EAAErY,EAAEq1B,WACfnH,UAAU7V,EAAErY,EAAEkuB,WACdoH,SAASvzB,UAAU2b,KAAK4U,YAAYtyB,EAAEs1B,SAASt1B,EAAEg2B,YACjDoB,YAAY/e,EAAErY,EAAEk1B,UAAUl1B,EAAEg2B,YAC5BqB,WAAWhf,EAAErY,EAAEs1B,SAASt1B,EAAEg2B,YAC1BT,SAASxzB,UAAU2b,KAAK4U,YAAYtyB,EAAEu1B,UACtC+B,aAAa,SAAStT,EAAMC,GAC3B,MAAOliB,WAAUqoB,UAAU+M,WAAWnT,GAAO,MAAMjiB,UAAUqoB,UAAU+M,WAAWlT;EAEnFsT,WAAW,SAASvT,EAAMC,EAAIvV,GAC7B,MAAOA,GAAGuB,MAEXunB,YAAY,WACX,MAAO,IAERzJ,iBAAiB,WAChB,MAAO,IAER9B,gBAAgB,WACf,MAAO,IAERwL,eAAe,SAASzT,GACvB,MAAOjiB,WAAUqoB,UAAU+M,WAAWnT,GAAO,KAE9C0T,eAAe,SAAS1T,EAAMC,EAAIvV,GACjC,MAAOA,GAAGuB,MAEX0nB,kBAAoB,SAASja,EAAMla,GAClC,MAAO,gBAAgBA,EAAM,gBAE9Bo0B,kBAAoB,WACnB,MAAO,IAERC,oBAAsB,WACrB,MAAO,MAGTt7B,KAAK8R,UAAU,wBAKhBtM,UAAUkR,IAAM,WAEf,MADK1W,MAAKu7B,QAAOv7B,KAAKu7B,OAAQ,GAAKtyB,OAAQC,WACpClJ,KAAKu7B;EAEb/1B,UAAUg2B,WACVh2B,UAAUi2B,SAAW,WACpBz7B,KAAKw7B,WACLx7B,KAAK07B,WACL17B,KAAK27B,aACL37B,KAAK8R,UAAU,kBAEhBtM,UAAUqM,SAAW,SAASmW,EAAYK,EAAU3U,EAAMpB,EAAIspB,GAC7D,IAAKv1B,UAAUO,OACd,MAAO5G,MAAKwnB,aACb,IAAIrV,GAAK6V,CACe,IAApB3hB,UAAUO,SACbuL,EAAKypB,MACLzpB,EAAG6V,WAAaA,EAChB7V,EAAGkW,SAAWA,EACdlW,EAAGuB,KAAOA,EACVvB,EAAGG,GAAKA,GAETH,EAAGG,GAAKH,EAAGG,IAAM9M,UAAUkR,MAC3BvE,EAAGuB,KAAOvB,EAAGuB,MAAQ,GAEO,gBAAjBvB,GAAG6V,aAAyB7V,EAAG6V,WAAahoB,KAAK6tB,UAAUmL,SAAS7mB,EAAG6V,aACxD,gBAAf7V,GAAGkW,WAAuBlW,EAAGkW,SAAWroB,KAAK6tB,UAAUmL,SAAS7mB,EAAGkW,UAE9E;GAAIvM,GAA4D,KAAvD9b,KAAK0S,OAAOoV,gBAAkB9nB,KAAK0S,OAAOqV,UAC/C5V,GAAG6V,WAAW9e,WAAaiJ,EAAGkW,SAASnf,WAC1CiJ,EAAGkW,SAASC,QAAQnW,EAAGkW,SAASnf,UAAY4S,GAE7C3J,EAAGwW,OAAS3oB,KAAK67B,cAAc1pB,EAE/B,IAAI8a,IAAUjtB,KAAKw7B,QAAQrpB,EAAGG,GAK9B,OAJAtS,MAAKw7B,QAAQrpB,EAAGG,IAAMH,EACtBnS,KAAK87B,cAAc3pB,GACdnS,KAAKuoB,UACTvoB,KAAK8R,UAAUmb,EAAS,eAAiB,kBAAmB9a,EAAGG,GAAIH,IAC7DA,EAAGG,IAEX9M,UAAU2hB,YAAc,SAAS7U,EAAI/J,GACpC,GAAI4J,GAAKnS,KAAKw7B,QAAQlpB,IACjB/J,GAAYvI,KAAK8R,UAAU,uBAAwBQ,EAAIH,KAASnS,KAAK8R,UAAU,gCAAiCQ,EAAIH,OAErHA,IACHnS,KAAK0kB,WAAa,WACX1kB,MAAKw7B,QAAQlpB,GACpBtS,KAAK87B,cAAc3pB,IAGpBnS,KAAK8R,UAAU,kBAAmBQ,EAAIH;EAEvC3M,UAAUqf,SAAW,SAASvS,GAC7B,MAAOtS,MAAKw7B,QAAQlpB,IAErB9M,UAAUu2B,SAAW,SAASzpB,EAAI0pB,GAC7BA,EAAK1pB,KACR0pB,EAAK1pB,GAAKA,GAEXtS,KAAKw7B,QAAQlpB,GAAM0pB,GAEpBx2B,UAAU6mB,aAAe,SAAS/Z,EAAI2pB,GACrC,IAAK,GAAI7xB,GAAIpK,KAAKk8B,UAAUt1B,OAAS,EAAGwD,GAAK,EAAGA,IAC3CpK,KAAKk8B,UAAU9xB,GAAGmG,aAAa,aAAe+B,GACjD2pB,EAAOj8B,KAAKk8B,UAAU9xB,GAAIA,IAE7B5E,UAAU22B,cAAgB,SAAS7pB,EAAI8pB,GACtC,GAAI9pB,GAAM8pB,EAAV,CACA,GAAIjqB,GAAKnS,KAAKw7B,QAAQlpB,EAClBH,KACHA,EAAGG,GAAK8pB,EACRp8B,KAAKw7B,QAAQY,GAAUjqB,QAChBnS,MAAKw7B,QAAQlpB,IAErBtS,KAAKqsB,aAAa/Z,EAAI,SAASga,GAC9BA,EAAE5X,aAAa,WAAY0nB,KAExBp8B,KAAK0kB,YAAcpS,IAAItS,KAAK0kB,WAAa0X,GACzCp8B,KAAKqlB,UAAY/S,IAAItS,KAAKqlB,SAAW+W,GAEzCp8B,KAAK8R,UAAU,mBAAoBQ,EAAI8pB;GAGxC,WAcC,IAAK,GAbDC,IAAS,OAAQ,OAAQ,aAAc,YAAa,WAAY,WAChEC,EAAgB,SAASz2B,GAC5B,MAAO,UAASyM,GAAM,MAAQ9M,WAAUqf,SAASvS,GAAKzM,KAEnD02B,EAAgB,SAAS12B,GAC5B,MAAO,UAASyM,EAAIhI,GACnB,GAAI6H,GAAK3M,UAAUqf,SAASvS,EAC5BH,GAAGtM,GAAQyE,EACX6H,EAAG4F,UAAW,EACd5F,EAAGwW,OAAS3oB,KAAK67B,cAAc1pB,GAC/B3M,UAAUs2B,cAAc3pB,GAAI,KAGrB/H,EAAI,EAAGA,EAAIiyB,EAAMz1B,OAAQwD,GAAK,EACtC5E,UAAU,WAAa62B,EAAMjyB,EAAI,IAAMkyB,EAAcD,EAAMjyB,IAC3D5E,UAAU,WAAa62B,EAAMjyB,EAAI,IAAMmyB,EAAcF,EAAMjyB,OAI7D5E,UAAUs2B,cAAgB,SAAS3pB,GAC9BnS,KAAKw8B,kBAAkBrqB,GAC1BnS,KAAKqtB,mBAELrtB,KAAKy8B,YAAYtqB,EAAGG;EAEtB9M,UAAUg3B,kBAAoB,SAASrqB,GAEtC,GAAIuqB,GAAoBvqB,EAAG6V,WAAahoB,KAAKmlB,WAAanlB,KAAKilB,UAAY9S,EAAGkW,QAE9E,IAAGqU,EAAiB,CAEnB,GAAIC,GAAqBxqB,EAAGkW,SAASF,YAAcnoB,KAAK0S,OAAOwV,YAAc/V,EAAGkW,SAASF,WAAanoB,KAAK0S,OAAOsZ,WAC5G7Z,EAAG6V,WAAWG,YAAcnoB,KAAK0S,OAAOwV,YAAc/V,EAAG6V,WAAWG,WAAanoB,KAAK0S,OAAOsZ,SAEnG,IAAG2Q,EACF,OAAO,CAIP,IAAI7U,IAAkB3V,EAAGkW,SAASnf,UAAYiJ,EAAG6V,WAAW9e,WAAa,KACxE0zB,EAAkB,IAAM58B,KAAK0S,OAAOsZ,UAAYhsB,KAAK0S,OAAOwV,WAE7D,OAAQJ,GAAiB8U,EAI1B,OAAO,GAGTp3B,UAAUq2B,cAAgB,SAAS1pB,GAClC,GAAI0qB,GAAQ1qB,EAAGkW,SAAS4D,UAAY9Z,EAAG6V,WAAWiE,SAElD;MAAK4Q,IAGQ,EAARA,IAAYA,EAAQ16B,KAAKinB,MAAMjX,EAAGkW,SAASnf,UAAYiJ,EAAG6V,WAAW9e,WAAa,QACrE,GAAT2zB,IAAe1qB,EAAGkW,SAASF,aAAehW,EAAGkW,SAASwC,eAAiB1Y,EAAG6V,WAAWG,YAAchW,EAAG6V,WAAW6C,eAHlH1Y,EAAG6V,WAAW8J,YAAc3f,EAAGkW,SAASyJ,YAAc3f,EAAG6V,WAAW6J,eAAiB1f,EAAGkW,SAASwJ,eAO1GrsB,UAAUs3B,mBAAqB,SAASC,GAEvC,GAAI9iB,KAEJ,KAAK,GAAI3H,KAAMtS,MAAKw7B,QACfx7B,KAAKw8B,kBAAkBx8B,KAAKw7B,QAAQlpB,OAClCyqB,GAAc/8B,KAAKw7B,QAAQlpB,GAAIqW,SAC/B3oB,KAAKg9B,aAAa1qB,EAAItS,KAAKw7B,QAAQlpB,KACtC2H,EAAMvP,KAAK1K,KAAKw7B,QAAQlpB,GAE5B;MAAO2H,IAERzU,UAAUw3B,aAAe,SAAS1qB,EAAIH,GACrC,GAAI8qB,GAASj9B,KAAK,UAAYA,KAAK8kB,MACnC,OAAO,GAAWmY,EAAO3qB,EAAIH,IAAM,GAEpC3M,UAAU03B,oBAAsB,SAAS/qB,GACxC,QAASA,EAAGwW,QAEbnjB,UAAU6nB,iBAAmB,SAAS8P,EAAKC,GAC1C,IAAKD,EAAK,CACT,GAAIn9B,KAAKq9B,YAER,YADAr9B,KAAKytB,cAAe,EAGrBztB,MAAKytB,cAAe,EAEpBztB,KAAK27B,aACLwB,EAAMn9B,KAAK88B,qBAAqB98B,KAAKkjB,aAAeljB,KAAK0S,OAAOud,YAEjE,IAAI,GAAI7lB,GAAG,EAAGkzB,EAAMH,EAAIv2B,OAAY02B,EAAJlzB,EAASA,IACxCpK,KAAKu9B,mBAAmBJ,EAAI/yB,GAG7B,IAAIpK,KAAK0S,OAAOud,YAAcjwB,KAAKkjB,YAAa,CAI/C,IAAK,GAFDsa,MACAC,KACKrzB,EAAI,EAAGA,EAAI+yB,EAAIv2B,OAAQwD,IAC3BpK,KAAKk9B,oBAAoBC,EAAI/yB,IAChCozB,EAAI9yB,KAAKyyB,EAAI/yB,IAEbqzB,EAAI/yB,KAAKyyB,EAAI/yB,GAIfpK;KAAK09B,mBAAqB19B,KAAKwhB,KAAoB,cAAE,GACrDxhB,KAAKkjB,aAAc,EACnBljB,KAAK29B,YAAYF,EAAKL,GACtBp9B,KAAKkjB,aAAc,EAGnBljB,KAAK09B,mBAAqB19B,KAAKwhB,KAAmB,aAAE,GACpDxhB,KAAKkjB,aAAc,EACnBljB,KAAK29B,YAAYH,EAAKJ,OAGtBp9B,MAAK09B,mBAAqB19B,KAAKwhB,KAAmB,aAAE,GACpDxhB,KAAK29B,YAAYR,EAAKC,IAKxB53B,UAAUo4B,gBAAkB,SAASr9B,GACpC,GAAI4gB,GAAO3b,UAAU2gB,cAAc5lB,GAAG4gB,IAClC3b,WAAUsM,UAAU,mBAAoBqP,KAE5C3b,UAAUyc,eAAed,EAAM,QAGhC3b,UAAUq4B,mBAAqB,SAAS1rB,GAKvC,IAAI,GAJA9E,GAASrN,KAAK09B,mBACdI,EAAW99B,KAAKwsB,YAAYra,GAGxB2J,EAAI3J,EAAG4rB,MAAOjiB,EAAI3J,EAAG6rB,MAAOliB,IAAI,CAEvCgiB,EAASC,MAAQjiB,EACjBgiB,EAASE,MAAQliB,EAAE,CAEnB;GAAIqF,GAAO3b,UAAU2b,KACjB8c,EAAOz4B,UAAUyf,SACrBgZ,GAAO9c,EAAKuF,IAAIuX,EAAMH,EAASI,OAAQ,QACvCD,EAAO9c,EAAKuF,IAAIuX,EAAMH,EAASC,MAAO,MACtC,IAAI92B,GAAQzB,UAAU24B,UAAUF,EAAM9c,EAAKuF,IAAIuX,EAAM,EAAG,QAAQr3B,OAE5DsiB,EAAMlpB,KAAKo+B,mBAAmBN,GAC9BO,EAAQnV,EAAIoV,GAAKpV,EAAItT,EAErBjS,EAAKjC,SAAS2G,cAAc,MAChC1E,GAAGsQ,QAAU,SAAS1T,GAAGiF,UAAUo4B,gBAAgBr9B,GAAGE,QACtDkD,EAAG4P,UAAY,iBACf5P,EAAGgJ,MAAM5L,IAAMmoB,EAAIjT,EAAI,KACvBtS,EAAGgJ,MAAM9L,KAAOqoB,EAAItT,EAAI,KACxBjS,EAAGgJ,MAAMiI,MAAQypB,EAAO,KACxB16B,EAAG6I,UAAYhH,UAAUqoB,UAAUuN,kBAAkB6C,EAAMh3B,GAC3DjH,KAAKk8B,UAAUxxB,KAAK/G,GAEpB0J,EAAOvB,YAAYnI,KAIrB6B,UAAU+3B,mBAAqB,SAASjrB,GACvC,GAAIA,EAAJ,CACA,GAAIH,EAEHA;EADgB,gBAAR,GACHnS,KAAKw7B,QAAQlpB,GAEbA,EACFH,IACJA,EAAGwW,OAASnjB,UAAUq2B,cAAc1pB,MAErC3M,UAAU3B,YAAY,iBAAkB2B,UAAU+3B,oBAClD/3B,UAAU3B,YAAY,eAAgB2B,UAAU+3B,oBAEhD/3B,UAAUm4B,YAAc,SAASR,EAAKC,GACrCD,EAAMn9B,KAAKu+B,mBAAmBpB,EAAKC,EAEnC,KAAK,GAAIhzB,GAAI,EAAGA,EAAI+yB,EAAIv2B,OAAQwD,IAC/B,GAAIpK,KAAKkjB,YACR,GAAsB,SAAnB1d,UAAUsf,MACZ9kB,KAAKw+B,iBAAiBrB,EAAI/yB,QACtB,CAEJ,GAAIq0B,GAAUj5B,UAAUkN,OAAOgsB,gBAC5BD,KAAoB,EAARA,GAAatB,EAAI/yB,GAAGu0B,QAAUF,EAE5Cz+B,KAAKw+B,iBAAiBrB,EAAI/yB,IACNgL,SAAZqpB,GAAyBtB,EAAI/yB,GAAGu0B,SAAWF,GAEnDj5B,UAAUq4B,mBAAmBV,EAAI/yB;KASnCpK,MAAK4+B,aAAazB,EAAI/yB,KAEzB5E,UAAU+4B,mBAAqB,SAASpB,EAAKC,GAC5C,GAAIyB,GAAK7+B,KAAKkiB,GAAG4c,WACbC,EAAQ/+B,KAAK0pB,OAAOE,QACpBhJ,EAAI5gB,KAAK0pB,OAAOE,SAAW,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAC7CvS,EAAOrX,KAAKwhB,KAAmB,aAAE,EAOrC,IAFC2b,EAHIn9B,KAAKkjB,YAGHljB,KAAKg/B,yBAAyB7B,EAAKC,GAFnCp9B,KAAKi/B,wBAAwB9B,EAAKC,GAIrCp9B,KAAKkjB,YACR,GAAIka,EACHp9B,KAAK0pB,OAAOE,QAAUmV,MAClB,CACJ,GAAIG,GAAM7nB,EAAK9M,UACf,IAAI20B,EAAIlhB,KAAM,CACb,IAAK,GAAI5T,GAAI,EAAGA,EAAI80B,EAAIlhB,KAAKpX,OAAQwD,IAAK,CACzCwW,EAAExW,IACF,IAAI+0B,GAAan/B,KAAK0pB,OAAO7U,OAAS7U,KAAKkiB,GAAGU,iBAC9C,IAAKhC,EAAExW,GAAMy0B,EAAKM,EAAY,CAE7B,GAAIC,GAAQF,EAAIlhB,KAAK5T,GAAGg1B,MACpBC,EAAUF,CACkB,GAA7Bn/B,KAAK0S,OAAOgsB,mBAAuB1+B,KAAK0S,OAAOgsB,kBAAoB9d,EAAExW,IAAMpK,KAAK0S,OAAOgsB,iBACzFW,EAAUze,EAAExW,GAAKy0B,GACP7+B,KAAK0S,OAAOgsB,iBAAmB,GAAKG,EAAKM,IACnDE,GAAWr/B,KAAK0S,OAAOgsB,iBAAmB,GAAKG,EAGhD;IAAK,GAAIpuB,GAAI,EAAGA,EAAI2uB,EAAMx4B,OAAQ6J,IACjC2uB,EAAM3uB,GAAGhG,WAAW,GAAGkC,MAAMkI,OAASwqB,EAAU,IAEjDze,GAAExW,IAAMwW,EAAExW,EAAI,IAAM,GAAKg1B,EAAM,GAAGjpB,aAEnCyK,EAAExW,IAAMwW,EAAExW,EAAI,IAAM,GAAK80B,EAAIlhB,KAAK5T,GAAGg1B,MAAM,GAAGjpB,aAG/C,GADAyK,EAAE0e,QAAQ,GACNJ,EAAIjzB,WAAWkK,aAAe+oB,EAAIjzB,WAAWuH,eAAiBhO,UAAUkkB,OAAO6V,YAAc/5B,UAAU0c,GAAGG,aAAc,CAE3H,GAAImd,GAAiBh6B,UAAUkkB,OAC9B+V,EAAYD,EAAeA,EAAenP,YAC1CqP,EAAcF,EAAe5V,QAAQ+V,OAEtCF,IAAcj6B,UAAU0c,GAAGG,cAAgB,EAC3CriB,KAAK8uB,kBAAkB2Q,EAAWz/B,KAAKilB,UAAWjlB,KAAKmlB,WACvD3f,UAAUkkB,OAAOE,QAAU8V,EAE3B1/B,KAAKojB,OAAOpjB,KAAKwhB,KAAqB,eAAE,GAAIie,EAAWz/B,KAAKkiB,GAAGI,cAC/D9c,UAAU2pB,eAAenvB,KAAKwhB,KAAqB,eAAE,IACrDhc,UAAUqrB,oBAAoB7wB,KAAKwhB,KAAmB,aAAE,GAAIxhB,KAAK0uB,sBAAuB1uB,KAAKilB,WAE7Fua,EAAeD,YAAa;MAK7B,IAFKpC,EAAIv2B,QAA4D,WAAlD5G,KAAKwhB,KAAoB,cAAE,GAAG7U,MAAMyjB,aACtDxP,EAAE,GAAK,IACJuc,EAAIv2B,QAAkB,IAARga,EAAE,GAAU,CAE7B,GAGIgf,IAHSV,EAAIjzB,WAAWxB,YAGCmW,EAAE,GAAK,GAAKie,EAAK,GAE1CgB,EAAwBD,EACxBE,EAA4BF,EAAwB,IACpD5/B,MAAK0S,OAAO6mB,yBACfsG,EAAwB19B,KAAKgnB,IAAIyW,EAAuB5/B,KAAK0S,OAAO6mB,wBACpEuG,EAA4BD,EAAwB,MAGrDxoB,EAAK1K,MAAM5L,IAAOf,KAAKwhB,KAAsB,gBAAE,GAAGrL,aAAenW,KAAKwhB,KAAqB,eAAE,GAAGrL,aAAe0pB,EAA0B,KACzIxoB,EAAK1K,MAAMkI,OAAU7U,KAAKqhB,KAAKlL,aAAejV,SAASmW,EAAK1K,MAAM5L,IAAK,KAAOf,KAAKkiB,GAAGO,YAAc,GAAM,IAE1G,IAAIsd,GAAoB//B,KAAKwhB,KAAoB,cAAE,EACnDue,GAAkBpzB,MAAMkI,OAASirB,EACjCC,EAAkBpzB,MAAMyjB,WAAsB,IAARxP,EAAE,GAAW,SAAW,SAG9D;GAAIof,GAAiBhgC,KAAKwhB,KAAoB,cAAE,EAChDwe,GAAerzB,MAAMkI,OAASirB,EAC9BE,EAAerzB,MAAMyjB,WAAsB,IAARxP,EAAE,GAAW,SAAW,UAC3Dof,EAAezsB,UAAYqN,EAAE,GAAK,qBAAuB,2BACzD5gB,KAAKypB,WAAa7I,EAAE,GAAK,GAAKie,EAC9Bje,EAAE,GAAK,EAEHif,GAAyBD,IAC5BvoB,EAAK1K,MAAM5L,IAAOG,SAASmW,EAAK1K,MAAM5L,KAAO,EAAK,KAElDg/B,EAAkBpzB,MAAMszB,UAAY,OACpCF,EAAkBpzB,MAAMiI,MAAS1T,SAAS6+B,EAAkBpzB,MAAMiI,OAAS,EAAK,KAEhForB,EAAerzB,MAAMoH,SAAW,QAChCisB,EAAerzB,MAAM5L,IAAM,GAC3Bi/B,EAAerzB,MAAM9L,KAAO,KAOjC,MAAOs8B,IAER33B,UAAUumB,gBAAkB,SAAS5Z,GACpC,MAAOhQ,MAAK2T,OAAO3D,EAAG6V,WAAW9e,UAAYlJ,KAAKilB,UAAU/b,WAAa,QAE1E1D,UAAU06B,2BAA6B,SAAS/tB,GAC/C,GAAIkW,GAAWlW,EAAGkW,QAClB;GAAIroB,KAAK0S,OAAOytB,sBAAuB,CACtC,GAAIC,IAAejuB,EAAGkW,SAAWlW,EAAG6V,YAAc,GAC9CoY,GAAcpgC,KAAKqgC,uBACtBhY,EAAWroB,KAAKmhB,KAAKuF,IAAI2B,EAAUroB,KAAKqgC,qBAAuBD,EAAa,WAG9E,MAAO/X,IAER7iB,UAAUy5B,wBAA0B,SAAS9B,EAAKC,GACjDD,EAAImD,KAAK,SAAS/8B,EAAGC,GACpB,MAAID,GAAEykB,WAAW9e,WAAa1F,EAAEwkB,WAAW9e,UACnC3F,EAAE+O,GAAK9O,EAAE8O,GAAK,EAAI,GACnB/O,EAAEykB,WAAaxkB,EAAEwkB,WAAa,EAAI,IAE1C,IAAI6L,MACA0M,IAEJvgC,MAAKqgC,qBAAuBl+B,KAAKinB,KAAgC,GAA3BppB,KAAKkiB,GAAGC,iBAAwBniB,KAAK0S,OAAO2W,aAElF,KAAK,GAAIjf,GAAI,EAAGA,EAAI+yB,EAAIv2B,OAAQwD,IAAK,CACpC,GAAI+H,GAAKgrB,EAAI/yB,GAGTklB,EAAKnd,EAAG6V,WACR6G,EAAK1c,EAAGkW,SAERmY,EAAKlR,EAAGnH,WACRsY,EAAK5R,EAAG1G,UAGZ;GADAhW,EAAG4rB,MAAQ/9B,KAAK+rB,gBAAgB5Z,GAC5BnS,KAAKgpB,SAAS7W,EAAG4rB,OAEpBZ,EAAIpkB,OAAO3O,EAAE,GACbA,QAHD,CASA,GAFKypB,EAAK1hB,EAAG4rB,SAAQlK,EAAK1hB,EAAG4rB,YAExBX,EAAM,CACVjrB,EAAGuuB,QAAS,CAIZ,KAFA,GAAIzmB,GAAQ4Z,EAAK1hB,EAAG4rB,OAEb9jB,EAAMrT,QAAQ,CACpB,GAAI+5B,GAAO1mB,EAAMA,EAAMrT,OAAS,GAC5Bg6B,EAAa5gC,KAAKkgC,2BAA2BS,EACjD,MAAIC,EAAW13B,WAAaiJ,EAAG6V,WAAW9e,WAGzC,KAFA+Q,GAAMlB,OAAOkB,EAAMrT,OAAS,EAAG,GAOjC,IAAK,GAFDi6B,GAAa5mB,EAAMrT,OACnBk6B,GAAY,EACPrwB,EAAI,EAAGA,EAAIwJ,EAAMrT,OAAQ6J,IAAK,CACtC,GAAIkwB,GAAO1mB,EAAMxJ,GACbmwB,EAAa5gC,KAAKkgC,2BAA2BS,EACjD,IAAIC,EAAW13B,WAAaiJ,EAAG6V,WAAW9e,UAAW,CACpD43B,GAAY,EACZ3uB,EAAGwsB,QAAUgC,EAAKhC,QAClBkC,EAAapwB,EACb0B,EAAGuuB,QAAS,CACZ,QAOF,GAHIzmB,EAAMrT,SACTqT,EAAMA,EAAMrT,OAAS,GAAG85B,QAAS,IAE7BI,EACJ,GAAI7mB,EAAMrT,OACT,GAAIqT,EAAMrT,QAAUqT,EAAMA,EAAMrT,OAAS,GAAG+3B,QAAS,CACpD,GAAK1kB,EAAMA,EAAMrT,OAAS,GAAG+3B,QAG5B,IAAKluB,EAAI,EAAGA,EAAIwJ,EAAMrT,OAAQ6J,IAAK,CAElC,IAAK,GADDswB,IAAa,EACRC,EAAI,EAAGA,EAAI/mB,EAAMrT,OAAQo6B,IACjC,GAAI/mB,EAAM+mB,GAAGrC,SAAWluB,EAAG,CAC1BswB,GAAa,CACb;MAGF,IAAKA,EAAY,CAChB5uB,EAAGwsB,QAAUluB,CACb,YAZF0B,GAAGwsB,QAAU,CAedxsB,GAAGuuB,QAAS,MACN,CACN,GAAIO,GAAchnB,EAAM,GAAG0kB,OAC3B,KAAKluB,EAAI,EAAGA,EAAIwJ,EAAMrT,OAAQ6J,IACzBwJ,EAAMxJ,GAAGkuB,QAAUsC,IACtBA,EAAchnB,EAAMxJ,GAAGkuB,QAEzBxsB,GAAGwsB,QAAUsC,EAAc,EAC3B9uB,EAAGuuB,QAAS,MAIbvuB,GAAGwsB,QAAU,CAGf1kB,GAAMlB,OAAO8nB,EAAYA,GAAc5mB,EAAMrT,OAAS,EAAI,EAAGuL,GAEzD8H,EAAMrT,QAAUqT,EAAMinB,WAAa,IACtCjnB,EAAMinB,UAAYjnB,EAAMrT,OACxBuL,EAAGgvB,OAASlnB,EAAMrT,QAElBuL,EAAGgvB,OAAUhvB,EAAS,OAAIA,EAAGgvB,OAAS,GAIpCX,EAAKxgC,KAAK0S,OAAOwV,YAAcuY,GAAMzgC,KAAK0S,OAAOsZ,aAGpDuU,EAAc71B,KAAKyH,GACnBgrB,EAAI/yB,GAAK+H,EAAKnS,KAAKohC,YAAYjvB,GAE3BquB,EAAKxgC,KAAK0S,OAAOwV,aACpB/V,EAAG6V,WAAWI,SAASpoB,KAAK0S,OAAOwV,YACnC/V,EAAG6V,WAAWyM,WAAW,IAEtBgM,GAAMzgC,KAAK0S,OAAOsZ,YACrB7Z,EAAGkW,SAASoM,WAAW,GACvBtiB,EAAGkW,SAASD,SAASpoB,KAAK0S,OAAOsZ,YAG9B7Z,EAAG6V,WAAa7V,EAAGkW,UAAYmY,GAAMxgC,KAAK0S,OAAOsZ,aACpDmR,EAAIpkB,OAAO3O,EAAG,GACdA;EAKH,IAAKgzB,EAAM,CACV,IAAK,GAAIhzB,GAAI,EAAGA,EAAI+yB,EAAIv2B,OAAQwD,IAC/B+yB,EAAI/yB,GAAG+2B,OAAStN,EAAKsJ,EAAI/yB,GAAG2zB,OAAOmD,SAEpC,KAAK,GAAI92B,GAAI,EAAGA,EAAIm2B,EAAc35B,OAAQwD,IACzCm2B,EAAcn2B,GAAG+2B,OAAStN,EAAK0M,EAAcn2B,GAAG2zB,OAAOmD,UAGzD,MAAO/D,IAER33B,UAAU67B,YAAc,SAASlE,GAChCA,EAAImD,KAAK,SAAS/8B,EAAGC,GACpB,MAAID,GAAEykB,WAAW9e,WAAa1F,EAAEwkB,WAAW9e,UACtC3F,EAAEolB,SAAWnlB,EAAEmlB,OAAe,GAC7BplB,EAAEolB,QAAUnlB,EAAEmlB,OAAe,GAC3BplB,EAAE+O,GAAK9O,EAAE8O,GAAK,EAAI,GAEnB/O,EAAEykB,WAAaxkB,EAAEwkB,WAAa,EAAI,MAG3CxiB,UAAUw5B,yBAA2B,SAAS7B,EAAKC,GAClDp9B,KAAKqhC,YAAYlE,EAgBjB,KAAK,GAJDnV,GAXAlN,KACAwmB,yBASA9d,EAAMxjB,KAAK0pB,OAAOE,QAElBnK,EAAOzf,KAAK+oB,MAAMniB,OAClB26B,KAEKn3B,EAAI,EAAGA,EAAI+yB,EAAIv2B,OAAQwD,IAAK,CACpC,GAAI+H,GAAKgrB,EAAI/yB,GACTkI,EAAKH,EAAGG,EACPivB;EAAYjvB,KAChBivB,EAAYjvB,IACXkvB,aAAa,EACbC,YAAY,GAGd,IAAIC,GAAaH,EAAYjvB,GACzBgd,EAAMtH,GAAc7V,EAAG6V,WACvB6G,EAAK1c,EAAGkW,QAERiH,GAAKtvB,KAAKilB,YACbyc,EAAWF,aAAc,EACzBlS,EAAKtvB,KAAKilB,WAEP4J,EAAK7uB,KAAKmlB,YACbuc,EAAWD,YAAa,EACxB5S,EAAK7uB,KAAKmlB,UAGX,IAAIwc,GAAW3hC,KAAK4hC,kBAAkBtS,GAAI,EAAOnd,EAIjD,IAHAA,EAAG4rB,MAAQ4D,EAAWliB,GAGlBzf,KAAKgpB,SAAS7W,EAAG4rB,SAAU5rB,EAAGwW,OAAlC,CAEA,GAAIkZ,GAAW7hC,KAAK4hC,kBAAkB/S,GAAI,EAAM1c,IAAOsN,CACvDtN,GAAG6rB,MAAS6D,EAAWpiB,GAASA,EAChCtN,EAAG2vB,QAAUD,EAAWF,EAGxBxvB,EAAG+rB,OAAS/7B,KAAK2T,OAAO9V,KAAKsqB,eAAegF,EAAGpmB,UAAW,GAAKlJ,KAAKilB,UAAU/b,YAAc,MAAsBuW,GAGlH,IAEIsiB,GAFA9nB,EAAQqnB,EAAMnvB,EAAG+rB,OAIrB,KAAK6D,EAAa,EAAGA,EAAa9nB,EAAMrT,UACnCqT,EAAM8nB,GAAY/D,OAAS7rB,EAAG4rB,OADagE,KAQhD,GAJK5vB,EAAGwsB,SAAYvB,IACnBjrB,EAAGwsB,QAAUoD,GAGV5vB,EAAG4rB,MAAQ5rB,EAAG2vB,SAAWriB,EAC5BuI,EAAa,KACblN,EAAIpQ,KAAKyH,GACT8H,EAAM8nB,GAAc5vB,EAEpBqR,EAAIrR,EAAG+rB,QAAUjkB,EAAMrT,OAAS,EAChCuL,EAAG6vB,aAAeN,EAAWF,YAC7BrvB,EAAG8vB,YAAcP,EAAWD;IAP7B,CASC,GAAI/L,GAAO11B,KAAKohC,YAAYjvB,EAC5BujB,GAAKpjB,GAAKH,EAAGG,GACbojB,EAAKoM,QAAUriB,EAAOtN,EAAG4rB,MACzBrI,EAAKsI,MAAQve,EACbiW,EAAKqI,MAAQ5rB,EAAG4rB,MAChBrI,EAAKwI,OAAS/rB,EAAG+rB,OACjBxI,EAAKiJ,QAAUxsB,EAAGwsB,QAClBjJ,EAAKrN,SAAWroB,KAAKmhB,KAAKuF,IAAI4I,EAAIoG,EAAKoM,QAAS,OAChDpM,EAAKsM,aAAeN,EAAWF,YAC3BE,EAAWF,cACdE,EAAWF,aAAc,GAG1B1mB,EAAIpQ,KAAKgrB,GACTzb,EAAM8nB,GAAcrM,EACpB1N,EAAa0N,EAAKrN,SAElB7E,EAAIrR,EAAG+rB,QAAUjkB,EAAMrT,OAAS,EAChCwD,MAIF,MAAO0Q,IAERtV,UAAU08B,YAAc,WACvB,GAAI3+B,GAAI,GAAI0F,MAAKjJ,KAAKgoB,YAClBxkB,EAAI,GAAIyF,MAAKjJ,KAAKqoB,SACtBroB,MAAKgoB,WAAazkB,EAClBvD,KAAKqoB,SAAW7kB,GAEjBgC,UAAU47B,YAAc,SAASjvB,GAEhC,MADAnS,MAAKkiC,YAAY37B,UAAY4L,EACtB,GAAInS,MAAKkiC;EAGjB18B,UAAU02B,aACV12B,UAAUm2B,WAAa,WACtB,IAAK,GAAIvxB,GAAI,EAAGA,EAAIpK,KAAKk8B,UAAUt1B,OAAQwD,IAAK,CAC/C,GAAIzE,GAAM3F,KAAKk8B,UAAU9xB,EACrBzE,GAAIsG,YAAYtG,EAAIsG,WAAWG,YAAYzG,GAEhD3F,KAAKk8B,cAEN12B,UAAUof,YAAc,SAAStS,GAChC,GAAIH,GAAKnS,KAAK6kB,SAASvS,EACvBtS,MAAKy8B,YAAYnqB,GAEbH,GAAMnS,KAAKw8B,kBAAkBrqB,IAAOnS,KAAKg9B,aAAa1qB,EAAIH,KAAQnS,KAAKkjB,aAAeljB,KAAK0S,OAAOud,WAAa9d,EAAGwW,UACjH3oB,KAAK0S,OAAOyZ,cACfnsB,KAAKqtB,mBAELrtB,KAAKqtB,kBAAkBlb,IAAK,KAG/B3M,UAAUi3B,YAAc,SAASnqB,GAChCtS,KAAKqsB,aAAa/Z,EAAI,SAASnI,EAAMC,GAChCD,EAAK8B,YACR9B,EAAK8B,WAAWG,YAAYjC,GAC7B3E,UAAU02B,UAAUnjB,OAAO3O,EAAG;IAGhC5E,UAAU28B,aAAe,SAAShhB,GACjC,GAAIihB,GAAuB,GAAlBjhB,EAAKgH,WAAkBhH,EAAK0J,YACrC,OAAS1oB,MAAKC,OAAY,GAALggC,EAAU,IAAgC,GAAzBpiC,KAAK0S,OAAOwV,WAAkB,GAAK,KAAQloB,KAAK0S,OAAO2W,aAAe,OAAiD,GAA3BrpB,KAAK0S,OAAO2W,eAE/I7jB,UAAU68B,cAAgB,SAASlwB,EAAImwB,GACtCA,EAAaA,GAAc,CAC3B,IAAIF,GAAgC,GAA3BjwB,EAAG6V,WAAWG,WAAkBhW,EAAG6V,WAAW6C,aACnD0X,EAA+B,GAAzBpwB,EAAGkW,SAASF,WAAkBhW,EAAGkW,SAASwC,cAA+C,GAA7BrlB,UAAUkN,OAAOsZ,UACnFjrB,EAAMf,KAAKmiC,aAAahwB,EAAG6V,YAE3BnT,EAAS1S,KAAKqhB,IAAI8e,GAAaC,EAAKH,GAAMpiC,KAAK0S,OAAO2W,aAAe,GACzE,QACCtoB,IAAKA,EACL8T,OAAQA,IAGVrP,UAAUo5B,aAAe,SAASzsB,GACjC,GAAIqwB,GAAOh9B,UAAU0c,GAAGM,WACpBigB,EAAeziC,KAAK0S,OAA4B,sBAAI,EAAI8vB,CAC5D;KAAIrwB,EAAG4rB,MAAQ,GAAf,CAEA,GAAI1wB,GAAS7H,UAAUk9B,cAAcvwB,EAAG4rB,MACxC,IAAK1wB,EAAL,CAEA,GAAIs1B,GAAQ3iC,KAAKqiC,cAAclwB,EAAI3M,UAAU0c,GAAGC,kBAC5CphB,EAAM4hC,EAAM5hC,IACf8T,EAAS8tB,EAAM9tB,OAEZ+tB,EAAWzwB,EAAGgvB,QAAU,EACxB0B,EAAY1wB,EAAGwsB,SAAW,EAE1B/pB,EAAQzS,KAAK2T,OAAOzI,EAAOsT,YAAc8hB,GAAeG,GACxD/hC,EAAOgiC,EAAYjuB,EAAQ,CAE/B,IADKzC,EAAGuuB,SAAQ9rB,GAAiBguB,EAAWC,GACxC7iC,KAAK0S,OAAO0mB,sBAAuB,CACtC,GAAI0J,GAAQ9iC,KAAK0S,OAAO2mB,oBACpB0J,EAAS/iC,KAAK0S,OAAO4mB,oBACzBz4B,GAAOgiC,EAAYC,EAAQC,CAC3B,IAAIC,GAAS7wB,EAAS,QAAKywB,EAAWC,EAAY,GAAKC,EAAQC,EAAS,EAAI,CAC5EnuB,GAAQzS,KAAK2T,MAAMzI,EAAOsT,YAAc8hB,EAAc5hC,EAAOmiC,GAG9D,GAAIlnB,GAAI9b,KAAKijC,cAAc9wB,EAAIswB,EAAc5hC,EAAME,EAAK6T,EAAOC,EAAQ1C,EAAG+wB,YAAa19B,UAAUqoB,UAAUkN,aAAa5oB,EAAG6V,WAAY7V,EAAGkW,SAAUlW,GAAK3M,UAAUqoB,UAAUmN,WAAW7oB,EAAG6V,WAAY7V,EAAGkW,SAAUlW,GAOpN;GALAnS,KAAKk8B,UAAUxxB,KAAKoR,GACpBzO,EAAOvB,YAAYgQ,GAEnBjb,EAAOA,EAAOK,SAASmM,EAAOV,MAAM9L,KAAM,IAAM4hC,EAE5CziC,KAAKqlB,UAAYlT,EAAGG,GAAI,CAE3BwJ,EAAEnP,MAAMw2B,OAAS,EACjBvuB,EAAQzS,KAAKqhB,IAAI5O,EAAQ,EAAGpP,UAAU0c,GAAGS,cACzC7G,EAAIpa,SAAS2G,cAAc,OAC3ByT,EAAEpH,aAAa,WAAYvC,EAAGG,IAC9BtS,KAAKojB,OAAOtH,EAAGlH,EAAOC,EAAS,GAAIhU,EAAME,EAAM,IAC/C+a,EAAEvI,UAAY,8BAEd,IAAI6vB,GAAW59B,UAAUqoB,UAAUoN,YAAY9oB,EAAG6V,WAAY7V,EAAGkW,SAAUlW,EAExEixB,KACFtnB,EAAEvI,WAAa,IAAM6vB,EAEtB,IAAI7I,GAAK74B,SAAS2G,cAAc,MAChCrI,MAAKojB,OAAOmX,EAAI3lB,EAAQ,EAAGC,EAAS,IACpC0lB,EAAG5tB,MAAM02B,SAAW,2CAEpBvnB,EAAEhQ,YAAYyuB,GACdv6B,KAAKwhB,KAAmB,aAAE,GAAG1V,YAAYgQ,GACzC9b,KAAKk8B,UAAUxxB,KAAKoR,GAEpBye,EAAG/tB,UAAY,oCAAsC2F,EAAGuB,KAAO,cAC3D1T,KAAK2hB,WAAU4Y,EAAGhwB,WAAWoC,MAAMkI,OAASA,EAAS,GAAK,MAC9D7U,KAAKsjC,QAAU/I,EAAGhwB,WAClBvK,KAAKsjC,QAAQhwB,UAAY,SAAS/S,GACjC,IAAKA,GAAKE,OAAO8iC,SAAU,OAAO,CAClC;GAAIxwB,IAAQxS,GAAKE,OAAOwS,OACpBF,IAAQvN,UAAU0U,KAAK2I,WAAWrd,UAAUkU,UAAS,GACrD3G,GAAQvN,UAAU0U,KAAK4I,aAAatd,UAAUkU,UAAS,IAE5D1Z,KAAKsjC,QAAQ13B,cAAgB,SAAUrL,GAEtC,OADCA,GAAKE,OAAO2S,cAAe,GACrB,GAER5N,UAAU0tB,OAAOqH,EAAGhwB,YAAY,GAEhCvK,KAAKwhB,KAAmB,aAAE,GAAGzf,WAAa,EAE3C,GAA2B,IAAvB/B,KAAKkiB,GAAGM,YAAoBxiB,KAAK0kB,YAAcvS,EAAGG,GAAI,CACrDtS,KAAK0S,OAAO0mB,uBAAyBp5B,KAAK+lB,aAC7CjK,EAAEnP,MAAMw2B,OAAS,EAKlB,KAAK,GAJDK,GAAQxjC,KAAK0S,OAAO,UAAa1S,KAAKqlB,UAAYlT,EAAGG,GAAM,OAAS,WACpEmxB,EAAY,GACZC,EAAYvxB,EAAGwxB,MAAS,qBAAuBxxB,EAAGwxB,MAAQ,IAAO,GACjEA,EAASxxB,EAAGyxB,UAAa,UAAYzxB,EAAGyxB,UAAY,IAAO,GACtDx5B,EAAI,EAAGA,EAAIo5B,EAAM58B,OAAQwD,IACjCq5B,GAAa,6BAA+BD,EAAMp5B,GAAK,YAAcs5B,EAAgBC,EAAQ,YAAc3jC,KAAKiV,OAAOC,OAAOsuB,EAAMp5B,IAAM,UAC3I;GAAIzE,GAAM3F,KAAKijC,cAAc9wB,EAAItR,EAAO2hC,EAAO,EAAGzhC,EAAKyhC,EAAqB,GAAfgB,EAAM58B,OAAc,GAAK,EAAG,GAAI,eAAiB88B,EAAgBC,EAAQ,iCAAkCF,GAAW,EACnL99B,GAAIgH,MAAM9L,KAAOA,EAAO2hC,EAAO,EAC/BxiC,KAAKwhB,KAAmB,aAAE,GAAG1V,YAAYnG,GACzC3F,KAAKk8B,UAAUxxB,KAAK/E,GAElB3F,KAAK0S,OAAOmnB,gBAAkB75B,KAAK6lB,UAAY1T,EAAGG,IACpDtS,KAAK6jC,uBAAuB1xB,MAG9B3M,UAAUy9B,cAAgB,SAAU9wB,EAAIyD,EAAGK,EAAGyK,EAAGE,EAAGjU,EAAOm3B,EAAUC,EAAUC,GAC9E,GAAIloB,GAAIpa,SAAS2G,cAAc,OAC3BiK,EAAKH,EAAGG,GACR2xB,EAAK,EAAW,oCAAsC,gBAEtDC,EAAM1+B,UAAUqoB,UAAUoN,YAAY9oB,EAAG6V,WAAY7V,EAAGkW,SAAUlW,EAClE+xB,KAAKD,EAAKA,EAAK,IAAMC,EAEzB;GAAIR,GAAYvxB,EAAGwxB,MAAS,cAAgBxxB,EAAGwxB,MAAQ,IAAO,GAC1DA,EAASxxB,EAAGyxB,UAAa,SAAWzxB,EAAGyxB,UAAY,IAAO,GAE1DvS,EAAO,kBAAoB/e,EAAK,YAAc2xB,EAAK,mCAAqChuB,EAAI,YAAcL,EAAI,cAAgB8K,EAAI,GAAK,cAAgBE,EAAI,OAASjU,GAAS,IAAM,UACvLmP,GAAEtP,UAAY6kB,CAEd,IAAI8S,GAAYroB,EAAEpP,WAAU,GAAMnC,UAElC,KAAKy5B,GAAUx+B,UAAU4+B,YAAYD,EAAWhyB,EAAIuO,EAAGE,EAAGkjB,EAAUC,GACnE,MAAOI,EAEPA,GAAYroB,EAAEvR,UAEd,IAAI85B,GAAa,yDAA2D3jB,EAAI,GAAK,MAAQgjB,EAAW,iBACxGW,IAAc,gDAAkDX,EAAgBC,EAAQ,KAAOG,EAAW,SAC1GO,GAAc,wCAA0C3jB,GAAK1gB,KAAK0hB,QAAU,EAAI,KAAO,eAAiBd,GAAK5gB,KAAK0hB,QAAU,GAAK,IAAM,GAAK,MAAQgiB,EAAgBC,EAAQ,KAAOI,EAAW,QAE9L;GAAIO,GAAe,6BASpB,OARKN,KACHM,EAAe,qBAAuBA,GAEvCD,GAAc,eAAiBC,EAAe,oBAAsB5jB,EAAI,GAAK,OAASsjB,EAAS,oBAAsB,IAAWN,EAAgBC,EAAQ,YAExJQ,EAAU33B,UAAY63B,EAGhBF,GAER3+B,UAAU4+B,YAAc,WACvB,OAAO,GAER5+B,UAAUk9B,cAAgB,SAASpX,GAClC,MAAkB,OAAdtrB,KAAK8kB,MAAuB9kB,KAAKwhB,KAAmB,aAAE,GAAGjX,WACtDvK,KAAKwhB,KAAmB,aAAE,GAAG/W,WAAW6gB,IAEhD9lB,UAAUo8B,kBAAoB,SAASzgB,EAAMojB,GAC5C,GAAIjZ,GAAMnpB,KAAK2T,OAAO9V,KAAKsqB,eAAenJ,EAAM,GAAKnhB,KAAKilB,WAAa,MAGvE,OADIsf,IAAQvkC,KAAKmhB,KAAK8J,UAAU9J,IAAOmK,IAChCA;EAKR9lB,UAAUg/B,eAAiB,SAASC,EAAOC,EAAWC,GACrD,IAAI3kC,KAAKwoB,YACR,MAAOic,EACJzkC,MAAKwoB,YAAYoc,aAGpBH,EAAQzkC,KAAKwoB,YAAYoc,aAFzB5kC,KAAKwoB,YAAYoc,aAAeH,CAKjC,KADA,GAAII,GAAQH,EAAYD,EACjBI,EAAQH,EAAaC,GAC3BF,IACAI,GAASH,CAGV,OADAD,GAAQtiC,KAAKqhB,IAAIihB,EAAO,IAIzBj/B,UAAU44B,mBAAqB,SAASjsB,GACvC,GAAIyD,GAAI5V,KAAK0pB,OAAOvX,EAAG4rB,OACnBO,EAAKt+B,KAAK0pB,OAAOvX,EAAG6rB,MACpBM,IAAM1oB,IAAG0oB,EAAKt+B,KAAK0pB,OAAOvX,EAAG6rB,MAAQ,GACzC,IAAIa,GAAK7+B,KAAKkiB,GAAG4c,WAEb2F,EAAQtyB,EAAGwsB,OACf,IAAGxsB,EAAGG,IAAMtS,KAAK6lB,SAAS,CACzB,GAAIsZ,GAAan/B,KAAK0pB,OAAOE,QAAQzX,EAAG+rB,OAAS,GAAKl+B,KAAK0pB,OAAOE,QAAQzX,EAAG+rB,QAASl+B,KAAKkiB,GAAGU,iBAC9F6hB,GAAQj/B,UAAUg/B,eAAeC,EAAO5F,EAAIM;CAE7C,GAAI2F,GAAkBL,EAAQ5F,EAC1B5oB,EAAIjW,KAAK0pB,OAAOE,QAAQzX,EAAG+rB,SAAWl+B,KAAK0pB,OAAO7U,OAAU7U,KAAKkiB,GAAGK,mBAAqB,EAAK,GAAMuiB,CACxG,QAAQlvB,EAAEA,EAAG0oB,GAAGA,EAAIroB,EAAEA,IAGvBzQ,UAAUg5B,iBAAmB,SAAUrsB,GACtC,GAAI9E,GAASrN,KAAK09B,mBACdxU,EAAMlpB,KAAKo+B,mBAAmBjsB,GAE9B8D,EAAIiT,EAAIjT,EACRL,EAAIsT,EAAItT,EACR0oB,EAAKpV,EAAIoV,GAGTyG,EAAgB,EAIpB,IAAKzG,EAAL,CAEA,GAAI0G,GAAYx/B,UAAUkN,OAAOwmB,qBAAqC,SAAdl5B,KAAK8kB,SAC1D3S,EAAGwW,QAAUnjB,UAAUkN,OAAOymB,oBAE7Brd,EAAIpa,SAAS2G,cAAc,OAC3B48B,EAAc9yB,EAAGgI,eAAe,iBAAmBhI,EAAG6vB,aACzDkD,EAAe/yB,EAAGgI,eAAe,gBAAkBhI,EAAG8vB,YAEnDkD,EAAcH,IAAc7yB,EAAGwW,QAAUsc,GACzCG,EAAeJ,IAAc7yB,EAAGwW,QAAUuc,GAE1CjB,EAAK;EACJ9xB,EAAGwW,QAAUqc,KACjBf,EAAK,sBAEHgB,IACFhB,GAAM,6BAEJiB,IACFjB,GAAM,2BAEJkB,IACFJ,GAAiB,+DAEfK,IACFL,GAAiB,4DAGlB,IAAIb,GAAM1+B,UAAUqoB,UAAUoN,YAAY9oB,EAAG6V,WAAY7V,EAAGkW,SAAUlW,EAClE+xB,KACHD,GAAM,IAAMC,EAGb,IAAIR,GAAYvxB,EAAGwxB,MAAS,cAAgBxxB,EAAGwxB,MAAQ,IAAO,GAC1DA,EAASxxB,EAAGyxB,UAAa,SAAWzxB,EAAGyxB,UAAY,IAAO,GAE1DyB,GACH,oBACA,OAASpvB,EAAI,KACb,QAAUL,EAAI,KACd,UAAY0oB,EAAK1oB,EAAI,IAAM,KAC3B+tB,EACAD,EACCvxB,EAAG+wB,aAAe,IAClB9oB,KAAK,KAEHiX,EAAO,kBAAoBlf,EAAGG,GAAK,YAAc2xB,EAAK,YAAYoB,EAAW,IAC7EL;IACH3T,GAAQ0T,GAEuB,SAA7Bv/B,UAAU6T,WAAWzL,OACvBuE,EAAK3M,UAAUqf,SAAS1S,EAAGG,KAGxBH,EAAGwW,SACN0I,GAAQ7rB,UAAUqoB,UAAUqN,eAAe/oB,EAAG6V,WAAY7V,EAAGkW,SAAUlW,IACxEkf,GAAQ7rB,UAAUqoB,UAAUsN,eAAehpB,EAAG6V,WAAY7V,EAAGkW,SAAUlW,GAAM,SAC7Ekf,GAAQ,SAERvV,EAAEtP,UAAY6kB,EAEdrxB,KAAKk8B,UAAUxxB,KAAKoR,EAAEvR,YACtB8C,EAAOvB,YAAYgQ,EAAEvR,cAGtB/E,UAAUgf,cAAgB,SAASra,GAElC,IADA,GAAImI,GAAK,KACFnI,IAASmI,GAAMnI,EAAKoG,cAC1B+B,EAAKnI,EAAKoG,aAAa,YACvBpG,EAAOA,EAAK8B,UAEb,OAAOqG,IAGR9M,UAAU4hB,KAAO,SAAS9U,GACrBtS,KAAKqlB,UAAY/S,IACrBtS,KAAK0Z,UAAS,EAAOpH,GACrBtS,KAAKqlB,SAAW/S,EAChBtS,KAAK4kB,YAAYtS;EAElB9M,UAAUkU,SAAW,SAAS9L,EAAM0E,GACnC,IAAIA,GAAMtS,KAAKqlB,UAAY/S,EAA3B,CACA,GAAIH,GAAKnS,KAAK6kB,SAAS7kB,KAAKqlB,SACxBlT,KACCvE,IAAMuE,EAAGuB,KAAO1T,KAAKsjC,QAAQh5B,OACjCtK,KAAKqlB,SAAW,KAChBrlB,KAAKsjC,QAAU,KACftjC,KAAK4kB,YAAYzS,EAAGG,IACpBtS,KAAKslC,iBAAiBnzB,EAAIvE,MAG5BpI,UAAU8/B,iBAAmB,SAASnzB,EAAIvE,GACrC5N,KAAKylB,YACH7X,EAIJ5N,KAAK8R,UAAU,gBAAiBK,EAAGG,GAAIH,IAHnCA,GACHnS,KAAKmnB,YAAYhV,EAAGG,IAAI,GAI1BtS,KAAKylB,WAAa,MAEd7X,GACH5N,KAAK8R,UAAU,kBAAmBK,EAAGG,GAAIH,KAK5C3M,UAAU24B,UAAY,SAAS5P,EAAMC,GACpC,GAAI1d,KACJ,KAAK,GAAIvN,KAAKvD,MAAKw7B,QAAS,CAC3B,GAAIrpB,GAAKnS,KAAKw7B,QAAQj4B,EAClB4O;KAAUoc,IAASC,GAAQrc,EAAG6V,WAAawG,GAAMrc,EAAGkW,SAAWkG,IAClEzd,EAAOpG,KAAKyH,GAEd,MAAOrB,IAERtL,UAAU+/B,iBAAmB,SAASjzB,GACrC,GAAKA,EAAL,CAGA,IAAK,GADDkzB,GAAkBhgC,UAAU02B,UACvB9xB,EAAE,EAAGA,EAAEo7B,EAAgB5+B,OAAQwD,IAAK,CAC5C,GAAIq7B,GAAiBD,EAAgBp7B,EACrC,IAAIq7B,EAAel1B,aAAa,aAAe+B,EAC9C,MAAOmzB,GAGT,MAAO,QAERjgC,UAAUkgC,UAAY,SAASpzB,EAAI1E,GAClC,GAAIuE,GAAmB,gBAANG,IAA+B,gBAANA,GAAkB9M,UAAUqf,SAASvS,GAAMA,CAGrF,IAFA1E,EAAOA,GAAMpI,UAAUsf,MAElB3S,KAAOnS,KAAKgS,WAAW,yBAA4BhS,KAAK8R,UAAU,wBAAyBK,EAAIvE,KAApG,CAGA,GAAI6iB,GAAcjrB,UAAUkN,OAAO+d,WACnCjrB,WAAUkN,OAAO+d,YAActe,EAAG6V,WAAWG,UAC7C;GAAI6F,GAAkBxoB,UAAUkN,OAAOsb,eACvCxoB,WAAUkN,OAAOsb,iBAAkB,CAEnC,IAAI2X,GAAiBxzB,EAAGwxB,MACpBiC,EAAsBzzB,EAAGyxB,SACzBp+B,WAAUkN,OAAOwnB,4BACpB/nB,EAAGwxB,MAAQn+B,UAAUkN,OAAOmzB,sBAC5B1zB,EAAGyxB,UAAYp+B,UAAUkN,OAAOozB,4BAGjCtgC,UAAUyc,eAAe,GAAIhZ,MAAKkJ,EAAG6V,YAAapa,GAElDuE,EAAGwxB,MAAQgC,EACXxzB,EAAGyxB,UAAYgC,EACfpgC,UAAUkN,OAAO+d,YAAcA,EAC/BjrB,UAAUkN,OAAOsb,gBAAkBA,EAE/BxoB,UAAU0lB,QAAU1lB,UAAU0lB,OAAOtd,KACxCpI,UAAUgc,KAAKwE,aAAa,GAAGnkB,UAAYf,eAAe0E,UAAU+/B,iBAAiBpzB,EAAGG,KAAOxR,eAAe0E,UAAUgc,KAAKwE,aAAa,IAAM,IAGjJxgB,UAAUsM,UAAU,uBAAwBK,EAAIvE;GAGjDpI,UAAUugC,oBAAsB,SAASC,GACxC,IAAGA,EAAE/5B,WAAL,CACA,GAAIg6B,GAAOzgC,UAAUgc,KAAmB,aAAE,GAEtC0kB,EAAQD,EAAKE,SACdD,GAAM3yB,WAAa2yB,EAAM3yB,UAAU7Q,QAAQ,oBAAsB,GAAKwjC,EAAME,kBAC9EF,EAAQA,EAAME,iBAEXF,GAAyD,IAAhDA,EAAM3yB,UAAU7Q,QAAQ,qBACpCwjC,EAAMp6B,YAAYk6B,KAIpBxgC,UAAU6gC,wBAA0B,SAASL,EAAGvlC,GAC/C,GAAI6lC,GAAO9gC,UAAU68B,cAAc5hC,EAAO,EAC1CulC,GAAEr5B,MAAM5L,IAAMulC,EAAKvlC,IAAM,KACzBilC,EAAEr5B,MAAMkI,OAASyxB,EAAKzxB,OAAS,MAGhCrP,UAAUq+B,uBAAyB,SAASpjC,GAC3C,GAAIulC,GAAItkC,SAAS2G,cAAc,MAE/B29B,GAAEtxB,aAAa,WAAYjU,EAAM6R,IACjCtS,KAAKk8B,UAAUxxB,KAAKs7B,GACpBhmC,KAAKqmC,wBAAwBL,EAAGvlC,EAEhC;GAAIkT,GAAM3T,KAAK6tB,UAAUwN,kBAAkB56B,EAAMunB,WAAYvnB,EAAM4nB,SAAU5nB,GACzE4wB,EAAOrxB,KAAK6tB,UAAUyN,oBAAoB76B,EAAMunB,WAAYvnB,EAAM4nB,SAAU5nB,EAChFulC,GAAEzyB,UAAY,kBACXI,IACFqyB,EAAEzyB,WAAa,IAAMI,GACnB0d,IACF2U,EAAEx5B,UAAY6kB,GACfrxB,KAAK+lC,oBAAoBC,IAE1BxgC,UAAUk2B,WACVl2B,UAAUgoB,MAAQ,SAAS9mB,EAAK6nB,GAG/B,GAFA7nB,EAAMA,GAAO1G,KAAKumC,UAElB,CAKA7/B,IAA4B,IAApBA,EAAIhE,QAAQ,KAAa,IAAM,KAAO,cAAe,GAAKuG,OAAQuhB,oBACtExqB,KAAK0S,OAAO8zB,gBAAkB9/B,GAAO,QAAU1G,KAAK0W,MACxD,IAAI8X,EAGJ,IAFAD,EAAOA,GAAQvuB,KAAK+kB,MAEhB/kB,KAAKutB,WAAY,CACpB,GAAIkZ,GAAKzmC,KAAK6tB,UAAUgN,WAGxB;IADAtM,EAAOvuB,KAAKmhB,KAAKnhB,KAAKutB,WAAa,UAAU,GAAItkB,MAAKslB,EAAKrlB,YACpDqlB,EAAOvuB,KAAKilB,WAAWsJ,EAAOvuB,KAAKmhB,KAAKuF,IAAI6H,EAAM,GAAIvuB,KAAKutB,WAClEiB,GAAKD,CAGL,KADA,GAAImY,IAAa,EACVlY,EAAKxuB,KAAKmlB,WAChBqJ,EAAKxuB,KAAKmhB,KAAKuF,IAAI8H,EAAI,EAAGxuB,KAAKutB,YAC3BvtB,KAAK07B,QAAQ+K,EAAGlY,KAAUmY,EAC7BnY,EAAOvuB,KAAKmhB,KAAKuF,IAAI6H,EAAM,EAAGvuB,KAAKutB,YAAkBmZ,GAAa,CAGpE,IAAIC,GAAUnY,CACd,GACCA,GAAKmY,EACLA,EAAU3mC,KAAKmhB,KAAKuF,IAAI8H,EAAI,GAAIxuB,KAAKutB,kBAC7BoZ,EAAUpY,GAAQvuB,KAAK07B,QAAQ+K,EAAGE,IAE3C,IAAUpY,GAANC,EACH,OAAO,CAER,KADAhoB,WAAWC,IAAIC,EAAM,SAAW+/B,EAAGlY,GAAQ,OAASkY,EAAGjY,GAAK,SAASoY,GAAIphC,UAAUqhC,QAAQD,KAC7EpY,EAAPD,GACNvuB,KAAK07B,QAAQ+K,EAAGlY,KAAS,EACzBA,EAAOvuB,KAAKmhB,KAAKuF,IAAI6H,EAAM,EAAGvuB,KAAKutB;KAGpC/mB,YAAWC,IAAIC,EAAK,SAASkgC,GAAIphC,UAAUqhC,QAAQD,IAEpD,OADA5mC,MAAK8R,UAAU,aACR,IAERtM,UAAUqhC,QAAU,SAASC,GAC5B,GAAI3J,EAEHA,GADGn9B,KAAK+mC,UAA6B,OAAjB/mC,KAAK+mC,SACnB/mC,KAAKA,KAAK+mC,UAAUC,MAAMF,EAAO7mC,OAAOgI,cAExCjI,KAAKinC,cAAcH,GAG1BthC,UAAU0hC,iBAAiB/J,GAE3Bn9B,KAAK8R,UAAU,aAEhBtM,UAAU0hC,iBAAmB,SAAS/J,GACrCn9B,KAAKuoB,UAAW,EAChBvoB,KAAKq9B,aAAc,CACnB,KAAK,GAAIjzB,GAAI,EAAGA,EAAI+yB,EAAIv2B,OAAQwD,IAC1BpK,KAAK8R,UAAU,kBAAmBqrB,EAAI/yB,MAC3CpK,KAAK6R,SAASsrB,EAAI/yB,GAEnBpK,MAAKq9B,aAAc,EACfr9B,KAAKytB,cAAcztB,KAAKqtB,mBAE5BrtB,KAAKuoB,UAAW,EACZvoB,KAAKmnC,aAAannC,KAAKmnC,cAC3BnnC,KAAKmnC,YAAc;EAEpB3hC,UAAU4hC,YAAc,SAAS3mC,GAChCA,EAAMiT,KAAQjT,EAAMiT,MAAQjT,EAAM4mC,WAAc,GAChD5mC,EAAMunB,WAAaxiB,UAAU8hC,WAAW7mC,EAAMunB,YAC9CvnB,EAAM4nB,SAAW7iB,UAAU8hC,WAAW7mC,EAAM4nB,WAG7C7iB,UAAU8hC,WAAa,SAASnmB,GAC/B,MAAIA,GAEc,gBAARA,GACF3b,UAAUqoB,UAAUkL,SAAS5X,GACzB,GAAIlY,MAAKkY,GAHb,MAMT3b,UAAU+hC,QACV/hC,UAAU+hC,KAAKP,MAAQ,SAAS3vB,MACZ,gBAARA,QACV7R,UAAUgiC,MAAQp1B,KAAK,IAAMiF,KAAO,KACpCA,KAAQ7R,UAAe,MAAIA,UAAUgiC,MAAMnwB,MAAQ7R,UAAUgiC,MAAM1rB,GAAKtW,UAAUgiC,UAG/EnwB,KAAKowB,eACR/hC,OAAO2U,aAAehD,KAAKowB,aAE5B;GAAIC,aAAeliC,UAAUgiC,OAAShiC,UAAUgiC,MAAME,YAAeliC,UAAUgiC,MAAME,eACjFC,oBAAqB,CACzB,KAAK,GAAI5wB,OAAO2wB,aACf,GAAIA,YAAYvtB,eAAepD,KAAM,CACpC4wB,oBAAqB,CACrB,IAAInV,YAAakV,YAAY3wB,KACzBwG,IAAM/X,UAAUitB,WAAW1b,IAC/B,KAAKwG,IAAK,QACVA,KAAIxE,OAAO,EAAGwE,IAAI3W,OAClB,KAAK,GAAI6J,GAAI,EAAGA,EAAI+hB,WAAW5rB,OAAQ6J,IAAK,CAC3C,GAAIm3B,QAASpV,WAAW/hB,GACpB9K,KAAQoR,IAAK6wB,OAAOt9B,MAAOsZ,MAAOgkB,OAAOhkB,MAC7C,KAAK,GAAIikB,cAAcD,QACtB,GAAIA,OAAOztB,eAAe0tB,YAAa,CACtC,GAAkB,SAAdA,YAAuC,SAAdA,WAC5B,QACDliC;IAAIkiC,YAAcD,OAAOC,YAG3BtqB,IAAI7S,KAAK/E,MAIRgiC,oBACHniC,UAAUsM,UAAU,mBAGrB,KAAK,GADDqrB,QACK/yB,EAAI,EAAGA,EAAIiN,KAAKzQ,OAAQwD,IAAK,CACrC,GAAI3J,OAAQ4W,KAAKjN,EACjB5E,WAAU4hC,YAAY3mC,OACtB08B,IAAIzyB,KAAKjK,OAEV,MAAO08B,MAER33B,UAAUwhC,MAAQ,SAAS3vB,EAAMlH,GAChCnQ,KAAK+mC,SAAW52B,EAChBnQ,KAAK6mC,SAAS5mC,QAASgI,aAAcoP,MAEtC7R,UAAU0Z,KAAO,SAASxY,EAAKY,GACX,gBAARA,KACVtH,KAAK+mC,SAAWz/B,EAChBA,EAAOjB,UAAU,IAGlBrG,KAAKumC,UAAY7/B,EACjB1G,KAAKmnC,YAAc7/B,EACnBtH,KAAKwtB,MAAM9mB,EAAK1G,KAAK+kB,QAGtBvf,UAAUsiC,YAAc,SAASl6B,GACpB,OAARA,IAAeA,EAAO,IAC1B5N,KAAKutB,WAAa3f;EAGnBpI,UAAUitB,WAAa,SAAS5sB,EAAMkiC,GACrC,MAAIA,IACH/nC,KAAKyyB,WAAW5sB,GAAQkiC,EAAMpI,MAAM,GAC7B3/B,KAAKyyB,WAAW5sB,KAExB7F,KAAKyyB,WAAW5sB,GAAS7F,KAAKyyB,WAAW5sB,OAClC7F,KAAKyyB,WAAW5sB,KAExBL,UAAUwiC,aACVxiC,UAAUyhC,cAAgB,SAASH,GAClC,GAAIx1B,EACJ,KAAKw1B,EAAOv/B,cAAe,CAC1B,GAAI0gC,GAAanB,EAAO7mC,OAAOgI,YAC/B6+B,GAAS,GAAInnC,qBAAoB,cACjCmnC,EAAO9+B,cAAcigC,GAItB,GADA32B,EAAMw1B,EAAOv/B,cAAc,QACR,QAAf+J,EAAIpL,QAAmB,QAC3B,IAAIgiC,GAAO52B,EAAIf,aAAa,eACxB23B,KACHxiC,OAAO2U,aAAe6tB,EAGvB,KAAK,GADD3gB,GAAOuf,EAAOl9B,QAAQ,kBACjBQ,EAAI,EAAGA,EAAImd,EAAK3gB,OAAQwD,IAAK,CACrC,GAAI+9B,GAAO5gB,EAAKnd,GAAGmG,aAAa,OAC5BgN,EAAMvd,KAAKyyB,WAAW0V,EAC1B;GAAK5qB,EAAL,CACAA,EAAIxE,OAAO,EAAGwE,EAAI3W,OAElB,KAAK,GADDwhC,GAAOtB,EAAOl9B,QAAQ,UAAW2d,EAAKnd,IACjCqG,EAAI,EAAGA,EAAI23B,EAAKxhC,OAAQ6J,IAAK,CAIrC,IAAK,GAHD43B,GAAMD,EAAK33B,GACX4rB,EAAQgM,EAAIh+B,WACZ1E,GAAQoR,IAAKqxB,EAAK33B,GAAGF,aAAa,SAAUqT,MAAOwkB,EAAK33B,GAAGF,aAAa,UACnEywB,EAAI,EAAGA,EAAI3E,EAAMz1B,OAAQo6B,IAAK,CACtC,GAAIsH,GAAOjM,EAAM2E,EACI,UAAjBsH,EAAKp5B,UAAwC,SAAjBo5B,EAAKp5B,WAErCvJ,EAAI2iC,EAAKp5B,UAAYo5B,EAAK99B,WAE3B+S,EAAI7S,KAAK/E,KAGP4hB,EAAK3gB,QACRpB,UAAUsM,UAAU,mBAGrB,KAAK,GADDy2B,GAAKzB,EAAOl9B,QAAQ,cACfQ,EAAI,EAAGA,EAAIm+B,EAAG3hC,OAAQwD,IAAK,CACnC,GAAIo+B,GAAMxoC,KAAKyoC,eAAeF,EAAGn+B,GACjCpK,MAAKgoC,UAAUQ,EAAI3iC,MAAQ2iC,EAAI90B,KAGhC,GAAIypB,KACJ7rB,GAAMw1B,EAAOl9B,QAAQ,UAErB,KAAK,GAAIQ,GAAI,EAAGA,EAAIkH,EAAI1K,OAAQwD,IAAK,CACpC,GAAI+H,GAAKgrB,EAAI/yB,GAAKpK,KAAKyoC,eAAen3B,EAAIlH,GAC1C5E;UAAU4hC,YAAYj1B,GAEvB,MAAOgrB,IAER33B,UAAUijC,eAAiB,SAASt+B,GAEnC,IAAK,GADDnE,MACKoE,EAAI,EAAGA,EAAID,EAAKE,WAAWzD,OAAQwD,IAC3CpE,EAAEmE,EAAKE,WAAWD,GAAGvE,MAAQsE,EAAKE,WAAWD,GAAGE,KAEjD,KAAK,GAAIF,GAAI,EAAGA,EAAID,EAAKM,WAAW7D,OAAQwD,IAAK,CAChD,GAAIs+B,GAAQv+B,EAAKM,WAAWL,EACN,IAAlBs+B,EAAMC,WACT3iC,EAAE0iC,EAAMxiC,SAAWwiC,EAAMn+B,WAAam+B,EAAMn+B,WAAWC,UAAY,IAKrE,MAFKxE,GAAE0N,OAAM1N,EAAE0N,KAAOvJ,EAAKI,WAAaJ,EAAKI,WAAWC,UAAY,IAE7DxE,GAERR,UAAU3B,YAAY,QAAS,WAC9B,GAAI7D,KAAK0S,OAAOk2B,gBAAiB,EAAM,CACtC,GAAI5iC,EACJA,GAAIhG,KAAK0S,OAAOk2B,aAAelnC,SAAS2G,cAAc,OACtDrC,EAAEuN,UAAY,cACdvN,EAAE2G,MAAM9L,KAAOsB,KAAKC,OAAOpC,KAAK+iB,GAAK,KAAO,GAAK,KACjD/c,EAAE2G,MAAM5L,IAAMoB,KAAKC,OAAOpC,KAAKgjB,GAAK,IAAM,GAAK,KAC/ChjB,KAAKqhB,KAAKvV,YAAY9F;IAGxBR,UAAU3B,YAAY,QAAS,WAC9B,GAAImC,GAAIhG,KAAK0S,OAAOk2B,YAChB5iC,IAAiB,gBAALA,KACdhG,KAAKqhB,KAAKjV,YAAYpG,GACtBhG,KAAK0S,OAAOk2B,cAAe,KAQ9BpjC,UAAUqjC,MACT7B,MAAM,SAASvkC,GACd,GAAI4U,GAAO5U,EAAIolB,MAAMihB,OAAO9oC,KAAK+oC,QAAQ,SAAS/oC,KAAKgpC,MAAM,IAC7D,IAAK3xB,EAAKzQ,OAAV,CAGAyQ,EAAK,GAAGA,EAAK,GAAGnP,QAAQ,uBAAuB,KAE/CmP,EAAK,GAAGA,EAAK,GAAGnP,QAAQ,gBAAgB,IAMxC,KAHA,GACI2f,GADAohB,KAEAC,EAAUJ,OAAO,MAAM9oC,KAAKmpC,QAAQ,gBAAgBnpC,KAAKopC,MAAM,IAAI,KACjC,QAA9BvhB,EAAMqhB,EAAQG,KAAKhyB,KAAgB,CAI1C,IAHA,GACIiyB,GADA/oC,KAEAgpC,EAAU,mBAC4B,QAAlCD,EAAMC,EAAQF,KAAKxhB,EAAM,MAChC7nB,KAAKwpC,YAAYF,EAAMhwB,WAAW/Y,EAC/BA;EAAEmW,MAAQnW,EAAE+R,KAAI/R,EAAE+R,GAAK/R,EAAEmW,KAC7BuyB,EAASv+B,KAAKnK,GAEf,MAAO0oC,KAERO,YAAY,SAAS/mC,EAAIkD,GACxB,GAAImW,GAAIrZ,EAAIC,QAAQ,IACnB,IAAO,IAAHoZ,EAAJ,CAED,GAAIjW,GAAOpD,EAAIgM,OAAO,EAAEqN,GAAGvZ,cACvB+H,EAAQ7H,EAAIgM,OAAOqN,EAAE,GAAG5T,QAAQ,QAAQ,KAAKA,QAAQ,WAAW,GAC1D,YAANrC,EACHA,EAAK,OACS,WAANA,GACRA,EAAO,aACPyE,EAAQtK,KAAKypC,WAAWn/B,EAAM,EAAE,IAElB,SAANzE,IACRA,EAAO,WACPyE,EAAQtK,KAAKypC,WAAWn/B,EAAM,EAAE,IAEjC3E,EAAIE,GAAMyE,IAEXm/B,WAAW,SAASn/B,EAAMo/B,EAAGC,GAC5B,GAAI3jC,GAAIsE,EAAMzC,MAAM,IAChB7B,GAAE,KACL0jC,EAAG1jC,EAAE,GAAGyI,OAAO,EAAE,GACjBk7B,EAAG3jC,EAAE,GAAGyI,OAAO,EAAE,GAElB,IAAIkb,GAAK3jB,EAAE,GAAGyI,OAAO,EAAE,GACnBm7B,EAAK1oC,SAAS8E,EAAE,GAAGyI,OAAO,EAAE,GAAG,IAAI,EACnCmgB,EAAK5oB,EAAE,GAAGyI,OAAO,EAAE,EACvB;MAAIjJ,WAAUkN,OAAO+mB,aAAezzB,EAAE,GAC9B,GAAIiD,MAAKA,KAAK4gC,IAAIlgB,EAAGigB,EAAGhb,EAAG8a,EAAGC,IAE/B,GAAI1gC,MAAK0gB,EAAGigB,EAAGhb,EAAG8a,EAAGC,IAE7BZ,QAAQ,kBACRI,QAAQ,eACRC,MAAM,aACNJ,MAAM,iBAEPxjC,UAAUskC,sBACVtkC,UAAUukC,YAAc,SAASlkC,GAChC,GAAI6M,GAAS1S,KAAK0S,OAAOyf,SAASD,SAC9B9nB,EAAG,CACP,KAAKA,EAAGA,EAAIsI,EAAO9L,QACd8L,EAAOtI,GAAGvE,MAAQA,EADIuE,KAG3B,GAAI6oB,GAAUvgB,EAAOtI,EAChB5E,WAAUwkC,WACdxkC,UAAUykC,aACX,IAAI7a,GAAS1tB,SAAS8T,eAAeyd,EAAQ3gB,IACzCnI,EAAOilB,EAAO8a,YAEdp5B,GACHmiB,QAASA,EACT7D,OAAQA,EACRjlB,KAAMA,EACNggC,SAAS,SAASh4B,GACjB,MAAO3M,WAAU4kC,YAAYnX,EAAQ9iB,MAAMk6B,UAAUlgC,EAAOgI,MAAS8gB;EAEtEqX,SAAS,SAAShgC,EAAO6H,GACxB,MAAO3M,WAAU4kC,YAAYnX,EAAQ9iB,MAAMo6B,UAAUpgC,EAAMG,EAAQ6H,MAAS8gB,KAI1E3yB,EAAUkF,UAAUskC,mBAAmB,OAAO7W,EAAQ9iB,KAAK,WAC/D,OAAO7P,GAAQA,EAAQwQ,GAAQA,GAEhCtL,UAAUskC,mBAAmBU,qBAAuB,SAAS15B,GAE5D,MADAA,GAAO25B,QAAU35B,EAAO3G,KACjB2G,GAERtL,UAAUskC,mBAAmBY,mBAAqB,SAAS55B,GAE1D,MADAA,GAAO25B,QAAU35B,EAAO3G,KAAKvC,qBAAqB,UAAU,GACrDkJ,GAERtL,UAAUskC,mBAAmBa,qBAAuB,SAAS75B,GAE5D,MADAA,GAAO25B,QAAU35B,EAAO3G,KAAKvC,qBAAqB,YAAY,GACvDkJ,GAERtL,UAAUskC,mBAAmBc,iBAAmB,SAAS95B,GAExD,MADAA,GAAO25B,QAAU35B,EAAO3G,KAAKvC,qBAAqB,UAC3CkJ;EAERtL,UAAU4kC,aACTS,UACEnX,OAAQ,SAASoX,GACjB,GAAIj2B,IAAQi2B,EAAIj2B,QAAQ,MAAM,IAC9B,OAAO,6DAA6DA,EAAO,aAE5E01B,UAAU,SAASpgC,EAAKG,GACvBH,EAAKqC,UAAYlC,GAAO,IAEzB+/B,UAAU,SAASlgC,GAClB,MAAOA,GAAKqC,WAAW,IAExB4J,MAAO,cAGR20B,UACCrX,OAAO,SAASoX,GACf,GAAIj2B,IAAQi2B,EAAIj2B,QAAQ,OAAO,IAC/B,OAAO,4CAA4CA,EAAO,kCAE3D01B,UAAU,SAASpgC,EAAKG,GACvBH,EAAKI,WAAWD,MAAMA,GAAO,IAE9B+/B,UAAU,SAASlgC,GAClB,MAAOA,GAAKI,WAAWD;EAExB8L,MAAM,SAASjM,GACd,GAAI5G,GAAE4G,EAAKI,UAAY/E,WAAU0tB,OAAO3vB,GAAG,KAG7CkhB,QACCiP,OAAO,SAASoX,GAGf,IAAK,GAFDj2B,IAAQi2B,EAAIj2B,QAAQ,MAAM,KAC1Bwc,EAAK,4CAA4Cxc,EAAO,kCACnDzK,EAAE,EAAGA,EAAI0gC,EAAIzY,QAAQzrB,OAAQwD,IACrCinB,GAAM,kBAAkByZ,EAAIzY,QAAQjoB,GAAG2M,IAAI,KAAK+zB,EAAIzY,QAAQjoB,GAAGwZ,MAAM,WAEtE,OADAyN,IAAM,mBAGPkZ,UAAU,SAASpgC,EAAKG,EAAM6H,EAAG24B,GAChC,GAAIrmB,GAASta,EAAKI,YACbka,EAAOumB,eAAiBF,EAAIG,WAChCxmB,EAAOwmB,SAAWH,EAAIG,SACtBxmB,EAAOumB,eAAgB,GAEJ,mBAAT1gC,KACVA,GAASma,EAAO4N,QAAQ,QAAQ/nB,OACjCma,EAAOna,MAAMA,GAAO;EAErB+/B,UAAU,SAASlgC,GAClB,MAAOA,GAAKI,WAAWD,OAExB8L,MAAM,SAASjM,GACd,GAAI5G,GAAE4G,EAAKI,UAAY/E,WAAU0tB,OAAO3vB,GAAG,KAG7C2nC,MACCxX,OAAO,SAASoX,GACVA,EAAIK,cAERL,EAAIK,aAAe,QAAS,KAAM,KAAM,OAGzCL,EAAIM,qBACJ,IAAID,GAAcL,EAAIK,YAElBE,EAAM7lC,UAAUkN,OAChB44B,EAAKtrC,KAAKmhB,KAAKoK,UAAU/lB,UAAU4b,gBACnCmqB,EAAO,KAAOC,EAAQ,CACvBhmC,WAAUkN,OAAO+4B,oBACnBF,EAAO,GAAGF,EAAIrf,UAAU,EACxBwf,EAAQ,GAAGH,EAAInjB,WACfojB,EAAGljB,SAASijB,EAAInjB,YAIjB,KAAK,GAFDmJ,GAAO,GAEFqa,EAAI,EAAGA,EAAIP,EAAYvkC,OAAQ8kC,IAAK,CAC5C,GAAIC,GAAcR,EAAYO,EAO9B,QAJIA,EAAI,IACPra,GAAQ,KAGDsa,GACP,IAAK,KACJb,EAAIM,mBAAmB,GAAKM,EAE5Bra,GAAM,UAEN;IAAK,GADDua,GAAON,EAAGzZ,cAAc,EACnBznB,EAAE,EAAO,GAAJA,EAAQA,IACrBinB,GAAM,mBAAmBua,EAAKxhC,GAAG,MAAMwhC,EAAKxhC,GAAG,WAChDinB,IAAM,YACN,MACD,KAAK,KACJyZ,EAAIM,mBAAmB,GAAKM,EAE5Bra,GAAM,UACN,KAAK,GAAIjnB,GAAE,EAAO,GAAJA,EAAQA,IACrBinB,GAAM,kBAAkBjnB,EAAE,KAAKpK,KAAKiV,OAAOkM,KAAKoT,WAAWnqB,GAAG,WAC/DinB,IAAQ,WACR,MACD,KAAK,KACJyZ,EAAIM,mBAAmB,GAAKM,EAE5Bra,GAAM,UACN,KAAK,GAAIjnB,GAAE,EAAO,GAAJA,EAAQA,IACrBinB,GAAM,kBAAkBjnB,EAAE,KAAKA,EAAE,WAClCinB,IAAQ,WACR,MACD,KAAK,QACJyZ,EAAIM,mBAAmB,GAAKM,EAE5Bra,GAAQ,UACR,IAAIjnB,GAAIohC,EACJK,EAAQP,EAAGrf,SAGf,KAFA6e,EAAIgB,gBAEIP,EAAFnhC,GAAO,CACZ,GAAI8gC,GAAKlrC,KAAK6tB,UAAU8M,YAAY2Q,EACpCja;GAAM,kBAAkBjnB,EAAE,KAAK8gC,EAAK,YACpCJ,EAAIgB,aAAaphC,KAAKN,GACtBkhC,EAAGhjB,QAAQgjB,EAAGpiC,UAAgC,GAAtBlJ,KAAK0S,OAAOqV,UAAa,IACjD,IAAIgkB,GAAQT,EAAGrf,WAAW4f,EAAO,EAAE,CACnCzhC,GAAO,GAAL2hC,EAAQ,GAAiB,GAAdT,EAAGnjB,WAAcmjB,EAAGzgB,aAElCwG,GAAQ,aAKX,MAAO,wFAAwFA,EAAK,iFAAiFA,EAAK,UAE3LkZ,UAAU,SAASpgC,EAAKG,EAAM6H,EAAGO,GAmDhC,QAASs5B,GAAsB5X,EAAEhqB,EAAE0R,GAKlC,IAAK,GAJDmwB,GAAcv5B,EAAOo5B,aACrBI,EAA4B,GAAbpwB,EAAEqM,WAAcrM,EAAE+O,aACjCshB,EAAcD,EACdE,GAAc,EACTpL,EAAE,EAAGA,EAAEiL,EAAYrlC,OAAQo6B,IAAK,CACxC,GAAIqL,GAAMJ,EAAYjL,EACtB;GAAIqL,IAAQH,EAAc,CACzBE,GAAc,CACd,OAESF,EAANG,IACHF,EAAcE,GAGhBjY,EAAEhqB,EAAEtE,EAAI,IAAIwE,MAAM,EAAc4hC,EAAaC,EACxCC,GAAeD,IACnB/X,EAAEhqB,EAAEtE,EAAI,IAAIwmC,cAAgB,IAE7BlY,EAAEhqB,EAAEtE,EAAI,IAAIwE,MAAMwR,EAAEmQ,UACpBmI,EAAEhqB,EAAEtE,EAAI,IAAIwE,MAAMwR,EAAEgW,WACpBsC,EAAEhqB,EAAEtE,EAAI,IAAIwE,MAAMwR,EAAE+V,cAvErB,GAGI7J,GAAYK,EAHZgjB,EAAM7lC,UAAUkN,OAChB0hB,EAAEjqB,EAAKvC,qBAAqB,UAC5B9B,EAAM4M,EAAO04B,kBAGjB,IAAGC,EAAI1T,SAAU,CAChB,IAAKxtB,EAAKoiC,UAAU,CACnB,GAAIlb,GAAO,mFAAmF7rB,UAAUyP,OAAOC,OAAOyiB,SAAS,wBAC1HnyB,WAAUkN,OAAO85B,YACrBnb,EAAOlnB,EAAKi8B,gBAAgB55B,UAAU6kB,GACvClnB,EAAKi8B,gBAAgB55B,UAAU6kB,EAC/BlnB,EAAKoiC,WAAU;CAEhB,GAAIE,GAAMtiC,EAAKi8B,gBAAgBx+B,qBAAqB,SAAS,EAC7D6kC,GAAMC,QAAqD,IAA1ClnC,UAAU2b,KAAK8J,UAAU9Y,EAAG6V,aAA2D,IAAxCxiB,UAAU2b,KAAK8J,UAAU9Y,EAAGkW,UAE5F+L,EAAEtuB,EAAI,IAAI6mC,SAASF,EAAMC,QACzBtY,EAAGtuB,EAAI,GAAKsuB,EAAExtB,OAAO,GAAI+lC,SAASF,EAAMC,QAExCD,EAAMx4B,QAAU,WACf,GAAGw4B,EAAMC,QAAS,CACjB,GAAI/mC,KACJH,WAAU4kC,YAAYc,KAAKb,UAAUlgC,EAAKxE,EAAI+M,GAE9CsV,EAAaxiB,UAAU2b,KAAKoK,UAAU5lB,EAAIqiB,YAC1CK,EAAW7iB,UAAU2b,KAAKoK,UAAU5lB,EAAI0iB,YAEnCA,IAAaL,IAAgBK,IAAaL,IAA0C,IAA3B7V,EAAGkW,SAASF,YAAiD,IAA7BhW,EAAGkW,SAASwC,iBACzGxC,EAAW7iB,UAAU2b,KAAKuF,IAAI2B,EAAU,EAAG,QAG7C+L,EAAEtuB,EAAI,IAAI6mC,SAASF,EAAMC,QACzBtY,EAAGtuB,EAAI,GAAKsuB,EAAExtB,OAAO,GAAI+lC,SAASF,EAAMC,QAExCV,EAAsB5X,EAAE,EAAEpM,GAAY7V,EAAG6V,YACzCgkB,EAAsB5X,EAAE,EAAE/L,GAAUlW,EAAGkW;EAIzC,GAAGgjB,EAAIuB,eAAiBvB,EAAIvjB,eAM3B,IAAI,GALA+kB,GAA0B,WAC7B7kB,EAAa,GAAI/e,MAAKmrB,EAAEtuB,EAAI,IAAIwE,MAAM8pB,EAAEtuB,EAAI,IAAIwE,MAAM8pB,EAAEtuB,EAAI,IAAIwE,MAAM,EAAE8pB,EAAEtuB,EAAI,IAAIwE,OAClF+d,EAAW,GAAIpf,MAAK+e,EAAW4M,UAA+C,GAAlCpvB,UAAUkN,OAAOoV,eAAsB,KACnFkkB,EAAsB5X,EAAG,EAAG/L,IAErBje,EAAE,EAAK,EAAFA,EAAKA,IACjBgqB,EAAEhqB,GAAG6gC,SAAW4B,CA4BlBb,GAAsB5X,EAAE,EAAEjiB,EAAG6V,YAC7BgkB,EAAsB5X,EAAE,EAAEjiB,EAAGkW,WAE9BgiB,UAAU,SAASlgC,EAAMgI,EAAIO,GAC5B,GAAI0hB,GAAIjqB,EAAKvC,qBAAqB,UAC9B9B,EAAM4M,EAAO04B,kBAOjB,OALAj5B,GAAG6V,WAAW,GAAI/e,MAAKmrB,EAAEtuB,EAAI,IAAIwE,MAAM8pB,EAAEtuB,EAAI,IAAIwE,MAAM8pB,EAAEtuB,EAAI,IAAIwE,MAAM,EAAE8pB,EAAEtuB,EAAI,IAAIwE,OACnF6H,EAAGkW,SAAS,GAAIpf,MAAKmrB,EAAEtuB,EAAI,GAAG,GAAGwE,MAAM8pB,EAAEtuB,EAAI,GAAG,GAAGwE,MAAM8pB,EAAEtuB,EAAI,GAAG,GAAGwE,MAAM,EAAE8pB,EAAEtuB,EAAI,GAAG,GAAGwE,OAErF6H,EAAGkW,UAAUlW,EAAG6V,aACnB7V,EAAGkW,SAAS7iB,UAAU2b,KAAKuF,IAAIvU,EAAG6V,WAAWxiB,UAAUkN,OAAOqV,UAAU,YAExEC,WAAY,GAAI/e,MAAKkJ,EAAG6V,YACxBK,SAAU,GAAIpf,MAAKkJ,EAAGkW;EAGxBjS,MAAM,SAASjM,GACd3E,UAAU0tB,OAAO/oB,EAAKvC,qBAAqB,UAAU,OAIxDpC,UAAUsnC,UAAU,SAASvrC,GAC5B,GAAIA,EAAI,CACPA,EAAIoL,MAAM8G,QAAQ,OAElB,IAAIs5B,GAAavsC,OAAOsB,aAAaJ,SAASD,KAAKI,WAAWH,SAASE,gBAAgBC,UACnFmrC,EAAcxsC,OAAOwB,aAAaN,SAASD,KAAKM,YAAYL,SAASE,gBAAgBG,WAErFkrC,EAAczsC,OAAO0V,aAAaxU,SAASE,gBAAgBif,YAG9Dtf,GAAIoL,MAAM5L,IADRgsC,EACY5qC,KAAKC,MAAM2qC,EAAW5qC,KAAKqhB,KAAKypB,EAAY1rC,EAAI4U,cAAc,EAAG,IAAI,KAErEhU,KAAKC,MAAMD,KAAKqhB,KAAMypB,EAAY1rC,EAAI4U,cAAc,EAAI,GAAK,GAAG,KAI9E5U,EAAIoL,MAAM9L,KADRa,SAASE,gBAAgBsrC,YAAcxrC,SAASD,KAAKuU,YACxC7T,KAAKC,MAAM4qC,GAAatrC,SAASD,KAAKuU,YAAYzU,EAAIyU,aAAa,GAAG,KAEtE7T,KAAKC,OAAOV,SAASD,KAAKuU,YAAYzU,EAAIyU,aAAa,GAAG;CAExEhW,KAAKmtC,cAET3nC,UAAU8hB,aAAa,SAAShV,GAC/B,GAAKA,EAAL,CACA,IAAKtS,KAAK8R,UAAU,oBAAoBQ,IAGvC,YAFItS,KAAKylB,aACRzlB,KAAKylB,WAAa,MAGpB,IAAIlkB,GAAMvB,KAAKiqC,aACfjqC,MAAK8sC,UAAUvrC,GACfvB,KAAKotC,eAAe96B,EAAG/Q,GACvBvB,KAAK8R,UAAU,cAAcQ,MAE9B9M,UAAU4nC,eAAiB,SAAS96B,EAAI/Q,GACvC,GAAI4Q,GAAKnS,KAAK6kB,SAASvS,GACnB8hB,EAAI7yB,EAAIqG,qBAAqB,OAC7BpC,WAAUqoB,UAAUwf,iBACvBjZ,EAAE,GAAG5nB,UAAY,GACjB4nB,EAAE,GAAG5nB,UAAYhH,UAAUqoB,UAAUwf,gBAAgBl7B,EAAG6V,WAAY7V,EAAGkW,SAAUlW,KAEjFiiB,EAAE,GAAG5nB,UAAYxM,KAAK6tB,UAAUkN,aAAa5oB,EAAG6V,WAAY7V,EAAGkW,SAAUlW,GACzEiiB,EAAE,GAAG5nB,WAAaxM,KAAK6tB,UAAUsN,eAAehpB,EAAG6V,WAAY7V,EAAGkW,SAAUlW,IAAO,IAAI1D,OAAO,EAAG,IAIlG;IAAK,GADDq8B,GAAM9qC,KAAK0S,OAAOyf,SAASD,SACtB9nB,EAAI,EAAGA,EAAI0gC,EAAIlkC,OAAQwD,IAAK,CACpC,GAAIkjC,GAAcxC,EAAI1gC,GAClBD,EAAOzI,SAAS8T,eAAe83B,EAAYh7B,IAAI43B,YAC/CqD,EAAQvtC,KAAKoqC,YAAYkD,EAAYn9B,MACrC7F,EAAoC8K,SAA3BjD,EAAGm7B,EAAYlb,QAAyBjgB,EAAGm7B,EAAYlb,QAAUkb,EAAYE,aAC1FD,GAAMhD,UAAUjjC,KAAKtH,KAAMmK,EAAMG,EAAO6H,EAAIm7B,GACxCxC,EAAI1gC,GAAGgM,OACVm3B,EAAMn3B,MAAM9O,KAAKtH,KAAMmK,GAGzB3E,UAAU+f,aAAejT,GAE1B9M,UAAUioC,cAAc,SAASt7B,GAEhC,IAAK,GADD24B,GAAM9qC,KAAK0S,OAAOyf,SAASD,SACtB9nB,EAAE,EAAGA,EAAI0gC,EAAIlkC,OAAQwD,IAAK,CAClC,GAAID,GAAOzI,SAAS8T,eAAes1B,EAAI1gC,GAAGkI,GAC1CnI,GAAMA,EAAKA,EAAK+/B,YAAY//B,CAC5B,IAAIojC,GAAMvtC,KAAKoqC,YAAYU,EAAI1gC,GAAG+F,MAC9BkB,EAAIk8B,EAAMlD,UAAU/iC,KAAKtH,KAAKmK,EAAKgI,EAAI24B,EAAI1gC,GAC5B;QAAf0gC,EAAI1gC,GAAGgoB,SACVjgB,EAAG24B,EAAI1gC,GAAGgoB,QAAQ/gB,GAEpB,MAAOc,IAER3M,UAAUkoC,gBAAgB,SAASr2B,GAClC,CAAA,GAAI/E,GAAG9M,UAAU+f,aACbpT,EAAGnS,KAAK6kB,SAASvS,EACbtS,MAAKiqC,cAEbjqC,KAAKotB,WAAWjb,EAAIkF,GAEpBrX,KAAK+7B,SAAS5pB,EAAGG,GAAGH,GACpBnS,KAAKslC,iBAAiBnzB,GAAG,GACzBnS,KAAKqtB,oBAEN7nB,UAAUmoC,cAAc,WACvB3tC,KAAK4tC,UAAU5tC,KAAKiqC,eACpBjqC,KAAKulB,aAAe,KACpBvlB,KAAK8R,UAAU,uBAEhBtM,UAAUooC,UAAU,SAASrsC,GACxBA,IAAKA,EAAIoL,MAAM8G,QAAQ,QAC3BzT,KAAK6tC,cAENroC,UAAUqoC,WAAW,WAChB7tC,KAAK8tC,QACR9tC,KAAK8tC,OAAO7hC,WAAWG,YAAYpM,KAAK8tC,QACzC9tC,KAAK8tC,OAAO;EAEbtoC,UAAU2nC,WAAW,WACpB,IAAGntC,KAAK8tC,OAAR,CAGA9tC,KAAK8tC,OAAOpsC,SAAS2G,cAAc,OACnCrI,KAAK8tC,OAAOv6B,UAAU,eACtB,IAAIw6B,GAAyC34B,SAApB1T,SAASmT,OAAwBnT,SAASmT,OAASnT,SAASD,KAAK0U,aACtF63B,EAAmBtsC,SAAwB,gBAAIA,SAASE,gBAAgB4R,aAAe,CAC3FxT,MAAK8tC,OAAOnhC,MAAMkI,OAAS1S,KAAKqhB,IAAIuqB,EAAkBC,GAAkB,KACxEtsC,SAASD,KAAKqK,YAAY9L,KAAK8tC,UAEhCtoC,UAAUyoC,cAAc,WACvB,GAAI52B,GAAOrX,KAAKytC,iBAAkBztC,KAAKotB,WAAWptB,KAAK6kB,SAAS7kB,KAAKulB,kBACjEvlB,KAAKgS,WAAW,gBAAmBhS,KAAK8R,UAAU,eAAe9R,KAAKulB,aAAclO,EAAMrX,KAAKylB,gBAEnGzlB,KAAK0tC,gBAAgBr2B,GACrBrX,KAAK2tC;EAENnoC,UAAU0oC,cAAgB,SAAS57B,EAAI/Q,GACtCvB,KAAKulB,aAAejT,EACpBtS,KAAKmuC,kBAAmB,EAExBnuC,KAAKouC,eAAiBpuC,KAAKgqC,UAC3BhqC,KAAKgqC,UAAYzoC,EACjBvB,KAAK8sC,UAAUvrC,IAEhBiE,UAAU6oC,YAAc,SAASzgC,EAAMrM,GACtCvB,KAAKslC,iBAAiB9/B,UAAUqf,SAAS7kB,KAAKulB,cAAc3X,GACxDA,GACHpI,UAAU6nB,mBACXrtB,KAAK4tC,UAAUrsC,GAEXvB,KAAKmuC,mBACRnuC,KAAKgqC,UAAYhqC,KAAKouC,eACtBpuC,KAAKmuC,kBAAmB,GAEzBnuC,KAAKouC,eAAiBpuC,KAAKulB,aAAe,MAE3C/f,UAAUktB,cAAgB,WACrBltB,UAAUwkC,YAAcxkC,UAAU2oC,kBACrC3oC,UAAUwkC,UAAU/9B,WAAWG,YAAY5G,UAAUwkC,WACtDxkC,UAAUwkC,UAAY;EAEvBxkC,UAAU8oC,gBAAgB,WACzBtuC,KAAK8R,UAAU,iBAAiB9R,KAAKulB,aAAcvlB,KAAKylB,aACxDzlB,KAAKquC,aAAY,GACjBruC,KAAK2tC,iBAENnoC,UAAU+oC,sBAAsB,WAC/BvuC,KAAKiqC,cAAch2B,QAAQ,SAAS1T,GACnC,GAAI+jB,GAAI/jB,EAAEA,EAAE0M,OAAOxM,MAAMuM,UAEzB,IADKsX,EAAI/Q,YAAW+Q,EAAIA,EAAI8hB,iBACxB9hB,GAAOA,EAAI/Q,UACd,OAAO+Q,EAAI/Q,WACV,IAAK,eACJ/N,UAAUyoC,eACV,MACD,KAAK,iBACJ,GAAIxqC,GAAE+B,UAAUyP,OAAOC,OAAO8R,gBAE9BxhB,WAAUyhB,gBAAgBxjB,EAAG+B,UAAUyP,OAAOC,OAAOgS,uBAAwB,WAC5E1hB,UAAU2hB,YAAY3hB,UAAU+f,cAChC/f,UAAUigB,WAAa,KACvBjgB,UAAUmoC;EAGX,MACD,KAAK,iBACJnoC,UAAU8oC,iBACV,MAED,SACC,GAAIhqB,EAAI/T,aAAa,cACpB/K,UAAUsM,UAAU,oBAAqBwS,EAAI/Q,UAAW+Q,EAAK/jB,QACvD,CACN,GAAIiuC,GAAOjB,EAAOkB,CACgC,KAA9CnqB,EAAI/Q,UAAU7Q,QAAQ,uBAC0B,IAA/C4hB,EAAI/Q,UAAU7Q,QAAQ,uBACzB8rC,EAAQlqB,EAAIrY,WAAWsE,aAAa,SACpCk+B,EAAMnqB,EAAIrY,WAAWA,aAErBuiC,EAAQlqB,EAAI/T,aAAa,SACzBk+B,EAAMnqB,EAAIrY,WACVqY,EAAMA,EAAI/Z,aAGRikC,IACHjB,EAAQ/nC,UAAU4kC,YAAY5kC,UAAUkN,OAAOyf,SAASD,SAASsc,GAAOr+B,MACxEo9B,EAAMmB,aAAaF,EAAOlqB,EAAKmqB,EAAKA,EAAIvE;IAM9ClqC,KAAKiqC,cAAc32B,UAAU,SAAS/S,GACrC,QAAQA,GAAGE,OAAOwS,SACjB,IAAKzN,WAAU0U,KAAK2I,UACnB,IAAKtiB,GAAGE,OAAO8iC,SAAU,MACzB/9B,WAAUyoC,eACV,MACD,KAAKzoC,WAAU0U,KAAK4I,YACnBtd,UAAU8oC,qBAOd9oC,UAAUmpC,gBAAgB,WACzB,GAAI7yB,GAAI9b,KAAKgqC,SACb,IAAKluB,EAAL,CAEA,GAAI8yB,GAAM9yB,EAAErR,WAAW,EACvBmkC,GAAIjiC,MAAMkI,OAAO,MACjB+5B,EAAIjiC,MAAMkI,OAAO+5B,EAAIp7B,aAAa,KAClCsI,EAAEnP,MAAMkI,OAAO+5B,EAAIp7B,aAAahO,UAAU0c,GAAG2sB,2BAA2B,KACxED,EAAIjiC,MAAMkI,OAAO+5B,EAAIp7B,aAAa,OAGnChO,UAAUspC,iBAAmB,WAC5BprC,YAAYhC,SAASD,KAAM,YAAa+D,UAAUupC,iBAClDrrC,YAAYhC,SAASD,KAAM,UAAW+D,UAAUwpC,aAChDxpC,UAAUspC,iBAAmB;EAE9BtpC,UAAUupC,gBAAkB,SAASxuC,GACpC,GAAIiF,UAAUypC,cAAc,CACtBvtC,SAASwtC,mBACbxtC,SAASD,KAAK8R,WAAa,oBAC3B7R,SAASwtC,kBAAmB,EAE7B,IAAIC,GAAK3pC,UAAUykC,cACfmF,EAAO7uC,GAAGA,EAAE0M,QAAS1M,EAAEgpB,MAAOhpB,EAAEipB,QAAQ/oB,MAAMmM,QAASnM,MAAMqM,QACjEqiC,GAAGxiC,MAAM5L,IAAMyE,UAAU6pC,UAAU,GAAGD,EAAI,GAAG5pC,UAAUypC,cAAc,GAAG,KACxEE,EAAGxiC,MAAM9L,KAAO2E,UAAU6pC,UAAU,GAAGD,EAAI,GAAG5pC,UAAUypC,cAAc,GAAG,OAG3EzpC,UAAU8pC,cAAgB,SAAS/uC,GAClC,GAAI4uC,GAAK3pC,UAAUykC,aACnBzkC,WAAU6pC,WAAanuC,SAASiuC,EAAGxiC,MAAM9L,KAAK,IAAKK,SAASiuC,EAAGxiC,MAAM5L,IAAI,KACzEyE,UAAUypC,cAAiB1uC,GAAGA,EAAE0M,QAAS1M,EAAEgpB,MAAOhpB,EAAEipB,QAAQ/oB,MAAMmM,QAASnM,MAAMqM;EAElFtH,UAAUwpC,YAAc,WACnBxpC,UAAU6pC,YACb7pC,UAAU6pC,UAAY7pC,UAAUypC,eAAgB,EAChDvtC,SAASD,KAAK8R,UAAY7R,SAASD,KAAK8R,UAAUrL,QAAQ,oBAAoB,IAC9ExG,SAASwtC,kBAAmB,IAG9B1pC,UAAUykC,YAAY,WACrB,IAAKjqC,KAAKgqC,UAAU,CACnB,GAAIluB,GAAEpa,SAAS2G,cAAc,MAC7ByT,GAAEvI,UAAU,gBACR/N,UAAUkN,OAAO85B,YACpB1wB,EAAEvI,WAAW,uBACV/N,UAAU4kC,YAAYmF,YACzBzzB,EAAEvI,WAAW,sBAEV,cAAci8B,KAAKlmC,UAAUC,aAChCuS,EAAEvI,WAAW,YACduI,EAAEnP,MAAMyjB,WAAW,QAInB;IAAK,GAHDiB,GAAOrxB,KAAKyvC,mBAEZl6B,EAAUvV,KAAK0S,OAAOsnB,aACjB5vB,EAAI,EAAGA,EAAImL,EAAQ3O,OAAQwD,IACnCinB,GAAM,4CAA4C9b,EAAQnL,GAAG,oCAAoCmL,EAAQnL,GAAG,gBAAgB5E,UAAUyP,OAAOC,OAAOK,EAAQnL,IAAI,cAEjKmL,GAAUvV,KAAK0S,OAAOunB,aACtB,KAAK,GAAI7vB,GAAI,EAAGA,EAAImL,EAAQ3O,OAAQwD,IACnCinB,GAAM,6CAA6C9b,EAAQnL,GAAG,yDAAyDmL,EAAQnL,GAAG,gBAAgB5E,UAAUyP,OAAOC,OAAOK,EAAQnL,IAAI,cAEvLinB,IAAM,SACNvV,EAAEtP,UAAU6kB,EACR7rB,UAAUkN,OAAO8mB,gBACpB1d,EAAEvR,WAAWM,YAAcrF,UAAU8pC,cACrCxzB,EAAEvR,WAAWqB,cAAgB,WAAY,OAAO;EAChDkQ,EAAEvR,WAAWoC,MAAM8e,OAAS,UAC5BjmB,UAAUspC,oBAGXptC,SAASD,KAAKyS,aAAa4H,EAAEpa,SAASD,KAAK8I,YAC3CvK,KAAKgqC,UAAUluB,CAEf,IAAIgvB,GAAI9qC,KAAK0S,OAAOyf,SAASD,QAC7Bb,GAAK,EACL,KAAK,GAAIjnB,GAAE,EAAGA,EAAI0gC,EAAIlkC,OAAQwD,IAAK,CAClC,GAAImjC,GAAMvtC,KAAKoqC,YAAYU,EAAI1gC,GAAG+F,KAClC,IAAKo9B,EAAL,CACAzC,EAAI1gC,GAAGkI,GAAG,QAAQtS,KAAK0W,KACvB,IAAIvL,GAAS,EACT2/B,GAAI1gC,GAAGe,SACTA,EAAS,yCAAyCf,EAAE,mCAAmC0gC,EAAI1gC,GAAGe,OAAO,gBAAgBnL,KAAKiV,OAAOC,OAAO,UAAU41B,EAAI1gC,GAAGe,QAAQ,gBAG/JnL,KAAK0S,OAAO85B,YACfnb,GAAM,iCAGP;GAAIqe,GAAa1vC,KAAKiV,OAAOC,OAAO,WAAW41B,EAAI1gC,GAAGvE,KAC7B,iBAAf6pC,KACTA,EAAa5E,EAAI1gC,GAAGvE,MAErBwrB,GAAM,YAAYyZ,EAAI1gC,GAAGkI,GAAG,8BAA8BnH,EAAOukC,EAAW,SAASnC,EAAM7Z,OAAOpsB,KAAKtH,KAAK8qC,EAAI1gC,IAChHinB,GAAM,UAIP,IAAK,GADDse,GAAG7zB,EAAElU,qBAAqB,OACrBwC,EAAE,EAAGA,EAAEulC,EAAG/oC,OAAQwD,IAAK,CAC/B,GAAIwlC,GAAOD,EAAGvlC,EACd,IAAsB,iBAAlBwlC,EAAKr8B,UAA8B,CACtCq8B,EAAKpjC,UAAY6kB,CACjB,QAKFrxB,KAAK2uC,kBAEL3uC,KAAKuuC,sBAAsBvuC,MAC3B8b,EAAEnP,MAAM8G,QAAQ,OAChBqI,EAAEnP,MAAMyjB,WAAW,UAEpB,MAAOpwB,MAAKgqC,WAEbxkC,UAAUiqC,mBAAmB,uKAE7BjqC,UAAUuc,mBAAqB,WACL,SAArB/hB,KAAK0S,OAAOqa,QACf/sB,KAAK0S,OAAOqa,MAAQ/sB,KAAK0S,OAAOqa,QACe,IAAvCzjB,UAAUC,UAAU7G,QAAQ,WACI,IAArC4G,UAAUC,UAAU7G,QAAQ,SACY,IAAxC4G,UAAUC,UAAU7G,QAAQ,YACU,IAAtC4G,UAAUC,UAAU7G,QAAQ,WAE5B1C,KAAK0S,OAAOqa,QACf/sB,KAAKkiB,GAAGG,aAAe,EACnB7hB,OAAO8I,UAAUumC,kBACpB7vC,KAAK8vC,eAAe,gBAAiB,gBAAiB,eAAgB,SAAS39B,GAC9E,MAAIA,GAAG49B,aAAe59B,EAAG69B,qBAA8B,KAChD79B;EACL,SAASA,GACX,OAASA,GAAMA,EAAG49B,aAAe59B,EAAG69B,uBAErChwC,KAAKqhB,KAAKyC,WAAa,cAEvB9jB,KAAK8vC,eAAe,YAAa,aAAc,YAAa,SAAS39B,GACpE,MAAIA,GAAG89B,SAAW99B,EAAG89B,QAAQrpC,OAAS,EAAU,KAC5CuL,EAAG89B,QAAQ,IACLhjC,OAAOkF,EAAGlF,OAAQsc,MAAMpX,EAAG89B,QAAQ,GAAG1mB,MAAOC,MAAMrX,EAAG89B,QAAQ,GAAGzmB,OAEnErX,GACN,WAAY,OAAO,MAIzB3M,UAAUsqC,cAAgB,SAASI,EAAOC,EAAUj4B,GAMnD,QAASk4B,GAAiBC,EAASxqC,EAAMc,GAExCjD,YAAY2sC,EAASxqC,EAAM,SAAStF,GACnC,MAAGiF,WAAU2uB,qBACL,EAEAxtB,EAASpG,KAKnB,QAAS+vC,GAAsBC,EAAMC,EAAM/pB,GAC1C,GAAK8pB,GAASC,EAAd,CAEA,GAAI7mB,GAAKxnB,KAAK0T,IAAI06B,EAAK/mB,MAAQgnB,EAAKhnB,OAChCinB,EAAKtuC,KAAK0T,IAAI06B,EAAKhnB,MAAQinB,EAAKjnB,MAChCknB;EAAGhqB,KAAUkD,GAAO8mB,EAAG9mB,EAAK,KAC3B4mB,EAAKhnB,MAAQinB,EAAKjnB,MACrB/jB,UAAUqe,OAAO0C,sBAEjB/gB,UAAUqe,OAAOyC,wBAkHpB,QAASoqB,GAAYnwC,GACpBiF,UAAUmrC,mBACN7qB,IACHtgB,UAAU4e,aAAc+rB,EAAS5vC,GAAGE,QACpC+E,UAAUwe,mBAAoB,GAE/Bxe,UAAUqgB,SAAW,KACrBrgB,UAAUugB,WAAW,KACrBvgB,UAAUilB,UAAU,KAEpBzT,aAAa45B,GACb9qB,EAAY+qB,GAAc,EAC1BC,GAAc,EAtJf,GACIr7B,GAAQs7B,EAASH,EAAO9qB,EAAWgrB,EAAaD,EADhDG,EAAoD,IAAxC1nC,UAAUC,UAAU7G,QAAQ,YAA2D,IAAvC4G,UAAUC,UAAU7G,QAAQ,UAExFuuC,EAAe,CA0BnBb,GAAiB1uC,SAASD,KAAMyuC,EAAM,GAAI,SAAS3vC,GAClD,IAAI2X,EAAO3X,GAAX,CAEA,GAAIulB,EAMH,MALAtgB,WAAUye,eAAeksB,EAAS5vC,IAClCiF,UAAU0rC,qBACN3wC,EAAEkL,gBACLlL,EAAEkL,iBACHlL,EAAE6S,cAAe,GACV,CASR;GANI29B,GAAWC,GACdV,EAAsBS,EAASZ,EAAS5vC,GAAI,GAG7CwwC,EAAUZ,EAAS5vC,GAEdswC,EAGL,MAAKE,SAODt7B,EAAOxI,QAAU8jC,EAAQ9jC,QAAW9K,KAAK0T,IAAIJ,EAAO8T,MAAQwnB,EAAQxnB,OAAS,GAAOpnB,KAAK0T,IAAIJ,EAAO+T,MAAQunB,EAAQvnB,OAAS,KAChIsnB,GAAc,EACd95B,aAAa45B,UARbE,GAAc,MAahBV,EAAiBpwC,KAAKwhB,KAAmB,aAAE,GAAI,SAAUkvB,GACzDN,EAAiBpwC,KAAKwhB,KAAmB,aAAE,GAAI,cAAekvB,GAC9DN,EAAiBpwC,KAAKwhB,KAAmB,aAAE,GAAI,cAAe,SAASjhB,GACtE,MAAIswC,IACCtwC,GAAKA,EAAEkL,gBACVlL,EAAEkL,kBACFlL,GAAGE,OAAO2S,cAAe,GACnB,GAJR,SAODg9B,EAAiBpwC,KAAKwhB,KAAmB,aAAE,GAAI0uB,EAAM,GAAI,SAAS3vC,GACjE,IAAI2X,EAAO3X,GAAX,CAEA,GAAI4wC,EAMJ,IALArrB,EAAYgrB,GAAc,EAC1BD,GAAc,EACdrrC,UAAUwe,mBAAoB,EAC9BmtB,EAAaJ,EAAUZ,EAAS5vC,IAE3B4wC,EAEJ,YADAL,GAAc,EAKf;GAAI1B,GAAM,GAAInmC,KAEd,KAAK6nC,IAAgBhrB,GAAkC,IAArBspB,EAAM6B,EAUvC,MATAzrC,WAAUqe,OAAOmC,aAAamrB,GAC9B3wC,OAAO6T,WAAW,WACjB7O,UAAU6e,cAAc8sB,IACtB,IAEC5wC,EAAEkL,gBACLlL,EAAEkL,iBACHlL,EAAE6S,cAAe,EACjB5N,UAAU4rC,kBAAmB,GACtB,CAERH,GAAe7B,EAIX0B,GAAehrB,IAActgB,UAAUkN,OAAOinB,aAIlDiX,EAAQv8B,WAAW,WAElByR,GAAY,CACZ,IAAI7Y,GAASwI,EAAOxI,MAKpB,IAJIA,GAAUA,EAAOsG,WAAqD,IAAxCtG,EAAOsG,UAAU7Q,QAAQ,cAC1DuK,EAASA,EAAOm5B,iBAEjB5gC,UAAU2e,eAAe1O,EAAQxI,GAC7BzH,UAAUugB,YAAsC,UAAxBvgB,UAAUugB,WAAuB,CAC5D,GAAImD,GAAM,EAMV,IALA1jB,UAAU6mB,aAAa7mB,UAAUqgB,SAAU,SAAS1b,EAAMC,GACzD8e,EAAM/e,EAAK3I,wBAAwBT,IACnCoJ,EAAKwC,MAAM8G,QAAQ,OACnBjO,UAAU02B,UAAUnjB,OAAO3O,EAAG;GAE3B8e,GAAK,EAAE,CACV,GAAIzC,GAAOjhB,UAAUkN,OAAOqV,SAC5BviB,WAAUulB,gBAAkBtE,EAAMtkB,KAAKC,MAA+B,IAAxB+uC,EAAW3nB,MAAQN,IAAS1jB,UAAUkN,OAAO2W,aAAa5C,KAItGjhB,UAAUkN,OAAOgnB,WACpBl0B,UAAU6rC,mBACX7rC,UAAUye,eAAexO,IACxBjQ,UAAUkN,OAAOinB,YAEnBlkB,EAAS07B,MAgBVf,EAAiBpwC,KAAKwhB,KAAmB,aAAE,GAAI0uB,EAAM,GAAI,SAAS3vC,GACjE,MAAI2X,GAAO3X,GAAX,QAEKulB,GACJwqB,EAAsB76B,EAAQs7B,EAAS,KAEpCjrB,IACHtgB,UAAU0e,oBAAqB,GAEhCwsB,EAAYnwC,GACRiF,UAAU4rC,kBACb5rC,UAAU4rC,kBAAmB,EACzB7wC,EAAEkL,gBACLlL,EAAEkL,iBACHlL,EAAE6S,cAAe,GACV,GALR,UASD1P,YAAYhC,SAASD,KAAMyuC,EAAM,GAAIQ;EAGtClrC,UAAU6rC,iBAAmB,WAC5B7rC,UAAUmrC,kBAEV,IAAIW,GAAS9rC,UAAU+rC,YAAc7vC,SAAS2G,cAAc,MAC5DipC,GAAO/9B,UAAU,iBAEjB/N,UAAU0rC,mBAAmB,GAE7BxvC,SAASD,KAAKqK,YAAYwlC,IAE3B9rC,UAAU0rC,mBAAqB,SAASj1B,GACvC,GAAIq1B,GAAS9rC,UAAU+rC,WACvB,IAAID,EAAO,CACV,GAAIpG,GAAO,EACX,IAAI1lC,UAAUqgB,WAAa5J,EAAK,CAC/B,GAAI9J,GAAK3M,UAAUqf,SAASrf,UAAUqgB,SAClC1T,KACH+4B,EAAO,SAAW/4B,EAAGwW,OAASnjB,UAAUqoB,UAAUkN,aAAa5oB,EAAG6V,WAAY7V,EAAGkW,SAAUlW,GAAI3M,UAAUqoB,UAAUgL,SAAS1mB,EAAG6V,WAAY7V,EAAGkW,SAAUlW,IAAO;CAIhKm/B,EAAO9kC,UADoB,UAAxBhH,UAAUugB,YAAkD,YAAxBvgB,UAAUugB,YAC7BvgB,UAAUyP,OAAOsjB,gBAAkB,kBAAkB2S,GAErD1lC,UAAUyP,OAAOujB,cAAgB,gBAAgB0S,IAGxE1lC,UAAUmrC,iBAAmB,WAC5B,GAAIW,GAAS9rC,UAAU+rC,WACnBD,IAAUA,EAAOrlC,aACpBqlC,EAAOrlC,WAAWG,YAAYklC,GAC9B9rC,UAAU+rC,YAAc,IAI1B/rC,UAAU2W,SAAS,SAASq1B,GAC3BA,EAAGr4B,UAAU,wBAAwB,GAAG,gBAAgB,mBAExDnZ,KAAKyxC,gBAAkB,SAASn/B,GAC/B,MAAOtS,MAAKmnB,YAAY7U,GAAI,IAE7BtS,KAAK6D,YAAY,eAAe,SAASyO,IACnCtS,KAAKuoB,UAAYvoB,KAAK0xC,SAASp/B,IACnCk/B,EAAGn5B,WAAW/F,GAAG,EAAK;GAExBtS,KAAK6D,YAAY,+BAAgC,SAASyO,GACzD,GAAKtS,KAAK0xC,SAASp/B,GAAnB,CACA,GAAI7K,GAAE+pC,EAAGn4B,SAAS/G,EAElB,OAAO,YAAH7K,GAAiBzH,KAAKylB,YAAe+rB,EAAGn5B,WAAW/F,GAAG,IAAgB,GACnE,WAAH7K,GAAsB,EAChB,gBAAHA,GAA2B,GAElC+pC,EAAGn5B,WAAW/F,GAAG,EAAK,YACV,MAEbtS,KAAK6D,YAAY,iBAAiB,SAASyO,IACrCtS,KAAKuoB,UAAYvoB,KAAK0xC,SAASp/B,IACnCk/B,EAAGn5B,WAAW/F,GAAG,EAAK,aAGxBk/B,EAAG33B,YAAY,SAASvH,GACvB,GAAIH,GAAGnS,KAAK2F,IAAIkf,SAASvS,GACrB+E,IAEJ,KAAK,GAAI9T,KAAK4O,GACU,IAAnB5O,EAAEb,QAAQ,OAEb2U,EAAK9T,GADF4O,EAAG5O,IAAM4O,EAAG5O,GAAGkzB,eACRz2B,KAAK2F,IAAIkoB,UAAUiN,WAAW3oB,EAAG5O,IAEjC4O,EAAG5O,GAGf;MAAO8T,IAERm6B,EAAGx4B,iBAAiB,aAEpBw4B,EAAG3tC,YAAY,iBAAkB2B,UAAUmsC,kBAC3CH,EAAG3tC,YAAY,iBAAkB2B,UAAUmsC,kBAC3CH,EAAG3tC,YAAY,iBAAkB,SAAS+tC,EAAKt/B,GAC9CtS,KAAK2F,IAAIkT,YAAYvG,EAAItS,KAAKiE,aAAc,gBAC5CjE,KAAK2F,IAAIwhB,YAAY7U,MAKvB9M,UAAUksC,SAAS,WAClB,OAAO,GAGRlsC,UAAUqT,YAAY,SAASvG,EAAGzM,EAAKyE,GAClCgI,EACHtS,KAAK6kB,SAASvS,GAAIzM,GAAMyE,EAExBtK,KAAKgoC,UAAUniC,GAAMyE,GAEvB9E,UAAUmT,YAAY,SAASrG,EAAGzM,GACjC,MAAOyM,GAAGtS,KAAK6kB,SAASvS,GAAIzM,GAAM7F,KAAKgoC,UAAUniC,IAElDL,UAAUqsC,sBAAsB,SAASv/B,EAAG3F,GAC3C3M,KAAKqsB,aAAa/Z,EAAG,SAASga,GAC7BA,EAAE3f,MAAM02B,SAAS,IAAI12B;EAEtB,IAAIwF,GAAKnS,KAAK6kB,SAASvS,EACvBH,GAAgB,YAAExF,EAClB3M,KAAK87B,cAAc3pB,IAGpB3M,UAAUmsC,iBAAmB,SAASC,GACrC,GAAIv6B,GAAQ7R,UAAUijC,eAAemJ,EAAIrnC,WACzC8M,GAAK3D,KAAQ2D,EAAK3D,MAAM2D,EAAKgwB,UAC7BhwB,EAAK2Q,WAAaxiB,UAAUqoB,UAAUkL,SAAS1hB,EAAK2Q,YACpD3Q,EAAKgR,SAAW7iB,UAAUqoB,UAAUkL,SAAS1hB,EAAKgR,UAElD7iB,UAAUqM,SAASwF,IAEpB7R,UAAUssC,gBACTC,kBAAmB,EAAE,GACrBC,uBAAwB,EAAE,GAC1BxF,WAAY,EAAE,GAEdnjB,cAAe,GAAG,IAClBwc,uBAAwB,UAAW,UACnCC,4BAA6B,UAAW,WAGzCtgC,UAAUysC,UACTpD,4BAA6B,GAAG,IAChCxrB,YAAa,GAAG,IAChByb,YAAa,GAAG,KAGjBt5B,UAAU0sC,WAAa,SAASriC,EAAKwH,EAAM86B,GAC1C,IAAK,GAAIp7B,KAAOM,GACQ,mBAAZxH,GAAIkH,KACdlH,EAAIkH,GAAOM,EAAKN,GAAKo7B;EAExB3sC,UAAU+b,WAAa,WACtB,IAAK/b,UAAU2sC,KAEd,IAAK,GADDC,GAAQ1wC,SAASkG,qBAAqB,QACjCwC,EAAI,EAAGA,EAAIgoC,EAAMxrC,OAAQwD,IAAK,CACtC,GAAIiH,GAAM+gC,EAAMhoC,GAAGioC,KAAKxqB,MAAM,+BAC9B,IAAIxW,EAAI,CACP7L,UAAU2sC,KAAO9gC,EAAI,EACrB,QAOH,GAAIihC,GAAM,CAQV,KAPI9sC,UAAU2sC,MAA4B,YAAnB3sC,UAAU2sC,MAAyC,WAAnB3sC,UAAU2sC,OAAoBG,EAAM,GAG3FtyC,KAAKkyC,WAAW1sC,UAAUkN,OAAQlN,UAAUssC,eAAgBQ,GAC5DtyC,KAAKkyC,WAAW1sC,UAAU0c,GAAI1c,UAAUysC,SAAUK,IAG9CA,EAAJ,CAGA,GAAIC,GAAQ/sC,UAAUkN,OAAO8/B,YACzBD,KAAOA,EAAME,QAAU,IAE3BjtC,UAAUqoB,UAAUqN,eAAiB,SAASzT,GAC7C,MAAO,QAAQjiB,UAAUqoB,UAAU+M,WAAWnT,GAAO;EAItDjiB,UAAU3B,YAAY,mBAAoB,WAEzC,GAAI8xB,GAAcnwB,UAAU2b,KAAKwU,YAAY,KACzCnwB,WAAUqoB,UAAU6kB,iBACvBltC,UAAUqoB,UAAU6kB,eAAiBltC,UAAUqoB,UAAU8D,UAE1D,IAAIghB,GAAgBntC,UAAUqoB,UAAU6kB,cAiBxC,IAhBAltC,UAAUqoB,UAAU8D,UAAY,SAASxQ,GACxC,GAAkB,SAAdnhB,KAAK8kB,MAAkB,CAC1B,GAAIlB,GAAQ+R,EAAYxU,EAOxB,OANsB,IAAlBA,EAAK8K,YACRrI,EAAQpe,UAAUyP,OAAOkM,KAAKoT,WAAWpT,EAAK2Q,YAAc,IAAMlO,IAE9DzC,IAAS3b,UAAU2b,KAAKoK,UAAU,GAAItiB,SAC1C2a,EAAQpe,UAAUyP,OAAOC,OAAOyR,qBAAuB,IAAM/C,GAEvDA,EAEP,MAAO+uB,GAAcrrC,KAAKtH,KAAMmhB;EAK9B3b,UAAUkN,OAAOq/B,iBAAiB,CAKrC,IAAK,GAJDa,GAAeptC,UAAUgc,KAAsB,gBAAE,GAAG5Z,qBAAqB,OACzEirC,EAAU,KAEVtH,EAAO,IACFnhC,EAAE,EAAGA,EAAEwoC,EAAahsC,OAAQwD,IAAK,CACzC,GAAImC,GAAMqmC,EAAaxoC,GACnBvE,EAAO0G,EAAIgE,aAAa,OAC5B,IAAI1K,EAEH,OADA0G,EAAII,MAAMq2B,MAAQ,OACVn9B,GACP,IAAK,UACJ0G,EAAII,MAAM9L,KAAO,OACjB0L,EAAIgH,WAAa,oBACjB,MACD,KAAK,WACJhH,EAAII,MAAM9L,KAAO,MACjB,MACD,KAAK,YACJ0L,EAAII,MAAM9L,KAAO,QACjB0L,EAAIgH,WAAa,mBACjB,MACD,SACChH,EAAII,MAAM9L,KAAO0qC,EAAK,KACtBh/B,EAAIgH,WAAa,0BACjBg4B,EAAOA,EAAO,GAAKh/B,EAAIyJ,gBAIgC,MAArDzJ,EAAIgH,WAAa,IAAI7Q,QAAQ,qBAChC6J,EAAIN,YAAczG,UAAUgc,KAAsB,gBAAE,KAEpDqxB,EAAUtmC;CAMVsmC,IACFA,EAAQlmC,MAAM9L,KAAO0qC,EAAK,MAIxB/lC,UAAU2sC,MAA2B,SAAnB3sC,UAAU2sC,OAC/B3sC,UAAU0c,GAAGI,aAAe,GAC5B9c,UAAUqoB,UAAU2C,WAAa,SAASrP,GACzC,GAAIgI,GAAMhI,EAAK0J,YACf1B,GAAY,GAANA,EAAW,IAAIA,EAAMA,CAC3B,IAAIkI,GAAO,6BAA8BlQ,EAAKgH,WAAY,0CACnBgB,EAAK,SAC5C,OAAOkI,OAIV7rB,UAAU+b,WAAa,eAIpB/gB,OAAOsyC,SAEX,SAAWC,GAEV,GAAIC,KACJD,GAAEE,GAAGC,cAAgB,SAASxgC,GAC7B,GAAuB,gBAAb,GAMH,CACN,GAAIygC,KAqBJ,OApBAnzC,MAAKozC,KAAK,WACT,GAAIpzC,MAAQA,KAAKuQ,eACXvQ,KAAKuQ,aAAa,gBAAgB,CACtC,IAAK,GAAIwG,KAAOrE,GACN,QAALqE,IACHvR,UAAUkN,OAAOqE,GAAOrE,EAAOqE,GAE5B/W;KAAK4H,qBAAqB,OAAOhB,SACrC5G,KAAKwM,UAAY,qdACjBxM,KAAKuT,WAAa,sBAEnB/N,UAAUyW,KAAKjc,KAAMwF,UAAUkN,OAAOyO,KAAM3b,UAAUkN,OAAO9E,MACzD8E,EAAO2E,MACV7R,UAAUwhC,MAAMt0B,EAAO2E,MAExB87B,EAAMzoC,KAAKlF;IAKO,IAAjB2tC,EAAMvsC,OAAqBusC,EAAM,GAC9BA,EA5BP,MAAIH,GAAQtgC,GACJsgC,EAAQtgC,GAAQvM,MAAMnG,aAE7B+yC,GAAE5tC,MAAM,UAAauN,EAAS,6CAgC/BogC"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_active_links.js b/codebase/sources/ext/dhtmlxscheduler_active_links.js
new file mode 100644
index 0000000..f8a55b9
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_active_links.js
@@ -0,0 +1,43 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.config.active_link_view = "day";
+scheduler._active_link_click = function(e){
+ var start = e.target || event.srcElement;
+ var to = start.getAttribute("jump_to");
+ var s_d = scheduler.date.str_to_date(scheduler.config.api_date);
+ if (to) {
+ scheduler.setCurrentView(s_d(to), scheduler.config.active_link_view);
+ if (e && e.preventDefault)
+ e.preventDefault();
+ return false;
+ }
+};
+scheduler.attachEvent("onTemplatesReady", function() {
+ var do_wrapper = function(key, fullname){
+ fullname = fullname || (key+"_scale_date");
+
+ if(!scheduler.templates['_active_links_old_'+ fullname]){
+ scheduler.templates['_active_links_old_'+ fullname] = scheduler.templates[fullname];
+ }
+ var week_x = scheduler.templates['_active_links_old_'+ fullname];
+ var d_s = scheduler.date.date_to_str(scheduler.config.api_date);
+ scheduler.templates[fullname] = function(date) {
+ return "<a jump_to='" + d_s(date) + "' href='#'>" + week_x(date) + "</a>";
+ };
+ };
+
+ do_wrapper("week");
+ do_wrapper("", "month_day");
+ if (this.matrix){
+ for (var key in this.matrix)
+ do_wrapper(key);
+ }
+
+ this._detachDomEvent(this._obj, "click", scheduler._active_link_click);
+ dhtmlxEvent(this._obj, "click", scheduler._active_link_click);
+}); \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_active_links.js.map b/codebase/sources/ext/dhtmlxscheduler_active_links.js.map
new file mode 100644
index 0000000..d1bc8a7
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_active_links.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_active_links.js.map","sources":["dhtmlxscheduler_active_links.js"],"names":["scheduler","config","active_link_view","_active_link_click","e","start","target","event","srcElement","to","getAttribute","s_d","date","str_to_date","api_date","setCurrentView","preventDefault","attachEvent","do_wrapper","key","fullname","templates","week_x","d_s","date_to_str","this","matrix","_detachDomEvent","_obj","dhtmlxEvent"],"mappings":"AAAAA,UAAUC,OAAOC,iBAAmB,MACpCF,UAAUG,mBAAqB,SAASC,GACvC,GAAIC,GAAQD,EAAEE,QAAUC,MAAMC,WAC1BC,EAAKJ,EAAMK,aAAa,WACxBC,EAAMX,UAAUY,KAAKC,YAAYb,UAAUC,OAAOa,SACtD,OAAIL,IACHT,UAAUe,eAAeJ,EAAIF,GAAKT,UAAUC,OAAOC,kBAC/CE,GAAKA,EAAEY,gBACVZ,EAAEY,kBACI,GAJR,QAODhB,UAAUiB,YAAY,mBAAoB,WACzC,GAAIC,GAAa,SAASC,EAAKC,GAC9BA,EAAWA,GAAaD,EAAI,cAExBnB,UAAUqB,UAAU,qBAAsBD,KAC7CpB,UAAUqB,UAAU,qBAAsBD,GAAYpB,UAAUqB,UAAUD,GAE3E;GAAIE,GAAStB,UAAUqB,UAAU,qBAAsBD,GACnDG,EAAMvB,UAAUY,KAAKY,YAAYxB,UAAUC,OAAOa,SACtDd,WAAUqB,UAAUD,GAAY,SAASR,GACxC,MAAO,eAAiBW,EAAIX,GAAQ,cAAgBU,EAAOV,GAAQ,QAMrE,IAFAM,EAAW,QACXA,EAAW,GAAI,aACXO,KAAKC,OACR,IAAK,GAAIP,KAAOM,MAAKC,OACpBR,EAAWC,EAGbM,MAAKE,gBAAgBF,KAAKG,KAAM,QAAS5B,UAAUG,oBACnD0B,YAAYJ,KAAKG,KAAM,QAAS5B,UAAUG"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_agenda_view.js b/codebase/sources/ext/dhtmlxscheduler_agenda_view.js
new file mode 100644
index 0000000..18d791b
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_agenda_view.js
@@ -0,0 +1,123 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.date.add_agenda = function(date){
+ return scheduler.date.add(date, 1, "year");
+};
+
+scheduler.templates.agenda_time = function(start,end,ev){
+ if (ev._timed)
+ return this.day_date(ev.start_date, ev.end_date, ev)+" "+this.event_date(start);
+ else
+ return scheduler.templates.day_date(start)+" &ndash; "+scheduler.templates.day_date(end);
+};
+scheduler.templates.agenda_text = function(start,end,event){
+ return event.text;
+};
+scheduler.templates.agenda_date = function(){ return ""; };
+
+scheduler.date.agenda_start=function(){ return scheduler.date.date_part(scheduler._currentDate()); };
+
+scheduler.attachEvent("onTemplatesReady",function() {
+ var old_dblclick_dhx_cal_data = scheduler.dblclick_dhx_cal_data;
+ scheduler.dblclick_dhx_cal_data = function() {
+ if (this._mode == "agenda") {
+ if (!this.config.readonly && this.config.dblclick_create)
+ this.addEventNow();
+ } else {
+ if (old_dblclick_dhx_cal_data)
+ return old_dblclick_dhx_cal_data.apply(this, arguments);
+ }
+ };
+ scheduler.attachEvent("onSchedulerResize",function(){
+ if (this._mode == "agenda"){
+ this.agenda_view(true);
+ return false;
+ }
+ return true;
+ });
+
+
+ var old = scheduler.render_data;
+ scheduler.render_data=function(evs){
+ if (this._mode == "agenda")
+ fill_agenda_tab();
+ else
+ return old.apply(this,arguments);
+ };
+
+ var old_render_view_data = scheduler.render_view_data;
+ scheduler.render_view_data = function(){
+ if(this._mode == "agenda") {
+ scheduler._agendaScrollTop = scheduler._els["dhx_cal_data"][0].childNodes[0].scrollTop;
+ scheduler._els["dhx_cal_data"][0].childNodes[0].scrollTop = 0;
+ }
+ return old_render_view_data.apply(this,arguments);
+ };
+
+
+ function set_full_view(mode){
+ if (mode){
+ var l = scheduler.locale.labels;
+ scheduler._els["dhx_cal_header"][0].innerHTML="<div class='dhx_agenda_line'><div>"+l.date+"</div><span style='padding-left:25px'>"+l.description+"</span></div>";
+ scheduler._table_view=true;
+ scheduler.set_sizes();
+ }
+ }
+
+ function fill_agenda_tab(){
+ //get current date
+ var date = scheduler._date;
+ //select events for which data need to be printed
+
+ var events = scheduler.get_visible_events();
+ events.sort(function(a,b){ return a.start_date>b.start_date?1:-1;});
+
+ //generate html for the view
+ var html="<div class='dhx_agenda_area'>";
+ for (var i=0; i<events.length; i++){
+ var ev = events[i];
+ var bg_color = (ev.color?("background:"+ev.color+";"):"");
+ var color = (ev.textColor?("color:"+ev.textColor+";"):"");
+ var ev_class = scheduler.templates.event_class(ev.start_date, ev.end_date, ev);
+ html+="<div class='dhx_agenda_line"+(ev_class?' '+ev_class:'')+"' event_id='"+ev.id+"' style='"+color+""+bg_color+""+(ev._text_style||"")+"'><div class='dhx_agenda_event_time'>"+scheduler.templates.agenda_time(ev.start_date, ev.end_date,ev)+"</div>";
+ html+="<div class='dhx_event_icon icon_details'>&nbsp</div>";
+ html+="<span>"+scheduler.templates.agenda_text(ev.start_date, ev.end_date, ev)+"</span></div>";
+ }
+ html+="<div class='dhx_v_border'></div></div>";
+
+ //render html
+ scheduler._els["dhx_cal_data"][0].innerHTML = html;
+ scheduler._els["dhx_cal_data"][0].childNodes[0].scrollTop = scheduler._agendaScrollTop||0;
+
+ // setting up dhx_v_border size
+ var agenda_area = scheduler._els["dhx_cal_data"][0].childNodes[0];
+ var v_border = agenda_area.childNodes[agenda_area.childNodes.length-1];
+ v_border.style.height = (agenda_area.offsetHeight < scheduler._els["dhx_cal_data"][0].offsetHeight) ? "100%" : (agenda_area.offsetHeight+"px");
+
+ var t=scheduler._els["dhx_cal_data"][0].firstChild.childNodes;
+ scheduler._els["dhx_cal_date"][0].innerHTML=scheduler.templates.agenda_date(scheduler._min_date, scheduler._max_date, scheduler._mode);
+
+ scheduler._rendered=[];
+ for (var i=0; i < t.length-1; i++)
+ scheduler._rendered[i]=t[i];
+
+ }
+
+ scheduler.agenda_view=function(mode){
+ scheduler._min_date = scheduler.config.agenda_start||scheduler.date.agenda_start(scheduler._date);
+ scheduler._max_date = scheduler.config.agenda_end||scheduler.date.add_agenda(scheduler._min_date, 1);
+ scheduler._table_view = true;
+ set_full_view(mode);
+ if (mode){
+ //agenda tab activated
+ fill_agenda_tab();
+ } else {
+ //agenda tab de-activated
+ }
+ };
+});
diff --git a/codebase/sources/ext/dhtmlxscheduler_agenda_view.js.map b/codebase/sources/ext/dhtmlxscheduler_agenda_view.js.map
new file mode 100644
index 0000000..c7e5d0b
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_agenda_view.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_agenda_view.js.map","sources":["dhtmlxscheduler_agenda_view.js"],"names":["scheduler","date","add_agenda","add","templates","agenda_time","start","end","ev","_timed","this","day_date","start_date","end_date","event_date","agenda_text","event","text","agenda_date","agenda_start","date_part","_currentDate","attachEvent","set_full_view","mode","l","locale","labels","_els","innerHTML","description","_table_view","set_sizes","fill_agenda_tab","events","_date","get_visible_events","sort","a","b","html","i","length","bg_color","color","textColor","ev_class","event_class","id","_text_style","childNodes","scrollTop","_agendaScrollTop","agenda_area","v_border","style","height","offsetHeight","t","firstChild","_min_date","_max_date","_mode","_rendered","old_dblclick_dhx_cal_data","dblclick_dhx_cal_data","config","readonly","dblclick_create","addEventNow","apply","arguments","agenda_view","old","render_data","old_render_view_data","render_view_data","agenda_end"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_all_timed.js b/codebase/sources/ext/dhtmlxscheduler_all_timed.js
new file mode 100644
index 0000000..2bb81fe
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_all_timed.js
@@ -0,0 +1,148 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+(function(){
+
+ scheduler.config.all_timed = "short";
+
+ var is_event_short = function (ev) {
+ return !((ev.end_date - ev.start_date)/(1000*60*60) >= 24);
+ };
+
+ // copy of usual events and recurring instances;
+ // regular copy causes problems with recurrings which have series event as a prototype
+ scheduler._safe_copy = function(event){
+ var proto = null,
+ copy = null;
+ if(event.event_pid){
+ proto = scheduler.getEvent(event.event_pid);
+ }
+
+ if (proto && proto.isPrototypeOf(event)) {
+ copy = scheduler._copy_event(event);
+ delete copy.event_length;
+ delete copy.event_pid;
+ delete copy.rec_pattern;
+ delete copy.rec_type;
+ } else {
+ copy = scheduler._lame_clone(event);
+ }
+ return copy;
+ };
+
+ var old_prerender_events_line = scheduler._pre_render_events_line;
+ scheduler._pre_render_events_line = function(evs, hold){
+ if (!this.config.all_timed)
+ return old_prerender_events_line.call(this, evs, hold);
+
+ for (var i=0; i < evs.length; i++) {
+ var ev=evs[i];
+
+ if (ev._timed)
+ continue;
+
+ if (this.config.all_timed == "short") {
+ if (!is_event_short(ev)) {
+ evs.splice(i--,1);
+ continue;
+ }
+ }
+
+ var ce = this._safe_copy(ev); // current event (event for one specific day) is copy of original with modified dates
+
+ ce.start_date = new Date(ce.start_date); // as lame copy doesn't copy date objects
+
+ if (!isOvernightEvent(ev)) {
+ ce.end_date = new Date(ev.end_date);
+ }
+ else {
+ ce.end_date = getNextDay(ce.start_date);
+ if (this.config.last_hour != 24) { // if specific last_hour was set (e.g. 20)
+ ce.end_date = setDateTime(ce.start_date, this.config.last_hour);
+ }
+ }
+
+ var event_changed = false;
+ if (ce.start_date < this._max_date && ce.end_date > this._min_date && ce.start_date < ce.end_date) {
+ evs[i] = ce; // adding another event in collection
+ event_changed = true;
+ }
+ // if (ce.start_date > ce.end_date) {
+ // evs.splice(i--,1);
+ // }
+
+ var re = this._safe_copy(ev); // remaining event, copy of original with modified start_date (making range more narrow)
+ re.end_date = new Date(re.end_date);
+ if (re.start_date < this._min_date)
+ re.start_date = setDateTime(this._min_date, this.config.first_hour);// as we are starting only with whole hours
+ else
+ re.start_date = setDateTime(getNextDay(ev.start_date), this.config.first_hour);
+
+ if (re.start_date < this._max_date && re.start_date < re.end_date) {
+ if (event_changed)
+ evs.splice(i+1,0,re);//insert part
+ else {
+ evs[i--] = re;
+ continue;
+ }
+ }
+
+ }
+ // in case of all_timed pre_render is not applied to the original event
+ // so we need to force redraw in case of dnd
+ var redraw = (this._drag_mode == 'move')?false:hold;
+ return old_prerender_events_line.call(this, evs, redraw);
+
+
+ function isOvernightEvent(ev){
+ var next_day = getNextDay(ev.start_date);
+ return (+ev.end_date > +next_day);
+ }
+ function getNextDay(date){
+ var next_day = scheduler.date.add(date, 1, "day");
+ next_day = scheduler.date.date_part(next_day);
+ return next_day;
+ }
+ function setDateTime(date, hours){
+ var val = scheduler.date.date_part(new Date(date));
+ val.setHours(hours);
+ return val;
+ }
+ };
+ var old_get_visible_events = scheduler.get_visible_events;
+ scheduler.get_visible_events = function(only_timed){
+ if (!(this.config.all_timed && this.config.multi_day))
+ return old_get_visible_events.call(this, only_timed);
+ return old_get_visible_events.call(this, false); // only timed = false
+ };
+ scheduler.attachEvent("onBeforeViewChange", function (old_mode, old_date, mode, date) {
+ scheduler._allow_dnd = (mode == "day" || mode == "week");
+ return true;
+ });
+
+ scheduler._is_main_area_event = function(ev){
+ return !!(ev._timed || this.config.all_timed === true || (this.config.all_timed == "short" && is_event_short(ev)) );
+ };
+
+ var oldUpdate = scheduler.updateEvent;
+ scheduler.updateEvent = function(id){
+ // full redraw(update_render=true) messes events order while dnd.
+ // individual redraw(update_render=false) of multiday event, which happens on select/unselect, expands event to full width of the cell and can be fixes only with full redraw.
+ // so for now full redraw is always enabled for not-dnd updates
+ var fullRedrawNeeded = (scheduler.config.all_timed && !(scheduler.isOneDayEvent(scheduler._events[id]) || scheduler.getState().drag_id));
+ var initial;
+ if(fullRedrawNeeded){
+ initial = scheduler.config.update_render;
+ scheduler.config.update_render = true;
+ }
+ oldUpdate.apply(scheduler, arguments);
+
+ if(fullRedrawNeeded){
+ scheduler.config.update_render = initial;
+ }
+ };
+})(); \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_all_timed.js.map b/codebase/sources/ext/dhtmlxscheduler_all_timed.js.map
new file mode 100644
index 0000000..e5589ea
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_all_timed.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_all_timed.js.map","sources":["dhtmlxscheduler_all_timed.js"],"names":["scheduler","config","all_timed","is_event_short","ev","end_date","start_date","_safe_copy","event","proto","copy","event_pid","getEvent","isPrototypeOf","_copy_event","event_length","rec_pattern","rec_type","_lame_clone","old_prerender_events_line","_pre_render_events_line","evs","hold","isOvernightEvent","next_day","getNextDay","date","add","date_part","setDateTime","hours","val","Date","setHours","this","call","i","length","_timed","ce","last_hour","event_changed","_max_date","_min_date","re","first_hour","splice","redraw","_drag_mode","old_get_visible_events","get_visible_events","only_timed","multi_day","attachEvent","old_mode","old_date","mode","_allow_dnd","_is_main_area_event","oldUpdate","updateEvent","id","initial","fullRedrawNeeded","isOneDayEvent","_events","getState","drag_id","update_render","apply","arguments"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_collision.js b/codebase/sources/ext/dhtmlxscheduler_collision.js
new file mode 100644
index 0000000..ce79a4a
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_collision.js
@@ -0,0 +1,131 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+(function(){
+
+var temp_section;
+var before;
+
+scheduler.config.collision_limit = 1;
+
+function _setTempSection(event_id) { // for custom views (matrix, timeline, units)
+ var checked_mode = scheduler._get_section_view();
+ if(checked_mode && event_id){
+ temp_section = scheduler.getEvent(event_id)[scheduler._get_section_property()];
+ }
+}
+
+scheduler.attachEvent("onBeforeDrag",function(id){
+ _setTempSection(id);
+ return true;
+});
+scheduler.attachEvent("onBeforeLightbox",function(id){
+ var ev = scheduler.getEvent(id);
+ before = [ev.start_date, ev.end_date];
+ _setTempSection(id);
+ return true;
+});
+scheduler.attachEvent("onEventChanged",function(id){
+ if (!id || !scheduler.getEvent(id)) return true;
+ var ev = scheduler.getEvent(id);
+ if (!scheduler.checkCollision(ev)){
+ if (!before) return false;
+ ev.start_date = before[0];
+ ev.end_date = before[1];
+ ev._timed=this.isOneDayEvent(ev);
+ }
+ return true;
+});
+scheduler.attachEvent("onBeforeEventChanged",function(ev,e,is_new){
+ return scheduler.checkCollision(ev);
+});
+scheduler.attachEvent("onEventAdded",function(id,ev) {
+ var result = scheduler.checkCollision(ev);
+ if (!result)
+ scheduler.deleteEvent(id);
+});
+scheduler.attachEvent("onEventSave",function(id, edited_ev, is_new){
+ edited_ev = scheduler._lame_clone(edited_ev);
+ edited_ev.id = id;
+
+ //lightbox may not have 'time' section
+ if(!(edited_ev.start_date && edited_ev.end_date)){
+ var ev = scheduler.getEvent(id);
+ edited_ev.start_date = new Date(ev.start_date);
+ edited_ev.end_date = new Date(ev.end_date);
+ }
+
+ if(edited_ev.rec_type){
+ scheduler._roll_back_dates(edited_ev);
+ }
+ return scheduler.checkCollision(edited_ev); // in case user creates event on one date but then edited it another
+});
+
+scheduler._check_sections_collision = function(first, second){
+ var map_to = scheduler._get_section_property();
+ if (first[map_to] == second[map_to] && first.id != second.id)
+ return true;
+ return false;
+};
+
+scheduler.checkCollision = function(ev) {
+ var evs = [];
+ var collision_limit = scheduler.config.collision_limit;
+
+ if (ev.rec_type) {
+ var evs_dates = scheduler.getRecDates(ev);
+ for(var k=0; k<evs_dates.length; k++) {
+ var tevs = scheduler.getEvents(evs_dates[k].start_date, evs_dates[k].end_date);
+ for(var j=0; j<tevs.length; j++) {
+ if ((tevs[j].event_pid || tevs[j].id) != ev.id )
+ evs.push(tevs[j]);
+ }
+ }
+ } else {
+ evs = scheduler.getEvents(ev.start_date, ev.end_date);
+ for (var i=0; i<evs.length; i++) {
+ if (evs[i].id == ev.id) {
+ evs.splice(i,1);
+ break;
+ }
+ }
+ }
+
+
+ var checked_mode = scheduler._get_section_view();
+ var map_to = scheduler._get_section_property();
+
+ var single = true;
+ if (checked_mode) { // custom view
+ var count = 0;
+
+ for (var i = 0; i < evs.length; i++){
+ if (evs[i].id != ev.id && this._check_sections_collision(evs[i], ev))
+ count++;
+ }
+
+ if (count >= collision_limit) {
+
+ single = false;
+ }
+ }
+ else {
+ if ( evs.length >= collision_limit )
+ single = false;
+ }
+ if (!single) {
+ var res = !scheduler.callEvent("onEventCollision",[ev,evs]);
+ if (!res) {
+ ev[map_to] = temp_section||ev[map_to]; // from _setTempSection for custom views
+ }
+ return res;
+ }
+ return single;
+
+};
+
+})();
diff --git a/codebase/sources/ext/dhtmlxscheduler_collision.js.map b/codebase/sources/ext/dhtmlxscheduler_collision.js.map
new file mode 100644
index 0000000..033f96c
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_collision.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_collision.js.map","sources":["dhtmlxscheduler_collision.js"],"names":["_setTempSection","event_id","checked_mode","scheduler","_get_section_view","temp_section","getEvent","_get_section_property","before","config","collision_limit","attachEvent","id","ev","start_date","end_date","checkCollision","_timed","this","isOneDayEvent","result","deleteEvent","edited_ev","_lame_clone","Date","rec_type","_roll_back_dates","_check_sections_collision","first","second","map_to","evs","evs_dates","getRecDates","k","length","tevs","getEvents","j","event_pid","push","i","splice","single","count","res","callEvent"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_container_autoresize.js b/codebase/sources/ext/dhtmlxscheduler_container_autoresize.js
new file mode 100644
index 0000000..78bbcf3
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_container_autoresize.js
@@ -0,0 +1,164 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+(function() {
+
+ scheduler.config.container_autoresize = true;
+ scheduler.config.month_day_min_height = 90;
+
+ var old_pre_render_event = scheduler._pre_render_events;
+
+ scheduler._pre_render_events = function(evs, hold) {
+ if (!scheduler.config.container_autoresize) {
+ return old_pre_render_event.apply(this, arguments);
+ }
+
+ var hb = this.xy.bar_height;
+ var h_old = this._colsS.heights;
+ var h = this._colsS.heights = [0, 0, 0, 0, 0, 0, 0];
+ var data = this._els["dhx_cal_data"][0];
+
+ if (!this._table_view)
+ evs = this._pre_render_events_line(evs, hold); //ignore long events for now
+ else
+ evs = this._pre_render_events_table(evs, hold);
+
+ if (this._table_view) {
+ if (hold){
+ this._colsS.heights = h_old;
+ } else {
+ var evl = data.firstChild;
+ if (evl.rows) {
+ for (var i = 0; i < evl.rows.length; i++) {
+ h[i]++;
+ if ((h[i]) * hb > this._colsS.height - this.xy.month_head_height) { // 22 - height of cell's header
+ //we have overflow, update heights
+ var cells = evl.rows[i].cells;
+
+ var cHeight = this._colsS.height - this.xy.month_head_height;
+ if(this.config.max_month_events*1 !== this.config.max_month_events || h[i] <= this.config.max_month_events){
+ cHeight = h[i] * hb;
+ }else if( (this.config.max_month_events + 1) * hb > this._colsS.height - this.xy.month_head_height){
+ cHeight = (this.config.max_month_events + 1) * hb;
+ }
+
+ for (var j = 0; j < cells.length; j++) {
+ cells[j].childNodes[1].style.height = cHeight + "px";
+ }
+ h[i] = (h[i - 1] || 0) + cells[0].offsetHeight;
+ }
+ h[i] = (h[i - 1] || 0) + evl.rows[i].cells[0].offsetHeight;
+ }
+ h.unshift(0);
+ if (evl.parentNode.offsetHeight < evl.parentNode.scrollHeight && !evl._h_fix) {
+ //we have v-scroll, decrease last day cell
+
+ // NO CHECK SHOULD BE MADE ON VERTICAL SCROLL
+ }
+ } else {
+ if (!evs.length && this._els["dhx_multi_day"][0].style.visibility == "visible")
+ h[0] = -1;
+ if (evs.length || h[0] == -1) {
+ //shift days to have space for multiday events
+ var childs = evl.parentNode.childNodes;
+ var dh = ((h[0] + 1) * hb + 1) + "px"; // +1 so multiday events would have 2px from top and 2px from bottom by default
+ data.style.top = (this._els["dhx_cal_navline"][0].offsetHeight + this._els["dhx_cal_header"][0].offsetHeight + parseInt(dh, 10)) + 'px';
+ data.style.height = (this._obj.offsetHeight - parseInt(data.style.top, 10) - (this.xy.margin_top || 0)) + 'px';
+ var last = this._els["dhx_multi_day"][0];
+ last.style.height = dh;
+ last.style.visibility = (h[0] == -1 ? "hidden" : "visible");
+ last = this._els["dhx_multi_day"][1];
+ last.style.height = dh;
+ last.style.visibility = (h[0] == -1 ? "hidden" : "visible");
+ last.className = h[0] ? "dhx_multi_day_icon" : "dhx_multi_day_icon_small";
+ this._dy_shift = (h[0] + 1) * hb;
+ h[0] = 0;
+ }
+ }
+ }
+ }
+
+ return evs;
+ };
+
+ var checked_divs = ["dhx_cal_navline", "dhx_cal_header", "dhx_multi_day", "dhx_cal_data"];
+ var updateContainterHeight = function(is_repaint) {
+ var total_height = 0;
+ for (var i = 0; i < checked_divs.length; i++) {
+
+ var className = checked_divs[i];
+ var checked_div = (scheduler._els[className]) ? scheduler._els[className][0] : null;
+ var height = 0;
+ switch (className) {
+ case "dhx_cal_navline":
+ case "dhx_cal_header":
+ height = parseInt(checked_div.style.height, 10);
+ break;
+ case "dhx_multi_day":
+ height = (checked_div) ? checked_div.offsetHeight : 0;
+ if (height == 1)
+ height = 0;
+ break;
+ case "dhx_cal_data":
+ height = Math.max(checked_div.offsetHeight - 1, checked_div.scrollHeight);
+ var mode = scheduler.getState().mode;
+ if (mode == "month") {
+ if (scheduler.config.month_day_min_height && !is_repaint) {
+ var rows_length = checked_div.getElementsByTagName("tr").length;
+ height = rows_length * scheduler.config.month_day_min_height;
+ }
+ if (is_repaint) {
+ checked_div.style.height = height + "px";
+ }
+ }
+ if (scheduler.matrix && scheduler.matrix[mode]) {
+ if (is_repaint) {
+ height += 2;
+ checked_div.style.height = height + "px";
+ } else {
+ height = 2;
+ var cfg = scheduler.matrix[mode];
+ var rows = cfg.y_unit;
+ for(var r=0; r < rows.length; r++){
+ height += !rows[r].children ? cfg.dy : (cfg.folder_dy||cfg.dy);
+ }
+ }
+ }
+ if (mode == "day" || mode == "week") {
+ height += 2;
+ }
+ break;
+ }
+ total_height += height;
+ }
+ scheduler._obj.style.height = (total_height) + "px";
+
+ if (!is_repaint)
+ scheduler.updateView();
+ };
+
+ var conditionalUpdateContainerHeight = function() {
+ var mode = scheduler.getState().mode;
+
+ updateContainterHeight();
+ if ( (scheduler.matrix && scheduler.matrix[mode]) || mode == "month" ) {
+ window.setTimeout(function() {
+ updateContainterHeight(true);
+ }, 1);
+ }
+ };
+
+ scheduler.attachEvent("onViewChange", conditionalUpdateContainerHeight);
+ scheduler.attachEvent("onXLE", conditionalUpdateContainerHeight);
+ scheduler.attachEvent("onEventChanged", conditionalUpdateContainerHeight);
+ scheduler.attachEvent("onEventCreated", conditionalUpdateContainerHeight);
+ scheduler.attachEvent("onEventAdded", conditionalUpdateContainerHeight);
+ scheduler.attachEvent("onEventDeleted", conditionalUpdateContainerHeight);
+ scheduler.attachEvent("onAfterSchedulerResize", conditionalUpdateContainerHeight);
+ scheduler.attachEvent("onClearAll", conditionalUpdateContainerHeight);
+
+})(); \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_container_autoresize.js.map b/codebase/sources/ext/dhtmlxscheduler_container_autoresize.js.map
new file mode 100644
index 0000000..207513a
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_container_autoresize.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_container_autoresize.js.map","sources":["dhtmlxscheduler_container_autoresize.js"],"names":["scheduler","config","container_autoresize","month_day_min_height","old_pre_render_event","_pre_render_events","evs","hold","apply","this","arguments","hb","xy","bar_height","h_old","_colsS","heights","h","data","_els","_table_view","_pre_render_events_table","_pre_render_events_line","evl","firstChild","rows","i","length","height","month_head_height","cells","cHeight","max_month_events","j","childNodes","style","offsetHeight","unshift","parentNode","scrollHeight","_h_fix","visibility","dh","top","parseInt","_obj","margin_top","last","className","_dy_shift","checked_divs","updateContainterHeight","is_repaint","total_height","checked_div","Math","max","mode","getState","rows_length","getElementsByTagName","matrix","cfg","y_unit","r","children","folder_dy","dy","updateView","conditionalUpdateContainerHeight","window","setTimeout","attachEvent"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_cookie.js b/codebase/sources/ext/dhtmlxscheduler_cookie.js
new file mode 100644
index 0000000..4420e2b
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_cookie.js
@@ -0,0 +1,73 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+(function(){
+ function setCookie(name,cookie_param,value) {
+ var str = name + "=" + value + (cookie_param?("; "+cookie_param):"");
+ document.cookie = str;
+ }
+ function getCookie(name) {
+ var search = name + "=";
+ if (document.cookie.length > 0) {
+ var offset = document.cookie.indexOf(search);
+ if (offset != -1) {
+ offset += search.length;
+ var end = document.cookie.indexOf(";", offset);
+ if (end == -1)
+ end = document.cookie.length;
+ return document.cookie.substring(offset, end);
+ }
+ }
+ return "";
+ }
+ var first = true;
+ scheduler.attachEvent("onBeforeViewChange",function(om,od,m,d){
+ if (first){
+ first = false;
+
+
+
+ var data=getCookie("scheduler_settings");
+ if (data){
+
+ if(!scheduler._min_date){
+ //otherwise scheduler will have incorrect date until timeout
+ //it can cause js error with 'onMouseMove' handler of key_nav.js
+ scheduler._min_date = d;
+ }
+
+ data = unescape(data).split("@");
+ data[0] = this.templates.xml_date(data[0]);
+ var view = this.isViewExists(data[1]) ? data[1] : m,
+ date = !isNaN(+data[0]) ? data[0] : d;
+
+ window.setTimeout(function(){
+ scheduler.setCurrentView(date,view);
+ },1);
+ return false;
+ }
+ }
+ var text = escape(this.templates.xml_format(d||od)+"@"+(m||om));
+ setCookie("scheduler_settings","expires=Sun, 31 Jan 9999 22:00:00 GMT",text);
+ return true;
+ });
+
+
+ // As we are blocking first render above there could be a problem in case of dynamic loading ('from' won't be defined)
+ var old_load = scheduler._load;
+ scheduler._load = function() {
+ var args = arguments;
+ if (!scheduler._date && scheduler._load_mode) {
+ var that = this;
+ window.setTimeout(function() {
+ old_load.apply(that, args);
+ },1);
+ } else {
+ old_load.apply(this, args);
+ }
+ };
+})(); \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_cookie.js.map b/codebase/sources/ext/dhtmlxscheduler_cookie.js.map
new file mode 100644
index 0000000..5490213
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_cookie.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_cookie.js.map","sources":["dhtmlxscheduler_cookie.js"],"names":["setCookie","name","cookie_param","value","str","document","cookie","getCookie","search","length","offset","indexOf","end","substring","first","scheduler","attachEvent","om","od","m","d","data","_min_date","unescape","split","this","templates","xml_date","view","isViewExists","date","isNaN","window","setTimeout","setCurrentView","text","escape","xml_format","old_load","_load","args","arguments","_date","_load_mode","that","apply"],"mappings":"CAAA,WACC,QAASA,GAAUC,EAAKC,EAAaC,GACpC,GAAIC,GAAMH,EAAO,IAAME,GAAUD,EAAc,KAAKA,EAAc,GAClEG,UAASC,OAASF,EAEnB,QAASG,GAAUN,GAClB,GAAIO,GAASP,EAAO,GACpB,IAAII,SAASC,OAAOG,OAAS,EAAG,CAC/B,GAAIC,GAASL,SAASC,OAAOK,QAAQH,EACrC,IAAc,IAAVE,EAAc,CACjBA,GAAUF,EAAOC,MACjB,IAAIG,GAAMP,SAASC,OAAOK,QAAQ,IAAKD,EAGvC,OAFW,IAAPE,IACHA,EAAMP,SAASC,OAAOG,QAChBJ,SAASC,OAAOO,UAAUH,EAAQE,IAG3C,MAAO,GAER,GAAIE,IAAQ,CACZC,WAAUC,YAAY,qBAAqB,SAASC,EAAGC,EAAGC,EAAEC,GAC3D,GAAIN,EAAM,CACTA,GAAQ,CAIR,IAAIO,GAAKd,EAAU,qBACnB,IAAIc,EAAK,CAEJN,UAAUO,YAGbP,UAAUO,UAAYF,GAGvBC,EAAOE,SAASF,GAAMG,MAAM,KAC5BH,EAAK,GAAKI,KAAKC,UAAUC,SAASN,EAAK,GACvC;GAAIO,GAAOH,KAAKI,aAAaR,EAAK,IAAMA,EAAK,GAAKF,EACjDW,EAAQC,OAAOV,EAAK,IAAgBD,EAAVC,EAAK,EAKhC,OAHAW,QAAOC,WAAW,WACjBlB,UAAUmB,eAAeJ,EAAKF,IAC7B,IACK,GAGT,GAAIO,GAAOC,OAAOX,KAAKC,UAAUW,WAAWjB,GAAGF,GAAI,KAAKC,GAAGF,GAE3D,OADAjB,GAAU,qBAAqB,wCAAwCmC,IAChE,GAKR,IAAIG,GAAWvB,UAAUwB,KACzBxB,WAAUwB,MAAQ,WACjB,GAAIC,GAAOC,SACX,KAAK1B,UAAU2B,OAAS3B,UAAU4B,WAAY,CAC7C,GAAIC,GAAOnB,IACXO,QAAOC,WAAW,WACjBK,EAASO,MAAMD,EAAMJ,IACpB,OAEFF,GAASO,MAAMpB,KAAMe"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_editors.js b/codebase/sources/ext/dhtmlxscheduler_editors.js
new file mode 100644
index 0000000..f088140
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_editors.js
@@ -0,0 +1,161 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.form_blocks['combo']={
+ render:function(sns) {
+ if (!sns.cached_options)
+ sns.cached_options = {};
+ var res = '';
+ res += "<div class='"+sns.type+"' style='height:"+(sns.height||20)+"px;' ></div>";
+ return res;
+ },
+ set_value:function(node,value,ev,config){
+ (function(){
+ resetCombo();
+ var id = scheduler.attachEvent("onAfterLightbox",function(){
+ // otherwise destructor will never be called after form reset(e.g. in readonly event mode)
+ resetCombo();
+ scheduler.detachEvent(id);
+ });
+ function resetCombo(){
+ if(node._combo && node._combo.DOMParent) {
+ node._combo.destructor();
+ }
+ }
+ })();
+ window.dhx_globalImgPath = config.image_path||'/';
+ node._combo = new dhtmlXCombo(node, config.name, node.offsetWidth-8);
+ if (config.onchange)
+ node._combo.attachEvent("onChange", config.onchange);
+
+ if (config.options_height)
+ node._combo.setOptionHeight(config.options_height);
+ var combo = node._combo;
+ combo.enableFilteringMode(config.filtering, config.script_path||null, !!config.cache);
+
+ if (!config.script_path) { // script-side filtration is used
+ var all_options = [];
+ for (var i = 0; i < config.options.length; i++) {
+ var option = config.options[i];
+ var single_option = [
+ option.key,
+ option.label,
+ option.css
+ ];
+ all_options.push(single_option);
+ }
+ combo.addOption(all_options);
+ if (ev[config.map_to]) {
+ var index = combo.getIndexByValue(ev[config.map_to]);
+ combo.selectOption(index);
+ }
+ } else { // server-side filtration is used
+ var selected_id = ev[config.map_to];
+ if (selected_id) {
+ if (config.cached_options[selected_id]) {
+ combo.addOption(selected_id, config.cached_options[selected_id]);
+ combo.disable(1);
+ combo.selectOption(0);
+ combo.disable(0);
+ } else {
+ dhtmlxAjax.get(config.script_path+"?id="+selected_id+"&uid="+scheduler.uid(), function(result){
+ var option = result.doXPath("//option")[0];
+ var label = option.childNodes[0].nodeValue;
+ config.cached_options[selected_id] = label;
+ combo.addOption(selected_id, label);
+ combo.disable(1);
+ combo.selectOption(0);
+ combo.disable(0);
+ });
+ }
+ } else {
+ combo.setComboValue("");
+ }
+ }
+ },
+ get_value:function(node,ev,config) {
+ var selected_id = node._combo.getSelectedValue(); // value = key
+ if (config.script_path) {
+ config.cached_options[selected_id] = node._combo.getSelectedText();
+ }
+ return selected_id;
+ },
+ focus:function(node){
+ }
+};
+
+scheduler.form_blocks['radio']={
+ render:function(sns) {
+ var res = '';
+ res += "<div class='dhx_cal_ltext dhx_cal_radio' style='height:"+sns.height+"px;' >";
+ for (var i=0; i<sns.options.length; i++) {
+ var id = scheduler.uid();
+ res += "<input id='"+id+"' type='radio' name='"+sns.name+"' value='"+sns.options[i].key+"'><label for='"+id+"'>"+" "+sns.options[i].label+"</label>";
+ if(sns.vertical)
+ res += "<br/>";
+ }
+ res += "</div>";
+
+ return res;
+ },
+ set_value:function(node,value,ev,config){
+ var radiobuttons = node.getElementsByTagName('input');
+ for (var i = 0; i < radiobuttons.length; i++) {
+ radiobuttons[i].checked = false;
+ var checked_value = ev[config.map_to]||value;
+ if (radiobuttons[i].value == checked_value) {
+ radiobuttons[i].checked = true;
+ }
+ }
+ },
+ get_value:function(node,ev,config){
+ var radiobuttons = node.getElementsByTagName('input');
+ for(var i=0; i<radiobuttons.length; i++) {
+ if(radiobuttons[i].checked) {
+ return radiobuttons[i].value;
+ }
+ }
+ },
+ focus:function(node){
+ }
+};
+
+scheduler.form_blocks['checkbox']={
+ render:function(sns) {
+ if (scheduler.config.wide_form)
+ return '<div class="dhx_cal_wide_checkbox" '+(sns.height?("style='height:"+sns.height+"px;'"):"")+'></div>';
+ else
+ return '';
+ },
+ set_value:function(node,value,ev,config){
+ node=document.getElementById(config.id);
+ var id = scheduler.uid();
+ var isChecked = (typeof config.checked_value != "undefined") ? value == config.checked_value : !!value;
+ node.className += " dhx_cal_checkbox";
+ var check_html = "<input id='"+id+"' type='checkbox' value='true' name='"+config.name+"'"+((isChecked)?"checked='true'":'')+"'>";
+ var label_html = "<label for='"+id+"'>"+(scheduler.locale.labels["section_"+config.name]||config.name)+"</label>";
+ if (scheduler.config.wide_form){
+ node.innerHTML = label_html;
+ node.nextSibling.innerHTML=check_html;
+ } else
+ node.innerHTML=check_html+label_html;
+
+ if (config.handler) {
+ var checkbox = node.getElementsByTagName('input')[0];
+ checkbox.onclick = config.handler;
+ }
+ },
+ get_value:function(node,ev,config){
+ node=document.getElementById(config.id);
+ var checkbox = node.getElementsByTagName('input')[0]; // moved to the header
+ if (!checkbox)
+ checkbox = node.nextSibling.getElementsByTagName('input')[0];
+ return (checkbox.checked)?(config.checked_value||true):(config.unchecked_value||false);
+ },
+ focus:function(node){
+ }
+};
diff --git a/codebase/sources/ext/dhtmlxscheduler_editors.js.map b/codebase/sources/ext/dhtmlxscheduler_editors.js.map
new file mode 100644
index 0000000..1980416
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_editors.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_editors.js.map","sources":["dhtmlxscheduler_editors.js"],"names":["scheduler","form_blocks","render","sns","cached_options","res","type","height","set_value","node","value","ev","config","resetCombo","_combo","DOMParent","destructor","id","attachEvent","detachEvent","window","dhx_globalImgPath","image_path","dhtmlXCombo","name","offsetWidth","onchange","options_height","setOptionHeight","combo","enableFilteringMode","filtering","script_path","cache","selected_id","map_to","addOption","disable","selectOption","dhtmlxAjax","get","uid","result","option","doXPath","label","childNodes","nodeValue","setComboValue","all_options","i","options","length","single_option","key","css","push","index","getIndexByValue","get_value","getSelectedValue","getSelectedText","focus","vertical","radiobuttons","getElementsByTagName","checked","checked_value","wide_form","document","getElementById","isChecked","className","check_html","label_html","locale","labels","innerHTML","nextSibling","handler","checkbox","onclick","unchecked_value"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_expand.js b/codebase/sources/ext/dhtmlxscheduler_expand.js
new file mode 100644
index 0000000..2a5a4b8
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_expand.js
@@ -0,0 +1,76 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.expand = function() {
+ var t = scheduler._obj;
+ do {
+ t._position = t.style.position || "";
+ t.style.position = "static";
+ } while ((t = t.parentNode) && t.style);
+ t = scheduler._obj;
+ t.style.position = "absolute";
+ t._width = t.style.width;
+ t._height = t.style.height;
+ t.style.width = t.style.height = "100%";
+ t.style.top = t.style.left = "0px";
+
+ var top = document.body;
+ top.scrollTop = 0;
+
+ top = top.parentNode;
+ if (top)
+ top.scrollTop = 0;
+ document.body._overflow = document.body.style.overflow || "";
+ document.body.style.overflow = "hidden";
+ scheduler._maximize();
+};
+scheduler.collapse = function() {
+ var t = scheduler._obj;
+ do {
+ t.style.position = t._position;
+ } while ((t = t.parentNode) && t.style);
+ t = scheduler._obj;
+ t.style.width = t._width;
+ t.style.height = t._height;
+ document.body.style.overflow = document.body._overflow;
+ scheduler._maximize();
+};
+scheduler.attachEvent("onTemplatesReady", function() {
+ var t = document.createElement("DIV");
+ t.className = "dhx_expand_icon";
+ scheduler.toggleIcon = t;
+ scheduler._obj.appendChild(t);
+ t.onclick = function() {
+ if (!scheduler.expanded)
+ scheduler.expand(); else
+ scheduler.collapse();
+ };
+});
+scheduler._maximize = function() {
+ this.expanded = !this.expanded;
+ this.toggleIcon.style.backgroundPosition = "0 " + (this.expanded ? "0" : "18") + "px";
+
+ var directions = ['left', 'top'];
+ for (var i = 0; i < directions.length; i++) {
+ var margin = scheduler.xy['margin_' + directions[i]];
+ var prev_margin = scheduler['_prev_margin_' + directions[i]];
+ if (scheduler.xy['margin_' + directions[i]]) {
+ scheduler['_prev_margin_' + directions[i]] = scheduler.xy['margin_' + directions[i]];
+ scheduler.xy['margin_' + directions[i]] = 0;
+ } else {
+ if (prev_margin) {
+ scheduler.xy['margin_' + directions[i]] = scheduler['_prev_margin_' + directions[i]];
+ delete scheduler['_prev_margin_' + directions[i]];
+ }
+ }
+ }
+
+ if (scheduler.callEvent("onSchedulerResize", [])) {
+ scheduler.update_view();
+ scheduler.callEvent("onAfterSchedulerResize");
+ }
+};
diff --git a/codebase/sources/ext/dhtmlxscheduler_expand.js.map b/codebase/sources/ext/dhtmlxscheduler_expand.js.map
new file mode 100644
index 0000000..7c67fd4
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_expand.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_expand.js.map","sources":["dhtmlxscheduler_expand.js"],"names":["scheduler","expand","t","_obj","_position","style","position","parentNode","_width","width","_height","height","top","left","document","body","scrollTop","_overflow","overflow","_maximize","collapse","attachEvent","createElement","className","toggleIcon","appendChild","onclick","expanded","this","backgroundPosition","directions","i","length","prev_margin","xy","callEvent","update_view"],"mappings":"AAAAA,UAAUC,OAAS,WAClB,GAAIC,GAAIF,UAAUG,IAClB,GACCD,GAAEE,UAAYF,EAAEG,MAAMC,UAAY,GAClCJ,EAAEG,MAAMC,SAAW,gBACVJ,EAAIA,EAAEK,aAAeL,EAAEG,MACjCH,GAAIF,UAAUG,KACdD,EAAEG,MAAMC,SAAW,WACnBJ,EAAEM,OAASN,EAAEG,MAAMI,MACnBP,EAAEQ,QAAUR,EAAEG,MAAMM,OACpBT,EAAEG,MAAMI,MAAQP,EAAEG,MAAMM,OAAS,OACjCT,EAAEG,MAAMO,IAAMV,EAAEG,MAAMQ,KAAO,KAE7B,IAAID,GAAME,SAASC,IACnBH,GAAII,UAAY,EAEhBJ,EAAMA,EAAIL,WACNK,IACHA,EAAII,UAAY,GACjBF,SAASC,KAAKE,UAAYH,SAASC,KAAKV,MAAMa,UAAY,GAC1DJ,SAASC,KAAKV,MAAMa,SAAW,SAC/BlB,UAAUmB,aAEXnB,UAAUoB,SAAW,WACpB,GAAIlB,GAAIF,UAAUG,IAClB;EACCD,GAAEG,MAAMC,SAAWJ,EAAEE,iBACZF,EAAIA,EAAEK,aAAeL,EAAEG,MACjCH,GAAIF,UAAUG,KACdD,EAAEG,MAAMI,MAAQP,EAAEM,OAClBN,EAAEG,MAAMM,OAAST,EAAEQ,QACnBI,SAASC,KAAKV,MAAMa,SAAWJ,SAASC,KAAKE,UAC7CjB,UAAUmB,aAEXnB,UAAUqB,YAAY,mBAAoB,WACzC,GAAInB,GAAIY,SAASQ,cAAc,MAC/BpB,GAAEqB,UAAY,kBACdvB,UAAUwB,WAAatB,EACvBF,UAAUG,KAAKsB,YAAYvB,GAC3BA,EAAEwB,QAAU,WACN1B,UAAU2B,SAEd3B,UAAUoB,WADVpB,UAAUC,YAIbD,UAAUmB,UAAY,WACrBS,KAAKD,UAAYC,KAAKD,SACtBC,KAAKJ,WAAWnB,MAAMwB,mBAAqB,MAAQD,KAAKD,SAAW,IAAM,MAAQ,IAGjF;IAAK,GADDG,IAAc,OAAQ,OACjBC,EAAI,EAAGA,EAAID,EAAWE,OAAQD,IAAK,CAC3C,GACIE,IADSjC,UAAUkC,GAAG,UAAYJ,EAAWC,IAC/B/B,UAAU,gBAAkB8B,EAAWC,IACrD/B,WAAUkC,GAAG,UAAYJ,EAAWC,KACvC/B,UAAU,gBAAkB8B,EAAWC,IAAM/B,UAAUkC,GAAG,UAAYJ,EAAWC,IACjF/B,UAAUkC,GAAG,UAAYJ,EAAWC,IAAM,GAEtCE,IACHjC,UAAUkC,GAAG,UAAYJ,EAAWC,IAAM/B,UAAU,gBAAkB8B,EAAWC,UAC1E/B,WAAU,gBAAkB8B,EAAWC,KAK7C/B,UAAUmC,UAAU,0BACvBnC,UAAUoC,cACVpC,UAAUmC,UAAU"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_grid_view.js b/codebase/sources/ext/dhtmlxscheduler_grid_view.js
new file mode 100644
index 0000000..d1e7c47
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_grid_view.js
@@ -0,0 +1,483 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+(function(){
+ scheduler._grid = {
+ sort_rules:{
+ "int":function(a,b, getVal){ return getVal(a)*1 < getVal(b)*1?1:-1; },
+ "str":function(a,b, getVal){ return getVal(a) < getVal(b)?1:-1; },
+ "date":function(a,b, getVal){ return new Date(getVal(a))< new Date(getVal(b))?1:-1; }
+ },
+ _getObjName:function(name){
+ return "grid_"+name;
+ },
+ _getViewName:function(objName){
+ return objName.replace(/^grid_/,'');
+ }
+ };
+}
+)();
+/*
+obj={
+ name:'grid_name'
+ fields:[
+ { id:"id", label:"Id", width:80, sort:"int/date/str", template:function(start_date, end_date, ev){ return ""}, align:"right/left/center" },
+ { id:"text", label:"Text", width:'*', css:"class_name", sort:function(a,b){ return 1 or -1}, valign:'top/bottom/middle' }
+ ...
+ ],
+ from:new Date(0),
+ to:Date:new Date(9999,1,1),
+ rowHeight:int,
+ paging:true/false,
+ select:true/false
+}
+*/
+
+
+scheduler.createGridView=function(obj){
+
+ var name = obj.name || 'grid';
+ var objName = scheduler._grid._getObjName(name);
+
+ scheduler.config[name + '_start'] = obj.from || (new Date(0));
+ scheduler.config[name + '_end'] = obj.to || (new Date(9999,1,1));
+
+ scheduler[objName] = obj;
+ scheduler[objName].defPadding = 8;
+ scheduler[objName].columns = scheduler[objName].fields;
+ scheduler[objName].unit = obj.unit || "month";
+ scheduler[objName].step = obj.step || 1;
+ delete scheduler[objName].fields;
+ function isValidSize(size){
+ return !(size !== undefined && (size*1 != size || size < 0));
+ }
+
+ var cols = scheduler[objName].columns;
+ for(var i=0; i < cols.length; i++){
+ if(isValidSize(cols[i].width))
+ cols[i].initialWidth = cols[i].width;
+ if(!isValidSize(cols[i].paddingLeft))
+ delete cols[i].paddingLeft;
+ if(!isValidSize(cols[i].paddingRight))
+ delete cols[i].paddingRight;
+ }
+
+ scheduler[objName].select = obj.select === undefined ? true : obj.select;
+ if(scheduler.locale.labels[name +'_tab'] === undefined)
+ scheduler.locale.labels[name +'_tab'] = scheduler[objName].label || scheduler.locale.labels.grid_tab;
+
+ scheduler[objName]._selected_divs = [];
+
+ scheduler.date[name+'_start']=function(d){
+ if(scheduler.date[obj.unit+'_start'])
+ return scheduler.date[obj.unit+'_start'](d);
+ else
+ return (d);
+ };
+ scheduler.date['add_' + name] = function(date, inc){
+ return scheduler.date.add(date, inc*scheduler[objName].step, scheduler[objName].unit);
+ };
+
+ scheduler.templates[name+"_date"] = function(start, end){
+ return scheduler.templates.day_date(start)+" - "+scheduler.templates.day_date(end);
+ };
+ scheduler.templates[name + '_full_date'] = function(start,end,ev){
+ if (scheduler.isOneDayEvent(ev))
+ return this[name + '_single_date'](start);
+ else
+ return scheduler.templates.day_date(start)+" &ndash; "+scheduler.templates.day_date(end);
+ };
+ scheduler.templates[name + '_single_date'] = function(date){
+ return scheduler.templates.day_date(date)+" "+this.event_date(date);
+ };
+ scheduler.templates[name + '_field'] = function(field_name, event){
+ return event[field_name];
+ };
+
+ scheduler.attachEvent("onTemplatesReady",function(){
+
+ scheduler.attachEvent("onDblClick",function(event_id, native_event_object){
+ if(this._mode == name){
+ scheduler._click.buttons['details'](event_id);
+ return false;
+ }
+ return true;
+ });
+
+ scheduler.attachEvent("onClick",function(event_id, native_event_object){
+ if(this._mode == name && scheduler[objName].select ){
+ scheduler._grid.unselectEvent('', name);
+ scheduler._grid.selectEvent(event_id, name, native_event_object);
+ return false;
+ }
+ return true;
+ });
+
+ scheduler.attachEvent("onSchedulerResize", function() {
+ if (this._mode == name) {
+ this[name + '_view'](true);
+ // timeout used to run code after all onSchedulerResize handlers are finished
+ window.setTimeout(function(){
+ // we need to call event manually because handler return false, and blocks default logic
+ scheduler.callEvent("onAfterSchedulerResize", []);
+ },1);
+ return false;
+ }
+ return true;
+ });
+
+
+ var old = scheduler.render_data;
+ scheduler.render_data=function(evs){
+ if (this._mode == name)
+ scheduler._grid._fill_grid_tab(objName);
+ else
+ return old.apply(this,arguments);
+ };
+
+ var old_render_view_data = scheduler.render_view_data;
+ scheduler.render_view_data=function(){
+ if(this._mode == name) {
+ scheduler._grid._gridScrollTop = scheduler._els["dhx_cal_data"][0].childNodes[0].scrollTop;
+ scheduler._els["dhx_cal_data"][0].childNodes[0].scrollTop = 0;
+ scheduler._els["dhx_cal_data"][0].style.overflowY = 'auto';
+ }
+ else {
+ scheduler._els["dhx_cal_data"][0].style.overflowY = 'auto';
+ }
+ return old_render_view_data.apply(this,arguments);
+ };
+});
+
+
+ scheduler[name+'_view']=function(mode){
+ if (mode){
+ var min = null,
+ max = null;
+ var view = scheduler[objName];
+ if(view.paging){
+ min = scheduler.date[name+'_start'](new Date(scheduler._date));
+ max = scheduler.date['add_'+name](min, 1);
+ }else{
+ min = scheduler.config[name + '_start'];
+ max = scheduler.config[name + '_end'];
+ }
+
+ scheduler._min_date = min;
+ scheduler._max_date = max;
+
+ scheduler._grid.set_full_view(objName);
+
+ var header = "";
+ if(+min > +new Date(0) && +max < +(new Date(9999,1,1)))
+ header = scheduler.templates[name+"_date"](min, max);
+
+ scheduler._els["dhx_cal_date"][0].innerHTML = header;
+
+ //grid tab activated
+ scheduler._gridView = objName;
+ } else {
+ scheduler._grid._sort_marker = null;
+ delete scheduler._gridView;
+ scheduler._rendered=[];
+ scheduler[objName]._selected_divs = [];
+ //grid tab de-activated
+ }
+ };
+
+
+};
+
+
+scheduler.dblclick_dhx_grid_area=function(){
+ if (!this.config.readonly && this.config.dblclick_create)
+ this.addEventNow();
+};
+
+if(scheduler._click.dhx_cal_header){
+ scheduler._old_header_click = scheduler._click.dhx_cal_header;
+}
+scheduler._click.dhx_cal_header=function(e){
+ if(scheduler._gridView){
+ var event = e||window.event;
+ var params = scheduler._grid.get_sort_params(event, scheduler._gridView);
+
+ scheduler._grid.draw_sort_marker(event.originalTarget || event.srcElement, params.dir);
+
+ scheduler.clear_view();
+ scheduler._grid._fill_grid_tab(scheduler._gridView, params);
+ }
+ else if(scheduler._old_header_click)
+ return scheduler._old_header_click.apply(this,arguments);
+};
+
+scheduler._grid.selectEvent = function(id, view_name, native_event_object){
+ if(scheduler.callEvent("onBeforeRowSelect",[id,native_event_object])){
+ var objName = scheduler._grid._getObjName(view_name);
+
+ scheduler.for_rendered(id, function(event_div){
+ event_div.className += " dhx_grid_event_selected";
+ scheduler[objName]._selected_divs.push(event_div);
+ });
+ scheduler._select_id = id;
+ }
+};
+
+scheduler._grid._unselectDiv= function(div){
+ div.className = div.className.replace(/ dhx_grid_event_selected/,'');
+};
+scheduler._grid.unselectEvent = function(id, view_name){
+ var objName = scheduler._grid._getObjName(view_name);
+ if(!objName || !scheduler[objName]._selected_divs)
+ return;
+
+ if(!id){
+ for(var i=0; i<scheduler[objName]._selected_divs.length; i++)
+ scheduler._grid._unselectDiv(scheduler[objName]._selected_divs[i]);
+
+ scheduler[objName]._selected_divs = [];
+
+ }else{
+ for(var i=0; i<scheduler[objName]._selected_divs.length; i++)
+ if(scheduler[objName]._selected_divs[i].getAttribute('event_id') == id){
+ scheduler._grid._unselectDiv(scheduler[objName]._selected_divs[i]);
+ scheduler[objName]._selected_divs.slice(i,1);
+ break;
+ }
+
+ }
+};
+
+scheduler._grid.get_sort_params = function(event, objName){
+ var targ = event.originalTarget || event.srcElement;
+ var direction = "desc";
+ if(targ.className == 'dhx_grid_view_sort')
+ targ = targ.parentNode;
+ if(!targ.className || targ.className.indexOf("dhx_grid_sort_asc") == -1)
+ direction = 'asc';
+
+ var index = 0;
+ for(var i =0; i < targ.parentNode.childNodes.length; i++){
+ if(targ.parentNode.childNodes[i] == targ){
+ index = i;
+ break;
+ }
+ }
+
+ var value = null;
+ if(scheduler[objName].columns[index].template){
+ var template = scheduler[objName].columns[index].template;
+ value = function(ev){
+ return template(ev.start_date, ev.end_date, ev);
+ };
+ }else{
+ var field = scheduler[objName].columns[index].id;
+ if(field == "date")
+ field = "start_date";
+ value = function(ev){ return ev[field]; };
+ }
+
+ var rule = scheduler[objName].columns[index].sort;
+
+ if(typeof rule != 'function'){
+ rule = scheduler._grid.sort_rules[rule] || scheduler._grid.sort_rules['str'];
+ }
+
+ return {dir:direction, value:value, rule:rule};
+};
+
+scheduler._grid.draw_sort_marker = function(node, direction){
+ if(node.className == 'dhx_grid_view_sort')
+ node = node.parentNode;
+
+ if(scheduler._grid._sort_marker){
+ scheduler._grid._sort_marker.className = scheduler._grid._sort_marker.className.replace(/( )?dhx_grid_sort_(asc|desc)/, '');
+ scheduler._grid._sort_marker.removeChild(scheduler._grid._sort_marker.lastChild);
+ }
+
+ node.className += " dhx_grid_sort_"+direction;
+ scheduler._grid._sort_marker = node;
+ var html = "<div class='dhx_grid_view_sort' style='left:"+(+node.style.width.replace('px','') -15+node.offsetLeft)+"px'>&nbsp;</div>";
+ node.innerHTML += html;
+
+};
+
+scheduler._grid.sort_grid=function(sort){
+
+ var sort = sort || {dir:'desc', value:function(ev){return ev.start_date;}, rule:scheduler._grid.sort_rules['date']};
+
+ var events = scheduler.get_visible_events();
+
+ if(sort.dir == 'desc')
+ events.sort(function(a,b){return sort.rule(a,b,sort.value);});
+ else
+ events.sort(function(a,b){return -sort.rule(a,b, sort.value);});
+ return events;
+};
+
+
+
+scheduler._grid.set_full_view = function(mode){
+ if (mode){
+ var l = scheduler.locale.labels;
+ var html =scheduler._grid._print_grid_header(mode);
+
+ scheduler._els["dhx_cal_header"][0].innerHTML= html;
+ scheduler._table_view=true;
+ scheduler.set_sizes();
+ }
+};
+scheduler._grid._calcPadding = function(column, parent){
+ var padding = (column.paddingLeft !== undefined ? 1*column.paddingLeft : scheduler[parent].defPadding) +
+ (column.paddingRight !== undefined ? 1*column.paddingRight : scheduler[parent].defPadding);
+ return padding;
+};
+
+scheduler._grid._getStyles = function(column, items){
+ var cell_style = [], style = "";
+ for(var i=0; items[i]; i++ ){
+ style = items[i] + ":";
+ switch (items[i]){
+ case "text-align":
+ if(column.align)
+ cell_style.push(style+column.align);
+ break;
+ case "vertical-align":
+ if(column.valign)
+ cell_style.push(style+column.valign);
+ break;
+ case "padding-left":
+ if(column.paddingLeft !== undefined)
+ cell_style.push(style+(column.paddingLeft||'0') + "px");
+ break;
+ case "padding-right":
+ if(column.paddingRight !== undefined)
+ cell_style.push(style+(column.paddingRight||'0') + "px");
+ break;
+ }
+ }
+ return cell_style;
+};
+
+scheduler._grid._fill_grid_tab = function(objName, sort){
+ //get current date
+ var date = scheduler._date;
+ //select events for which data need to be printed
+ var events = scheduler._grid.sort_grid(sort);
+
+ //generate html for the view
+ var columns = scheduler[objName].columns;
+
+ var html = "<div>";
+ var left = -2;//column borders at the same pos as header borders...
+ for(var i=0; i < columns.length; i++){
+ var padding = scheduler._grid._calcPadding(columns[i], objName);
+ left +=columns[i].width + padding ;//
+ if(i < columns.length - 1)
+ html += "<div class='dhx_grid_v_border' style='left:"+(left)+"px'></div>";
+ }
+ html += "</div>";
+ html +="<div class='dhx_grid_area'><table>";
+
+ for (var i=0; i<events.length; i++){
+ html += scheduler._grid._print_event_row(events[i], objName);
+ }
+
+ html +="</table></div>";
+ //render html
+ scheduler._els["dhx_cal_data"][0].innerHTML = html;
+ scheduler._els["dhx_cal_data"][0].scrollTop = scheduler._grid._gridScrollTop||0;
+
+ var t=scheduler._els["dhx_cal_data"][0].getElementsByTagName("tr");
+
+ scheduler._rendered=[];
+ for (var i=0; i < t.length; i++){
+ scheduler._rendered[i]=t[i];
+ }
+
+};
+scheduler._grid._print_event_row = function(ev, objName){
+
+ var styles = [];
+ if(ev.color)
+ styles.push("background:"+ev.color);
+ if(ev.textColor)
+ styles.push("color:"+ev.textColor);
+ if(ev._text_style)
+ styles.push(ev._text_style);
+ if(scheduler[objName]['rowHeight'])
+ styles.push('height:'+scheduler[objName]['rowHeight'] + 'px');
+
+ var style = "";
+ if(styles.length){
+ style = "style='"+styles.join(";")+"'";
+ }
+
+ var columns = scheduler[objName].columns;
+ var ev_class = scheduler.templates.event_class(ev.start_date, ev.end_date, ev);
+
+ var html ="<tr class='dhx_grid_event"+(ev_class? ' '+ev_class:'')+"' event_id='"+ev.id+"' " + style + ">";
+
+ var name = scheduler._grid._getViewName(objName);
+ var availStyles = ["text-align", "vertical-align", "padding-left","padding-right"];
+ for(var i =0; i < columns.length; i++){
+ var value;
+ if(columns[i].template){
+ value = columns[i].template(ev.start_date, ev.end_date, ev);
+ }else if(columns[i].id == 'date') {
+ value = scheduler.templates[name + '_full_date'](ev.start_date, ev.end_date, ev);
+ }else if(columns[i].id == 'start_date' || columns[i].id == 'end_date' ){
+ value = scheduler.templates[name + '_single_date'](ev[columns[i].id]);
+ }else{
+ value = scheduler.templates[name + '_field'](columns[i].id, ev);
+ }
+
+ var cell_style = scheduler._grid._getStyles(columns[i], availStyles);
+
+ var className = columns[i].css ? (" class=\""+columns[i].css+"\"") : "";
+
+ html+= "<td style='width:"+ (columns[i].width )+"px;"+cell_style.join(";")+"' "+className+">"+value+"</td>";
+
+ }
+ html+="<td class='dhx_grid_dummy'></td></tr>";
+
+ return html;
+};
+
+scheduler._grid._print_grid_header = function(objName){
+ var head = "<div class='dhx_grid_line'>";
+
+ var columns = scheduler[objName].columns;
+ var widths = [];
+
+ var unsized_columns = columns.length;
+ var avail_width = scheduler._obj.clientWidth - 2*columns.length -20;//-20 for possible scrollbar, -length for borders
+ for(var ind=0; ind < columns.length; ind++){
+
+ var val = columns[ind].initialWidth*1;
+ if(!isNaN(val) && columns[ind].initialWidth !== '' && columns[ind].initialWidth !== null && typeof columns[ind].initialWidth != 'boolean'){
+
+ unsized_columns--;
+ avail_width -= val;
+ widths[ind] = val;
+ }else {
+ widths[ind] = null;
+ }
+ }
+
+ var unsized_width = Math.floor(avail_width / unsized_columns);
+ var availStyles = ["text-align", "padding-left","padding-right"];
+ for(var i=0; i < columns.length; i++){
+ var column_width = !widths[i] ? unsized_width : widths[i];
+ columns[i].width = column_width - scheduler._grid._calcPadding(columns[i], objName);
+ var cell_style = scheduler._grid._getStyles(columns[i], availStyles);
+ head += "<div style='width:"+(columns[i].width -1)+"px;"+cell_style.join(";")+"'>" + (columns[i].label === undefined ? columns[i].id : columns[i].label) + "</div>";
+ }
+ head +="</div>";
+
+ return head;
+};
diff --git a/codebase/sources/ext/dhtmlxscheduler_grid_view.js.map b/codebase/sources/ext/dhtmlxscheduler_grid_view.js.map
new file mode 100644
index 0000000..f0f702b
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_grid_view.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_grid_view.js.map","sources":["dhtmlxscheduler_grid_view.js"],"names":["scheduler","_grid","sort_rules","int","a","b","getVal","str","date","Date","_getObjName","name","_getViewName","objName","replace","createGridView","obj","isValidSize","size","undefined","config","from","to","defPadding","columns","fields","unit","step","cols","i","length","width","initialWidth","paddingLeft","paddingRight","select","locale","labels","label","grid_tab","_selected_divs","d","inc","add","templates","start","end","day_date","ev","isOneDayEvent","this","event_date","field_name","event","attachEvent","event_id","_mode","_click","buttons","native_event_object","unselectEvent","selectEvent","window","setTimeout","callEvent","old","render_data","apply","arguments","_fill_grid_tab","old_render_view_data","render_view_data","_gridScrollTop","_els","childNodes","scrollTop","style","overflowY","mode","min","max","view","paging","_date","_min_date","_max_date","set_full_view","header","innerHTML","_gridView","_sort_marker","_rendered","dblclick_dhx_grid_area","readonly","dblclick_create","addEventNow","dhx_cal_header","_old_header_click","e","params","get_sort_params","draw_sort_marker","originalTarget","srcElement","dir","clear_view","id","view_name","for_rendered","event_div","className","push","_select_id","_unselectDiv","div","getAttribute","slice","targ","direction","parentNode","indexOf","index","value","template","start_date","end_date","field","rule","sort","node","removeChild","lastChild","html","offsetLeft","sort_grid","events","get_visible_events","_print_grid_header","_table_view","set_sizes","_calcPadding","column","parent","padding","_getStyles","items","cell_style","align","valign","left","_print_event_row","t","getElementsByTagName","styles","color","textColor","_text_style","join","ev_class","event_class","availStyles","css","head","widths","unsized_columns","avail_width","_obj","clientWidth","ind","val","isNaN","unsized_width","Math","floor","column_width"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_html_templates.js b/codebase/sources/ext/dhtmlxscheduler_html_templates.js
new file mode 100644
index 0000000..713c6d4
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_html_templates.js
@@ -0,0 +1,22 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.attachEvent("onTemplatesReady",function(){
+ var els = document.body.getElementsByTagName("DIV");
+ for (var i=0; i < els.length; i++) {
+ var cs = els[i].className||"";
+ cs = cs.split(":");
+ if (cs.length == 2 && cs[0] == "template"){
+ var code = "return \""+(els[i].innerHTML||"").replace(/\"/g,"\\\"").replace(/[\n\r]+/g,"")+"\";";
+ code = unescape(code).replace(/\{event\.([a-z]+)\}/g,function(all,mask){
+ return '"+ev.'+mask+'+"';
+ });
+ scheduler.templates[cs[1]]=Function("start","end","ev",code);
+ els[i].style.display='none';
+ }
+ }
+}); \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_html_templates.js.map b/codebase/sources/ext/dhtmlxscheduler_html_templates.js.map
new file mode 100644
index 0000000..e10ce27
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_html_templates.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_html_templates.js.map","sources":["dhtmlxscheduler_html_templates.js"],"names":["scheduler","attachEvent","els","document","body","getElementsByTagName","i","length","cs","className","split","code","innerHTML","replace","unescape","all","mask","templates","Function","style","display"],"mappings":"AAAAA,UAAUC,YAAY,mBAAmB,WAExC,IAAK,GADDC,GAAMC,SAASC,KAAKC,qBAAqB,OACpCC,EAAE,EAAGA,EAAIJ,EAAIK,OAAQD,IAAK,CAClC,GAAIE,GAAKN,EAAII,GAAGG,WAAW,EAE3B,IADAD,EAAKA,EAAGE,MAAM,KACG,GAAbF,EAAGD,QAAwB,YAATC,EAAG,GAAiB,CACzC,GAAIG,GAAO,YAAaT,EAAII,GAAGM,WAAW,IAAIC,QAAQ,MAAM,OAAQA,QAAQ,WAAW,IAAI,IAC3FF,GAAOG,SAASH,GAAME,QAAQ,uBAAuB,SAASE,EAAIC,GACjE,MAAO,QAAQA,EAAK,OAErBhB,UAAUiB,UAAUT,EAAG,IAAIU,SAAS,QAAQ,MAAM,KAAKP,GACvDT,EAAII,GAAGa,MAAMC,QAAQ"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_key_nav.js b/codebase/sources/ext/dhtmlxscheduler_key_nav.js
new file mode 100644
index 0000000..33fb417
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_key_nav.js
@@ -0,0 +1,115 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+//Initial idea and implementation by Steve MC
+scheduler._temp_key_scope = function (){
+
+scheduler.config.key_nav = true;
+
+var date; // used for copy and paste operations
+var section; // used for copy and paste operations
+var isCopy = null;
+
+
+scheduler.attachEvent("onMouseMove", function(id,e){
+ date = scheduler.getActionData(e).date;
+ section = scheduler.getActionData(e).section;
+});
+
+function clear_event_after(ev){
+ delete ev.rec_type; delete ev.rec_pattern;
+ delete ev.event_pid; delete ev.event_length;
+}
+scheduler._make_pasted_event = function(ev){
+ var event_duration = ev.end_date-ev.start_date;
+
+ var copy = scheduler._lame_copy({}, ev);
+ clear_event_after(copy);
+ copy.start_date = new Date(date);
+ copy.end_date = new Date(copy.start_date.valueOf() + event_duration);
+
+ if(section){
+ var state = scheduler.getState().mode,
+ property = null;
+
+ if(scheduler.matrix[state]){
+ property = scheduler.matrix[state].y_property;
+ }else if(scheduler._props[state]){
+ property = scheduler._props[state].property;
+ }
+ copy[property] = section;
+ }
+ return copy;
+};
+scheduler._do_paste = function(is_copy, modified_ev, original_ev){
+ scheduler.addEvent(modified_ev);
+ scheduler.callEvent("onEventPasted", [is_copy, modified_ev, original_ev]);
+};
+
+scheduler._is_key_nav_active = function(){
+ if(this._is_initialized() && !this._is_lightbox_open() && this.config.key_nav){
+ return true;
+ }
+ return false;
+};
+
+dhtmlxEvent(document,(_isOpera?"keypress":"keydown"),function(e){
+ if(!scheduler._is_key_nav_active()) return true;
+
+ e=e||event;
+
+ if (e.keyCode == 37 || e.keyCode == 39) { // Left, Right arrows
+ e.cancelBubble = true;
+
+ var next = scheduler.date.add(scheduler._date,(e.keyCode == 37 ? -1 : 1 ),scheduler._mode);
+ scheduler.setCurrentView(next);
+ return true;
+ }
+
+ var select_id = scheduler._select_id;
+ if (e.ctrlKey && e.keyCode == 67) { // CTRL+C
+ if (select_id) {
+ scheduler._buffer_id = select_id;
+ isCopy = true;
+ scheduler.callEvent("onEventCopied", [scheduler.getEvent(select_id)]);
+ }
+ return true;
+ }
+ if (e.ctrlKey && e.keyCode == 88) { // CTRL+X
+ if (select_id) {
+ isCopy = false;
+ scheduler._buffer_id = select_id;
+ var ev = scheduler.getEvent(select_id);
+ scheduler.updateEvent(ev.id);
+ scheduler.callEvent("onEventCut", [ev]);
+ }
+ }
+
+ if (e.ctrlKey && e.keyCode == 86) { // CTRL+V
+ var ev = scheduler.getEvent(scheduler._buffer_id);
+ if (ev) {
+ var new_ev = scheduler._make_pasted_event(ev);
+ if (isCopy) {
+ new_ev.id = scheduler.uid();
+ scheduler._do_paste(isCopy, new_ev, ev);
+ }
+ else { // cut operation
+ var res = scheduler.callEvent("onBeforeEventChanged",[new_ev, e, false, ev]);
+ if (res) {
+ scheduler._do_paste(isCopy, new_ev, ev);
+ isCopy = true; // switch to copy after first paste operation
+ }
+ }
+
+ }
+ return true;
+ }
+
+});
+
+};
+scheduler._temp_key_scope();
diff --git a/codebase/sources/ext/dhtmlxscheduler_key_nav.js.map b/codebase/sources/ext/dhtmlxscheduler_key_nav.js.map
new file mode 100644
index 0000000..4aa116c
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_key_nav.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_key_nav.js.map","sources":["dhtmlxscheduler_key_nav.js"],"names":["scheduler","_temp_key_scope","clear_event_after","ev","rec_type","rec_pattern","event_pid","event_length","config","key_nav","date","section","isCopy","attachEvent","id","e","getActionData","_make_pasted_event","event_duration","end_date","start_date","copy","_lame_copy","Date","valueOf","state","getState","mode","property","matrix","y_property","_props","_do_paste","is_copy","modified_ev","original_ev","addEvent","callEvent","_is_key_nav_active","this","_is_initialized","_is_lightbox_open","dhtmlxEvent","document","_isOpera","event","keyCode","cancelBubble","next","add","_date","_mode","setCurrentView","select_id","_select_id","ctrlKey","_buffer_id","getEvent","updateEvent","new_ev","uid","res"],"mappings":"AACAA,UAAUC,gBAAkB,WAc5B,QAASC,GAAkBC,SACnBA,GAAGC,eAAiBD,GAAGE,kBACvBF,GAAGG,gBAAkBH,GAAGI,aAdhCP,UAAUQ,OAAOC,SAAU,CAE3B,IAAIC,GACAC,EACAC,EAAS,IAGbZ,WAAUa,YAAY,cAAe,SAASC,EAAGC,GAChDL,EAAOV,UAAUgB,cAAcD,GAAGL,KAClCC,EAAUX,UAAUgB,cAAcD,GAAGJ,UAOtCX,UAAUiB,mBAAqB,SAASd,GACvC,GAAIe,GAAiBf,EAAGgB,SAAShB,EAAGiB,WAEhCC,EAAOrB,UAAUsB,cAAenB,EAKpC,IAJAD,EAAkBmB,GAClBA,EAAKD,WAAa,GAAIG,MAAKb,GAC3BW,EAAKF,SAAW,GAAII,MAAKF,EAAKD,WAAWI,UAAYN,GAElDP,EAAQ,CACV,GAAIc,GAAQzB,UAAU0B,WAAWC,KAChCC,EAAW,IAET5B;UAAU6B,OAAOJ,GACnBG,EAAW5B,UAAU6B,OAAOJ,GAAOK,WAC3B9B,UAAU+B,OAAON,KACzBG,EAAW5B,UAAU+B,OAAON,GAAOG,UAEpCP,EAAKO,GAAYjB,EAElB,MAAOU,IAERrB,UAAUgC,UAAY,SAASC,EAASC,EAAaC,GACpDnC,UAAUoC,SAASF,GACnBlC,UAAUqC,UAAU,iBAAkBJ,EAASC,EAAaC,KAG7DnC,UAAUsC,mBAAqB,WAC9B,MAAGC,MAAKC,oBAAsBD,KAAKE,qBAAuBF,KAAK/B,OAAOC,SAC9D,GAED,GAGRiC,YAAYC,SAAUC,SAAS,WAAW,UAAW,SAAS7B,GAC7D,IAAIf,UAAUsC,qBAAsB,OAAO,CAI3C,IAFAvB,EAAEA,GAAG8B,MAEY,IAAb9B,EAAE+B,SAA8B,IAAb/B,EAAE+B,QAAe,CACvC/B,EAAEgC,cAAe,CAEjB;GAAIC,GAAOhD,UAAUU,KAAKuC,IAAIjD,UAAUkD,MAAoB,IAAbnC,EAAE+B,QAAgB,GAAK,EAAI9C,UAAUmD,MAEpF,OADAnD,WAAUoD,eAAeJ,IAClB,EAGR,GAAIK,GAAYrD,UAAUsD,UAC1B,IAAIvC,EAAEwC,SAAwB,IAAbxC,EAAE+B,QAMlB,MALIO,KACHrD,UAAUwD,WAAaH,EACvBzC,GAAS,EACTZ,UAAUqC,UAAU,iBAAkBrC,UAAUyD,SAASJ,OAEnD,CAER,IAAItC,EAAEwC,SAAwB,IAAbxC,EAAE+B,SACdO,EAAW,CACdzC,GAAS,EACTZ,UAAUwD,WAAaH,CACvB,IAAIlD,GAAKH,UAAUyD,SAASJ,EAC5BrD,WAAU0D,YAAYvD,EAAGW,IACzBd,UAAUqC,UAAU,cAAelC,IAIrC,GAAIY,EAAEwC,SAAwB,IAAbxC,EAAE+B,QAAe,CACjC,GAAI3C,GAAKH,UAAUyD,SAASzD,UAAUwD,WACtC;GAAIrD,EAAI,CACP,GAAIwD,GAAS3D,UAAUiB,mBAAmBd,EAC1C,IAAIS,EACH+C,EAAO7C,GAAKd,UAAU4D,MACtB5D,UAAUgC,UAAUpB,EAAQ+C,EAAQxD,OAEhC,CACJ,GAAI0D,GAAM7D,UAAUqC,UAAU,wBAAwBsB,EAAQ5C,GAAG,EAAOZ,GACpE0D,KACH7D,UAAUgC,UAAUpB,EAAQ+C,EAAQxD,GACpCS,GAAS,IAKZ,OAAO,MAMTZ,UAAUC"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_layer.js b/codebase/sources/ext/dhtmlxscheduler_layer.js
new file mode 100644
index 0000000..dcaa362
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_layer.js
@@ -0,0 +1,407 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.attachEvent("onTemplatesReady",function(){
+
+ this.layers.sort(function(a, b){
+ return a.zIndex - b.zIndex;
+ });
+
+ scheduler._dp_init=function(dp){
+ dp._methods=["_set_event_text_style","","changeEventId","deleteEvent"];
+
+ this.attachEvent("onEventAdded",function(id){
+ if (!this._loading && this.validId(id) && this.getEvent(id) && this.getEvent(id).layer == dp.layer)
+ dp.setUpdated(id,true,"inserted");
+ });
+ this.attachEvent("onBeforeEventDelete",function(id){
+ if(this.getEvent(id) && this.getEvent(id).layer == dp.layer) {
+ if (!this.validId(id)) return;
+ var z=dp.getState(id);
+
+ if (z=="inserted" || this._new_event) { dp.setUpdated(id,false); return true; }
+ if (z=="deleted") return false;
+ if (z=="true_deleted") return true;
+
+ dp.setUpdated(id,true,"deleted");
+ return false;
+ }
+ else return true;
+ });
+ this.attachEvent("onEventChanged",function(id){
+ if (!this._loading && this.validId(id) && this.getEvent(id) && this.getEvent(id).layer == dp.layer)
+ dp.setUpdated(id,true,"updated");
+ });
+
+ dp._getRowData=function(id,pref){
+ var ev=this.obj.getEvent(id);
+ var data = {};
+
+ for (var a in ev){
+ if (a.indexOf("_")===0) continue;
+ if (ev[a] && ev[a].getUTCFullYear) //not very good, but will work
+ data[a] = this.obj.templates.xml_format(ev[a]);
+ else
+ data[a] = ev[a];
+ }
+ return data;
+ };
+ dp._clearUpdateFlag=function(){};
+
+ dp.attachEvent("insertCallback", scheduler._update_callback);
+ dp.attachEvent("updateCallback", scheduler._update_callback);
+ dp.attachEvent("deleteCallback", function(upd, id) {
+ this.obj.setUserData(id, this.action_param, "true_deleted");
+ this.obj.deleteEvent(id);
+ });
+ };
+
+ (function() {
+ var _cloneObj = function(obj){
+ if(obj === null || typeof(obj) != 'object')
+ return obj;
+ var temp = new obj.constructor();
+ for(var key in obj)
+ temp[key] = _cloneObj(obj[key]);
+ return temp;
+ };
+
+ scheduler._dataprocessors = [];
+ scheduler._layers_zindex = {};
+ for(var i=0; i<scheduler.layers.length; i++) {
+ scheduler.config['lightbox_'+scheduler.layers[i].name] = { };
+ scheduler.config['lightbox_'+scheduler.layers[i].name].sections = _cloneObj(scheduler.config.lightbox.sections);
+ scheduler._layers_zindex[scheduler.layers[i].name] = scheduler.config.inital_layer_zindex||5 + i*3;
+ if(scheduler.layers[i].url) {
+ var dp = new dataProcessor(scheduler.layers[i].url);
+ dp.layer = scheduler.layers[i].name;
+ scheduler._dataprocessors.push(dp);
+ scheduler._dataprocessors[i].init(scheduler);
+ }
+ if(scheduler.layers[i].isDefault)
+ scheduler.defaultLayer = scheduler.layers[i].name;
+ }
+ })();
+
+
+ scheduler.showLayer = function(tlayer) {
+ this.toggleLayer(tlayer, true);
+ };
+
+ scheduler.hideLayer = function(tlayer) {
+ this.toggleLayer(tlayer, false);
+ };
+
+ scheduler.toggleLayer = function(tlayer, visible) { // visible is optional
+ var layer = this.getLayer(tlayer);
+
+ if(typeof visible != 'undefined')
+ layer.visible = !!visible;
+ else
+ layer.visible = !layer.visible;
+
+ this.setCurrentView(this._date, this._mode);
+ };
+
+ scheduler.getLayer = function(tlayer) { // either string with layer name or event with layer property
+ var layer,
+ layer_name;
+ if(typeof tlayer == 'string')
+ layer_name = tlayer;
+ if(typeof tlayer == 'object')
+ layer_name = tlayer.layer;
+ for (var i=0; i<scheduler.layers.length; i++) {
+ if(scheduler.layers[i].name == layer_name)
+ layer = scheduler.layers[i];
+ }
+ return layer;
+ };
+
+ scheduler.attachEvent("onBeforeLightbox", function (event_id){
+ var ev = this.getEvent(event_id);
+ this.config.lightbox.sections = this.config['lightbox_'+ev.layer].sections;
+ scheduler.resetLightbox();
+ return true;
+ });
+
+ scheduler.attachEvent("onClick", function (event_id, native_event_object){
+ var ev = scheduler.getEvent(event_id);
+ return !scheduler.getLayer(ev.layer).noMenu;
+ });
+
+ scheduler.attachEvent('onEventCollision', function(ev, evs) {
+ var layer = this.getLayer(ev);
+ if(!layer.checkCollision)
+ return false;
+ var count = 0;
+ for(var i = 0; i<evs.length; i++) {
+ if(evs[i].layer == layer.name && evs[i].id != ev.id)
+ count++;
+ }
+ return (count >= scheduler.config.collision_limit);
+ });
+
+ scheduler.addEvent=function(start_date,end_date,text,id,extra_data){
+ var ev=start_date;
+ if (arguments.length!=1){
+ ev=extra_data||{};
+ ev.start_date=start_date;
+ ev.end_date=end_date;
+ ev.text=text;
+ ev.id=id;
+ ev.layer = this.defaultLayer;
+ }
+ ev.id = ev.id||scheduler.uid();
+ ev.text = ev.text||"";
+
+
+ if (typeof ev.start_date == "string") ev.start_date=this.templates.api_date(ev.start_date);
+ if (typeof ev.end_date == "string") ev.end_date=this.templates.api_date(ev.end_date);
+ ev._timed=this.isOneDayEvent(ev);
+
+ var is_new=!this._events[ev.id];
+ this._events[ev.id]=ev;
+ this.event_updated(ev);
+ if (!this._loading)
+ this.callEvent(is_new?"onEventAdded":"onEventChanged",[ev.id,ev]);
+ };
+
+ this._evs_layer = {};
+ for (var i = 0; i < this.layers.length; i++) { // array in object for each layer
+ this._evs_layer[this.layers[i].name] = [];
+ }
+
+ scheduler.addEventNow=function(start,end,e){
+ var base = {};
+ if (typeof start == "object"){
+ base = start;
+ start = null;
+ }
+
+ var d = (this.config.event_duration||this.config.time_step)*60000;
+ if (!start) start = Math.round((scheduler._currentDate()).valueOf()/d)*d;
+ var start_date = new Date(start);
+ if (!end){
+ var start_hour = this.config.first_hour;
+ if (start_hour > start_date.getHours()){
+ start_date.setHours(start_hour);
+ start = start_date.valueOf();
+ }
+ end = start+d;
+ }
+
+
+ base.start_date = base.start_date||start_date;
+ base.end_date = base.end_date||new Date(end);
+ base.text = base.text||this.locale.labels.new_event;
+ base.id = this._drag_id = this.uid();
+ base.layer = this.defaultLayer;
+ this._drag_mode="new-size";
+
+ this._loading=true;
+ this.addEvent(base);
+ this.callEvent("onEventCreated",[this._drag_id,e]);
+ this._loading=false;
+
+ this._drag_event={}; //dummy , to trigger correct event updating logic
+ this._on_mouse_up(e);
+ };
+
+ scheduler._t_render_view_data = function(events) { // helper
+ if (this.config.multi_day && !this._table_view) {
+ var tvs = [];
+ var tvd = [];
+ for (var k = 0; k < events.length; k++) {
+ if (events[k]._timed)
+ tvs.push(events[k]);
+ else
+ tvd.push(events[k]);
+ }
+ this._table_view = true;
+ this.render_data(tvd);
+ this._table_view = false;
+ this.render_data(tvs);
+ }
+ else
+ this.render_data(events);
+ };
+
+ scheduler.render_view_data = function(){
+ if (this._not_render) {
+ this._render_wait = true;
+ return;
+ }
+ this._render_wait = false;
+
+ this.clear_view();
+
+ this._evs_layer = {};
+ for (var i = 0; i < this.layers.length; i++) { // array in object for each layer
+ this._evs_layer[this.layers[i].name] = [];
+ }
+
+ var evs = this.get_visible_events();
+ for (var i = 0; i < evs.length; i++) { // filling layer arrays with events
+ if(this._evs_layer[evs[i].layer])
+ this._evs_layer[evs[i].layer].push(evs[i]);
+ }
+
+ if(this._mode == 'month') { // old logic is used
+ var tevs = [];
+ for (var i = 0; i < this.layers.length; i++) {
+ if (this.layers[i].visible)
+ tevs = tevs.concat(this._evs_layer[this.layers[i].name]);
+ }
+ this._t_render_view_data(tevs);
+ }
+ else { // week, day; should use new logic
+ for (var i = 0; i < this.layers.length; i++) {
+ if (this.layers[i].visible) {
+ var evs_layer = this._evs_layer[this.layers[i].name];
+ this._t_render_view_data(evs_layer);
+ }
+ }
+ }
+ };
+
+ scheduler._render_v_bar=function(ev,x,y,w,h,style,contentA,contentB,bottom){
+ var id = ev.id;
+ if(contentA.indexOf('<div class=') == -1)
+ contentA = (scheduler.templates['event_header_'+ev.layer])?scheduler.templates['event_header_'+ev.layer](ev.start_date,ev.end_date,ev):contentA;
+ if(contentB.indexOf('<div class=') == -1)
+ contentB = (scheduler.templates['event_text_'+ev.layer])?scheduler.templates['event_text_'+ev.layer](ev.start_date,ev.end_date,ev):contentB;
+
+ var d=document.createElement("DIV");
+
+
+ var cs = "dhx_cal_event";
+ var cse = (scheduler.templates['event_class_'+ev.layer])?scheduler.templates['event_class_'+ev.layer](ev.start_date,ev.end_date,ev):scheduler.templates.event_class(ev.start_date,ev.end_date,ev);
+ if (cse) cs=cs+" "+cse;
+
+ var html='<div event_id="'+id+'" class="'+cs+'" style="position:absolute; top:'+y+'px; left:'+x+'px; width:'+(w-4)+'px; height:'+h+'px;'+(style||"")+'">';
+ html+='<div class="dhx_header" style=" width:'+(w-6)+'px;" >&nbsp;</div>';
+ html+='<div class="dhx_title">'+contentA+'</div>';
+ html+='<div class="dhx_body" style=" width:'+(w-(this._quirks?4:14))+'px; height:'+(h-(this._quirks?20:30))+'px;">'+contentB+'</div>';
+ html+='<div class="dhx_footer" style=" width:'+(w-8)+'px;'+(bottom?' margin-top:-1px;':'')+'" ></div></div>';
+
+ d.innerHTML=html;
+ d.style.zIndex = 100;
+ return d.firstChild;
+ };
+
+ scheduler.render_event_bar=function(ev){
+ var parent=this._els["dhx_cal_data"][0];
+
+ var x=this._colsS[ev._sday];
+ var x2=this._colsS[ev._eday];
+ if (x2==x) x2=this._colsS[ev._eday+1];
+ var hb = this.xy.bar_height;
+
+ var y=this._colsS.heights[ev._sweek]+(this._colsS.height?(this.xy.month_scale_height+2):2)+ev._sorder*hb;
+
+ var d=document.createElement("DIV");
+ var cs = ev._timed?"dhx_cal_event_clear":"dhx_cal_event_line";
+ var cse = (scheduler.templates['event_class_'+ev.layer])?scheduler.templates['event_class_'+ev.layer](ev.start_date,ev.end_date,ev):scheduler.templates.event_class(ev.start_date,ev.end_date,ev);
+ if (cse) cs=cs+" "+cse;
+
+ var html='<div event_id="'+ev.id+'" class="'+cs+'" style="position:absolute; top:'+y+'px; left:'+x+'px; width:'+(x2-x-15)+'px;'+(ev._text_style||"")+'">';
+
+ if (ev._timed)
+ html+=(scheduler.templates['event_bar_date_'+ev.layer])?scheduler.templates['event_bar_date_'+ev.layer](ev.start_date,ev.end_date,ev):scheduler.templates.event_bar_date(ev.start_date,ev.end_date,ev);
+ html+=( (scheduler.templates['event_bar_text_'+ev.layer])?scheduler.templates['event_bar_text_'+ev.layer](ev.start_date,ev.end_date,ev):scheduler.templates.event_bar_text(ev.start_date,ev.end_date,ev) + '</div>)');
+ html+='</div>';
+
+ d.innerHTML=html;
+
+ this._rendered.push(d.firstChild);
+ parent.appendChild(d.firstChild);
+ };
+
+ scheduler.render_event=function(ev){
+ var menu = scheduler.xy.menu_width;
+ if(scheduler.getLayer(ev.layer).noMenu)
+ menu = 0;
+
+ if (ev._sday<0) return; //can occur in case of recurring event during time shift
+ var parent=scheduler.locate_holder(ev._sday);
+ if (!parent) return; //attempt to render non-visible event
+ var sm = ev.start_date.getHours()*60+ev.start_date.getMinutes();
+ var em = (ev.end_date.getHours()*60+ev.end_date.getMinutes())||(scheduler.config.last_hour*60);
+
+ var top = (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)+1; //42px/hour
+ var height = Math.max(scheduler.xy.min_event_height,(em-sm)*this.config.hour_size_px/60)+1; //42px/hour
+ //var height = Math.max(25,Math.round((ev.end_date.valueOf()-ev.start_date.valueOf())*(this.config.hour_size_px+(this._quirks?1:0))/(60*60*1000))); //42px/hour
+ var width=Math.floor((parent.clientWidth-menu)/ev._count);
+ var left=ev._sorder*width+1;
+ if (!ev._inner) width=width*(ev._count-ev._sorder);
+
+
+
+ var d=this._render_v_bar(ev.id,menu+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));
+
+ this._rendered.push(d);
+ parent.appendChild(d);
+
+ left=left+parseInt(parent.style.left,10)+menu;
+
+ top+=this._dy_shift; //corrupt top, to include possible multi-day shift
+ d.style.zIndex = this._layers_zindex[ev.layer];
+
+ if (this._edit_id==ev.id){
+ d.style.zIndex = parseInt(d.style.zIndex)+1; //fix overlapping issue
+ var new_zIndex = d.style.zIndex;
+ width=Math.max(width-4,scheduler.xy.editor_width);
+ var d=document.createElement("DIV");
+ d.setAttribute("event_id",ev.id);
+ this.set_xy(d,width,height-20,left,top+14);
+ d.className="dhx_cal_editor";
+ d.style.zIndex = new_zIndex;
+ var d2=document.createElement("DIV");
+ this.set_xy(d2,width-6,height-26);
+ d2.style.cssText+=";margin:2px 2px 2px 2px;overflow:hidden;";
+
+
+ d2.style.zIndex = new_zIndex;
+ d.appendChild(d2);
+ this._els["dhx_cal_data"][0].appendChild(d);
+ this._rendered.push(d);
+
+ d2.innerHTML="<textarea class='dhx_cal_editor'>"+ev.text+"</textarea>";
+ if (this._quirks7) d2.firstChild.style.height=height-12+"px"; //IEFIX
+ this._editor=d2.firstChild;
+ this._editor.onkeypress=function(e){
+ if ((e||event).shiftKey) return true;
+ var code=(e||event).keyCode;
+ if (code==scheduler.keys.edit_save) scheduler.editStop(true);
+ if (code==scheduler.keys.edit_cancel) scheduler.editStop(false);
+ };
+ this._editor.onselectstart=function(e){ (e||event).cancelBubble=true; return true; };
+ d2.firstChild.focus();
+ //IE and opera can add x-scroll during focusing
+ this._els["dhx_cal_data"][0].scrollLeft=0;
+ d2.firstChild.select();
+ }
+ if (this._select_id==ev.id){
+ d.style.zIndex = parseInt(d.style.zIndex)+1; //fix overlapping issue
+ var icons=this.config["icons_"+((this._edit_id==ev.id)?"edit":"select")];
+ var icons_str="";
+ for (var i=0; i<icons.length; i++)
+ icons_str+="<div class='dhx_menu_icon "+icons[i]+"' title='"+this.locale.labels[icons[i]]+"'></div>";
+ var obj = this._render_v_bar(ev.id,left-menu+1,top,menu,icons.length*20+26,"","<div class='dhx_menu_head'></div>",icons_str,true);
+ obj.style.left=left-menu+1;
+ obj.style.zIndex = d.style.zIndex;
+ this._els["dhx_cal_data"][0].appendChild(obj);
+ this._rendered.push(obj);
+ }
+
+ };
+
+ scheduler.filter_agenda = function(id, event) {
+ var layer = scheduler.getLayer(event.layer);
+ return (layer && layer.visible);
+ };
+});
diff --git a/codebase/sources/ext/dhtmlxscheduler_layer.js.map b/codebase/sources/ext/dhtmlxscheduler_layer.js.map
new file mode 100644
index 0000000..0483f36
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_layer.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_layer.js.map","sources":["dhtmlxscheduler_layer.js"],"names":["scheduler","attachEvent","this","layers","sort","a","b","zIndex","_dp_init","dp","_methods","id","_loading","validId","getEvent","layer","setUpdated","z","getState","_new_event","_getRowData","ev","obj","data","indexOf","getUTCFullYear","templates","xml_format","_clearUpdateFlag","_update_callback","upd","setUserData","action_param","deleteEvent","_cloneObj","temp","constructor","key","_dataprocessors","_layers_zindex","i","length","config","name","sections","lightbox","inital_layer_zindex","url","dataProcessor","push","init","isDefault","defaultLayer","showLayer","tlayer","toggleLayer","hideLayer","visible","getLayer","setCurrentView","_date","_mode","layer_name","event_id","resetLightbox","noMenu","evs","checkCollision","count","collision_limit","addEvent","start_date","end_date","text","extra_data","arguments","uid","api_date","_timed","isOneDayEvent","is_new","_events","event_updated","callEvent","_evs_layer","addEventNow","start","end","e","base","d","event_duration","time_step","Math","round","_currentDate","valueOf","Date","start_hour","first_hour","getHours","setHours","locale","labels","new_event","_drag_id","_drag_mode","_drag_event","_on_mouse_up","_t_render_view_data","events","multi_day","_table_view","tvs","tvd","k","render_data","render_view_data","_not_render","_render_wait","clear_view","get_visible_events","tevs","concat","evs_layer","_render_v_bar","x","y","w","h","style","contentA","contentB","bottom","document","createElement","cs","cse","event_class","html","_quirks","innerHTML","firstChild","render_event_bar","parent","_els","_colsS","_sday","x2","_eday","hb","xy","bar_height","heights","_sweek","height","month_scale_height","_sorder","_text_style","event_bar_date","event_bar_text","_rendered","appendChild","render_event","menu","menu_width","locate_holder","sm","getMinutes","em","last_hour","top","hour_size_px","max","min_event_height","width","floor","clientWidth","_count","left","_inner","event_header","event_text","parseInt","_dy_shift","_edit_id","new_zIndex","editor_width","setAttribute","set_xy","className","d2","cssText","_quirks7","_editor","onkeypress","event","shiftKey","code","keyCode","keys","edit_save","editStop","edit_cancel","onselectstart","cancelBubble","focus","scrollLeft","select","_select_id","icons","icons_str","filter_agenda"],"mappings":"AAAAA,UAAUC,YAAY,mBAAmB,WAExCC,KAAKC,OAAOC,KAAK,SAASC,EAAGC,GAC5B,MAAOD,GAAEE,OAASD,EAAEC,SAGrBP,UAAUQ,SAAS,SAASC,GAC3BA,EAAGC,UAAU,wBAAwB,GAAG,gBAAgB,eAExDR,KAAKD,YAAY,eAAe,SAASU,IACnCT,KAAKU,UAAYV,KAAKW,QAAQF,IAAOT,KAAKY,SAASH,IAAOT,KAAKY,SAASH,GAAII,OAASN,EAAGM,OAC5FN,EAAGO,WAAWL,GAAG,EAAK,cAExBT,KAAKD,YAAY,sBAAsB,SAASU,GAC/C,GAAGT,KAAKY,SAASH,IAAOT,KAAKY,SAASH,GAAII,OAASN,EAAGM,MAAO,CAC5D,IAAKb,KAAKW,QAAQF,GAAK,MACrB;GAAIM,GAAER,EAAGS,SAASP,EAEpB,OAAO,YAAHM,GAAiBf,KAAKiB,YAAeV,EAAGO,WAAWL,GAAG,IAAgB,GACnE,WAAHM,GAAsB,EACnB,gBAAHA,GAA2B,GAE/BR,EAAGO,WAAWL,GAAG,EAAK,YACd,GAEJ,OAAO,IAEbT,KAAKD,YAAY,iBAAiB,SAASU,IACrCT,KAAKU,UAAYV,KAAKW,QAAQF,IAAOT,KAAKY,SAASH,IAAOT,KAAKY,SAASH,GAAII,OAASN,EAAGM,OAC5FN,EAAGO,WAAWL,GAAG,EAAK,aAGxBF,EAAGW,YAAY,SAAST,GACvB,GAAIU,GAAGnB,KAAKoB,IAAIR,SAASH,GACrBY,IAEJ,KAAK,GAAIlB,KAAKgB,GACQ,IAAjBhB,EAAEmB,QAAQ,OAEbD,EAAKlB,GADFgB,EAAGhB,IAAMgB,EAAGhB,GAAGoB,eACRvB,KAAKoB,IAAII,UAAUC,WAAWN,EAAGhB,IAEjCgB,EAAGhB,GAEf,OAAOkB,IAERd,EAAGmB,iBAAiB,aAEpBnB,EAAGR,YAAY,iBAAkBD,UAAU6B,kBAC3CpB,EAAGR,YAAY,iBAAkBD,UAAU6B,kBAC3CpB,EAAGR,YAAY,iBAAkB,SAAS6B,EAAKnB,GAC9CT,KAAKoB,IAAIS,YAAYpB,EAAIT,KAAK8B,aAAc,gBAC5C9B,KAAKoB,IAAIW,YAAYtB;IAIvB,WACO,GAAIuB,GAAY,SAASZ,GACrB,GAAW,OAARA,GAA+B,gBAAT,GACrB,MAAOA,EACX,IAAIa,GAAO,GAAIb,GAAIc,WACnB,KAAI,GAAIC,KAAOf,GACXa,EAAKE,GAAOH,EAAUZ,EAAIe,GAC9B,OAAOF,GAGjBnC,WAAUsC,mBACVtC,UAAUuC,iBACV,KAAI,GAAIC,GAAE,EAAGA,EAAExC,UAAUG,OAAOsC,OAAQD,IAAK,CAI5C,GAHAxC,UAAU0C,OAAO,YAAY1C,UAAUG,OAAOqC,GAAGG,SACxC3C,UAAU0C,OAAO,YAAY1C,UAAUG,OAAOqC,GAAGG,MAAMC,SAAWV,EAAUlC,UAAU0C,OAAOG,SAASD,UAC/G5C,UAAUuC,eAAevC,UAAUG,OAAOqC,GAAGG,MAAQ3C,UAAU0C,OAAOI,qBAAqB,EAAM,EAAFN,EAC5FxC,UAAUG,OAAOqC,GAAGO,IAAK,CAC3B,GAAItC,GAAK,GAAIuC,eAAchD,UAAUG,OAAOqC,GAAGO,IAC/CtC;EAAGM,MAAQf,UAAUG,OAAOqC,GAAGG,KAC/B3C,UAAUsC,gBAAgBW,KAAKxC,GAC/BT,UAAUsC,gBAAgBE,GAAGU,KAAKlD,WAEhCA,UAAUG,OAAOqC,GAAGW,YACtBnD,UAAUoD,aAAepD,UAAUG,OAAOqC,GAAGG,UAKhD3C,UAAUqD,UAAY,SAASC,GAC9BpD,KAAKqD,YAAYD,GAAQ,IAG1BtD,UAAUwD,UAAY,SAASF,GAC9BpD,KAAKqD,YAAYD,GAAQ,IAG1BtD,UAAUuD,YAAc,SAASD,EAAQG,GACxC,GAAI1C,GAAQb,KAAKwD,SAASJ,EAGzBvC,GAAM0C,QADc,mBAAXA,KACSA,GAED1C,EAAM0C,QAExBvD,KAAKyD,eAAezD,KAAK0D,MAAO1D,KAAK2D,QAGtC7D,UAAU0D,SAAW,SAASJ,GAC7B,GAAIvC,GACH+C,CACmB,iBAAVR,KACTQ,EAAaR,GACM,gBAAVA,KACTQ,EAAaR,EAAOvC,MACrB;IAAK,GAAIyB,GAAE,EAAGA,EAAExC,UAAUG,OAAOsC,OAAQD,IACrCxC,UAAUG,OAAOqC,GAAGG,MAAQmB,IAC9B/C,EAAQf,UAAUG,OAAOqC,GAE3B,OAAOzB,IAGRf,UAAUC,YAAY,mBAAoB,SAAU8D,GACnD,GAAI1C,GAAKnB,KAAKY,SAASiD,EAGvB,OAFM7D,MAAKwC,OAAOG,SAASD,SAAW1C,KAAKwC,OAAO,YAAYrB,EAAGN,OAAO6B,SAClE5C,UAAUgE,iBACT,IAGRhE,UAAUC,YAAY,UAAW,SAAU8D,GAC1C,GAAI1C,GAAKrB,UAAUc,SAASiD,EACtB,QAAQ/D,UAAU0D,SAASrC,EAAGN,OAAOkD,SAG5CjE,UAAUC,YAAY,mBAAoB,SAASoB,EAAI6C,GACtD,GAAInD,GAAQb,KAAKwD,SAASrC,EAC1B,KAAIN,EAAMoD,eACT,OAAO,CAER;IAAI,GADAC,GAAQ,EACJ5B,EAAI,EAAGA,EAAE0B,EAAIzB,OAAQD,IACzB0B,EAAI1B,GAAGzB,OAASA,EAAM4B,MAAQuB,EAAI1B,GAAG7B,IAAMU,EAAGV,IAChDyD,GAEF,OAAQA,IAASpE,UAAU0C,OAAO2B,kBAGnCrE,UAAUsE,SAAS,SAASC,EAAWC,EAASC,EAAK9D,EAAG+D,GACvD,GAAIrD,GAAGkD,CACe,IAAlBI,UAAUlC,SACbpB,EAAGqD,MACHrD,EAAGkD,WAAWA,EACdlD,EAAGmD,SAASA,EACZnD,EAAGoD,KAAKA,EACRpD,EAAGV,GAAGA,EACNU,EAAGN,MAAQb,KAAKkD,cAEjB/B,EAAGV,GAAKU,EAAGV,IAAIX,UAAU4E,MACzBvD,EAAGoD,KAAOpD,EAAGoD,MAAM,GAGS,gBAAjBpD,GAAGkD,aAAyBlD,EAAGkD,WAAWrE,KAAKwB,UAAUmD,SAASxD,EAAGkD,aACtD,gBAAflD,GAAGmD,WAAuBnD,EAAGmD,SAAStE,KAAKwB,UAAUmD,SAASxD,EAAGmD,WAC5EnD,EAAGyD,OAAO5E,KAAK6E,cAAc1D,EAE7B;GAAI2D,IAAQ9E,KAAK+E,QAAQ5D,EAAGV,GAC5BT,MAAK+E,QAAQ5D,EAAGV,IAAIU,EACpBnB,KAAKgF,cAAc7D,GACdnB,KAAKU,UACTV,KAAKiF,UAAUH,EAAO,eAAe,kBAAkB3D,EAAGV,GAAGU,KAG/DnB,KAAKkF,aACL,KAAK,GAAI5C,GAAI,EAAGA,EAAItC,KAAKC,OAAOsC,OAAQD,IACvCtC,KAAKkF,WAAWlF,KAAKC,OAAOqC,GAAGG,QAGhC3C,WAAUqF,YAAY,SAASC,EAAMC,EAAIC,GACxC,GAAIC,KACgB,iBAATH,KACVG,EAAOH,EACPA,EAAQ,KAGT,IAAII,GAAwD,KAAnDxF,KAAKwC,OAAOiD,gBAAgBzF,KAAKwC,OAAOkD,UAC5CN,KAAOA,EAAQO,KAAKC,MAAO9F,UAAU+F,eAAgBC,UAAUN,GAAGA,EACvE,IAAInB,GAAa,GAAI0B,MAAKX,EAC1B,KAAKC,EAAI,CACR,GAAIW,GAAahG,KAAKwC,OAAOyD,UACzBD,GAAa3B,EAAW6B,aAC3B7B,EAAW8B,SAASH,GACpBZ,EAAQf,EAAWyB,WAEpBT,EAAMD,EAAMI;CAIbD,EAAKlB,WAAakB,EAAKlB,YAAYA,EACnCkB,EAAKjB,SAAYiB,EAAKjB,UAAU,GAAIyB,MAAKV,GACzCE,EAAKhB,KAAOgB,EAAKhB,MAAMvE,KAAKoG,OAAOC,OAAOC,UAC1Cf,EAAK9E,GAAKT,KAAKuG,SAAWvG,KAAK0E,MAC/Ba,EAAK1E,MAAQb,KAAKkD,aAClBlD,KAAKwG,WAAW,WAEhBxG,KAAKU,UAAS,EACdV,KAAKoE,SAASmB,GACdvF,KAAKiF,UAAU,kBAAkBjF,KAAKuG,SAASjB,IAC/CtF,KAAKU,UAAS,EAEdV,KAAKyG,eACLzG,KAAK0G,aAAapB,IAGnBxF,UAAU6G,oBAAsB,SAASC,GACxC,GAAI5G,KAAKwC,OAAOqE,YAAc7G,KAAK8G,YAAa,CAG/C,IAAK,GAFDC,MACAC,KACKC,EAAI,EAAGA,EAAIL,EAAOrE,OAAQ0E,IAC9BL,EAAOK,GAAGrC,OACbmC,EAAIhE,KAAK6D,EAAOK,IAEhBD,EAAIjE,KAAK6D,EAAOK,GAElBjH,MAAK8G,aAAc,EACnB9G,KAAKkH,YAAYF,GACjBhH,KAAK8G,aAAc,EACnB9G,KAAKkH,YAAYH;KAGjB/G,MAAKkH,YAAYN,IAGnB9G,UAAUqH,iBAAmB,WAC5B,GAAInH,KAAKoH,YAER,YADApH,KAAKqH,cAAe,EAGrBrH,MAAKqH,cAAe,EAEpBrH,KAAKsH,aAELtH,KAAKkF,aACL,KAAK,GAAI5C,GAAI,EAAGA,EAAItC,KAAKC,OAAOsC,OAAQD,IACvCtC,KAAKkF,WAAWlF,KAAKC,OAAOqC,GAAGG,QAIhC,KAAK,GADDuB,GAAMhE,KAAKuH,qBACNjF,EAAI,EAAGA,EAAI0B,EAAIzB,OAAQD,IAC5BtC,KAAKkF,WAAWlB,EAAI1B,GAAGzB,QACzBb,KAAKkF,WAAWlB,EAAI1B,GAAGzB,OAAOkC,KAAKiB,EAAI1B,GAGzC,IAAiB,SAAdtC,KAAK2D,MAAkB,CAEzB,IAAK,GADD6D,MACKlF,EAAI,EAAGA,EAAItC,KAAKC,OAAOsC,OAAQD,IACnCtC,KAAKC,OAAOqC,GAAGiB,UAClBiE,EAAOA,EAAKC,OAAOzH,KAAKkF,WAAWlF,KAAKC,OAAOqC,GAAGG,OAEpDzC;KAAK2G,oBAAoBa,OAGzB,KAAK,GAAIlF,GAAI,EAAGA,EAAItC,KAAKC,OAAOsC,OAAQD,IACvC,GAAItC,KAAKC,OAAOqC,GAAGiB,QAAS,CAC3B,GAAImE,GAAY1H,KAAKkF,WAAWlF,KAAKC,OAAOqC,GAAGG,KAC/CzC,MAAK2G,oBAAoBe,KAM7B5H,UAAU6H,cAAc,SAASxG,EAAGyG,EAAEC,EAAEC,EAAEC,EAAEC,EAAMC,EAASC,EAASC,GACnE,GAAI1H,GAAKU,EAAGV,EAC0B,KAAnCwH,EAAS3G,QAAQ,iBACnB2G,EAAYnI,UAAU0B,UAAU,gBAAgBL,EAAGN,OAAQf,UAAU0B,UAAU,gBAAgBL,EAAGN,OAAOM,EAAGkD,WAAWlD,EAAGmD,SAASnD,GAAI8G,GAClG,IAAnCC,EAAS5G,QAAQ,iBACpB4G,EAAYpI,UAAU0B,UAAU,cAAcL,EAAGN,OAAQf,UAAU0B,UAAU,cAAcL,EAAGN,OAAOM,EAAGkD,WAAWlD,EAAGmD,SAASnD,GAAI+G,EAEnI;GAAI1C,GAAE4C,SAASC,cAAc,OAGzBC,EAAK,gBACLC,EAAOzI,UAAU0B,UAAU,eAAeL,EAAGN,OAAQf,UAAU0B,UAAU,eAAeL,EAAGN,OAAOM,EAAGkD,WAAWlD,EAAGmD,SAASnD,GAAIrB,UAAU0B,UAAUgH,YAAYrH,EAAGkD,WAAWlD,EAAGmD,SAASnD,EAC1LoH,KAAKD,EAAGA,EAAG,IAAIC,EAEnB,IAAIE,GAAK,kBAAkBhI,EAAG,YAAY6H,EAAG,mCAAmCT,EAAE,YAAYD,EAAE,cAAcE,EAAE,GAAG,cAAcC,EAAE,OAAOC,GAAO,IAAI,IAQrJ,OAPAS,IAAM,0CAA0CX,EAAE,GAAG,qBACrDW,GAAM,0BAA0BR,EAAS,SACzCQ,GAAM,wCAAwCX,GAAG9H,KAAK0I,QAAQ,EAAE,KAAK,eAAeX,GAAG/H,KAAK0I,QAAQ,GAAG,KAAK,QAAQR,EAAS,SAC7HO,GAAM,0CAA0CX,EAAE,GAAG,OAAOK,EAAO,oBAAoB,IAAI,kBAE3F3C,EAAEmD,UAAUF,EACZjD,EAAEwC,MAAM3H,OAAS,IACVmF,EAAEoD;EAGV9I,UAAU+I,iBAAiB,SAAS1H,GACnC,GAAI2H,GAAO9I,KAAK+I,KAAmB,aAAE,GAEjCnB,EAAE5H,KAAKgJ,OAAO7H,EAAG8H,OACjBC,EAAGlJ,KAAKgJ,OAAO7H,EAAGgI,MAClBD,IAAItB,IAAGsB,EAAGlJ,KAAKgJ,OAAO7H,EAAGgI,MAAM,GACnC,IAAIC,GAAKpJ,KAAKqJ,GAAGC,WAEbzB,EAAE7H,KAAKgJ,OAAOO,QAAQpI,EAAGqI,SAASxJ,KAAKgJ,OAAOS,OAAQzJ,KAAKqJ,GAAGK,mBAAmB,EAAG,GAAGvI,EAAGwI,QAAQP,EAElG5D,EAAE4C,SAASC,cAAc,OACzBC,EAAKnH,EAAGyD,OAAO,sBAAsB,qBACrC2D,EAAOzI,UAAU0B,UAAU,eAAeL,EAAGN,OAAQf,UAAU0B,UAAU,eAAeL,EAAGN,OAAOM,EAAGkD,WAAWlD,EAAGmD,SAASnD,GAAIrB,UAAU0B,UAAUgH,YAAYrH,EAAGkD,WAAWlD,EAAGmD,SAASnD,EAC1LoH;IAAKD,EAAGA,EAAG,IAAIC,EAEnB,IAAIE,GAAK,kBAAkBtH,EAAGV,GAAG,YAAY6H,EAAG,mCAAmCT,EAAE,YAAYD,EAAE,cAAcsB,EAAGtB,EAAE,IAAI,OAAOzG,EAAGyI,aAAa,IAAI,IAEjJzI,GAAGyD,SACN6D,GAAO3I,UAAU0B,UAAU,kBAAkBL,EAAGN,OAAQf,UAAU0B,UAAU,kBAAkBL,EAAGN,OAAOM,EAAGkD,WAAWlD,EAAGmD,SAASnD,GAAIrB,UAAU0B,UAAUqI,eAAe1I,EAAGkD,WAAWlD,EAAGmD,SAASnD,IACpMsH,GAAS3I,UAAU0B,UAAU,kBAAkBL,EAAGN,OAAQf,UAAU0B,UAAU,kBAAkBL,EAAGN,OAAOM,EAAGkD,WAAWlD,EAAGmD,SAASnD,GAAIrB,UAAU0B,UAAUsI,eAAe3I,EAAGkD,WAAWlD,EAAGmD,SAASnD,GAAM,UAC3MsH,GAAM,SAENjD,EAAEmD,UAAUF,EAEZzI,KAAK+J,UAAUhH,KAAKyC,EAAEoD,YACtBE,EAAOkB,YAAYxE,EAAEoD;EAGtB9I,UAAUmK,aAAa,SAAS9I,GAC/B,GAAI+I,GAAOpK,UAAUuJ,GAAGc,UAIxB,IAHGrK,UAAU0D,SAASrC,EAAGN,OAAOkD,SAC/BmG,EAAO,KAEJ/I,EAAG8H,MAAM,GAAb,CACA,GAAIH,GAAOhJ,UAAUsK,cAAcjJ,EAAG8H,MACtC,IAAKH,EAAL,CACA,GAAIuB,GAA8B,GAAzBlJ,EAAGkD,WAAW6B,WAAc/E,EAAGkD,WAAWiG,aAC/CC,EAA6B,GAAvBpJ,EAAGmD,SAAS4B,WAAc/E,EAAGmD,SAASgG,cAA2C,GAA3BxK,UAAU0C,OAAOgI,UAE7EC,EAAO9E,KAAKC,OAAU,GAAHyE,EAAM,IAA4B,GAAvBrK,KAAKwC,OAAOyD,WAAc,GAAG,KAAMjG,KAAKwC,OAAOkI,aAAa,OAAyC,GAAzB1K,KAAKwC,OAAOkI,cAAiB,EACvIjB,EAAS9D,KAAKgF,IAAI7K,UAAUuJ,GAAGuB,kBAAkBL,EAAGF,GAAIrK,KAAKwC,OAAOkI,aAAa,IAAI,EAErFG,EAAMlF,KAAKmF,OAAOhC,EAAOiC,YAAYb,GAAM/I,EAAG6J,QAC9CC,EAAK9J,EAAGwI,QAAQkB,EAAM,CACrB1J;EAAG+J,SAAQL,GAAa1J,EAAG6J,OAAO7J,EAAGwI,QAI1C,IAAInE,GAAExF,KAAK2H,cAAcxG,EAAGV,GAAGyJ,EAAKe,EAAKR,EAAII,EAAMpB,EAAOtI,EAAGyI,YAAY9J,UAAU0B,UAAU2J,aAAahK,EAAGkD,WAAWlD,EAAGmD,SAASnD,GAAIrB,UAAU0B,UAAU4J,WAAWjK,EAAGkD,WAAWlD,EAAGmD,SAASnD,GAUjM,IARAnB,KAAK+J,UAAUhH,KAAKyC,GACpBsD,EAAOkB,YAAYxE,GAEnByF,EAAKA,EAAKI,SAASvC,EAAOd,MAAMiD,KAAK,IAAIf,EAEzCO,GAAKzK,KAAKsL,UACV9F,EAAEwC,MAAM3H,OAASL,KAAKqC,eAAelB,EAAGN,OAEpCb,KAAKuL,UAAUpK,EAAGV,GAAG,CACxB+E,EAAEwC,MAAM3H,OAASgL,SAAS7F,EAAEwC,MAAM3H,QAAQ,CAC1C,IAAImL,GAAahG,EAAEwC,MAAM3H,MACzBwK,GAAMlF,KAAKgF,IAAIE,EAAM,EAAE/K,UAAUuJ,GAAGoC,aACpC,IAAIjG,GAAE4C,SAASC,cAAc,MAC7B7C;EAAEkG,aAAa,WAAWvK,EAAGV,IAC7BT,KAAK2L,OAAOnG,EAAEqF,EAAMpB,EAAO,GAAGwB,EAAKR,EAAI,IACvCjF,EAAEoG,UAAU,iBACZpG,EAAEwC,MAAM3H,OAASmL,CACjB,IAAIK,GAAGzD,SAASC,cAAc,MAC9BrI,MAAK2L,OAAOE,EAAGhB,EAAM,EAAEpB,EAAO,IAC9BoC,EAAG7D,MAAM8D,SAAS,2CAGlBD,EAAG7D,MAAM3H,OAASmL,EAClBhG,EAAEwE,YAAY6B,GACd7L,KAAK+I,KAAmB,aAAE,GAAGiB,YAAYxE,GACzCxF,KAAK+J,UAAUhH,KAAKyC,GAEpBqG,EAAGlD,UAAU,oCAAoCxH,EAAGoD,KAAK,cACrDvE,KAAK+L,WAAUF,EAAGjD,WAAWZ,MAAMyB,OAAOA,EAAO,GAAG,MACxDzJ,KAAKgM,QAAQH,EAAGjD,WAChB5I,KAAKgM,QAAQC,WAAW,SAAS3G,GAChC,IAAKA,GAAG4G,OAAOC,SAAU,OAAO,CAChC;GAAIC,IAAM9G,GAAG4G,OAAOG,OAChBD,IAAMtM,UAAUwM,KAAKC,WAAWzM,UAAU0M,UAAS,GACnDJ,GAAMtM,UAAUwM,KAAKG,aAAa3M,UAAU0M,UAAS,IAE1DxM,KAAKgM,QAAQU,cAAc,SAASpH,GAAkC,OAA7BA,GAAG4G,OAAOS,cAAa,GAAa,GAC7Ed,EAAGjD,WAAWgE,QAEd5M,KAAK+I,KAAmB,aAAE,GAAG8D,WAAW,EACxChB,EAAGjD,WAAWkE,SAEf,GAAI9M,KAAK+M,YAAY5L,EAAGV,GAAG,CAC1B+E,EAAEwC,MAAM3H,OAASgL,SAAS7F,EAAEwC,MAAM3H,QAAQ,CAG1C,KAAK,GAFD2M,GAAMhN,KAAKwC,OAAO,UAAWxC,KAAKuL,UAAUpK,EAAGV,GAAI,OAAO,WAC1DwM,EAAU,GACL3K,EAAE,EAAGA,EAAE0K,EAAMzK,OAAQD,IAC7B2K,GAAW,6BAA6BD,EAAM1K,GAAG,YAAYtC,KAAKoG,OAAOC,OAAO2G,EAAM1K,IAAI,UAC3F;GAAIlB,GAAMpB,KAAK2H,cAAcxG,EAAGV,GAAGwK,EAAKf,EAAK,EAAEO,EAAIP,EAAkB,GAAb8C,EAAMzK,OAAU,GAAG,GAAG,oCAAoC0K,GAAU,EAC5H7L,GAAI4G,MAAMiD,KAAKA,EAAKf,EAAK,EACzB9I,EAAI4G,MAAM3H,OAASmF,EAAEwC,MAAM3H,OAC3BL,KAAK+I,KAAmB,aAAE,GAAGiB,YAAY5I,GACzCpB,KAAK+J,UAAUhH,KAAK3B,OAKnBtB,UAAUoN,cAAgB,SAASzM,EAAIyL,GACnC,GAAIrL,GAAQf,UAAU0D,SAAS0I,EAAMrL,MACrC,OAAQA,IAASA,EAAM0C"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_limit.js b/codebase/sources/ext/dhtmlxscheduler_limit.js
new file mode 100644
index 0000000..e56abc5
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_limit.js
@@ -0,0 +1,965 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.config.limit_start = null;
+scheduler.config.limit_end = null;
+scheduler.config.limit_view = false;
+scheduler.config.check_limits = true;
+scheduler.config.mark_now = true;
+scheduler.config.display_marked_timespans = true;
+
+scheduler._temp_limit_scope = function(){
+ var before = null;
+ var dhx_time_block = "dhx_time_block";
+ var default_timespan_type = "default";
+ var fix_options = function(options, days, zones) {
+ if (days instanceof Date && zones instanceof Date) {
+ options.start_date = days;
+ options.end_date = zones;
+ } else {
+ options.days = days;
+ options.zones = zones;
+ }
+ return options;
+ };
+ var get_resulting_options = function(days, zones, sections) {
+ var options = (typeof days == "object") ? days : { days: days };
+ options.type = dhx_time_block;
+ options.css = "";
+ if (zones) {
+ if (sections)
+ options.sections = sections;
+ options = fix_options(options, days, zones);
+ }
+ return options;
+ };
+ scheduler.blockTime = function(days, zones, sections){
+ var options = get_resulting_options(days, zones, sections);
+ return scheduler.addMarkedTimespan(options);
+ };
+ scheduler.unblockTime = function(days, zones, sections) {
+ zones = zones || "fullday";
+ var options = get_resulting_options(days, zones, sections);
+ return scheduler.deleteMarkedTimespan(options);
+ };
+ scheduler.attachEvent("onBeforeViewChange",function(om,od,nm,nd){
+ if (scheduler.config.limit_view){
+ nd = nd||od; nm = nm||om;
+ if (nd.valueOf()>scheduler.config.limit_end.valueOf() || this.date.add(nd,1,nm)<=scheduler.config.limit_start.valueOf()){
+ setTimeout(function(){
+ scheduler.setCurrentView((od || scheduler.config.limit_start), nm);
+ },1);
+ return false;
+ }
+ }
+ return true;
+ });
+ scheduler.checkInMarkedTimespan = function(ev, timespan_type, on_overlap){
+ timespan_type = timespan_type || default_timespan_type;
+
+ var res = true;
+ var temp_start_date = new Date(ev.start_date.valueOf());
+ var temp_end_date = scheduler.date.add(temp_start_date, 1, "day");
+ var timespans = scheduler._marked_timespans;
+ for (; temp_start_date < ev.end_date; temp_start_date = scheduler.date.date_part(temp_end_date), temp_end_date = scheduler.date.add(temp_start_date, 1, "day") ) {
+ var day_value = +scheduler.date.date_part( new Date(temp_start_date) ); // the first part of event not necessarily contains only date part
+ var day_index = temp_start_date.getDay();
+
+ var zones = getZones(ev, timespans, day_index, day_value, timespan_type);
+ if (zones){
+ for (var i = 0; i < zones.length; i+=2) {
+
+ // they may change for new event if it passes limit zone
+ var sm = scheduler._get_zone_minutes(temp_start_date);
+ var em = ( ev.end_date>temp_end_date || ev.end_date.getDate() != temp_start_date.getDate() ) ? 1440 : scheduler._get_zone_minutes(ev.end_date);
+
+ var sz = zones[i];
+ var ez = zones[i+1];
+ if (sz<em && ez>sm) {
+ if(typeof on_overlap == "function"){
+ //handler allows to cancel overlapping
+ //actually needed only to keep default behavior of limits
+ res = on_overlap(ev, sm, em, sz, ez);//event object, event start/end minutes in 'zones' format, zone start/end minutes
+ }else{
+ res = false;
+ }
+ if(!res)
+ break;
+ }
+ }
+ }
+ }
+ return !res;
+ };
+ var blocker = scheduler.checkLimitViolation = function(event){
+ if(!event)
+ return true;
+ if (!scheduler.config.check_limits)
+ return true;
+ var s = scheduler;
+ var c = s.config;
+ var evs = [];
+ if (event.rec_type) {
+ var dates = scheduler.getRecDates(event);
+ for(var i=0; i < dates.length; i++){
+ var ev = scheduler._copy_event(event);
+ scheduler._lame_copy(ev, dates[i]);
+ evs.push(ev);
+ }
+
+ } else {
+ evs = [event];
+ }
+
+ var complete_res = true;
+ for (var p=0; p<evs.length; p++) {
+ var res = true;
+ var ev = evs[p];
+ // Event could have old _timed property (e.g. we are creating event with DND on timeline view and crossed day)
+ ev._timed = scheduler.isOneDayEvent(ev);
+
+ res = (c.limit_start && c.limit_end) ? (ev.start_date.valueOf() >= c.limit_start.valueOf() && ev.end_date.valueOf() <= c.limit_end.valueOf()) : true;
+ if (res){
+ res = !scheduler.checkInMarkedTimespan(ev, dhx_time_block, function(ev, sm, em, sz, ez){
+ //try crop event to allow placing
+ var allow = true;
+ if (sm<=ez && sm >=sz){
+ if (ez == 24*60 || em<ez){
+ allow = false;
+ }
+ if(ev._timed && s._drag_id && s._drag_mode == "new-size"){
+ ev.start_date.setHours(0);
+ ev.start_date.setMinutes(ez);
+ }
+ else {
+ allow = false;
+ }
+ }
+ if ((em>=sz && em<ez) || (sm < sz && em > ez)){
+ if(ev._timed && s._drag_id && s._drag_mode == "new-size"){
+ ev.end_date.setHours(0);
+ ev.end_date.setMinutes(sz);
+ }
+ else {
+ allow = false;
+ }
+ }
+ return allow;
+ });
+ }
+ if (!res) {
+ res = (s.checkEvent("onLimitViolation")) ? s.callEvent("onLimitViolation",[ev.id, ev]) : res;
+ }
+ complete_res = complete_res && res;
+ }
+ if(!complete_res){
+ s._drag_id = null;
+ s._drag_mode = null;
+ }
+ return complete_res;
+
+
+ };
+ scheduler._get_blocked_zones = function(timespans, property, day_index, day_value, timespan_type){
+ var zones =[];
+ if (timespans && timespans[property]) {
+ var timeline_zones = timespans[property];
+ var blocked_timeline_zones = this._get_relevant_blocked_zones(day_index, day_value, timeline_zones, timespan_type);
+ for (var i=0; i<blocked_timeline_zones.length; i++) {
+ zones = this._add_timespan_zones(zones, blocked_timeline_zones[i].zones);
+ }
+ }
+ return zones;
+ };
+ scheduler._get_relevant_blocked_zones = function(day_index, day_value, zones, timespan_type) {
+ var relevant_zones = (zones[day_value] && zones[day_value][timespan_type]) ? zones[day_value][timespan_type] :
+ (zones[day_index] && zones[day_index][timespan_type]) ? zones[day_index][timespan_type] : [];
+ return relevant_zones;
+ };
+ function getZones(ev, timespans, day_index, day_value, timespan_type){
+ var s = scheduler;
+ //containers for 'unit' and 'timeline' views, and related 'section_id' properties
+ var zones = [];
+ var containers = {
+ '_props':'map_to',
+ 'matrix':'y_property'};
+ //check blocked sections in all units and timelines
+ for(var container in containers){
+ var property = containers[container];
+ if(s[container]){
+ for(var view in s[container]){
+ var view_config = s[container][view];
+ var linker = view_config[property];
+ if(!ev[linker]) continue;
+ zones = s._add_timespan_zones(zones,
+ scheduler._get_blocked_zones(timespans[view], ev[linker], day_index, day_value, timespan_type));
+ }
+ }
+ }
+ // now need to add day blocks
+ zones = s._add_timespan_zones(zones, scheduler._get_blocked_zones(timespans, 'global', day_index, day_value, timespan_type));
+ return zones;
+ }
+
+ scheduler.attachEvent("onMouseDown", function(classname) {
+ return !(classname == dhx_time_block);
+ });
+ scheduler.attachEvent("onBeforeDrag",function(id){
+ if (!id) return true;
+ return blocker(scheduler.getEvent(id));
+ });
+ scheduler.attachEvent("onClick", function (event_id, native_event_object){
+ return blocker(scheduler.getEvent(event_id));
+ });
+ scheduler.attachEvent("onBeforeLightbox",function(id){
+
+ var ev = scheduler.getEvent(id);
+ before = [ev.start_date, ev.end_date];
+ return blocker(ev);
+ });
+ scheduler.attachEvent("onEventSave", function(id, data, is_new_event) {
+
+ //lightbox may not have 'time' section
+ if(!(data.start_date && data.end_date)){
+ var ev = scheduler.getEvent(id);
+ data.start_date = new Date(ev.start_date);
+ data.end_date = new Date(ev.end_date);
+ }
+
+ if(data.rec_type){
+ //_roll_back_dates modifies start_date of recurring event, need to check limits after modification
+ // use a copy to keep original event unchanged
+ var data_copy = scheduler._lame_clone(data);
+ scheduler._roll_back_dates(data_copy);
+ return blocker(data_copy);
+ }
+ return blocker(data);
+ });
+ scheduler.attachEvent("onEventAdded",function(id){
+ if (!id) return true;
+ var ev = scheduler.getEvent(id);
+ if (!blocker(ev) && scheduler.config.limit_start && scheduler.config.limit_end) {
+ //if newly created event is outside of limited time - crop it, leaving only allowed time
+ if (ev.start_date < scheduler.config.limit_start) {
+ ev.start_date = new Date(scheduler.config.limit_start);
+ }
+ if (ev.start_date.valueOf() >= scheduler.config.limit_end.valueOf()) {
+ ev.start_date = this.date.add(scheduler.config.limit_end, -1, "day");
+ }
+ if (ev.end_date < scheduler.config.limit_start) {
+ ev.end_date = new Date(scheduler.config.limit_start);
+ }
+ if (ev.end_date.valueOf() >= scheduler.config.limit_end.valueOf()) {
+ ev.end_date = this.date.add(scheduler.config.limit_end, -1, "day");
+ }
+ if (ev.start_date.valueOf() >= ev.end_date.valueOf()) {
+ ev.end_date = this.date.add(ev.start_date, (this.config.event_duration||this.config.time_step), "minute");
+ }
+ ev._timed=this.isOneDayEvent(ev);
+ }
+ return true;
+ });
+ scheduler.attachEvent("onEventChanged",function(id){
+ if (!id) return true;
+ var ev = scheduler.getEvent(id);
+ if (!blocker(ev)){
+ if (!before) return false;
+ ev.start_date = before[0];
+ ev.end_date = before[1];
+ ev._timed=this.isOneDayEvent(ev);
+ }
+ return true;
+ });
+ scheduler.attachEvent("onBeforeEventChanged",function(ev, native_object, is_new){
+ return blocker(ev);
+ });
+ scheduler.attachEvent("onBeforeEventCreated", function(ev) { // native event
+ var start_date = scheduler.getActionData(ev).date;
+ var event = {
+ _timed: true,
+ start_date: start_date,
+ end_date: scheduler.date.add(start_date, scheduler.config.time_step, "minute")
+ };
+ return blocker(event);
+ });
+
+ scheduler.attachEvent("onViewChange", function(){
+ scheduler._mark_now();
+ });
+ scheduler.attachEvent("onSchedulerResize", function(){
+ window.setTimeout(function(){ scheduler._mark_now(); }, 1);
+ return true;
+ });
+ scheduler.attachEvent("onTemplatesReady", function() {
+ scheduler._mark_now_timer = window.setInterval(function() {
+ if(!scheduler._is_initialized())
+ return;
+ scheduler._mark_now();
+ }, 60000);
+ });
+ scheduler._mark_now = function(hide) {
+ // day, week, units views
+ var dhx_now_time = 'dhx_now_time';
+ if (!this._els[dhx_now_time]) {
+ this._els[dhx_now_time] = [];
+ }
+ var now = scheduler._currentDate();
+ var cfg = this.config;
+ scheduler._remove_mark_now(); // delete previous marks if they exist
+ if (!hide && cfg.mark_now && now < this._max_date && now > this._min_date && now.getHours() >= cfg.first_hour && now.getHours()<cfg.last_hour) {
+ var day_index = this.locate_holder_day(now);
+ this._els[dhx_now_time] = scheduler._append_mark_now(day_index, now);
+ }
+ };
+ scheduler._append_mark_now = function(day_index, now) {
+ var dhx_now_time = 'dhx_now_time';
+ var zone_start= scheduler._get_zone_minutes(now);
+ var options = {
+ zones: [zone_start, zone_start+1],
+ css: dhx_now_time,
+ type: dhx_now_time
+ };
+ if (!this._table_view) {
+ if (this._props && this._props[this._mode]) { // units view
+ var day_divs = this._els["dhx_cal_data"][0].childNodes;
+ var r_divs = [];
+
+ for (var i=0; i<day_divs.length-1; i++) {
+ var t_day = day_index+i; // as each unit is actually considered +1 day
+ options.days = t_day;
+ var t_div = scheduler._render_marked_timespan(options, null, t_day)[0];
+ r_divs.push(t_div);
+ }
+ return r_divs;
+ } else { // day/week views
+ options.days = day_index;
+ return scheduler._render_marked_timespan(options, null, day_index);
+ }
+ } else {
+ if (this._mode == "month") {
+ options.days = +scheduler.date.date_part(now);
+ return scheduler._render_marked_timespan(options, null, null);
+ }
+ }
+ };
+ scheduler._remove_mark_now = function() {
+ var dhx_now_time = 'dhx_now_time';
+ var els = this._els[dhx_now_time];
+ for (var i=0; i<els.length; i++) {
+ var div = els[i];
+ var parent = div.parentNode;
+ if (parent) {
+ parent.removeChild(div);
+ }
+ }
+ this._els[dhx_now_time] = [];
+ };
+
+ /*
+ scheduler._marked_timespans = {
+ "global": {
+ "0": {
+ "default": [
+ { // sunday
+ zones: [0, 100, 500, 600],
+ css: "yellow_box",
+ type: "default",
+ view: "global",
+ day: 0
+ }
+ ]
+ }
+ "112121312": {
+ "my_special_type": [
+ {
+ zones: [600, 900],
+ type: "block",
+ css: "some_class",
+ view: "global",
+ day: 112121312
+ },
+ {}
+ ]
+ }
+ },
+ "units": {
+ "5_id": {
+ "3": {
+ "special_type": [ {}, {}, {} ],
+ "another_type": [ {} ]
+ }
+ },
+ "6_id": {
+ "11212127": {
+ ...
+ }
+ }
+ }
+ }
+ */
+ scheduler._marked_timespans = { global: {} };
+
+ scheduler._get_zone_minutes = function(date) {
+ return date.getHours()*60 + date.getMinutes();
+ };
+ scheduler._prepare_timespan_options = function(config) { // receives 1 option, returns array of options
+ var r_configs = []; // resulting configs
+ var temp_configs = [];
+
+ if (config.days == "fullweek")
+ config.days = [0,1,2,3,4,5,6];
+
+ if (config.days instanceof Array) {
+ var t_days = config.days.slice();
+ for (var i=0; i<t_days.length; i++) {
+ var cloned_config = scheduler._lame_clone(config);
+ cloned_config.days = t_days[i];
+ r_configs.push.apply(r_configs, scheduler._prepare_timespan_options(cloned_config));
+ }
+ return r_configs;
+ }
+
+ if ( !config || !((config.start_date && config.end_date && config.end_date > config.start_date) || (config.days !== undefined && config.zones)) )
+ return r_configs; // incorrect config was provided
+
+ var min = 0;
+ var max = 24*60;
+ if (config.zones == "fullday")
+ config.zones = [min, max];
+ if (config.zones && config.invert_zones) {
+ config.zones = scheduler.invertZones(config.zones);
+ }
+
+ config.id = scheduler.uid();
+ config.css = config.css||"";
+ config.type = config.type||default_timespan_type;
+
+ var sections = config.sections;
+ if (sections) {
+ for (var view_key in sections) {
+ if (sections.hasOwnProperty(view_key)) {
+ var ids = sections[view_key];
+ if (!(ids instanceof Array))
+ ids = [ids];
+ for (var i=0; i<ids.length; i++) {
+ var t_config = scheduler._lame_copy({}, config);
+ t_config.sections = {};
+ t_config.sections[view_key] = ids[i];
+ temp_configs.push(t_config);
+ }
+ }
+ }
+ } else {
+ temp_configs.push(config);
+ }
+
+ for (var k=0; k<temp_configs.length; k++) {
+ var c_config = temp_configs[k]; // config to be checked
+
+ var start_date = c_config.start_date;
+ var end_date = c_config.end_date;
+
+ if (start_date && end_date) {
+ var t_sd = scheduler.date.date_part(new Date(start_date)); // e.g. 05 october
+ var t_ed= scheduler.date.add(t_sd, 1, "day"); // 06 october, will both be incremented in the loop
+
+ while (t_sd < end_date) {
+ var t_config = scheduler._lame_copy({}, c_config);
+ delete t_config.start_date;
+ delete t_config.end_date;
+ t_config.days = t_sd.valueOf();
+ var zone_start = (start_date > t_sd) ? scheduler._get_zone_minutes(start_date) : min;
+ var zone_end = ( end_date>t_ed || end_date.getDate() != t_sd.getDate() ) ? max : scheduler._get_zone_minutes(end_date);
+ t_config.zones = [zone_start, zone_end];
+ r_configs.push(t_config);
+
+ t_sd = t_ed;
+ t_ed = scheduler.date.add(t_ed, 1, "day");
+ }
+ } else {
+ if (c_config.days instanceof Date)
+ c_config.days = (scheduler.date.date_part(c_config.days)).valueOf();
+ c_config.zones = config.zones.slice();
+ r_configs.push(c_config);
+ }
+ }
+ return r_configs;
+ };
+ scheduler._get_dates_by_index = function(index, start, end) {
+ var dates = [];
+ start = scheduler.date.date_part(new Date(start||scheduler._min_date));
+ end = new Date(end||scheduler._max_date);
+ var start_day = start.getDay();
+ var delta = (index-start_day >= 0) ? (index-start_day) : (7-start.getDay()+index);
+ var t_date = scheduler.date.add(start, delta, "day");
+ for (; t_date < end; t_date = scheduler.date.add(t_date, 1, "week")) {
+ dates.push(t_date);
+ }
+ return dates;
+ };
+ scheduler._get_css_classes_by_config = function(config) {
+ var css_classes = [];
+ if (config.type == dhx_time_block) {
+ css_classes.push(dhx_time_block);
+ if (config.css)
+ css_classes.push(dhx_time_block+"_reset");
+ }
+ css_classes.push("dhx_marked_timespan", config.css);
+ return css_classes.join(" ");
+ };
+ scheduler._get_block_by_config = function(config) {
+ var block = document.createElement("DIV");
+ if (config.html) {
+ if (typeof config.html == "string")
+ block.innerHTML = config.html;
+ else
+ block.appendChild(config.html);
+ }
+ return block;
+ };
+ scheduler._render_marked_timespan = function(options, area, day) {
+ var blocks = []; // resulting block which will be rendered and returned
+ var c = scheduler.config;
+ var min_date = this._min_date;
+ var max_date = this._max_date;
+ var day_value = false; // if timespan for specific date should be displayed
+
+ if (!c.display_marked_timespans)
+ return blocks;
+
+ // in case of markTimespan
+ if (!day && day !== 0) {
+ if (options.days < 7)
+ day = options.days;
+ else {
+ var date_to_display = new Date(options.days);
+ day_value = +date_to_display;
+
+ // in case of markTimespan date could be not in the viewing range, need to return
+ if ( !(+max_date > +date_to_display && +min_date <= +date_to_display) )
+ return blocks;
+
+ day = date_to_display.getDay();
+ }
+
+ // convert day default index (Sun - 0, Sat - 6) to index of hourscales (depends on week_start and config.start_on_monday)
+ var min_day = min_date.getDay();
+ if (min_day > day) {
+ day = 7 - (min_day-day);
+ } else {
+ day = day - min_day;
+ }
+ }
+ var zones = options.zones;
+ var css_classes = scheduler._get_css_classes_by_config(options);
+
+ if (scheduler._table_view && scheduler._mode == "month") {
+ var areas = [];
+ var days = [];
+
+
+ if (!area) {
+ days = (day_value) ? [day_value] : scheduler._get_dates_by_index(day);
+ for (var i=0; i < days.length; i++) {
+ areas.push( this._scales[days[i]] );
+ }
+ } else {
+ areas.push(area);
+ days.push(day);
+ }
+
+ for (var i=0; i < areas.length; i++) {
+ area = areas[i];
+ day = days[i];
+
+ var sweek = Math.floor((this._correct_shift(day,1)-min_date.valueOf())/(60*60*1000*24*this._cols.length)),
+ sday = this.locate_holder_day(day, false) % this._cols.length;
+
+ if(this._ignores[sday]) continue;
+
+ var block_proto = scheduler._get_block_by_config(options),
+ height = Math.max(area.offsetHeight - 1, 0), // 1 for bottom border
+ width = Math.max(area.offsetWidth - 1, 0), // 1 for left border
+ left = this._colsS[sday],
+ top = this._colsS.heights[sweek]+(this._colsS.height?(this.xy.month_scale_height+2):2)-1;
+
+ block_proto.className = css_classes;
+ block_proto.style.top = top + "px";
+ block_proto.style.lineHeight = block_proto.style.height = height + "px";
+
+ for (var k=0; k < zones.length; k+=2) {
+ var start = zones[i];
+ var end = zones[i+1];
+ if (end <= start)
+ return [];
+
+ var block = block_proto.cloneNode(true);
+
+ block.style.left = (left + Math.round( (start)/(24*60) * width)) + "px";
+ block.style.width = Math.round( (end-start)/(24*60) * width) + "px";
+
+ area.appendChild(block);
+ blocks.push(block);
+ }
+ }
+ } else {
+ var index = day;
+
+ if(this._ignores[this.locate_holder_day(day, false)]) return blocks;
+
+ if (this._props && this._props[this._mode] && options.sections && options.sections[this._mode]) {
+ var view = this._props[this._mode];
+ index = view.order[options.sections[this._mode]];
+ if (view.size && (index > view.position+view.size)) {
+ index = 0;
+ }
+ }
+ area = area ? area : scheduler.locate_holder(index);
+
+ for (var i = 0; i < zones.length; i+=2){
+ var start = Math.max(zones[i], c.first_hour*60);
+ var end = Math.min(zones[i+1], c.last_hour*60);
+ if (end <= start) {
+ if (i+2 < zones.length)
+ continue;
+ else
+ return [];
+ }
+
+ var block = scheduler._get_block_by_config(options);
+ block.className = css_classes;
+
+ // +1 for working with section which really takes up whole height (as % would be == 0)
+ var all_hours_height = this.config.hour_size_px*24 + 1;
+ var hour_ms = 60*60*1000;
+ block.style.top = (Math.round((start*60*1000-this.config.first_hour*hour_ms)*this.config.hour_size_px/hour_ms) % all_hours_height) + "px";
+ block.style.lineHeight = block.style.height = Math.max((Math.round(((end-start)*60*1000)*this.config.hour_size_px/hour_ms)) % all_hours_height, 1)+"px";
+
+ area.appendChild(block);
+ blocks.push(block);
+ }
+ }
+
+ return blocks;
+ };
+ // just marks timespan, will be cleaned after refresh
+ scheduler.markTimespan = function(configuration) {
+ var configs = scheduler._prepare_timespan_options(configuration);
+ if (!configs.length)
+ return;
+ var divs = [];
+ for (var i=0; i<configs.length; i++) {
+ var config = configs[i];
+ var blocks = scheduler._render_marked_timespan(config, null, null);
+ if(blocks.length)
+ divs.push.apply(divs, blocks);
+ }
+ return divs;
+ };
+ scheduler.unmarkTimespan = function(divs) {
+ if (!divs)
+ return;
+ for (var i=0; i<divs.length; i++) {
+ var div = divs[i];
+ // parent may no longer be present if we switched views, navigated
+ if (div.parentNode) {
+ div.parentNode.removeChild(div);
+ }
+ }
+ };
+
+ scheduler._marked_timespans_ids = {};
+ // adds marked timespan to collections, persistent
+ scheduler.addMarkedTimespan = function(configuration) {
+ var configs = scheduler._prepare_timespan_options(configuration);
+ var global = "global";
+
+ if (!configs.length)
+ return; // options are incorrect, nothing to mark
+
+ var id = configs[0].id;
+ var timespans = scheduler._marked_timespans;
+ var ids = scheduler._marked_timespans_ids;
+ if (!ids[id])
+ ids[id] = [];
+
+ for (var i=0; i<configs.length; i++) {
+ var config = configs[i];
+ var day = config.days;
+ var zones = config.zones;
+ var css = config.css;
+ var sections = config.sections;
+ var type = config.type; // default or specified
+ config.id = id;
+
+ if (sections) {
+ for (var view_key in sections) {
+ if (sections.hasOwnProperty(view_key)) {
+ if (!timespans[view_key])
+ timespans[view_key] = {};
+ var unit_id = sections[view_key];
+ var timespans_view = timespans[view_key];
+ if (!timespans_view[unit_id])
+ timespans_view[unit_id] = {};
+ if (!timespans_view[unit_id][day])
+ timespans_view[unit_id][day] = {};
+ if (!timespans_view[unit_id][day][type]){
+ timespans_view[unit_id][day][type] = [];
+ if(!scheduler._marked_timespans_types)
+ scheduler._marked_timespans_types = {};
+ if(!scheduler._marked_timespans_types[type])
+ scheduler._marked_timespans_types[type] = true;
+ }
+ var day_configs = timespans_view[unit_id][day][type];
+ config._array = day_configs;
+ day_configs.push(config);
+ ids[id].push(config);
+ }
+ }
+ } else {
+ if (!timespans[global][day])
+ timespans[global][day] = {};
+ if (!timespans[global][day][type])
+ timespans[global][day][type] = [];
+
+ if(!scheduler._marked_timespans_types)
+ scheduler._marked_timespans_types = {};
+ if(!scheduler._marked_timespans_types[type])
+ scheduler._marked_timespans_types[type] = true;
+
+
+ var day_configs = timespans[global][day][type];
+ config._array = day_configs;
+ day_configs.push(config);
+ ids[id].push(config);
+ }
+ }
+ return id;
+ };
+ // not used for now
+ scheduler._add_timespan_zones = function(current_zones, zones) {
+ var resulting_zones = current_zones.slice();
+ zones = zones.slice();
+
+ if (!resulting_zones.length)
+ return zones;
+
+ for (var i=0; i<resulting_zones.length; i+=2) {
+ var c_zone_start = resulting_zones[i];
+ var c_zone_end = resulting_zones[i+1];
+ var isLast = (i+2 == resulting_zones.length);
+
+ for (var k=0; k<zones.length; k+=2) {
+ var zone_start = zones[k];
+ var zone_end = zones[k+1];
+ if ((zone_end > c_zone_end && zone_start <= c_zone_end) || (zone_start < c_zone_start && zone_end >= c_zone_start)) {
+ resulting_zones[i] = Math.min(c_zone_start, zone_start);
+ resulting_zones[i+1] = Math.max(c_zone_end, zone_end);
+ i -= 2;
+ } else {
+ if (!isLast) // do nothing, maybe next current zone will match or will be last
+ continue;
+
+ var offset = (c_zone_start > zone_start)?0:2;
+ resulting_zones.splice(i+offset, 0, zone_start, zone_end); // last current zone, need to add another
+ }
+ zones.splice(k--,2); // zone was merged or added, need to exclude it
+ break;
+ }
+ }
+ return resulting_zones;
+ };
+ scheduler._subtract_timespan_zones = function(current_zones, zones) {
+ var resulting_zones = current_zones.slice();
+ for (var i=0; i<resulting_zones.length; i+=2 ) {
+ var c_zone_start = resulting_zones[i];// current_zone_start
+ var c_zone_end = resulting_zones[i+1];
+ for (var k=0; k<zones.length; k+=2) {
+ var zone_start = zones[k];
+ var zone_end = zones[k+1];
+ if (zone_end > c_zone_start && zone_start < c_zone_end) {
+ var is_modified = false;
+ if (c_zone_start >= zone_start && c_zone_end <= zone_end) {
+ resulting_zones.splice(i, 2);
+ }
+ if (c_zone_start < zone_start) {
+ resulting_zones.splice(i, 2, c_zone_start, zone_start);
+ is_modified = true;
+ }
+ if (c_zone_end > zone_end) {
+ resulting_zones.splice( (is_modified)?(i+2):i, (is_modified)?0:2, zone_end, c_zone_end);
+ }
+ i -= 2;
+ break;
+ } else {
+ continue;
+ }
+ }
+ }
+ return resulting_zones;
+ };
+ scheduler.invertZones = function(zones) {
+ return scheduler._subtract_timespan_zones([0, 1440], zones.slice());
+ };
+ scheduler._delete_marked_timespan_by_id = function(id) {
+ var configs = scheduler._marked_timespans_ids[id];
+ if (configs) {
+ for (var i=0; i<configs.length; i++) {
+ var config = configs[i];
+ var parent_array = config._array;
+ for (var k=0; k<parent_array.length; k++) {
+ if (parent_array[k] == config) {
+ parent_array.splice(k, 1);
+ break;
+ }
+ }
+ }
+ }
+ };
+ scheduler._delete_marked_timespan_by_config = function(config) {
+ var timespans = scheduler._marked_timespans;
+ var sections = config.sections;
+ var day = config.days;
+ var type = config.type||default_timespan_type;
+ var day_timespans = []; // array of timespans to subtract our config
+ if (sections) {
+ for (var view_key in sections) {
+ if (sections.hasOwnProperty(view_key) && timespans[view_key]) {
+ var unit_id = sections[view_key];
+ if (timespans[view_key][unit_id] && timespans[view_key][unit_id][day] && timespans[view_key][unit_id][day][type])
+ day_timespans = timespans[view_key][unit_id][day][type];
+ }
+ }
+ } else {
+ if (timespans.global[day] && timespans.global[day][type])
+ day_timespans = timespans.global[day][type];
+ }
+ for (var i=0; i<day_timespans.length; i++) {
+ var d_t = day_timespans[i];
+ var zones = scheduler._subtract_timespan_zones(d_t.zones, config.zones);
+ if (zones.length)
+ d_t.zones = zones;
+ else {
+ day_timespans.splice(i,1);
+ i--;
+ // need to update ids collection
+ var related_zones = scheduler._marked_timespans_ids[d_t.id];
+ for (var k=0; k<related_zones.length; k++) {
+ if (related_zones[k] == d_t) {
+ related_zones.splice(k, 1);
+ break;
+ }
+ }
+ }
+ }
+ };
+ scheduler.deleteMarkedTimespan = function(configuration) {
+ // delete everything
+ if (!arguments.length) {
+ scheduler._marked_timespans = { global: {} };
+ scheduler._marked_timespans_ids = {};
+ scheduler._marked_timespans_types = {};
+ }
+
+ if (typeof configuration != "object") { // id was passed
+ scheduler._delete_marked_timespan_by_id(configuration);
+ } else { // normal configuration was passed
+
+ if(!(configuration.start_date && configuration.end_date)){
+ if(!configuration.days)
+ configuration.days = "fullweek";
+ if(!configuration.zones)
+ configuration.zones = "fullday";
+ }
+
+ var types = [];
+ if(!configuration.type){
+ //if type not specified - delete timespans of all types
+ for(var type in scheduler._marked_timespans_types){
+ types.push(type);
+ }
+ }else{
+ types.push(configuration.type);
+ }
+
+
+ var configs = scheduler._prepare_timespan_options(configuration);
+
+ for (var i=0; i<configs.length; i++) {
+
+ var config = configs[i];
+ for( var t=0; t < types.length; t++){
+ var typedConfig = scheduler._lame_clone(config);
+ typedConfig.type = types[t];
+ scheduler._delete_marked_timespan_by_config(typedConfig);
+ }
+ }
+
+ }
+ };
+ scheduler._get_types_to_render = function(common, specific) {
+ var types_to_render = (common) ? scheduler._lame_copy({},common) : {};
+ for (var type in specific||{} ) {
+ if (specific.hasOwnProperty(type)) {
+ types_to_render[type] = specific[type];
+ }
+ }
+ return types_to_render;
+ };
+ scheduler._get_configs_to_render = function(types) {
+ var configs = [];
+ for (var type in types) {
+ if (types.hasOwnProperty(type)) {
+ configs.push.apply(configs, types[type]);
+ }
+ }
+ return configs;
+ };
+ scheduler.attachEvent("onScaleAdd", function(area, day) {
+ if (scheduler._table_view && scheduler._mode != "month")
+ return;
+
+ var day_index = day.getDay();
+ var day_value = day.valueOf();
+ var mode = this._mode;
+ var timespans = scheduler._marked_timespans;
+ var r_configs = [];
+
+ if (this._props && this._props[mode]) { // we are in the units view and need to draw it's sections as well
+ var view = this._props[mode]; // units view object
+ var units = view.options;
+ var index = scheduler._get_unit_index(view, day);
+ var unit = units[index]; // key, label
+ day = scheduler.date.date_part(new Date(this._date)); // for units view actually only 1 day is displayed yet the day variable will change, need to use this._date for all calls
+ day_index = day.getDay();
+ day_value = day.valueOf();
+
+ if (timespans[mode] && timespans[mode][unit.key]) {
+ var unit_zones = timespans[mode][unit.key];
+ var unit_types = scheduler._get_types_to_render(unit_zones[day_index], unit_zones[day_value]);
+ r_configs.push.apply(r_configs, scheduler._get_configs_to_render(unit_types));
+ }
+ }
+
+ var global_data = timespans["global"];
+ var day_types = global_data[day_value]||global_data[day_index];
+ r_configs.push.apply(r_configs, scheduler._get_configs_to_render(day_types));
+
+ for (var i=0; i<r_configs.length; i++) {
+ scheduler._render_marked_timespan(r_configs[i], area, day);
+ }
+ });
+
+ scheduler.dblclick_dhx_marked_timespan = function(e,src){
+ if (!scheduler.config.dblclick_create){
+ scheduler.callEvent("onScaleDblClick",[scheduler.getActionData(e).date,src,e]);
+ }
+ scheduler.addEventNow(scheduler.getActionData(e).date,null,e);
+ };
+
+};
+scheduler._temp_limit_scope();
diff --git a/codebase/sources/ext/dhtmlxscheduler_limit.js.map b/codebase/sources/ext/dhtmlxscheduler_limit.js.map
new file mode 100644
index 0000000..96d0ed7
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_limit.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_limit.js.map","sources":["dhtmlxscheduler_limit.js"],"names":["scheduler","config","limit_start","limit_end","limit_view","check_limits","mark_now","display_marked_timespans","_temp_limit_scope","getZones","ev","timespans","day_index","day_value","timespan_type","s","zones","containers","_props","matrix","container","property","view","view_config","linker","_add_timespan_zones","_get_blocked_zones","before","dhx_time_block","default_timespan_type","fix_options","options","days","Date","start_date","end_date","get_resulting_options","sections","type","css","blockTime","addMarkedTimespan","unblockTime","deleteMarkedTimespan","attachEvent","om","od","nm","nd","valueOf","this","date","add","setTimeout","setCurrentView","checkInMarkedTimespan","on_overlap","res","temp_start_date","temp_end_date","_marked_timespans","date_part","getDay","i","length","sm","_get_zone_minutes","em","getDate","sz","ez","blocker","checkLimitViolation","event","c","evs","rec_type","dates","getRecDates","_copy_event","_lame_copy","push","complete_res","p","_timed","isOneDayEvent","allow","_drag_id","_drag_mode","setHours","setMinutes","checkEvent","callEvent","id","timeline_zones","blocked_timeline_zones","_get_relevant_blocked_zones","relevant_zones","classname","getEvent","event_id","data","data_copy","_lame_clone","_roll_back_dates","event_duration","time_step","getActionData","_mark_now","window","_mark_now_timer","setInterval","_is_initialized","hide","dhx_now_time","_els","now","_currentDate","cfg","_remove_mark_now","_max_date","_min_date","getHours","first_hour","last_hour","locate_holder_day","_append_mark_now","zone_start","_table_view","_mode","day_divs","childNodes","r_divs","t_day","t_div","_render_marked_timespan","els","div","parent","parentNode","removeChild","global","getMinutes","_prepare_timespan_options","r_configs","temp_configs","Array","t_days","slice","cloned_config","apply","undefined","min","max","invert_zones","invertZones","uid","view_key","hasOwnProperty","ids","t_config","k","c_config","t_sd","t_ed","zone_end","_get_dates_by_index","index","start","end","start_day","delta","t_date","_get_css_classes_by_config","css_classes","join","_get_block_by_config","block","document","createElement","html","innerHTML","appendChild","area","day","blocks","min_date","max_date","date_to_display","min_day","areas","_scales","sweek","Math","floor","_correct_shift","_cols","sday","_ignores","block_proto","height","offsetHeight","width","offsetWidth","left","_colsS","top","heights","xy","month_scale_height","className","style","lineHeight","cloneNode","round","order","size","position","locate_holder","all_hours_height","hour_size_px","hour_ms","markTimespan","configuration","configs","divs","unmarkTimespan","_marked_timespans_ids","unit_id","timespans_view","_marked_timespans_types","day_configs","_array","current_zones","resulting_zones","c_zone_start","c_zone_end","isLast","offset","splice","_subtract_timespan_zones","is_modified","_delete_marked_timespan_by_id","parent_array","_delete_marked_timespan_by_config","day_timespans","d_t","related_zones","arguments","types","t","typedConfig","_get_types_to_render","common","specific","types_to_render","_get_configs_to_render","mode","units","_get_unit_index","unit","_date","key","unit_zones","unit_types","global_data","day_types","dblclick_dhx_marked_timespan","e","src","dblclick_create","addEventNow"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_map_view.js b/codebase/sources/ext/dhtmlxscheduler_map_view.js
new file mode 100644
index 0000000..2ea6044
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_map_view.js
@@ -0,0 +1,492 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.xy.map_date_width = 188; // date column width
+scheduler.xy.map_description_width = 400; // description column width
+
+scheduler.config.map_resolve_event_location = true; // if events in database doesn't have lat and lng values there will be an attempt to resolve them on event loading, useful for migration
+scheduler.config.map_resolve_user_location = true; // if user will be promted to share his location to display it on the map
+
+scheduler.config.map_initial_position = new google.maps.LatLng(48.724, 8.215); // inital position of the map
+scheduler.config.map_error_position = new google.maps.LatLng(15, 15); // this position will be displayed in case if event doesn't have corresponding coordinates
+
+scheduler.config.map_infowindow_max_width = 300;
+
+scheduler.config.map_type = google.maps.MapTypeId.ROADMAP;
+
+scheduler.config.map_zoom_after_resolve = 15;
+
+scheduler.locale.labels.marker_geo_success = "It seems you are here.";
+scheduler.locale.labels.marker_geo_fail = "Sorry, could not get your current position using geolocation.";
+
+scheduler.templates.marker_date = scheduler.date.date_to_str("%Y-%m-%d %H:%i"); // date for map's infowindow will be formated following way
+
+scheduler.templates.marker_text = function(start, end, ev) {
+ return "<div><b>" + ev.text + "</b><br/><br/>" + (ev.event_location || '') + "<br/><br/>" + scheduler.templates.marker_date(start) + " - " + scheduler.templates.marker_date(end) + "</div>";
+};
+scheduler.dblclick_dhx_map_area = function() {
+ if (!this.config.readonly && this.config.dblclick_create)
+ this.addEventNow({
+ start_date: scheduler._date,
+ end_date: scheduler.date.add(scheduler._date, scheduler.config.time_step, "minute")
+ });
+};
+scheduler.templates.map_time = function(start, end, ev) {
+ if (ev._timed)
+ return this.day_date(ev.start_date, ev.end_date, ev) + " " + this.event_date(start);
+ else
+ return scheduler.templates.day_date(start) + " &ndash; " + scheduler.templates.day_date(end);
+};
+scheduler.templates.map_text = function(start, end, ev) {
+ return ev.text;
+};
+
+scheduler.date.map_start = function(d) {
+ return d;
+};
+scheduler.date.add_map = function(date, inc, mode) {
+ return (new Date(date.valueOf()));
+};
+
+scheduler.templates.map_date = function(dd, ed, mode) {
+ return '';
+};
+
+scheduler._latLngUpdate = false; // flag for not displaying event second time in case of coordinates update
+
+scheduler.attachEvent("onSchedulerReady", function() {
+ scheduler._isMapPositionSet = false; // if user actual (geolocation) position was set on the map
+
+ var gmap = document.createElement('div');
+ gmap.className = 'dhx_map';
+ gmap.id = 'dhx_gmap';
+ gmap.style.dispay = "none";
+
+ var node = scheduler._obj;
+
+ node.appendChild(gmap);
+
+ scheduler._els.dhx_gmap = [];
+ scheduler._els.dhx_gmap.push(gmap);
+
+ _setMapSize('dhx_gmap');
+
+ var mapOptions = {
+ zoom: scheduler.config.map_inital_zoom || 10,
+ center: scheduler.config.map_initial_position,
+ mapTypeId: scheduler.config.map_type || google.maps.MapTypeId.ROADMAP
+ };
+ var map = new google.maps.Map(document.getElementById('dhx_gmap'), mapOptions);
+ map.disableDefaultUI = false;
+ map.disableDoubleClickZoom = !scheduler.config.readonly;
+
+ google.maps.event.addListener(map, "dblclick", function(event) {
+ if (!scheduler.config.readonly && scheduler.config.dblclick_create) {
+ var point = event.latLng;
+ geocoder.geocode(
+ { 'latLng': point },
+ function(results, status) {
+ if (status == google.maps.GeocoderStatus.OK) {
+ point = results[0].geometry.location;
+ scheduler.addEventNow({
+ lat: point.lat(),
+ lng: point.lng(),
+ event_location: results[0].formatted_address,
+ start_date: scheduler._date,
+ end_date: scheduler.date.add(scheduler._date, scheduler.config.time_step, "minute")
+ });
+ }
+ }
+ );
+ }
+ });
+
+ var infoWindowOptions = {
+ content: ''
+ };
+
+ if (scheduler.config.map_infowindow_max_width) {
+ infoWindowOptions.maxWidth = scheduler.config.map_infowindow_max_width;
+ }
+
+ scheduler.map = {
+ _points: [],
+ _markers: [],
+ _infowindow: new google.maps.InfoWindow(infoWindowOptions),
+ _infowindows_content: [],
+ _initialization_count: -1,
+ _obj: map
+ };
+
+ geocoder = new google.maps.Geocoder();
+
+ if (scheduler.config.map_resolve_user_location) {
+ if (navigator.geolocation) {
+ if (!scheduler._isMapPositionSet) {
+ navigator.geolocation.getCurrentPosition(function(position) {
+ var _userLocation = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
+ map.setCenter(_userLocation);
+ map.setZoom(scheduler.config.map_zoom_after_resolve || 10);
+ scheduler.map._infowindow.setContent(scheduler.locale.labels.marker_geo_success);
+ scheduler.map._infowindow.position = map.getCenter();
+ scheduler.map._infowindow.open(map);
+
+ scheduler._isMapPositionSet = true;
+ },
+ function() {
+ scheduler.map._infowindow.setContent(scheduler.locale.labels.marker_geo_fail);
+ scheduler.map._infowindow.setPosition(map.getCenter());
+ scheduler.map._infowindow.open(map);
+ scheduler._isMapPositionSet = true;
+ });
+ }
+ }
+ }
+ google.maps.event.addListener(map, "resize", function(event) {
+ gmap.style.zIndex = '5';
+ map.setZoom(map.getZoom());
+
+ });
+ google.maps.event.addListener(map, "tilesloaded", function(event) {
+ gmap.style.zIndex = '5';
+ });
+
+ gmap.style.display = 'none'; // property was changed after attaching map
+
+
+ scheduler.attachEvent("onSchedulerResize", function() {
+ if (this._mode == "map") {
+ this.map_view(true);
+ return false;
+ }
+ return true;
+ });
+
+ var old = scheduler.render_data;
+ scheduler.render_data = function(evs, hold) {
+ if (this._mode == "map") {
+ fill_map_tab();
+ var events = scheduler.get_visible_events();
+ for (var i = 0; i < events.length; i++) {
+ if (!scheduler.map._markers[events[i].id]) {
+ showAddress(events[i], false, false);
+ }
+ }
+ } else
+ return old.apply(this, arguments);
+ };
+
+ function set_full_view(mode) {
+ if (mode) {
+ var l = scheduler.locale.labels;
+ scheduler._els["dhx_cal_header"][0].innerHTML = "<div class='dhx_map_line' style='width: " + (scheduler.xy.map_date_width + scheduler.xy.map_description_width + 2) + "px;' ><div class='headline_date' style='width: " + scheduler.xy.map_date_width + "px;'>" + l.date + "</div><div class='headline_description' style='width: " + scheduler.xy.map_description_width + "px;'>" + l.description + "</div></div>";
+ scheduler._table_view = true;
+ scheduler.set_sizes();
+ }
+ }
+
+ function clear_map_tab() {
+ scheduler._selected_event_id = null;
+ scheduler.map._infowindow.close();
+ var markers = scheduler.map._markers;
+ for (var key in markers) {
+ if (markers.hasOwnProperty(key)) {
+ markers[key].setMap(null);
+ delete scheduler.map._markers[key];
+ if (scheduler.map._infowindows_content[key])
+ delete scheduler.map._infowindows_content[key];
+ }
+ }
+ }
+
+ function fill_map_tab() {
+ //select events for which data need to be printed
+ var events = scheduler.get_visible_events();
+ events.sort(function(a, b) {
+ if(a.start_date.valueOf()==b.start_date.valueOf())
+ return a.id>b.id?1:-1;
+ return a.start_date>b.start_date?1:-1;
+ });
+
+ //generate html for the view
+ var html = "<div class='dhx_map_area'>";
+ for (var i = 0; i < events.length; i++) {
+ var ev = events[i];
+ var event_class = (ev.id == scheduler._selected_event_id) ? 'dhx_map_line highlight' : 'dhx_map_line';
+ var bg_color = (ev.color ? ("background:" + ev.color + ";") : "");
+ var color = (ev.textColor ? ("color:" + ev.textColor + ";") : "");
+ html += "<div class='" + event_class + "' event_id='" + ev.id + "' style='" + bg_color + "" + color + "" + (ev._text_style || "") + " width: " + (scheduler.xy.map_date_width + scheduler.xy.map_description_width + 2) + "px;'><div style='width: " + scheduler.xy.map_date_width + "px;' >" + scheduler.templates.map_time(ev.start_date, ev.end_date, ev) + "</div>";
+ html += "<div class='dhx_event_icon icon_details'>&nbsp</div>";
+ html += "<div class='line_description' style='width:" + (scheduler.xy.map_description_width - 25) + "px;'>" + scheduler.templates.map_text(ev.start_date, ev.end_date, ev) + "</div></div>"; // -25 = icon size 20 and padding 5
+ }
+ html += "<div class='dhx_v_border' style='left: " + (scheduler.xy.map_date_width - 2) + "px;'></div><div class='dhx_v_border_description'></div></div>";
+
+ //render html
+ scheduler._els["dhx_cal_data"][0].scrollTop = 0; //fix flickering in FF
+ scheduler._els["dhx_cal_data"][0].innerHTML = html;
+ scheduler._els["dhx_cal_data"][0].style.width = (scheduler.xy.map_date_width + scheduler.xy.map_description_width + 1) + 'px';
+
+ var t = scheduler._els["dhx_cal_data"][0].firstChild.childNodes;
+ scheduler._els["dhx_cal_date"][0].innerHTML = scheduler.templates[scheduler._mode + "_date"](scheduler._min_date, scheduler._max_date, scheduler._mode);
+
+ scheduler._rendered = [];
+ for (var i = 0; i < t.length - 2; i++) {
+ scheduler._rendered[i] = t[i];
+ }
+ }
+
+ function _setMapSize(elem_id) { //input - map's div id
+ var map = document.getElementById(elem_id);
+ var height = scheduler._y - scheduler.xy.nav_height;
+ if (height < 0)
+ height = 0;
+ var width = scheduler._x - scheduler.xy.map_date_width - scheduler.xy.map_description_width - 1;
+ if (width < 0)
+ width = 0;
+ map.style.height = height + 'px';
+ map.style.width = width + 'px';
+ map.style.marginLeft = (scheduler.xy.map_date_width + scheduler.xy.map_description_width + 1) + 'px';
+ map.style.marginTop = (scheduler.xy.nav_height + 2) + 'px';
+ }
+
+ scheduler.map_view = function(mode) {
+ scheduler.map._initialization_count++;
+ var gmap = scheduler._els.dhx_gmap[0];
+ var temp_center;
+ scheduler._els.dhx_cal_data[0].style.width = (scheduler.xy.map_date_width + scheduler.xy.map_description_width + 1) + 'px';
+
+ scheduler._min_date = scheduler.config.map_start || (scheduler._currentDate());
+ scheduler._max_date = scheduler.config.map_end || scheduler.date.add(scheduler._currentDate(), 1, "year");
+
+ scheduler._table_view = true;
+ set_full_view(mode);
+
+ if (mode) { //map tab activated
+ clear_map_tab();
+ fill_map_tab();
+ gmap.style.display = 'block';
+
+ // need to resize block everytime window is resized
+ _setMapSize('dhx_gmap');
+ temp_center = scheduler.map._obj.getCenter();
+
+ var events = scheduler.get_visible_events();
+ for (var i = 0; i < events.length; i++) {
+ if (!scheduler.map._markers[events[i].id]) {
+ showAddress(events[i]);
+ }
+ }
+
+ } else { //map tab de-activated
+ gmap.style.display = 'none';
+ }
+ google.maps.event.trigger(scheduler.map._obj, 'resize');
+
+ if (scheduler.map._initialization_count === 0 && temp_center) { // if tab is activated for the first time need to fix position
+ scheduler.map._obj.setCenter(temp_center);
+ }
+
+ if (scheduler._selected_event_id) {
+ selectEvent(scheduler._selected_event_id);
+ }
+ };
+
+ var selectEvent = function(event_id) {
+ scheduler.map._obj.setCenter(scheduler.map._points[event_id]);
+ scheduler.callEvent("onClick", [event_id]);
+ };
+
+ var showAddress = function(event, setCenter, performClick) { // what if event have incorrect position from the start?
+ var point = scheduler.config.map_error_position;
+ if (event.lat && event.lng) {
+ point = new google.maps.LatLng(event.lat, event.lng);
+ }
+ var message = scheduler.templates.marker_text(event.start_date, event.end_date, event);
+ if (!scheduler._new_event) {
+
+ scheduler.map._infowindows_content[event.id] = message;
+
+ if (scheduler.map._markers[event.id])
+ scheduler.map._markers[event.id].setMap(null);
+
+ scheduler.map._markers[event.id] = new google.maps.Marker({
+ position: point,
+ map: scheduler.map._obj
+ });
+
+ google.maps.event.addListener(scheduler.map._markers[event.id], 'click', function() {
+ scheduler.map._infowindow.setContent(scheduler.map._infowindows_content[event.id]);
+ scheduler.map._infowindow.open(scheduler.map._obj, scheduler.map._markers[event.id]);
+ scheduler._selected_event_id = event.id;
+ scheduler.render_data();
+ });
+ scheduler.map._points[event.id] = point;
+
+ if (setCenter) scheduler.map._obj.setCenter(scheduler.map._points[event.id]);
+ if (performClick) scheduler.callEvent("onClick", [event.id]);
+ }
+ };
+
+ scheduler.attachEvent("onClick", function(event_id, native_event_object) {
+ if (this._mode == "map") {
+ scheduler._selected_event_id = event_id;
+ for (var i = 0; i < scheduler._rendered.length; i++) {
+ scheduler._rendered[i].className = 'dhx_map_line';
+ if (scheduler._rendered[i].getAttribute("event_id") == event_id) {
+ scheduler._rendered[i].className += " highlight";
+ }
+ }
+ if (scheduler.map._points[event_id] && scheduler.map._markers[event_id]) {
+ scheduler.map._obj.setCenter(scheduler.map._points[event_id]); // was panTo
+ google.maps.event.trigger(scheduler.map._markers[event_id], 'click');
+ }
+ }
+ return true;
+ });
+
+ var _displayEventOnMap = function(event) {
+ if (event.event_location && geocoder) {
+ geocoder.geocode(
+ {
+ 'address': event.event_location,
+ 'language': scheduler.uid().toString()
+ },
+ function(results, status) {
+ var point = {};
+ if (status != google.maps.GeocoderStatus.OK) {
+ point = scheduler.callEvent("onLocationError", [event.id]);
+ if (!point || point === true)
+ point = scheduler.config.map_error_position;
+ } else {
+ point = results[0].geometry.location;
+ }
+ event.lat = point.lat();
+ event.lng = point.lng();
+
+ scheduler._selected_event_id = event.id;
+
+ scheduler._latLngUpdate = true;
+ scheduler.callEvent("onEventChanged", [event.id, event]);
+ showAddress(event, true, true);
+ }
+ );
+ } else {
+ showAddress(event, true, true);
+ }
+ };
+
+ var _updateEventLocation = function(event) { // update lat and lng in database
+ if (event.event_location && geocoder) {
+ geocoder.geocode(
+ {
+ 'address': event.event_location,
+ 'language': scheduler.uid().toString()
+ },
+ function(results, status) {
+ var point = {};
+ if (status != google.maps.GeocoderStatus.OK) {
+ point = scheduler.callEvent("onLocationError", [event.id]);
+ if (!point || point === true)
+ point = scheduler.config.map_error_position;
+ } else {
+ point = results[0].geometry.location;
+ }
+ event.lat = point.lat();
+ event.lng = point.lng();
+ scheduler._latLngUpdate = true;
+ scheduler.callEvent("onEventChanged", [event.id, event]);
+ }
+ );
+ }
+ };
+
+ var _delay = function(method, object, params, delay) {
+ setTimeout(function() {
+ var ret = method.apply(object, params);
+ method = object = params = null;
+ return ret;
+ }, delay || 1);
+ };
+
+ scheduler.attachEvent("onEventChanged", function(event_id, event_object) {
+ if (!this._latLngUpdate) {
+ var event = scheduler.getEvent(event_id);
+ if ((event.start_date < scheduler._min_date && event.end_date > scheduler._min_date) || (event.start_date < scheduler._max_date && event.end_date > scheduler._max_date) || (event.start_date.valueOf() >= scheduler._min_date && event.end_date.valueOf() <= scheduler._max_date)) {
+ if (scheduler.map._markers[event_id])
+ scheduler.map._markers[event_id].setMap(null);
+ _displayEventOnMap(event);
+ } else { // event no longer should be displayed on the map view
+ scheduler._selected_event_id = null;
+ scheduler.map._infowindow.close();
+ if (scheduler.map._markers[event_id])
+ scheduler.map._markers[event_id].setMap(null);
+ }
+ }
+ else
+ this._latLngUpdate = false;
+ return true;
+ });
+
+
+ scheduler.attachEvent("onEventIdChange", function(old_event_id, new_event_id) {
+ var event = scheduler.getEvent(new_event_id);
+ if ((event.start_date < scheduler._min_date && event.end_date > scheduler._min_date) || (event.start_date < scheduler._max_date && event.end_date > scheduler._max_date) || (event.start_date.valueOf() >= scheduler._min_date && event.end_date.valueOf() <= scheduler._max_date)) {
+ if (scheduler.map._markers[old_event_id]) {
+ scheduler.map._markers[old_event_id].setMap(null);
+ delete scheduler.map._markers[old_event_id];
+ }
+ if (scheduler.map._infowindows_content[old_event_id])
+ delete scheduler.map._infowindows_content[old_event_id];
+ _displayEventOnMap(event);
+ }
+ return true;
+ });
+
+ scheduler.attachEvent("onEventAdded", function(event_id, event_object) {
+ if (!scheduler._dataprocessor) {
+ if ((event_object.start_date < scheduler._min_date && event_object.end_date > scheduler._min_date) || (event_object.start_date < scheduler._max_date && event_object.end_date > scheduler._max_date) || (event_object.start_date.valueOf() >= scheduler._min_date && event_object.end_date.valueOf() <= scheduler._max_date)) {
+ if (scheduler.map._markers[event_id])
+ scheduler.map._markers[event_id].setMap(null);
+ _displayEventOnMap(event_object);
+ }
+ }
+ return true;
+ });
+
+ /* Test/example
+ scheduler.attachEvent("onLocationError", function(event_id,event_object){
+ return new google.maps.LatLng(8, 8);
+ });
+ */
+
+ scheduler.attachEvent("onBeforeEventDelete", function(event_id, event_object) {
+ if (scheduler.map._markers[event_id]) {
+ scheduler.map._markers[event_id].setMap(null); // if new event is deleted tab != map then it doesn't have marker yet
+ }
+ scheduler._selected_event_id = null;
+ scheduler.map._infowindow.close();
+ return true;
+ });
+
+ scheduler._event_resolve_delay = 1500;
+ scheduler.attachEvent("onEventLoading", function(event) {
+ if (scheduler.config.map_resolve_event_location && event.event_location && !event.lat && !event.lng) { // don't delete !event.lat && !event.lng as location could change
+ scheduler._event_resolve_delay += 1500;
+ _delay(_updateEventLocation, this, [event], scheduler._event_resolve_delay);
+ }
+ return true;
+ });
+
+ scheduler.attachEvent("onEventCancel", function(event_id, is_new) {
+ if (is_new) {
+ if (scheduler.map._markers[event_id])
+ scheduler.map._markers[event_id].setMap(null);
+ scheduler.map._infowindow.close();
+ }
+ return true;
+ });
+});
diff --git a/codebase/sources/ext/dhtmlxscheduler_map_view.js.map b/codebase/sources/ext/dhtmlxscheduler_map_view.js.map
new file mode 100644
index 0000000..e7bcadb
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_map_view.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_map_view.js.map","sources":["dhtmlxscheduler_map_view.js"],"names":["scheduler","xy","map_date_width","map_description_width","config","map_resolve_event_location","map_resolve_user_location","map_initial_position","google","maps","LatLng","map_error_position","map_infowindow_max_width","map_type","MapTypeId","ROADMAP","map_zoom_after_resolve","locale","labels","marker_geo_success","marker_geo_fail","templates","marker_date","date","date_to_str","marker_text","start","end","ev","text","event_location","dblclick_dhx_map_area","this","readonly","dblclick_create","addEventNow","start_date","_date","end_date","add","time_step","map_time","_timed","day_date","event_date","map_text","map_start","d","add_map","Date","valueOf","map_date","_latLngUpdate","attachEvent","set_full_view","mode","l","_els","innerHTML","description","_table_view","set_sizes","clear_map_tab","_selected_event_id","map","_infowindow","close","markers","_markers","key","hasOwnProperty","setMap","_infowindows_content","fill_map_tab","events","get_visible_events","sort","a","b","id","html","i","length","event_class","bg_color","color","textColor","_text_style","scrollTop","style","width","t","firstChild","childNodes","_mode","_min_date","_max_date","_rendered","_setMapSize","elem_id","document","getElementById","height","_y","nav_height","_x","marginLeft","marginTop","_isMapPositionSet","gmap","createElement","className","dispay","node","_obj","appendChild","dhx_gmap","push","mapOptions","zoom","map_inital_zoom","center","mapTypeId","Map","disableDefaultUI","disableDoubleClickZoom","event","addListener","point","latLng","geocoder","geocode","results","status","GeocoderStatus","OK","geometry","location","lat","lng","formatted_address","infoWindowOptions","content","maxWidth","_points","InfoWindow","_initialization_count","Geocoder","navigator","geolocation","getCurrentPosition","position","_userLocation","coords","latitude","longitude","setCenter","setZoom","setContent","getCenter","open","setPosition","zIndex","getZoom","display","map_view","old","render_data","apply","arguments","showAddress","temp_center","dhx_cal_data","_currentDate","map_end","trigger","selectEvent","event_id","callEvent","performClick","message","_new_event","Marker","getAttribute","_displayEventOnMap","address","language","uid","toString","_updateEventLocation","_delay","method","object","params","delay","setTimeout","ret","getEvent","old_event_id","new_event_id","event_object","_dataprocessor","_event_resolve_delay","is_new"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_minical.js b/codebase/sources/ext/dhtmlxscheduler_minical.js
new file mode 100644
index 0000000..262c7cb
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_minical.js
@@ -0,0 +1,472 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.templates.calendar_month = scheduler.date.date_to_str("%F %Y");
+scheduler.templates.calendar_scale_date = scheduler.date.date_to_str("%D");
+scheduler.templates.calendar_date = scheduler.date.date_to_str("%d");
+scheduler.config.minicalendar = {
+ mark_events: true
+};
+scheduler._synced_minicalendars = [];
+scheduler.renderCalendar = function(obj, _prev, is_refresh) {
+ var cal = null;
+ var date = obj.date || (scheduler._currentDate());
+ if (typeof date == "string")
+ date = this.templates.api_date(date);
+
+ if (!_prev) {
+ var cont = obj.container;
+ var pos = obj.position;
+
+ if (typeof cont == "string")
+ cont = document.getElementById(cont);
+
+ if (typeof pos == "string")
+ pos = document.getElementById(pos);
+ if (pos && (typeof pos.left == "undefined")) {
+ var tpos = getOffset(pos);
+ pos = {
+ top: tpos.top + pos.offsetHeight,
+ left: tpos.left
+ };
+ }
+ if (!cont)
+ cont = scheduler._get_def_cont(pos);
+
+ cal = this._render_calendar(cont, date, obj);
+ cal.onclick = function(e) {
+ e = e || event;
+ var src = e.target || e.srcElement;
+
+ if (src.className.indexOf("dhx_month_head") != -1) {
+ var pname = src.parentNode.className;
+ if (pname.indexOf("dhx_after") == -1 && pname.indexOf("dhx_before") == -1) {
+ var newdate = scheduler.templates.xml_date(this.getAttribute("date"));
+ newdate.setDate(parseInt(src.innerHTML, 10));
+ scheduler.unmarkCalendar(this);
+ scheduler.markCalendar(this, newdate, "dhx_calendar_click");
+ this._last_date = newdate;
+ if (this.conf.handler) this.conf.handler.call(scheduler, newdate, this);
+ }
+ }
+ };
+ } else {
+ cal = this._render_calendar(_prev.parentNode, date, obj, _prev);
+ scheduler.unmarkCalendar(cal);
+ }
+
+ if (scheduler.config.minicalendar.mark_events) {
+ var start = scheduler.date.month_start(date);
+ var end = scheduler.date.add(start, 1, "month");
+ var evs = this.getEvents(start, end);
+ var filter = this["filter_" + this._mode];
+ for (var i = 0; i < evs.length; i++) {
+ var ev = evs[i];
+ if (filter && !filter(ev.id, ev))
+ continue;
+ var d = ev.start_date;
+ if (d.valueOf() < start.valueOf())
+ d = start;
+ d = scheduler.date.date_part(new Date(d.valueOf()));
+ while (d < ev.end_date) {
+ this.markCalendar(cal, d, "dhx_year_event");
+ d = this.date.add(d, 1, "day");
+ if (d.valueOf() >= end.valueOf())
+ break;
+ }
+ }
+ }
+
+ this._markCalendarCurrentDate(cal);
+
+ cal.conf = obj;
+ if (obj.sync && !is_refresh)
+ this._synced_minicalendars.push(cal);
+
+ return cal;
+};
+scheduler._get_def_cont = function(pos) {
+ if (!this._def_count) {
+ this._def_count = document.createElement("DIV");
+ this._def_count.className = "dhx_minical_popup";
+ this._def_count.onclick = function(e) { (e || event).cancelBubble = true; };
+ document.body.appendChild(this._def_count);
+ }
+
+ this._def_count.style.left = pos.left + "px";
+ this._def_count.style.top = pos.top + "px";
+ this._def_count._created = new Date();
+
+ return this._def_count;
+};
+scheduler._locateCalendar = function(cal, date) {
+ if (typeof date == "string")
+ date = scheduler.templates.api_date(date);
+
+ if(+date > +cal._max_date || +date < +cal._min_date)
+ return null;
+
+ var table = cal.childNodes[2].childNodes[0];
+
+ var weekNum = 0;
+ var dat = new Date(cal._min_date);
+ while(+this.date.add(dat, 1, "week") <= +date){
+ dat = this.date.add(dat, 1, "week");
+ weekNum++;
+ }
+
+ var sm = scheduler.config.start_on_monday;
+ var day = (date.getDay() || (sm ? 7 : 0)) - (sm ? 1 : 0);
+ return table.rows[weekNum].cells[day].firstChild;
+};
+scheduler.markCalendar = function(cal, date, css) {
+ var div = this._locateCalendar(cal, date);
+ if(!div)
+ return;
+
+ div.className += " " + css;
+};
+scheduler.unmarkCalendar = function(cal, date, css) {
+ date = date || cal._last_date;
+ css = css || "dhx_calendar_click";
+ if (!date) return;
+ var el = this._locateCalendar(cal, date);
+ if(!el)
+ return;
+ el.className = (el.className || "").replace(RegExp(css, "g"));
+};
+scheduler._week_template = function(width) {
+ var summ = (width || 250);
+ var left = 0;
+
+ var week_template = document.createElement("div");
+ var dummy_date = this.date.week_start(scheduler._currentDate());
+ for (var i = 0; i < 7; i++) {
+ this._cols[i] = Math.floor(summ / (7 - i));
+ this._render_x_header(i, left, dummy_date, week_template);
+ dummy_date = this.date.add(dummy_date, 1, "day");
+ summ -= this._cols[i];
+ left += this._cols[i];
+ }
+ week_template.lastChild.className += " dhx_scale_bar_last";
+ return week_template;
+};
+scheduler.updateCalendar = function(obj, sd) {
+ obj.conf.date = sd;
+ this.renderCalendar(obj.conf, obj, true);
+};
+scheduler._mini_cal_arrows = ["&nbsp", "&nbsp"];
+scheduler._render_calendar = function(obj, sd, conf, previous) {
+ /*store*/
+ var ts = scheduler.templates;
+ var temp = this._cols;
+ this._cols = [];
+ var temp2 = this._mode;
+ this._mode = "calendar";
+ var temp3 = this._colsS;
+ this._colsS = {height: 0};
+ var temp4 = new Date(this._min_date);
+ var temp5 = new Date(this._max_date);
+ var temp6 = new Date(scheduler._date);
+ var temp7 = ts.month_day;
+ var temp8 = this._ignores_detected; this._ignores_detected = 0;
+ ts.month_day = ts.calendar_date;
+
+ sd = this.date.month_start(sd);
+ var week_template = this._week_template(obj.offsetWidth - 1 - this.config.minicalendar.padding );
+
+ var d;
+ if (previous)
+ d = previous; else {
+ d = document.createElement("DIV");
+ d.className = "dhx_cal_container dhx_mini_calendar";
+ }
+ d.setAttribute("date", this.templates.xml_format(sd));
+ d.innerHTML = "<div class='dhx_year_month'></div><div class='dhx_year_week'>" + week_template.innerHTML + "</div><div class='dhx_year_body'></div>";
+
+ d.childNodes[0].innerHTML = this.templates.calendar_month(sd);
+ if (conf.navigation) {
+ var move_minicalendar_date = function(calendar, diff) {
+ var date = scheduler.date.add(calendar._date, diff, "month");
+ scheduler.updateCalendar(calendar, date);
+ if (scheduler._date.getMonth() == calendar._date.getMonth() && scheduler._date.getFullYear() == calendar._date.getFullYear()) {
+ scheduler._markCalendarCurrentDate(calendar);
+ }
+ };
+
+ var css_classnames = ["dhx_cal_prev_button", "dhx_cal_next_button"];
+ var css_texts = ["left:1px;top:2px;position:absolute;", "left:auto; right:1px;top:2px;position:absolute;"];
+ var diffs = [-1, 1];
+ var handler = function(diff) {
+ return function() {
+ if (conf.sync) {
+ var calendars = scheduler._synced_minicalendars;
+ for (var k = 0; k < calendars.length; k++) {
+ move_minicalendar_date(calendars[k], diff);
+ }
+ } else {
+ move_minicalendar_date(d, diff);
+ }
+ };
+ };
+ for (var j = 0; j < 2; j++) {
+ var arrow = document.createElement("DIV");
+ //var diff = diffs[j];
+ arrow.className = css_classnames[j];
+ arrow.style.cssText = css_texts[j];
+ arrow.innerHTML = this._mini_cal_arrows[j];
+ d.firstChild.appendChild(arrow);
+ arrow.onclick = handler(diffs[j]);
+ }
+ }
+ d._date = new Date(sd);
+
+ d.week_start = (sd.getDay() - (this.config.start_on_monday ? 1 : 0) + 7) % 7;
+
+ var dd = d._min_date = this.date.week_start(sd);
+ d._max_date = this.date.add(d._min_date, 6, "week");
+
+ this._reset_month_scale(d.childNodes[2], sd, dd);
+
+ var r = d.childNodes[2].firstChild.rows;
+ for (var k = r.length; k < 6; k++) {
+ var last_row = r[r.length - 1];
+ r[0].parentNode.appendChild(last_row.cloneNode(true));
+ var last_day_number = parseInt(last_row.childNodes[last_row.childNodes.length - 1].childNodes[0].innerHTML);
+ last_day_number = (last_day_number < 10) ? last_day_number : 0; // previous week could end on 28-31, so we should start with 0
+ for (var ri = 0; ri < r[k].childNodes.length; ri++) {
+ r[k].childNodes[ri].className = "dhx_after";
+ r[k].childNodes[ri].childNodes[0].innerHTML = scheduler.date.to_fixed(++last_day_number);
+ }
+ }
+
+ if (!previous)
+ obj.appendChild(d);
+
+ d.childNodes[1].style.height = (d.childNodes[1].childNodes[0].offsetHeight - 1) + "px"; // dhx_year_week should have height property so that day dates would get correct position. dhx_year_week height = height of it's child (with the day name)
+
+ /*restore*/
+ this._cols = temp;
+ this._mode = temp2;
+ this._colsS = temp3;
+ this._min_date = temp4;
+ this._max_date = temp5;
+ scheduler._date = temp6;
+ ts.month_day = temp7;
+ this._ignores_detected = temp8;
+ return d;
+};
+scheduler.destroyCalendar = function(cal, force) {
+ if (!cal && this._def_count && this._def_count.firstChild) {
+ if (force || (new Date()).valueOf() - this._def_count._created.valueOf() > 500)
+ cal = this._def_count.firstChild;
+ }
+ if (!cal) return;
+ cal.onclick = null;
+ cal.innerHTML = "";
+ if (cal.parentNode)
+ cal.parentNode.removeChild(cal);
+ if (this._def_count)
+ this._def_count.style.top = "-1000px";
+};
+scheduler.isCalendarVisible = function() {
+ if (this._def_count && parseInt(this._def_count.style.top, 10) > 0)
+ return this._def_count;
+ return false;
+};
+
+scheduler._attach_minical_events = function(){
+ dhtmlxEvent(document.body, "click", function() { scheduler.destroyCalendar(); });
+ scheduler._attach_minical_events = function(){};
+};
+
+scheduler.attachEvent("onTemplatesReady", function() {
+ scheduler._attach_minical_events();
+});
+
+scheduler.templates.calendar_time = scheduler.date.date_to_str("%d-%m-%Y");
+
+scheduler.form_blocks.calendar_time = {
+ render: function() {
+ var html = "<input class='dhx_readonly' type='text' readonly='true'>";
+
+ var cfg = scheduler.config;
+ var dt = this.date.date_part(scheduler._currentDate());
+
+ var last = 24 * 60, first = 0;
+ if (cfg.limit_time_select) {
+ first = 60 * cfg.first_hour;
+ last = 60 * cfg.last_hour + 1; // to include "17:00" option if time select is limited
+ }
+ dt.setHours(first / 60);
+
+ html += " <select>";
+ for (var i = first; i < last; i += this.config.time_step * 1) { // `<` to exclude last "00:00" option
+ var time = this.templates.time_picker(dt);
+ html += "<option value='" + i + "'>" + time + "</option>";
+ dt = this.date.add(dt, this.config.time_step, "minute");
+ }
+ html += "</select>";
+
+ var full_day = scheduler.config.full_day;
+
+ return "<div style='height:30px;padding-top:0; font-size:inherit;' class='dhx_section_time'>" + html + "<span style='font-weight:normal; font-size:10pt;'> &nbsp;&ndash;&nbsp; </span>" + html + "</div>";
+ },
+ set_value: function(node, value, ev) {
+
+ var inputs = node.getElementsByTagName("input");
+ var selects = node.getElementsByTagName("select");
+ var start_date,
+ end_date;
+
+ var _init_once = function(inp, date, number) {
+ inp.onclick = function() {
+ scheduler.destroyCalendar(null, true);
+ scheduler.renderCalendar({
+ position: inp,
+ date: new Date(this._date),
+ navigation: true,
+ handler: function(new_date) {
+ inp.value = scheduler.templates.calendar_time(new_date);
+ inp._date = new Date(new_date);
+ scheduler.destroyCalendar();
+ if (scheduler.config.event_duration && scheduler.config.auto_end_date && number === 0) { //first element = start date
+ _update_minical_select();
+ }
+ }
+ });
+ };
+ };
+
+ if (scheduler.config.full_day) {
+ if (!node._full_day) {
+ var html = "<label class='dhx_fullday'><input type='checkbox' name='full_day' value='true'> " + scheduler.locale.labels.full_day + "&nbsp;</label></input>";
+ if (!scheduler.config.wide_form)
+ html = node.previousSibling.innerHTML + html;
+ node.previousSibling.innerHTML = html;
+ node._full_day = true;
+ }
+ var input = node.previousSibling.getElementsByTagName("input")[0];
+
+ var isFulldayEvent = (scheduler.date.time_part(ev.start_date) === 0 && scheduler.date.time_part(ev.end_date) === 0);
+ input.checked = isFulldayEvent;
+
+ selects[0].disabled = input.checked;
+ selects[1].disabled = input.checked;
+
+ input.onclick = function() {
+ if (input.checked === true) {
+ var obj = {};
+ scheduler.form_blocks.calendar_time.get_value(node, obj);
+
+ start_date = scheduler.date.date_part(obj.start_date);
+ end_date = scheduler.date.date_part(obj.end_date);
+
+ if (+end_date == +start_date || (+end_date >= +start_date && (ev.end_date.getHours() !== 0 || ev.end_date.getMinutes() !== 0)))
+ end_date = scheduler.date.add(end_date, 1, "day");
+ }
+
+ var start = start_date || ev.start_date;
+ var end = end_date || ev.end_date;
+ _attach_action(inputs[0], start);
+ _attach_action(inputs[1], end);
+ selects[0].value = start.getHours() * 60 + start.getMinutes();
+ selects[1].value = end.getHours() * 60 + end.getMinutes();
+
+ selects[0].disabled = input.checked;
+ selects[1].disabled = input.checked;
+
+ };
+ }
+
+ if (scheduler.config.event_duration && scheduler.config.auto_end_date) {
+
+ var _update_minical_select = function () {
+ start_date = scheduler.date.add(inputs[0]._date, selects[0].value, "minute");
+ end_date = new Date(start_date.getTime() + (scheduler.config.event_duration * 60 * 1000));
+
+ inputs[1].value = scheduler.templates.calendar_time(end_date);
+ inputs[1]._date = scheduler.date.date_part(new Date(end_date));
+
+ selects[1].value = end_date.getHours() * 60 + end_date.getMinutes();
+ };
+
+ selects[0].onchange = _update_minical_select; // only update on first select should trigger update so user could define other end date if he wishes too
+ }
+
+ function _attach_action(inp, date, number) {
+ _init_once(inp, date, number);
+ inp.value = scheduler.templates.calendar_time(date);
+ inp._date = scheduler.date.date_part(new Date(date));
+ }
+
+ _attach_action(inputs[0], ev.start_date, 0);
+ _attach_action(inputs[1], ev.end_date, 1);
+ _init_once = function() {};
+
+ selects[0].value = ev.start_date.getHours() * 60 + ev.start_date.getMinutes();
+ selects[1].value = ev.end_date.getHours() * 60 + ev.end_date.getMinutes();
+
+ },
+ get_value: function(node, ev) {
+ var inputs = node.getElementsByTagName("input");
+ var selects = node.getElementsByTagName("select");
+
+ ev.start_date = scheduler.date.add(inputs[0]._date, selects[0].value, "minute");
+ ev.end_date = scheduler.date.add(inputs[1]._date, selects[1].value, "minute");
+
+ if (ev.end_date <= ev.start_date)
+ ev.end_date = scheduler.date.add(ev.start_date, scheduler.config.time_step, "minute");
+ return {
+ start_date: new Date(ev.start_date),
+ end_date: new Date(ev.end_date)
+ };
+ },
+ focus: function(node) {
+ }
+};
+scheduler.linkCalendar = function(calendar, datediff) {
+ var action = function() {
+ var date = scheduler._date;
+ var dateNew = new Date(date.valueOf());
+ if (datediff) dateNew = datediff(dateNew);
+ dateNew.setDate(1);
+ scheduler.updateCalendar(calendar, dateNew);
+ return true;
+ };
+
+ scheduler.attachEvent("onViewChange", action);
+ scheduler.attachEvent("onXLE", action);
+ scheduler.attachEvent("onEventAdded", action);
+ scheduler.attachEvent("onEventChanged", action);
+ scheduler.attachEvent("onAfterEventDelete", action);
+ action();
+};
+
+scheduler._markCalendarCurrentDate = function(calendar) {
+ var date = scheduler._date;
+ var mode = scheduler._mode;
+ var month_start = scheduler.date.month_start(new Date(calendar._date));
+ var month_end = scheduler.date.add(month_start, 1, "month");
+
+ if (mode == 'day' || (this._props && !!this._props[mode])) { // if day or units view
+ if (month_start.valueOf() <= date.valueOf() && month_end > date) {
+ scheduler.markCalendar(calendar, date, "dhx_calendar_click");
+ }
+ } else if (mode == 'week') {
+ var dateNew = scheduler.date.week_start(new Date(date.valueOf()));
+ for (var i = 0; i < 7; i++) {
+ if (month_start.valueOf() <= dateNew.valueOf() && month_end > dateNew) // >= would mean mark first day of the next month
+ scheduler.markCalendar(calendar, dateNew, "dhx_calendar_click");
+ dateNew = scheduler.date.add(dateNew, 1, "day");
+ }
+ }
+};
+
+scheduler.attachEvent("onEventCancel", function(){
+ scheduler.destroyCalendar(null, true);
+}); \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_minical.js.map b/codebase/sources/ext/dhtmlxscheduler_minical.js.map
new file mode 100644
index 0000000..f5838fb
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_minical.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_minical.js.map","sources":["dhtmlxscheduler_minical.js"],"names":["scheduler","templates","calendar_month","date","date_to_str","calendar_scale_date","calendar_date","config","minicalendar","mark_events","_synced_minicalendars","renderCalendar","obj","_prev","is_refresh","cal","_currentDate","this","api_date","_render_calendar","parentNode","unmarkCalendar","cont","container","pos","position","document","getElementById","left","tpos","getOffset","top","offsetHeight","_get_def_cont","onclick","e","event","src","target","srcElement","className","indexOf","pname","newdate","xml_date","getAttribute","setDate","parseInt","innerHTML","markCalendar","_last_date","conf","handler","call","start","month_start","end","add","evs","getEvents","filter","_mode","i","length","ev","id","d","start_date","valueOf","date_part","Date","end_date","_markCalendarCurrentDate","sync","push","_def_count","createElement","cancelBubble","body","appendChild","style","_created","_locateCalendar","_max_date","_min_date","table","childNodes","weekNum","dat","sm","start_on_monday","day","getDay","rows","cells","firstChild","css","div","el","replace","RegExp","_week_template","width","summ","week_template","dummy_date","week_start","_cols","Math","floor","_render_x_header","lastChild","updateCalendar","sd","_mini_cal_arrows","previous","ts","temp","temp2","temp3","_colsS","height","temp4","temp5","temp6","_date","temp7","month_day","temp8","_ignores_detected","offsetWidth","padding","setAttribute","xml_format","navigation","move_minicalendar_date","calendar","diff","getMonth","getFullYear","css_classnames","css_texts","diffs","calendars","k","j","arrow","cssText","dd","_reset_month_scale","r","last_row","cloneNode","last_day_number","ri","to_fixed","destroyCalendar","force","removeChild","isCalendarVisible","_attach_minical_events","dhtmlxEvent","attachEvent","calendar_time","form_blocks","render","html","cfg","dt","last","first","limit_time_select","first_hour","last_hour","setHours","time_step","time","time_picker","full_day","set_value","node","value","_attach_action","inp","number","_init_once","inputs","getElementsByTagName","selects","new_date","event_duration","auto_end_date","_update_minical_select","_full_day","locale","labels","wide_form","previousSibling","input","isFulldayEvent","time_part","checked","disabled","get_value","getHours","getMinutes","getTime","onchange","focus","linkCalendar","datediff","action","dateNew","mode","month_end","_props"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_monthheight.js b/codebase/sources/ext/dhtmlxscheduler_monthheight.js
new file mode 100644
index 0000000..ccf6611
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_monthheight.js
@@ -0,0 +1,34 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.attachEvent("onTemplatesReady",function(){
+ scheduler.xy.scroll_width = 0;
+
+ var old = scheduler.render_view_data;
+ scheduler.render_view_data=function(){
+ var data = this._els["dhx_cal_data"][0];
+ data.firstChild._h_fix = true;
+
+ old.apply(scheduler,arguments);
+
+
+
+ var height = parseInt(data.style.height);
+ data.style.height="1px";
+ data.style.height=data.scrollHeight+"px";
+
+ this._obj.style.height = this._obj.clientHeight + data.scrollHeight - height + "px";
+ };
+
+ var old_s=scheduler._reset_month_scale;
+ scheduler._reset_month_scale=function(a,b,c){
+ var dummy = {clientHeight:100};
+ old_s.apply(scheduler,[dummy,b,c]);
+ a.innerHTML = dummy.innerHTML;
+ };
+
+}); \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_monthheight.js.map b/codebase/sources/ext/dhtmlxscheduler_monthheight.js.map
new file mode 100644
index 0000000..47ff310
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_monthheight.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_monthheight.js.map","sources":["dhtmlxscheduler_monthheight.js"],"names":["scheduler","attachEvent","xy","scroll_width","old","render_view_data","data","this","_els","firstChild","_h_fix","apply","arguments","height","parseInt","style","scrollHeight","_obj","clientHeight","old_s","_reset_month_scale","a","b","c","dummy","innerHTML"],"mappings":"AAAAA,UAAUC,YAAY,mBAAmB,WACxCD,UAAUE,GAAGC,aAAe,CAE5B,IAAIC,GAAMJ,UAAUK,gBACpBL,WAAUK,iBAAiB,WAC1B,GAAIC,GAAOC,KAAKC,KAAmB,aAAE,EACrCF,GAAKG,WAAWC,QAAS,EAEzBN,EAAIO,MAAMX,UAAUY,UAIpB,IAAIC,GAASC,SAASR,EAAKS,MAAMF,OACjCP,GAAKS,MAAMF,OAAO,MAClBP,EAAKS,MAAMF,OAAOP,EAAKU,aAAa,KAEpCT,KAAKU,KAAKF,MAAMF,OAASN,KAAKU,KAAKC,aAAeZ,EAAKU,aAAeH,EAAS,KAGhF,IAAIM,GAAMnB,UAAUoB,kBACpBpB,WAAUoB,mBAAmB,SAASC,EAAEC,EAAEC,GACzC,GAAIC,IAASN,aAAa,IAC1BC,GAAMR,MAAMX,WAAWwB,EAAMF,EAAEC,IAC/BF,EAAEI,UAAYD,EAAMC"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_multisection.js b/codebase/sources/ext/dhtmlxscheduler_multisection.js
new file mode 100644
index 0000000..90c59e0
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_multisection.js
@@ -0,0 +1,254 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.config.multisection = true;
+scheduler.config.section_delemiter = ",";
+scheduler.attachEvent("onSchedulerReady", function(){
+
+
+ var old_unit = scheduler._update_unit_section;
+ scheduler._update_unit_section = function(action){
+ return scheduler._update_sections(action, old_unit);
+ };
+ var old_timeline = scheduler._update_timeline_section;
+ scheduler._update_timeline_section =function(action){
+ return scheduler._update_sections(action, old_timeline);
+ };
+
+
+ scheduler.isMultisectionEvent = function(ev){
+ if(ev && this._get_multisection_view()){
+ var units = this._get_event_sections(ev);
+ return (units.length > 1);
+ }
+ return false;
+ };
+
+ scheduler._get_event_sections = function(event){
+ var mapping = this._get_section_property();
+ var units = event[mapping] || "";
+ return this._parse_event_sections(units);
+ };
+ scheduler._parse_event_sections = function(value){
+ if(value instanceof Array){
+ return value;
+ }else{
+ return value.toString().split(scheduler.config.section_delemiter);
+ }
+ };
+
+ scheduler._register_copies_array = function(evs){
+ for(var i=0; i < evs.length; i++)
+ this._register_copy(evs[i]);
+ };
+ scheduler._register_copy = function(copy){
+ if(!this._multisection_copies[copy.id]){
+ this._multisection_copies[copy.id] = {};
+ }
+ var section = copy[this._get_section_property()];
+ var evs = this._multisection_copies[copy.id];
+ if(!evs[section]){
+ evs[section] = copy;
+ }
+ };
+ scheduler._get_copied_event = function(event_id, section){
+ if(!this._multisection_copies[event_id])
+ return null;
+
+ if(this._multisection_copies[event_id][section])
+ return this._multisection_copies[event_id][section];
+
+ var parts = this._multisection_copies[event_id];
+ //multisection event has not been rendered in this section, need retrieve state of one of rendered events
+ if(scheduler._drag_event && scheduler._drag_event._orig_section && parts[scheduler._drag_event._orig_section]){
+ return parts[scheduler._drag_event._orig_section];
+ }else{
+ var min_sorder = Infinity,
+ ev = null;
+ for(var i in parts){
+ if(parts[i]._sorder < min_sorder){
+ ev = parts[i];
+ min_sorder = parts[i]._sorder;
+ }
+ }
+ return ev;
+ }
+ };
+ scheduler._clear_copied_events = function(){
+ this._multisection_copies = {};
+ };
+ scheduler._clear_copied_events();
+
+ scheduler._split_events = function(evs) {
+ var stack = [];
+ var pr = this._get_multisection_view();
+ var mapping = this._get_section_property();
+ if(pr) {
+ for (var i=0; i<evs.length; i++) {
+ var units = this._get_event_sections(evs[i]);
+
+ if(units.length > 1) {
+ for (var j=0; j<units.length; j++) {
+ if(typeof pr.order[units[j]] === "undefined")
+ continue;
+ var ev = this._lame_copy({}, evs[i]);
+ ev[mapping] = units[j];
+ stack.push(ev);
+ }
+ } else {
+ stack.push(evs[i]);
+ }
+
+ }
+ }else{
+ stack = evs;
+ }
+ return stack;
+ };
+
+
+ scheduler._get_multisection_view = function(){
+ if(!this.config.multisection){
+ return false;
+ }else{
+ return scheduler._get_section_view();
+ }
+ };
+
+ var vis_evs = scheduler.get_visible_events;
+ scheduler.get_visible_events = function(only_timed) {
+ this._clear_copied_events();
+ var evs = vis_evs.apply(this,arguments);
+ var pr = this._get_multisection_view();
+ if (this._get_multisection_view()){
+ evs = this._split_events(evs);
+ this._register_copies_array(evs);
+ }
+
+ return evs;
+ };
+
+ scheduler._rendered_events = {};
+ var old_view_data = scheduler.render_view_data;
+ scheduler.render_view_data = function(evs, hold) {
+ if (this._get_multisection_view() && evs) {
+ //render single event during dnd, restore flags that were calculated during full render
+ evs = this._split_events(evs);
+ this._restore_render_flags(evs);
+ }
+
+ return old_view_data.apply(this,[evs, hold]);
+ };
+ scheduler._restore_render_flags = function(section_evs){
+ var map_to = this._get_section_property();
+ for(var i=0; i < section_evs.length; i++){
+ var ev = section_evs[i];
+ var prev_state = scheduler._get_copied_event(ev.id, ev[map_to]);
+ if(prev_state){
+ for(var p in prev_state){
+ if(p.indexOf("_") === 0){
+ ev[p] = prev_state[p];
+ }
+ }
+ }
+ }
+ };
+ scheduler._update_sections = function(action, def_handler){
+ var view = action.view,
+ event = action.event,
+ pos = action.pos;
+ //view - timeline or units view object. both stores displayed sections in 'view.order' hash
+ // pos - mouse position, calculated in _mouse_coords method
+ // event - scheduler event
+
+ if(!scheduler.isMultisectionEvent(event)){
+ def_handler.apply(scheduler, [action]);
+ }else{
+ if(!scheduler._drag_event._orig_section){
+ scheduler._drag_event._orig_section = pos.section;
+ }
+
+ if(scheduler._drag_event._orig_section != pos.section){
+ var shift = (view.order[pos.section] - view.order[scheduler._drag_event._orig_section]);
+ if(shift){
+ var sections = this._get_event_sections(event);
+ var new_sections = [];
+ var shifted = true;
+ for(var i=0; i<sections.length; i++){
+ var new_section = scheduler._shift_sections(view, sections[i], shift);
+ if(new_section !== null){
+ new_sections[i] = new_section;
+ }else{
+ new_sections = sections;
+ shifted = false;
+ break;
+
+ }
+ }
+ if(shifted)
+ scheduler._drag_event._orig_section = pos.section;
+
+ event[scheduler._get_section_property()] = new_sections.join(",");
+ }
+
+ }
+ }
+ };
+
+ scheduler._shift_sections = function(matrix, orig_section, shift){
+ for(var i in matrix.order){
+ if(matrix.order[i] - matrix.order[orig_section] == shift){
+ return i;
+ }
+ }
+ return null;
+ };
+
+
+ // limit extension
+
+ var old_get_blocked_zones = scheduler._get_blocked_zones;
+ scheduler._get_blocked_zones = function(timespans, property, day_index, day_value, timespan_type){
+ if(property && this.config.multisection){
+ property = this._parse_event_sections(property);
+ var zones = [];
+ for(var i =0; i < property.length; i++){
+ zones = zones.concat(old_get_blocked_zones.apply(this, [timespans, property[i], day_index, day_value, timespan_type]));
+ }
+ return zones;
+ }else{
+ return old_get_blocked_zones.apply(this, arguments);
+ }
+ };
+
+
+ // collision extension
+ var old_check_secions_collision = scheduler._check_sections_collision;
+
+ scheduler._check_sections_collision = function(a, b){
+ if(this.config.multisection && this._get_section_view()){
+ a = this._split_events([a]);
+ b = this._split_events([b]);
+
+ var collision = false;
+ for(var a_ind = 0, a_len = a.length; a_ind < a_len; a_ind++){
+ if(collision){
+ break;
+ }
+ for(var b_ind = 0, b_len = b.length; b_ind < b_len; b_ind++){
+ if(old_check_secions_collision.apply(this, [a[a_ind], b[b_ind]])){
+ collision = true;
+ break;
+ }
+ }
+ }
+ return collision;
+ }else{
+ return old_check_secions_collision.apply(this, arguments);
+ }
+ };
+}); \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_multisection.js.map b/codebase/sources/ext/dhtmlxscheduler_multisection.js.map
new file mode 100644
index 0000000..1645dcd
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_multisection.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_multisection.js.map","sources":["dhtmlxscheduler_multisection.js"],"names":["scheduler","config","multisection","section_delemiter","attachEvent","old_unit","_update_unit_section","action","_update_sections","old_timeline","_update_timeline_section","isMultisectionEvent","ev","this","_get_multisection_view","units","_get_event_sections","length","event","mapping","_get_section_property","_parse_event_sections","value","Array","toString","split","_register_copies_array","evs","i","_register_copy","copy","_multisection_copies","id","section","_get_copied_event","event_id","parts","_drag_event","_orig_section","min_sorder","Infinity","_sorder","_clear_copied_events","_split_events","stack","pr","j","order","_lame_copy","push","_get_section_view","vis_evs","get_visible_events","apply","arguments","_rendered_events","old_view_data","render_view_data","hold","_restore_render_flags","section_evs","map_to","prev_state","p","indexOf","def_handler","view","pos","shift","sections","new_sections","shifted","new_section","_shift_sections","join","matrix","orig_section","old_get_blocked_zones","_get_blocked_zones","timespans","property","day_index","day_value","timespan_type","zones","concat","old_check_secions_collision","_check_sections_collision","a","b","collision","a_ind","a_len","b_ind","b_len"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_multiselect.js b/codebase/sources/ext/dhtmlxscheduler_multiselect.js
new file mode 100644
index 0000000..c797198
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_multiselect.js
@@ -0,0 +1,69 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.form_blocks["multiselect"]={
+ render:function(sns) {
+ var _result = "<div class='dhx_multi_select_"+sns.name+"' style='overflow: auto; height: "+sns.height+"px; position: relative;' >";
+ for (var i=0; i<sns.options.length; i++) {
+ _result += "<label><input type='checkbox' value='"+sns.options[i].key+"'/>"+sns.options[i].label+"</label>";
+ if(convertStringToBoolean(sns.vertical)) _result += '<br/>';
+ }
+ _result += "</div>";
+ return _result;
+ },
+ set_value:function(node,value,ev,config){
+
+ var _children = node.getElementsByTagName('input');
+ for(var i=0;i<_children.length;i++) {
+ _children[i].checked = false; //unchecking all inputs on the form
+ }
+
+ function _mark_inputs(ids) { // ids = [ 0: undefined, 1: undefined, 2: true ... ]
+ var _children = node.getElementsByTagName('input');
+ for(var i=0;i<_children.length; i++) {
+ _children[i].checked = !! ids[_children[i].value];
+ }
+ }
+
+ var _ids = [];
+ if (ev[config.map_to]) {
+ var results = (ev[config.map_to] + "").split(',');
+ for (var i = 0; i < results.length; i++) {
+ _ids[results[i]] = true;
+ }
+ _mark_inputs(_ids);
+ } else {
+ if (scheduler._new_event || !config.script_url)
+ return;
+ var divLoading = document.createElement('div');
+ divLoading.className = 'dhx_loading';
+ divLoading.style.cssText = "position: absolute; top: 40%; left: 40%;";
+ node.appendChild(divLoading);
+ dhtmlxAjax.get(config.script_url + '?dhx_crosslink_' + config.map_to + '=' + ev.id + '&uid=' + scheduler.uid(), function(loader) {
+ var _result = loader.doXPath("//data/item");
+ var _ids = [];
+ for (var i = 0; i < _result.length; i++) {
+ _ids[_result[i].getAttribute(config.map_to)] = true;
+ }
+ _mark_inputs(_ids);
+ node.removeChild(divLoading);
+ });
+ }
+ },
+ get_value:function(node,ev,config){
+ var _result = [];
+ var _children = node.getElementsByTagName("input");
+ for(var i=0;i<_children.length;i++) {
+ if(_children[i].checked)
+ _result.push(_children[i].value);
+ }
+ return _result.join(',');
+ },
+
+ focus:function(node){
+ }
+}; \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_multiselect.js.map b/codebase/sources/ext/dhtmlxscheduler_multiselect.js.map
new file mode 100644
index 0000000..c9b43ed
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_multiselect.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_multiselect.js.map","sources":["dhtmlxscheduler_multiselect.js"],"names":["scheduler","form_blocks","render","sns","_result","name","height","i","options","length","key","label","convertStringToBoolean","vertical","set_value","node","value","ev","config","_mark_inputs","ids","_children","getElementsByTagName","checked","_ids","map_to","results","split","_new_event","script_url","divLoading","document","createElement","className","style","cssText","appendChild","dhtmlxAjax","get","id","uid","loader","doXPath","getAttribute","removeChild","get_value","push","join","focus"],"mappings":"AAAAA,UAAUC,YAAyB,aAClCC,OAAO,SAASC,GAEf,IAAK,GADDC,GAAU,gCAAgCD,EAAIE,KAAK,oCAAoCF,EAAIG,OAAO,6BAC7FC,EAAE,EAAGA,EAAEJ,EAAIK,QAAQC,OAAQF,IACnCH,GAAW,wCAAwCD,EAAIK,QAAQD,GAAGG,IAAI,MAAMP,EAAIK,QAAQD,GAAGI,MAAM,WAC9FC,uBAAuBT,EAAIU,YAAWT,GAAW,QAGrD,OADAA,IAAW,UAGZU,UAAU,SAASC,EAAKC,EAAMC,EAAGC,GAOhC,QAASC,GAAaC,GAErB,IAAI,GADAC,GAAYN,EAAKO,qBAAqB,SAClCf,EAAE,EAAEA,EAAEc,EAAUZ,OAAQF,IAC/Bc,EAAUd,GAAGgB,UAAaH,EAAIC,EAAUd,GAAGS,OAP7C,IAAI,GADAK,GAAYN,EAAKO,qBAAqB,SAClCf,EAAE,EAAEA,EAAEc,EAAUZ,OAAOF,IAC9Bc,EAAUd,GAAGgB,SAAU,CAUxB;GAAIC,KACJ,IAAIP,EAAGC,EAAOO,QAAS,CAEtB,IAAK,GADDC,IAAWT,EAAGC,EAAOO,QAAU,IAAIE,MAAM,KACpCpB,EAAI,EAAGA,EAAImB,EAAQjB,OAAQF,IACnCiB,EAAKE,EAAQnB,KAAM,CAEpBY,GAAaK,OACP,CACN,GAAIxB,UAAU4B,aAAeV,EAAOW,WACnC,MACD,IAAIC,GAAaC,SAASC,cAAc,MACxCF,GAAWG,UAAY,cACvBH,EAAWI,MAAMC,QAAU,2CAC3BpB,EAAKqB,YAAYN,GACjBO,WAAWC,IAAIpB,EAAOW,WAAa,kBAAoBX,EAAOO,OAAS,IAAMR,EAAGsB,GAAK,QAAUvC,UAAUwC,MAAO,SAASC,GAGxH,IAAK,GAFDrC,GAAUqC,EAAOC,QAAQ,eACzBlB,KACKjB,EAAI,EAAGA,EAAIH,EAAQK,OAAQF,IACnCiB,EAAKpB,EAAQG,GAAGoC,aAAazB,EAAOO,UAAW,CAEhDN,GAAaK,GACbT,EAAK6B,YAAYd;KAIpBe,UAAU,SAAS9B,GAGlB,IAAI,GAFAX,MACAiB,EAAYN,EAAKO,qBAAqB,SAClCf,EAAE,EAAEA,EAAEc,EAAUZ,OAAOF,IAC3Bc,EAAUd,GAAGgB,SACfnB,EAAQ0C,KAAKzB,EAAUd,GAAGS,MAE5B,OAAOZ,GAAQ2C,KAAK,MAGrBC,MAAM"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_multisource.js b/codebase/sources/ext/dhtmlxscheduler_multisource.js
new file mode 100644
index 0000000..09194bc
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_multisource.js
@@ -0,0 +1,29 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+(function(){
+
+ function backup(obj){
+ var t = function(){};
+ t.prototype = obj;
+ return t;
+ }
+
+ var old = scheduler._load;
+ scheduler._load=function(url,from){
+ url=url||this._load_url;
+ if (typeof url == "object"){
+ var t = backup(this._loaded);
+ for (var i=0; i < url.length; i++) {
+ this._loaded=new t();
+ old.call(this,url[i],from);
+ }
+ } else
+ old.apply(this,arguments);
+ };
+
+})(); \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_multisource.js.map b/codebase/sources/ext/dhtmlxscheduler_multisource.js.map
new file mode 100644
index 0000000..910606c
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_multisource.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_multisource.js.map","sources":["dhtmlxscheduler_multisource.js"],"names":["backup","obj","t","prototype","old","scheduler","_load","url","from","this","_load_url","_loaded","i","length","call","apply","arguments"],"mappings":"CAAA,WAEC,QAASA,GAAOC,GACf,GAAIC,GAAI,YAER,OADAA,GAAEC,UAAYF,EACPC,EAGR,GAAIE,GAAMC,UAAUC,KACpBD,WAAUC,MAAM,SAASC,EAAIC,GAE5B,GADAD,EAAIA,GAAKE,KAAKC,UACI,gBAAPH,GAEV,IAAK,GADDL,GAAIF,EAAOS,KAAKE,SACXC,EAAE,EAAGA,EAAIL,EAAIM,OAAQD,IAC7BH,KAAKE,QAAQ,GAAIT,GACjBE,EAAIU,KAAKL,KAAKF,EAAIK,GAAGJ,OAGtBJ,GAAIW,MAAMN,KAAKO"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_mvc.js b/codebase/sources/ext/dhtmlxscheduler_mvc.js
new file mode 100644
index 0000000..f3009cd
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_mvc.js
@@ -0,0 +1,147 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+(function(){
+
+ var cfg = {
+ use_id : false
+ };
+
+ //remove private properties
+ function sanitize(ev){
+ var obj = {};
+ for (var key in ev)
+ if (key.indexOf("_") !== 0)
+ obj[key] = ev[key];
+
+ if (!cfg.use_id)
+ delete obj.id;
+
+ return obj;
+ }
+
+ var update_timer;
+ function update_view(){
+ clearTimeout(update_timer);
+ update_timer = setTimeout(function(){
+ scheduler.updateView();
+ },1);
+ }
+
+ function _start_ext_load(cal){
+ cal._loading = true;
+ cal._not_render = true;
+
+ cal.callEvent("onXLS", []);
+ }
+ function _finish_ext_load(cal){
+ cal._not_render = false;
+ if (cal._render_wait)
+ cal.render_view_data();
+ cal._loading = false;
+
+ cal.callEvent("onXLE", []);
+ }
+
+
+ function _get_id(model){
+ return cfg.use_id ? model.id : model.cid;
+ }
+
+scheduler.backbone = function(events, config){
+ if (config) cfg = config;
+
+ events.bind("change", function(model, info){
+ var cid = _get_id(model);
+ var ev = scheduler._events[cid] = model.toJSON();
+ ev.id = cid;
+
+ scheduler._init_event(ev);
+ update_view();
+ });
+ events.bind("remove", function(model, changes){
+ var cid = _get_id(model);
+ if (scheduler._events[cid])
+ scheduler.deleteEvent(cid);
+ });
+
+ var queue = [];
+ function add_from_queue(){
+ if (queue.length){
+ scheduler.parse(queue, "json");
+ queue = [];
+ }
+ }
+
+ events.bind("add", function(model, changes){
+ var cid = _get_id(model);
+ if (!scheduler._events[cid]){
+ var ev = model.toJSON();
+ ev.id = cid;
+ scheduler._init_event(ev);
+
+ queue.push(ev);
+ if (queue.length == 1)
+ setTimeout(add_from_queue,1);
+ }
+ });
+
+ events.bind("request", function(obj){
+ if (obj instanceof Backbone.Collection)
+ _start_ext_load(scheduler);
+ });
+ events.bind("sync", function(obj){
+ if (obj instanceof Backbone.Collection)
+ _finish_ext_load(scheduler);
+ });
+ events.bind("error", function(obj){
+ if (obj instanceof Backbone.Collection)
+ _finish_ext_load(scheduler);
+ });
+
+
+ scheduler.attachEvent("onEventCreated", function(id){
+ var ev = new events.model(scheduler.getEvent(id));
+ scheduler._events[id] = ev.toJSON();
+ scheduler._events[id].id = id;
+
+ return true;
+ });
+
+ scheduler.attachEvent("onEventAdded", function(id){
+ if (!events.get(id)){
+ var data = sanitize(scheduler.getEvent(id));
+ var model = new events.model(data);
+
+ var cid = _get_id(model);
+ if (cid != id)
+ this.changeEventId(id, cid);
+ events.add(model);
+ events.trigger("scheduler:add", model);
+ }
+ return true;
+ });
+ scheduler.attachEvent("onEventChanged", function(id){
+ var ev = events.get(id);
+ var upd = sanitize(scheduler.getEvent(id));
+
+ ev.set(upd);
+ events.trigger("scheduler:change", ev);
+
+ return true;
+ });
+ scheduler.attachEvent("onEventDeleted", function(id){
+ var model = events.get(id);
+ if (model){
+ events.trigger("scheduler:remove", model);
+ events.remove(id);
+ }
+ return true;
+ });
+};
+
+})(); \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_mvc.js.map b/codebase/sources/ext/dhtmlxscheduler_mvc.js.map
new file mode 100644
index 0000000..668f82d
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_mvc.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_mvc.js.map","sources":["dhtmlxscheduler_mvc.js"],"names":["sanitize","ev","obj","key","indexOf","cfg","use_id","id","update_view","clearTimeout","update_timer","setTimeout","scheduler","updateView","_start_ext_load","cal","_loading","_not_render","callEvent","_finish_ext_load","_render_wait","render_view_data","_get_id","model","cid","backbone","events","config","add_from_queue","queue","length","parse","bind","_events","toJSON","_init_event","deleteEvent","push","Backbone","Collection","attachEvent","getEvent","get","data","this","changeEventId","add","trigger","upd","set","remove"],"mappings":"CAAA,WAOC,QAASA,GAASC,GACjB,GAAIC,KACJ,KAAK,GAAIC,KAAOF,GACU,IAArBE,EAAIC,QAAQ,OACfF,EAAIC,GAAOF,EAAGE,GAKhB,OAHKE,GAAIC,cACDJ,GAAIK,GAELL,EAIR,QAASM,KACRC,aAAaC,GACbA,EAAeC,WAAW,WACzBC,UAAUC,cACT,GAGH,QAASC,GAAgBC,GACxBA,EAAIC,UAAW,EACfD,EAAIE,aAAc,EAElBF,EAAIG,UAAU,YAEf,QAASC,GAAiBJ,GACzBA,EAAIE,aAAc,EACdF,EAAIK,cACPL,EAAIM,mBACLN,EAAIC,UAAW,EAEfD,EAAIG,UAAU,YAIf,QAASI,GAAQC,GAChB,MAAOlB,GAAIC,OAASiB,EAAMhB,GAAKgB,EAAMC,IA1CtC,GAiBId,GAjBAL,GACHC,QAAS,EA4CXM,WAAUa,SAAW,SAASC,EAAQC,GAkBrC,QAASC,KACJC,EAAMC,SACTlB,UAAUmB,MAAMF,EAAO,QACvBA;CApBEF,IAAQtB,EAAMsB,GAElBD,EAAOM,KAAK,SAAU,SAAST,GAC9B,GAAIC,GAAMF,EAAQC,GACdtB,EAAKW,UAAUqB,QAAQT,GAAOD,EAAMW,QACxCjC,GAAGM,GAAKiB,EAERZ,UAAUuB,YAAYlC,GACtBO,MAEDkB,EAAOM,KAAK,SAAU,SAAST,GAC9B,GAAIC,GAAMF,EAAQC,EACdX,WAAUqB,QAAQT,IACrBZ,UAAUwB,YAAYZ,IAGxB,IAAIK,KAQJH,GAAOM,KAAK,MAAO,SAAST,GAC3B,GAAIC,GAAMF,EAAQC,EAClB,KAAKX,UAAUqB,QAAQT,GAAK,CAC3B,GAAIvB,GAAMsB,EAAMW,QAChBjC,GAAGM,GAAKiB,EACRZ,UAAUuB,YAAYlC,GAEtB4B,EAAMQ,KAAKpC,GACS,GAAhB4B,EAAMC,QACTnB,WAAWiB,EAAe,MAI7BF,EAAOM,KAAK,UAAW,SAAS9B,GAC3BA,YAAeoC,UAASC,YAC3BzB,EAAgBF,aAElBc,EAAOM,KAAK,OAAQ,SAAS9B,GACxBA,YAAeoC,UAASC,YAC3BpB,EAAiBP;GAEnBc,EAAOM,KAAK,QAAS,SAAS9B,GACzBA,YAAeoC,UAASC,YAC3BpB,EAAiBP,aAInBA,UAAU4B,YAAY,iBAAkB,SAASjC,GAChD,GAAIN,GAAK,GAAIyB,GAAOH,MAAMX,UAAU6B,SAASlC,GAI7C,OAHAK,WAAUqB,QAAQ1B,GAAMN,EAAGiC,SAC3BtB,UAAUqB,QAAQ1B,GAAIA,GAAKA,GAEpB,IAGRK,UAAU4B,YAAY,eAAgB,SAASjC,GAC9C,IAAKmB,EAAOgB,IAAInC,GAAI,CACnB,GAAIoC,GAAO3C,EAASY,UAAU6B,SAASlC,IACnCgB,EAAQ,GAAIG,GAAOH,MAAMoB,GAEzBnB,EAAMF,EAAQC,EACdC,IAAOjB,GACVqC,KAAKC,cAActC,EAAIiB,GACxBE,EAAOoB,IAAIvB,GACXG,EAAOqB,QAAQ,gBAAiBxB,GAEjC,OAAO,IAERX,UAAU4B,YAAY,iBAAkB,SAASjC,GAChD,GAAIN,GAAKyB,EAAOgB,IAAInC,GAChByC,EAAMhD,EAASY,UAAU6B,SAASlC,GAKtC;MAHAN,GAAGgD,IAAID,GACPtB,EAAOqB,QAAQ,mBAAoB9C,IAE5B,IAERW,UAAU4B,YAAY,iBAAkB,SAASjC,GAChD,GAAIgB,GAAQG,EAAOgB,IAAInC,EAKvB,OAJIgB,KACHG,EAAOqB,QAAQ,mBAAoBxB,GACnCG,EAAOwB,OAAO3C,KAER"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_offline.js b/codebase/sources/ext/dhtmlxscheduler_offline.js
new file mode 100644
index 0000000..8f18cce
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_offline.js
@@ -0,0 +1,83 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.load=function(url,call){
+ var type;
+ if (typeof call == "string"){
+ this._process=call;
+ type = call;
+ call = arguments[2];
+ }
+
+ this._load_url=url;
+ this._after_call=call;
+ if (url.$proxy) {
+ url.load(this, typeof type == "string" ? type : null);
+ return;
+ }
+
+ this._load(url,this._date);
+};
+
+scheduler._dp_init_backup = scheduler._dp_init;
+scheduler._dp_init = function(dp) {
+ dp._sendData = function(a1,rowId){
+ if (!a1) return; //nothing to send
+ if (!this.callEvent("onBeforeDataSending",rowId?[rowId,this.getState(rowId),a1]:[null, null, a1])) return false;
+ if (rowId)
+ this._in_progress[rowId]=(new Date()).valueOf();
+ if (this.serverProcessor.$proxy) {
+ var mode = this._tMode!="POST" ? 'get' : 'post';
+ var to_send = [];
+ for (var i in a1)
+ to_send.push({ id: i, data: a1[i], operation: this.getState(i)});
+ this.serverProcessor._send(to_send, mode, this);
+ return;
+ }
+
+ var a2=new dtmlXMLLoaderObject(this.afterUpdate,this,true);
+ var a3 = this.serverProcessor+(this._user?(getUrlSymbol(this.serverProcessor)+["dhx_user="+this._user,"dhx_version="+this.obj.getUserData(0,"version")].join("&")):"");
+ if (this._tMode!="POST")
+ a2.loadXML(a3+((a3.indexOf("?")!=-1)?"&":"?")+this.serialize(a1,rowId));
+ else
+ a2.loadXML(a3,true,this.serialize(a1,rowId));
+ this._waitMode++;
+ };
+
+ dp._updatesToParams = function(items) {
+ var stack = {};
+ for (var i = 0; i < items.length; i++)
+ stack[items[i].id] = items[i].data;
+ return this.serialize(stack);
+ };
+
+ dp._processResult = function(text, xml, loader) {
+ if (loader.status != 200) {
+ for (var i in this._in_progress) {
+ var state = this.getState(i);
+ this.afterUpdateCallback(i, i, state, null);
+ }
+ return;
+ }
+ xml = new dtmlXMLLoaderObject(function() {},this,true);
+ xml.loadXMLString(text);
+ xml.xmlDoc = loader;
+
+ this.afterUpdate(this, null, null, null, xml);
+ };
+ this._dp_init_backup(dp);
+};
+
+if (window.dataProcessor)
+ dataProcessor.prototype.init=function(obj){
+ this.init_original(obj);
+ obj._dataprocessor=this;
+
+ this.setTransactionMode("POST",true);
+ if (!this.serverProcessor.$proxy)
+ this.serverProcessor+=(this.serverProcessor.indexOf("?")!=-1?"&":"?")+"editing=true";
+ }; \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_offline.js.map b/codebase/sources/ext/dhtmlxscheduler_offline.js.map
new file mode 100644
index 0000000..aa628e5
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_offline.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_offline.js.map","sources":["dhtmlxscheduler_offline.js"],"names":["scheduler","load","url","call","type","this","_process","arguments","_load_url","_after_call","$proxy","_load","_date","_dp_init_backup","_dp_init","dp","_sendData","a1","rowId","callEvent","getState","_in_progress","Date","valueOf","serverProcessor","mode","_tMode","to_send","i","push","id","data","operation","_send","a2","dtmlXMLLoaderObject","afterUpdate","a3","_user","getUrlSymbol","obj","getUserData","join","loadXML","indexOf","serialize","_waitMode","_updatesToParams","items","stack","length","_processResult","text","xml","loader","status","loadXMLString","xmlDoc","state","afterUpdateCallback","window","dataProcessor","prototype","init","init_original","_dataprocessor","setTransactionMode"],"mappings":"AAAAA,UAAUC,KAAK,SAASC,EAAIC,GAC3B,GAAIC,EASJ,OARmB,gBAARD,KACVE,KAAKC,SAASH,EACdC,EAAOD,EACPA,EAAOI,UAAU,IAGlBF,KAAKG,UAAUN,EACfG,KAAKI,YAAYN,EACbD,EAAIQ,WACPR,GAAID,KAAKI,KAAqB,gBAARD,GAAmBA,EAAO,UAIjDC,MAAKM,MAAMT,EAAIG,KAAKO,QAGrBZ,UAAUa,gBAAkBb,UAAUc,SACtCd,UAAUc,SAAW,SAASC,GAC7BA,EAAGC,UAAY,SAASC,EAAGC,GACvB,GAAKD,EAAL,CACH,IAAKZ,KAAKc,UAAU,sBAAsBD,GAAOA,EAAMb,KAAKe,SAASF,GAAOD,IAAK,KAAM,KAAMA,IAAM,OAAO,CAG1G,IAFOC,IACNb,KAAKgB,aAAaH,IAAO,GAAKI,OAAQC,WACnClB,KAAKmB,gBAAgBd,OAAQ,CAChC,GAAIe,GAAoB,QAAbpB,KAAKqB,OAAiB,MAAQ,OACrCC,IACJ;IAAK,GAAIC,KAAKX,GACbU,EAAQE,MAAOC,GAAIF,EAAGG,KAAMd,EAAGW,GAAII,UAAW3B,KAAKe,SAASQ,IAE7D,YADAvB,MAAKmB,gBAAgBS,MAAMN,EAASF,EAAMpB,MAI3C,GAAI6B,GAAG,GAAIC,qBAAoB9B,KAAK+B,YAAY/B,MAAK,GACjDgC,EAAKhC,KAAKmB,iBAAiBnB,KAAKiC,MAAOC,aAAalC,KAAKmB,kBAAkB,YAAYnB,KAAKiC,MAAM,eAAejC,KAAKmC,IAAIC,YAAY,EAAE,YAAYC,KAAK,KAAM,GAClJ,SAAbrC,KAAKqB,OACFQ,EAAGS,QAAQN,GAAsB,IAAjBA,EAAGO,QAAQ,KAAU,IAAI,KAAKvC,KAAKwC,UAAU5B,EAAGC,IAEhEgB,EAAGS,QAAQN,GAAG,EAAKhC,KAAKwC,UAAU5B,EAAGC,IAC5Cb,KAAKyC,cAGN/B,EAAGgC,iBAAmB,SAASC,GAE9B,IAAK,GADDC,MACKrB,EAAI,EAAGA,EAAIoB,EAAME,OAAQtB,IACjCqB,EAAMD,EAAMpB,GAAGE,IAAMkB,EAAMpB,GAAGG,IAC/B;MAAO1B,MAAKwC,UAAUI,IAGvBlC,EAAGoC,eAAiB,SAASC,EAAMC,EAAKC,GACvC,GAAqB,KAAjBA,EAAOC,OAOXF,EAAM,GAAIlB,qBAAoB,aAAc9B,MAAK,GACjDgD,EAAIG,cAAcJ,GAClBC,EAAII,OAASH,EAEbjD,KAAK+B,YAAY/B,KAAM,KAAM,KAAM,KAAMgD,OAVxC,KAAK,GAAIzB,KAAKvB,MAAKgB,aAAc,CAChC,GAAIqC,GAAQrD,KAAKe,SAASQ,EAC1BvB,MAAKsD,oBAAoB/B,EAAGA,EAAG8B,EAAO,QAUzCrD,KAAKQ,gBAAgBE,IAGlB6C,OAAOC,gBACVA,cAAcC,UAAUC,KAAK,SAASvB,GACrCnC,KAAK2D,cAAcxB,GACnBA,EAAIyB,eAAe5D,KAEnBA,KAAK6D,mBAAmB,QAAO,GAC1B7D,KAAKmB,gBAAgBd,SACzBL,KAAKmB,kBAAqD,IAAnCnB,KAAKmB,gBAAgBoB,QAAQ,KAAS,IAAI,KAAK"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_outerdrag.js b/codebase/sources/ext/dhtmlxscheduler_outerdrag.js
new file mode 100644
index 0000000..9a2f640
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_outerdrag.js
@@ -0,0 +1,60 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+// lame old code doesn't provide raw event object
+scheduler.attachEvent("onTemplatesReady", function() {
+ var dragger = (new dhtmlDragAndDropObject());
+ var old = dragger.stopDrag;
+ var last_event;
+ dragger.stopDrag = function(e) {
+ last_event = e || event;
+ return old.apply(this, arguments);
+ };
+ dragger.addDragLanding(scheduler._els["dhx_cal_data"][0], {
+ _drag: function(sourceHtmlObject, dhtmlObject, targetHtmlObject, targetHtml) {
+
+ if (scheduler.checkEvent("onBeforeExternalDragIn") && !scheduler.callEvent("onBeforeExternalDragIn", [sourceHtmlObject, dhtmlObject, targetHtmlObject, targetHtml, last_event]))
+ return;
+
+ var temp = scheduler.attachEvent("onEventCreated", function(id) {
+ if (!scheduler.callEvent("onExternalDragIn", [id, sourceHtmlObject, last_event])) {
+ this._drag_mode = this._drag_id = null;
+ this.deleteEvent(id);
+ }
+ });
+
+ var action_data = scheduler.getActionData(last_event);
+ var event_data = {
+ start_date: new Date(action_data.date)
+ };
+
+ // custom views, need to assign section id, fix dates
+ if (scheduler.matrix && scheduler.matrix[scheduler._mode]) {
+ var view_options = scheduler.matrix[scheduler._mode];
+ event_data[view_options.y_property] = action_data.section;
+
+ var pos = scheduler._locate_cell_timeline(last_event);
+ event_data.start_date = view_options._trace_x[pos.x];
+ event_data.end_date = scheduler.date.add(event_data.start_date, view_options.x_step, view_options.x_unit);
+ }
+ if (scheduler._props && scheduler._props[scheduler._mode]) {
+ event_data[scheduler._props[scheduler._mode].map_to] = action_data.section;
+ }
+
+ scheduler.addEventNow(event_data);
+
+ scheduler.detachEvent(temp);
+
+ },
+ _dragIn: function(htmlObject, shtmlObject) {
+ return htmlObject;
+ },
+ _dragOut: function(htmlObject) {
+ return this;
+ }
+ });
+});
diff --git a/codebase/sources/ext/dhtmlxscheduler_outerdrag.js.map b/codebase/sources/ext/dhtmlxscheduler_outerdrag.js.map
new file mode 100644
index 0000000..d928376
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_outerdrag.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_outerdrag.js.map","sources":["dhtmlxscheduler_outerdrag.js"],"names":["scheduler","attachEvent","last_event","dragger","dhtmlDragAndDropObject","old","stopDrag","e","event","apply","this","arguments","addDragLanding","_els","_drag","sourceHtmlObject","dhtmlObject","targetHtmlObject","targetHtml","checkEvent","callEvent","temp","id","_drag_mode","_drag_id","deleteEvent","action_data","getActionData","event_data","start_date","Date","date","matrix","_mode","view_options","y_property","section","pos","_locate_cell_timeline","_trace_x","x","end_date","add","x_step","x_unit","_props","map_to","addEventNow","detachEvent","_dragIn","htmlObject","_dragOut"],"mappings":"AACAA,UAAUC,YAAY,mBAAoB,WACzC,GAEIC,GAFAC,EAAU,GAAKC,wBACfC,EAAMF,EAAQG,QAElBH,GAAQG,SAAW,SAASC,GAE3B,MADAL,GAAaK,GAAKC,MACXH,EAAII,MAAMC,KAAMC,YAExBR,EAAQS,eAAeZ,UAAUa,KAAmB,aAAE,IACrDC,MAAO,SAASC,EAAkBC,EAAaC,EAAkBC,GAEhE,IAAIlB,UAAUmB,WAAW,2BAA8BnB,UAAUoB,UAAU,0BAA2BL,EAAkBC,EAAaC,EAAkBC,EAAYhB,IAAnK,CAGA,GAAImB,GAAOrB,UAAUC,YAAY,iBAAkB,SAASqB,GACtDtB,UAAUoB,UAAU,oBAAqBE,EAAIP,EAAkBb,MACnEQ,KAAKa,WAAab,KAAKc,SAAW,KAClCd,KAAKe,YAAYH;GAIfI,EAAc1B,UAAU2B,cAAczB,GACtC0B,GACHC,WAAY,GAAIC,MAAKJ,EAAYK,MAIlC,IAAI/B,UAAUgC,QAAUhC,UAAUgC,OAAOhC,UAAUiC,OAAQ,CAC1D,GAAIC,GAAelC,UAAUgC,OAAOhC,UAAUiC,MAC9CL,GAAWM,EAAaC,YAAcT,EAAYU,OAElD,IAAIC,GAAMrC,UAAUsC,sBAAsBpC,EAC1C0B,GAAWC,WAAaK,EAAaK,SAASF,EAAIG,GAClDZ,EAAWa,SAAWzC,UAAU+B,KAAKW,IAAId,EAAWC,WAAYK,EAAaS,OAAQT,EAAaU,QAE/F5C,UAAU6C,QAAU7C,UAAU6C,OAAO7C,UAAUiC,SAClDL,EAAW5B,UAAU6C,OAAO7C,UAAUiC,OAAOa,QAAUpB,EAAYU,SAGpEpC,UAAU+C,YAAYnB,GAEtB5B,UAAUgD,YAAY3B,KAGvB4B,QAAS,SAASC,GACjB,MAAOA;EAERC,SAAU,WACT,MAAOzC"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_pdf.js b/codebase/sources/ext/dhtmlxscheduler_pdf.js
new file mode 100644
index 0000000..77c9a73
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_pdf.js
@@ -0,0 +1,363 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+(function() {
+ var dx, dy,
+ html_regexp = new RegExp("<[^>]*>", "g"),
+ newline_regexp = new RegExp("<br[^>]*>", "g");
+
+ function clean_html(val) {
+ return val.replace(newline_regexp, "\n").replace(html_regexp, "");
+ }
+
+ function x_norm(x, offset) {
+ x = parseFloat(x);
+ offset = parseFloat(offset);
+ if (!isNaN(offset)) x -= offset;
+
+ var w = colsWidth(x);
+ x = x - w.width + w.cols*dx;
+ return isNaN(x)?"auto":(100*x/(dx));
+ }
+
+ function x_norm_event(x, offset, is_left) {
+ x = parseFloat(x);
+ offset = parseFloat(offset);
+ if (!isNaN(offset) && is_left) x -= offset;
+
+ var w = colsWidth(x);
+ x = x - w.width + w.cols*dx;
+ return isNaN(x)?"auto":(100*x/(dx-(!isNaN(offset)?offset:0)));
+ }
+ function colsWidth(width) {
+ var r = 0;
+ var header = scheduler._els.dhx_cal_header[0].childNodes;
+ var els = header[1] ? header[1].childNodes : header[0].childNodes;
+ for (var i = 0; i < els.length; i++) {
+ var el = els[i].style ? els[i] : els[i].parentNode;
+ var w = parseFloat(el.style.width);
+ if (width > w){
+ width -= (w+1);
+ r+=(w+1);
+ }
+ else
+ break;
+ }
+ return { width: r, cols: i };
+ }
+
+ function y_norm(y) {
+ y = parseFloat(y);
+ if (isNaN(y)) return "auto";
+ return 100 * y / dy;
+ }
+
+ function get_style(node, style){
+ return (window.getComputedStyle?(window.getComputedStyle(node, null)[style]):(node.currentStyle?node.currentStyle[style]:null))||"";
+ }
+
+ function de_day(node, n) {
+ var x = parseInt(node.style.left, 10);
+
+ for (var dx = 0; dx < scheduler._cols.length; dx++) {
+ x -= scheduler._cols[dx];
+ if (x < 0) return dx;
+ }
+ return n;
+ }
+
+ function de_week(node, n) {
+ var y = parseInt(node.style.top, 10);
+ for (var dy = 0; dy < scheduler._colsS.heights.length; dy++)
+ if (scheduler._colsS.heights[dy] > y) return dy;
+ return n;
+ }
+
+ function xml_start(tag) {
+ return tag ? "<"+tag+">" : "";
+ }
+ function xml_end(tag) {
+ return tag ? "</"+tag+">" : "";
+ }
+
+ function xml_top(tag, profile, header, footer) {
+ var xml = "<"+tag+" profile='" + profile + "'";
+ if (header)
+ xml += " header='" + header + "'";
+ if (footer)
+ xml += " footer='" + footer + "'";
+ xml += ">";
+ return xml;
+ }
+
+ function xml_body_header() {
+ var xml = "";
+ // detects if current mode is timeline
+ var mode = scheduler._mode;
+ if (scheduler.matrix && scheduler.matrix[scheduler._mode])
+ mode = (scheduler.matrix[scheduler._mode].render == "cell") ? "matrix" : "timeline";
+ xml += "<scale mode='" + mode + "' today='" + scheduler._els.dhx_cal_date[0].innerHTML + "'>";
+
+ if (scheduler._mode == "week_agenda") {
+ var xh = scheduler._els.dhx_cal_data[0].getElementsByTagName("DIV");
+ for (var i = 0; i < xh.length; i++)
+ if (xh[i].className == "dhx_wa_scale_bar")
+ xml += "<column>" + clean_html(xh[i].innerHTML) + "</column>";
+ } else if (scheduler._mode == "agenda" || scheduler._mode == "map") {
+ var xh = scheduler._els.dhx_cal_header[0].childNodes[0].childNodes;
+
+ xml += "<column>" + clean_html(xh[0].innerHTML) + "</column><column>" + clean_html(xh[1].innerHTML) + "</column>";
+ } else if (scheduler._mode == "year") {
+ var xh = scheduler._els.dhx_cal_data[0].childNodes;
+ for (var i = 0; i < xh.length; i++) {
+ xml += "<month label='" + clean_html(xh[i].childNodes[0].innerHTML) + "'>";
+ xml += xml_month_scale(xh[i].childNodes[1].childNodes);
+ xml += xml_month(xh[i].childNodes[2]);
+ xml += "</month>";
+ }
+ } else {
+ xml += "<x>";
+ var xh = scheduler._els.dhx_cal_header[0].childNodes;
+ xml += xml_month_scale(xh);
+ xml += "</x>";
+
+ var yh = scheduler._els.dhx_cal_data[0];
+ if (scheduler.matrix && scheduler.matrix[scheduler._mode]) {
+ xml += "<y>";
+ for (var i = 0; i < yh.firstChild.rows.length; i++) {
+ var el = yh.firstChild.rows[i];
+ xml += "<row><![CDATA[" + clean_html(el.cells[0].innerHTML) + "]]></row>";
+ }
+ xml += "</y>";
+ dy = yh.firstChild.rows[0].cells[0].offsetHeight;
+ } else if (yh.firstChild.tagName == "TABLE") {
+ xml += xml_month(yh);
+ } else {
+ yh = yh.childNodes[yh.childNodes.length - 1];
+ while (yh.className.indexOf("dhx_scale_holder") == -1)
+ yh = yh.previousSibling;
+ yh = yh.childNodes;
+
+ xml += "<y>";
+ for (var i = 0; i < yh.length; i++)
+ xml += "\n<row><![CDATA[" + clean_html(yh[i].innerHTML) + "]]></row>";
+ xml += "</y>";
+ dy = yh[0].offsetHeight;
+ }
+ }
+ xml += "</scale>";
+ return xml;
+ }
+
+ function xml_month(yh) {
+ var xml = "";
+ var r = yh.firstChild.rows;
+ for (var i = 0; i < r.length; i++) {
+ var days = [];
+ for (var j = 0; j < r[i].cells.length; j++)
+ days.push(r[i].cells[j].firstChild.innerHTML);
+
+ xml += "\n<row height='" + yh.firstChild.rows[i].cells[0].offsetHeight + "'><![CDATA[" + clean_html(days.join("|")) + "]]></row>";
+ dy = yh.firstChild.rows[0].cells[0].offsetHeight;
+ }
+ return xml;
+ }
+
+ function xml_month_scale(xh) {
+ var xhs,
+ xml = "";
+ if (scheduler.matrix && scheduler.matrix[scheduler._mode]) {
+ if (scheduler.matrix[scheduler._mode].second_scale)
+ xhs = xh[1].childNodes;
+
+ xh = xh[0].childNodes;
+ }
+
+ for (var i = 0; i < xh.length; i++)
+ xml += "\n<column><![CDATA[" + clean_html(xh[i].innerHTML) + "]]></column>";
+ dx = xh[0].offsetWidth;
+
+ if (xhs) {
+ var width = 0;
+ var top_width = xh[0].offsetWidth;
+ var top_col = 1;
+ for (var i = 0; i < xhs.length; i++) {
+ xml += "\n<column second_scale='" + top_col + "'><![CDATA[" + clean_html(xhs[i].innerHTML) + "]]></column>";
+ width += xhs[i].offsetWidth;
+ if (width >= top_width) {
+ top_width += (xh[top_col] ? xh[top_col].offsetWidth : 0);
+ top_col++;
+ }
+ dx = xhs[0].offsetWidth;
+ }
+ }
+ return xml;
+ }
+
+ function xml_body(colors) {
+ var xml = "";
+ var evs = scheduler._rendered;
+ var matrix = scheduler.matrix && scheduler.matrix[scheduler._mode];
+
+ if (scheduler._mode == "agenda" || scheduler._mode == "map") {
+
+ for (var i = 0; i < evs.length; i++)
+ xml += "<event><head><![CDATA[" + clean_html(evs[i].childNodes[0].innerHTML) + "]]></head><body><![CDATA[" + clean_html(evs[i].childNodes[2].innerHTML) + "]]></body></event>";
+
+ } else if (scheduler._mode == "week_agenda") {
+
+ for (var i = 0; i < evs.length; i++)
+ xml += "<event day='" + evs[i].parentNode.getAttribute("day") + "'><body>" + clean_html(evs[i].innerHTML) + "</body></event>";
+
+ } else if (scheduler._mode == "year") {
+
+ var evs = scheduler.get_visible_events();
+ for (var i = 0; i < evs.length; i++) {
+ var d = evs[i].start_date;
+ if (d.valueOf() < scheduler._min_date.valueOf())
+ d = scheduler._min_date;
+
+ while (d < evs[i].end_date) {
+ var m = d.getMonth() + 12 * (d.getFullYear() - scheduler._min_date.getFullYear()) - scheduler.week_starts._month;
+ var day = scheduler.week_starts[m] + d.getDate() - 1;
+ var text_color = colors ? get_style(scheduler._get_year_cell(d), "color") : "";
+ var bg_color = colors ? get_style(scheduler._get_year_cell(d), "backgroundColor") : "";
+
+ xml += "<event day='" + (day % 7) + "' week='" + Math.floor(day / 7) + "' month='" + m + "' backgroundColor='" + bg_color + "' color='" + text_color + "'></event>";
+ d = scheduler.date.add(d, 1, "day");
+ if (d.valueOf() >= scheduler._max_date.valueOf())
+ break;
+ }
+ }
+ } else if (matrix && matrix.render == "cell") {
+ var evs = scheduler._els.dhx_cal_data[0].getElementsByTagName("TD");
+ for (var i = 0; i < evs.length; i++) {
+ var text_color = colors ? get_style(evs[i], "color") : "";
+ var bg_color = colors ? get_style(evs[i], "backgroundColor") : "";
+ xml += "\n<event><body backgroundColor='" + bg_color + "' color='" + text_color + "'><![CDATA[" + clean_html(evs[i].innerHTML) + "]]></body></event>";
+ }
+ } else {
+ for (var i = 0; i < evs.length; i++) {
+ var zx, zdx;
+ if (scheduler.matrix && scheduler.matrix[scheduler._mode]) {
+ // logic for timeline view
+ zx = x_norm(evs[i].style.left);
+ zdx = x_norm(evs[i].offsetWidth)-1;
+ } else {
+ // we should use specific logic for day/week/units view
+ var left_norm = scheduler.config.use_select_menu_space ? 0 : 26;
+ zx = x_norm_event(evs[i].style.left, left_norm, true);
+ zdx = x_norm_event(evs[i].style.width, left_norm)-1;
+ }
+ if (isNaN(zdx * 1)) continue;
+ var zy = y_norm(evs[i].style.top);
+ var zdy = y_norm(evs[i].style.height);
+
+ var e_type = evs[i].className.split(" ")[0].replace("dhx_cal_", "");
+ if (e_type === 'dhx_tooltip_line') continue;
+
+ var dets = scheduler.getEvent(evs[i].getAttribute("event_id"));
+ if (!dets) continue;
+ var day = dets._sday;
+ var week = dets._sweek;
+ var length = dets._length || 0;
+
+ if (scheduler._mode == "month") {
+ zdy = parseInt(evs[i].offsetHeight, 10);
+ zy = parseInt(evs[i].style.top, 10) - scheduler.xy.month_head_height;
+
+ day = de_day(evs[i], day);
+ week = de_week(evs[i], week);
+ } else if (scheduler.matrix && scheduler.matrix[scheduler._mode]) {
+ day = 0;
+ var el = evs[i].parentNode.parentNode.parentNode;
+ week = el.rowIndex;
+ var dy_copy = dy;
+ dy = evs[i].parentNode.offsetHeight;
+ zy = y_norm(evs[i].style.top);
+ zy -= zy * 0.2;
+ dy = dy_copy;
+ } else {
+ if (evs[i].parentNode == scheduler._els.dhx_cal_data[0]) continue;
+ var parent = scheduler._els["dhx_cal_data"][0].childNodes[0];
+ var offset = parseFloat(parent.className.indexOf("dhx_scale_holder") != -1 ? parent.style.left : 0);
+ zx += x_norm(evs[i].parentNode.style.left, offset);
+ }
+
+ xml += "\n<event week='" + week + "' day='" + day + "' type='" + e_type + "' x='" + zx + "' y='" + zy + "' width='" + zdx + "' height='" + zdy + "' len='" + length + "'>";
+
+ if (e_type == "event") {
+ xml += "<header><![CDATA[" + clean_html(evs[i].childNodes[1].innerHTML) + "]]></header>";
+ var text_color = colors ? get_style(evs[i].childNodes[2], "color") : "";
+ var bg_color = colors ? get_style(evs[i].childNodes[2], "backgroundColor") : "";
+ xml += "<body backgroundColor='" + bg_color + "' color='" + text_color + "'><![CDATA[" + clean_html(evs[i].childNodes[2].innerHTML) + "]]></body>";
+ } else {
+ var text_color = colors ? get_style(evs[i], "color") : "";
+ var bg_color = colors ? get_style(evs[i], "backgroundColor") : "";
+ xml += "<body backgroundColor='" + bg_color + "' color='" + text_color + "'><![CDATA[" + clean_html(evs[i].innerHTML) + "]]></body>";
+ }
+ xml += "</event>";
+ }
+ }
+
+ return xml;
+ }
+
+ function to_pdf(start, end, view, url, mode, header, footer) {
+ var colors = false;
+ if (mode == "fullcolor") {
+ colors = true;
+ mode = "color";
+ }
+
+ mode = mode || "color";
+
+ var uid = scheduler.uid();
+ var d = document.createElement("div");
+ d.style.display = "none";
+ document.body.appendChild(d);
+
+ d.innerHTML = '<form id="' + uid + '" method="post" target="_blank" action="' + url + '" accept-charset="utf-8" enctype="application/x-www-form-urlencoded"><input type="hidden" name="mycoolxmlbody"/> </form>';
+
+
+ var xml = "";
+ if (start) {
+ var original_date = scheduler._date;
+ var original_mode = scheduler._mode;
+ end = scheduler.date[view+"_start"](end);
+ end = scheduler.date["get_"+view+"_end"] ? scheduler.date["get_"+view+"_end"](end) : scheduler.date.add(end, 1, view);
+
+ xml = xml_top("pages", mode, header, footer);
+ for (var temp_date = new Date(start); +temp_date < +end; temp_date = scheduler.date.add(temp_date, 1, view)) {
+ scheduler.setCurrentView(temp_date, view);
+ xml += xml_start("page") + xml_body_header().replace("\u2013", "-") + xml_body(colors) + xml_end("page");
+ }
+ xml += xml_end("pages");
+
+ scheduler.setCurrentView(original_date, original_mode);
+ } else {
+ xml = xml_top("data", mode, header, footer) + xml_body_header().replace("\u2013", "-") + xml_body(colors) + xml_end("data");
+ }
+
+
+ document.getElementById(uid).firstChild.value = encodeURIComponent(xml);
+ document.getElementById(uid).submit();
+ d.parentNode.removeChild(d);
+ }
+
+ scheduler.toPDF = function(url, mode, header, footer) {
+ return to_pdf.apply(this, [null, null, null, url, mode, header, footer]);
+ };
+ scheduler.toPDFRange = function(start, end, view, url, mode, header, footer) {
+ if (typeof start == "string") {
+ start = scheduler.templates.api_date(start);
+ end = scheduler.templates.api_date(end);
+ }
+
+ return to_pdf.apply(this, arguments);
+ };
+})();
diff --git a/codebase/sources/ext/dhtmlxscheduler_pdf.js.map b/codebase/sources/ext/dhtmlxscheduler_pdf.js.map
new file mode 100644
index 0000000..0d4607e
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_pdf.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_pdf.js.map","sources":["dhtmlxscheduler_pdf.js"],"names":["clean_html","val","replace","newline_regexp","html_regexp","x_norm","x","offset","parseFloat","isNaN","w","colsWidth","width","cols","dx","x_norm_event","is_left","r","header","scheduler","_els","dhx_cal_header","childNodes","els","i","length","el","style","parentNode","y_norm","y","dy","get_style","node","window","getComputedStyle","currentStyle","de_day","n","parseInt","left","_cols","de_week","top","_colsS","heights","xml_start","tag","xml_end","xml_top","profile","footer","xml","xml_body_header","mode","_mode","matrix","render","dhx_cal_date","innerHTML","xh","dhx_cal_data","getElementsByTagName","className","xml_month_scale","xml_month","yh","firstChild","rows","cells","offsetHeight","tagName","indexOf","previousSibling","days","j","push","join","xhs","second_scale","offsetWidth","top_width","top_col","xml_body","colors","evs","_rendered","getAttribute","get_visible_events","d","start_date","valueOf","_min_date","end_date","m","getMonth","getFullYear","week_starts","_month","day","getDate","text_color","_get_year_cell","bg_color","Math","floor","date","add","_max_date","zx","zdx","left_norm","config","use_select_menu_space","zy","zdy","height","e_type","split","dets","getEvent","_sday","week","_sweek","_length","xy","month_head_height","rowIndex","dy_copy","parent","to_pdf","start","end","view","url","uid","document","createElement","display","body","appendChild","original_date","_date","original_mode","temp_date","Date","setCurrentView","getElementById","value","encodeURIComponent","submit","removeChild","RegExp","toPDF","apply","this","toPDFRange","templates","api_date","arguments"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_quick_info.js b/codebase/sources/ext/dhtmlxscheduler_quick_info.js
new file mode 100644
index 0000000..08fc7bb
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_quick_info.js
@@ -0,0 +1,199 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.config.icons_select = ["icon_details", "icon_delete"];
+scheduler.config.details_on_create = true;
+scheduler.xy.menu_width = 0;
+
+scheduler.attachEvent("onClick", function(id){
+ scheduler.showQuickInfo(id);
+ return true;
+});
+
+(function(){
+ var events = ["onEmptyClick", "onViewChange", "onLightbox", "onBeforeEventDelete", "onBeforeDrag"];
+ var hiding_function = function(){
+ scheduler._hideQuickInfo();
+ return true;
+ };
+ for (var i=0; i<events.length; i++)
+ scheduler.attachEvent(events[i], hiding_function);
+})();
+
+scheduler.templates.quick_info_title = function(start, end, ev){ return ev.text.substr(0,50); };
+scheduler.templates.quick_info_content = function(start, end, ev){ return ev.details || ev.text; };
+scheduler.templates.quick_info_date = function(start, end, ev){
+ if (scheduler.isOneDayEvent(ev))
+ return scheduler.templates.day_date(start, end, ev) + " " +scheduler.templates.event_header(start, end, ev);
+ else
+ return scheduler.templates.week_date(start, end, ev);
+};
+
+scheduler.showQuickInfo = function(id){
+ if (id == this._quick_info_box_id) return;
+ this.hideQuickInfo(true);
+
+ var pos = this._get_event_counter_part(id);
+
+ if (pos){
+ this._quick_info_box = this._init_quick_info(pos);
+ this._fill_quick_data(id);
+ this._show_quick_info(pos);
+ }
+};
+scheduler._hideQuickInfo = function(){
+ scheduler.hideQuickInfo();
+};
+scheduler.hideQuickInfo = function(forced){
+ var qi = this._quick_info_box;
+ this._quick_info_box_id = 0;
+
+ if (qi && qi.parentNode){
+ if (scheduler.config.quick_info_detached)
+ return qi.parentNode.removeChild(qi);
+
+ if (qi.style.right == "auto")
+ qi.style.left = "-350px";
+ else
+ qi.style.right = "-350px";
+
+ if (forced)
+ qi.parentNode.removeChild(qi);
+ }
+};
+dhtmlxEvent(window, "keydown", function(e){
+ if (e.keyCode == 27)
+ scheduler.hideQuickInfo();
+});
+
+scheduler._show_quick_info = function(pos){
+ var qi = scheduler._quick_info_box;
+
+ if (scheduler.config.quick_info_detached){
+ scheduler._obj.appendChild(qi);
+ var width = qi.offsetWidth;
+ var height = qi.offsetHeight;
+
+ qi.style.left = pos.left - pos.dx*(width - pos.width) + "px";
+ qi.style.top = pos.top - (pos.dy?height:-pos.height) + "px";
+ } else {
+ qi.style.top = this.xy.scale_height+this.xy.nav_height + 20 + "px";
+ if (pos.dx == 1){
+ qi.style.right = "auto";
+ qi.style.left = "-300px";
+
+ setTimeout(function(){
+ qi.style.left = "-10px";
+ },1);
+ } else {
+ qi.style.left = "auto";
+ qi.style.right = "-300px";
+
+ setTimeout(function(){
+ qi.style.right = "-10px";
+ },1);
+ }
+ qi.className = qi.className.replace("dhx_qi_left","").replace("dhx_qi_left","")+" dhx_qi_"+(pos==1?"left":"right");
+ scheduler._obj.appendChild(qi);
+ }
+};
+scheduler.attachEvent("onTemplatesReady", function(){
+ scheduler.hideQuickInfo();
+ if(this._quick_info_box){
+ var box = this._quick_info_box;
+ if(box.parentNode){
+ box.parentNode.removeChild(box);
+ }
+ this._quick_info_box = null;
+ }
+});
+scheduler._quick_info_onscroll_handler = function(e){
+ scheduler.hideQuickInfo();
+};
+scheduler._init_quick_info = function(){
+ if (!this._quick_info_box){
+ var sizes = scheduler.xy;
+
+ var qi = this._quick_info_box = document.createElement("div");
+ qi.className = "dhx_cal_quick_info";
+ if (scheduler.$testmode)
+ qi.className += " dhx_no_animate";
+ //title
+ var html = "<div class=\"dhx_cal_qi_title\" style=\"height:"+sizes.quick_info_title+"px\">" +
+ "<div class=\"dhx_cal_qi_tcontent\"></div><div class=\"dhx_cal_qi_tdate\"></div>" +
+ "</div>" +
+ "<div class=\"dhx_cal_qi_content\"></div>";
+
+ //buttons
+ html += "<div class=\"dhx_cal_qi_controls\" style=\"height:"+sizes.quick_info_buttons+"px\">";
+ var buttons = scheduler.config.icons_select;
+ for (var i = 0; i < buttons.length; i++)
+ html += "<div class=\"dhx_qi_big_icon "+buttons[i]+"\" title=\""+scheduler.locale.labels[buttons[i]]+"\"><div class='dhx_menu_icon " + buttons[i] + "'></div><div>"+scheduler.locale.labels[buttons[i]]+"</div></div>";
+ html += "</div>";
+
+ qi.innerHTML = html;
+ dhtmlxEvent(qi, "click", function(ev){
+ ev = ev || event;
+ scheduler._qi_button_click(ev.target || ev.srcElement);
+ });
+ if (scheduler.config.quick_info_detached){
+ scheduler._detachDomEvent(scheduler._els["dhx_cal_data"][0], "scroll", scheduler._quick_info_onscroll_handler);
+ dhtmlxEvent(scheduler._els["dhx_cal_data"][0], "scroll", scheduler._quick_info_onscroll_handler);
+ }
+ }
+
+ return this._quick_info_box;
+};
+
+scheduler._qi_button_click = function(node){
+ var box = scheduler._quick_info_box;
+ if (!node || node == box) return;
+
+ var mask = node.className;
+ if (mask.indexOf("_icon")!=-1){
+ var id = scheduler._quick_info_box_id;
+ scheduler._click.buttons[mask.split(" ")[1].replace("icon_","")](id);
+ } else
+ scheduler._qi_button_click(node.parentNode);
+};
+scheduler._get_event_counter_part = function(id){
+ var domEv = scheduler.getRenderedEvent(id);
+ var left = 0;
+ var top = 0;
+
+ var node = domEv;
+ while (node && node != scheduler._obj){
+ left += node.offsetLeft;
+ top += node.offsetTop-node.scrollTop;
+ node = node.offsetParent;
+ }
+ if(node){
+ var dx = (left + domEv.offsetWidth/2) > (scheduler._x/2) ? 1 : 0;
+ var dy = (top + domEv.offsetHeight/2) > (scheduler._y/2) ? 1 : 0;
+
+ return { left:left, top:top, dx:dx, dy:dy,
+ width:domEv.offsetWidth, height:domEv.offsetHeight };
+ }
+ return 0;
+};
+
+scheduler._fill_quick_data = function(id){
+ var ev = scheduler.getEvent(id);
+ var qi = scheduler._quick_info_box;
+
+ scheduler._quick_info_box_id = id;
+
+//title content
+ var titleContent = qi.firstChild.firstChild;
+ titleContent.innerHTML = scheduler.templates.quick_info_title(ev.start_date, ev.end_date, ev);
+ var titleDate = titleContent.nextSibling;
+ titleDate.innerHTML = scheduler.templates.quick_info_date(ev.start_date, ev.end_date, ev);
+
+//main content
+ var main = qi.firstChild.nextSibling;
+ main.innerHTML = scheduler.templates.quick_info_content(ev.start_date, ev.end_date, ev);
+};
diff --git a/codebase/sources/ext/dhtmlxscheduler_quick_info.js.map b/codebase/sources/ext/dhtmlxscheduler_quick_info.js.map
new file mode 100644
index 0000000..65165d0
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_quick_info.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_quick_info.js.map","sources":["dhtmlxscheduler_quick_info.js"],"names":["scheduler","config","icons_select","details_on_create","xy","menu_width","attachEvent","id","showQuickInfo","events","hiding_function","_hideQuickInfo","i","length","templates","quick_info_title","start","end","ev","text","substr","quick_info_content","details","quick_info_date","isOneDayEvent","day_date","event_header","week_date","this","_quick_info_box_id","hideQuickInfo","pos","_get_event_counter_part","_quick_info_box","_init_quick_info","_fill_quick_data","_show_quick_info","forced","qi","parentNode","quick_info_detached","removeChild","style","right","left","dhtmlxEvent","window","e","keyCode","_obj","appendChild","width","offsetWidth","height","offsetHeight","dx","top","dy","scale_height","nav_height","setTimeout","className","replace","box","_quick_info_onscroll_handler","sizes","document","createElement","$testmode","html","quick_info_buttons","buttons","locale","labels","innerHTML","event","_qi_button_click","target","srcElement","_detachDomEvent","_els","node","mask","indexOf","_click","split","domEv","getRenderedEvent","offsetLeft","offsetTop","scrollTop","offsetParent","_x","_y","getEvent","titleContent","firstChild","start_date","end_date","titleDate","nextSibling","main"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_readonly.js b/codebase/sources/ext/dhtmlxscheduler_readonly.js
new file mode 100644
index 0000000..462d878
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_readonly.js
@@ -0,0 +1,160 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.attachEvent("onTemplatesReady", function() {
+ var original_sns = scheduler.config.lightbox.sections.slice();
+ var original_left_buttons = scheduler.config.buttons_left.slice();
+ var original_right_buttons = scheduler.config.buttons_right.slice();
+
+
+ scheduler.attachEvent("onBeforeLightbox", function(id) {
+ if (this.config.readonly_form || this.getEvent(id).readonly) {
+ this.config.readonly_active = true;
+
+ for (var i = 0; i < this.config.lightbox.sections.length; i++) {
+ this.config.lightbox.sections[i].focus = false;
+ }
+ }
+ else {
+ this.config.readonly_active = false;
+ scheduler.config.lightbox.sections = original_sns.slice(); // restore original list of sections including recurring
+ scheduler.config.buttons_left = original_left_buttons.slice();
+ scheduler.config.buttons_right = original_right_buttons.slice();
+ }
+
+ var sns = this.config.lightbox.sections;
+ if (this.config.readonly_active) {
+ for (var i = 0; i < sns.length; i++) {
+ if (sns[i].type == 'recurring') {
+ if (this.config.readonly_active) {
+ sns.splice(i, 1);
+ }
+ break;
+ }
+ }
+
+ var forbidden_buttons = ["dhx_delete_btn", "dhx_save_btn"];
+ var button_arrays = [scheduler.config.buttons_left, scheduler.config.buttons_right];
+ for (var i = 0; i < forbidden_buttons.length; i++) {
+ var forbidden_button = forbidden_buttons[i];
+ for (var k = 0; k < button_arrays.length; k++) {
+ var button_array = button_arrays[k];
+ var index = -1;
+ for (var p = 0; p < button_array.length; p++) {
+ if (button_array[p] == forbidden_button) {
+ index = p;
+ break;
+ }
+ }
+ if (index != -1) {
+ button_array.splice(index, 1);
+ }
+ }
+ }
+
+
+ }
+
+ this.resetLightbox();
+
+ return true;
+ });
+
+ function txt_replace(tag, d, n, text) {
+ var txts = d.getElementsByTagName(tag);
+ var txtt = n.getElementsByTagName(tag);
+ for (var i = txtt.length - 1; i >= 0; i--) {
+ var n = txtt[i];
+ if (!text){
+ n.disabled = true;
+ //radio and checkboxes loses state after .cloneNode in IE
+ if(d.checked)
+ n.checked = true;
+ }else {
+ var t = document.createElement("SPAN");
+ t.className = "dhx_text_disabled";
+ t.innerHTML = text(txts[i]);
+ n.parentNode.insertBefore(t, n);
+ n.parentNode.removeChild(n);
+ }
+ }
+ }
+
+ var old = scheduler._fill_lightbox;
+ scheduler._fill_lightbox = function() {
+
+ var lb = this.getLightbox();
+ if (this.config.readonly_active) {
+ lb.style.visibility = 'hidden';
+ // lightbox should have actual sizes before rendering controls
+ // currently only matters for dhtmlxCombo
+ lb.style.display = 'block';
+ }
+ var res = old.apply(this, arguments);
+ if (this.config.readonly_active) {
+ //reset visibility and display
+ lb.style.visibility = '';
+ lb.style.display = 'none';
+ }
+
+ if (this.config.readonly_active) {
+
+ var d = this.getLightbox();
+ var n = this._lightbox_r = d.cloneNode(true);
+ n.id = scheduler.uid();
+
+ txt_replace("textarea", d, n, function(a) {
+ return a.value;
+ });
+ txt_replace("input", d, n, false);
+ txt_replace("select", d, n, function(a) {
+ if(!a.options.length) return "";
+ return a.options[Math.max((a.selectedIndex || 0), 0)].text;
+ });
+
+ d.parentNode.insertBefore(n, d);
+
+ olds.call(this, n);
+ if (scheduler._lightbox)
+ scheduler._lightbox.parentNode.removeChild(scheduler._lightbox);
+ this._lightbox = n;
+
+ if (scheduler.config.drag_lightbox)
+ n.firstChild.onmousedown = scheduler._ready_to_dnd;
+ this.setLightboxSize();
+ n.onclick = function(e) {
+ var src = e ? e.target : event.srcElement;
+ if (!src.className) src = src.previousSibling;
+ if (src && src.className)
+ switch (src.className) {
+ case "dhx_cancel_btn":
+ scheduler.callEvent("onEventCancel", [scheduler._lightbox_id]);
+ scheduler._edit_stop_event(scheduler.getEvent(scheduler._lightbox_id), false);
+ scheduler.hide_lightbox();
+ break;
+ }
+ };
+ }
+ return res;
+ };
+
+ var olds = scheduler.showCover;
+ scheduler.showCover = function() {
+ if (!this.config.readonly_active)
+ olds.apply(this, arguments);
+ };
+
+ var hold = scheduler.hide_lightbox;
+ scheduler.hide_lightbox = function() {
+ if (this._lightbox_r) {
+ this._lightbox_r.parentNode.removeChild(this._lightbox_r);
+ this._lightbox_r = this._lightbox = null;
+ }
+
+ return hold.apply(this, arguments);
+ };
+});
diff --git a/codebase/sources/ext/dhtmlxscheduler_readonly.js.map b/codebase/sources/ext/dhtmlxscheduler_readonly.js.map
new file mode 100644
index 0000000..8ce874d
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_readonly.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_readonly.js.map","sources":["dhtmlxscheduler_readonly.js"],"names":["scheduler","attachEvent","txt_replace","tag","d","n","text","txts","getElementsByTagName","txtt","i","length","t","document","createElement","className","innerHTML","parentNode","insertBefore","removeChild","disabled","checked","original_sns","config","lightbox","sections","slice","original_left_buttons","buttons_left","original_right_buttons","buttons_right","id","this","readonly_form","getEvent","readonly","readonly_active","focus","sns","type","splice","forbidden_buttons","button_arrays","forbidden_button","k","button_array","index","p","resetLightbox","old","_fill_lightbox","lb","getLightbox","style","visibility","display","res","apply","arguments","_lightbox_r","cloneNode","uid","a","value","options","Math","max","selectedIndex","olds","call","_lightbox","drag_lightbox","firstChild","onmousedown","_ready_to_dnd","setLightboxSize","onclick","e","src","target","event","srcElement","previousSibling","callEvent","_lightbox_id","_edit_stop_event","hide_lightbox","showCover","hold"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_recurring.js b/codebase/sources/ext/dhtmlxscheduler_recurring.js
new file mode 100644
index 0000000..ad4a7a0
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_recurring.js
@@ -0,0 +1,818 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.config.occurrence_timestamp_in_utc = false;
+scheduler.config.recurring_workdays = [1,2,3,4,5];
+scheduler.form_blocks["recurring"] = {
+ render:function(sns) {
+ return scheduler.__recurring_template;
+ },
+ _ds: {},
+ _init_set_value:function(node, value, ev) {
+ scheduler.form_blocks["recurring"]._ds = {start:ev.start_date, end:ev._end_date};
+
+ var str_date_format = scheduler.date.str_to_date(scheduler.config.repeat_date);
+ var str_date = function(str_date) {
+ var date = str_date_format(str_date);
+ if (scheduler.config.include_end_by)
+ date = scheduler.date.add(date, 1, 'day');
+ return date;
+ };
+
+ var date_str = scheduler.date.date_to_str(scheduler.config.repeat_date);
+
+ var top = node.getElementsByTagName("FORM")[0];
+ var els = [];
+
+ function register_els(inps) {
+ for (var i = 0; i < inps.length; i++) {
+ var inp = inps[i];
+ if (inp.type == "checkbox" || inp.type == "radio") {
+ if (!els[inp.name])
+ els[inp.name] = [];
+ els[inp.name].push(inp);
+ } else
+ els[inp.name] = inp;
+ }
+ }
+
+ register_els(top.getElementsByTagName("INPUT"));
+ register_els(top.getElementsByTagName("SELECT"));
+
+ if (!scheduler.config.repeat_date_of_end) {
+ var formatter = scheduler.date.date_to_str(scheduler.config.repeat_date);
+ scheduler.config.repeat_date_of_end = formatter(scheduler.date.add(scheduler._currentDate(), 30, "day"));
+ }
+ els["date_of_end"].value = scheduler.config.repeat_date_of_end;
+
+ var $ = function(a) {
+ return document.getElementById(a);
+ };
+
+ function get_radio_value(name) {
+ var col = els[name];
+ for (var i = 0; i < col.length; i++)
+ if (col[i].checked) return col[i].value;
+ }
+
+ function change_current_view() {
+ $("dhx_repeat_day").style.display = "none";
+ $("dhx_repeat_week").style.display = "none";
+ $("dhx_repeat_month").style.display = "none";
+ $("dhx_repeat_year").style.display = "none";
+ $("dhx_repeat_" + this.value).style.display = "block";
+ }
+
+ function get_repeat_code(dates) {
+ var code = [get_radio_value("repeat")];
+ get_rcode[code[0]](code, dates);
+
+ while (code.length < 5) code.push("");
+ var repeat = "";
+ if (els["end"][0].checked) {
+ dates.end = new Date(9999, 1, 1);
+ repeat = "no";
+ }
+ else if (els["end"][2].checked) {
+ dates.end = str_date(els["date_of_end"].value);
+ }
+ else {
+ scheduler.transpose_type(code.join("_"));
+ repeat = Math.max(1, els["occurences_count"].value);
+ var transp = ((code[0] == "week" && code[4] && code[4].toString().indexOf(scheduler.config.start_on_monday ? 1 : 0) == -1) ? 1 : 0);
+ dates.end = scheduler.date.add(new Date(dates.start), repeat + transp, code.join("_"));
+ }
+
+ return code.join("_") + "#" + repeat;
+ }
+
+ scheduler.form_blocks["recurring"]._get_repeat_code = get_repeat_code;
+ var get_rcode = {
+ month:function(code, dates) {
+ if (get_radio_value("month_type") == "d") {
+ code.push(Math.max(1, els["month_count"].value));
+ dates.start.setDate(els["month_day"].value);
+ } else {
+ code.push(Math.max(1, els["month_count2"].value));
+ code.push(els["month_day2"].value);
+ code.push(Math.max(1, els["month_week2"].value));
+ if (!scheduler.config.repeat_precise){
+ dates.start.setDate(1);
+ }
+ }
+ dates._start = true;
+ },
+ week:function(code, dates) {
+ code.push(Math.max(1, els["week_count"].value));
+ code.push("");
+ code.push("");
+ var t = [];
+ var col = els["week_day"];
+ var day = dates.start.getDay();
+ var start_exists = false;
+
+ for (var i = 0; i < col.length; i++){
+ if (col[i].checked) {
+ t.push(col[i].value);
+ start_exists = start_exists || col[i].value == day;
+ }
+ }
+ if (!t.length){
+ t.push(day);
+ start_exists = true;
+ }
+ t.sort();
+
+
+ if (!scheduler.config.repeat_precise){
+ dates.start = scheduler.date.week_start(dates.start);
+ dates._start = true;
+ } else if (!start_exists){
+ scheduler.transpose_day_week(dates.start, t, 1, 7);
+ dates._start = true;
+ }
+
+ code.push(t.join(","));
+ },
+ day:function(code) {
+ if (get_radio_value("day_type") == "d") {
+ code.push(Math.max(1, els["day_count"].value));
+ }
+ else {
+ code.push("week");
+ code.push(1);
+ code.push("");
+ code.push("");
+ code.push(scheduler.config.recurring_workdays.join(","));
+ code.splice(0, 1);
+ }
+ },
+ year:function(code, dates) {
+ if (get_radio_value("year_type") == "d") {
+ code.push("1");
+ dates.start.setMonth(0);
+ dates.start.setDate(els["year_day"].value);
+ dates.start.setMonth(els["year_month"].value);
+
+ } else {
+ code.push("1");
+ code.push(els["year_day2"].value);
+ code.push(els["year_week2"].value);
+ dates.start.setDate(1);
+ dates.start.setMonth(els["year_month2"].value);
+ }
+ dates._start = true;
+ }
+ };
+ var set_rcode = {
+ week:function(code, dates) {
+ els["week_count"].value = code[1];
+ var col = els["week_day"];
+ var t = code[4].split(",");
+ var d = {};
+ for (var i = 0; i < t.length; i++) d[t[i]] = true;
+ for (var i = 0; i < col.length; i++)
+ col[i].checked = (!!d[col[i].value]);
+ },
+ month:function(code, dates) {
+ if (code[2] === "") {
+ els["month_type"][0].checked = true;
+ els["month_count"].value = code[1];
+ els["month_day"].value = dates.start.getDate();
+ } else {
+ els["month_type"][1].checked = true;
+ els["month_count2"].value = code[1];
+ els["month_week2"].value = code[3];
+ els["month_day2"].value = code[2];
+ }
+ },
+ day:function(code, dates) {
+ els["day_type"][0].checked = true;
+ els["day_count"].value = code[1];
+ },
+ year:function(code, dates) {
+ if (code[2] === "") {
+ els["year_type"][0].checked = true;
+ els["year_day"].value = dates.start.getDate();
+ els["year_month"].value = dates.start.getMonth();
+ } else {
+ els["year_type"][1].checked = true;
+ els["year_week2"].value = code[3];
+ els["year_day2"].value = code[2];
+ els["year_month2"].value = dates.start.getMonth();
+ }
+ }
+ };
+
+ function set_repeat_code(code, dates) {
+ var data = code.split("#");
+ code = data[0].split("_");
+ set_rcode[code[0]](code, dates);
+ var e = els["repeat"][({day:0, week:1, month:2, year:3})[code[0]]];
+ switch (data[1]) {
+ case "no":
+ els["end"][0].checked = true;
+ break;
+ case "":
+ els["end"][2].checked = true;
+
+ var end_date = dates.end;
+ if (scheduler.config.include_end_by){
+ end_date = scheduler.date.add(end_date, -1, 'day');
+ }
+
+ els["date_of_end"].value = date_str(end_date);
+ break;
+ default:
+ els["end"][1].checked = true;
+ els["occurences_count"].value = data[1];
+ break;
+ }
+
+ e.checked = true;
+ e.onclick();
+ }
+
+ scheduler.form_blocks["recurring"]._set_repeat_code = set_repeat_code;
+
+ for (var i = 0; i < top.elements.length; i++) {
+ var el = top.elements[i];
+ switch (el.name) {
+ case "repeat":
+ el.onclick = change_current_view;
+ break;
+ }
+ }
+ scheduler._lightbox._rec_init_done = true;
+ },
+ set_value:function(node, value, ev) {
+ var rf = scheduler.form_blocks["recurring"];
+ if (!scheduler._lightbox._rec_init_done)
+ rf._init_set_value(node, value, ev);
+ node.open = !ev.rec_type;
+ if (this._is_modified_occurence(ev))
+ node.blocked = true;
+ else node.blocked = false;
+
+ var ds = rf._ds;
+ ds.start = ev.start_date;
+ ds.end = ev._end_date;
+
+ rf.button_click(0, node.previousSibling.firstChild.firstChild, node, node);
+ if (value)
+ rf._set_repeat_code(value, ds);
+ },
+ get_value:function(node, ev) {
+ if (node.open) {
+ var ds = scheduler.form_blocks["recurring"]._ds;
+ var actual_dates = {};
+ this.formSection('time').getValue(actual_dates);
+ ds.start = actual_dates.start_date;
+ ev.rec_type = scheduler.form_blocks["recurring"]._get_repeat_code(ds);
+ if (ds._start) {
+ ev.start_date = new Date(ds.start);
+ ev._start_date = new Date(ds.start);
+ ds._start = false;
+ } else
+ ev._start_date = null;
+
+ ev._end_date = ds.end;
+ ev.rec_pattern = ev.rec_type.split("#")[0];
+ } else {
+ ev.rec_type = ev.rec_pattern = "";
+ ev._end_date = ev.end_date;
+ }
+ return ev.rec_type;
+ },
+ focus:function(node) {
+ },
+ button_click:function(index, el, section, cont) {
+ if (!cont.open && !cont.blocked) {
+ cont.style.height = "115px";
+ el.style.backgroundPosition = "-5px 0px";
+ el.nextSibling.innerHTML = scheduler.locale.labels.button_recurring_open;
+ } else {
+ cont.style.height = "0px";
+ el.style.backgroundPosition = "-5px 20px";
+ el.nextSibling.innerHTML = scheduler.locale.labels.button_recurring;
+ }
+ cont.open = !cont.open;
+
+ scheduler.setLightboxSize();
+ }
+};
+
+
+//problem may occur if we will have two repeating events in the same moment of time
+scheduler._rec_markers = {};
+scheduler._rec_markers_pull = {};
+scheduler._add_rec_marker = function(ev, time) {
+ ev._pid_time = time;
+ this._rec_markers[ev.id] = ev;
+ if (!this._rec_markers_pull[ev.event_pid]) this._rec_markers_pull[ev.event_pid] = {};
+ this._rec_markers_pull[ev.event_pid][time] = ev;
+};
+scheduler._get_rec_marker = function(time, id) {
+ var ch = this._rec_markers_pull[id];
+ if (ch) return ch[time];
+ return null;
+};
+scheduler._get_rec_markers = function(id) {
+ return (this._rec_markers_pull[id] || []);
+};
+scheduler._rec_temp = [];
+(function() {
+ var old_add_event = scheduler.addEvent;
+ scheduler.addEvent = function(start_date, end_date, text, id, extra_data) {
+ var ev_id = old_add_event.apply(this, arguments);
+
+ if (ev_id) {
+ var ev = scheduler.getEvent(ev_id);
+ if (this._is_modified_occurence(ev))
+ scheduler._add_rec_marker(ev, ev.event_length * 1000);
+ if (ev.rec_type)
+ ev.rec_pattern = ev.rec_type.split("#")[0];
+ }
+ return ev_id;
+ };
+})();
+scheduler.attachEvent("onEventIdChange", function(id, new_id) {
+ if (this._ignore_call) return;
+ this._ignore_call = true;
+
+ if(scheduler._rec_markers[id]){
+ //important for for correct work of scheduler.getEvents(from, to) and collision detection
+ scheduler._rec_markers[new_id] = scheduler._rec_markers[id];
+ delete scheduler._rec_markers[id];
+ }
+
+ for (var i = 0; i < this._rec_temp.length; i++) {
+ var tev = this._rec_temp[i];
+ if (tev.event_pid == id) {
+ tev.event_pid = new_id;
+ this.changeEventId(tev.id, new_id + "#" + tev.id.split("#")[1]);
+ }
+ }
+
+ delete this._ignore_call;
+});
+scheduler.attachEvent("onConfirmedBeforeEventDelete", function(id) {
+ var ev = this.getEvent(id);
+ if (this._is_virtual_event(id) || (this._is_modified_occurence(ev) && ev.rec_type && ev.rec_type != 'none')) {
+ id = id.split("#");
+ var nid = this.uid();
+ var tid = (id[1]) ? id[1] : (ev._pid_time / 1000);
+
+ var nev = this._copy_event(ev);
+ nev.id = nid;
+ nev.event_pid = ev.event_pid || id[0];
+ var timestamp = tid;
+ nev.event_length = timestamp;
+ nev.rec_type = nev.rec_pattern = "none";
+ this.addEvent(nev);
+
+ this._add_rec_marker(nev, timestamp * 1000);
+ } else {
+ if (ev.rec_type && this._lightbox_id)
+ this._roll_back_dates(ev);
+ var sub = this._get_rec_markers(id);
+ for (var i in sub) {
+ if (sub.hasOwnProperty(i)) {
+ id = sub[i].id;
+ if (this.getEvent(id))
+ this.deleteEvent(id, true);
+ }
+ }
+ }
+ return true;
+});
+scheduler.attachEvent("onEventDeleted", function(id, ev){
+ if(!this._is_virtual_event(id) && this._is_modified_occurence(ev)){
+ if(!scheduler._events[id]){
+ ev.rec_type = ev.rec_pattern = "none";
+ this.setEvent(id, ev);
+ }
+ }
+});
+scheduler.attachEvent("onEventChanged", function(id) {
+ if (this._loading) return true;
+
+ var ev = this.getEvent(id);
+
+ if (this._is_virtual_event(id)) {
+ var id = id.split("#");
+ var nid = this.uid();
+ this._not_render = true;
+
+ var nev = this._copy_event(ev);
+ nev.id = nid;
+ nev.event_pid = id[0];
+ var timestamp = id[1];
+ nev.event_length = timestamp;
+ nev.rec_type = nev.rec_pattern = "";
+
+ this._add_rec_marker(nev, timestamp * 1000);
+ this.addEvent(nev);
+
+ this._not_render = false;
+
+ } else {
+ if (ev.rec_type && this._lightbox_id)
+ this._roll_back_dates(ev);
+ var sub = this._get_rec_markers(id);
+ for (var i in sub) {
+ if (sub.hasOwnProperty(i)) {
+ delete this._rec_markers[sub[i].id];
+ this.deleteEvent(sub[i].id, true);
+ }
+ }
+ delete this._rec_markers_pull[id];
+
+ // it's possible that after editing event is no longer exists, in such case we need to remove _select_id flag
+ var isEventFound = false;
+ for (var k = 0; k < this._rendered.length; k++) {
+ if (this._rendered[k].getAttribute('event_id') == id)
+ isEventFound = true;
+ }
+ if (!isEventFound)
+ this._select_id = null;
+ }
+ return true;
+});
+scheduler.attachEvent("onEventAdded", function(id) {
+ if (!this._loading) {
+ var ev = this.getEvent(id);
+ if (ev.rec_type && !ev.event_length)
+ this._roll_back_dates(ev);
+ }
+ return true;
+});
+scheduler.attachEvent("onEventSave", function(id, data, is_new_event) {
+ var ev = this.getEvent(id);
+ if (!ev.rec_type && data.rec_type && !this._is_virtual_event(id))
+ this._select_id = null;
+ return true;
+});
+scheduler.attachEvent("onEventCreated", function(id) {
+ var ev = this.getEvent(id);
+ if (!ev.rec_type)
+ ev.rec_type = ev.rec_pattern = ev.event_length = ev.event_pid = "";
+ return true;
+});
+scheduler.attachEvent("onEventCancel", function(id) {
+ var ev = this.getEvent(id);
+ if (ev.rec_type) {
+ this._roll_back_dates(ev);
+ // a bit expensive, but we need to be sure that event re-rendered, because view can be corrupted by resize , during edit process
+ this.render_view_data();
+ }
+});
+scheduler._roll_back_dates = function(ev) {
+ ev.event_length = (ev.end_date.valueOf() - ev.start_date.valueOf()) / 1000;
+ ev.end_date = ev._end_date;
+ if (ev._start_date) {
+ ev.start_date.setMonth(0);
+ ev.start_date.setDate(ev._start_date.getDate());
+ ev.start_date.setMonth(ev._start_date.getMonth());
+ ev.start_date.setFullYear(ev._start_date.getFullYear());
+
+ }
+};
+
+scheduler._is_virtual_event = function(id){
+ return id.toString().indexOf("#") != -1;
+};
+scheduler._is_modified_occurence = function(ev){
+ return (ev.event_pid && ev.event_pid != "0");
+};
+
+scheduler._validId = function(id) {
+ return !this._is_virtual_event(id);
+};
+
+scheduler.showLightbox_rec = scheduler.showLightbox;
+scheduler.showLightbox = function(id) {
+ var locale = this.locale;
+ var c = scheduler.config.lightbox_recurring;
+ var ev = this.getEvent(id);
+ var pid = ev.event_pid;
+ var isVirtual = this._is_virtual_event(id);
+ if (isVirtual)
+ pid = id.split("#")[0];
+
+ // show series
+ var showSeries = function(id) {
+ var event = scheduler.getEvent(id);
+ event._end_date = event.end_date;
+ event.end_date = new Date(event.start_date.valueOf() + event.event_length * 1000);
+ return scheduler.showLightbox_rec(id); // editing series
+ };
+
+ if ( (pid || pid*1 === 0) && ev.rec_type) {
+ // direct API call on series id
+ return showSeries(id);
+ }
+ if ( !pid || pid === '0' || ( (!locale.labels.confirm_recurring || c == 'instance') || (c == 'series' && !isVirtual)) ) {
+ // editing instance or non recurring event
+ return this.showLightbox_rec(id);
+ }
+ if (c == 'ask') {
+ var that = this;
+ dhtmlx.modalbox({
+ text: locale.labels.confirm_recurring,
+ title: locale.labels.title_confirm_recurring,
+ width: "500px",
+ position: "middle",
+ buttons:[locale.labels.button_edit_series, locale.labels.button_edit_occurrence, locale.labels.icon_cancel],
+ callback: function(index) {
+ switch(+index) {
+ case 0:
+ return showSeries(pid);
+ case 1:
+ return that.showLightbox_rec(id);
+ case 2:
+ return;
+ }
+ }
+ });
+ } else {
+ showSeries(pid);
+ }
+};
+
+
+scheduler.get_visible_events_rec = scheduler.get_visible_events;
+scheduler.get_visible_events = function(only_timed) {
+ for (var i = 0; i < this._rec_temp.length; i++)
+ delete this._events[this._rec_temp[i].id];
+ this._rec_temp = [];
+
+ var stack = this.get_visible_events_rec(only_timed);
+ var out = [];
+ for (var i = 0; i < stack.length; i++) {
+ if (stack[i].rec_type) {
+ //deleted element of serie
+ if (stack[i].rec_pattern != "none")
+ this.repeat_date(stack[i], out);
+ }
+ else out.push(stack[i]);
+ }
+ return out;
+};
+
+
+(function() {
+ var old = scheduler.isOneDayEvent;
+ scheduler.isOneDayEvent = function(ev) {
+ if (ev.rec_type) return true;
+ return old.call(this, ev);
+ };
+ var old_update_event = scheduler.updateEvent;
+ scheduler.updateEvent = function(id) {
+ var ev = scheduler.getEvent(id);
+ if(ev && ev.rec_type){
+ //rec_type can be changed without the lightbox,
+ // make sure rec_pattern updated as well
+ ev.rec_pattern = (ev.rec_type || "").split("#")[0];
+ }
+ if (ev && ev.rec_type && !this._is_virtual_event(id)) {
+ scheduler.update_view();
+ } else {
+ old_update_event.call(this, id);
+ }
+ };
+})();
+
+scheduler.transponse_size = {
+ day:1, week:7, month:1, year:12
+};
+scheduler.date.day_week = function(sd, day, week) {
+ sd.setDate(1);
+ week = (week - 1) * 7;
+ var cday = sd.getDay();
+ var nday = day * 1 + week - cday + 1;
+ sd.setDate(nday <= week ? (nday + 7) : nday);
+};
+scheduler.transpose_day_week = function(sd, list, cor, size, cor2) {
+ var cday = (sd.getDay() || (scheduler.config.start_on_monday ? 7 : 0)) - cor;
+ for (var i = 0; i < list.length; i++) {
+ if (list[i] > cday)
+ return sd.setDate(sd.getDate() + list[i] * 1 - cday - (size ? cor : cor2));
+ }
+ this.transpose_day_week(sd, list, cor + size, null, cor);
+};
+scheduler.transpose_type = function(type) {
+ var f = "transpose_" + type;
+ if (!this.date[f]) {
+ var str = type.split("_");
+ var day = 60 * 60 * 24 * 1000;
+ var gf = "add_" + type;
+ var step = this.transponse_size[str[0]] * str[1];
+
+ if (str[0] == "day" || str[0] == "week") {
+ var days = null;
+ if (str[4]) {
+ days = str[4].split(",");
+ if (scheduler.config.start_on_monday) {
+ for (var i = 0; i < days.length; i++)
+ days[i] = (days[i] * 1) || 7;
+ days.sort();
+ }
+ }
+
+ this.date[f] = function(nd, td) {
+ var delta = Math.floor((td.valueOf() - nd.valueOf()) / (day * step));
+ if (delta > 0)
+ nd.setDate(nd.getDate() + delta * step);
+ if (days)
+ scheduler.transpose_day_week(nd, days, 1, step);
+ };
+ this.date[gf] = function(sd, inc) {
+ var nd = new Date(sd.valueOf());
+ if (days) {
+ for (var count = 0; count < inc; count++)
+ scheduler.transpose_day_week(nd, days, 0, step);
+ } else
+ nd.setDate(nd.getDate() + inc * step);
+
+ return nd;
+ };
+ }
+ else if (str[0] == "month" || str[0] == "year") {
+ this.date[f] = function(nd, td) {
+ var delta = Math.ceil(((td.getFullYear() * 12 + td.getMonth() * 1) - (nd.getFullYear() * 12 + nd.getMonth() * 1)) / (step));
+ if (delta >= 0)
+ nd.setMonth(nd.getMonth() + delta * step);
+ if (str[3])
+ scheduler.date.day_week(nd, str[2], str[3]);
+ };
+ this.date[gf] = function(sd, inc) {
+ var nd = new Date(sd.valueOf());
+ nd.setMonth(nd.getMonth() + inc * step);
+ if (str[3])
+ scheduler.date.day_week(nd, str[2], str[3]);
+ return nd;
+ };
+ }
+ }
+};
+scheduler.repeat_date = function(ev, stack, non_render, from, to) {
+
+ from = from || this._min_date;
+ to = to || this._max_date;
+
+ var td = new Date(ev.start_date.valueOf());
+
+ if (!ev.rec_pattern && ev.rec_type)
+ ev.rec_pattern = ev.rec_type.split("#")[0];
+
+ this.transpose_type(ev.rec_pattern);
+ scheduler.date["transpose_" + ev.rec_pattern](td, from);
+ while (td < ev.start_date || scheduler._fix_daylight_saving_date(td,from,ev,td,new Date(td.valueOf() + ev.event_length * 1000)).valueOf() <= from.valueOf() || td.valueOf() + ev.event_length * 1000 <= from.valueOf())
+ td = this.date.add(td, 1, ev.rec_pattern);
+ while (td < to && td < ev.end_date) {
+ var timestamp = (scheduler.config.occurrence_timestamp_in_utc) ? Date.UTC(td.getFullYear(), td.getMonth(), td.getDate(), td.getHours(), td.getMinutes(), td.getSeconds()) : td.valueOf();
+ var ch = this._get_rec_marker(timestamp, ev.id);
+ if (!ch) { // unmodified element of series
+ var ted = new Date(td.valueOf() + ev.event_length * 1000);
+ var copy = this._copy_event(ev);
+ //copy._timed = ev._timed;
+ copy.text = ev.text;
+ copy.start_date = td;
+ copy.event_pid = ev.id;
+ copy.id = ev.id + "#" + Math.ceil(timestamp / 1000);
+ copy.end_date = ted;
+
+ copy.end_date = scheduler._fix_daylight_saving_date(copy.start_date, copy.end_date, ev, td, copy.end_date);
+
+ copy._timed = this.isOneDayEvent(copy);
+
+ if (!copy._timed && !this._table_view && !this.config.multi_day) return;
+ stack.push(copy);
+
+ if (!non_render) {
+ this._events[copy.id] = copy;
+ this._rec_temp.push(copy);
+ }
+
+ } else
+ if (non_render) stack.push(ch);
+
+ td = this.date.add(td, 1, ev.rec_pattern);
+ }
+};
+scheduler._fix_daylight_saving_date = function(start_date, end_date, ev, counter, default_date) {
+ var shift = start_date.getTimezoneOffset() - end_date.getTimezoneOffset();
+ if (shift) {
+ if (shift > 0) {
+ // e.g. 24h -> 23h
+ return new Date(counter.valueOf() + ev.event_length * 1000 - shift * 60 * 1000);
+ }
+ else {
+ // e.g. 24h -> 25h
+ return new Date(end_date.valueOf() - shift * 60 * 1000);
+ }
+ }
+ return new Date(default_date.valueOf());
+};
+scheduler.getRecDates = function(id, max) {
+ var ev = typeof id == "object" ? id : scheduler.getEvent(id);
+ var count = 0;
+ var result = [];
+ max = max || 100;
+
+ var td = new Date(ev.start_date.valueOf());
+ var from = new Date(td.valueOf());
+
+ if (!ev.rec_type) {
+ return [
+ { start_date: ev.start_date, end_date: ev.end_date }
+ ];
+ }
+ if (ev.rec_type == "none") {
+ return [];
+ }
+ this.transpose_type(ev.rec_pattern);
+ scheduler.date["transpose_" + ev.rec_pattern](td, from);
+
+ while (td < ev.start_date || (td.valueOf() + ev.event_length * 1000) <= from.valueOf())
+ td = this.date.add(td, 1, ev.rec_pattern);
+ while (td < ev.end_date) {
+ var ch = this._get_rec_marker(td.valueOf(), ev.id);
+ var res = true;
+ if (!ch) { // unmodified element of series
+ var sed = new Date(td);
+ var ted = new Date(td.valueOf() + ev.event_length * 1000);
+
+ ted = scheduler._fix_daylight_saving_date(sed, ted, ev, td, ted);
+
+ result.push({start_date:sed, end_date:ted});
+ } else if(ch.rec_type == "none") {
+ res = false;
+ } else {
+ result.push({ start_date: ch.start_date, end_date: ch.end_date });
+ }
+
+ td = this.date.add(td, 1, ev.rec_pattern);
+ if (res) {
+ count++;
+ if (count == max)
+ break;
+ }
+ }
+ return result;
+};
+scheduler.getEvents = function(from, to) {
+ var result = [];
+ for (var a in this._events) {
+ var ev = this._events[a];
+ if (ev && ev.start_date < to && ev.end_date > from) {
+ if (ev.rec_pattern) {
+ if (ev.rec_pattern == "none") continue;
+ var sev = [];
+ this.repeat_date(ev, sev, true, from, to);
+ for (var i = 0; i < sev.length; i++) {
+ // if event is in rec_markers then it will be checked by himself, here need to skip it
+ if (!sev[i].rec_pattern && sev[i].start_date < to && sev[i].end_date > from && !this._rec_markers[sev[i].id]) {
+ result.push(sev[i]);
+ }
+ }
+ } else if (!this._is_virtual_event(ev.id)) { // if it's virtual event we can skip it
+ result.push(ev);
+ }
+ }
+ }
+ return result;
+};
+
+scheduler.config.repeat_date = "%m.%d.%Y";
+scheduler.config.lightbox.sections = [
+ {name:"description", height:130, map_to:"text", type:"textarea" , focus:true},
+ {name:"recurring", type:"recurring", map_to:"rec_type", button:"recurring"},
+ {name:"time", height:72, type:"time", map_to:"auto"}
+];
+
+
+//drop secondary attributes
+scheduler._copy_dummy = function(ev) {
+ var start_date = new Date(this.start_date);
+ var end_date = new Date(this.end_date);
+ this.start_date = start_date;
+ this.end_date = end_date;
+ this.event_length = this.event_pid = this.rec_pattern = this.rec_type = null;
+};
+
+scheduler.config.include_end_by = false;
+scheduler.config.lightbox_recurring = 'ask'; // series, instance
+
+scheduler.attachEvent("onClearAll", function(){
+ scheduler._rec_markers = {}; //clear recurring events data
+ scheduler._rec_markers_pull = {};
+ scheduler._rec_temp = [];
+});
+
+scheduler.__recurring_template='<div class="dhx_form_repeat"> <form> <div class="dhx_repeat_left"> <label><input class="dhx_repeat_radio" type="radio" name="repeat" value="day" />Daily</label><br /> <label><input class="dhx_repeat_radio" type="radio" name="repeat" value="week"/>Weekly</label><br /> <label><input class="dhx_repeat_radio" type="radio" name="repeat" value="month" checked />Monthly</label><br /> <label><input class="dhx_repeat_radio" type="radio" name="repeat" value="year" />Yearly</label> </div> <div class="dhx_repeat_divider"></div> <div class="dhx_repeat_center"> <div style="display:none;" id="dhx_repeat_day"> <label><input class="dhx_repeat_radio" type="radio" name="day_type" value="d"/>Every</label><input class="dhx_repeat_text" type="text" name="day_count" value="1" />day<br /> <label><input class="dhx_repeat_radio" type="radio" name="day_type" checked value="w"/>Every workday</label> </div> <div style="display:none;" id="dhx_repeat_week"> Repeat every<input class="dhx_repeat_text" type="text" name="week_count" value="1" />week next days:<br /> <table class="dhx_repeat_days"> <tr> <td> <label><input class="dhx_repeat_checkbox" type="checkbox" name="week_day" value="1" />Monday</label><br /> <label><input class="dhx_repeat_checkbox" type="checkbox" name="week_day" value="4" />Thursday</label> </td> <td> <label><input class="dhx_repeat_checkbox" type="checkbox" name="week_day" value="2" />Tuesday</label><br /> <label><input class="dhx_repeat_checkbox" type="checkbox" name="week_day" value="5" />Friday</label> </td> <td> <label><input class="dhx_repeat_checkbox" type="checkbox" name="week_day" value="3" />Wednesday</label><br /> <label><input class="dhx_repeat_checkbox" type="checkbox" name="week_day" value="6" />Saturday</label> </td> <td> <label><input class="dhx_repeat_checkbox" type="checkbox" name="week_day" value="0" />Sunday</label><br /><br /> </td> </tr> </table> </div> <div id="dhx_repeat_month"> <label><input class="dhx_repeat_radio" type="radio" name="month_type" value="d"/>Repeat</label><input class="dhx_repeat_text" type="text" name="month_day" value="1" />day every<input class="dhx_repeat_text" type="text" name="month_count" value="1" />month<br /> <label><input class="dhx_repeat_radio" type="radio" name="month_type" checked value="w"/>On</label><input class="dhx_repeat_text" type="text" name="month_week2" value="1" /><select name="month_day2"><option value="1" selected >Monday<option value="2">Tuesday<option value="3">Wednesday<option value="4">Thursday<option value="5">Friday<option value="6">Saturday<option value="0">Sunday</select>every<input class="dhx_repeat_text" type="text" name="month_count2" value="1" />month<br /> </div> <div style="display:none;" id="dhx_repeat_year"> <label><input class="dhx_repeat_radio" type="radio" name="year_type" value="d"/>Every</label><input class="dhx_repeat_text" type="text" name="year_day" value="1" />day<select name="year_month"><option value="0" selected >January<option value="1">February<option value="2">March<option value="3">April<option value="4">May<option value="5">June<option value="6">July<option value="7">August<option value="8">September<option value="9">October<option value="10">November<option value="11">December</select>month<br /> <label><input class="dhx_repeat_radio" type="radio" name="year_type" checked value="w"/>On</label><input class="dhx_repeat_text" type="text" name="year_week2" value="1" /><select name="year_day2"><option value="1" selected >Monday<option value="2">Tuesday<option value="3">Wednesday<option value="4">Thursday<option value="5">Friday<option value="6">Saturday<option value="7">Sunday</select>of<select name="year_month2"><option value="0" selected >January<option value="1">February<option value="2">March<option value="3">April<option value="4">May<option value="5">June<option value="6">July<option value="7">August<option value="8">September<option value="9">October<option value="10">November<option value="11">December</select><br /> </div> </div> <div class="dhx_repeat_divider"></div> <div class="dhx_repeat_right"> <label><input class="dhx_repeat_radio" type="radio" name="end" checked/>No end date</label><br /> <label><input class="dhx_repeat_radio" type="radio" name="end" />After</label><input class="dhx_repeat_text" type="text" name="occurences_count" value="1" />occurrences<br /> <label><input class="dhx_repeat_radio" type="radio" name="end" />End by</label><input class="dhx_repeat_date" type="text" name="date_of_end" value="'+scheduler.config.repeat_date_of_end+'" /><br /> </div> </form> </div> <div style="clear:both"> </div>';
diff --git a/codebase/sources/ext/dhtmlxscheduler_recurring.js.map b/codebase/sources/ext/dhtmlxscheduler_recurring.js.map
new file mode 100644
index 0000000..d69ba82
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_recurring.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_recurring.js.map","sources":["dhtmlxscheduler_recurring.js"],"names":["scheduler","config","occurrence_timestamp_in_utc","recurring_workdays","form_blocks","render","__recurring_template","_ds","_init_set_value","node","value","ev","register_els","inps","i","length","inp","type","els","name","push","get_radio_value","col","checked","change_current_view","$","style","display","this","get_repeat_code","dates","code","get_rcode","repeat","end","Date","str_date","transpose_type","join","Math","max","transp","toString","indexOf","start_on_monday","date","add","start","set_repeat_code","data","split","set_rcode","e","day","week","month","year","end_date","include_end_by","date_str","onclick","start_date","_end_date","str_date_format","str_to_date","repeat_date","date_to_str","top","getElementsByTagName","repeat_date_of_end","formatter","_currentDate","a","document","getElementById","_get_repeat_code","setDate","repeat_precise","_start","t","getDay","start_exists","sort","transpose_day_week","week_start","splice","setMonth","d","getDate","getMonth","_set_repeat_code","elements","el","_lightbox","_rec_init_done","set_value","rf","open","rec_type","blocked","_is_modified_occurence","ds","button_click","previousSibling","firstChild","get_value","actual_dates","formSection","getValue","_start_date","rec_pattern","focus","index","section","cont","height","backgroundPosition","nextSibling","innerHTML","locale","labels","button_recurring","button_recurring_open","setLightboxSize","_rec_markers","_rec_markers_pull","_add_rec_marker","time","_pid_time","id","event_pid","_get_rec_marker","ch","_get_rec_markers","_rec_temp","old_add_event","addEvent","ev_id","apply","arguments","getEvent","event_length","attachEvent","new_id","_ignore_call","tev","changeEventId","_is_virtual_event","nid","uid","tid","nev","_copy_event","timestamp","_lightbox_id","_roll_back_dates","sub","hasOwnProperty","deleteEvent","_events","setEvent","_loading","_not_render","isEventFound","k","_rendered","getAttribute","_select_id","render_view_data","valueOf","setFullYear","getFullYear","_validId","showLightbox_rec","showLightbox","c","lightbox_recurring","pid","isVirtual","showSeries","event","confirm_recurring","that","dhtmlx","modalbox","text","title","title_confirm_recurring","width","position","buttons","button_edit_series","button_edit_occurrence","icon_cancel","callback","get_visible_events_rec","get_visible_events","only_timed","stack","out","old","isOneDayEvent","call","old_update_event","updateEvent","update_view","transponse_size","day_week","sd","cday","nday","list","cor","size","cor2","f","str","gf","step","days","nd","td","delta","floor","inc","count","ceil","non_render","from","to","_min_date","_max_date","_fix_daylight_saving_date","UTC","getHours","getMinutes","getSeconds","ted","copy","_timed","_table_view","multi_day","counter","default_date","shift","getTimezoneOffset","getRecDates","result","res","sed","getEvents","sev","lightbox","sections","map_to","button","_copy_dummy"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_serialize.js b/codebase/sources/ext/dhtmlxscheduler_serialize.js
new file mode 100644
index 0000000..88b70ef
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_serialize.js
@@ -0,0 +1,110 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler._get_serializable_data = function(){
+ var res = {};
+ for (var a in this._events){
+ var ev = this._events[a];
+ if (ev.id.toString().indexOf("#") == -1){
+ res[ev.id] = ev;
+ }
+ }
+ return res;
+};
+
+//redefine this method, if you want to provide a custom set of attributes for serialization
+scheduler.data_attributes=function(){
+ var attrs = [];
+ var format = scheduler.templates.xml_format;
+ var all_events = this._get_serializable_data();
+ for (var a in all_events){
+ var ev = all_events[a];
+ for (var name in ev)
+ if (name.substr(0,1) !="_")
+ attrs.push([name,((name == "start_date" || name == "end_date")?format:null)]);
+ break;
+ }
+ return attrs;
+};
+
+scheduler.toXML = function(header){
+ var xml = [];
+ var attrs = this.data_attributes();
+
+ var all_events = this._get_serializable_data();
+ for (var a in all_events){
+ var ev = all_events[a];
+
+ xml.push("<event>");
+ for (var i=0; i < attrs.length; i++)
+ xml.push("<"+attrs[i][0]+"><![CDATA["+(attrs[i][1]?attrs[i][1](ev[attrs[i][0]]):ev[attrs[i][0]])+"]]></"+attrs[i][0]+">");
+
+ xml.push("</event>");
+ }
+ return (header||"")+"<data>"+xml.join("\n")+"</data>";
+};
+
+scheduler._serialize_json_value = function(value){
+ if(value === null || typeof value === "boolean"){
+ value = "" + value;
+ }else{
+ if(!value && value !== 0){
+ value = "";
+ }
+ value = '"' + value.toString().
+ replace(/\n/g,"").
+ replace(/\\/g,"\\\\").
+ replace(/\"/g, '\\"') + '"';
+ }
+ return value;
+};
+
+scheduler.toJSON = function(){
+ var json = [], value = "";
+ var attrs = this.data_attributes();
+ var all_events = this._get_serializable_data();
+ for (var a in all_events){
+ var ev = all_events[a];
+
+ var line =[];
+ for (var i=0; i < attrs.length; i++){
+ value = (attrs[i][1]) ? attrs[i][1](ev[attrs[i][0]]) : ev[attrs[i][0]];
+
+ line.push(' "'+attrs[i][0]+'": '+ this._serialize_json_value(value));
+ }
+ json.push("{"+line.join(",")+"}");
+ }
+ return "["+json.join(",\n")+"]";
+};
+
+
+scheduler.toICal = function(header){
+ var start = "BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//dhtmlXScheduler//NONSGML v2.2//EN\nDESCRIPTION:";
+ var end = "END:VCALENDAR";
+ var format = scheduler.date.date_to_str("%Y%m%dT%H%i%s");
+ var full_day_format = scheduler.date.date_to_str("%Y%m%d");
+
+ var ical = [];
+ var all_events = this._get_serializable_data();
+ for (var a in all_events){
+ var ev = all_events[a];
+
+
+ ical.push("BEGIN:VEVENT");
+ if (!ev._timed || (!ev.start_date.getHours() && !ev.start_date.getMinutes()))
+ ical.push("DTSTART:"+full_day_format(ev.start_date));
+ else
+ ical.push("DTSTART:"+format(ev.start_date));
+ if (!ev._timed || (!ev.end_date.getHours() && !ev.end_date.getMinutes()))
+ ical.push("DTEND:"+full_day_format(ev.end_date));
+ else
+ ical.push("DTEND:"+format(ev.end_date));
+ ical.push("SUMMARY:"+ev.text);
+ ical.push("END:VEVENT");
+ }
+ return start+(header||"")+"\n"+ical.join("\n")+"\n"+end;
+}; \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_serialize.js.map b/codebase/sources/ext/dhtmlxscheduler_serialize.js.map
new file mode 100644
index 0000000..6ad3a60
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_serialize.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_serialize.js.map","sources":["dhtmlxscheduler_serialize.js"],"names":["scheduler","_get_serializable_data","res","a","this","_events","ev","id","toString","indexOf","data_attributes","attrs","format","templates","xml_format","all_events","name","substr","push","toXML","header","xml","i","length","join","_serialize_json_value","value","replace","toJSON","json","line","toICal","start","end","date","date_to_str","full_day_format","ical","_timed","start_date","getHours","getMinutes","end_date","text"],"mappings":"AAAAA,UAAUC,uBAAyB,WAClC,GAAIC,KACJ,KAAK,GAAIC,KAAKC,MAAKC,QAAQ,CAC1B,GAAIC,GAAKF,KAAKC,QAAQF,EACe,KAAjCG,EAAGC,GAAGC,WAAWC,QAAQ,OAC5BP,EAAII,EAAGC,IAAMD,GAGf,MAAOJ,IAIRF,UAAUU,gBAAgB,WACzB,GAAIC,MACAC,EAASZ,UAAUa,UAAUC,WAC7BC,EAAaX,KAAKH,wBACtB,KAAK,GAAIE,KAAKY,GAAW,CACxB,GAAIT,GAAKS,EAAWZ,EACpB,KAAK,GAAIa,KAAQV,GACO,KAAnBU,EAAKC,OAAO,EAAE,IACjBN,EAAMO,MAAMF,EAAe,cAARA,GAAgC,YAARA,EAAoBJ,EAAO,MACxE,OAED,MAAOD,IAGRX,UAAUmB,MAAQ,SAASC,GAC1B,GAAIC,MACAV,EAAQP,KAAKM,kBAEbK,EAAaX,KAAKH,wBACtB,KAAK,GAAIE,KAAKY,GAAW,CACxB,GAAIT,GAAKS,EAAWZ,EAEpBkB;EAAIH,KAAK,UACT,KAAK,GAAII,GAAE,EAAGA,EAAIX,EAAMY,OAAQD,IAC/BD,EAAIH,KAAK,IAAIP,EAAMW,GAAG,GAAG,cAAcX,EAAMW,GAAG,GAAGX,EAAMW,GAAG,GAAGhB,EAAGK,EAAMW,GAAG,KAAKhB,EAAGK,EAAMW,GAAG,KAAK,QAAQX,EAAMW,GAAG,GAAG,IAEtHD,GAAIH,KAAK,YAEV,OAAQE,GAAQ,IAAI,SAASC,EAAIG,KAAK,MAAM,WAG7CxB,UAAUyB,sBAAwB,SAASC,GAY1C,MAXa,QAAVA,GAAmC,iBAAVA,GAC3BA,EAAQ,GAAKA,GAETA,GAAmB,IAAVA,IACZA,EAAQ,IAETA,EAAQ,IAAMA,EAAMlB,WACnBmB,QAAQ,MAAM,IACdA,QAAQ,MAAM,QACdA,QAAQ,MAAO,OAAS,KAEnBD,GAGR1B,UAAU4B,OAAS,WAClB,GAAIC,MAAWH,EAAQ,GACnBf,EAAQP,KAAKM,kBACbK,EAAaX,KAAKH,wBACtB,KAAK,GAAIE,KAAKY,GAAW,CAIxB,IAAK,GAHDT,GAAKS,EAAWZ,GAEhB2B,KACKR,EAAE,EAAGA,EAAIX,EAAMY,OAAQD,IAC/BI,EAASf,EAAMW,GAAG,GAAMX,EAAMW,GAAG,GAAGhB,EAAGK,EAAMW,GAAG,KAAOhB,EAAGK,EAAMW,GAAG,IAEnEQ,EAAKZ,KAAK,KAAKP,EAAMW,GAAG,GAAG,MAAOlB,KAAKqB,sBAAsBC,GAE9DG;EAAKX,KAAK,IAAIY,EAAKN,KAAK,KAAK,KAE9B,MAAO,IAAIK,EAAKL,KAAK,OAAO,KAI7BxB,UAAU+B,OAAS,SAASX,GAC3B,GAAIY,GAAQ,0FACRC,EAAM,gBACNrB,EAASZ,UAAUkC,KAAKC,YAAY,iBACpCC,EAAkBpC,UAAUkC,KAAKC,YAAY,UAE7CE,KACAtB,EAAaX,KAAKH,wBACtB,KAAK,GAAIE,KAAKY,GAAW,CACxB,GAAIT,GAAKS,EAAWZ,EAGpBkC,GAAKnB,KAAK,gBAITmB,EAAKnB,KAHDZ,EAAGgC,SAAYhC,EAAGiC,WAAWC,YAAelC,EAAGiC,WAAWE,cAGpD,WAAW7B,EAAON,EAAGiC,YAFrB,WAAWH,EAAgB9B,EAAGiC,aAMxCF,EAAKnB,KAHDZ,EAAGgC,SAAYhC,EAAGoC,SAASF,YAAelC,EAAGoC,SAASD,cAGhD,SAAS7B,EAAON,EAAGoC,UAFnB,SAASN,EAAgB9B,EAAGoC,WAGvCL,EAAKnB,KAAK,WAAWZ,EAAGqC,MACxBN,EAAKnB,KAAK;CAEX,MAAOc,IAAOZ,GAAQ,IAAI,KAAKiB,EAAKb,KAAK,MAAM,KAAKS"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_timeline.js b/codebase/sources/ext/dhtmlxscheduler_timeline.js
new file mode 100644
index 0000000..2f60f9f
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_timeline.js
@@ -0,0 +1,1277 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler._temp_matrix_scope = function(){
+
+
+
+scheduler.matrix = {};
+scheduler._merge=function(a,b){
+ for (var c in b)
+ if (typeof a[c] == "undefined")
+ a[c]=b[c];
+};
+scheduler.createTimelineView=function(obj){
+ scheduler._skin_init();
+
+ scheduler._merge(obj,{
+ section_autoheight: true,
+ name:"matrix",
+ x:"time",
+ y:"time",
+ x_step:1,
+ x_unit:"hour",
+ y_unit:"day",
+ y_step:1,
+ x_start:0,
+ x_size:24,
+ y_start:0,
+ y_size: 7,
+ render:"cell",
+ dx:200,
+ dy:50,
+ event_dy: scheduler.xy.bar_height-5,
+ event_min_dy: scheduler.xy.bar_height-5,
+ resize_events: true,
+ fit_events: true,
+ show_unassigned: false,
+ second_scale: false,
+ round_position: false,
+ _logic: function(render_name, y_unit, timeline) {
+ var res = {};
+ if(scheduler.checkEvent("onBeforeSectionRender")) {
+ res = scheduler.callEvent("onBeforeSectionRender", [render_name, y_unit, timeline]);
+ }
+ return res;
+ }
+ });
+ obj._original_x_start = obj.x_start;
+
+ //first and last hours are applied only to day based timeline
+ if (obj.x_unit != "day") obj.first_hour = obj.last_hour = 0;
+ //correction for first and last hour
+ obj._start_correction = obj.first_hour?obj.first_hour*60*60*1000:0;
+ obj._end_correction = obj.last_hour?(24-obj.last_hour)*60*60*1000:0;
+
+ if (scheduler.checkEvent("onTimelineCreated")) {
+ scheduler.callEvent("onTimelineCreated", [obj]);
+ }
+
+ var old = scheduler.render_data;
+ scheduler.render_data = function(evs, mode) {
+ if (this._mode == obj.name) {
+ //repaint single event, precision is not necessary
+ if (mode && !obj.show_unassigned && obj.render != "cell") {
+ for (var i = 0; i < evs.length; i++) {
+ this.clear_event(evs[i]);
+ this.render_timeline_event.call(this.matrix[this._mode], evs[i], true);
+ }
+ } else {
+ scheduler._renderMatrix.call(obj, true, true);
+ }
+ } else
+ return old.apply(this, arguments);
+ };
+
+ scheduler.matrix[obj.name]=obj;
+ scheduler.templates[obj.name+"_cell_value"] = function(ar){ return ar?ar.length:""; };
+ scheduler.templates[obj.name+"_cell_class"] = function(arr){ return ""; };
+ scheduler.templates[obj.name+"_scalex_class"] = function(date){ return ""; };
+ scheduler.templates[obj.name+"_second_scalex_class"] = function(date){ return ""; };
+
+ scheduler.templates[obj.name+"_scaley_class"] = function(section_id, section_label, section_options){ return ""; };
+ scheduler.templates[obj.name+"_scale_label"] = function(section_id, section_label, section_options){ return section_label; };
+
+ scheduler.templates[obj.name+"_tooltip"] = function(a,b,e){ return e.text; };
+ scheduler.templates[obj.name+"_date"] = function(datea, dateb){
+ if ( (datea.getDay()==dateb.getDay() && dateb-datea < (24*60*60*1000)) ||
+ +datea == +scheduler.date.date_part(new Date(dateb)) ||
+ (+scheduler.date.add(datea, 1, "day") == +dateb && dateb.getHours() === 0 && dateb.getMinutes() === 0) )
+ return scheduler.templates.day_date(datea);
+ if ( (datea.getDay() != dateb.getDay() && dateb-datea < (24*60*60*1000)) ) {
+ return scheduler.templates.day_date(datea)+" &ndash; "+scheduler.templates.day_date(dateb);
+ }
+ return scheduler.templates.week_date(datea, dateb);
+ };
+
+ scheduler.templates[obj.name+"_scale_date"] = scheduler.date.date_to_str(obj.x_date||scheduler.config.hour_date);
+ scheduler.templates[obj.name+"_second_scale_date"] = scheduler.date.date_to_str((obj.second_scale && obj.second_scale.x_date)?obj.second_scale.x_date:scheduler.config.hour_date);
+
+ scheduler.date["add_" + obj.name] = function(date, step, c) {
+ var resulting_date = scheduler.date.add(date, (obj.x_length || obj.x_size) * step * obj.x_step, obj.x_unit);
+ if (obj.x_unit == "minute" || obj.x_unit == "hour") {
+ var size = (obj.x_length || obj.x_size);
+ var converted_step = (obj.x_unit == "hour") ? obj.x_step*60 : obj.x_step;
+ if((converted_step * size) % (24 * 60)){
+ //if scroll hours within the day
+ if ( +scheduler.date.date_part(new Date(date)) == +scheduler.date.date_part(new Date(resulting_date )) ) {
+ obj.x_start += step*size;
+ } else {
+ // total steps starting from 0
+ var total_steps = ( (24 * 60) / (size * converted_step) ) - 1;
+ var steps_offset = Math.round(total_steps * size);
+
+ if (step > 0) {
+ obj.x_start = obj.x_start - steps_offset;
+ } else {
+ obj.x_start = steps_offset + obj.x_start;
+ }
+ }
+ }
+ }
+ return resulting_date;
+ };
+ scheduler.date[obj.name+"_start"] = function(date) {
+ var func = scheduler.date[obj.x_unit+"_start"] || scheduler.date.day_start;
+ var start_date = func.call(scheduler.date, date);
+ start_date = scheduler.date.add(start_date, obj.x_step*obj.x_start, obj.x_unit);
+ return start_date;
+ };
+
+
+ scheduler.callEvent("onOptionsLoad",[obj]);
+
+ //init custom wrappers
+ scheduler[obj.name+"_view"]=function(){
+ scheduler._renderMatrix.apply(obj, arguments);
+ };
+
+ //enable drag for non-cell modes
+ var temp_date = new Date();
+ var step_diff = (scheduler.date.add(temp_date, obj.x_step, obj.x_unit).valueOf() - temp_date.valueOf()); // "minute" + step in ms
+ scheduler["mouse_"+obj.name]=function(pos){ //mouse_coord handler
+ //get event object
+ var ev = this._drag_event;
+ if (this._drag_id){
+ ev = this.getEvent(this._drag_id);
+ this._drag_event._dhx_changed = true;
+ }
+
+ pos.x-=obj.dx;
+ var summ = 0, xind = 0;
+ var ratio,
+ column_width;
+ for (xind; xind <= this._cols.length-1; xind++) {
+
+ column_width = this._cols[xind];
+ summ += column_width;
+ if (summ>pos.x){ //index of section
+ ratio = (pos.x-(summ-column_width))/column_width;
+ ratio = (ratio < 0) ? 0 : ratio;
+ break;
+ }
+ }
+
+ if(obj.round_position){
+ // in case of click, mouse position will be always rounded to start date of the cell
+ // when dragging - position can be rounded to the start date of the next column, in order to improve the usability
+ // edge = 1 - always return start date of current cell
+ // 0.5 - round to next cell if mouse in the right half of cell
+ var edge = 1;
+ if(scheduler.getState().drag_mode && scheduler.getState().drag_mode != "move"){
+ edge = 0.5;//rounding for resize
+ }
+ if(ratio >= edge){
+ xind++;
+ }
+ ratio = 0;
+ }
+
+ //border cases
+ if (xind === 0 && this._ignores[0]) {
+ xind = 1; ratio = 0;
+ while (this._ignores[xind]) xind++;
+ } else if ( xind == this._cols.length && this._ignores[xind-1]) {
+ xind = this._cols.length-1; ratio = 0;
+ while (this._ignores[xind]) xind--;
+ xind++;
+ }
+
+
+ pos.x = 0;
+ pos.force_redraw = true;
+ pos.custom = true;
+
+ var end_date;
+ // if our event is at the end of the view
+ if(xind >= obj._trace_x.length) {
+ end_date = scheduler.date.add(obj._trace_x[obj._trace_x.length-1], obj.x_step, obj.x_unit);
+ if (obj._end_correction)
+ end_date = new Date(end_date-obj._end_correction);
+ } else {
+ var timestamp_diff = ratio * column_width * obj._step + obj._start_correction;
+ end_date = new Date(+obj._trace_x[xind]+timestamp_diff);
+ }
+
+ // as we can simply be calling _locate_cell_timeline
+ if (this._drag_mode == "move" && this._drag_id && this._drag_event) {
+ var ev = this.getEvent(this._drag_id);
+ var drag_event = this._drag_event;
+
+ pos._ignores = (this._ignores_detected || obj._start_correction || obj._end_correction);
+ if (!drag_event._move_delta) {
+ drag_event._move_delta = (ev.start_date-end_date)/60000;
+ if (this.config.preserve_length && pos._ignores){
+ drag_event._move_delta = this._get_real_event_length(ev.start_date,end_date, obj);
+ drag_event._event_length = this._get_real_event_length(ev.start_date,ev.end_date, obj);
+ }
+ }
+
+
+
+
+ //preserve visible size of event
+ if (this.config.preserve_length && pos._ignores){
+ var ev_length = drag_event._event_length;//this._get_real_event_length(ev.start_date, ev.end_date, obj);
+ var current_back_shift = this._get_fictional_event_length(end_date, drag_event._move_delta, obj, true);
+ end_date = new Date(end_date - current_back_shift);
+ } else {
+ // converting basically to start_date
+ end_date = scheduler.date.add(end_date, drag_event._move_delta, "minute");
+ }
+ }
+
+ if (this._drag_mode == "resize" && ev){
+ if(this._drag_from_start && +end_date> +ev.end_date){
+ this._drag_from_start = false;
+ }else if(!this._drag_from_start && +end_date < +ev.start_date){
+ this._drag_from_start = true;
+ }
+ pos.resize_from_start = this._drag_from_start;
+ }
+
+ if (obj.round_position) {
+ switch(this._drag_mode) {
+ case "move":
+ if (!this.config.preserve_length){
+ end_date = get_rounded_date.call(obj, end_date, false);
+ // to preserve original start and end dates
+ if(obj.x_unit == "day")//only make sense for whole-day cells
+ pos.custom = false;
+ }
+ break;
+ case "resize":
+ if(this._drag_event){
+ // will save and use resize position only once
+ if (this._drag_event._resize_from_start === null || this._drag_event._resize_from_start === undefined) {
+ this._drag_event._resize_from_start = pos.resize_from_start;
+ }
+ pos.resize_from_start = this._drag_event._resize_from_start;
+ end_date = get_rounded_date.call(obj, end_date, !this._drag_event._resize_from_start);
+ }
+ break;
+ }
+ }
+
+ this._resolve_timeline_section(obj, pos);
+ if(pos.section){
+ // update draggable event with current section
+ this._update_timeline_section({pos:pos, event:this.getEvent(this._drag_id), view:obj});
+ }
+ pos.y = Math.round((end_date-this._min_date)/(1000*60*this.config.time_step));
+ pos.shift = this.config.time_step; //step_diff;
+
+
+ return pos;
+ };
+};
+
+scheduler._get_timeline_event_height = function(ev, config){
+ var section = ev[config.y_property]; // section id
+ var event_height = config.event_dy;
+ if (config.event_dy == "full") {
+ if (config.section_autoheight) {
+ event_height = config._section_height[section] - 6;
+ } else {
+ event_height = config.dy - 3;
+ }
+ }
+
+ if (config.resize_events) {
+ event_height = Math.max(Math.floor(event_height / ev._count), config.event_min_dy);
+ }
+ return event_height;
+};
+scheduler._get_timeline_event_y = function(order, event_height){
+ var sorder = order;
+ var y = 2+sorder*event_height+(sorder?(sorder*2):0); // original top + number_of_events * event_dy + default event top/bottom borders
+ if (scheduler.config.cascade_event_display) {
+ y =2+sorder*scheduler.config.cascade_event_margin+(sorder?(sorder*2):0);
+ }
+ return y;
+};
+
+scheduler.render_timeline_event = function(ev, attach){
+ var section = ev[this.y_property]; // section id
+ if (!section)
+ return ""; // as we may await html
+
+ var sorder = ev._sorder;
+
+ var x_start = _getX(ev, false, this);
+ var x_end = _getX(ev, true, this);
+
+ var event_height = scheduler._get_timeline_event_height(ev, this);
+
+ var hb = event_height - 2;// takes into account css sizes (border/padding)
+ if (!ev._inner && this.event_dy == "full") {
+ hb=(hb+2)*(ev._count-sorder)-2;
+ }
+
+ var y = scheduler._get_timeline_event_y(ev._sorder, event_height);
+
+ var section_height = event_height+y+2;
+ if(!this._events_height[section] || (this._events_height[section] < section_height)){
+ this._events_height[section] = section_height;
+ }
+
+ var cs = scheduler.templates.event_class(ev.start_date,ev.end_date,ev);
+ cs = "dhx_cal_event_line "+(cs||"");
+
+ var bg_color = (ev.color?("background:"+ev.color+";"):"");
+ var color = (ev.textColor?("color:"+ev.textColor+";"):"");
+ var text = scheduler.templates.event_bar_text(ev.start_date,ev.end_date,ev);
+
+ var html='<div event_id="'+ev.id+'" class="'+cs+'" style="'+bg_color+''+color+'position:absolute; top:'+y+'px; height: '+hb+'px; left:'+x_start+'px; width:'+Math.max(0,x_end-x_start)+'px;'+(ev._text_style||"")+'">';
+ if (scheduler.config.drag_resize && !scheduler.config.readonly) {
+ var dhx_event_resize = 'dhx_event_resize';
+ html += ("<div class='"+dhx_event_resize+" "+dhx_event_resize+"_start' style='height: "+hb+"px;'></div><div class='"+dhx_event_resize+" "+dhx_event_resize+"_end' style='height: "+hb+"px;'></div>");
+ }
+ html += (text+'</div>');
+
+ if (!attach)
+ return html;
+ else {
+ var d = document.createElement("DIV");
+ d.innerHTML = html;
+ var ind = this.order[section];
+ var parent = scheduler._els["dhx_cal_data"][0].firstChild.rows[ind].cells[1].firstChild;
+
+ scheduler._rendered.push(d.firstChild);
+ parent.appendChild(d.firstChild);
+ }
+};
+function trace_events(){
+ //minimize event set
+ var evs = scheduler.get_visible_events();
+ var matrix =[];
+ for (var i=0; i < this.y_unit.length; i++)
+ matrix[i]=[];
+
+ //next code defines row for undefined key
+ //most possible it is an artifact of incorrect configuration
+ if (!matrix[y])
+ matrix[y]=[];
+
+ for (var i=0; i < evs.length; i++) {
+ var y = this.order[evs[i][this.y_property]];
+ var x = 0;
+ while (this._trace_x[x+1] && evs[i].start_date>=this._trace_x[x+1]) x++;
+ while (this._trace_x[x] && evs[i].end_date>this._trace_x[x]) {
+ if (!matrix[y][x]) matrix[y][x]=[];
+ matrix[y][x].push(evs[i]);
+ x++;
+ }
+ }
+ return matrix;
+}
+// function used to get X (both start and end) coordinates for timeline bar view
+function _getX(ev, isEndPoint, config) {
+ var x = 0;
+ var step = config._step;
+ var round_position = config.round_position;
+
+ var column_offset = 0;
+ var date = (isEndPoint) ? ev.end_date : ev.start_date;
+
+ if(date.valueOf()>scheduler._max_date.valueOf())
+ date = scheduler._max_date;
+ var delta = date - scheduler._min_date_timeline;
+
+ if (delta > 0){
+ var index = scheduler._get_date_index(config, date);
+ if (scheduler._ignores[index])
+ round_position=true;
+
+ for (var i = 0; i < index; i++) {
+ x += scheduler._cols[i];
+ }
+
+ var column_date = scheduler.date.add(scheduler._min_date_timeline, scheduler.matrix[scheduler._mode].x_step*index, scheduler.matrix[scheduler._mode].x_unit);
+ if (!round_position) {
+ delta = date - column_date;
+ if (config.first_hour || config.last_hour){
+ delta = delta - config._start_correction;
+ if (delta < 0) delta = 0;
+ column_offset = Math.round(delta/step);
+ if (column_offset > scheduler._cols[index])
+ column_offset = scheduler._cols[index];
+ } else {
+ column_offset = Math.round(delta/step);
+ }
+ } else {
+ if (+date > +column_date && isEndPoint) {
+ column_offset = scheduler._cols[index];
+ }
+ }
+ }
+ if (isEndPoint) {
+ // special handling for "round" dates which match columns and usual ones
+ if (delta !== 0 && !round_position) {
+ x += column_offset-12;
+ } else {
+ x += column_offset-14;
+ }
+ } else {
+ x += column_offset+1;
+ }
+ return x;
+}
+function get_rounded_date(date, isEndDate) {
+ var index = scheduler._get_date_index(this, date);
+ var rounded_date = this._trace_x[index];
+ if (isEndDate && (+date != +this._trace_x[index])) {
+ rounded_date = (this._trace_x[index+1]) ? this._trace_x[index+1] : scheduler.date.add(this._trace_x[index], this.x_step, this.x_unit);
+ }
+ return new Date(rounded_date);
+}
+function get_events_html(evs) {
+ var html = "";
+ if (evs && this.render != "cell"){
+ evs.sort(this.sort || function(a,b){
+ if(a.start_date.valueOf()==b.start_date.valueOf())
+ return a.id>b.id?1:-1;
+ return a.start_date>b.start_date?1:-1;
+ });
+ var stack=[];
+ var evs_length = evs.length;
+ // prepare events for render
+ for (var j=0; j<evs_length; j++){
+ var ev = evs[j];
+ ev._inner = false;
+
+ var ev_start_date = (this.round_position) ? get_rounded_date.apply(this, [ev.start_date, false]) : ev.start_date;
+ var ev_end_date = (this.round_position) ? get_rounded_date.apply(this, [ev.end_date, true]) : ev.end_date;
+
+ // cutting stack from the last -> first event side
+ while (stack.length) {
+ var stack_ev = stack[stack.length-1];
+ if (stack_ev.end_date.valueOf() <= ev_start_date.valueOf()) {
+ stack.splice(stack.length-1,1);
+ } else {
+ break;
+ }
+ }
+
+ // cutting stack from the first -> last event side
+ var sorderSet = false;
+ for(var p=0; p<stack.length; p++){
+ var t_ev = stack[p];
+ if(t_ev.end_date.valueOf() <= ev_start_date.valueOf()){
+ sorderSet = true;
+ ev._sorder=t_ev._sorder;
+ stack.splice(p,1);
+ ev._inner=true;
+ break;
+ }
+ }
+
+
+ if (stack.length)
+ stack[stack.length-1]._inner=true;
+
+
+ if (!sorderSet) {
+ if (stack.length) {
+ if (stack.length <= stack[stack.length - 1]._sorder) {
+ if (!stack[stack.length - 1]._sorder)
+ ev._sorder = 0;
+ else
+ for (var h = 0; h < stack.length; h++) {
+ var _is_sorder = false;
+ for (var t = 0; t < stack.length; t++) {
+ if (stack[t]._sorder == h) {
+ _is_sorder = true;
+ break;
+ }
+ }
+ if (!_is_sorder) {
+ ev._sorder = h;
+ break;
+ }
+ }
+ ev._inner = true;
+ }
+ else {
+ var _max_sorder = stack[0]._sorder;
+ for (var w = 1; w < stack.length; w++)
+ if (stack[w]._sorder > _max_sorder)
+ _max_sorder = stack[w]._sorder;
+ ev._sorder = _max_sorder + 1;
+ ev._inner = false;
+ }
+ }
+ else
+ ev._sorder = 0;
+ }
+
+ stack.push(ev);
+
+ if (stack.length>(stack.max_count||0)) {
+ stack.max_count=stack.length;
+ ev._count=stack.length;
+ }
+ else {
+ ev._count=(ev._count)?ev._count:1;
+ }
+ }
+ // fix _count for every event
+ for (var m=0; m < evs.length; m++) {
+ evs[m]._count = stack.max_count;
+ }
+ // render events
+ for (var v=0; v<evs_length; v++) {
+ html+=scheduler.render_timeline_event.call(this, evs[v], false);
+ }
+ }
+ return html;
+}
+
+
+function y_scale(d) {
+ var html = "<table style='table-layout:fixed;' cellspacing='0' cellpadding='0'>";
+ var evs=[];
+ if(scheduler._load_mode)
+ scheduler._load();
+ if (this.render == "cell")
+ evs = trace_events.call(this);
+ else {
+ var tevs = scheduler.get_visible_events();
+ var order = this.order;
+
+ for (var j = 0; j < tevs.length; j++) {
+ var tev = tevs[j];
+ var tev_section = tev[this.y_property];
+ var index = this.order[ tev_section ];
+
+ if (this.show_unassigned && !tev_section) {
+ for (var key in order) {
+ if (order.hasOwnProperty(key)) {
+ index = order[key];
+ if (!evs[index]) evs[index] = [];
+ var clone = scheduler._lame_copy({}, tev);
+ clone[this.y_property] = key;
+ evs[index].push(clone);
+ }
+ }
+ } else {
+ // required as we could have index of not displayed section or "undefined"
+ if (!evs[index]) evs[index] = [];
+ evs[index].push(tev);
+ }
+ }
+ }
+
+ var summ = 0;
+ for (var i=0; i < scheduler._cols.length; i++)
+ summ+=scheduler._cols[i];
+
+ var step = new Date();
+ var realcount = scheduler._cols.length-scheduler._ignores_detected;
+ step = ((scheduler.date.add(step, this.x_step*realcount, this.x_unit)-step)-(this._start_correction + this._end_correction)*realcount)/summ;
+ this._step = step;
+ this._summ = summ;
+
+ var heights = scheduler._colsS.heights=[];
+
+ this._events_height = {};
+ this._section_height = {};
+ for (var i=0; i<this.y_unit.length; i++){
+
+ var stats = this._logic(this.render, this.y_unit[i], this); // obj with custom style
+
+ scheduler._merge(stats, {
+ height: this.dy
+ });
+
+ //autosize height, if we have a free space
+ if(this.section_autoheight) {
+ if (this.y_unit.length * stats.height < d.offsetHeight) {
+ stats.height = Math.max(stats.height, Math.floor((d.offsetHeight - 1) / this.y_unit.length));
+ }
+ this._section_height[this.y_unit[i].key] = stats.height;
+ }
+
+ scheduler._merge(stats, {
+ //section 1
+ tr_className: "",
+ style_height: "height:"+stats.height+"px;",
+ style_width: "width:"+(this.dx-1)+"px;",
+ td_className: "dhx_matrix_scell"+((scheduler.templates[this.name+"_scaley_class"](this.y_unit[i].key, this.y_unit[i].label, this.y_unit[i]))?" "+scheduler.templates[this.name+"_scaley_class"](this.y_unit[i].key, this.y_unit[i].label, this.y_unit[i]):''),
+ td_content: scheduler.templates[this.name+'_scale_label'](this.y_unit[i].key, this.y_unit[i].label, this.y_unit[i]),
+ //section 2
+ summ_width: "width:"+summ+"px;",
+ //section 3
+ table_className: ''
+ });
+
+ // generating events html in a temporary file, calculating their height
+ var events_html = get_events_html.call(this, evs[i]);
+
+ if(this.fit_events){
+ var rendered_height = this._events_height[this.y_unit[i].key]||0;
+ stats.height = (rendered_height>stats.height)?rendered_height:stats.height;
+ stats.style_height = "height:"+stats.height+"px;";
+ this._section_height[this.y_unit[i].key] = stats.height;
+ }
+
+ // section 1
+ html+="<tr class='"+stats.tr_className+"' style='"+stats.style_height+"'><td class='"+stats.td_className+"' style='"+stats.style_width+" height:"+(stats.height-1)+"px;'>"+stats.td_content+"</td>";
+
+ if (this.render == "cell"){
+ for (var j=0; j < scheduler._cols.length; j++) {
+ if (scheduler._ignores[j])
+ html+="<td></td>";
+ else
+ html+="<td class='dhx_matrix_cell "+scheduler.templates[this.name+"_cell_class"](evs[i][j],this._trace_x[j],this.y_unit[i])+"' style='width:"+(scheduler._cols[j]-1)+"px'><div style='width:"+(scheduler._cols[j]-1)+"px'>"+scheduler.templates[this.name+"_cell_value"](evs[i][j],this._trace_x[j],this.y_unit[i])+"</div></td>";
+ }
+ } else {
+ //section 2
+ html+="<td><div style='"+stats.summ_width+" "+stats.style_height+" position:relative;' class='dhx_matrix_line'>";
+
+ // adding events
+ html += events_html;
+
+ //section 3
+ html+="<table class='"+stats.table_className+"' cellpadding='0' cellspacing='0' style='"+stats.summ_width+" "+stats.style_height+"' >";
+ for (var j=0; j < scheduler._cols.length; j++){
+ if (scheduler._ignores[j])
+ html+="<td></td>";
+ else
+ html+="<td class='dhx_matrix_cell "+scheduler.templates[this.name+"_cell_class"](evs[i],this._trace_x[j],this.y_unit[i])+"' style='width:"+(scheduler._cols[j]-1)+"px'><div style='width:"+(scheduler._cols[j]-1)+"px'></div></td>";
+ }
+ html+="</table>";
+ html+="</div></td>";
+ }
+ html+="</tr>";
+ }
+ html += "</table>";
+ this._matrix = evs;
+ //d.scrollTop = 0; //fix flickering in FF; disabled as it was impossible to create dnd event if scroll was used (window jumped to the top)
+ d.innerHTML = html;
+
+ scheduler._rendered = [];
+ var divs = scheduler._obj.getElementsByTagName("DIV");
+ for (var i=0; i < divs.length; i++)
+ if (divs[i].getAttribute("event_id"))
+ scheduler._rendered.push(divs[i]);
+
+ this._scales = {};
+ for (var i=0; i < d.firstChild.rows.length; i++) {
+ heights.push(d.firstChild.rows[i].offsetHeight);
+ var unit_key = this.y_unit[i].key;
+ var scale = this._scales[unit_key] = (scheduler._isRender('cell')) ? d.firstChild.rows[i] : d.firstChild.rows[i].childNodes[1].getElementsByTagName('div')[0];
+ scheduler.callEvent("onScaleAdd", [scale, unit_key]);
+ }
+}
+function x_scale(h){
+ var current_sh = scheduler.xy.scale_height;
+ var original_sh = this._header_resized||scheduler.xy.scale_height;
+ scheduler._cols=[]; //store for data section, each column width
+ scheduler._colsS={height:0}; // heights of the y sections
+ this._trace_x =[]; // list of dates per cells
+ var summ = scheduler._x - this.dx - scheduler.xy.scroll_width; //border delta, whole width
+ var left = [this.dx]; // left margins, initial left margin
+ var header = scheduler._els['dhx_cal_header'][0];
+ header.style.width = (left[0]+summ)+'px';
+
+ scheduler._min_date_timeline = scheduler._min_date;
+
+ var preserve = scheduler.config.preserve_scale_length;
+ var start = scheduler._min_date;
+ scheduler._process_ignores(start, this.x_size, this.x_unit, this.x_step, preserve);
+
+ var size = this.x_size + (preserve ? scheduler._ignores_detected : 0);
+ if (size != this.x_size)
+ scheduler._max_date = scheduler.date.add(scheduler._min_date, size*this.x_step, this.x_unit);
+
+ var realcount = size - scheduler._ignores_detected;
+ for (var k=0; k<size; k++){
+ // dates calculation
+ this._trace_x[k]=new Date(start);
+ start = scheduler.date.add(start, this.x_step, this.x_unit);
+
+ // position calculation
+ if (scheduler._ignores[k]){
+ scheduler._cols[k]=0;
+ realcount++;
+ } else {
+ scheduler._cols[k]=Math.floor(summ/(realcount-k));
+ }
+
+ summ -= scheduler._cols[k];
+ left[k+1] = left[k] + scheduler._cols[k];
+ }
+ h.innerHTML = "<div></div>";
+
+ if(this.second_scale){
+ // additional calculations
+ var mode = this.second_scale.x_unit;
+ var control_dates = [this._trace_x[0]]; // first control date
+ var second_cols = []; // each column width of the secondary row
+ var second_left = [this.dx, this.dx]; // left margins of the secondary row
+ var t_index = 0; // temp index
+ for (var l = 0; l < this._trace_x.length; l++) {
+ var date = this._trace_x[l];
+ var res = is_new_interval(mode, date, control_dates[t_index]);
+
+ if(res) { // new interval
+ ++t_index; // starting new interval
+ control_dates[t_index] = date; // updating control date as we moved to the new interval
+ second_left[t_index+1] = second_left[t_index];
+ }
+ var t = t_index+1;
+ second_cols[t_index] = scheduler._cols[l] + (second_cols[t_index]||0);
+ second_left[t] += scheduler._cols[l];
+ }
+
+ h.innerHTML = "<div></div><div></div>";
+ var top = h.firstChild;
+ top.style.height = (original_sh)+'px'; // actually bottom header takes 21px
+ var bottom = h.lastChild;
+ bottom.style.position = "relative";
+
+ for (var m = 0; m < control_dates.length; m++) {
+ var tdate = control_dates[m];
+ var scs = scheduler.templates[this.name+"_second_scalex_class"](tdate);
+ var head=document.createElement("DIV"); head.className="dhx_scale_bar dhx_second_scale_bar"+((scs)?(" "+scs):"");
+ scheduler.set_xy(head,second_cols[m]-1,original_sh-3,second_left[m],0); //-1 for border, -3 = -2 padding -1 border bottom
+ head.innerHTML = scheduler.templates[this.name+"_second_scale_date"](tdate);
+ top.appendChild(head);
+ }
+ }
+
+ scheduler.xy.scale_height = original_sh; // fix for _render_x_header which uses current scale_height value
+ h = h.lastChild; // h - original scale
+ for (var i=0; i<this._trace_x.length; i++){
+ if (scheduler._ignores[i])
+ continue;
+
+ start = this._trace_x[i];
+ scheduler._render_x_header(i, left[i], start, h);
+ var cs = scheduler.templates[this.name+"_scalex_class"](start);
+ if (cs)
+ h.lastChild.className += " "+cs;
+ }
+ scheduler.xy.scale_height = current_sh; // restoring current value
+
+ var trace = this._trace_x;
+ h.onclick = function(e){
+ var pos = locate_hcell(e);
+ if (pos)
+ scheduler.callEvent("onXScaleClick",[pos.x, trace[pos.x], e||event]);
+ };
+ h.ondblclick = function(e){
+ var pos = locate_hcell(e);
+ if (pos)
+ scheduler.callEvent("onXScaleDblClick",[pos.x, trace[pos.x], e||event]);
+ };
+}
+function is_new_interval(mode, date, control_date){ // mode, date to check, control_date for which period should be checked
+ switch(mode) {
+ case "hour":
+ return ((date.getHours() != control_date.getHours()) || is_new_interval("day", date, control_date));
+ case "day":
+ return !(date.getDate() == control_date.getDate() && date.getMonth() == control_date.getMonth() && date.getFullYear() == control_date.getFullYear());
+ case "week":
+ return !(scheduler.date.getISOWeek(date) == scheduler.date.getISOWeek(control_date) && date.getFullYear() == control_date.getFullYear());
+ case "month":
+ return !(date.getMonth() == control_date.getMonth() && date.getFullYear() == control_date.getFullYear());
+ case "year":
+ return !(date.getFullYear() == control_date.getFullYear());
+ default:
+ return false; // same interval
+ }
+}
+function set_full_view(mode){
+ if (mode){
+ scheduler.set_sizes();
+ scheduler._init_matrix_tooltip();
+
+ //we need to have day-rounded scales for navigation
+ //in same time, during rendering scales may be shifted
+ var temp = scheduler._min_date;
+ x_scale.call(this,scheduler._els["dhx_cal_header"][0]);
+ y_scale.call(this,scheduler._els["dhx_cal_data"][0]);
+ scheduler._min_date = temp;
+ scheduler._els["dhx_cal_date"][0].innerHTML=scheduler.templates[this.name+"_date"](scheduler._min_date, scheduler._max_date);
+ if (scheduler._mark_now) {
+ scheduler._mark_now();
+ }
+ }
+
+ // hide tooltip if it is displayed
+ hideToolTip();
+}
+
+
+function hideToolTip(){
+ if (scheduler._tooltip){
+ scheduler._tooltip.style.display = "none";
+ scheduler._tooltip.date = "";
+ }
+}
+function showToolTip(obj,pos,offset){
+ if (obj.render != "cell") return;
+ var mark = pos.x+"_"+pos.y;
+ var evs = obj._matrix[pos.y][pos.x];
+
+ if (!evs) return hideToolTip();
+
+ evs.sort(function(a,b){ return a.start_date>b.start_date?1:-1; });
+
+ if (scheduler._tooltip){
+ if (scheduler._tooltip.date == mark) return;
+ scheduler._tooltip.innerHTML="";
+ } else {
+ var t = scheduler._tooltip = document.createElement("DIV");
+ t.className = "dhx_year_tooltip";
+ document.body.appendChild(t);
+ t.onclick = scheduler._click.dhx_cal_data;
+ }
+
+ var html = "";
+
+ for (var i=0; i<evs.length; i++){
+ var bg_color = (evs[i].color?("background-color:"+evs[i].color+";"):"");
+ var color = (evs[i].textColor?("color:"+evs[i].textColor+";"):"");
+ html+="<div class='dhx_tooltip_line' event_id='"+evs[i].id+"' style='"+bg_color+""+color+"'>";
+ html+="<div class='dhx_tooltip_date'>"+(evs[i]._timed?scheduler.templates.event_date(evs[i].start_date):"")+"</div>";
+ html+="<div class='dhx_event_icon icon_details'>&nbsp;</div>";
+ html+=scheduler.templates[obj.name+"_tooltip"](evs[i].start_date, evs[i].end_date,evs[i])+"</div>";
+ }
+
+ scheduler._tooltip.style.display="";
+ scheduler._tooltip.style.top = "0px";
+
+ if (document.body.offsetWidth-offset.left-scheduler._tooltip.offsetWidth < 0)
+ scheduler._tooltip.style.left = offset.left-scheduler._tooltip.offsetWidth+"px";
+ else
+ scheduler._tooltip.style.left = offset.left+pos.src.offsetWidth+"px";
+
+ scheduler._tooltip.date = mark;
+ scheduler._tooltip.innerHTML = html;
+
+ if (document.body.offsetHeight-offset.top-scheduler._tooltip.offsetHeight < 0)
+ scheduler._tooltip.style.top= offset.top-scheduler._tooltip.offsetHeight+pos.src.offsetHeight+"px";
+ else
+ scheduler._tooltip.style.top= offset.top+"px";
+}
+
+scheduler._matrix_tooltip_handler = function(e){
+ var obj = scheduler.matrix[scheduler._mode];
+ if (!obj || obj.render != "cell")
+ return;
+ if (obj){
+ var pos = scheduler._locate_cell_timeline(e);
+ var e = e || event;
+ var src = e.target||e.srcElement;
+ if (pos)
+ return showToolTip(obj,pos,getOffset(pos.src));
+ }
+ hideToolTip();
+};
+scheduler._init_matrix_tooltip = function() {
+ scheduler._detachDomEvent(scheduler._els["dhx_cal_data"][0], "mouseover", scheduler._matrix_tooltip_handler);
+ dhtmlxEvent(scheduler._els["dhx_cal_data"][0], "mouseover", scheduler._matrix_tooltip_handler);
+};
+
+scheduler._renderMatrix = function(mode, refresh) {
+ if (!refresh)
+ scheduler._els['dhx_cal_data'][0].scrollTop=0;
+
+ scheduler._min_date = scheduler.date[this.name+"_start"](scheduler._date);
+ scheduler._max_date = scheduler.date.add(scheduler._min_date, this.x_size*this.x_step, this.x_unit);
+ scheduler._table_view = true;
+ if (this.second_scale) {
+ if (mode && !this._header_resized) {
+ this._header_resized = scheduler.xy.scale_height;
+ scheduler.xy.scale_height *= 2;
+ scheduler._els['dhx_cal_header'][0].className += " dhx_second_cal_header";
+ }
+ if (!mode && this._header_resized) {
+ scheduler.xy.scale_height /= 2;
+ this._header_resized = false;
+ var header = scheduler._els['dhx_cal_header'][0];
+ header.className = header.className.replace(/ dhx_second_cal_header/gi,"");
+ }
+ }
+ set_full_view.call(this,mode);
+};
+
+function html_index(el) {
+ var p = el.parentNode.childNodes;
+ for (var i=0; i < p.length; i++)
+ if (p[i] == el) return i;
+ return -1;
+}
+function locate_hcell(e){
+ e = e||event;
+ var trg = e.target?e.target:e.srcElement;
+ while (trg && trg.tagName != "DIV")
+ trg=trg.parentNode;
+ if (trg && trg.tagName == "DIV"){
+ var cs = trg.className.split(" ")[0];
+ if (cs == "dhx_scale_bar")
+ return { x:html_index(trg), y:-1, src:trg, scale:true };
+ }
+}
+scheduler._locate_cell_timeline = function(e){
+ e = e||event;
+ var trg = e.target?e.target:e.srcElement;
+
+ var res = {};
+ var view = scheduler.matrix[scheduler._mode];
+ var pos = scheduler.getActionData(e);
+
+ for (var xind = 0; xind < view._trace_x.length-1; xind++) {
+ // | 8:00, 8:30 | 8:15 should be checked against 8:30
+ // clicking at the most left part of the cell, say 8:30 should create event in that cell, not previous one
+ if (+pos.date < view._trace_x[xind+1])
+ break;
+ }
+
+ res.x = xind;
+ res.y = view.order[pos.section];
+ var diff = scheduler._isRender('cell') ? 1 : 0;
+ res.src = view._scales[pos.section] ? view._scales[pos.section].getElementsByTagName('td')[xind+diff] : null;
+
+ var isScale = false;
+ while (res.x === 0 && trg.className != "dhx_cal_data" && trg.parentNode) {
+ if (trg.className.split(" ")[0] == "dhx_matrix_scell") {
+ isScale = true;
+ break;
+ } else {
+ trg = trg.parentNode;
+ }
+ }
+ if (isScale) { // Y scale
+ res.x = -1;
+ res.src = trg;
+ res.scale = true;
+ }
+
+ return res;
+};
+
+var old_click = scheduler._click.dhx_cal_data;
+scheduler._click.dhx_marked_timespan = scheduler._click.dhx_cal_data = function(e){
+ var ret = old_click.apply(this,arguments);
+ var obj = scheduler.matrix[scheduler._mode];
+ if (obj){
+ var pos = scheduler._locate_cell_timeline(e);
+ if (pos){
+ if (pos.scale)
+ scheduler.callEvent("onYScaleClick",[pos.y, obj.y_unit[pos.y], e||event]);
+ else
+ scheduler.callEvent("onCellClick",[pos.x, pos.y, obj._trace_x[pos.x], (((obj._matrix[pos.y]||{})[pos.x])||[]), e||event]);
+ }
+ }
+ return ret;
+};
+
+scheduler.dblclick_dhx_matrix_cell = function(e){
+ var obj = scheduler.matrix[scheduler._mode];
+ if (obj){
+ var pos = scheduler._locate_cell_timeline(e);
+ if (pos){
+ if (pos.scale)
+ scheduler.callEvent("onYScaleDblClick",[pos.y, obj.y_unit[pos.y], e||event]);
+ else
+ scheduler.callEvent("onCellDblClick",[pos.x, pos.y, obj._trace_x[pos.x], (((obj._matrix[pos.y]||{})[pos.x])||[]), e||event]);
+ }
+ }
+};
+
+var old_dblclick_marked_timespan = scheduler.dblclick_dhx_marked_timespan || function(){};
+scheduler.dblclick_dhx_marked_timespan = function(e){
+ var obj = scheduler.matrix[scheduler._mode];
+ if (obj)
+ return scheduler.dblclick_dhx_matrix_cell(e);
+ else
+ return old_dblclick_marked_timespan.apply(this,arguments);
+};
+
+scheduler.dblclick_dhx_matrix_scell = function(e){
+ return scheduler.dblclick_dhx_matrix_cell(e);
+};
+
+scheduler._isRender = function(mode){
+ return (scheduler.matrix[scheduler._mode] && scheduler.matrix[scheduler._mode].render == mode);
+};
+
+scheduler.attachEvent("onCellDblClick", function (x, y, a, b, event){
+ if (this.config.readonly|| (event.type == "dblclick" && !this.config.dblclick_create)) return;
+
+ var obj = scheduler.matrix[scheduler._mode];
+ var event_options = {};
+ event_options.start_date = obj._trace_x[x];
+ event_options.end_date = (obj._trace_x[x+1]) ? obj._trace_x[x+1] : scheduler.date.add(obj._trace_x[x], obj.x_step, obj.x_unit);
+
+ if (obj._start_correction)
+ event_options.start_date = new Date(event_options.start_date*1 + obj._start_correction);
+ if (obj._end_correction)
+ event_options.end_date = new Date(event_options.end_date - obj._end_correction);
+
+ event_options[obj.y_property] = obj.y_unit[y].key;
+ scheduler.addEventNow(event_options, null, event);
+});
+
+scheduler.attachEvent("onBeforeDrag", function (event_id, mode, native_event_object){
+ return !scheduler._isRender("cell");
+});
+scheduler.attachEvent("onEventChanged", function(id, ev) {
+ ev._timed = this.isOneDayEvent(ev);
+});
+var old_render_marked_timespan = scheduler._render_marked_timespan;
+scheduler._render_marked_timespan = function(options, area, unit_id, min_date, max_date) {
+ if (!scheduler.config.display_marked_timespans)
+ return [];
+
+ if (scheduler.matrix && scheduler.matrix[scheduler._mode]) {
+ if (scheduler._isRender('cell'))
+ return;
+
+ var view_opts = scheduler._lame_copy({}, scheduler.matrix[scheduler._mode]);
+ //timespans must always use actual position, not rounded
+ view_opts.round_position = false;
+ var blocks = [];
+
+ var units = [];
+ var areas = [];
+ var section = options.sections ? (options.sections.units || options.sections.timeline) : null;
+ if (!unit_id) { // should draw for every unit...
+ var order = view_opts.order;
+ if (section) { // ...or for only section if mentioned in configuration of timespan
+ if (order.hasOwnProperty(section)) {
+ units.push(section);
+ areas.push(view_opts._scales[section]);
+ }
+ }else{
+ for (var key in order) {
+ if (order.hasOwnProperty(key)) {
+ units.push(key);
+ areas.push(view_opts._scales[key]);
+ }
+ }
+ }
+ } else {
+ areas = [area];
+ units = [unit_id];
+ }
+
+ var min_date = min_date ? new Date(min_date) : scheduler._min_date;
+ var max_date = max_date ? new Date(max_date) : scheduler._max_date;
+ var dates = [];
+
+ if (options.days > 6) {
+ var specific_date = new Date(options.days);
+ if (scheduler.date.date_part(new Date(min_date)) <= +specific_date && +max_date >= +specific_date)
+ dates.push(specific_date);
+ } else {
+ dates.push.apply(dates, scheduler._get_dates_by_index(options.days));
+ }
+
+ var zones = options.zones;
+ var css_classes = scheduler._get_css_classes_by_config(options);
+
+ for (var j=0; j<units.length; j++) {
+ area = areas[j];
+ unit_id = units[j];
+
+ for (var i=0; i<dates.length; i++) {
+ var date = dates[i];
+ for (var k=0; k<zones.length; k += 2) {
+ var zone_start = zones[k];
+ var zone_end = zones[k+1];
+ var start_date = new Date(+date + zone_start*60*1000);
+ var end_date = new Date(+date + zone_end*60*1000);
+
+ if (!(min_date < end_date && max_date > start_date))
+ continue;
+
+ var block = scheduler._get_block_by_config(options);
+ block.className = css_classes;
+
+ var start_pos = _getX({start_date: start_date}, false, view_opts)-1;
+ var end_pos = _getX({start_date: end_date}, false, view_opts)-1;
+ var width = Math.max(1, end_pos - start_pos - 1);
+ var height = view_opts._section_height[unit_id]-1;
+
+ block.style.cssText = "height: "+height+"px; left: "+start_pos+"px; width: "+width+"px; top: 0;";
+
+ area.insertBefore(block, area.firstChild);
+ blocks.push(block);
+ }
+ }
+ }
+
+ return blocks;
+
+ } else {
+ return old_render_marked_timespan.apply(scheduler, [options, area, unit_id]);
+ }
+};
+
+var old_append_mark_now = scheduler._append_mark_now;
+scheduler._append_mark_now = function(day_index, now) {
+ if (scheduler.matrix && scheduler.matrix[scheduler._mode]) {
+ var n_date = scheduler._currentDate();
+ var zone_start = scheduler._get_zone_minutes(n_date);
+ var options = {
+ days: +scheduler.date.date_part(n_date),
+ zones: [zone_start, zone_start+1],
+ css: "dhx_matrix_now_time",
+ type: "dhx_now_time"
+ };
+ return scheduler._render_marked_timespan(options);
+ } else {
+ return old_append_mark_now.apply(scheduler, [day_index, now]);
+ }
+};
+
+scheduler.attachEvent("onScaleAdd", function(scale, unit_key) {
+ var timespans = scheduler._marked_timespans;
+
+ if (timespans && scheduler.matrix && scheduler.matrix[scheduler._mode]) {
+ var mode = scheduler._mode;
+
+ var min_date = scheduler._min_date;
+ var max_date = scheduler._max_date;
+ var global_data = timespans["global"];
+
+ for (var t_date = scheduler.date.date_part(new Date(min_date)); t_date < max_date; t_date = scheduler.date.add(t_date, 1, "day")) {
+ var day_value = +t_date;
+ var day_index = t_date.getDay();
+ var r_configs = [];
+
+ var day_types = global_data[day_value]||global_data[day_index];
+ r_configs.push.apply(r_configs, scheduler._get_configs_to_render(day_types));
+
+ if (timespans[mode] && timespans[mode][unit_key]) {
+ var z_config = [];
+ var unit_types = scheduler._get_types_to_render(timespans[mode][unit_key][day_index], timespans[mode][unit_key][day_value]);
+ z_config.push.apply(z_config, scheduler._get_configs_to_render(unit_types));
+ if(z_config.length)
+ r_configs = z_config;
+ }
+
+ for (var i=0; i<r_configs.length; i++) {
+ var config = r_configs[i];
+ var day = config.days;
+ if (day < 7) {
+ day = day_value;
+ //specify min/max timespan dates, otherwise it can be rendered multiple times in some configurations
+ scheduler._render_marked_timespan(config, scale, unit_key, t_date, scheduler.date.add(t_date, 1, "day"));
+ day = day_index;
+ } else {
+ scheduler._render_marked_timespan(config, scale, unit_key, t_date, scheduler.date.add(t_date, 1, "day"));
+ }
+ }
+ }
+ }
+});
+
+scheduler._resolve_timeline_section = function(view, pos){
+ var yind = 0;
+ var summ = 0;
+ for (yind; yind < this._colsS.heights.length; yind++) {
+ summ += this._colsS.heights[yind];
+ if (summ > pos.y)
+ break;
+ }
+
+ if(!view.y_unit[yind]) {
+ yind=view.y_unit.length-1;
+ }
+ if(this._drag_event && !this._drag_event._orig_section){
+ this._drag_event._orig_section = view.y_unit[yind].key;
+ }
+
+ pos.fields = {};
+ if (yind >= 0 && view.y_unit[yind]) {
+ pos.section = pos.fields[view.y_property] = view.y_unit[yind].key;
+ }
+};
+scheduler._update_timeline_section = function(action){
+ var view = action.view,
+ event = action.event,
+ pos = action.pos;
+
+ if (event) {
+ if(event[view.y_property] != pos.section){
+ var line_height = this._get_timeline_event_height(event, view);
+ event._sorder = this._get_dnd_order(event._sorder, line_height, view._section_height[pos.section]);
+ }
+ event[view.y_property] = pos.section;
+ }
+};
+scheduler._get_date_index=function(config, date) {
+ var index = 0;
+ var trace_x = config._trace_x;
+ while (index < trace_x.length-1 && +date >= +trace_x[index+1]) {
+ index++;
+ }
+ return index;
+};
+
+scheduler.attachEvent("onBeforeTodayDisplayed", function() {
+ for(var i in scheduler.matrix){
+ var obj = scheduler.matrix[i];
+ obj.x_start = obj._original_x_start;
+ }
+ return true;
+});
+
+scheduler.attachEvent("onOptionsLoad",function(){
+ for(var i in scheduler.matrix){
+ var obj = scheduler.matrix[i];
+
+ obj.order = {};
+ scheduler.callEvent('onOptionsLoadStart', []);
+ for(var i=0; i<obj.y_unit.length;i++)
+ obj.order[obj.y_unit[i].key]=i;
+ scheduler.callEvent('onOptionsLoadFinal', []);
+ if (scheduler._date && obj.name == scheduler._mode)
+ scheduler.setCurrentView(scheduler._date, scheduler._mode);
+ }
+});
+
+scheduler.attachEvent("onSchedulerResize",function(){
+ if (scheduler.matrix[this._mode]){
+ var obj = scheduler.matrix[this._mode];
+ scheduler._renderMatrix.call(obj, true, true);
+ return false;
+ }
+ return true;
+});
+
+scheduler.attachEvent("onBeforeDrag",function(id, drag_mode, e){
+ if(drag_mode == 'resize'){
+ var trg = e.target || e.srcElement;
+ if((trg.className||"").indexOf("dhx_event_resize_end") < 0){
+ scheduler._drag_from_start = true;
+ }else{
+ scheduler._drag_from_start = false;
+ }
+ }
+
+ return true;
+});
+
+};
+scheduler._temp_matrix_scope();
diff --git a/codebase/sources/ext/dhtmlxscheduler_timeline.js.map b/codebase/sources/ext/dhtmlxscheduler_timeline.js.map
new file mode 100644
index 0000000..62bc255
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_timeline.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_timeline.js.map","sources":["dhtmlxscheduler_timeline.js"],"names":["scheduler","_temp_matrix_scope","trace_events","evs","get_visible_events","matrix","i","this","y_unit","length","y","order","y_property","x","_trace_x","start_date","end_date","push","_getX","ev","isEndPoint","config","step","_step","round_position","column_offset","date","valueOf","_max_date","delta","_min_date_timeline","index","_get_date_index","_ignores","_cols","column_date","add","_mode","x_step","x_unit","first_hour","last_hour","_start_correction","Math","round","get_rounded_date","isEndDate","rounded_date","Date","get_events_html","html","render","sort","a","b","id","stack","evs_length","j","_inner","ev_start_date","apply","stack_ev","splice","sorderSet","p","t_ev","_sorder","h","_is_sorder","t","_max_sorder","w","max_count","_count","m","v","render_timeline_event","call","y_scale","d","_load_mode","_load","tevs","tev","tev_section","show_unassigned","key","hasOwnProperty","clone","_lame_copy","summ","realcount","_ignores_detected","_end_correction","_summ","heights","_colsS","_events_height","_section_height","stats","_logic","_merge","height","dy","section_autoheight","offsetHeight","max","floor","tr_className","style_height","style_width","dx","td_className","templates","name","label","td_content","summ_width","table_className","events_html","fit_events","rendered_height","_matrix","innerHTML","_rendered","divs","_obj","getElementsByTagName","getAttribute","_scales","firstChild","rows","unit_key","scale","_isRender","childNodes","callEvent","x_scale","current_sh","xy","scale_height","original_sh","_header_resized","_x","scroll_width","left","header","_els","style","width","_min_date","preserve","preserve_scale_length","start","_process_ignores","x_size","size","k","second_scale","mode","control_dates","second_cols","second_left","t_index","l","res","is_new_interval","top","bottom","lastChild","position","tdate","scs","head","document","createElement","className","set_xy","appendChild","_render_x_header","cs","trace","onclick","e","pos","locate_hcell","event","ondblclick","control_date","getHours","getDate","getMonth","getFullYear","getISOWeek","set_full_view","set_sizes","_init_matrix_tooltip","temp","_mark_now","hideToolTip","_tooltip","display","showToolTip","obj","offset","mark","body","_click","dhx_cal_data","bg_color","color","textColor","_timed","event_date","offsetWidth","src","html_index","el","parentNode","trg","target","srcElement","tagName","split","c","createTimelineView","_skin_init","y_step","x_start","y_start","y_size","event_dy","bar_height","event_min_dy","resize_events","render_name","timeline","checkEvent","_original_x_start","old","render_data","arguments","clear_event","_renderMatrix","ar","section_id","section_label","text","datea","dateb","getDay","date_part","getMinutes","day_date","week_date","date_to_str","x_date","hour_date","resulting_date","x_length","converted_step","total_steps","steps_offset","func","day_start","temp_date","_drag_event","_drag_id","getEvent","_dhx_changed","ratio","column_width","xind","edge","getState","drag_mode","force_redraw","custom","timestamp_diff","_drag_mode","drag_event","_move_delta","preserve_length","_get_real_event_length","_event_length","current_back_shift","_get_fictional_event_length","_drag_from_start","resize_from_start","_resize_from_start","undefined","_resolve_timeline_section","section","_update_timeline_section","view","time_step","shift","_get_timeline_event_height","event_height","_get_timeline_event_y","sorder","cascade_event_display","cascade_event_margin","attach","x_end","hb","section_height","event_class","event_bar_text","_text_style","drag_resize","readonly","dhx_event_resize","ind","parent","cells","_matrix_tooltip_handler","_locate_cell_timeline","getOffset","_detachDomEvent","dhtmlxEvent","refresh","scrollTop","_date","_table_view","replace","getActionData","diff","isScale","old_click","dhx_marked_timespan","ret","dblclick_dhx_matrix_cell","old_dblclick_marked_timespan","dblclick_dhx_marked_timespan","dblclick_dhx_matrix_scell","attachEvent","type","dblclick_create","event_options","addEventNow","isOneDayEvent","old_render_marked_timespan","_render_marked_timespan","options","area","unit_id","min_date","max_date","display_marked_timespans","view_opts","blocks","units","areas","sections","dates","days","specific_date","_get_dates_by_index","zones","css_classes","_get_css_classes_by_config","zone_start","zone_end","block","_get_block_by_config","start_pos","end_pos","cssText","insertBefore","old_append_mark_now","_append_mark_now","day_index","now","n_date","_currentDate","_get_zone_minutes","css","timespans","_marked_timespans","global_data","t_date","day_value","r_configs","day_types","_get_configs_to_render","z_config","unit_types","_get_types_to_render","day","yind","_orig_section","fields","action","line_height","_get_dnd_order","trace_x","setCurrentView","indexOf"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_tooltip.js b/codebase/sources/ext/dhtmlxscheduler_tooltip.js
new file mode 100644
index 0000000..1dbad28
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_tooltip.js
@@ -0,0 +1,223 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+window.dhtmlXTooltip = scheduler.dhtmlXTooltip = window.dhtmlxTooltip = {};
+
+dhtmlXTooltip.config = {
+ className: 'dhtmlXTooltip tooltip',
+ timeout_to_display: 50,
+ timeout_to_hide: 50,
+ delta_x: 15,
+ delta_y: -20
+};
+
+dhtmlXTooltip.tooltip = document.createElement('div');
+dhtmlXTooltip.tooltip.className = dhtmlXTooltip.config.className;
+
+dhtmlXTooltip.show = function(event, text) { //browser event, text to display
+ if (scheduler.config.touch && !scheduler.config.touch_tooltip) return;
+
+ var dhxTooltip = dhtmlXTooltip;
+ var tooltip_div = this.tooltip;
+ var tooltip_div_style = tooltip_div.style;
+ dhxTooltip.tooltip.className = dhxTooltip.config.className;
+ var pos = this.position(event);
+
+ var target = event.target || event.srcElement;
+ // if we are over tooltip -- do nothing, just return (so tooltip won't move)
+ if (this.isTooltip(target)) {
+ return;
+ }
+
+ var actual_x = pos.x + (dhxTooltip.config.delta_x || 0);
+ var actual_y = pos.y - (dhxTooltip.config.delta_y || 0);
+
+ tooltip_div_style.visibility = "hidden";
+
+ if (tooltip_div_style.removeAttribute) {
+ tooltip_div_style.removeAttribute("right");
+ tooltip_div_style.removeAttribute("bottom");
+ } else {
+ tooltip_div_style.removeProperty("right");
+ tooltip_div_style.removeProperty("bottom");
+ }
+
+ tooltip_div_style.left = "0";
+ tooltip_div_style.top = "0";
+
+ this.tooltip.innerHTML = text;
+ document.body.appendChild(this.tooltip);
+
+ var tooltip_width = this.tooltip.offsetWidth;
+ var tooltip_height = this.tooltip.offsetHeight;
+
+ if ((document.body.offsetWidth - actual_x - tooltip_width) < 0) { // tooltip is out of the right page bound
+ if(tooltip_div_style.removeAttribute)
+ tooltip_div_style.removeAttribute("left");
+ else
+ tooltip_div_style.removeProperty("left");
+ tooltip_div_style.right = (document.body.offsetWidth - actual_x + 2 * (dhxTooltip.config.delta_x||0)) + "px";
+ } else {
+ if (actual_x < 0) {
+ // tooltips is out of the left page bound
+ tooltip_div_style.left = (pos.x + Math.abs(dhxTooltip.config.delta_x||0)) + "px";
+ } else {
+ // normal situation
+ tooltip_div_style.left = actual_x + "px";
+ }
+ }
+
+ if ((document.body.offsetHeight - actual_y - tooltip_height) < 0) { // tooltip is below bottom of the page
+ if(tooltip_div_style.removeAttribute)
+ tooltip_div_style.removeAttribute("top");
+ else
+ tooltip_div_style.removeProperty("top");
+ tooltip_div_style.bottom = (document.body.offsetHeight - actual_y - 2 * (dhxTooltip.config.delta_y||0)) + "px";
+ } else {
+ if (actual_y < 0) {
+ // tooltip is higher then top of the page
+ tooltip_div_style.top = (pos.y + Math.abs(dhxTooltip.config.delta_y||0)) + "px";
+ } else {
+ // normal situation
+ tooltip_div_style.top = actual_y + "px";
+ }
+ }
+
+ tooltip_div_style.visibility = "visible";
+ this.tooltip.onmouseleave = function(e){
+ /*
+ A rare but reported scenario, when tooltip appears at the edge of the scheduler (e.g. left part inside cal, right part - outside).
+ User moves mouse from the scheduler into the tooltip, and then from the tooltip to the page outside the calendar.
+ As a result - tooltip freezes and no longer reacts until mouse reenters the calendar.
+ */
+ var tooltip = scheduler.dhtmlXTooltip;
+
+ var node = e.relatedTarget;
+ while (node != scheduler._obj && node) {
+ node = node.parentNode;
+ }
+
+ if(node != scheduler._obj)
+ tooltip.delay(tooltip.hide, tooltip, [], tooltip.config.timeout_to_hide);
+ };
+
+ scheduler.callEvent("onTooltipDisplayed", [this.tooltip, this.tooltip.event_id]);
+};
+dhtmlXTooltip._clearTimeout = function(){
+ if(this.tooltip._timeout_id) {
+ window.clearTimeout(this.tooltip._timeout_id);
+ }
+};
+
+dhtmlXTooltip.hide = function() {
+ if (this.tooltip.parentNode) {
+ var event_id = this.tooltip.event_id;
+ this.tooltip.event_id = null;
+ this.tooltip.onmouseleave = null;
+ this.tooltip.parentNode.removeChild(this.tooltip);
+ scheduler.callEvent("onAfterTooltip", [event_id]);
+ }
+ this._clearTimeout();
+};
+dhtmlXTooltip.delay = function(method, object, params, delay) {
+ this._clearTimeout();
+ this.tooltip._timeout_id = setTimeout(function() {
+ var ret = method.apply(object, params);
+ method = object = params = null;
+ return ret;
+ }, delay || this.config.timeout_to_display);
+};
+
+dhtmlXTooltip.isTooltip = function(node) {
+ var res = false;
+ if (node.className.split(" ")[0] == "dhtmlXTooltip") {
+ //debugger;
+ }
+ while (node && !res) {
+ res = (node.className == this.tooltip.className);
+ node = node.parentNode;
+ }
+ return res;
+};
+
+dhtmlXTooltip.position = function(ev) {
+ ev = ev || window.event;
+ if (ev.pageX || ev.pageY) //FF, KHTML
+ return {x:ev.pageX, y:ev.pageY};
+ //IE
+ var d = ((window._isIE) && (document.compatMode != "BackCompat")) ? document.documentElement : document.body;
+ return {
+ x:ev.clientX + d.scrollLeft - d.clientLeft,
+ y:ev.clientY + d.scrollTop - d.clientTop
+ };
+};
+
+scheduler.attachEvent("onMouseMove", function(event_id, e) { // (scheduler event_id, browser event)
+ var ev = window.event || e;
+ var target = ev.target || ev.srcElement;
+ var dhxTooltip = dhtmlXTooltip;
+
+ var is_tooltip = dhxTooltip.isTooltip(target);
+ var is_tooltip_target = (dhxTooltip.isTooltipTarget && dhxTooltip.isTooltipTarget(target));
+
+ // if we are over event or tooltip or custom target for tooltip
+ if (event_id || is_tooltip || is_tooltip_target) {
+ var text;
+
+ if (event_id || dhxTooltip.tooltip.event_id) {
+ var event = scheduler.getEvent(event_id) || scheduler.getEvent(dhxTooltip.tooltip.event_id);
+ if (!event)
+ return;
+
+ dhxTooltip.tooltip.event_id = event.id;
+ text = scheduler.templates.tooltip_text(event.start_date, event.end_date, event);
+ if (!text)
+ return dhxTooltip.hide();
+ }
+ if (is_tooltip_target) {
+ text = "";
+ }
+
+ var evt;
+ if (_isIE) {
+ //make a copy of event, will be used in timed call
+
+ evt = {'pageX':undefined,
+ 'pageY':undefined,
+ 'clientX':undefined,
+ 'clientY':undefined,
+ 'target':undefined,
+ 'srcElement':undefined
+ };
+ for(var i in evt){
+ evt[i] = ev[i];
+ }
+ }
+
+ if (!scheduler.callEvent("onBeforeTooltip", [event_id]) || !text)
+ return;
+
+ dhxTooltip.delay(dhxTooltip.show, dhxTooltip, [(evt || ev), text]); // showing tooltip
+ } else {
+ dhxTooltip.delay(dhxTooltip.hide, dhxTooltip, [], dhxTooltip.config.timeout_to_hide);
+ }
+});
+scheduler.attachEvent("onBeforeDrag", function() {
+ dhtmlXTooltip.hide();
+ return true;
+});
+scheduler.attachEvent("onEventDeleted", function() {
+ dhtmlXTooltip.hide();
+ return true;
+});
+
+/* Could be redifined */
+scheduler.templates.tooltip_date_format = scheduler.date.date_to_str("%Y-%m-%d %H:%i");
+
+scheduler.templates.tooltip_text = function(start, end, event) {
+ return "<b>Event:</b> " + event.text + "<br/><b>Start date:</b> " + scheduler.templates.tooltip_date_format(start) + "<br/><b>End date:</b> " + scheduler.templates.tooltip_date_format(end);
+};
diff --git a/codebase/sources/ext/dhtmlxscheduler_tooltip.js.map b/codebase/sources/ext/dhtmlxscheduler_tooltip.js.map
new file mode 100644
index 0000000..76751fa
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_tooltip.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_tooltip.js.map","sources":["dhtmlxscheduler_tooltip.js"],"names":["window","dhtmlXTooltip","scheduler","dhtmlxTooltip","config","className","timeout_to_display","timeout_to_hide","delta_x","delta_y","tooltip","document","createElement","show","event","text","touch","touch_tooltip","dhxTooltip","tooltip_div","this","tooltip_div_style","style","pos","position","target","srcElement","isTooltip","actual_x","x","actual_y","y","visibility","removeAttribute","removeProperty","left","top","innerHTML","body","appendChild","tooltip_width","offsetWidth","tooltip_height","offsetHeight","right","Math","abs","bottom","onmouseleave","e","node","relatedTarget","_obj","parentNode","delay","hide","callEvent","event_id","_clearTimeout","_timeout_id","clearTimeout","removeChild","method","object","params","setTimeout","ret","apply","res","split","ev","pageX","pageY","d","compatMode","documentElement","clientX","scrollLeft","clientLeft","clientY","scrollTop","clientTop","attachEvent","is_tooltip","is_tooltip_target","isTooltipTarget","getEvent","id","templates","tooltip_text","start_date","end_date","evt","_isIE","undefined","i","tooltip_date_format","date","date_to_str","start","end"],"mappings":"AAAAA,OAAOC,cAAgBC,UAAUD,cAAgBD,OAAOG,iBAExDF,cAAcG,QACbC,UAAW,wBACXC,mBAAoB,GACpBC,gBAAiB,GACjBC,QAAS,GACTC,QAAS,KAGVR,cAAcS,QAAUC,SAASC,cAAc,OAC/CX,cAAcS,QAAQL,UAAYJ,cAAcG,OAAOC,UAEvDJ,cAAcY,KAAO,SAASC,EAAOC,GACpC,IAAIb,UAAUE,OAAOY,OAAUd,UAAUE,OAAOa,cAAhD,CAEA,GAAIC,GAAajB,cACbkB,EAAcC,KAAKV,QACnBW,EAAoBF,EAAYG,KACpCJ,GAAWR,QAAQL,UAAYa,EAAWd,OAAOC,SACjD,IAAIkB,GAAMH,KAAKI,SAASV,GAEpBW,EAASX,EAAMW,QAAUX,EAAMY,UAEnC;IAAIN,KAAKO,UAAUF,GAAnB,CAIA,GAAIG,GAAWL,EAAIM,GAAKX,EAAWd,OAAOI,SAAW,GACjDsB,EAAWP,EAAIQ,GAAKb,EAAWd,OAAOK,SAAW,EAErDY,GAAkBW,WAAa,SAE3BX,EAAkBY,iBACrBZ,EAAkBY,gBAAgB,SAClCZ,EAAkBY,gBAAgB,YAElCZ,EAAkBa,eAAe,SACjCb,EAAkBa,eAAe,WAGlCb,EAAkBc,KAAO,IACzBd,EAAkBe,IAAM,IAExBhB,KAAKV,QAAQ2B,UAAYtB,EACzBJ,SAAS2B,KAAKC,YAAYnB,KAAKV,QAE/B,IAAI8B,GAAgBpB,KAAKV,QAAQ+B,YAC7BC,EAAiBtB,KAAKV,QAAQiC,YAE7BhC,UAAS2B,KAAKG,YAAcb,EAAWY,EAAiB,GACzDnB,EAAkBY,gBACpBZ,EAAkBY,gBAAgB,QAElCZ,EAAkBa,eAAe,QAClCb,EAAkBuB,MAASjC,SAAS2B,KAAKG,YAAcb,EAAW,GAAKV,EAAWd,OAAOI,SAAS,GAAM,MAIvGa,EAAkBc,KAFJ,EAAXP,EAEuBL,EAAIM,EAAIgB,KAAKC,IAAI5B,EAAWd,OAAOI,SAAS,GAAM,KAGnDoB,EAAW,KAIjCjB,SAAS2B,KAAKK,aAAeb,EAAWY,EAAkB,GAC3DrB,EAAkBY,gBACpBZ,EAAkBY,gBAAgB,OAElCZ,EAAkBa,eAAe,OAClCb,EAAkB0B,OAAUpC,SAAS2B,KAAKK,aAAeb,EAAW,GAAKZ,EAAWd,OAAOK,SAAS,GAAM,MAIzGY,EAAkBe,IAFJ,EAAXN,EAEsBP,EAAIQ,EAAIc,KAAKC,IAAI5B,EAAWd,OAAOK,SAAS,GAAM,KAGnDqB,EAAW,KAIrCT,EAAkBW,WAAa,UAC/BZ,KAAKV,QAAQsC,aAAe,SAASC,GASpC,IAHA,GAAIvC,GAAUR,UAAUD,cAEpBiD,EAAOD,EAAEE,cACND,GAAQhD,UAAUkD,MAAQF,GAChCA,EAAOA,EAAKG,UAGVH;GAAQhD,UAAUkD,MACpB1C,EAAQ4C,MAAM5C,EAAQ6C,KAAM7C,KAAaA,EAAQN,OAAOG,kBAG1DL,UAAUsD,UAAU,sBAAuBpC,KAAKV,QAASU,KAAKV,QAAQ+C,cAEvExD,cAAcyD,cAAgB,WAC1BtC,KAAKV,QAAQiD,aACf3D,OAAO4D,aAAaxC,KAAKV,QAAQiD,cAInC1D,cAAcsD,KAAO,WACpB,GAAInC,KAAKV,QAAQ2C,WAAY,CAC5B,GAAII,GAAWrC,KAAKV,QAAQ+C,QAC5BrC,MAAKV,QAAQ+C,SAAW,KACxBrC,KAAKV,QAAQsC,aAAe,KAC5B5B,KAAKV,QAAQ2C,WAAWQ,YAAYzC,KAAKV,SACzCR,UAAUsD,UAAU,kBAAmBC,IAExCrC,KAAKsC;EAENzD,cAAcqD,MAAQ,SAASQ,EAAQC,EAAQC,EAAQV,GACtDlC,KAAKsC,gBACLtC,KAAKV,QAAQiD,YAAcM,WAAW,WACrC,GAAIC,GAAMJ,EAAOK,MAAMJ,EAAQC,EAE/B,OADAF,GAASC,EAASC,EAAS,KACpBE,GACLZ,GAASlC,KAAKhB,OAAOE,qBAGzBL,cAAc0B,UAAY,SAASuB,GAClC,GAAIkB,IAAM,CAIV,KAHoC,iBAAhClB,EAAK7C,UAAUgE,MAAM,KAAK,GAGvBnB,IAASkB,GACfA,EAAOlB,EAAK7C,WAAae,KAAKV,QAAQL,UACtC6C,EAAOA,EAAKG,UAEb,OAAOe,IAGRnE,cAAcuB,SAAW,SAAS8C,GAEjC,GADAA,EAAKA,GAAMtE,OAAOc,MACdwD,EAAGC,OAASD,EAAGE,MAClB,OAAQ3C,EAAEyC,EAAGC,MAAOxC,EAAEuC,EAAGE,MAE1B,IAAIC,GAAMzE,OAAY,OAA6B,cAAvBW,SAAS+D,WAA+B/D,SAASgE,gBAAkBhE,SAAS2B,IACxG;OACCT,EAAEyC,EAAGM,QAAUH,EAAEI,WAAaJ,EAAEK,WAChC/C,EAAEuC,EAAGS,QAAUN,EAAEO,UAAYP,EAAEQ,YAIjC/E,UAAUgF,YAAY,cAAe,SAASzB,EAAUR,GACvD,GAAIqB,GAAKtE,OAAOc,OAASmC,EACrBxB,EAAS6C,EAAG7C,QAAU6C,EAAG5C,WACzBR,EAAajB,cAEbkF,EAAajE,EAAWS,UAAUF,GAClC2D,EAAqBlE,EAAWmE,iBAAmBnE,EAAWmE,gBAAgB5D,EAGlF,IAAIgC,GAAY0B,GAAcC,EAAmB,CAChD,GAAIrE,EAEJ,IAAI0C,GAAYvC,EAAWR,QAAQ+C,SAAU,CAC5C,GAAI3C,GAAQZ,UAAUoF,SAAS7B,IAAavD,UAAUoF,SAASpE,EAAWR,QAAQ+C,SAClF,KAAK3C,EACJ,MAID,IAFAI,EAAWR,QAAQ+C,SAAW3C,EAAMyE,GACpCxE,EAAOb,UAAUsF,UAAUC,aAAa3E,EAAM4E,WAAY5E,EAAM6E,SAAU7E,IACrEC,EACJ,MAAOG,GAAWqC,OAEhB6B,IACHrE,EAAO,GAGR,IAAI6E,EACJ;GAAIC,MAAO,CAGVD,GAAOrB,MAAQuB,OACdtB,MAAQsB,OACRlB,QAAUkB,OACVf,QAAUe,OACVrE,OAASqE,OACTpE,WAAaoE,OAEd,KAAI,GAAIC,KAAKH,GACZA,EAAIG,GAAKzB,EAAGyB,GAId,IAAK7F,UAAUsD,UAAU,mBAAoBC,MAAe1C,EAC3D,MAEDG,GAAWoC,MAAMpC,EAAWL,KAAMK,GAAc0E,GAAOtB,EAAKvD,QAE5DG,GAAWoC,MAAMpC,EAAWqC,KAAMrC,KAAgBA,EAAWd,OAAOG,mBAGtEL,UAAUgF,YAAY,eAAgB,WAErC,MADAjF,eAAcsD,QACP,IAERrD,UAAUgF,YAAY,iBAAkB,WAEvC,MADAjF,eAAcsD,QACP,IAIRrD,UAAUsF,UAAUQ,oBAAsB9F,UAAU+F,KAAKC,YAAY,kBAErEhG,UAAUsF,UAAUC,aAAe,SAASU,EAAOC,EAAKtF,GACvD,MAAO,iBAAmBA,EAAMC,KAAO,2BAA6Bb,UAAUsF,UAAUQ,oBAAoBG,GAAS,yBAA2BjG,UAAUsF,UAAUQ,oBAAoBI"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_treetimeline.js b/codebase/sources/ext/dhtmlxscheduler_treetimeline.js
new file mode 100644
index 0000000..706e1bd
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_treetimeline.js
@@ -0,0 +1,313 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.attachEvent("onTimelineCreated", function (obj){
+
+ if(obj.render == "tree") {
+ obj.y_unit_original = obj.y_unit;
+ obj.y_unit = scheduler._getArrayToDisplay(obj.y_unit_original);
+
+ scheduler.attachEvent('onOptionsLoadStart', function(){
+ obj.y_unit = scheduler._getArrayToDisplay(obj.y_unit_original);
+ });
+
+ scheduler.form_blocks[obj.name]={
+ render:function(sns) {
+ var _result = "<div class='dhx_section_timeline' style='overflow: hidden; height: "+sns.height+"px'></div>";
+ return _result;
+ },
+ set_value:function(node,value,ev,config){
+ var options = scheduler._getArrayForSelect(scheduler.matrix[config.type].y_unit_original, config.type);
+ node.innerHTML = '';
+ var temp_select = document.createElement('select');
+ node.appendChild(temp_select);
+
+ var select = node.getElementsByTagName('select')[0];
+
+ if (!select._dhx_onchange && config.onchange) {
+ select.onchange = config.onchange;
+ select._dhx_onchange = true;
+ }
+
+ for (var i = 0; i < options.length; i++) {
+ var temp_option = document.createElement('option');
+ temp_option.value = options[i].key;
+ if(temp_option.value == ev[scheduler.matrix[config.type].y_property])
+ temp_option.selected = true;
+ temp_option.innerHTML = options[i].label;
+ select.appendChild(temp_option);
+ }
+ },
+ get_value:function(node,ev,config){
+ return node.firstChild.value;
+ },
+ focus:function(node){
+ }
+ };
+
+
+ }
+});
+
+scheduler.attachEvent("onBeforeSectionRender", function (render_name, y_unit, timeline){
+ var res = {};
+ if(render_name == "tree"){
+ var height;
+ // section 1
+ var tr_className, style_height, td_className;
+ var div_expand;
+ // section 3
+ var table_className;
+ if(y_unit.children) {
+ height = timeline.folder_dy||timeline.dy;
+ if(timeline.folder_dy && !timeline.section_autoheight) {
+ style_height = "height:"+timeline.folder_dy+"px;";
+ }
+ tr_className = "dhx_row_folder";
+ td_className = "dhx_matrix_scell folder";
+ div_expand = "<div class='dhx_scell_expand'>"+((y_unit.open)?'-':'+')+"</div>";
+ table_className = (timeline.folder_events_available)?"dhx_data_table folder_events":"dhx_data_table folder";
+ } else {
+ height = timeline.dy;
+ tr_className = "dhx_row_item";
+ td_className = "dhx_matrix_scell item"+(scheduler.templates[timeline.name+"_scaley_class"](y_unit.key, y_unit.label, y_unit) ?
+ " "+scheduler.templates[timeline.name+"_scaley_class"](y_unit.key, y_unit.label, y_unit) : '');
+ div_expand = '';
+ table_className = "dhx_data_table";
+ }
+ var td_content = "<div class='dhx_scell_level"+y_unit.level+"'>"+div_expand+"<div class='dhx_scell_name'>"+(scheduler.templates[timeline.name+'_scale_label'](y_unit.key, y_unit.label, y_unit)||y_unit.label)+"</div></div>";
+
+ res = {
+ height: height,
+ style_height: style_height,
+ //section 1
+ tr_className: tr_className,
+ td_className: td_className,
+ td_content: td_content,
+ //section 3
+ table_className: table_className
+ };
+ }
+ return res;
+});
+
+var section_id_before; // section id of the event before dragging (to bring it back if user drop's event on folder without folder_events_available)
+
+scheduler.attachEvent("onBeforeEventChanged", function(event_object, native_event, is_new) {
+ if (scheduler._isRender("tree")) { // if mode's render == tree
+ var section = scheduler.getSection(event_object[scheduler.matrix[scheduler._mode].y_property]);
+ if (section && typeof section.children != 'undefined' && !scheduler.matrix[scheduler._mode].folder_events_available) { // section itself could be not defined in case of new event (addEventNow)
+ if (!is_new) { //if old - move back
+ event_object[scheduler.matrix[scheduler._mode].y_property] = section_id_before;
+ }
+ return false;
+ }
+ }
+ return true;
+});
+
+scheduler.attachEvent("onBeforeDrag", function (event_id, mode, native_event_object){
+ if(scheduler._isRender("tree")) {
+ var cell = scheduler._locate_cell_timeline(native_event_object);
+ var section_id;
+ if(cell) {
+ section_id = scheduler.matrix[scheduler._mode].y_unit[cell.y].key;
+ if(typeof scheduler.matrix[scheduler._mode].y_unit[cell.y].children != "undefined" && !scheduler.matrix[scheduler._mode].folder_events_available) {
+ return false;
+ }
+ }
+
+ var ev = scheduler.getEvent(event_id);
+ section_id_before = section_id||ev[scheduler.matrix[scheduler._mode].y_property]; // either event id or section_id will be available
+ }
+ return true;
+});
+
+scheduler._getArrayToDisplay = function(array){ // function to flatten out hierarhical array, used for tree view
+ var result = [];
+ var fillResultArray = function(array, lvl){
+ var level = lvl||0;
+ for(var i=0; i<array.length; i++) {
+ array[i].level = level;
+ if(typeof array[i].children != "undefined" && typeof array[i].key == "undefined")
+ array[i].key=scheduler.uid();
+ result.push(array[i]);
+ if(array[i].open && array[i].children) {
+ fillResultArray(array[i].children, level+1);
+ }
+ }
+ };
+ fillResultArray(array);
+ return result;
+};
+
+
+scheduler._getArrayForSelect = function(array, mode){ // function to flatten out hierarhical array, used for tree view
+ var result = [];
+ var fillResultArray = function(array){
+ for(var i=0; i<array.length; i++) {
+ if(scheduler.matrix[mode].folder_events_available) {
+ result.push(array[i]);
+ }
+ else {
+ if(typeof array[i].children == "undefined") {
+ result.push(array[i]);
+ }
+ }
+ if(array[i].children)
+ fillResultArray(array[i].children, mode);
+ }
+ };
+ fillResultArray(array);
+ return result;
+};
+
+
+/*
+scheduler._toggleFolderDisplay(4) -- toggle display of the section with key 4 (closed -> open)
+scheduler._toggleFolderDisplay(4, true) -- open section with the key 4 (doesn't matter what status was before). False - close.
+scheduler._toggleFolderDisplay(4, false, true) -- close ALL sections. Key is not used in such condition.
+*/
+scheduler._toggleFolderDisplay = function(key, status, all_sections){ // used for tree view
+ var marked;
+ var toggleElement = function(key, array, status, all_sections) {
+ for (var i=0; i<array.length; i++) {
+ if((array[i].key == key || all_sections) && array[i].children) {
+ array[i].open = (typeof status != "undefined") ? status : !array[i].open;
+ marked = true;
+ if(!all_sections && marked)
+ break;
+ }
+ if(array[i].children) {
+ toggleElement(key,array[i].children, status, all_sections);
+ }
+ }
+ };
+ var section = scheduler.getSection(key);
+
+ if((typeof status == "undefined") && !all_sections){
+ //toggle
+ status = !section.open;
+ }
+ if (scheduler.callEvent("onBeforeFolderToggle", [section, status, all_sections])) {
+ toggleElement(key,scheduler.matrix[scheduler._mode].y_unit_original, status, all_sections);
+ scheduler.matrix[scheduler._mode].y_unit = scheduler._getArrayToDisplay(scheduler.matrix[scheduler._mode].y_unit_original);
+ scheduler.callEvent("onOptionsLoad",[]);
+ scheduler.callEvent("onAfterFolderToggle", [section, status, all_sections]);
+ }
+};
+
+scheduler.attachEvent("onCellClick", function (x, y, a, b, event){
+ if(scheduler._isRender("tree")) {
+ if(!scheduler.matrix[scheduler._mode].folder_events_available) {
+ if(typeof scheduler.matrix[scheduler._mode].y_unit[y] != "undefined" &&
+ typeof scheduler.matrix[scheduler._mode].y_unit[y].children != "undefined") {
+ scheduler._toggleFolderDisplay(scheduler.matrix[scheduler._mode].y_unit[y].key);
+ }
+ }
+ }
+});
+
+scheduler.attachEvent("onYScaleClick", function (index, value, event){
+ if(scheduler._isRender("tree")) {
+ if(typeof value.children != "undefined") {
+ scheduler._toggleFolderDisplay(value.key);
+ }
+ }
+});
+
+scheduler.getSection = function(id){
+ if(scheduler._isRender("tree")) {
+ var obj;
+ var findElement = function(key, array) {
+ for (var i=0; i<array.length; i++) {
+ if(array[i].key == key)
+ obj = array[i];
+ if(array[i].children)
+ findElement(key,array[i].children);
+ }
+ };
+ findElement(id, scheduler.matrix[scheduler._mode].y_unit_original);
+ return obj||null;
+ }
+};
+
+scheduler.deleteSection = function(id){
+ if(scheduler._isRender("tree")) {
+ var result = false;
+ var deleteElement = function(key, array) {
+ for (var i=0; i<array.length; i++) {
+ if(array[i].key == key) {
+ array.splice(i,1);
+ result = true;
+ }
+ if(result)
+ break;
+ if(array[i].children)
+ deleteElement(key,array[i].children);
+ }
+ };
+ deleteElement(id, scheduler.matrix[scheduler._mode].y_unit_original);
+ scheduler.matrix[scheduler._mode].y_unit = scheduler._getArrayToDisplay(scheduler.matrix[scheduler._mode].y_unit_original);
+ scheduler.callEvent("onOptionsLoad",[]);
+ return result;
+ }
+};
+
+scheduler.deleteAllSections = function(){
+ if(scheduler._isRender("tree")) {
+ scheduler.matrix[scheduler._mode].y_unit_original = [];
+ scheduler.matrix[scheduler._mode].y_unit = scheduler._getArrayToDisplay(scheduler.matrix[scheduler._mode].y_unit_original);
+ scheduler.callEvent("onOptionsLoad",[]);
+ }
+};
+
+scheduler.addSection = function(obj, parent_id){
+ if(scheduler._isRender("tree")) {
+ var result = false;
+ var addElement = function(obj, parent_key, array) {
+ if(!parent_id) {
+ array.push(obj);
+ result = true;
+ }
+ else {
+ for (var i=0; i<array.length; i++) {
+ if(array[i].key == parent_key && typeof array[i].children != "undefined") {
+ array[i].children.push(obj);
+ result = true;
+ }
+ if(result)
+ break;
+ if(array[i].children)
+ addElement(obj,parent_key,array[i].children);
+ }
+ }
+ };
+ addElement(obj, parent_id, scheduler.matrix[scheduler._mode].y_unit_original);
+ scheduler.matrix[scheduler._mode].y_unit = scheduler._getArrayToDisplay(scheduler.matrix[scheduler._mode].y_unit_original);
+ scheduler.callEvent("onOptionsLoad",[]);
+ return result;
+ }
+};
+
+
+scheduler.openAllSections = function() {
+ if(scheduler._isRender("tree"))
+ scheduler._toggleFolderDisplay(1, true, true);
+};
+scheduler.closeAllSections = function() {
+ if(scheduler._isRender("tree"))
+ scheduler._toggleFolderDisplay(1, false, true);
+};
+scheduler.openSection = function(section_id){
+ if(scheduler._isRender("tree"))
+ scheduler._toggleFolderDisplay(section_id, true);
+};
+scheduler.closeSection = function(section_id){
+ if(scheduler._isRender("tree"))
+ scheduler._toggleFolderDisplay(section_id, false);
+};
diff --git a/codebase/sources/ext/dhtmlxscheduler_treetimeline.js.map b/codebase/sources/ext/dhtmlxscheduler_treetimeline.js.map
new file mode 100644
index 0000000..fa99384
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_treetimeline.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_treetimeline.js.map","sources":["dhtmlxscheduler_treetimeline.js"],"names":["scheduler","attachEvent","obj","render","y_unit_original","y_unit","_getArrayToDisplay","form_blocks","name","sns","_result","height","set_value","node","value","ev","config","options","_getArrayForSelect","matrix","type","innerHTML","temp_select","document","createElement","appendChild","select","getElementsByTagName","_dhx_onchange","onchange","i","length","temp_option","key","y_property","selected","label","get_value","firstChild","focus","render_name","timeline","res","tr_className","style_height","td_className","div_expand","table_className","children","folder_dy","dy","section_autoheight","templates","td_content","level","section_id_before","event_object","native_event","is_new","_isRender","section","getSection","_mode","folder_events_available","event_id","mode","native_event_object","section_id","cell","_locate_cell_timeline","y","getEvent","array","result","fillResultArray","lvl","uid","push","open","_toggleFolderDisplay","status","all_sections","marked","toggleElement","callEvent","x","index","id","findElement","deleteSection","deleteElement","splice","deleteAllSections","addSection","parent_id","addElement","parent_key","openAllSections","closeAllSections","openSection","closeSection"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_units.js b/codebase/sources/ext/dhtmlxscheduler_units.js
new file mode 100644
index 0000000..c6a94d3
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_units.js
@@ -0,0 +1,259 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler._props = {};
+scheduler.createUnitsView=function(name,property,list,size,step,skip_incorrect){
+ if (typeof name == "object"){
+ list = name.list;
+ property = name.property;
+ size = name.size||0;
+ step = name.step||1;
+ skip_incorrect = name.skip_incorrect;
+ name = name.name;
+ }
+
+ scheduler._props[name]={map_to:property, options:list, step:step, position:0 };
+ if(size>scheduler._props[name].options.length){
+ scheduler._props[name]._original_size = size;
+ size = 0;
+ }
+ scheduler._props[name].size = size;
+ scheduler._props[name].skip_incorrect = skip_incorrect||false;
+
+ scheduler.date[name+"_start"]= scheduler.date.day_start;
+ scheduler.templates[name+"_date"] = function(date){
+ return scheduler.templates.day_date(date);
+ };
+
+ scheduler._get_unit_index = function(unit_view, date) {
+ var original_position = unit_view.position || 0;
+ var date_position = Math.floor((scheduler._correct_shift(+date, 1) - +scheduler._min_date) / (60 * 60 * 24 * 1000));
+ return original_position + date_position;
+ };
+ scheduler.templates[name + "_scale_text"] = function(id, label, option) {
+ if (option.css) {
+ return "<span class='" + option.css + "'>" + label + "</span>";
+ } else {
+ return label;
+ }
+ };
+ scheduler.templates[name+"_scale_date"] = function(date) {
+ var unit_view = scheduler._props[name];
+ var list = unit_view.options;
+ if (!list.length) return "";
+ var index = scheduler._get_unit_index(unit_view, date);
+ var option = list[index];
+ return scheduler.templates[name + "_scale_text"](option.key, option.label, option);
+ };
+
+ scheduler.date["add_"+name]=function(date,inc){ return scheduler.date.add(date,inc,"day"); };
+ scheduler.date["get_"+name+"_end"]=function(date){
+ return scheduler.date.add(date,scheduler._props[name].size||scheduler._props[name].options.length,"day");
+ };
+
+ scheduler.attachEvent("onOptionsLoad",function(){
+ var pr = scheduler._props[name];
+ var order = pr.order = {};
+ var list = pr.options;
+ for(var i=0; i<list.length;i++)
+ order[list[i].key]=i;
+ if(pr._original_size && pr.size===0){
+ pr.size = pr._original_size;
+ delete pr.original_size;
+ }
+ if(pr.size > list.length) {
+ pr._original_size = pr.size;
+ pr.size = 0;
+ }
+ else
+ pr.size = pr._original_size||pr.size;
+ if (scheduler._date && scheduler._mode == name)
+ scheduler.setCurrentView(scheduler._date, scheduler._mode);
+ });
+
+ scheduler["mouse_"+ name] = function(pos){ //mouse_coord handler
+ var pr = scheduler._props[this._mode];
+
+ if (pr){
+ pos = this._week_indexes_from_pos(pos);
+ if(!this._drag_event) this._drag_event = {};
+
+ if (this._drag_id && this._drag_mode){
+ this._drag_event._dhx_changed = true;
+ }
+ var unit_ind = Math.min(pos.x+pr.position,pr.options.length-1);
+ pos.section = (pr.options[unit_ind]||{}).key;
+ pos.x = 0;
+
+ var ev = this.getEvent(this._drag_id);
+ this._update_unit_section({view:pr, event:ev, pos:pos});
+ }
+ pos.force_redraw = true;
+
+ return pos;
+ };
+
+
+
+ scheduler.callEvent("onOptionsLoad",[]);
+};
+
+scheduler._update_unit_section = function(action){
+ var view = action.view,
+ event = action.event,
+ pos = action.pos;
+ if(event) {
+ event[view.map_to] = pos.section;
+ }
+};
+
+scheduler.scrollUnit=function(step){
+ var pr = scheduler._props[this._mode];
+ if (pr){
+ pr.position=Math.min(Math.max(0,pr.position+step),pr.options.length-pr.size);
+ this.update_view();
+ }
+};
+(function(){
+ var _removeIncorrectEvents = function(evs) {
+ var pr = scheduler._props[scheduler._mode];
+ if(pr && pr.order && pr.skip_incorrect) {
+ var correct_events = [];
+ for(var i=0; i<evs.length; i++) {
+ if(typeof pr.order[evs[i][pr.map_to]] != "undefined") {
+ correct_events.push(evs[i]);
+ }
+ }
+ evs.splice(0,evs.length);
+ evs.push.apply(evs,correct_events);
+ }
+ return evs;
+ };
+ var old_pre_render_events_table = scheduler._pre_render_events_table;
+ scheduler._pre_render_events_table=function(evs,hold) {
+ evs = _removeIncorrectEvents(evs);
+ return old_pre_render_events_table.apply(this, [evs, hold]);
+ };
+ var old_pre_render_events_line = scheduler._pre_render_events_line;
+ scheduler._pre_render_events_line = function(evs,hold){
+ evs = _removeIncorrectEvents(evs);
+ return old_pre_render_events_line.apply(this, [evs, hold]);
+ };
+ var fix_und=function(pr,ev){
+ if (pr && typeof pr.order[ev[pr.map_to]] == "undefined"){
+ var s = scheduler;
+ var dx = 24*60*60*1000;
+ var ind = Math.floor((ev.end_date - s._min_date)/dx);
+ //ev.end_date = new Date(s.date.time_part(ev.end_date)*1000+s._min_date.valueOf());
+ //ev.start_date = new Date(s.date.time_part(ev.start_date)*1000+s._min_date.valueOf());
+ ev[pr.map_to] = pr.options[Math.min(ind+pr.position,pr.options.length-1)].key;
+ return true;
+ }
+ };
+ var t = scheduler._reset_scale;
+
+ var oldive = scheduler.is_visible_events;
+ scheduler.is_visible_events = function(e){
+ var res = oldive.apply(this,arguments);
+ if (res){
+ var pr = scheduler._props[this._mode];
+ if (pr && pr.size){
+ var val = pr.order[e[pr.map_to]];
+ if (val < pr.position || val >= pr.size+pr.position )
+ return false;
+ }
+ }
+ return res;
+ };
+ scheduler._reset_scale = function(){
+ var pr = scheduler._props[this._mode];
+ var ret = t.apply(this,arguments);
+ if (pr){
+ this._max_date=this.date.add(this._min_date,1,"day");
+
+ var d = this._els["dhx_cal_data"][0].childNodes;
+ for (var i=0; i < d.length; i++)
+ d[i].className = d[i].className.replace("_now",""); //clear now class
+
+ if (pr.size && pr.size < pr.options.length){
+
+ var h = this._els["dhx_cal_header"][0];
+ var arrow = document.createElement("DIV");
+ if (pr.position){
+ arrow.className = "dhx_cal_prev_button";
+ arrow.style.cssText="left:1px;top:2px;position:absolute;";
+ arrow.innerHTML = "&nbsp;";
+ h.firstChild.appendChild(arrow);
+ arrow.onclick=function(){
+ scheduler.scrollUnit(pr.step*-1);
+ };
+ }
+ if (pr.position+pr.size<pr.options.length){
+ arrow = document.createElement("DIV");
+ arrow.className = "dhx_cal_next_button";
+ arrow.style.cssText="left:auto; right:0px;top:2px;position:absolute;";
+ arrow.innerHTML = "&nbsp;";
+ h.lastChild.appendChild(arrow);
+ arrow.onclick=function(){
+ scheduler.scrollUnit(pr.step);
+ };
+ }
+ }
+ }
+ return ret;
+
+ };
+ var r = scheduler._get_event_sday;
+ scheduler._get_event_sday=function(ev){
+ var pr = scheduler._props[this._mode];
+ if (pr){
+ fix_und(pr,ev);
+ return pr.order[ev[pr.map_to]]-pr.position;
+ }
+ return r.call(this,ev);
+ };
+ var l = scheduler.locate_holder_day;
+ scheduler.locate_holder_day=function(a,b,ev){
+ var pr = scheduler._props[this._mode];
+ if (pr && ev) {
+ fix_und(pr,ev);
+ return pr.order[ev[pr.map_to]]*1+(b?1:0)-pr.position;
+ }
+ return l.apply(this,arguments);
+ };
+
+ var o = scheduler._time_order;
+ scheduler._time_order = function(evs){
+ var pr = scheduler._props[this._mode];
+ if (pr){
+ evs.sort(function(a,b){
+ return pr.order[a[pr.map_to]]>pr.order[b[pr.map_to]]?1:-1;
+ });
+ } else
+ o.apply(this,arguments);
+ };
+ scheduler.attachEvent("onEventAdded",function(id,ev){
+ if (this._loading) return true;
+ for (var a in scheduler._props){
+ var pr = scheduler._props[a];
+ if (typeof ev[pr.map_to] == "undefined")
+ ev[pr.map_to] = pr.options[0].key;
+ }
+ return true;
+ });
+ scheduler.attachEvent("onEventCreated",function(id,n_ev){
+ var pr = scheduler._props[this._mode];
+ if (pr && n_ev){
+ var ev = this.getEvent(id);
+ var pos = this._mouse_coords(n_ev);
+ this._update_unit_section({view:pr, event:ev, pos:pos});
+ fix_und(pr,ev);
+ this.event_updated(ev);
+ }
+ return true;
+ });
+})();
diff --git a/codebase/sources/ext/dhtmlxscheduler_units.js.map b/codebase/sources/ext/dhtmlxscheduler_units.js.map
new file mode 100644
index 0000000..b53e25b
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_units.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_units.js.map","sources":["dhtmlxscheduler_units.js"],"names":["scheduler","_props","createUnitsView","name","property","list","size","step","skip_incorrect","map_to","options","position","length","_original_size","date","day_start","templates","day_date","_get_unit_index","unit_view","original_position","date_position","Math","floor","_correct_shift","_min_date","id","label","option","css","index","key","inc","add","attachEvent","pr","order","i","original_size","_date","_mode","setCurrentView","pos","this","_week_indexes_from_pos","_drag_event","_drag_id","_drag_mode","_dhx_changed","unit_ind","min","x","section","ev","getEvent","_update_unit_section","view","event","force_redraw","callEvent","action","scrollUnit","max","update_view","_removeIncorrectEvents","evs","correct_events","push","splice","apply","old_pre_render_events_table","_pre_render_events_table","hold","old_pre_render_events_line","_pre_render_events_line","fix_und","s","dx","ind","end_date","t","_reset_scale","oldive","is_visible_events","e","res","arguments","val","ret","_max_date","d","_els","childNodes","className","replace","h","arrow","document","createElement","style","cssText","innerHTML","firstChild","appendChild","onclick","lastChild","r","_get_event_sday","call","l","locate_holder_day","a","b","o","_time_order","sort","_loading","n_ev","_mouse_coords","event_updated"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_url.js b/codebase/sources/ext/dhtmlxscheduler_url.js
new file mode 100644
index 0000000..2a98978
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_url.js
@@ -0,0 +1,37 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.attachEvent("onTemplatesReady",function(){
+ var first = true;
+ var s2d = scheduler.date.str_to_date("%Y-%m-%d");
+ var d2s = scheduler.date.date_to_str("%Y-%m-%d");
+ scheduler.attachEvent("onBeforeViewChange",function(om,od,m,d){
+ if (first){
+ first = false;
+ var p={};
+ var data=(document.location.hash||"").replace("#","").split(",");
+ for (var i=0; i < data.length; i++) {
+ var s = data[i].split("=");
+ if (s.length==2)
+ p[s[0]]=s[1];
+ }
+
+ if (p.date || p.mode){
+ try{
+ this.setCurrentView((p.date?s2d(p.date):null),(p.mode||null));
+ } catch(e){
+ //assuming that mode is not available anymore
+ this.setCurrentView((p.date?s2d(p.date):null),m);
+ }
+ return false;
+ }
+ }
+ var text = "#date="+d2s(d||od)+",mode="+(m||om);
+ document.location.hash = text;
+ return true;
+ });
+}); \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_url.js.map b/codebase/sources/ext/dhtmlxscheduler_url.js.map
new file mode 100644
index 0000000..6814ae0
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_url.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_url.js.map","sources":["dhtmlxscheduler_url.js"],"names":["scheduler","attachEvent","first","s2d","date","str_to_date","d2s","date_to_str","om","od","m","d","p","data","document","location","hash","replace","split","i","length","s","mode","this","setCurrentView","e","text"],"mappings":"AAAAA,UAAUC,YAAY,mBAAmB,WACtC,GAAIC,IAAQ,EACRC,EAAMH,UAAUI,KAAKC,YAAY,YACjCC,EAAMN,UAAUI,KAAKG,YAAY,WACrCP,WAAUC,YAAY,qBAAqB,SAASO,EAAGC,EAAGC,EAAEC,GACzD,GAAIT,EAAM,CACPA,GAAQ,CAGR,KAAK,GAFDU,MACAC,GAAMC,SAASC,SAASC,MAAM,IAAIC,QAAQ,IAAI,IAAIC,MAAM,KACnDC,EAAE,EAAGA,EAAIN,EAAKO,OAAQD,IAAK,CACnC,GAAIE,GAAIR,EAAKM,GAAGD,MAAM,IACR,IAAVG,EAAED,SACNR,EAAES,EAAE,IAAIA,EAAE,IAGX,GAAIT,EAAER,MAAQQ,EAAEU,KAAK,CACpB,IACGC,KAAKC,eAAgBZ,EAAER,KAAKD,EAAIS,EAAER,MAAM,KAAOQ,EAAEU,MAAM,MACzD,MAAMG,GAEPF,KAAKC,eAAgBZ,EAAER,KAAKD,EAAIS,EAAER,MAAM,KAAMM,GAE5C,OAAO,GAGb,GAAIgB,GAAO,SAASpB,EAAIK,GAAGF,GAAI,UAAUC,GAAGF,EAE5C;MADAM,UAASC,SAASC,KAAOU,GAClB"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_week_agenda.js b/codebase/sources/ext/dhtmlxscheduler_week_agenda.js
new file mode 100644
index 0000000..fad882e
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_week_agenda.js
@@ -0,0 +1,261 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler._wa = {};
+scheduler.xy.week_agenda_scale_height = 20;
+scheduler.templates.week_agenda_event_text = function(start_date, end_date, event, date) {
+ return scheduler.templates.event_date(start_date) + " " + event.text;
+};
+scheduler.date.week_agenda_start = scheduler.date.week_start;
+scheduler.date.week_agenda_end = function(date) {
+ return scheduler.date.add(date, 7, "day");
+};
+scheduler.date.add_week_agenda = function(date, inc) {
+ return scheduler.date.add(date, inc * 7, "day");
+};
+
+scheduler.attachEvent("onSchedulerReady", function() {
+ var t = scheduler.templates;
+ if (!t.week_agenda_date)
+ t.week_agenda_date = t.week_date;
+});
+
+(function() {
+ var scale_date_format = scheduler.date.date_to_str("%l, %F %d");
+ scheduler.templates.week_agenda_scale_date = function(date) {
+ return scale_date_format(date);
+ };
+})();
+
+scheduler.attachEvent("onTemplatesReady", function() {
+
+ scheduler.attachEvent("onSchedulerResize", function() {
+ if (this._mode == "week_agenda") {
+ this.week_agenda_view(true);
+ return false;
+ }
+ return true;
+ });
+
+ var old = scheduler.render_data;
+ scheduler.render_data = function(evs) {
+ if (this._mode == "week_agenda") {
+ scheduler.week_agenda_view(true);
+ } else
+ return old.apply(this, arguments);
+ };
+
+ var getColumnSizes = function() {
+ // widths
+ scheduler._cols = [];
+ var twidth = parseInt(scheduler._els['dhx_cal_data'][0].style.width);
+ scheduler._cols.push(Math.floor(twidth / 2));
+ scheduler._cols.push(twidth - scheduler._cols[0] - 1); // To add border between columns
+
+ // heights
+ scheduler._colsS = {
+ 0: [],
+ 1: []
+ };
+ var theight = parseInt(scheduler._els['dhx_cal_data'][0].style.height);
+ for (var i = 0; i < 3; i++) {
+ scheduler._colsS[0].push(Math.floor(theight / (3 - scheduler._colsS[0].length)));
+ theight -= scheduler._colsS[0][i];
+ }
+ scheduler._colsS[1].push(scheduler._colsS[0][0]);
+ scheduler._colsS[1].push(scheduler._colsS[0][1]);
+ // last two days
+ theight = scheduler._colsS[0][scheduler._colsS[0].length - 1];
+ scheduler._colsS[1].push(Math.floor(theight / 2));
+ scheduler._colsS[1].push(theight - scheduler._colsS[1][scheduler._colsS[1].length - 1]);
+ };
+ var fillWeekAgendaTab = function() {
+ getColumnSizes();
+ scheduler._els["dhx_cal_data"][0].innerHTML = '';
+ scheduler._rendered = [];
+ var html = '';
+ for (var i = 0; i < 2; i++) {
+ var width = scheduler._cols[i];
+ var column_css = 'dhx_wa_column';
+ if (i == 1)
+ column_css += ' dhx_wa_column_last';
+ html += "<div class='" + column_css + "' style='width: " + width + "px;'>";
+ for (var k = 0; k < scheduler._colsS[i].length; k++) {
+ var scale_height = scheduler.xy.week_agenda_scale_height - 2;
+ var height = scheduler._colsS[i][k] - scale_height - 2;
+ var day = Math.min(6, k * 2 + i);
+ html += "<div class='dhx_wa_day_cont'><div style='height:" + scale_height + "px; line-height:" + scale_height + "px;' class='dhx_wa_scale_bar'></div><div style='height:" + height + "px;' class='dhx_wa_day_data' day='" + day + "'></div></div>";
+ }
+ html += "</div>";
+ }
+ scheduler._els["dhx_cal_date"][0].innerHTML = scheduler.templates[scheduler._mode + "_date"](scheduler._min_date, scheduler._max_date, scheduler._mode);
+ scheduler._els["dhx_cal_data"][0].innerHTML = html;
+ var all_divs = scheduler._els["dhx_cal_data"][0].getElementsByTagName('div');
+ var day_divs = [];
+ for (var i = 0; i < all_divs.length; i++) {
+ if (all_divs[i].className == 'dhx_wa_day_cont')
+ day_divs.push(all_divs[i]);
+ }
+ scheduler._wa._selected_divs = [];
+ var events = scheduler.get_visible_events(); // list of events to be displayed in current week
+ var tstart = scheduler.date.week_start(scheduler._date);
+ var tend = scheduler.date.add(tstart, 1, "day");
+ for (var i = 0; i < 7; i++) {
+ day_divs[i]._date = tstart;
+ var scale_bar = day_divs[i].childNodes[0];
+ var events_div = day_divs[i].childNodes[1];
+ scale_bar.innerHTML = scheduler.templates.week_agenda_scale_date(tstart);
+ var evs = []; // events which will be displayed in the current day
+ for (var j = 0; j < events.length; j++) {
+ var tev = events[j];
+ if (tev.start_date < tend && tev.end_date > tstart)
+ evs.push(tev);
+ }
+ evs.sort(function(a, b) {
+ if (a.start_date.valueOf() == b.start_date.valueOf())
+ return a.id > b.id ? 1 : -1;
+ return a.start_date > b.start_date ? 1 : -1;
+ });
+ for (var k = 0; k < evs.length; k++) {
+ var ev = evs[k];
+ var ev_div = document.createElement('div');
+ scheduler._rendered.push(ev_div);
+ var ev_class = scheduler.templates.event_class(ev.start_date, ev.end_date, ev);
+ ev_div.className = 'dhx_wa_ev_body' + (ev_class ? (' ' + ev_class) : '');
+ if (ev._text_style)
+ ev_div.style.cssText = ev._text_style;
+ if (ev.color)
+ ev_div.style.background = ev.color;
+ if (ev.textColor)
+ ev_div.style.color = ev.textColor;
+ if (scheduler._select_id && ev.id == scheduler._select_id && !(!scheduler.config.week_agenda_select && scheduler.config.week_agenda_select !== undefined)) {
+ ev_div.className += " dhx_cal_event_selected";
+ scheduler._wa._selected_divs.push(ev_div);
+ }
+ var position = "";
+ if (!ev._timed) {
+ position = "middle";
+ if (ev.start_date.valueOf() >= tstart.valueOf() && ev.start_date.valueOf() <= tend.valueOf())
+ position = "start";
+ if (ev.end_date.valueOf() >= tstart.valueOf() && ev.end_date.valueOf() <= tend.valueOf())
+ position = "end";
+ }
+ ev_div.innerHTML = scheduler.templates.week_agenda_event_text(ev.start_date, ev.end_date, ev, tstart, position);
+ ev_div.setAttribute('event_id', ev.id);
+ events_div.appendChild(ev_div);
+ }
+ tstart = scheduler.date.add(tstart, 1, "day");
+ tend = scheduler.date.add(tend, 1, "day");
+ }
+ };
+ scheduler.week_agenda_view = function(mode) {
+ scheduler._min_date = scheduler.date.week_start(scheduler._date);
+ scheduler._max_date = scheduler.date.add(scheduler._min_date, 1, "week");
+ scheduler.set_sizes();
+ if (mode) { // mode enabled
+ scheduler._table_view = scheduler._allow_dnd = true;
+
+ // hiding default top border from dhx_cal_data
+ scheduler._wa._prev_data_border = scheduler._els['dhx_cal_data'][0].style.borderTop;
+ scheduler._els['dhx_cal_data'][0].style.borderTop = 0;
+ scheduler._els['dhx_cal_data'][0].style.overflowY = 'hidden';
+
+ // cleaning dhx_cal_date from the previous date
+ scheduler._els['dhx_cal_date'][0].innerHTML = "";
+
+ // 1 to make navline to be over data
+ scheduler._els['dhx_cal_data'][0].style.top = (parseInt(scheduler._els['dhx_cal_data'][0].style.top) - 20 - 1) + 'px';
+ scheduler._els['dhx_cal_data'][0].style.height = (parseInt(scheduler._els['dhx_cal_data'][0].style.height) + 20 + 1) + 'px';
+
+ scheduler._els['dhx_cal_header'][0].style.display = 'none';
+ fillWeekAgendaTab();
+ } else { // leaving week_agenda mode
+ scheduler._table_view = scheduler._allow_dnd = false;
+
+ // restoring default top border to dhx_cal_data
+ if (scheduler._wa._prev_data_border)
+ scheduler._els['dhx_cal_data'][0].style.borderTop = scheduler._wa._prev_data_border;
+
+ scheduler._els['dhx_cal_data'][0].style.overflowY = 'auto';
+ scheduler._els['dhx_cal_data'][0].style.top = (parseInt(scheduler._els['dhx_cal_data'][0].style.top) + 20) + 'px';
+ scheduler._els['dhx_cal_data'][0].style.height = (parseInt(scheduler._els['dhx_cal_data'][0].style.height) - 20) + 'px';
+ scheduler._els['dhx_cal_header'][0].style.display = 'block';
+ }
+ };
+ scheduler.mouse_week_agenda = function(pos) {
+ var native_event = pos.ev;
+ var src = native_event.srcElement || native_event.target;
+ var date;
+ while (src.parentNode) {
+ if (src._date)
+ date = src._date;
+ src = src.parentNode;
+ }
+ if (!date)
+ return pos;
+ pos.x = 0;
+ var diff = date.valueOf() - scheduler._min_date.valueOf();
+ pos.y = Math.ceil(( diff / (1000 * 60) ) / this.config.time_step);
+ if (this._drag_mode == 'move') {
+ var event_div;
+ this._drag_event._dhx_changed = true;
+ this._select_id = this._drag_id;
+ for (var i = 0; i < scheduler._rendered.length; i++) {
+ if (scheduler._drag_id == this._rendered[i].getAttribute('event_id'))
+ event_div = this._rendered[i];
+ }
+ if (!scheduler._wa._dnd) {
+ var div = event_div.cloneNode(true);
+ this._wa._dnd = div;
+ div.className = event_div.className;
+ div.id = 'dhx_wa_dnd';
+ div.className += ' dhx_wa_dnd';
+ document.body.appendChild(div);
+ }
+ var dnd_div = document.getElementById('dhx_wa_dnd');
+ dnd_div.style.top = ((native_event.pageY || native_event.clientY) + 20) + "px";
+ dnd_div.style.left = ((native_event.pageX || native_event.clientX) + 20) + "px";
+ }
+ return pos;
+ };
+ scheduler.attachEvent('onBeforeEventChanged', function(event_object, native_event, is_new) {
+ if (this._mode == 'week_agenda') {
+ if (this._drag_mode == 'move') {
+ var dnd = document.getElementById('dhx_wa_dnd');
+ dnd.parentNode.removeChild(dnd);
+ scheduler._wa._dnd = false;
+ }
+ }
+ return true;
+ });
+
+ scheduler.attachEvent("onEventSave", function(id, data, is_new_event) {
+ if (is_new_event && this._mode == 'week_agenda')
+ this._select_id = id;
+ return true;
+ });
+
+ scheduler._wa._selected_divs = [];
+
+ scheduler.attachEvent("onClick", function(event_id, native_event_object) {
+ if (this._mode == 'week_agenda' && !(!scheduler.config.week_agenda_select && scheduler.config.week_agenda_select !== undefined)) {
+ if (scheduler._wa._selected_divs) {
+ for (var i = 0; i < this._wa._selected_divs.length; i++) {
+ var div = this._wa._selected_divs[i];
+ div.className = div.className.replace(/ dhx_cal_event_selected/, '');
+ }
+ }
+ this.for_rendered(event_id, function(event_div) {
+ event_div.className += " dhx_cal_event_selected";
+ scheduler._wa._selected_divs.push(event_div);
+ });
+ scheduler.select(event_id);
+ return false;
+ }
+ return true;
+ });
+});
diff --git a/codebase/sources/ext/dhtmlxscheduler_week_agenda.js.map b/codebase/sources/ext/dhtmlxscheduler_week_agenda.js.map
new file mode 100644
index 0000000..696e0d2
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_week_agenda.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_week_agenda.js.map","sources":["dhtmlxscheduler_week_agenda.js"],"names":["scheduler","_wa","xy","week_agenda_scale_height","templates","week_agenda_event_text","start_date","end_date","event","event_date","text","date","week_agenda_start","week_start","week_agenda_end","add","add_week_agenda","inc","attachEvent","t","week_agenda_date","week_date","scale_date_format","date_to_str","week_agenda_scale_date","this","_mode","week_agenda_view","old","render_data","apply","arguments","getColumnSizes","_cols","twidth","parseInt","_els","style","width","push","Math","floor","_colsS",1,"theight","height","i","length","fillWeekAgendaTab","innerHTML","_rendered","html","column_css","k","scale_height","day","min","_min_date","_max_date","all_divs","getElementsByTagName","day_divs","className","_selected_divs","events","get_visible_events","tstart","_date","tend","scale_bar","childNodes","events_div","evs","j","tev","sort","a","b","valueOf","id","ev","ev_div","document","createElement","ev_class","event_class","_text_style","cssText","color","background","textColor","_select_id","config","week_agenda_select","undefined","position","_timed","setAttribute","appendChild","mode","set_sizes","_table_view","_allow_dnd","_prev_data_border","borderTop","overflowY","top","display","mouse_week_agenda","pos","native_event","src","srcElement","target","parentNode","x","diff","y","ceil","time_step","_drag_mode","event_div","_drag_event","_dhx_changed","_drag_id","getAttribute","_dnd","div","cloneNode","body","dnd_div","getElementById","pageY","clientY","left","pageX","clientX","dnd","removeChild","data","is_new_event","event_id","replace","for_rendered","select"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_wp.js b/codebase/sources/ext/dhtmlxscheduler_wp.js
new file mode 100644
index 0000000..89da447
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_wp.js
@@ -0,0 +1,20 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.attachEvent("onLightBox",function(){
+ if (this._cover){
+ try{
+ this._cover.style.height = this.expanded ? "100%" : ((document.body.parentNode||document.body).scrollHeight+"px");
+ } catch(e) {}
+ }
+});
+
+scheduler.form_blocks.select.set_value=function(node,value,ev){
+ if (typeof value == "undefined" || value === "")
+ value = (node.firstChild.options[0]||{}).value;
+ node.firstChild.value=value||"";
+}; \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_wp.js.map b/codebase/sources/ext/dhtmlxscheduler_wp.js.map
new file mode 100644
index 0000000..1175527
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_wp.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_wp.js.map","sources":["dhtmlxscheduler_wp.js"],"names":["scheduler","attachEvent","this","_cover","style","height","expanded","document","body","parentNode","scrollHeight","e","form_blocks","select","set_value","node","value","firstChild","options"],"mappings":"AAAAA,UAAUC,YAAY,aAAa,WAClC,GAAIC,KAAKC,OACR,IACCD,KAAKC,OAAOC,MAAMC,OAASH,KAAKI,SAAW,QAAWC,SAASC,KAAKC,YAAYF,SAASC,MAAME,aAAa,KAC3G,MAAMC,OAIVX,UAAUY,YAAYC,OAAOC,UAAU,SAASC,EAAKC,IAChC,mBAATA,IAAkC,KAAVA,KAClCA,GAASD,EAAKE,WAAWC,QAAQ,QAAQF,OAC1CD,EAAKE,WAAWD,MAAMA,GAAO"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_year_view.js b/codebase/sources/ext/dhtmlxscheduler_year_view.js
new file mode 100644
index 0000000..ca2f5a4
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_year_view.js
@@ -0,0 +1,391 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.config.year_x = 4;
+scheduler.config.year_y = 3;
+scheduler.xy.year_top = 0;
+
+scheduler.templates.year_date = function(date) {
+ return scheduler.date.date_to_str(scheduler.locale.labels.year_tab + " %Y")(date);
+};
+scheduler.templates.year_month = scheduler.date.date_to_str("%F");
+scheduler.templates.year_scale_date = scheduler.date.date_to_str("%D");
+scheduler.templates.year_tooltip = function(s, e, ev) {
+ return ev.text;
+};
+
+(function() {
+ var is_year_mode = function() {
+ return scheduler._mode == "year";
+ };
+
+ scheduler.dblclick_dhx_month_head = function(e) {
+ if (is_year_mode()) {
+ var t = (e.target || e.srcElement);
+ if (t.parentNode.className.indexOf("dhx_before") != -1 || t.parentNode.className.indexOf("dhx_after") != -1) return false;
+ var start = this.templates.xml_date(t.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.getAttribute("date"));
+ start.setDate(parseInt(t.innerHTML, 10));
+ var end = this.date.add(start, 1, "day");
+ if (!this.config.readonly && this.config.dblclick_create)
+ this.addEventNow(start.valueOf(), end.valueOf(), e);
+ }
+ };
+
+ var chid = scheduler.changeEventId;
+ scheduler.changeEventId = function() {
+ chid.apply(this, arguments);
+ if (is_year_mode())
+ this.year_view(true);
+ };
+
+
+ var old = scheduler.render_data;
+ var to_attr = scheduler.date.date_to_str("%Y/%m/%d");
+ var from_attr = scheduler.date.str_to_date("%Y/%m/%d");
+ scheduler.render_data = function(evs) {
+ if (!is_year_mode()) return old.apply(this, arguments);
+ for (var i = 0; i < evs.length; i++)
+ this._year_render_event(evs[i]);
+ };
+
+ var clear = scheduler.clear_view;
+ scheduler.clear_view = function() {
+ if (!is_year_mode()) return clear.apply(this, arguments);
+ var dates = scheduler._year_marked_cells,
+ div = null;
+ for (var date in dates) {
+ if (dates.hasOwnProperty(date)) {
+ div = dates[date];
+ div.className = "dhx_month_head";
+ div.setAttribute("date", "");
+ }
+ }
+ scheduler._year_marked_cells = {};
+ };
+
+ scheduler._hideToolTip = function() {
+ if (this._tooltip) {
+ this._tooltip.style.display = "none";
+ this._tooltip.date = new Date(9999, 1, 1);
+ }
+ };
+
+ scheduler._showToolTip = function(date, pos, e, src) {
+ if (this._tooltip) {
+ if (this._tooltip.date.valueOf() == date.valueOf()) return;
+ this._tooltip.innerHTML = "";
+ } else {
+ var t = this._tooltip = document.createElement("DIV");
+ t.className = "dhx_year_tooltip";
+ document.body.appendChild(t);
+ t.onclick = scheduler._click.dhx_cal_data;
+ }
+ var evs = this.getEvents(date, this.date.add(date, 1, "day"));
+ var html = "";
+
+ for (var i = 0; i < evs.length; i++) {
+ var ev = evs[i];
+ if(!this.filter_event(ev.id, ev))
+ continue;
+
+ var bg_color = (ev.color ? ("background:" + ev.color + ";") : "");
+ var color = (ev.textColor ? ("color:" + ev.textColor + ";") : "");
+
+ html += "<div class='dhx_tooltip_line' style='" + bg_color + "" + color + "' event_id='" + evs[i].id + "'>";
+ html += "<div class='dhx_tooltip_date' style='" + bg_color + "" + color + "'>" + (evs[i]._timed ? this.templates.event_date(evs[i].start_date) : "") + "</div>";
+ html += "<div class='dhx_event_icon icon_details'>&nbsp;</div>";
+ html += this.templates.year_tooltip(evs[i].start_date, evs[i].end_date, evs[i]) + "</div>";
+ }
+
+ this._tooltip.style.display = "";
+ this._tooltip.style.top = "0px";
+
+
+ if (document.body.offsetWidth - pos.left - this._tooltip.offsetWidth < 0)
+ this._tooltip.style.left = pos.left - this._tooltip.offsetWidth + "px";
+ else
+ this._tooltip.style.left = pos.left + src.offsetWidth + "px";
+
+ this._tooltip.date = date;
+ this._tooltip.innerHTML = html;
+
+ if (document.body.offsetHeight - pos.top - this._tooltip.offsetHeight < 0)
+ this._tooltip.style.top = pos.top - this._tooltip.offsetHeight + src.offsetHeight + "px";
+ else
+ this._tooltip.style.top = pos.top + "px";
+ };
+
+ scheduler._year_view_tooltip_handler = function(e){
+ if (!is_year_mode()) return;
+
+ var e = e || event;
+ var src = e.target || e.srcElement;
+ if (src.tagName.toLowerCase() == 'a') // fix for active links extension (it adds links to the date in the cell)
+ src = src.parentNode;
+ if ((src.className || "").indexOf("dhx_year_event") != -1)
+ scheduler._showToolTip(from_attr(src.getAttribute("date")), getOffset(src), e, src);
+ else
+ scheduler._hideToolTip();
+ };
+ scheduler._init_year_tooltip = function() {
+ scheduler._detachDomEvent(scheduler._els["dhx_cal_data"][0], "mouseover", scheduler._year_view_tooltip_handler);
+ dhtmlxEvent(scheduler._els["dhx_cal_data"][0], "mouseover", scheduler._year_view_tooltip_handler);
+ };
+
+ scheduler.attachEvent("onSchedulerResize", function() {
+ if (is_year_mode()) {
+ this.year_view(true);
+ return false;
+ }
+ return true;
+ });
+ scheduler._get_year_cell = function(d) {
+ //there can be more than 1 year in view
+ //year can start not from January
+ var m = d.getMonth() + 12 * (d.getFullYear() - this._min_date.getFullYear()) - this.week_starts._month;
+ var t = this._els["dhx_cal_data"][0].childNodes[m];
+ var d = this.week_starts[m] + d.getDate() - 1;
+
+
+ return t.childNodes[2].firstChild.rows[Math.floor(d / 7)].cells[d % 7].firstChild;
+ };
+
+ scheduler._year_marked_cells = {};
+ scheduler._mark_year_date = function(d, ev) {
+ var date = to_attr(d);
+ var c = this._get_year_cell(d);
+ var ev_class = this.templates.event_class(ev.start_date, ev.end_date, ev);
+ if (!scheduler._year_marked_cells[date]) {
+ c.className = "dhx_month_head dhx_year_event";
+ c.setAttribute("date", date);
+ scheduler._year_marked_cells[date] = c;
+ }
+ c.className += (ev_class) ? (" "+ev_class) : "";
+ };
+ scheduler._unmark_year_date = function(d) {
+ this._get_year_cell(d).className = "dhx_month_head";
+ };
+ scheduler._year_render_event = function(ev) {
+ var d = ev.start_date;
+ if (d.valueOf() < this._min_date.valueOf())
+ d = this._min_date;
+ else d = this.date.date_part(new Date(d));
+
+ while (d < ev.end_date) {
+ this._mark_year_date(d, ev);
+ d = this.date.add(d, 1, "day");
+ if (d.valueOf() >= this._max_date.valueOf())
+ return;
+ }
+ };
+
+ scheduler.year_view = function(mode) {
+ var temp;
+ if (mode) {
+ temp = scheduler.xy.scale_height;
+ scheduler.xy.scale_height = -1;
+ }
+
+ scheduler._els["dhx_cal_header"][0].style.display = mode ? "none" : "";
+ scheduler.set_sizes();
+
+ if (mode)
+ scheduler.xy.scale_height = temp;
+
+
+ scheduler._table_view = mode;
+ if (this._load_mode && this._load()) return;
+
+ if (mode) {
+ scheduler._init_year_tooltip();
+ scheduler._reset_year_scale();
+ if (scheduler._load_mode && scheduler._load()){
+ scheduler._render_wait = true;
+ return;
+ }
+ scheduler.render_view_data();
+ } else {
+ scheduler._hideToolTip();
+ }
+ };
+ scheduler._reset_year_scale = function() {
+ this._cols = [];
+ this._colsS = {};
+ var week_starts = []; //start day of first week in each month
+ var b = this._els["dhx_cal_data"][0];
+
+ var c = this.config;
+ b.scrollTop = 0; //fix flickering in FF
+ b.innerHTML = "";
+
+ var dx = Math.floor(parseInt(b.style.width) / c.year_x);
+ var dy = Math.floor((parseInt(b.style.height) - scheduler.xy.year_top) / c.year_y);
+ if (dy < 190) {
+ dy = 190;
+ dx = Math.floor((parseInt(b.style.width) - scheduler.xy.scroll_width) / c.year_x);
+ }
+
+ var summ = dx - 11;
+ var left = 0;
+ var week_template = document.createElement("div");
+ var dummy_date = this.date.week_start(scheduler._currentDate());
+ for (var i = 0; i < 7; i++) {
+ this._cols[i] = Math.floor(summ / (7 - i));
+ this._render_x_header(i, left, dummy_date, week_template);
+ dummy_date = this.date.add(dummy_date, 1, "day");
+ summ -= this._cols[i];
+ left += this._cols[i];
+ }
+ week_template.lastChild.className += " dhx_scale_bar_last";
+
+ var sd = this.date[this._mode + "_start"](this.date.copy(this._date));
+ var ssd = sd;
+ var d = null;
+ for (var i = 0; i < c.year_y; i++)
+ for (var j = 0; j < c.year_x; j++) {
+ d = document.createElement("DIV");
+ d.style.cssText = "position:absolute;";
+ d.setAttribute("date", this.templates.xml_format(sd));
+ d.innerHTML = "<div class='dhx_year_month'></div><div class='dhx_year_week'>" + week_template.innerHTML + "</div><div class='dhx_year_body'></div>";
+ d.childNodes[0].innerHTML = this.templates.year_month(sd);
+
+ var dd = this.date.week_start(sd);
+ var ed = this._reset_month_scale(d.childNodes[2], sd, dd);
+
+ var r = d.childNodes[2].firstChild.rows;
+ for (var k=r.length; k<6; k++) {
+ r[0].parentNode.appendChild(r[0].cloneNode(true));
+ for (var ri= 0, len = r[k].childNodes.length; ri < len; ri++) {
+ r[k].childNodes[ri].className = "dhx_after";
+ r[k].childNodes[ri].firstChild.innerHTML = scheduler.templates.month_day(ed);
+ ed = scheduler.date.add(ed,1,"day");
+ }
+ }
+ b.appendChild(d);
+
+ d.childNodes[1].style.height = d.childNodes[1].childNodes[0].offsetHeight + "px"; // dhx_year_week should have height property so that day dates would get correct position. dhx_year_week height = height of it's child (with the day name)
+ var dt = Math.round((dy - 190) / 2);
+ d.style.marginTop = dt + "px";
+ this.set_xy(d, dx - 10, dy - dt - 10, dx * j + 5, dy * i + 5 + scheduler.xy.year_top);
+
+ week_starts[i * c.year_x + j] = (sd.getDay() - (this.config.start_on_monday ? 1 : 0) + 7) % 7;
+ sd = this.date.add(sd, 1, "month");
+
+ }
+ this._els["dhx_cal_date"][0].innerHTML = this.templates[this._mode + "_date"](ssd, sd, this._mode);
+ this.week_starts = week_starts;
+ week_starts._month = ssd.getMonth();
+ this._min_date = ssd;
+ this._max_date = sd;
+ };
+
+ var getActionData = scheduler.getActionData;
+ scheduler.getActionData = function(n_ev) {
+ if(!is_year_mode())
+ return getActionData.apply(scheduler, arguments);
+
+ var trg = n_ev?n_ev.target:event.srcElement;
+ var date = scheduler._get_year_month_date(trg);
+
+ var day = scheduler._get_year_month_cell(trg);
+ var pos = scheduler._get_year_day_indexes(day);
+
+ if(pos && date){
+ date = scheduler.date.add(date, pos.week, "week");
+ date = scheduler.date.add(date, pos.day, "day");
+ }else{
+ date = null;
+ }
+
+ return {
+ date:date,
+ section:null
+ };
+
+ };
+ scheduler._get_year_day_indexes = function(targetCell){
+ var month = scheduler._locate_year_month_table(targetCell);
+ if(!month)
+ return null;
+
+ var week = 0, day = 0;
+ for(var week = 0, weeks = month.rows.length; week < weeks;week ++){
+ var w = month.rows[week].getElementsByTagName("td");
+ for(var day = 0, days = w.length; day < days; day++){
+ if(w[day] == targetCell)
+ break;
+ }
+ if(day < days)
+ break;
+ }
+
+ if(week < weeks)
+ return {day:day, week:week};
+ else
+ return null;
+ };
+ scheduler._get_year_month_date = function (node){
+ var node = scheduler._locate_year_month_root(node);
+ if(!node)
+ return null;
+
+ var date = node.getAttribute("date");
+ if(!date)
+ return null;
+
+ return scheduler.date.week_start(scheduler.templates.xml_date(date));
+ };
+ scheduler._locate_year_month_day = function(n){
+ return n.className && n.className.indexOf("dhx_year_event") != -1 && n.hasAttribute && n.hasAttribute("date");
+ };
+
+ var locateEvent = scheduler._locate_event;
+ scheduler._locate_event = function(node) {
+ var id = locateEvent.apply(scheduler, arguments);
+ if(!id){
+ var day = scheduler._get_year_el_node(node, scheduler._locate_year_month_day);
+
+ if(!day || !day.hasAttribute("date")) return null;
+
+ var dat = scheduler.templates.xml_date(day.getAttribute("date"));
+ var evs = scheduler.getEvents(dat, scheduler.date.add(dat, 1, "day"));
+ if(!evs.length) return null;
+
+ //can be multiple events in the cell, return any single one
+ id = evs[0].id;
+ }
+ return id;
+ };
+ scheduler._locate_year_month_cell = function(n){
+ return n.nodeName.toLowerCase() == "td";
+ };
+ scheduler._locate_year_month_table = function(n){
+ return n.nodeName.toLowerCase() == "table";
+ };
+ scheduler._locate_year_month_root = function(n){
+ return n.hasAttribute && n.hasAttribute("date");
+ };
+
+ scheduler._get_year_month_cell = function(node){
+ return this._get_year_el_node(node, this._locate_year_month_cell);
+ };
+
+ scheduler._get_year_month_table = function(node){
+ return this._get_year_el_node (node, this._locate_year_month_table);
+ };
+ scheduler._get_year_month_root = function(node){
+ return this._get_year_el_node(this._get_year_month_table(node), this._locate_year_month_root);
+ };
+ scheduler._get_year_el_node = function(node, condition){
+ while(node && !condition(node)){
+ node = node.parentNode;
+ }
+ return node;
+ };
+
+
+})();
diff --git a/codebase/sources/ext/dhtmlxscheduler_year_view.js.map b/codebase/sources/ext/dhtmlxscheduler_year_view.js.map
new file mode 100644
index 0000000..303c604
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_year_view.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_year_view.js.map","sources":["dhtmlxscheduler_year_view.js"],"names":["scheduler","config","year_x","year_y","xy","year_top","templates","year_date","date","date_to_str","locale","labels","year_tab","year_month","year_scale_date","year_tooltip","s","e","ev","text","is_year_mode","_mode","dblclick_dhx_month_head","t","target","srcElement","parentNode","className","indexOf","start","this","xml_date","getAttribute","setDate","parseInt","innerHTML","end","add","readonly","dblclick_create","addEventNow","valueOf","chid","changeEventId","apply","arguments","year_view","old","render_data","to_attr","from_attr","str_to_date","evs","i","length","_year_render_event","clear","clear_view","dates","_year_marked_cells","div","hasOwnProperty","setAttribute","_hideToolTip","_tooltip","style","display","Date","_showToolTip","pos","src","document","createElement","body","appendChild","onclick","_click","dhx_cal_data","getEvents","html","filter_event","id","bg_color","color","textColor","_timed","event_date","start_date","end_date","top","left","offsetWidth","offsetHeight","_year_view_tooltip_handler","event","tagName","toLowerCase","getOffset","_init_year_tooltip","_detachDomEvent","_els","dhtmlxEvent","attachEvent","_get_year_cell","d","m","getMonth","getFullYear","_min_date","week_starts","_month","childNodes","getDate","firstChild","rows","Math","floor","cells","_mark_year_date","c","ev_class","event_class","_unmark_year_date","date_part","_max_date","mode","temp","scale_height","set_sizes","_table_view","_load_mode","_load","_reset_year_scale","_render_wait","render_view_data","_cols","_colsS","b","scrollTop","dx","width","dy","height","scroll_width","summ","week_template","dummy_date","week_start","_currentDate","_render_x_header","lastChild","sd","copy","_date","ssd","j","cssText","xml_format","dd","ed","_reset_month_scale","r","k","cloneNode","ri","len","month_day","dt","round","marginTop","set_xy","getDay","start_on_monday","getActionData","n_ev","trg","_get_year_month_date","day","_get_year_month_cell","_get_year_day_indexes","week","section","targetCell","month","_locate_year_month_table","weeks","w","getElementsByTagName","days","node","_locate_year_month_root","_locate_year_month_day","n","hasAttribute","locateEvent","_locate_event","_get_year_el_node","dat","_locate_year_month_cell","nodeName","_get_year_month_table","_get_year_month_root","condition"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/skins/dhtmlxscheduler.css b/codebase/sources/skins/dhtmlxscheduler.css
new file mode 100644
index 0000000..8c5fdb5
--- /dev/null
+++ b/codebase/sources/skins/dhtmlxscheduler.css
@@ -0,0 +1,2238 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+.dhtmlx_message_area {
+ position: fixed;
+ right: 5px;
+ width: 250px;
+ z-index: 1000;
+}
+.dhtmlx-info {
+ min-width: 120px;
+ padding: 4px 4px 4px 20px;
+ font-family: Tahoma;
+ z-index: 10000;
+ overflow: hidden;
+ margin: 5px;
+ margin-bottom: 10px;
+ -webkit-transition: all .5s ease;
+ -moz-transition: all .5s ease;
+ -o-transition: all .5s ease;
+ transition: all .5s ease;
+}
+.dhtmlx-info.hidden {
+ height: 0px;
+ padding: 0px;
+ border-width: 0px;
+ margin: 0px;
+ overflow: hidden;
+}
+.dhtmlx_modal_box {
+ overflow: hidden;
+ display: inline-block;
+ min-width: 300px;
+ width: 300px;
+ text-align: center;
+ position: fixed;
+ background-color: #fff;
+ background: -webkit-linear-gradient(top, #ffffff 1%, #d0d0d0 99%);
+ background: -moz-linear-gradient(top, #ffffff 1%, #d0d0d0 99%);
+ box-shadow: 0px 0px 14px #888;
+ font-family: Tahoma;
+ z-index: 20000;
+ border-radius: 6px;
+ border: 1px solid #ffffff;
+}
+.dhtmlx_popup_title {
+ border-top-left-radius: 5px;
+ border-top-right-radius: 5px;
+ border-width: 0px;
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAoCAMAAAAIaGBFAAAAhFBMVEVwcHBubm5sbGxqampoaGhmZmZlZWVjY2NhYWFfX19dXV1bW1taWlpYWFhWVlZUVFRSUlJRUVFPT09NTU1LS0tJSUlHR0dGRkZERERCQkJAQEA+Pj49PT09PT0+Pj5AQEBBQUFDQ0NERERGRkZHR0dJSUlKSkpMTExMTEw5OTk5OTk5OTkny8YEAAAAQklEQVQImQXBCRJCAAAAwKVSQqdyjSPXNP7/QLsIhA6OTiJnF7GrRCpzc/fw9PKW+/gqlCq1RqvTG/yMJrPF6m/bAVEhAxxnHG0oAAAAAElFTkSuQmCC);
+ background-image: -webkit-linear-gradient(top, #707070 1%, #3d3d3d 70%, #4c4c4c 97%, #393939 97%);
+ background-image: -moz-linear-gradient(top, #707070 1%, #3d3d3d 70%, #4c4c4c 97%, #393939 97%);
+}
+.dhtmlx-info,
+.dhtmlx_popup_button,
+.dhtmlx_button {
+ user-select: none;
+ -webkit-user-select: none;
+ -moz-user-select: -moz-none;
+ cursor: pointer;
+}
+.dhtmlx_popup_text {
+ overflow: hidden;
+}
+.dhtmlx_popup_controls {
+ border-radius: 6px;
+ padding: 5px;
+}
+.dhtmlx_popup_button,
+.dhtmlx_button {
+ height: 30px;
+ line-height: 30px;
+ display: inline-block;
+ margin: 0 5px;
+ border-radius: 6px;
+ color: #FFF;
+}
+.dhtmlx_popup_button {
+ min-width: 120px;
+}
+div.dhx_modal_cover {
+ background-color: #000;
+ cursor: default;
+ filter: alpha(opacity=20);
+ opacity: 0.2;
+ position: fixed;
+ z-index: 19999;
+ left: 0px;
+ top: 0px;
+ width: 100%;
+ height: 100%;
+ border: none;
+ zoom: 1;
+}
+.dhtmlx-info img,
+.dhtmlx_modal_box img {
+ float: left;
+ margin-right: 20px;
+}
+.dhtmlx-alert-error .dhtmlx_popup_title,
+.dhtmlx-confirm-error .dhtmlx_popup_title {
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAsCAIAAAArRUU2AAAATklEQVR4nIWLuw2AMBBDjVuQiBT2oWbRDATrnB0KQOJoqPzRe3BrHI6dcBASYREKovtK6/6DsDOX+stN+3H1YX9ciRgnYq5EWYhS2dftBIuLT4JyIrPCAAAAAElFTkSuQmCC);
+}
+.dhtmlx-alert-error,
+.dhtmlx-confirm-error {
+ border: 1px solid #ff0000;
+}
+/*Skin section*/
+.dhtmlx_button,
+.dhtmlx_popup_button {
+ box-shadow: 0px 0px 4px #888;
+ border: 1px solid #838383;
+}
+.dhtmlx_button input,
+.dhtmlx_popup_button div {
+ border: 1px solid #FFF;
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAeCAMAAADaS4T1AAAAYFBMVEVwcHBtbW1ra2toaGhmZmZjY2NhYWFeXl5cXFxaWlpXV1dVVVVSUlJQUFBNTU1LS0tJSUlGRkZERERBQUE/Pz88PDw9PT0+Pj5AQEBCQkJDQ0NFRUVHR0dISEhKSkpMTEzqthaMAAAAMklEQVQImQXBhQ2AMAAAsOIMlwWH/8+kRSKVyRVKlVrQaHV6g9FktlhFm93hdLk9Xt8PIfgBvdUqyskAAAAASUVORK5CYII=);
+ background-image: -webkit-linear-gradient(top, #707070 1%, #3d3d3d 70%, #4c4c4c 99%);
+ background-image: -moz-linear-gradient(top, #707070 1%, #3d3d3d 70%, #4c4c4c 99%);
+ border-radius: 6px;
+ font-size: 15px;
+ font-weight: normal;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ color: #fff;
+ padding: 0px;
+ margin: 0px;
+ vertical-align: top;
+ height: 28px;
+ line-height: 28px;
+}
+.dhtmlx_button input:focus,
+.dhtmlx_button input:active,
+.dhtmlx_popup_button div:active,
+.dhtmlx_popup_button div:focus {
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAeCAMAAADaS4T1AAAAXVBMVEVwcHBubm5tbW1sbGxra2tpaWloaGhnZ2dmZmZlZWVjY2NiYmJhYWFgYGBfX19dXV1cXFxbW1taWlpZWVlXV1dWVlZVVVVUVFRTU1NRUVFQUFBPT09OTk5NTU1LS0tT9SY0AAAAMUlEQVQImQXBhQGAMAAAIGxnx2z9/00BiVQmVyhVakGj1ekNRpPZYhVtdofT5fZ4fT8hpwG05JjexgAAAABJRU5ErkJggg==);
+ background-image: -webkit-linear-gradient(top, #707070 1%, #4c4c4c 99%);
+ background-image: -moz-linear-gradient(top, #707070 1%, #4c4c4c 99%);
+}
+.dhtmlx_popup_title {
+ color: #fff;
+ text-shadow: 1px 1px #000;
+ height: 40px;
+ line-height: 40px;
+ font-size: 20px;
+}
+.dhtmlx_popup_text {
+ margin: 15px 15px 5px 15px;
+ font-size: 14px;
+ color: #000;
+ min-height: 30px;
+ border-radius: 6px;
+}
+.dhtmlx-info,
+.dhtmlx-error {
+ font-size: 14px;
+ color: #000;
+ box-shadow: 0px 0px 10px #888;
+ padding: 0px;
+ background-color: #FFF;
+ border-radius: 3px;
+ border: 1px solid #ffffff;
+}
+.dhtmlx-info div {
+ padding: 5px 10px 5px 10px;
+ background-color: #fff;
+ border-radius: 3px;
+ border: 1px solid #B8B8B8;
+}
+.dhtmlx-error {
+ background-color: #d81b1b;
+ border: 1px solid #ff3c3c;
+ box-shadow: 0px 0px 10px #000;
+}
+.dhtmlx-error div {
+ background-color: #d81b1b;
+ border: 1px solid #940000;
+ color: #FFF;
+}
+.dhx_cal_event .dhx_header,
+.dhx_cal_event .dhx_title,
+.dhx_cal_event .dhx_body,
+.dhx_cal_event .dhx_footer {
+ background-color: #FFE763;
+ border: 1px solid #B7A543;
+ color: #887A2E;
+ overflow: hidden;
+ width: 100%;
+ font-family: Tahoma;
+ font-size: 8pt;
+}
+.dhx_move_denied .dhx_cal_event .dhx_header,
+.dhx_move_denied .dhx_cal_event .dhx_title {
+ cursor: default;
+}
+.dhx_cal_event .dhx_header {
+ height: 1px;
+ margin-left: 1px;
+ border-width: 1px 1px 0px 1px;
+ cursor: pointer;
+}
+.dhx_cal_event .dhx_title {
+ height: 12px;
+ border-width: 0px 1px 1px 1px;
+ border-bottom-style: dotted;
+ font-size: 7pt;
+ font-weight: bold;
+ text-align: center;
+ background-position: right;
+ background-repeat: no-repeat;
+ cursor: pointer;
+}
+.dhx_cal_event .dhx_body,
+.dhx_cal_event.dhx_cal_select_menu .dhx_body {
+ border-width: 0 1px 1px 1px;
+ padding: 5px;
+}
+.dhx_cal_event.dhx_cal_select_menu {
+ -webkit-box-shadow: 0 0 1px #FFF;
+ -moz-box-shadow: 0 0 1px #FFF;
+ box-shadow: 0 0 1px #FFF;
+}
+.dhx_resize_denied,
+.dhx_resize_denied .dhx_event_resize {
+ cursor: default !important;
+}
+.dhx_cal_event .dhx_event_resize {
+ cursor: s-resize;
+}
+.dhx_cal_event .dhx_footer,
+.dhx_cal_event .dhx_select_menu_footer {
+ height: 1px;
+ margin-left: 2px;
+ border-width: 0px 1px 1px 1px;
+ position: relative;
+}
+.dhx_cal_event_line {
+ background-color: #FFE763;
+ border: 1px solid #B7A543;
+ border-radius: 3px;
+ font-family: Tahoma;
+ font-size: 8pt;
+ height: 13px;
+ padding-left: 10px;
+ color: #887A2E;
+ cursor: pointer;
+ overflow: hidden;
+}
+.dhx_cal_event_clear {
+ font-family: Tahoma;
+ font-size: 8pt;
+ height: 13px;
+ padding-left: 2px;
+ color: #887A2E;
+ white-space: nowrap;
+ overflow: hidden;
+ cursor: pointer;
+}
+.dhx_in_move {
+ background-color: #FFFF80;
+}
+.dhx_cal_event.dhx_cal_editor {
+ border: 1px solid #B7A543;
+ border-top-style: dotted;
+ z-index: 999;
+ position: absolute;
+ overflow: hidden;
+}
+textarea.dhx_cal_editor {
+ width: 100%;
+ height: 100%;
+ border: 0 solid black;
+ margin: 0;
+ padding: 0;
+ overflow: auto;
+}
+div.dhx_menu_head {
+ background-image: url(imgs/controls.gif);
+ background-position: 0px -43px;
+ width: 10px;
+ height: 10px;
+ margin-left: 5px;
+ margin-top: 1px;
+ border: none;
+ cursor: default;
+}
+div.dhx_menu_icon {
+ background-image: url(imgs/controls.gif);
+ width: 20px;
+ height: 20px;
+ margin-left: -5px;
+ margin-top: 0px;
+ border: none;
+ cursor: pointer;
+}
+div.icon_details {
+ background-position: 0px 0px;
+}
+div.icon_edit {
+ background-position: -22px 0px;
+}
+div.icon_save {
+ background-position: -84px -1px;
+}
+div.icon_cancel {
+ background-position: -62px 0px;
+}
+div.icon_delete {
+ background-position: -42px 0px;
+}
+/*view more link in month view*/
+.dhx_month_link {
+ position: absolute;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ text-align: right;
+ cursor: pointer;
+ padding-right: 10px;
+}
+.dhx_month_link a {
+ color: blue;
+}
+.dhx_month_link a:hover {
+ text-decoration: underline;
+}
+.dhx_global_tip {
+ font-family: Tahoma, Helvetica;
+ text-align: center;
+ font-size: 20px;
+ position: fixed;
+ top: 60px;
+ right: 20px;
+ background-color: rgba(255, 255, 255, 0.7);
+ color: #000;
+ z-index: 10000;
+ padding: 20px 30px;
+ width: 190px;
+}
+.dhx_global_tip div {
+ font-size: 30px;
+}
+@media (-moz-touch-enabled) {
+ .dhx_cal_container {
+ user-select: none;
+ -moz-user-select: none;
+ }
+}
+.dhx_unselectable,
+.dhx_unselectable div {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.dhx_cal_light {
+ -webkit-tap-highlight-color: transparent;
+ background-color: #FFE763;
+ border-radius: 5px;
+ font-family: Tahoma;
+ font-size: 8pt;
+ border: 1px solid #B7A64B;
+ color: #887A2E;
+ position: absolute;
+ z-index: 10001;
+ width: 580px;
+ height: 300px;
+ box-shadow: 5px 5px 5px #888;
+}
+.dhx_cal_light_wide {
+ width: 650px;
+}
+.dhx_mark {
+ position: relative;
+ top: 3px;
+ background-image: url('imgs/controls.gif');
+ background-position: 0px -43px;
+ padding-left: 10px;
+}
+.dhx_ie6 .dhx_mark {
+ background-position: 6px -41px;
+}
+.dhx_cal_light select {
+ font-family: Tahoma;
+ font-size: 8pt;
+ color: #887A2E;
+ padding: 2px;
+ margin: 0px;
+}
+.dhx_cal_ltitle {
+ padding: 2px 0px 2px 5px;
+ overflow: hidden;
+ white-space: nowrap;
+}
+.dhx_cal_ltitle span {
+ white-space: nowrap;
+}
+.dhx_cal_lsection {
+ background-color: #DBCF8C;
+ color: #FFF4B5;
+ font-weight: bold;
+ padding: 5px 0px 3px 10px;
+}
+.dhx_section_time {
+ background-color: #DBCF8C;
+ white-space: nowrap;
+}
+.dhx_cal_lsection .dhx_fullday {
+ float: right;
+ margin-right: 5px;
+ color: #887A2E;
+ font-size: 12px;
+ font-weight: normal;
+ line-height: 20px;
+ vertical-align: top;
+ cursor: pointer;
+}
+.dhx_cal_lsection {
+ font-size: 18px;
+ font-family: Arial;
+}
+.dhx_cal_ltext {
+ padding: 2px 0px 2px 10px;
+ overflow: hidden;
+}
+.dhx_cal_ltext textarea {
+ background-color: #FFF4B5;
+ /* #FFF4B5; should be the same for dhx_cal_larea, was transperent */
+ overflow: auto;
+ border: none;
+ color: #887A2E;
+ height: 100%;
+ width: 100%;
+ outline: none !important;
+ resize: none;
+}
+.dhx_time {
+ font-weight: bold;
+}
+.dhx_cal_light .dhx_title {
+ padding-left: 10px;
+}
+.dhx_cal_larea {
+ border: 1px solid #DCC43E;
+ background-color: #FFF4B5;
+ overflow: hidden;
+ margin-left: 3px;
+ width: 572px;
+ height: 1px;
+}
+.dhx_btn_set {
+ padding: 5px 10px 0px 10px;
+ float: left;
+}
+.dhx_btn_set div {
+ float: left;
+ height: 21px;
+ line-height: 21px;
+ vertical-align: middle;
+ cursor: pointer;
+}
+.dhx_save_btn {
+ background-image: url('imgs/controls.gif');
+ background-position: -84px 0px;
+ width: 21px;
+}
+.dhx_cancel_btn {
+ background-image: url('imgs/controls.gif');
+ background-position: -63px 0px;
+ width: 20px;
+}
+.dhx_delete_btn {
+ background-image: url('imgs/controls.gif');
+ background-position: -42px 0px;
+ width: 20px;
+}
+.dhx_cal_cover {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ z-index: 10000;
+ top: 0px;
+ left: 0px;
+ background-color: black;
+ opacity: 0.1;
+ filter: alpha(opacity=10);
+}
+.dhx_custom_button {
+ padding: 0px 3px 0px 3px;
+ color: #887A2E;
+ font-family: Tahoma;
+ font-size: 8pt;
+ background-color: #FFE763;
+ font-weight: normal;
+ margin-right: 5px;
+ margin-top: 0px;
+ cursor: pointer;
+}
+.dhx_custom_button div {
+ cursor: pointer;
+ float: left;
+ height: 21px;
+ line-height: 21px;
+ vertical-align: middle;
+}
+.dhx_cal_light_wide .dhx_cal_larea {
+ border-top-width: 0px;
+}
+.dhx_cal_light_wide .dhx_cal_lsection {
+ border: 0px;
+ float: left;
+ text-align: right;
+ width: 100px;
+ height: 20px;
+ font-size: 16px;
+ padding: 5px 0px 0px 10px;
+}
+.dhx_cal_light_wide .dhx_wrap_section {
+ border-top: 1px solid #DBCF8C;
+ position: relative;
+ background-color: #DBCF8C;
+ overflow: hidden;
+}
+.dhx_cal_light_wide .dhx_section_time {
+ padding-top: 2px !important;
+ height: 20px !important;
+}
+.dhx_section_time {
+ text-align: center;
+}
+.dhx_cal_light_wide .dhx_cal_larea {
+ width: 730px;
+}
+.dhx_cal_light_wide {
+ width: 738px;
+}
+.dhx_cal_light_wide .dhx_section_time {
+ background: transparent;
+}
+.dhx_cal_light_wide .dhx_cal_checkbox label {
+ padding-left: 0px;
+}
+.dhx_cal_wide_checkbox input {
+ margin-top: 8px;
+ margin-left: 14px;
+}
+.dhx_cal_light input {
+ font-family: Tahoma;
+ font-size: 8pt;
+ color: #887A2E;
+}
+.dhx_cal_light_wide .dhx_cal_lsection .dhx_fullday {
+ float: none;
+ margin-right: 0px;
+ color: #FFF4B5;
+ font-weight: bold;
+ font-size: 16px;
+ font-family: Arial;
+ cursor: pointer;
+}
+.dhx_custom_button {
+ float: right;
+ height: 21px;
+ width: 90px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ -ms-border-radius: 4px;
+ -o-border-radius: 4px;
+ border-radius: 4px;
+}
+.dhx_cal_light_wide .dhx_custom_button {
+ position: absolute;
+ top: 0;
+ right: 0;
+ margin-top: 2px;
+}
+.dhx_cal_light_wide .dhx_repeat_right {
+ margin-right: 55px;
+}
+.dhx_minical_popup {
+ position: absolute;
+ z-index: 10100;
+ width: 251px;
+ height: 175px;
+}
+.dhx_scale_bar_header {
+ position: absolute;
+ border-bottom: 1px dotted #8894A3;
+ width: 100%;
+}
+.dhx_expand_icon {
+ position: absolute;
+ top: 0px;
+ right: 0px;
+ background-image: url(imgs/collapse_expand_icon.gif);
+ width: 18px;
+ height: 18px;
+ cursor: pointer;
+ background-position: 0px 18px;
+ z-index: 16;
+}
+.dhx_scheduler_agenda .dhx_cal_data {
+ background-image: url(imgs/databg.png);
+}
+.dhx_agenda_area {
+ width: 100%;
+ overflow-y: auto;
+ background-image: url(imgs/databg.png);
+}
+.dhx_agenda_line {
+ height: 21px;
+ clear: both;
+ overflow: hidden;
+}
+.dhx_agenda_line div {
+ float: left;
+ width: 188px;
+ border-right: 1px dotted #8894A3;
+ text-align: center;
+ line-height: 21px;
+ overflow: hidden;
+}
+.dhx_agenda_area .dhx_agenda_line div {
+ border-right: 0px dotted #8894A3;
+}
+.dhx_v_border {
+ position: absolute;
+ left: 187px;
+ top: 0;
+ border-right: 1px dotted #8894A3;
+ width: 1px;
+ height: 100%;
+}
+.dhx_agenda_line .dhx_event_icon {
+ width: 20px;
+ border-width: 0px;
+ background: url(imgs/icon.png) no-repeat;
+ background-position: 5px 4px;
+ cursor: pointer;
+}
+.dhx_agenda_line span {
+ padding-left: 5px;
+ line-height: 21px;
+}
+.dhx_year_body {
+ border-left: 1px dotted #586A7E;
+}
+.dhx_year_week {
+ position: relative;
+}
+.dhx_scale_bar_last {
+ border-right: 1px dotted #586A7E;
+}
+.dhx_year_month {
+ height: 18px;
+ padding-top: 3px;
+ border: 1px dotted #586A7E;
+ text-align: center;
+ vertical-align: middle;
+}
+.dhx_year_body .dhx_before .dhx_month_head,
+.dhx_year_body .dhx_after .dhx_month_head,
+.dhx_year_body .dhx_before .dhx_month_head a,
+.dhx_year_body .dhx_after .dhx_month_head a {
+ color: #E2E3E6 !important;
+}
+.dhx_year_body .dhx_month_body {
+ height: 0px;
+ overflow: hidden;
+}
+.dhx_month_head.dhx_year_event {
+ background-color: #FFE763;
+}
+.dhx_year_body .dhx_before .dhx_month_head,
+.dhx_year_body .dhx_after .dhx_month_head {
+ cursor: default;
+}
+.dhx_year_tooltip {
+ border: 1px solid #BBBBBB;
+ background-image: url(imgs/databg.png);
+ position: absolute;
+ z-index: 9998;
+ width: 300px;
+ height: auto;
+ font-family: Tahoma;
+ font-size: 8pt;
+ overflow: hidden;
+}
+.dhx_tooltip_line {
+ line-height: 20px;
+ height: 20px;
+ overflow: hidden;
+}
+.dhx_tooltip_line .dhx_event_icon {
+ width: 20px;
+ height: 20px;
+ padding-right: 10px;
+ float: left;
+ border-width: 0px;
+ position: relative;
+ background: url(imgs/icon.png) no-repeat;
+ background-position: 5px 4px;
+ cursor: pointer;
+}
+.dhx_tooltip_date {
+ float: left;
+ width: auto;
+ padding-left: 5px;
+ text-align: center;
+}
+.dhx_text_disabled {
+ color: #887A2E;
+ font-family: Tahoma;
+ font-size: 8pt;
+}
+.dhx_mini_calendar {
+ -moz-box-shadow: 5px 5px 5px #888;
+ /*Doesn't work in IE*/
+ -khtml-box-shadow: 5px 5px 5px #888;
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ -user-select: none;
+}
+.dhx_mini_calendar .dhx_month_head {
+ cursor: pointer;
+}
+.dhx_mini_calendar .dhx_calendar_click {
+ background-color: #C2D5FC;
+}
+.dhx_cal_navline div.dhx_minical_icon {
+ width: 18px;
+ height: 18px;
+ left: 190px;
+ top: 1px;
+ cursor: pointer;
+ background-image: url(imgs/calendar.gif);
+}
+.dhx_matrix_scell {
+ height: 100%;
+}
+.dhx_matrix_cell,
+.dhx_matrix_scell {
+ overflow: hidden;
+ text-align: center;
+ vertical-align: middle;
+ border-bottom: 1px dotted #8894A3;
+ border-right: 1px dotted #8894A3;
+}
+.dhx_matrix_cell {
+ background-color: white;
+}
+.dhx_matrix_line {
+ overflow: hidden;
+}
+.dhx_matrix_cell div,
+.dhx_matrix_scell div {
+ overflow: hidden;
+ text-align: center;
+ height: auto;
+}
+.dhx_cal_lsection .dhx_readonly {
+ font-size: 9pt;
+ font-size: 8pt;
+ padding: 2px;
+ color: #887A2E;
+}
+.dhx_cal_event_line .dhx_event_resize {
+ cursor: w-resize;
+ background: url(imgs/resize_dots.png) repeat-y;
+ position: absolute;
+ top: 0;
+ width: 4px;
+ height: 100%;
+}
+.dhx_event_resize_start {
+ left: 0;
+}
+.dhx_event_resize_end {
+ right: 0;
+}
+/* Tree view */
+.dhx_matrix_scell.folder,
+.dhx_data_table.folder .dhx_matrix_cell {
+ background-color: #969394;
+ cursor: pointer;
+}
+.dhx_matrix_scell .dhx_scell_level0 {
+ padding-left: 5px;
+}
+.dhx_matrix_scell .dhx_scell_level1 {
+ padding-left: 20px;
+}
+.dhx_matrix_scell .dhx_scell_level2 {
+ padding-left: 35px;
+}
+.dhx_matrix_scell .dhx_scell_level3 {
+ padding-left: 50px;
+}
+.dhx_matrix_scell .dhx_scell_level4 {
+ padding-left: 65px;
+}
+.dhx_matrix_scell.folder {
+ font-weight: bold;
+ text-align: left;
+}
+.dhx_matrix_scell.folder .dhx_scell_expand {
+ float: left;
+ width: 10px;
+ padding-right: 3px;
+}
+.dhx_matrix_scell.folder .dhx_scell_name {
+ float: left;
+ width: auto;
+}
+.dhx_matrix_scell.item .dhx_scell_name {
+ padding-left: 15px;
+ text-align: left;
+}
+.dhx_data_table.folder .dhx_matrix_cell {
+ border-right: 0;
+}
+.dhx_section_timeline {
+ overflow: hidden;
+ padding: 4px 0 2px 10px;
+}
+.dhx_section_timeline select {
+ width: 552px;
+}
+/* Tree view end*/
+/* Map view */
+.dhx_map_area {
+ width: 100%;
+ height: 100%;
+ overflow-y: auto;
+ overflow-x: hidden;
+ background-image: url(imgs/databg.png);
+}
+.dhx_map_line .dhx_event_icon {
+ width: 20px;
+ border-width: 0px;
+ background: url(imgs/icon.png) no-repeat;
+ background-position: 5px 4px;
+ cursor: pointer;
+}
+.dhx_map_line {
+ height: 21px;
+ clear: both;
+ overflow: hidden;
+}
+.dhx_map {
+ position: absolute;
+}
+.dhx_map_line div {
+ float: left;
+ border-right: 1px dotted #8894A3;
+ text-align: center;
+ line-height: 21px;
+ overflow: hidden;
+}
+.dhx_map_line .headline_description {
+ float: left;
+ border-right: 1px dotted #8894A3;
+ text-align: center;
+ line-height: 21px;
+ overflow: hidden;
+}
+.dhx_map_line .dhx_map_description {
+ float: left;
+ border-right: 0 dotted #8894A3;
+ text-align: center;
+ line-height: 21px;
+ overflow: hidden;
+}
+.dhx_map_line .headline_date,
+.dhx_map_line .headline_description {
+ border-left: 0;
+}
+.dhx_map_line .line_description {
+ float: left;
+ border-right: 1px dotted #8894A3;
+ text-align: left;
+ padding-left: 5px;
+ line-height: 21px;
+ overflow: hidden;
+}
+.dhx_map_line.highlight {
+ background-color: #C4C5CC;
+}
+.dhx_map_area .dhx_map_line div {
+ border-right: 0px dotted #8894A3;
+}
+/* Map view end */
+/* dhtmlXTooltip start */
+.dhtmlXTooltip.tooltip {
+ -moz-box-shadow: 3px 3px 3px #888888;
+ -webkit-box-shadow: 3px 3px 3px #888888;
+ -o-box-shadow: 3px 3px 3px #888888;
+ box-shadow: 3px 3px 3px #888888;
+ filter: progid:DXImageTransform.Microsoft.Shadow(color='#888888', Direction=135, Strength=5);
+ background-color: white;
+ border-left: 1px dotted #887A2E;
+ border-top: 1px dotted #887A2E;
+ color: #887A2E;
+ cursor: default;
+ padding: 10px;
+ position: absolute;
+ z-index: 500;
+ font-family: Tahoma;
+ font-size: 8pt;
+ opacity: 1;
+}
+/* dhtmlXTooltip end */
+/* Lightbox checkbox section */
+.dhx_cal_checkbox label {
+ padding-left: 5px;
+}
+/* Lightbox checkbox section end */
+/* Lightbox radiobuttons section */
+.dhx_cal_light .radio {
+ padding: 2px 0px 2px 10px;
+}
+.dhx_cal_light .radio input,
+.dhx_cal_light .radio label {
+ line-height: 15px;
+}
+.dhx_cal_light .radio input {
+ vertical-align: middle;
+ margin: 0px;
+ padding: 0px;
+}
+.dhx_cal_light .radio label {
+ vertical-align: middle;
+ padding-right: 10px;
+}
+/* Lightbox radiobuttons section end */
+/* Lightbox dhtmlx combo section */
+.dhx_cal_light .combo {
+ padding: 4px;
+}
+.dhx_cal_light_wide .dhx_combo_box {
+ width: 608px !important;
+ left: 10px;
+}
+/* Lightbox dhtmlx combo section end */
+/* Agenda week start */
+.dhx_wa_column {
+ float: left;
+}
+.dhx_wa_column_last .dhx_wa_day_cont {
+ border-left: 1px dotted #8894A3;
+}
+.dhx_wa_scale_bar {
+ font-family: Tahoma;
+ padding-left: 10px;
+ font-size: 11px;
+ border-top: 1px dotted #8894A3;
+ border-bottom: 1px dotted #8894A3;
+}
+.dhx_wa_day_data {
+ background-color: #FCFEFC;
+ overflow-y: auto;
+}
+.dhx_wa_ev_body {
+ border-bottom: 1px dotted #778899;
+ font-size: 12px;
+ padding: 5px 0 5px 7px;
+}
+.dhx_wa_dnd {
+ font-family: Tahoma;
+ position: absolute;
+ padding-right: 7px;
+ color: #887AE2 !important;
+ background-color: #FFE763 !important;
+ border: 1px solid #B7A543;
+}
+.dhx_cal_event_selected {
+ background-color: #9cc1db;
+ color: white;
+}
+/* Agenda week end */
+/* timeline second scale start */
+.dhx_second_scale_bar {
+ border-bottom: 1px dotted #586A7E;
+ padding-top: 2px;
+}
+/* timeline second scale end */
+/* grid view */
+.dhx_cal_header div div {
+ border-left: 1px dotted #8894A3;
+}
+.dhx_grid_area {
+ width: 100%;
+ height: 100%;
+ overflow-y: auto;
+ background-color: #FCFEFC;
+}
+.dhx_grid_area table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ width: 100%;
+ table-layout: fixed;
+}
+.dhx_grid_area td {
+ table-layout: fixed;
+ text-align: center;
+}
+.dhx_grid_line {
+ height: 21px;
+ clear: both;
+ overflow: hidden;
+}
+.dhx_grid_line div {
+ float: left;
+ cursor: default;
+ padding-top: 0;
+ padding-bottom: 0;
+ text-align: center;
+ line-height: 21px;
+ overflow: hidden;
+}
+.dhx_grid_area td,
+.dhx_grid_line div {
+ padding-left: 8px;
+ padding-right: 8px;
+}
+.dhx_grid_area tr.dhx_grid_event {
+ height: 21px;
+ overflow: hidden;
+ margin: 0 0 1px 0;
+}
+.dhx_grid_area tr.dhx_grid_event td {
+ /*borders for old ies*/
+ border-bottom: 1px solid #ECEEF4;
+}
+.dhx_grid_area tr.dhx_grid_event:nth-child(2n+1) td,
+.dhx_grid_area tr.dhx_grid_event:nth-child(2n) td {
+ border-bottom-width: 0px;
+ border-bottom-style: none;
+}
+.dhx_grid_area tr.dhx_grid_event:nth-child(2n) {
+ background-color: #ECEEF4;
+}
+.dhx_grid_area .dhx_grid_dummy {
+ table-layout: auto;
+ margin: 0 !important;
+ padding: 0 !important;
+}
+.dhx_grid_v_border {
+ position: absolute;
+ border-right: 1px solid #A4BED4;
+ width: 1px;
+ height: 100%;
+}
+.dhx_grid_event_selected {
+ background-color: #9cc1db !important;
+ color: white !important;
+}
+.dhx_grid_sort_desc .dhx_grid_view_sort {
+ background-position: 0 -55px;
+}
+.dhx_grid_sort_asc .dhx_grid_view_sort {
+ background-position: 0 -66px;
+}
+.dhx_grid_view_sort {
+ width: 10px;
+ height: 10px;
+ position: absolute;
+ border: none !important;
+ top: 5px;
+ background-repeat: no-repeat;
+ background-image: url(imgs/images.png);
+}
+/* end grid */
+/* marked timespans */
+.dhx_marked_timespan {
+ position: absolute;
+ width: 100%;
+}
+.dhx_time_block {
+ position: absolute;
+ width: 100%;
+ background: silver;
+ opacity: 0.4;
+ filter: alpha(opacity=40);
+ z-index: 1;
+}
+.dhx_time_block_reset {
+ opacity: 1;
+ filter: alpha(opacity=100);
+}
+.dhx_scheduler_month .dhx_marked_timespan {
+ display: none;
+}
+.dhx_mini_calendar .dhx_marked_timespan {
+ display: none;
+}
+/* now time */
+.dhx_now_time {
+ width: 100%;
+ border-bottom: 2px solid red;
+ z-index: 1;
+}
+.dhx_scheduler_month .dhx_now_time {
+ border-bottom: 0;
+ border-left: 2px solid red;
+}
+.dhx_matrix_now_time {
+ border-left: 2px solid red;
+ z-index: 1;
+}
+.dhx_now_time,
+.dhx_matrix_now_time {
+ opacity: 0.5;
+}
+/* Quick info */
+.dhx_cal_quick_info {
+ border: 2px solid #888;
+ border-radius: 5px;
+ position: absolute;
+ z-index: 300;
+ background-color: #8e99ae;
+ background-color: rgba(98, 107, 127, 0.5);
+ padding-left: 7px;
+ width: 300px;
+ transition: left 0.5s ease, right 0.5s;
+ -moz-transition: left 0.5s ease, right 0.5s;
+ -webkit-transition: left 0.5s ease, right 0.5s;
+ -o-transition: left 0.5s ease, right 0.5s;
+}
+.dhx_no_animate {
+ transition: none;
+ -moz-transition: none;
+ -webkit-transition: none;
+ -o-transition: none;
+}
+.dhx_cal_quick_info.dhx_qi_left .dhx_qi_big_icon {
+ float: right;
+}
+.dhx_cal_qi_title {
+ padding: 5px 0px 10px 5px;
+ color: #FFF;
+ letter-spacing: 1px;
+}
+.dhx_cal_qi_tdate {
+ font-size: 14px;
+}
+.dhx_cal_qi_tcontent {
+ font-size: 18px;
+ font-weight: bold;
+}
+.dhx_cal_qi_content {
+ border: 1px solid #888;
+ background-color: #fefefe;
+ padding: 16px 8px;
+ font-size: 14px;
+ color: #444;
+ width: 275px;
+ overflow: hidden;
+}
+.dhx_qi_big_icon {
+ border-radius: 3px;
+ color: #444;
+ margin: 5px 9px 5px 0px;
+ min-width: 60px;
+ line-height: 20px;
+ vertical-align: middle;
+ padding: 5px 10px 5px 5px;
+ cursor: pointer;
+ background-color: #fefefe;
+ border-bottom: 1px solid #666;
+ border-right: 1px solid #666;
+ float: left;
+}
+.dhx_cal_qi_controls div {
+ float: left;
+ height: 20px;
+ text-align: center;
+ line-height: 20px;
+}
+.dhx_qi_big_icon .dhx_menu_icon {
+ margin: 0 8px 0 0px;
+}
+.dhx_drag_marker {
+ width: 100%;
+ filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
+ opacity: 0.5;
+ background-color: #FFE763;
+ position: absolute;
+ box-sizing: border-box !important;
+ border-top: 1px solid #B6B6B6;
+ border-bottom: 1px solid #b6b6b6;
+}
+/* bootstrap CSS fix start */
+.dhx_cal_navline div,
+.dhx_cal_header,
+.dhx_cal_header div,
+.dhx_cal_data div,
+.dhx_cal_light,
+.dhx_cal_light div {
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+.dhx_cal_light .dhx_cal_radio label {
+ margin-bottom: 0;
+}
+.dhx_cal_event div {
+ line-height: normal;
+}
+/* bootstrap CSS fix end */
+.dhx_cal_container {
+ background-color: #C2D5FC;
+ font-family: Tahoma;
+ font-size: 8pt;
+ position: relative;
+ overflow: hidden;
+}
+.dhx_cal_container div {
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.dhx_cal_navline {
+ height: 20px;
+ position: absolute;
+ z-index: 3;
+ width: 750px;
+ color: #2F3A48;
+}
+.dhx_cal_navline div {
+ position: absolute;
+ top: 2px;
+ white-space: nowrap;
+}
+.dhx_cal_navline .dhx_cal_date {
+ font-weight: 600;
+ left: 210px;
+ padding-top: 1px;
+}
+.dhx_cal_button .dhx_left_bg {
+ width: 1px;
+ overflow: hidden;
+ height: 17px;
+ z-index: 20;
+ top: 0px;
+}
+.dhx_cal_prev_button {
+ background-image: url(imgs/buttons.png);
+ background-position: 0px 0px;
+ width: 29px;
+ height: 17px;
+ left: 50px;
+ cursor: pointer;
+}
+.dhx_cal_next_button {
+ background-image: url(imgs/buttons.png);
+ background-position: -30px 0px;
+ width: 29px;
+ height: 17px;
+ left: 80px;
+ cursor: pointer;
+}
+.dhx_cal_today_button {
+ background-image: url(imgs/buttons.png);
+ background-position: -60px 0px;
+ width: 75px;
+ height: 17px;
+ left: 112px;
+ cursor: pointer;
+ text-align: center;
+ text-decoration: underline;
+}
+.dhx_cal_tab {
+ width: 59px;
+ height: 19px;
+ text-align: center;
+ text-decoration: underline;
+ padding-top: 2px;
+ cursor: pointer;
+ background-color: #D8E1EA;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ -moz-border-radius-topleft: 4px;
+ -moz-border-radius-topright: 4px;
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+}
+.dhx_cal_tab.active {
+ text-decoration: none;
+ cursor: default;
+ font-weight: bold;
+ border: 1px dotted #586A7E;
+ border-bottom: 0;
+ background-color: #C2D5FC;
+}
+.dhx_cal_header {
+ position: absolute;
+ left: 10px;
+ top: 23px;
+ width: 750px;
+ border-top: 1px dotted #8894A3;
+ border-right: 1px dotted #8894A3;
+ z-index: 2;
+ overflow: hidden;
+ color: #2F3A48;
+}
+.dhx_cal_data {
+ -webkit-tap-highlight-color: transparent;
+ border-top: 1px dotted #8894A3;
+ position: absolute;
+ top: 44px;
+ width: 600px;
+ overflow-y: auto;
+ overflow-x: hidden;
+ -webkit-overflow-scrolling: touch;
+}
+.dhx_cal_data {
+ -ms-touch-action: pan-y;
+}
+.dhx_cal_event,
+.dhx_cal_event_line,
+.dhx_cal_event_clear {
+ -ms-touch-action: none;
+}
+.dhx_scale_bar {
+ position: absolute;
+ text-align: center;
+ background-color: #C2D5FC;
+ padding-top: 3px;
+ border-left: 1px dotted #586A7E;
+}
+.dhx_scale_holder {
+ position: absolute;
+ border-right: 1px dotted #586A7E;
+ background-image: url(imgs/databg.png);
+}
+.dhx_scale_holder_now {
+ position: absolute;
+ border-right: 1px dotted #586A7E;
+ background-image: url(imgs/databg_now.png);
+}
+.dhx_scale_hour {
+ height: 41px;
+ width: 50px;
+ border-bottom: 1px dotted #8894A3;
+ background-color: #C2D5FC;
+ text-align: center;
+ line-height: 40px;
+ color: #586A7E;
+ overflow: hidden;
+}
+.dhx_month_head {
+ background-color: #EBEFF4;
+ color: #2F3A48;
+ height: 18px;
+ padding-right: 5px;
+ padding-top: 3px;
+ text-align: right;
+ border-right: 1px dotted #586A7E;
+}
+.dhx_month_body {
+ border-right: 1px dotted #586A7E;
+ border-bottom: 1px dotted #586A7E;
+ background-color: #FFFFFF;
+}
+.dhx_now .dhx_month_body {
+ background-color: #E2EDFF;
+}
+.dhx_after .dhx_month_body,
+.dhx_before .dhx_month_body {
+ background-color: #ECECEC;
+}
+.dhx_after .dhx_month_head,
+.dhx_before .dhx_month_head {
+ background-color: #E2E3E6;
+ color: #94A6BB;
+}
+.dhx_now .dhx_month_head {
+ background-color: #D1DEF4;
+ font-weight: bold;
+}
+.dhx_scale_ignore {
+ display: none;
+}
+.dhx_cal_drag {
+ position: absolute;
+ z-index: 9999;
+ background-color: #FFE763;
+ border: 1px solid #B7A543;
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+}
+.dhx_loading {
+ position: absolute;
+ width: 128px;
+ height: 15px;
+ background-image: url(imgs/loading.gif);
+ z-index: 9999;
+}
+.dhx_multi_day_icon,
+.dhx_multi_day {
+ background-color: #E1E6FF;
+ background-repeat: no-repeat;
+ border-right: 1px dotted #8894A3;
+}
+.dhx_multi_day {
+ position: absolute;
+ border-top: 1px dotted #8894A3;
+}
+.dhx_multi_day_icon,
+.dhx_multi_day_icon_small {
+ background-position: center center;
+ background-color: #E1E6FF;
+ background-repeat: no-repeat;
+ border-bottom: 1px dotted #8894A3;
+ border-right: 1px dotted #8894A3;
+}
+.dhx_multi_day_icon {
+ background-image: url(imgs/clock_big.gif);
+}
+.dhx_multi_day_icon_small {
+ background-image: url(imgs/clock_small.gif);
+}
+.dhtmlxLayoutPolyContainer_dhx_skyblue .dhx_cal_container {
+ background-color: #d0e5ff;
+}
+/* left border config option support */
+.dhx_scale_hour_border,
+.dhx_month_body_border,
+.dhx_scale_bar_border,
+.dhx_month_head_border {
+ border-left: 1px dotted #8894A3;
+}
+/* export to PDF and iCal buttons start */
+.dhx_cal_navline .dhx_cal_export {
+ width: 18px;
+ height: 18px;
+ margin: 2px;
+ cursor: pointer;
+ top: 0px;
+}
+.dhx_cal_navline .dhx_cal_export.pdf {
+ left: 2px;
+ background-image: url('imgs/export_pdf.png');
+}
+.dhx_cal_navline .dhx_cal_export.ical {
+ left: 24px;
+ background-image: url('imgs/export_ical.png');
+}
+/* export to PDF and iCal buttons end */
+/*All*/
+.dhx_form_repeat,
+.dhx_form_repeat input {
+ padding: 0;
+ margin: 0;
+ padding-left: 5px;
+ font-family: Tahoma, Verdana;
+ font-size: 11px;
+ line-height: 24px;
+}
+.dhx_form_repeat {
+ overflow: hidden;
+ /*height:115px;*/
+ height: 0px;
+ background-color: #FFF4B5;
+ /*border: 1px solid #DCC43E;*/
+}
+.dhx_cal_light_wide .dhx_form_repeat {
+ background-color: transparent;
+}
+.dhx_repeat_center,
+.dhx_repeat_left {
+ height: 115px;
+ padding: 10px 0 10px 10px;
+ float: left;
+}
+.dhx_repeat_left {
+ width: 95px;
+}
+.dhx_repeat_center {
+ width: 335px;
+ margin-top: 12px;
+}
+.dhx_repeat_divider {
+ float: left;
+ height: 115px;
+ border-left: 1px dotted #DCC43E;
+ /*background-color: #DCC43E;*/
+ width: 1px;
+}
+.dhx_repeat_right {
+ float: right;
+ height: 115px;
+ width: 160px;
+ padding: 10px 3px 10px 10px;
+ margin-top: 7px;
+}
+input.dhx_repeat_text {
+ height: 16px;
+ width: 27px;
+ margin: 0 4px 0 4px;
+ line-height: 18px;
+ padding: 0 0 0 2px;
+}
+.dhx_form_repeat select {
+ height: 20px;
+ width: 87px;
+ padding: 0 0 0 2px;
+ margin: 0 4px 0 4px;
+}
+input.dhx_repeat_date {
+ height: 18px;
+ width: 80px;
+ padding: 0 0 0 2px;
+ margin: 0 4px 0 4px;
+ background-repeat: no-repeat;
+ background-position: 64px 0;
+ border: 1px #7f9db9 solid;
+ line-height: 18px;
+}
+input.dhx_repeat_radio {
+ margin-right: 4px;
+}
+input.dhx_repeat_checkbox {
+ margin: 4px 4px 0 0;
+}
+.dhx_repeat_days td {
+ padding-right: 5px;
+}
+.dhx_repeat_days label {
+ font-size: 10px;
+}
+.dhx_custom_button {
+ width: 90px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ -ms-border-radius: 4px;
+ -o-border-radius: 4px;
+ border-radius: 4px;
+}
+.dhx_custom_button_recurring {
+ background-image: url(imgs/but_repeat.gif);
+ background-position: -5px 20px;
+ width: 20px;
+ margin-right: 10px;
+}
+/* increase width of lightbox */
+.dhx_cal_light_rec {
+ width: 640px;
+}
+.dhx_cal_light_rec .dhx_cal_larea {
+ width: 632px;
+}
+.dhx_cal_light_rec.dhx_cal_light_wide {
+ width: 816px;
+}
+.dhx_cal_light_rec.dhx_cal_light_wide .dhx_cal_larea {
+ width: 808px;
+}
+/* bootstrap CSS fix */
+.dhx_cal_navline div,
+.dhx_cal_header,
+.dhx_cal_header div,
+.dhx_cal_data div {
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+.dhx_cal_event div {
+ line-height: normal;
+}
+/* event start */
+.dhx_cal_event .dhx_title {
+ border-width: 1px 1px 0 1px;
+ padding-top: 1px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ -moz-border-radius-topleft: 4px;
+ -moz-border-radius-topright: 4px;
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+ font-family: arial;
+ font-weight: bold;
+ font-size: 12px;
+ line-height: 12px;
+}
+.dhx_cal_event .dhx_body,
+.dhx_cal_event.dhx_cal_select_menu .dhx_body {
+ padding-bottom: 8px;
+ -webkit-border-bottom-right-radius: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ -moz-border-radius-bottomright: 4px;
+ -moz-border-radius-bottomleft: 4px;
+ border-bottom-right-radius: 4px;
+ border-bottom-left-radius: 4px;
+}
+.dhx_cal_event .dhx_header,
+.dhx_cal_event.dhx_cal_select_menu .dhx_footer {
+ display: none;
+}
+.dhx_cal_event .dhx_footer {
+ height: 5px;
+ border: 0;
+ margin-top: -6px;
+ background: url(imgs_dhx_terrace/resizing.png) no-repeat center center;
+}
+.dhx_cal_event .dhx_header,
+.dhx_cal_event .dhx_footer,
+.dhx_cal_event .dhx_body,
+.dhx_cal_event .dhx_title {
+ background-color: #1796b0;
+ border-color: transparent;
+ color: white;
+}
+.dhx_cal_event.dhx_cal_editor {
+ border: 1px solid transparent;
+}
+.dhx_cal_editor {
+ font-size: 12px;
+ font-family: Arial, sans-serif;
+}
+div.dhx_menu_head,
+div.dhx_menu_icon {
+ background-image: url(imgs_dhx_terrace/controls.png);
+}
+.dhx_cal_event_line {
+ border: 1px solid transparent;
+ background-color: #1796b0;
+ color: white;
+ height: 17px;
+ line-height: 17px;
+ -webkit-border-radius: 2px;
+ -moz-border-radius: 2px;
+ border-radius: 2px;
+}
+.dhx_cal_event_line_start {
+ -webkit-border-top-left-radius: 9px;
+ -webkit-border-bottom-left-radius: 9px;
+ -moz-border-radius-topleft: 9px;
+ -moz-border-radius-bottomleft: 9px;
+ border-top-left-radius: 9px;
+ border-bottom-left-radius: 9px;
+}
+.dhx_cal_event_line_end {
+ -webkit-border-top-right-radius: 9px;
+ -webkit-border-bottom-right-radius: 9px;
+ -moz-border-radius-topright: 9px;
+ -moz-border-radius-bottomright: 9px;
+ border-top-right-radius: 9px;
+ border-bottom-right-radius: 9px;
+}
+.dhx_cal_event .dhx_body,
+.dhx_cal_event_line {
+ font-size: 12px;
+ font-family: Arial, sans-serif;
+}
+/* event end */
+/* scales, containers start */
+.dhx_cal_container {
+ background-color: white;
+}
+.dhx_cal_data {
+ border-top: 1px solid #CECECE;
+}
+.dhx_scale_holder {
+ background-image: url(imgs_dhx_terrace/databg.png);
+ border-right: 1px solid #CECECE;
+}
+.dhx_scale_holder_now {
+ background-image: url(imgs_dhx_terrace/databg_now.png);
+ border-right: 1px solid #CECECE;
+}
+.dhx_scale_hour {
+ border-bottom: 1px solid #CECECE;
+ background-color: white;
+ font: 11px/44px Arial;
+ color: #767676;
+}
+.dhx_cal_header {
+ border: 1px solid #CECECE;
+ border-left: 0;
+ border-bottom: 0;
+}
+.dhx_scale_bar {
+ border-left: 1px solid #CECECE;
+}
+.dhx_scale_bar {
+ font: 11px/16px Arial;
+ color: #767676;
+ padding-top: 2px;
+ background-color: white;
+}
+/* scales, containers end */
+/* navigation start */
+.dhx_cal_navline div {
+ top: 14px;
+}
+.dhx_cal_tab,
+.dhx_cal_date,
+.dhx_cal_today_button,
+.dhx_cal_prev_button,
+.dhx_cal_next_button {
+ color: #454544;
+ height: 30px;
+ line-height: 30px;
+ background: none;
+ border: 1px solid #CECECE;
+}
+.dhx_cal_navline .dhx_cal_date {
+ border: 0;
+ font-size: 18px;
+ font-weight: normal;
+ font-family: arial;
+ width: 100%;
+ top: 14px;
+ text-align: center;
+ position: absolute;
+ left: 0;
+ z-index: -1;
+}
+.dhx_cal_today_button {
+ color: #747473;
+ left: auto;
+ right: 123px;
+ background: none;
+ text-decoration: none;
+ width: 80px;
+ font-size: 12px;
+ font-weight: bold;
+ font-family: arial;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+}
+.dhx_cal_prev_button,
+.dhx_cal_next_button {
+ left: auto;
+ width: 46px;
+}
+.dhx_cal_prev_button {
+ right: 61px;
+ background: url(imgs_dhx_terrace/arrow_left.png) no-repeat center center;
+ -webkit-border-top-left-radius: 5px;
+ -webkit-border-bottom-left-radius: 5px;
+ -moz-border-radius-topleft: 5px;
+ -moz-border-radius-bottomleft: 5px;
+ border-top-left-radius: 5px;
+ border-bottom-left-radius: 5px;
+}
+.dhx_cal_next_button {
+ right: 14px;
+ background: url(imgs_dhx_terrace/arrow_right.png) no-repeat center center;
+ -webkit-border-top-right-radius: 5px;
+ -webkit-border-bottom-right-radius: 5px;
+ -moz-border-radius-topright: 5px;
+ -moz-border-radius-bottomright: 5px;
+ border-top-right-radius: 5px;
+ border-bottom-right-radius: 5px;
+}
+.dhx_cal_tab {
+ color: #747473;
+ width: 60px;
+ padding-top: 0;
+ text-decoration: none;
+ -webkit-border-radius: 0px;
+ -moz-border-radius: 0px;
+ border-radius: 0px;
+ font-weight: bold;
+ font-family: arial;
+ font-size: 12px;
+}
+.dhx_cal_tab.active {
+ background-color: #F0EDE7;
+ color: #454544;
+ border: 1px solid #CECECE;
+ text-shadow: 0px 1px 0px white;
+}
+.dhx_cal_tab_first {
+ -webkit-border-top-left-radius: 5px;
+ -webkit-border-bottom-left-radius: 5px;
+ -moz-border-radius-topleft: 5px;
+ -moz-border-radius-bottomleft: 5px;
+ border-top-left-radius: 5px;
+ border-bottom-left-radius: 5px;
+}
+.dhx_cal_tab_last {
+ -webkit-border-top-right-radius: 5px;
+ -webkit-border-bottom-right-radius: 5px;
+ -moz-border-radius-topright: 5px;
+ -moz-border-radius-bottomright: 5px;
+ border-top-right-radius: 5px;
+ border-bottom-right-radius: 5px;
+}
+.dhx_cal_tab_standalone {
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+ padding: 0 5px;
+}
+.dhx_multi_day,
+.dhx_multi_day_icon_small,
+.dhx_multi_day_icon {
+ background-color: white;
+}
+.dhx_multi_day {
+ border-top: 1px solid #CECECE;
+}
+.dhx_multi_day_icon,
+.dhx_multi_day_icon_small {
+ border-bottom: 1px solid #CECECE;
+ border-right: 1px solid #CECECE;
+}
+.dhx_multi_day_icon_small {
+ background-image: url(imgs_dhx_terrace/clock_small.gif);
+}
+.dhx_multi_day_icon {
+ background-image: url(imgs_dhx_terrace/clock_big.gif);
+}
+/* navigation end */
+/* month view start */
+.dhx_month_head,
+.dhx_after .dhx_month_head,
+.dhx_before .dhx_month_head,
+.dhx_after .dhx_month_body,
+.dhx_before .dhx_month_body {
+ background-color: white;
+}
+.dhx_month_head {
+ height: 21px;
+ padding-top: 0;
+ font: 12px/21px Arial;
+ color: #362d26;
+ border-right: 1px solid #CECECE;
+}
+.dhx_after .dhx_month_head,
+.dhx_before .dhx_month_head,
+.dhx_after .dhx_month_head,
+.dhx_before .dhx_month_head {
+ color: #bbbbbb;
+}
+.dhx_month_body {
+ border-right: 1px solid #CECECE;
+ border-bottom: 1px solid #CECECE;
+}
+.dhx_now .dhx_month_head,
+.dhx_now .dhx_month_body {
+ background-color: #FFF3A1;
+ font-weight: normal;
+}
+.dhx_cal_event_clear {
+ color: #0E64A0;
+}
+/* month view end */
+/* lightbox start */
+.dhx_cal_larea {
+ margin-left: 0;
+}
+.dhx_cal_light_wide .dhx_cal_larea {
+ margin-left: 3px;
+}
+.dhx_cal_light_wide .dhx_wrap_section {
+ padding: 5px 0;
+}
+.dhx_cal_light,
+.dhx_cal_larea,
+.dhx_cal_lsection,
+.dhx_wrap_section,
+.dhx_cal_light_wide .dhx_wrap_section,
+.dhx_cal_ltext textarea {
+ background-color: white;
+}
+.dhx_cal_lsection,
+.dhx_cal_light_wide .dhx_cal_lsection .dhx_fullday,
+.dhx_cal_lsection .dhx_fullday,
+.dhx_cal_light input {
+ color: #747473;
+}
+.dhx_cal_light_wide .dhx_wrap_section {
+ border-top: 0;
+ border-bottom: 1px solid #CECECE;
+}
+.dhx_cal_larea {
+ border: 1px solid transparent;
+}
+.dhx_cal_ltext textarea,
+.dhx_cal_light select,
+.dhx_cal_light {
+ color: #2E2E2E;
+}
+.dhx_cal_light {
+ border: 1px solid #CECECE;
+}
+.dhx_cal_light_wide .dhx_cal_lsection,
+.dhx_cal_light_wide .dhx_cal_lsection .dhx_fullday {
+ font-size: 13px;
+}
+.dhx_section_time {
+ background-color: transparent;
+}
+.dhx_save_btn,
+.dhx_cancel_btn,
+.dhx_delete_btn,
+.dhx_btn_set div:first-child {
+ display: none;
+}
+.dhx_btn_set,
+.dhx_btn_set div {
+ height: 30px;
+ padding: 0 20px;
+ line-height: 30px;
+}
+.dhx_btn_set {
+ margin: 12px 0 0 0;
+ padding: 0;
+ font-size: 12px;
+ color: #454544;
+ font-weight: bold;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
+.dhx_left_btn_set {
+ margin-left: 20px;
+}
+.dhx_right_btn_set {
+ margin-right: 20px;
+}
+.dhx_save_btn_set {
+ border: 1px solid #22A1BC;
+ color: white;
+ text-shadow: 0px -1px 0px #6f6f6f;
+ background-color: #22A1BC;
+}
+.dhx_btn_set,
+.dhx_cancel_btn_set {
+ border: 1px solid #CECECE;
+}
+.dhx_delete_btn_set {
+ border: 1px solid #FF8831;
+ background-color: #FF8831;
+ color: white;
+ text-shadow: 0px -1px 0px #93755f;
+}
+.dhx_cal_ltitle {
+ height: 30px;
+ line-height: 30px;
+ border-bottom: 1px solid #CECECE;
+}
+.dhx_cal_ltitle span {
+ float: left;
+}
+.dhx_cal_light .dhx_title {
+ padding-left: 13px;
+}
+.dhx_mark {
+ display: none;
+}
+.dhx_time {
+ padding-left: 10px;
+}
+.dhx_close_icon {
+ float: right;
+ width: 9px;
+ height: 9px;
+ background: url(imgs_dhx_terrace/close_icon.png) no-repeat center center;
+ padding: 10px;
+ margin-top: 1px;
+}
+.dhx_cal_light_wide .dhx_cal_ltext.dhx_cal_template {
+ line-height: 22px;
+}
+.dhx_cal_ltext textarea {
+ line-height: 20px;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ border: 1px solid #CECECE;
+ background-color: #F9F9F9;
+}
+/* lightbox end */
+/* modal box */
+.dhtmlx_modal_box {
+ background: white;
+ width: 330px;
+}
+.dhtmlx_popup_controls {
+ padding-bottom: 9px;
+}
+.dhtmlx_popup_button,
+.dhtmlx_popup_button:active,
+.dhtmlx_popup_button div,
+.dhtmlx_popup_button div:active {
+ color: #444;
+ background: white;
+ box-shadow: none;
+}
+.dhtmlx_popup_button.dhtmlx_ok_button {
+ border: 1px solid #22A1BC;
+ background-color: #22A1BC;
+}
+.dhtmlx_popup_button.dhtmlx_ok_button div {
+ background: #22A1BC;
+ border: 1px solid #22A1BC;
+ color: white;
+ text-shadow: 0px -1px 0px #6f6f6f;
+}
+/* mobdal box end */
+/* minicalendar */
+.dhx_cal_container.dhx_mini_calendar {
+ box-sizing: border-box;
+ border: 1px solid #CECECE;
+ box-shadow: 2px 2px 5px #CCC;
+ border-radius: 3px;
+}
+.dhx_mini_calendar .dhx_year_month {
+ border: 1px solid #CECECE;
+ font-family: Arial;
+}
+.dhx_mini_calendar .dhx_month_head,
+.dhx_mini_calendar .dhx_year_month,
+.dhx_mini_calendar .dhx_month_body,
+.dhx_mini_calendar .dhx_scale_bar,
+.dhx_mini_calendar .dhx_year_body {
+ border-color: transparent;
+}
+.dhx_mini_calendar .dhx_year_body {
+ padding-top: 1px;
+}
+.dhx_mini_calendar .dhx_scale_bar {
+ border-width: 0;
+}
+.dhx_mini_calendar .dhx_year_week {
+ border-bottom: 1px solid #CECECE;
+ padding-top: 1px;
+}
+.dhx_mini_calendar .dhx_month_head {
+ padding-right: 0;
+ margin-right: 1px;
+ text-align: center;
+}
+.dhx_mini_calendar .dhx_cal_prev_button,
+.dhx_mini_calendar .dhx_cal_next_button {
+ border: 0;
+ height: 20px;
+}
+/* minicalendar end */
+.dhx_cal_navline div.dhx_minical_icon {
+ left: 210px;
+ top: 14px;
+ width: 30px;
+ height: 30px;
+ background: url(imgs_dhx_terrace/calendar.gif) no-repeat;
+ background-position: 3px 5px;
+}
+/* timeline */
+.dhx_cal_event_line .dhx_event_resize {
+ background: url(imgs_dhx_terrace/resize_dots.png) repeat-y;
+}
+.dhx_matrix_scell,
+.dhx_matrix_cell {
+ border-bottom: 1px solid #CECECE;
+ border-right: 1px solid #CECECE;
+}
+.dhx_cal_header div div {
+ border-left: 1px solid #CECECE;
+}
+.dhx_matrix_scell.folder {
+ border-right: 0;
+}
+.dhx_second_scale_bar {
+ border-bottom: 1px solid #CECECE;
+}
+/* timeline end */
+/* recurring */
+.dhx_repeat_divider {
+ border-left: 1px solid #CECECE;
+}
+.dhx_custom_button {
+ background-color: white;
+ border: 1px solid #CECECE;
+ color: #747473;
+}
+.dhx_cal_light_wide .dhx_custom_button {
+ margin-top: 6px;
+}
+.dhx_custom_button_recurring {
+ background-image: url(imgs_dhx_terrace/but_repeat.gif);
+}
+/* recurring end */
+/* agenda */
+.dhx_v_border,
+.dhx_agenda_line div {
+ border-right: 1px solid #CECECE;
+}
+/* agenda end */
+/* year */
+.dhx_year_month {
+ border: 1px solid #CECECE;
+}
+.dhx_scale_bar_last {
+ border-right: 1px solid #CECECE;
+}
+.dhx_year_body {
+ border-left: 1px solid #CECECE;
+}
+/* year end */
+/* expand */
+.dhx_expand_icon {
+ top: -3px;
+}
+/* expand end */
+/* units view */
+.dhx_scale_bar .dhx_cal_next_button,
+.dhx_scale_bar .dhx_cal_prev_button {
+ width: 20px;
+ height: 20px;
+ top: 0px !important;
+ border: 0;
+}
+.dhx_scale_bar .dhx_cal_next_button {
+ right: 1px !important;
+ border-left: 1px solid #CECECE;
+}
+.dhx_scale_bar .dhx_cal_prev_button {
+ left: 1px !important;
+ border-right: 1px solid #CECECE;
+}
+/* units view end */
+/* map view */
+.dhx_map_line .headline_date,
+.dhx_map_line .headline_description {
+ border: 0;
+}
+.dhx_map_line .headline_date {
+ border-right: 1px solid #CECECE;
+}
+/* map view end */
+/* tooltip start */
+.dhtmlXTooltip.tooltip {
+ border-left: 1px solid #CECECE;
+ border-top: 1px solid #CECECE;
+ color: #747473;
+ font-size: 12px;
+ line-height: 16px;
+}
+/* tooltip end */
+/* week agenda start */
+.dhx_wa_scale_bar {
+ border-top: 1px solid #CECECE;
+ border-bottom: 1px solid #CECECE;
+}
+.dhx_wa_column_last .dhx_wa_day_cont {
+ border-left: 1px solid #CECECE;
+}
+.dhx_wa_ev_body {
+ border-bottom: 1px solid #CECECE;
+}
+.dhx_wa_scale_bar {
+ background-color: #f0ede7;
+}
+.dhx_wa_ev_body.dhx_cal_event_selected {
+ background-color: #fff3a1;
+ color: #362d26;
+}
+.dhx_wa_dnd {
+ background-color: #fddb93 !important;
+ color: #747473 !important;
+ border: 1px solid #ccb177;
+}
+/* week agenda end */
+/* readonly start */
+.dhx_text_disabled {
+ color: #2E2E2E;
+}
+.dhx_cal_ltext .dhx_text_disabled {
+ line-height: 22px;
+}
+/* readonly end */
+/* grid view start */
+.dhx_grid_v_border {
+ border-right-color: #CECECE;
+}
+/* grid view end*/
+/* left border support */
+.dhx_scale_hour_border,
+.dhx_month_body_border,
+.dhx_scale_bar_border,
+.dhx_month_head_border {
+ border-left: 1px solid #CECECE;
+}
+.dhx_cal_quick_info {
+ background: rgba(50, 50, 50, 0.5);
+}
+.dhx_qi_big_icon {
+ background: #1796b0;
+ color: white;
+}
+/* export to PDF and iCal buttons start */
+.dhx_cal_navline .dhx_cal_export {
+ width: 32px;
+ height: 32px;
+ margin: 2px;
+ cursor: pointer;
+ top: 12px;
+}
+.dhx_cal_navline .dhx_cal_export.pdf {
+ left: auto;
+ right: 249px;
+ background-image: url('imgs_dhx_terrace/export_pdf.png');
+}
+.dhx_cal_navline .dhx_cal_export.ical {
+ left: auto;
+ right: 210px;
+ background-image: url('imgs_dhx_terrace/export_ical.png');
+}
+/* export to PDF and iCal buttons end */
+/* minicalendar */
+.dhx_mini_calendar {
+ padding: 5px;
+}
+.dhx_mini_calendar .dhx_year_event,
+.dhx_mini_calendar .dhx_calendar_click {
+ border-radius: 7px;
+}
+.dhx_mini_calendar .dhx_month_head {
+ margin: 2px 2px;
+}
+.dhx_mini_calendar .dhx_year_month {
+ line-height: 20px;
+ height: 25px;
+ font-size: 14px;
+}
+.dhx_mini_calendar .dhx_cal_prev_button {
+ top: 8px !important;
+}
+.dhx_mini_calendar .dhx_cal_next_button {
+ top: 8px !important;
+}
diff --git a/codebase/sources/skins/dhtmlxscheduler_classic.css b/codebase/sources/skins/dhtmlxscheduler_classic.css
new file mode 100644
index 0000000..e322e05
--- /dev/null
+++ b/codebase/sources/skins/dhtmlxscheduler_classic.css
@@ -0,0 +1,1560 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+.dhtmlx_message_area {
+ position: fixed;
+ right: 5px;
+ width: 250px;
+ z-index: 1000;
+}
+.dhtmlx-info {
+ min-width: 120px;
+ padding: 4px 4px 4px 20px;
+ font-family: Tahoma;
+ z-index: 10000;
+ overflow: hidden;
+ margin: 5px;
+ margin-bottom: 10px;
+ -webkit-transition: all .5s ease;
+ -moz-transition: all .5s ease;
+ -o-transition: all .5s ease;
+ transition: all .5s ease;
+}
+.dhtmlx-info.hidden {
+ height: 0px;
+ padding: 0px;
+ border-width: 0px;
+ margin: 0px;
+ overflow: hidden;
+}
+.dhtmlx_modal_box {
+ overflow: hidden;
+ display: inline-block;
+ min-width: 300px;
+ width: 300px;
+ text-align: center;
+ position: fixed;
+ background-color: #fff;
+ background: -webkit-linear-gradient(top, #ffffff 1%, #d0d0d0 99%);
+ background: -moz-linear-gradient(top, #ffffff 1%, #d0d0d0 99%);
+ box-shadow: 0px 0px 14px #888;
+ font-family: Tahoma;
+ z-index: 20000;
+ border-radius: 6px;
+ border: 1px solid #ffffff;
+}
+.dhtmlx_popup_title {
+ border-top-left-radius: 5px;
+ border-top-right-radius: 5px;
+ border-width: 0px;
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAoCAMAAAAIaGBFAAAAhFBMVEVwcHBubm5sbGxqampoaGhmZmZlZWVjY2NhYWFfX19dXV1bW1taWlpYWFhWVlZUVFRSUlJRUVFPT09NTU1LS0tJSUlHR0dGRkZERERCQkJAQEA+Pj49PT09PT0+Pj5AQEBBQUFDQ0NERERGRkZHR0dJSUlKSkpMTExMTEw5OTk5OTk5OTkny8YEAAAAQklEQVQImQXBCRJCAAAAwKVSQqdyjSPXNP7/QLsIhA6OTiJnF7GrRCpzc/fw9PKW+/gqlCq1RqvTG/yMJrPF6m/bAVEhAxxnHG0oAAAAAElFTkSuQmCC);
+ background-image: -webkit-linear-gradient(top, #707070 1%, #3d3d3d 70%, #4c4c4c 97%, #393939 97%);
+ background-image: -moz-linear-gradient(top, #707070 1%, #3d3d3d 70%, #4c4c4c 97%, #393939 97%);
+}
+.dhtmlx-info,
+.dhtmlx_popup_button,
+.dhtmlx_button {
+ user-select: none;
+ -webkit-user-select: none;
+ -moz-user-select: -moz-none;
+ cursor: pointer;
+}
+.dhtmlx_popup_text {
+ overflow: hidden;
+}
+.dhtmlx_popup_controls {
+ border-radius: 6px;
+ padding: 5px;
+}
+.dhtmlx_popup_button,
+.dhtmlx_button {
+ height: 30px;
+ line-height: 30px;
+ display: inline-block;
+ margin: 0 5px;
+ border-radius: 6px;
+ color: #FFF;
+}
+.dhtmlx_popup_button {
+ min-width: 120px;
+}
+div.dhx_modal_cover {
+ background-color: #000;
+ cursor: default;
+ filter: alpha(opacity=20);
+ opacity: 0.2;
+ position: fixed;
+ z-index: 19999;
+ left: 0px;
+ top: 0px;
+ width: 100%;
+ height: 100%;
+ border: none;
+ zoom: 1;
+}
+.dhtmlx-info img,
+.dhtmlx_modal_box img {
+ float: left;
+ margin-right: 20px;
+}
+.dhtmlx-alert-error .dhtmlx_popup_title,
+.dhtmlx-confirm-error .dhtmlx_popup_title {
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAsCAIAAAArRUU2AAAATklEQVR4nIWLuw2AMBBDjVuQiBT2oWbRDATrnB0KQOJoqPzRe3BrHI6dcBASYREKovtK6/6DsDOX+stN+3H1YX9ciRgnYq5EWYhS2dftBIuLT4JyIrPCAAAAAElFTkSuQmCC);
+}
+.dhtmlx-alert-error,
+.dhtmlx-confirm-error {
+ border: 1px solid #ff0000;
+}
+/*Skin section*/
+.dhtmlx_button,
+.dhtmlx_popup_button {
+ box-shadow: 0px 0px 4px #888;
+ border: 1px solid #838383;
+}
+.dhtmlx_button input,
+.dhtmlx_popup_button div {
+ border: 1px solid #FFF;
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAeCAMAAADaS4T1AAAAYFBMVEVwcHBtbW1ra2toaGhmZmZjY2NhYWFeXl5cXFxaWlpXV1dVVVVSUlJQUFBNTU1LS0tJSUlGRkZERERBQUE/Pz88PDw9PT0+Pj5AQEBCQkJDQ0NFRUVHR0dISEhKSkpMTEzqthaMAAAAMklEQVQImQXBhQ2AMAAAsOIMlwWH/8+kRSKVyRVKlVrQaHV6g9FktlhFm93hdLk9Xt8PIfgBvdUqyskAAAAASUVORK5CYII=);
+ background-image: -webkit-linear-gradient(top, #707070 1%, #3d3d3d 70%, #4c4c4c 99%);
+ background-image: -moz-linear-gradient(top, #707070 1%, #3d3d3d 70%, #4c4c4c 99%);
+ border-radius: 6px;
+ font-size: 15px;
+ font-weight: normal;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ color: #fff;
+ padding: 0px;
+ margin: 0px;
+ vertical-align: top;
+ height: 28px;
+ line-height: 28px;
+}
+.dhtmlx_button input:focus,
+.dhtmlx_button input:active,
+.dhtmlx_popup_button div:active,
+.dhtmlx_popup_button div:focus {
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAeCAMAAADaS4T1AAAAXVBMVEVwcHBubm5tbW1sbGxra2tpaWloaGhnZ2dmZmZlZWVjY2NiYmJhYWFgYGBfX19dXV1cXFxbW1taWlpZWVlXV1dWVlZVVVVUVFRTU1NRUVFQUFBPT09OTk5NTU1LS0tT9SY0AAAAMUlEQVQImQXBhQGAMAAAIGxnx2z9/00BiVQmVyhVakGj1ekNRpPZYhVtdofT5fZ4fT8hpwG05JjexgAAAABJRU5ErkJggg==);
+ background-image: -webkit-linear-gradient(top, #707070 1%, #4c4c4c 99%);
+ background-image: -moz-linear-gradient(top, #707070 1%, #4c4c4c 99%);
+}
+.dhtmlx_popup_title {
+ color: #fff;
+ text-shadow: 1px 1px #000;
+ height: 40px;
+ line-height: 40px;
+ font-size: 20px;
+}
+.dhtmlx_popup_text {
+ margin: 15px 15px 5px 15px;
+ font-size: 14px;
+ color: #000;
+ min-height: 30px;
+ border-radius: 6px;
+}
+.dhtmlx-info,
+.dhtmlx-error {
+ font-size: 14px;
+ color: #000;
+ box-shadow: 0px 0px 10px #888;
+ padding: 0px;
+ background-color: #FFF;
+ border-radius: 3px;
+ border: 1px solid #ffffff;
+}
+.dhtmlx-info div {
+ padding: 5px 10px 5px 10px;
+ background-color: #fff;
+ border-radius: 3px;
+ border: 1px solid #B8B8B8;
+}
+.dhtmlx-error {
+ background-color: #d81b1b;
+ border: 1px solid #ff3c3c;
+ box-shadow: 0px 0px 10px #000;
+}
+.dhtmlx-error div {
+ background-color: #d81b1b;
+ border: 1px solid #940000;
+ color: #FFF;
+}
+.dhx_cal_event .dhx_header,
+.dhx_cal_event .dhx_title,
+.dhx_cal_event .dhx_body,
+.dhx_cal_event .dhx_footer {
+ background-color: #FFE763;
+ border: 1px solid #B7A543;
+ color: #887A2E;
+ overflow: hidden;
+ width: 100%;
+ font-family: Tahoma;
+ font-size: 8pt;
+}
+.dhx_move_denied .dhx_cal_event .dhx_header,
+.dhx_move_denied .dhx_cal_event .dhx_title {
+ cursor: default;
+}
+.dhx_cal_event .dhx_header {
+ height: 1px;
+ margin-left: 1px;
+ border-width: 1px 1px 0px 1px;
+ cursor: pointer;
+}
+.dhx_cal_event .dhx_title {
+ height: 12px;
+ border-width: 0px 1px 1px 1px;
+ border-bottom-style: dotted;
+ font-size: 7pt;
+ font-weight: bold;
+ text-align: center;
+ background-position: right;
+ background-repeat: no-repeat;
+ cursor: pointer;
+}
+.dhx_cal_event .dhx_body,
+.dhx_cal_event.dhx_cal_select_menu .dhx_body {
+ border-width: 0 1px 1px 1px;
+ padding: 5px;
+}
+.dhx_cal_event.dhx_cal_select_menu {
+ -webkit-box-shadow: 0 0 1px #FFF;
+ -moz-box-shadow: 0 0 1px #FFF;
+ box-shadow: 0 0 1px #FFF;
+}
+.dhx_resize_denied,
+.dhx_resize_denied .dhx_event_resize {
+ cursor: default !important;
+}
+.dhx_cal_event .dhx_event_resize {
+ cursor: s-resize;
+}
+.dhx_cal_event .dhx_footer,
+.dhx_cal_event .dhx_select_menu_footer {
+ height: 1px;
+ margin-left: 2px;
+ border-width: 0px 1px 1px 1px;
+ position: relative;
+}
+.dhx_cal_event_line {
+ background-color: #FFE763;
+ border: 1px solid #B7A543;
+ border-radius: 3px;
+ font-family: Tahoma;
+ font-size: 8pt;
+ height: 13px;
+ padding-left: 10px;
+ color: #887A2E;
+ cursor: pointer;
+ overflow: hidden;
+}
+.dhx_cal_event_clear {
+ font-family: Tahoma;
+ font-size: 8pt;
+ height: 13px;
+ padding-left: 2px;
+ color: #887A2E;
+ white-space: nowrap;
+ overflow: hidden;
+ cursor: pointer;
+}
+.dhx_in_move {
+ background-color: #FFFF80;
+}
+.dhx_cal_event.dhx_cal_editor {
+ border: 1px solid #B7A543;
+ border-top-style: dotted;
+ z-index: 999;
+ position: absolute;
+ overflow: hidden;
+}
+textarea.dhx_cal_editor {
+ width: 100%;
+ height: 100%;
+ border: 0 solid black;
+ margin: 0;
+ padding: 0;
+ overflow: auto;
+}
+div.dhx_menu_head {
+ background-image: url(imgs/controls.gif);
+ background-position: 0px -43px;
+ width: 10px;
+ height: 10px;
+ margin-left: 5px;
+ margin-top: 1px;
+ border: none;
+ cursor: default;
+}
+div.dhx_menu_icon {
+ background-image: url(imgs/controls.gif);
+ width: 20px;
+ height: 20px;
+ margin-left: -5px;
+ margin-top: 0px;
+ border: none;
+ cursor: pointer;
+}
+div.icon_details {
+ background-position: 0px 0px;
+}
+div.icon_edit {
+ background-position: -22px 0px;
+}
+div.icon_save {
+ background-position: -84px -1px;
+}
+div.icon_cancel {
+ background-position: -62px 0px;
+}
+div.icon_delete {
+ background-position: -42px 0px;
+}
+/*view more link in month view*/
+.dhx_month_link {
+ position: absolute;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ text-align: right;
+ cursor: pointer;
+ padding-right: 10px;
+}
+.dhx_month_link a {
+ color: blue;
+}
+.dhx_month_link a:hover {
+ text-decoration: underline;
+}
+.dhx_global_tip {
+ font-family: Tahoma, Helvetica;
+ text-align: center;
+ font-size: 20px;
+ position: fixed;
+ top: 60px;
+ right: 20px;
+ background-color: rgba(255, 255, 255, 0.7);
+ color: #000;
+ z-index: 10000;
+ padding: 20px 30px;
+ width: 190px;
+}
+.dhx_global_tip div {
+ font-size: 30px;
+}
+@media (-moz-touch-enabled) {
+ .dhx_cal_container {
+ user-select: none;
+ -moz-user-select: none;
+ }
+}
+.dhx_unselectable,
+.dhx_unselectable div {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.dhx_cal_light {
+ -webkit-tap-highlight-color: transparent;
+ background-color: #FFE763;
+ border-radius: 5px;
+ font-family: Tahoma;
+ font-size: 8pt;
+ border: 1px solid #B7A64B;
+ color: #887A2E;
+ position: absolute;
+ z-index: 10001;
+ width: 580px;
+ height: 300px;
+ box-shadow: 5px 5px 5px #888;
+}
+.dhx_cal_light_wide {
+ width: 650px;
+}
+.dhx_mark {
+ position: relative;
+ top: 3px;
+ background-image: url('imgs/controls.gif');
+ background-position: 0px -43px;
+ padding-left: 10px;
+}
+.dhx_ie6 .dhx_mark {
+ background-position: 6px -41px;
+}
+.dhx_cal_light select {
+ font-family: Tahoma;
+ font-size: 8pt;
+ color: #887A2E;
+ padding: 2px;
+ margin: 0px;
+}
+.dhx_cal_ltitle {
+ padding: 2px 0px 2px 5px;
+ overflow: hidden;
+ white-space: nowrap;
+}
+.dhx_cal_ltitle span {
+ white-space: nowrap;
+}
+.dhx_cal_lsection {
+ background-color: #DBCF8C;
+ color: #FFF4B5;
+ font-weight: bold;
+ padding: 5px 0px 3px 10px;
+}
+.dhx_section_time {
+ background-color: #DBCF8C;
+ white-space: nowrap;
+}
+.dhx_cal_lsection .dhx_fullday {
+ float: right;
+ margin-right: 5px;
+ color: #887A2E;
+ font-size: 12px;
+ font-weight: normal;
+ line-height: 20px;
+ vertical-align: top;
+ cursor: pointer;
+}
+.dhx_cal_lsection {
+ font-size: 18px;
+ font-family: Arial;
+}
+.dhx_cal_ltext {
+ padding: 2px 0px 2px 10px;
+ overflow: hidden;
+}
+.dhx_cal_ltext textarea {
+ background-color: #FFF4B5;
+ /* #FFF4B5; should be the same for dhx_cal_larea, was transperent */
+ overflow: auto;
+ border: none;
+ color: #887A2E;
+ height: 100%;
+ width: 100%;
+ outline: none !important;
+ resize: none;
+}
+.dhx_time {
+ font-weight: bold;
+}
+.dhx_cal_light .dhx_title {
+ padding-left: 10px;
+}
+.dhx_cal_larea {
+ border: 1px solid #DCC43E;
+ background-color: #FFF4B5;
+ overflow: hidden;
+ margin-left: 3px;
+ width: 572px;
+ height: 1px;
+}
+.dhx_btn_set {
+ padding: 5px 10px 0px 10px;
+ float: left;
+}
+.dhx_btn_set div {
+ float: left;
+ height: 21px;
+ line-height: 21px;
+ vertical-align: middle;
+ cursor: pointer;
+}
+.dhx_save_btn {
+ background-image: url('imgs/controls.gif');
+ background-position: -84px 0px;
+ width: 21px;
+}
+.dhx_cancel_btn {
+ background-image: url('imgs/controls.gif');
+ background-position: -63px 0px;
+ width: 20px;
+}
+.dhx_delete_btn {
+ background-image: url('imgs/controls.gif');
+ background-position: -42px 0px;
+ width: 20px;
+}
+.dhx_cal_cover {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ z-index: 10000;
+ top: 0px;
+ left: 0px;
+ background-color: black;
+ opacity: 0.1;
+ filter: alpha(opacity=10);
+}
+.dhx_custom_button {
+ padding: 0px 3px 0px 3px;
+ color: #887A2E;
+ font-family: Tahoma;
+ font-size: 8pt;
+ background-color: #FFE763;
+ font-weight: normal;
+ margin-right: 5px;
+ margin-top: 0px;
+ cursor: pointer;
+}
+.dhx_custom_button div {
+ cursor: pointer;
+ float: left;
+ height: 21px;
+ line-height: 21px;
+ vertical-align: middle;
+}
+.dhx_cal_light_wide .dhx_cal_larea {
+ border-top-width: 0px;
+}
+.dhx_cal_light_wide .dhx_cal_lsection {
+ border: 0px;
+ float: left;
+ text-align: right;
+ width: 100px;
+ height: 20px;
+ font-size: 16px;
+ padding: 5px 0px 0px 10px;
+}
+.dhx_cal_light_wide .dhx_wrap_section {
+ border-top: 1px solid #DBCF8C;
+ position: relative;
+ background-color: #DBCF8C;
+ overflow: hidden;
+}
+.dhx_cal_light_wide .dhx_section_time {
+ padding-top: 2px !important;
+ height: 20px !important;
+}
+.dhx_section_time {
+ text-align: center;
+}
+.dhx_cal_light_wide .dhx_cal_larea {
+ width: 730px;
+}
+.dhx_cal_light_wide {
+ width: 738px;
+}
+.dhx_cal_light_wide .dhx_section_time {
+ background: transparent;
+}
+.dhx_cal_light_wide .dhx_cal_checkbox label {
+ padding-left: 0px;
+}
+.dhx_cal_wide_checkbox input {
+ margin-top: 8px;
+ margin-left: 14px;
+}
+.dhx_cal_light input {
+ font-family: Tahoma;
+ font-size: 8pt;
+ color: #887A2E;
+}
+.dhx_cal_light_wide .dhx_cal_lsection .dhx_fullday {
+ float: none;
+ margin-right: 0px;
+ color: #FFF4B5;
+ font-weight: bold;
+ font-size: 16px;
+ font-family: Arial;
+ cursor: pointer;
+}
+.dhx_custom_button {
+ float: right;
+ height: 21px;
+ width: 90px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ -ms-border-radius: 4px;
+ -o-border-radius: 4px;
+ border-radius: 4px;
+}
+.dhx_cal_light_wide .dhx_custom_button {
+ position: absolute;
+ top: 0;
+ right: 0;
+ margin-top: 2px;
+}
+.dhx_cal_light_wide .dhx_repeat_right {
+ margin-right: 55px;
+}
+.dhx_minical_popup {
+ position: absolute;
+ z-index: 10100;
+ width: 251px;
+ height: 175px;
+}
+.dhx_scale_bar_header {
+ position: absolute;
+ border-bottom: 1px dotted #8894A3;
+ width: 100%;
+}
+.dhx_expand_icon {
+ position: absolute;
+ top: 0px;
+ right: 0px;
+ background-image: url(imgs/collapse_expand_icon.gif);
+ width: 18px;
+ height: 18px;
+ cursor: pointer;
+ background-position: 0px 18px;
+ z-index: 16;
+}
+.dhx_scheduler_agenda .dhx_cal_data {
+ background-image: url(imgs/databg.png);
+}
+.dhx_agenda_area {
+ width: 100%;
+ overflow-y: auto;
+ background-image: url(imgs/databg.png);
+}
+.dhx_agenda_line {
+ height: 21px;
+ clear: both;
+ overflow: hidden;
+}
+.dhx_agenda_line div {
+ float: left;
+ width: 188px;
+ border-right: 1px dotted #8894A3;
+ text-align: center;
+ line-height: 21px;
+ overflow: hidden;
+}
+.dhx_agenda_area .dhx_agenda_line div {
+ border-right: 0px dotted #8894A3;
+}
+.dhx_v_border {
+ position: absolute;
+ left: 187px;
+ top: 0;
+ border-right: 1px dotted #8894A3;
+ width: 1px;
+ height: 100%;
+}
+.dhx_agenda_line .dhx_event_icon {
+ width: 20px;
+ border-width: 0px;
+ background: url(imgs/icon.png) no-repeat;
+ background-position: 5px 4px;
+ cursor: pointer;
+}
+.dhx_agenda_line span {
+ padding-left: 5px;
+ line-height: 21px;
+}
+.dhx_year_body {
+ border-left: 1px dotted #586A7E;
+}
+.dhx_year_week {
+ position: relative;
+}
+.dhx_scale_bar_last {
+ border-right: 1px dotted #586A7E;
+}
+.dhx_year_month {
+ height: 18px;
+ padding-top: 3px;
+ border: 1px dotted #586A7E;
+ text-align: center;
+ vertical-align: middle;
+}
+.dhx_year_body .dhx_before .dhx_month_head,
+.dhx_year_body .dhx_after .dhx_month_head,
+.dhx_year_body .dhx_before .dhx_month_head a,
+.dhx_year_body .dhx_after .dhx_month_head a {
+ color: #E2E3E6 !important;
+}
+.dhx_year_body .dhx_month_body {
+ height: 0px;
+ overflow: hidden;
+}
+.dhx_month_head.dhx_year_event {
+ background-color: #FFE763;
+}
+.dhx_year_body .dhx_before .dhx_month_head,
+.dhx_year_body .dhx_after .dhx_month_head {
+ cursor: default;
+}
+.dhx_year_tooltip {
+ border: 1px solid #BBBBBB;
+ background-image: url(imgs/databg.png);
+ position: absolute;
+ z-index: 9998;
+ width: 300px;
+ height: auto;
+ font-family: Tahoma;
+ font-size: 8pt;
+ overflow: hidden;
+}
+.dhx_tooltip_line {
+ line-height: 20px;
+ height: 20px;
+ overflow: hidden;
+}
+.dhx_tooltip_line .dhx_event_icon {
+ width: 20px;
+ height: 20px;
+ padding-right: 10px;
+ float: left;
+ border-width: 0px;
+ position: relative;
+ background: url(imgs/icon.png) no-repeat;
+ background-position: 5px 4px;
+ cursor: pointer;
+}
+.dhx_tooltip_date {
+ float: left;
+ width: auto;
+ padding-left: 5px;
+ text-align: center;
+}
+.dhx_text_disabled {
+ color: #887A2E;
+ font-family: Tahoma;
+ font-size: 8pt;
+}
+.dhx_mini_calendar {
+ -moz-box-shadow: 5px 5px 5px #888;
+ /*Doesn't work in IE*/
+ -khtml-box-shadow: 5px 5px 5px #888;
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ -user-select: none;
+}
+.dhx_mini_calendar .dhx_month_head {
+ cursor: pointer;
+}
+.dhx_mini_calendar .dhx_calendar_click {
+ background-color: #C2D5FC;
+}
+.dhx_cal_navline div.dhx_minical_icon {
+ width: 18px;
+ height: 18px;
+ left: 190px;
+ top: 1px;
+ cursor: pointer;
+ background-image: url(imgs/calendar.gif);
+}
+.dhx_matrix_scell {
+ height: 100%;
+}
+.dhx_matrix_cell,
+.dhx_matrix_scell {
+ overflow: hidden;
+ text-align: center;
+ vertical-align: middle;
+ border-bottom: 1px dotted #8894A3;
+ border-right: 1px dotted #8894A3;
+}
+.dhx_matrix_cell {
+ background-color: white;
+}
+.dhx_matrix_line {
+ overflow: hidden;
+}
+.dhx_matrix_cell div,
+.dhx_matrix_scell div {
+ overflow: hidden;
+ text-align: center;
+ height: auto;
+}
+.dhx_cal_lsection .dhx_readonly {
+ font-size: 9pt;
+ font-size: 8pt;
+ padding: 2px;
+ color: #887A2E;
+}
+.dhx_cal_event_line .dhx_event_resize {
+ cursor: w-resize;
+ background: url(imgs/resize_dots.png) repeat-y;
+ position: absolute;
+ top: 0;
+ width: 4px;
+ height: 100%;
+}
+.dhx_event_resize_start {
+ left: 0;
+}
+.dhx_event_resize_end {
+ right: 0;
+}
+/* Tree view */
+.dhx_matrix_scell.folder,
+.dhx_data_table.folder .dhx_matrix_cell {
+ background-color: #969394;
+ cursor: pointer;
+}
+.dhx_matrix_scell .dhx_scell_level0 {
+ padding-left: 5px;
+}
+.dhx_matrix_scell .dhx_scell_level1 {
+ padding-left: 20px;
+}
+.dhx_matrix_scell .dhx_scell_level2 {
+ padding-left: 35px;
+}
+.dhx_matrix_scell .dhx_scell_level3 {
+ padding-left: 50px;
+}
+.dhx_matrix_scell .dhx_scell_level4 {
+ padding-left: 65px;
+}
+.dhx_matrix_scell.folder {
+ font-weight: bold;
+ text-align: left;
+}
+.dhx_matrix_scell.folder .dhx_scell_expand {
+ float: left;
+ width: 10px;
+ padding-right: 3px;
+}
+.dhx_matrix_scell.folder .dhx_scell_name {
+ float: left;
+ width: auto;
+}
+.dhx_matrix_scell.item .dhx_scell_name {
+ padding-left: 15px;
+ text-align: left;
+}
+.dhx_data_table.folder .dhx_matrix_cell {
+ border-right: 0;
+}
+.dhx_section_timeline {
+ overflow: hidden;
+ padding: 4px 0 2px 10px;
+}
+.dhx_section_timeline select {
+ width: 552px;
+}
+/* Tree view end*/
+/* Map view */
+.dhx_map_area {
+ width: 100%;
+ height: 100%;
+ overflow-y: auto;
+ overflow-x: hidden;
+ background-image: url(imgs/databg.png);
+}
+.dhx_map_line .dhx_event_icon {
+ width: 20px;
+ border-width: 0px;
+ background: url(imgs/icon.png) no-repeat;
+ background-position: 5px 4px;
+ cursor: pointer;
+}
+.dhx_map_line {
+ height: 21px;
+ clear: both;
+ overflow: hidden;
+}
+.dhx_map {
+ position: absolute;
+}
+.dhx_map_line div {
+ float: left;
+ border-right: 1px dotted #8894A3;
+ text-align: center;
+ line-height: 21px;
+ overflow: hidden;
+}
+.dhx_map_line .headline_description {
+ float: left;
+ border-right: 1px dotted #8894A3;
+ text-align: center;
+ line-height: 21px;
+ overflow: hidden;
+}
+.dhx_map_line .dhx_map_description {
+ float: left;
+ border-right: 0 dotted #8894A3;
+ text-align: center;
+ line-height: 21px;
+ overflow: hidden;
+}
+.dhx_map_line .headline_date,
+.dhx_map_line .headline_description {
+ border-left: 0;
+}
+.dhx_map_line .line_description {
+ float: left;
+ border-right: 1px dotted #8894A3;
+ text-align: left;
+ padding-left: 5px;
+ line-height: 21px;
+ overflow: hidden;
+}
+.dhx_map_line.highlight {
+ background-color: #C4C5CC;
+}
+.dhx_map_area .dhx_map_line div {
+ border-right: 0px dotted #8894A3;
+}
+/* Map view end */
+/* dhtmlXTooltip start */
+.dhtmlXTooltip.tooltip {
+ -moz-box-shadow: 3px 3px 3px #888888;
+ -webkit-box-shadow: 3px 3px 3px #888888;
+ -o-box-shadow: 3px 3px 3px #888888;
+ box-shadow: 3px 3px 3px #888888;
+ filter: progid:DXImageTransform.Microsoft.Shadow(color='#888888', Direction=135, Strength=5);
+ background-color: white;
+ border-left: 1px dotted #887A2E;
+ border-top: 1px dotted #887A2E;
+ color: #887A2E;
+ cursor: default;
+ padding: 10px;
+ position: absolute;
+ z-index: 500;
+ font-family: Tahoma;
+ font-size: 8pt;
+ opacity: 1;
+}
+/* dhtmlXTooltip end */
+/* Lightbox checkbox section */
+.dhx_cal_checkbox label {
+ padding-left: 5px;
+}
+/* Lightbox checkbox section end */
+/* Lightbox radiobuttons section */
+.dhx_cal_light .radio {
+ padding: 2px 0px 2px 10px;
+}
+.dhx_cal_light .radio input,
+.dhx_cal_light .radio label {
+ line-height: 15px;
+}
+.dhx_cal_light .radio input {
+ vertical-align: middle;
+ margin: 0px;
+ padding: 0px;
+}
+.dhx_cal_light .radio label {
+ vertical-align: middle;
+ padding-right: 10px;
+}
+/* Lightbox radiobuttons section end */
+/* Lightbox dhtmlx combo section */
+.dhx_cal_light .combo {
+ padding: 4px;
+}
+.dhx_cal_light_wide .dhx_combo_box {
+ width: 608px !important;
+ left: 10px;
+}
+/* Lightbox dhtmlx combo section end */
+/* Agenda week start */
+.dhx_wa_column {
+ float: left;
+}
+.dhx_wa_column_last .dhx_wa_day_cont {
+ border-left: 1px dotted #8894A3;
+}
+.dhx_wa_scale_bar {
+ font-family: Tahoma;
+ padding-left: 10px;
+ font-size: 11px;
+ border-top: 1px dotted #8894A3;
+ border-bottom: 1px dotted #8894A3;
+}
+.dhx_wa_day_data {
+ background-color: #FCFEFC;
+ overflow-y: auto;
+}
+.dhx_wa_ev_body {
+ border-bottom: 1px dotted #778899;
+ font-size: 12px;
+ padding: 5px 0 5px 7px;
+}
+.dhx_wa_dnd {
+ font-family: Tahoma;
+ position: absolute;
+ padding-right: 7px;
+ color: #887AE2 !important;
+ background-color: #FFE763 !important;
+ border: 1px solid #B7A543;
+}
+.dhx_cal_event_selected {
+ background-color: #9cc1db;
+ color: white;
+}
+/* Agenda week end */
+/* timeline second scale start */
+.dhx_second_scale_bar {
+ border-bottom: 1px dotted #586A7E;
+ padding-top: 2px;
+}
+/* timeline second scale end */
+/* grid view */
+.dhx_cal_header div div {
+ border-left: 1px dotted #8894A3;
+}
+.dhx_grid_area {
+ width: 100%;
+ height: 100%;
+ overflow-y: auto;
+ background-color: #FCFEFC;
+}
+.dhx_grid_area table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ width: 100%;
+ table-layout: fixed;
+}
+.dhx_grid_area td {
+ table-layout: fixed;
+ text-align: center;
+}
+.dhx_grid_line {
+ height: 21px;
+ clear: both;
+ overflow: hidden;
+}
+.dhx_grid_line div {
+ float: left;
+ cursor: default;
+ padding-top: 0;
+ padding-bottom: 0;
+ text-align: center;
+ line-height: 21px;
+ overflow: hidden;
+}
+.dhx_grid_area td,
+.dhx_grid_line div {
+ padding-left: 8px;
+ padding-right: 8px;
+}
+.dhx_grid_area tr.dhx_grid_event {
+ height: 21px;
+ overflow: hidden;
+ margin: 0 0 1px 0;
+}
+.dhx_grid_area tr.dhx_grid_event td {
+ /*borders for old ies*/
+ border-bottom: 1px solid #ECEEF4;
+}
+.dhx_grid_area tr.dhx_grid_event:nth-child(2n+1) td,
+.dhx_grid_area tr.dhx_grid_event:nth-child(2n) td {
+ border-bottom-width: 0px;
+ border-bottom-style: none;
+}
+.dhx_grid_area tr.dhx_grid_event:nth-child(2n) {
+ background-color: #ECEEF4;
+}
+.dhx_grid_area .dhx_grid_dummy {
+ table-layout: auto;
+ margin: 0 !important;
+ padding: 0 !important;
+}
+.dhx_grid_v_border {
+ position: absolute;
+ border-right: 1px solid #A4BED4;
+ width: 1px;
+ height: 100%;
+}
+.dhx_grid_event_selected {
+ background-color: #9cc1db !important;
+ color: white !important;
+}
+.dhx_grid_sort_desc .dhx_grid_view_sort {
+ background-position: 0 -55px;
+}
+.dhx_grid_sort_asc .dhx_grid_view_sort {
+ background-position: 0 -66px;
+}
+.dhx_grid_view_sort {
+ width: 10px;
+ height: 10px;
+ position: absolute;
+ border: none !important;
+ top: 5px;
+ background-repeat: no-repeat;
+ background-image: url(imgs/images.png);
+}
+/* end grid */
+/* marked timespans */
+.dhx_marked_timespan {
+ position: absolute;
+ width: 100%;
+}
+.dhx_time_block {
+ position: absolute;
+ width: 100%;
+ background: silver;
+ opacity: 0.4;
+ filter: alpha(opacity=40);
+ z-index: 1;
+}
+.dhx_time_block_reset {
+ opacity: 1;
+ filter: alpha(opacity=100);
+}
+.dhx_scheduler_month .dhx_marked_timespan {
+ display: none;
+}
+.dhx_mini_calendar .dhx_marked_timespan {
+ display: none;
+}
+/* now time */
+.dhx_now_time {
+ width: 100%;
+ border-bottom: 2px solid red;
+ z-index: 1;
+}
+.dhx_scheduler_month .dhx_now_time {
+ border-bottom: 0;
+ border-left: 2px solid red;
+}
+.dhx_matrix_now_time {
+ border-left: 2px solid red;
+ z-index: 1;
+}
+.dhx_now_time,
+.dhx_matrix_now_time {
+ opacity: 0.5;
+}
+/* Quick info */
+.dhx_cal_quick_info {
+ border: 2px solid #888;
+ border-radius: 5px;
+ position: absolute;
+ z-index: 300;
+ background-color: #8e99ae;
+ background-color: rgba(98, 107, 127, 0.5);
+ padding-left: 7px;
+ width: 300px;
+ transition: left 0.5s ease, right 0.5s;
+ -moz-transition: left 0.5s ease, right 0.5s;
+ -webkit-transition: left 0.5s ease, right 0.5s;
+ -o-transition: left 0.5s ease, right 0.5s;
+}
+.dhx_no_animate {
+ transition: none;
+ -moz-transition: none;
+ -webkit-transition: none;
+ -o-transition: none;
+}
+.dhx_cal_quick_info.dhx_qi_left .dhx_qi_big_icon {
+ float: right;
+}
+.dhx_cal_qi_title {
+ padding: 5px 0px 10px 5px;
+ color: #FFF;
+ letter-spacing: 1px;
+}
+.dhx_cal_qi_tdate {
+ font-size: 14px;
+}
+.dhx_cal_qi_tcontent {
+ font-size: 18px;
+ font-weight: bold;
+}
+.dhx_cal_qi_content {
+ border: 1px solid #888;
+ background-color: #fefefe;
+ padding: 16px 8px;
+ font-size: 14px;
+ color: #444;
+ width: 275px;
+ overflow: hidden;
+}
+.dhx_qi_big_icon {
+ border-radius: 3px;
+ color: #444;
+ margin: 5px 9px 5px 0px;
+ min-width: 60px;
+ line-height: 20px;
+ vertical-align: middle;
+ padding: 5px 10px 5px 5px;
+ cursor: pointer;
+ background-color: #fefefe;
+ border-bottom: 1px solid #666;
+ border-right: 1px solid #666;
+ float: left;
+}
+.dhx_cal_qi_controls div {
+ float: left;
+ height: 20px;
+ text-align: center;
+ line-height: 20px;
+}
+.dhx_qi_big_icon .dhx_menu_icon {
+ margin: 0 8px 0 0px;
+}
+.dhx_drag_marker {
+ width: 100%;
+ filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
+ opacity: 0.5;
+ background-color: #FFE763;
+ position: absolute;
+ box-sizing: border-box !important;
+ border-top: 1px solid #B6B6B6;
+ border-bottom: 1px solid #b6b6b6;
+}
+/* bootstrap CSS fix start */
+.dhx_cal_navline div,
+.dhx_cal_header,
+.dhx_cal_header div,
+.dhx_cal_data div,
+.dhx_cal_light,
+.dhx_cal_light div {
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+.dhx_cal_light .dhx_cal_radio label {
+ margin-bottom: 0;
+}
+.dhx_cal_event div {
+ line-height: normal;
+}
+/* bootstrap CSS fix end */
+.dhx_cal_container {
+ background-color: #C2D5FC;
+ font-family: Tahoma;
+ font-size: 8pt;
+ position: relative;
+ overflow: hidden;
+}
+.dhx_cal_container div {
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.dhx_cal_navline {
+ height: 20px;
+ position: absolute;
+ z-index: 3;
+ width: 750px;
+ color: #2F3A48;
+}
+.dhx_cal_navline div {
+ position: absolute;
+ top: 2px;
+ white-space: nowrap;
+}
+.dhx_cal_navline .dhx_cal_date {
+ font-weight: 600;
+ left: 210px;
+ padding-top: 1px;
+}
+.dhx_cal_button .dhx_left_bg {
+ width: 1px;
+ overflow: hidden;
+ height: 17px;
+ z-index: 20;
+ top: 0px;
+}
+.dhx_cal_prev_button {
+ background-image: url(imgs/buttons.png);
+ background-position: 0px 0px;
+ width: 29px;
+ height: 17px;
+ left: 50px;
+ cursor: pointer;
+}
+.dhx_cal_next_button {
+ background-image: url(imgs/buttons.png);
+ background-position: -30px 0px;
+ width: 29px;
+ height: 17px;
+ left: 80px;
+ cursor: pointer;
+}
+.dhx_cal_today_button {
+ background-image: url(imgs/buttons.png);
+ background-position: -60px 0px;
+ width: 75px;
+ height: 17px;
+ left: 112px;
+ cursor: pointer;
+ text-align: center;
+ text-decoration: underline;
+}
+.dhx_cal_tab {
+ width: 59px;
+ height: 19px;
+ text-align: center;
+ text-decoration: underline;
+ padding-top: 2px;
+ cursor: pointer;
+ background-color: #D8E1EA;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ -moz-border-radius-topleft: 4px;
+ -moz-border-radius-topright: 4px;
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+}
+.dhx_cal_tab.active {
+ text-decoration: none;
+ cursor: default;
+ font-weight: bold;
+ border: 1px dotted #586A7E;
+ border-bottom: 0;
+ background-color: #C2D5FC;
+}
+.dhx_cal_header {
+ position: absolute;
+ left: 10px;
+ top: 23px;
+ width: 750px;
+ border-top: 1px dotted #8894A3;
+ border-right: 1px dotted #8894A3;
+ z-index: 2;
+ overflow: hidden;
+ color: #2F3A48;
+}
+.dhx_cal_data {
+ -webkit-tap-highlight-color: transparent;
+ border-top: 1px dotted #8894A3;
+ position: absolute;
+ top: 44px;
+ width: 600px;
+ overflow-y: auto;
+ overflow-x: hidden;
+ -webkit-overflow-scrolling: touch;
+}
+.dhx_cal_data {
+ -ms-touch-action: pan-y;
+}
+.dhx_cal_event,
+.dhx_cal_event_line,
+.dhx_cal_event_clear {
+ -ms-touch-action: none;
+}
+.dhx_scale_bar {
+ position: absolute;
+ text-align: center;
+ background-color: #C2D5FC;
+ padding-top: 3px;
+ border-left: 1px dotted #586A7E;
+}
+.dhx_scale_holder {
+ position: absolute;
+ border-right: 1px dotted #586A7E;
+ background-image: url(imgs/databg.png);
+}
+.dhx_scale_holder_now {
+ position: absolute;
+ border-right: 1px dotted #586A7E;
+ background-image: url(imgs/databg_now.png);
+}
+.dhx_scale_hour {
+ height: 41px;
+ width: 50px;
+ border-bottom: 1px dotted #8894A3;
+ background-color: #C2D5FC;
+ text-align: center;
+ line-height: 40px;
+ color: #586A7E;
+ overflow: hidden;
+}
+.dhx_month_head {
+ background-color: #EBEFF4;
+ color: #2F3A48;
+ height: 18px;
+ padding-right: 5px;
+ padding-top: 3px;
+ text-align: right;
+ border-right: 1px dotted #586A7E;
+}
+.dhx_month_body {
+ border-right: 1px dotted #586A7E;
+ border-bottom: 1px dotted #586A7E;
+ background-color: #FFFFFF;
+}
+.dhx_now .dhx_month_body {
+ background-color: #E2EDFF;
+}
+.dhx_after .dhx_month_body,
+.dhx_before .dhx_month_body {
+ background-color: #ECECEC;
+}
+.dhx_after .dhx_month_head,
+.dhx_before .dhx_month_head {
+ background-color: #E2E3E6;
+ color: #94A6BB;
+}
+.dhx_now .dhx_month_head {
+ background-color: #D1DEF4;
+ font-weight: bold;
+}
+.dhx_scale_ignore {
+ display: none;
+}
+.dhx_cal_drag {
+ position: absolute;
+ z-index: 9999;
+ background-color: #FFE763;
+ border: 1px solid #B7A543;
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+}
+.dhx_loading {
+ position: absolute;
+ width: 128px;
+ height: 15px;
+ background-image: url(imgs/loading.gif);
+ z-index: 9999;
+}
+.dhx_multi_day_icon,
+.dhx_multi_day {
+ background-color: #E1E6FF;
+ background-repeat: no-repeat;
+ border-right: 1px dotted #8894A3;
+}
+.dhx_multi_day {
+ position: absolute;
+ border-top: 1px dotted #8894A3;
+}
+.dhx_multi_day_icon,
+.dhx_multi_day_icon_small {
+ background-position: center center;
+ background-color: #E1E6FF;
+ background-repeat: no-repeat;
+ border-bottom: 1px dotted #8894A3;
+ border-right: 1px dotted #8894A3;
+}
+.dhx_multi_day_icon {
+ background-image: url(imgs/clock_big.gif);
+}
+.dhx_multi_day_icon_small {
+ background-image: url(imgs/clock_small.gif);
+}
+.dhtmlxLayoutPolyContainer_dhx_skyblue .dhx_cal_container {
+ background-color: #d0e5ff;
+}
+/* left border config option support */
+.dhx_scale_hour_border,
+.dhx_month_body_border,
+.dhx_scale_bar_border,
+.dhx_month_head_border {
+ border-left: 1px dotted #8894A3;
+}
+/* export to PDF and iCal buttons start */
+.dhx_cal_navline .dhx_cal_export {
+ width: 18px;
+ height: 18px;
+ margin: 2px;
+ cursor: pointer;
+ top: 0px;
+}
+.dhx_cal_navline .dhx_cal_export.pdf {
+ left: 2px;
+ background-image: url('imgs/export_pdf.png');
+}
+.dhx_cal_navline .dhx_cal_export.ical {
+ left: 24px;
+ background-image: url('imgs/export_ical.png');
+}
+/* export to PDF and iCal buttons end */
+/*All*/
+.dhx_form_repeat,
+.dhx_form_repeat input {
+ padding: 0;
+ margin: 0;
+ padding-left: 5px;
+ font-family: Tahoma, Verdana;
+ font-size: 11px;
+ line-height: 24px;
+}
+.dhx_form_repeat {
+ overflow: hidden;
+ /*height:115px;*/
+ height: 0px;
+ background-color: #FFF4B5;
+ /*border: 1px solid #DCC43E;*/
+}
+.dhx_cal_light_wide .dhx_form_repeat {
+ background-color: transparent;
+}
+.dhx_repeat_center,
+.dhx_repeat_left {
+ height: 115px;
+ padding: 10px 0 10px 10px;
+ float: left;
+}
+.dhx_repeat_left {
+ width: 95px;
+}
+.dhx_repeat_center {
+ width: 335px;
+ margin-top: 12px;
+}
+.dhx_repeat_divider {
+ float: left;
+ height: 115px;
+ border-left: 1px dotted #DCC43E;
+ /*background-color: #DCC43E;*/
+ width: 1px;
+}
+.dhx_repeat_right {
+ float: right;
+ height: 115px;
+ width: 160px;
+ padding: 10px 3px 10px 10px;
+ margin-top: 7px;
+}
+input.dhx_repeat_text {
+ height: 16px;
+ width: 27px;
+ margin: 0 4px 0 4px;
+ line-height: 18px;
+ padding: 0 0 0 2px;
+}
+.dhx_form_repeat select {
+ height: 20px;
+ width: 87px;
+ padding: 0 0 0 2px;
+ margin: 0 4px 0 4px;
+}
+input.dhx_repeat_date {
+ height: 18px;
+ width: 80px;
+ padding: 0 0 0 2px;
+ margin: 0 4px 0 4px;
+ background-repeat: no-repeat;
+ background-position: 64px 0;
+ border: 1px #7f9db9 solid;
+ line-height: 18px;
+}
+input.dhx_repeat_radio {
+ margin-right: 4px;
+}
+input.dhx_repeat_checkbox {
+ margin: 4px 4px 0 0;
+}
+.dhx_repeat_days td {
+ padding-right: 5px;
+}
+.dhx_repeat_days label {
+ font-size: 10px;
+}
+.dhx_custom_button {
+ width: 90px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ -ms-border-radius: 4px;
+ -o-border-radius: 4px;
+ border-radius: 4px;
+}
+.dhx_custom_button_recurring {
+ background-image: url(imgs/but_repeat.gif);
+ background-position: -5px 20px;
+ width: 20px;
+ margin-right: 10px;
+}
+/* increase width of lightbox */
+.dhx_cal_light_rec {
+ width: 640px;
+}
+.dhx_cal_light_rec .dhx_cal_larea {
+ width: 632px;
+}
+.dhx_cal_light_rec.dhx_cal_light_wide {
+ width: 816px;
+}
+.dhx_cal_light_rec.dhx_cal_light_wide .dhx_cal_larea {
+ width: 808px;
+}
diff --git a/codebase/sources/skins/dhtmlxscheduler_flat.css b/codebase/sources/skins/dhtmlxscheduler_flat.css
new file mode 100644
index 0000000..c2b8ee3
--- /dev/null
+++ b/codebase/sources/skins/dhtmlxscheduler_flat.css
@@ -0,0 +1,2343 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+.dhtmlx_message_area {
+ position: fixed;
+ right: 5px;
+ width: 250px;
+ z-index: 1000;
+}
+.dhtmlx-info {
+ min-width: 120px;
+ padding: 4px 4px 4px 20px;
+ font-family: Tahoma;
+ z-index: 10000;
+ overflow: hidden;
+ margin: 5px;
+ margin-bottom: 10px;
+ -webkit-transition: all .5s ease;
+ -moz-transition: all .5s ease;
+ -o-transition: all .5s ease;
+ transition: all .5s ease;
+}
+.dhtmlx-info.hidden {
+ height: 0px;
+ padding: 0px;
+ border-width: 0px;
+ margin: 0px;
+ overflow: hidden;
+}
+.dhtmlx_modal_box {
+ overflow: hidden;
+ display: inline-block;
+ min-width: 300px;
+ width: 300px;
+ text-align: center;
+ position: fixed;
+ background-color: #fff;
+ background: -webkit-linear-gradient(top, #ffffff 1%, #d0d0d0 99%);
+ background: -moz-linear-gradient(top, #ffffff 1%, #d0d0d0 99%);
+ box-shadow: 0px 0px 14px #888;
+ font-family: Tahoma;
+ z-index: 20000;
+ border-radius: 6px;
+ border: 1px solid #ffffff;
+}
+.dhtmlx_popup_title {
+ border-top-left-radius: 5px;
+ border-top-right-radius: 5px;
+ border-width: 0px;
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAoCAMAAAAIaGBFAAAAhFBMVEVwcHBubm5sbGxqampoaGhmZmZlZWVjY2NhYWFfX19dXV1bW1taWlpYWFhWVlZUVFRSUlJRUVFPT09NTU1LS0tJSUlHR0dGRkZERERCQkJAQEA+Pj49PT09PT0+Pj5AQEBBQUFDQ0NERERGRkZHR0dJSUlKSkpMTExMTEw5OTk5OTk5OTkny8YEAAAAQklEQVQImQXBCRJCAAAAwKVSQqdyjSPXNP7/QLsIhA6OTiJnF7GrRCpzc/fw9PKW+/gqlCq1RqvTG/yMJrPF6m/bAVEhAxxnHG0oAAAAAElFTkSuQmCC);
+ background-image: -webkit-linear-gradient(top, #707070 1%, #3d3d3d 70%, #4c4c4c 97%, #393939 97%);
+ background-image: -moz-linear-gradient(top, #707070 1%, #3d3d3d 70%, #4c4c4c 97%, #393939 97%);
+}
+.dhtmlx-info,
+.dhtmlx_popup_button,
+.dhtmlx_button {
+ user-select: none;
+ -webkit-user-select: none;
+ -moz-user-select: -moz-none;
+ cursor: pointer;
+}
+.dhtmlx_popup_text {
+ overflow: hidden;
+}
+.dhtmlx_popup_controls {
+ border-radius: 6px;
+ padding: 5px;
+}
+.dhtmlx_popup_button,
+.dhtmlx_button {
+ height: 30px;
+ line-height: 30px;
+ display: inline-block;
+ margin: 0 5px;
+ border-radius: 6px;
+ color: #FFF;
+}
+.dhtmlx_popup_button {
+ min-width: 120px;
+}
+div.dhx_modal_cover {
+ background-color: #000;
+ cursor: default;
+ filter: alpha(opacity=20);
+ opacity: 0.2;
+ position: fixed;
+ z-index: 19999;
+ left: 0px;
+ top: 0px;
+ width: 100%;
+ height: 100%;
+ border: none;
+ zoom: 1;
+}
+.dhtmlx-info img,
+.dhtmlx_modal_box img {
+ float: left;
+ margin-right: 20px;
+}
+.dhtmlx-alert-error .dhtmlx_popup_title,
+.dhtmlx-confirm-error .dhtmlx_popup_title {
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAsCAIAAAArRUU2AAAATklEQVR4nIWLuw2AMBBDjVuQiBT2oWbRDATrnB0KQOJoqPzRe3BrHI6dcBASYREKovtK6/6DsDOX+stN+3H1YX9ciRgnYq5EWYhS2dftBIuLT4JyIrPCAAAAAElFTkSuQmCC);
+}
+.dhtmlx-alert-error,
+.dhtmlx-confirm-error {
+ border: 1px solid #ff0000;
+}
+/*Skin section*/
+.dhtmlx_button,
+.dhtmlx_popup_button {
+ box-shadow: 0px 0px 4px #888;
+ border: 1px solid #838383;
+}
+.dhtmlx_button input,
+.dhtmlx_popup_button div {
+ border: 1px solid #FFF;
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAeCAMAAADaS4T1AAAAYFBMVEVwcHBtbW1ra2toaGhmZmZjY2NhYWFeXl5cXFxaWlpXV1dVVVVSUlJQUFBNTU1LS0tJSUlGRkZERERBQUE/Pz88PDw9PT0+Pj5AQEBCQkJDQ0NFRUVHR0dISEhKSkpMTEzqthaMAAAAMklEQVQImQXBhQ2AMAAAsOIMlwWH/8+kRSKVyRVKlVrQaHV6g9FktlhFm93hdLk9Xt8PIfgBvdUqyskAAAAASUVORK5CYII=);
+ background-image: -webkit-linear-gradient(top, #707070 1%, #3d3d3d 70%, #4c4c4c 99%);
+ background-image: -moz-linear-gradient(top, #707070 1%, #3d3d3d 70%, #4c4c4c 99%);
+ border-radius: 6px;
+ font-size: 15px;
+ font-weight: normal;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ color: #fff;
+ padding: 0px;
+ margin: 0px;
+ vertical-align: top;
+ height: 28px;
+ line-height: 28px;
+}
+.dhtmlx_button input:focus,
+.dhtmlx_button input:active,
+.dhtmlx_popup_button div:active,
+.dhtmlx_popup_button div:focus {
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAeCAMAAADaS4T1AAAAXVBMVEVwcHBubm5tbW1sbGxra2tpaWloaGhnZ2dmZmZlZWVjY2NiYmJhYWFgYGBfX19dXV1cXFxbW1taWlpZWVlXV1dWVlZVVVVUVFRTU1NRUVFQUFBPT09OTk5NTU1LS0tT9SY0AAAAMUlEQVQImQXBhQGAMAAAIGxnx2z9/00BiVQmVyhVakGj1ekNRpPZYhVtdofT5fZ4fT8hpwG05JjexgAAAABJRU5ErkJggg==);
+ background-image: -webkit-linear-gradient(top, #707070 1%, #4c4c4c 99%);
+ background-image: -moz-linear-gradient(top, #707070 1%, #4c4c4c 99%);
+}
+.dhtmlx_popup_title {
+ color: #fff;
+ text-shadow: 1px 1px #000;
+ height: 40px;
+ line-height: 40px;
+ font-size: 20px;
+}
+.dhtmlx_popup_text {
+ margin: 15px 15px 5px 15px;
+ font-size: 14px;
+ color: #000;
+ min-height: 30px;
+ border-radius: 6px;
+}
+.dhtmlx-info,
+.dhtmlx-error {
+ font-size: 14px;
+ color: #000;
+ box-shadow: 0px 0px 10px #888;
+ padding: 0px;
+ background-color: #FFF;
+ border-radius: 3px;
+ border: 1px solid #ffffff;
+}
+.dhtmlx-info div {
+ padding: 5px 10px 5px 10px;
+ background-color: #fff;
+ border-radius: 3px;
+ border: 1px solid #B8B8B8;
+}
+.dhtmlx-error {
+ background-color: #d81b1b;
+ border: 1px solid #ff3c3c;
+ box-shadow: 0px 0px 10px #000;
+}
+.dhtmlx-error div {
+ background-color: #d81b1b;
+ border: 1px solid #940000;
+ color: #FFF;
+}
+.dhx_cal_event .dhx_header,
+.dhx_cal_event .dhx_title,
+.dhx_cal_event .dhx_body,
+.dhx_cal_event .dhx_footer {
+ background-color: #FFE763;
+ border: 1px solid #B7A543;
+ color: #887A2E;
+ overflow: hidden;
+ width: 100%;
+ font-family: Tahoma;
+ font-size: 8pt;
+}
+.dhx_move_denied .dhx_cal_event .dhx_header,
+.dhx_move_denied .dhx_cal_event .dhx_title {
+ cursor: default;
+}
+.dhx_cal_event .dhx_header {
+ height: 1px;
+ margin-left: 1px;
+ border-width: 1px 1px 0px 1px;
+ cursor: pointer;
+}
+.dhx_cal_event .dhx_title {
+ height: 12px;
+ border-width: 0px 1px 1px 1px;
+ border-bottom-style: dotted;
+ font-size: 7pt;
+ font-weight: bold;
+ text-align: center;
+ background-position: right;
+ background-repeat: no-repeat;
+ cursor: pointer;
+}
+.dhx_cal_event .dhx_body,
+.dhx_cal_event.dhx_cal_select_menu .dhx_body {
+ border-width: 0 1px 1px 1px;
+ padding: 5px;
+}
+.dhx_cal_event.dhx_cal_select_menu {
+ -webkit-box-shadow: 0 0 1px #FFF;
+ -moz-box-shadow: 0 0 1px #FFF;
+ box-shadow: 0 0 1px #FFF;
+}
+.dhx_resize_denied,
+.dhx_resize_denied .dhx_event_resize {
+ cursor: default !important;
+}
+.dhx_cal_event .dhx_event_resize {
+ cursor: s-resize;
+}
+.dhx_cal_event .dhx_footer,
+.dhx_cal_event .dhx_select_menu_footer {
+ height: 1px;
+ margin-left: 2px;
+ border-width: 0px 1px 1px 1px;
+ position: relative;
+}
+.dhx_cal_event_line {
+ background-color: #FFE763;
+ border: 1px solid #B7A543;
+ border-radius: 3px;
+ font-family: Tahoma;
+ font-size: 8pt;
+ height: 13px;
+ padding-left: 10px;
+ color: #887A2E;
+ cursor: pointer;
+ overflow: hidden;
+}
+.dhx_cal_event_clear {
+ font-family: Tahoma;
+ font-size: 8pt;
+ height: 13px;
+ padding-left: 2px;
+ color: #887A2E;
+ white-space: nowrap;
+ overflow: hidden;
+ cursor: pointer;
+}
+.dhx_in_move {
+ background-color: #FFFF80;
+}
+.dhx_cal_event.dhx_cal_editor {
+ border: 1px solid #B7A543;
+ border-top-style: dotted;
+ z-index: 999;
+ position: absolute;
+ overflow: hidden;
+}
+textarea.dhx_cal_editor {
+ width: 100%;
+ height: 100%;
+ border: 0 solid black;
+ margin: 0;
+ padding: 0;
+ overflow: auto;
+}
+div.dhx_menu_head {
+ background-image: url(imgs/controls.gif);
+ background-position: 0px -43px;
+ width: 10px;
+ height: 10px;
+ margin-left: 5px;
+ margin-top: 1px;
+ border: none;
+ cursor: default;
+}
+div.dhx_menu_icon {
+ background-image: url(imgs/controls.gif);
+ width: 20px;
+ height: 20px;
+ margin-left: -5px;
+ margin-top: 0px;
+ border: none;
+ cursor: pointer;
+}
+div.icon_details {
+ background-position: 0px 0px;
+}
+div.icon_edit {
+ background-position: -22px 0px;
+}
+div.icon_save {
+ background-position: -84px -1px;
+}
+div.icon_cancel {
+ background-position: -62px 0px;
+}
+div.icon_delete {
+ background-position: -42px 0px;
+}
+/*view more link in month view*/
+.dhx_month_link {
+ position: absolute;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ text-align: right;
+ cursor: pointer;
+ padding-right: 10px;
+}
+.dhx_month_link a {
+ color: blue;
+}
+.dhx_month_link a:hover {
+ text-decoration: underline;
+}
+.dhx_global_tip {
+ font-family: Tahoma, Helvetica;
+ text-align: center;
+ font-size: 20px;
+ position: fixed;
+ top: 60px;
+ right: 20px;
+ background-color: rgba(255, 255, 255, 0.7);
+ color: #000;
+ z-index: 10000;
+ padding: 20px 30px;
+ width: 190px;
+}
+.dhx_global_tip div {
+ font-size: 30px;
+}
+@media (-moz-touch-enabled) {
+ .dhx_cal_container {
+ user-select: none;
+ -moz-user-select: none;
+ }
+}
+.dhx_unselectable,
+.dhx_unselectable div {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.dhx_cal_light {
+ -webkit-tap-highlight-color: transparent;
+ background-color: #FFE763;
+ border-radius: 5px;
+ font-family: Tahoma;
+ font-size: 8pt;
+ border: 1px solid #B7A64B;
+ color: #887A2E;
+ position: absolute;
+ z-index: 10001;
+ width: 580px;
+ height: 300px;
+ box-shadow: 5px 5px 5px #888;
+}
+.dhx_cal_light_wide {
+ width: 650px;
+}
+.dhx_mark {
+ position: relative;
+ top: 3px;
+ background-image: url('imgs/controls.gif');
+ background-position: 0px -43px;
+ padding-left: 10px;
+}
+.dhx_ie6 .dhx_mark {
+ background-position: 6px -41px;
+}
+.dhx_cal_light select {
+ font-family: Tahoma;
+ font-size: 8pt;
+ color: #887A2E;
+ padding: 2px;
+ margin: 0px;
+}
+.dhx_cal_ltitle {
+ padding: 2px 0px 2px 5px;
+ overflow: hidden;
+ white-space: nowrap;
+}
+.dhx_cal_ltitle span {
+ white-space: nowrap;
+}
+.dhx_cal_lsection {
+ background-color: #DBCF8C;
+ color: #FFF4B5;
+ font-weight: bold;
+ padding: 5px 0px 3px 10px;
+}
+.dhx_section_time {
+ background-color: #DBCF8C;
+ white-space: nowrap;
+}
+.dhx_cal_lsection .dhx_fullday {
+ float: right;
+ margin-right: 5px;
+ color: #887A2E;
+ font-size: 12px;
+ font-weight: normal;
+ line-height: 20px;
+ vertical-align: top;
+ cursor: pointer;
+}
+.dhx_cal_lsection {
+ font-size: 18px;
+ font-family: Arial;
+}
+.dhx_cal_ltext {
+ padding: 2px 0px 2px 10px;
+ overflow: hidden;
+}
+.dhx_cal_ltext textarea {
+ background-color: #FFF4B5;
+ /* #FFF4B5; should be the same for dhx_cal_larea, was transperent */
+ overflow: auto;
+ border: none;
+ color: #887A2E;
+ height: 100%;
+ width: 100%;
+ outline: none !important;
+ resize: none;
+}
+.dhx_time {
+ font-weight: bold;
+}
+.dhx_cal_light .dhx_title {
+ padding-left: 10px;
+}
+.dhx_cal_larea {
+ border: 1px solid #DCC43E;
+ background-color: #FFF4B5;
+ overflow: hidden;
+ margin-left: 3px;
+ width: 572px;
+ height: 1px;
+}
+.dhx_btn_set {
+ padding: 5px 10px 0px 10px;
+ float: left;
+}
+.dhx_btn_set div {
+ float: left;
+ height: 21px;
+ line-height: 21px;
+ vertical-align: middle;
+ cursor: pointer;
+}
+.dhx_save_btn {
+ background-image: url('imgs/controls.gif');
+ background-position: -84px 0px;
+ width: 21px;
+}
+.dhx_cancel_btn {
+ background-image: url('imgs/controls.gif');
+ background-position: -63px 0px;
+ width: 20px;
+}
+.dhx_delete_btn {
+ background-image: url('imgs/controls.gif');
+ background-position: -42px 0px;
+ width: 20px;
+}
+.dhx_cal_cover {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ z-index: 10000;
+ top: 0px;
+ left: 0px;
+ background-color: black;
+ opacity: 0.1;
+ filter: alpha(opacity=10);
+}
+.dhx_custom_button {
+ padding: 0px 3px 0px 3px;
+ color: #887A2E;
+ font-family: Tahoma;
+ font-size: 8pt;
+ background-color: #FFE763;
+ font-weight: normal;
+ margin-right: 5px;
+ margin-top: 0px;
+ cursor: pointer;
+}
+.dhx_custom_button div {
+ cursor: pointer;
+ float: left;
+ height: 21px;
+ line-height: 21px;
+ vertical-align: middle;
+}
+.dhx_cal_light_wide .dhx_cal_larea {
+ border-top-width: 0px;
+}
+.dhx_cal_light_wide .dhx_cal_lsection {
+ border: 0px;
+ float: left;
+ text-align: right;
+ width: 100px;
+ height: 20px;
+ font-size: 16px;
+ padding: 5px 0px 0px 10px;
+}
+.dhx_cal_light_wide .dhx_wrap_section {
+ border-top: 1px solid #DBCF8C;
+ position: relative;
+ background-color: #DBCF8C;
+ overflow: hidden;
+}
+.dhx_cal_light_wide .dhx_section_time {
+ padding-top: 2px !important;
+ height: 20px !important;
+}
+.dhx_section_time {
+ text-align: center;
+}
+.dhx_cal_light_wide .dhx_cal_larea {
+ width: 730px;
+}
+.dhx_cal_light_wide {
+ width: 738px;
+}
+.dhx_cal_light_wide .dhx_section_time {
+ background: transparent;
+}
+.dhx_cal_light_wide .dhx_cal_checkbox label {
+ padding-left: 0px;
+}
+.dhx_cal_wide_checkbox input {
+ margin-top: 8px;
+ margin-left: 14px;
+}
+.dhx_cal_light input {
+ font-family: Tahoma;
+ font-size: 8pt;
+ color: #887A2E;
+}
+.dhx_cal_light_wide .dhx_cal_lsection .dhx_fullday {
+ float: none;
+ margin-right: 0px;
+ color: #FFF4B5;
+ font-weight: bold;
+ font-size: 16px;
+ font-family: Arial;
+ cursor: pointer;
+}
+.dhx_custom_button {
+ float: right;
+ height: 21px;
+ width: 90px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ -ms-border-radius: 4px;
+ -o-border-radius: 4px;
+ border-radius: 4px;
+}
+.dhx_cal_light_wide .dhx_custom_button {
+ position: absolute;
+ top: 0;
+ right: 0;
+ margin-top: 2px;
+}
+.dhx_cal_light_wide .dhx_repeat_right {
+ margin-right: 55px;
+}
+.dhx_minical_popup {
+ position: absolute;
+ z-index: 10100;
+ width: 251px;
+ height: 175px;
+}
+.dhx_scale_bar_header {
+ position: absolute;
+ border-bottom: 1px dotted #8894A3;
+ width: 100%;
+}
+.dhx_expand_icon {
+ position: absolute;
+ top: 0px;
+ right: 0px;
+ background-image: url(imgs/collapse_expand_icon.gif);
+ width: 18px;
+ height: 18px;
+ cursor: pointer;
+ background-position: 0px 18px;
+ z-index: 16;
+}
+.dhx_scheduler_agenda .dhx_cal_data {
+ background-image: url(imgs/databg.png);
+}
+.dhx_agenda_area {
+ width: 100%;
+ overflow-y: auto;
+ background-image: url(imgs/databg.png);
+}
+.dhx_agenda_line {
+ height: 21px;
+ clear: both;
+ overflow: hidden;
+}
+.dhx_agenda_line div {
+ float: left;
+ width: 188px;
+ border-right: 1px dotted #8894A3;
+ text-align: center;
+ line-height: 21px;
+ overflow: hidden;
+}
+.dhx_agenda_area .dhx_agenda_line div {
+ border-right: 0px dotted #8894A3;
+}
+.dhx_v_border {
+ position: absolute;
+ left: 187px;
+ top: 0;
+ border-right: 1px dotted #8894A3;
+ width: 1px;
+ height: 100%;
+}
+.dhx_agenda_line .dhx_event_icon {
+ width: 20px;
+ border-width: 0px;
+ background: url(imgs/icon.png) no-repeat;
+ background-position: 5px 4px;
+ cursor: pointer;
+}
+.dhx_agenda_line span {
+ padding-left: 5px;
+ line-height: 21px;
+}
+.dhx_year_body {
+ border-left: 1px dotted #586A7E;
+}
+.dhx_year_week {
+ position: relative;
+}
+.dhx_scale_bar_last {
+ border-right: 1px dotted #586A7E;
+}
+.dhx_year_month {
+ height: 18px;
+ padding-top: 3px;
+ border: 1px dotted #586A7E;
+ text-align: center;
+ vertical-align: middle;
+}
+.dhx_year_body .dhx_before .dhx_month_head,
+.dhx_year_body .dhx_after .dhx_month_head,
+.dhx_year_body .dhx_before .dhx_month_head a,
+.dhx_year_body .dhx_after .dhx_month_head a {
+ color: #E2E3E6 !important;
+}
+.dhx_year_body .dhx_month_body {
+ height: 0px;
+ overflow: hidden;
+}
+.dhx_month_head.dhx_year_event {
+ background-color: #FFE763;
+}
+.dhx_year_body .dhx_before .dhx_month_head,
+.dhx_year_body .dhx_after .dhx_month_head {
+ cursor: default;
+}
+.dhx_year_tooltip {
+ border: 1px solid #BBBBBB;
+ background-image: url(imgs/databg.png);
+ position: absolute;
+ z-index: 9998;
+ width: 300px;
+ height: auto;
+ font-family: Tahoma;
+ font-size: 8pt;
+ overflow: hidden;
+}
+.dhx_tooltip_line {
+ line-height: 20px;
+ height: 20px;
+ overflow: hidden;
+}
+.dhx_tooltip_line .dhx_event_icon {
+ width: 20px;
+ height: 20px;
+ padding-right: 10px;
+ float: left;
+ border-width: 0px;
+ position: relative;
+ background: url(imgs/icon.png) no-repeat;
+ background-position: 5px 4px;
+ cursor: pointer;
+}
+.dhx_tooltip_date {
+ float: left;
+ width: auto;
+ padding-left: 5px;
+ text-align: center;
+}
+.dhx_text_disabled {
+ color: #887A2E;
+ font-family: Tahoma;
+ font-size: 8pt;
+}
+.dhx_mini_calendar {
+ -moz-box-shadow: 5px 5px 5px #888;
+ /*Doesn't work in IE*/
+ -khtml-box-shadow: 5px 5px 5px #888;
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ -user-select: none;
+}
+.dhx_mini_calendar .dhx_month_head {
+ cursor: pointer;
+}
+.dhx_mini_calendar .dhx_calendar_click {
+ background-color: #C2D5FC;
+}
+.dhx_cal_navline div.dhx_minical_icon {
+ width: 18px;
+ height: 18px;
+ left: 190px;
+ top: 1px;
+ cursor: pointer;
+ background-image: url(imgs/calendar.gif);
+}
+.dhx_matrix_scell {
+ height: 100%;
+}
+.dhx_matrix_cell,
+.dhx_matrix_scell {
+ overflow: hidden;
+ text-align: center;
+ vertical-align: middle;
+ border-bottom: 1px dotted #8894A3;
+ border-right: 1px dotted #8894A3;
+}
+.dhx_matrix_cell {
+ background-color: white;
+}
+.dhx_matrix_line {
+ overflow: hidden;
+}
+.dhx_matrix_cell div,
+.dhx_matrix_scell div {
+ overflow: hidden;
+ text-align: center;
+ height: auto;
+}
+.dhx_cal_lsection .dhx_readonly {
+ font-size: 9pt;
+ font-size: 8pt;
+ padding: 2px;
+ color: #887A2E;
+}
+.dhx_cal_event_line .dhx_event_resize {
+ cursor: w-resize;
+ background: url(imgs/resize_dots.png) repeat-y;
+ position: absolute;
+ top: 0;
+ width: 4px;
+ height: 100%;
+}
+.dhx_event_resize_start {
+ left: 0;
+}
+.dhx_event_resize_end {
+ right: 0;
+}
+/* Tree view */
+.dhx_matrix_scell.folder,
+.dhx_data_table.folder .dhx_matrix_cell {
+ background-color: #969394;
+ cursor: pointer;
+}
+.dhx_matrix_scell .dhx_scell_level0 {
+ padding-left: 5px;
+}
+.dhx_matrix_scell .dhx_scell_level1 {
+ padding-left: 20px;
+}
+.dhx_matrix_scell .dhx_scell_level2 {
+ padding-left: 35px;
+}
+.dhx_matrix_scell .dhx_scell_level3 {
+ padding-left: 50px;
+}
+.dhx_matrix_scell .dhx_scell_level4 {
+ padding-left: 65px;
+}
+.dhx_matrix_scell.folder {
+ font-weight: bold;
+ text-align: left;
+}
+.dhx_matrix_scell.folder .dhx_scell_expand {
+ float: left;
+ width: 10px;
+ padding-right: 3px;
+}
+.dhx_matrix_scell.folder .dhx_scell_name {
+ float: left;
+ width: auto;
+}
+.dhx_matrix_scell.item .dhx_scell_name {
+ padding-left: 15px;
+ text-align: left;
+}
+.dhx_data_table.folder .dhx_matrix_cell {
+ border-right: 0;
+}
+.dhx_section_timeline {
+ overflow: hidden;
+ padding: 4px 0 2px 10px;
+}
+.dhx_section_timeline select {
+ width: 552px;
+}
+/* Tree view end*/
+/* Map view */
+.dhx_map_area {
+ width: 100%;
+ height: 100%;
+ overflow-y: auto;
+ overflow-x: hidden;
+ background-image: url(imgs/databg.png);
+}
+.dhx_map_line .dhx_event_icon {
+ width: 20px;
+ border-width: 0px;
+ background: url(imgs/icon.png) no-repeat;
+ background-position: 5px 4px;
+ cursor: pointer;
+}
+.dhx_map_line {
+ height: 21px;
+ clear: both;
+ overflow: hidden;
+}
+.dhx_map {
+ position: absolute;
+}
+.dhx_map_line div {
+ float: left;
+ border-right: 1px dotted #8894A3;
+ text-align: center;
+ line-height: 21px;
+ overflow: hidden;
+}
+.dhx_map_line .headline_description {
+ float: left;
+ border-right: 1px dotted #8894A3;
+ text-align: center;
+ line-height: 21px;
+ overflow: hidden;
+}
+.dhx_map_line .dhx_map_description {
+ float: left;
+ border-right: 0 dotted #8894A3;
+ text-align: center;
+ line-height: 21px;
+ overflow: hidden;
+}
+.dhx_map_line .headline_date,
+.dhx_map_line .headline_description {
+ border-left: 0;
+}
+.dhx_map_line .line_description {
+ float: left;
+ border-right: 1px dotted #8894A3;
+ text-align: left;
+ padding-left: 5px;
+ line-height: 21px;
+ overflow: hidden;
+}
+.dhx_map_line.highlight {
+ background-color: #C4C5CC;
+}
+.dhx_map_area .dhx_map_line div {
+ border-right: 0px dotted #8894A3;
+}
+/* Map view end */
+/* dhtmlXTooltip start */
+.dhtmlXTooltip.tooltip {
+ -moz-box-shadow: 3px 3px 3px #888888;
+ -webkit-box-shadow: 3px 3px 3px #888888;
+ -o-box-shadow: 3px 3px 3px #888888;
+ box-shadow: 3px 3px 3px #888888;
+ filter: progid:DXImageTransform.Microsoft.Shadow(color='#888888', Direction=135, Strength=5);
+ background-color: white;
+ border-left: 1px dotted #887A2E;
+ border-top: 1px dotted #887A2E;
+ color: #887A2E;
+ cursor: default;
+ padding: 10px;
+ position: absolute;
+ z-index: 500;
+ font-family: Tahoma;
+ font-size: 8pt;
+ opacity: 1;
+}
+/* dhtmlXTooltip end */
+/* Lightbox checkbox section */
+.dhx_cal_checkbox label {
+ padding-left: 5px;
+}
+/* Lightbox checkbox section end */
+/* Lightbox radiobuttons section */
+.dhx_cal_light .radio {
+ padding: 2px 0px 2px 10px;
+}
+.dhx_cal_light .radio input,
+.dhx_cal_light .radio label {
+ line-height: 15px;
+}
+.dhx_cal_light .radio input {
+ vertical-align: middle;
+ margin: 0px;
+ padding: 0px;
+}
+.dhx_cal_light .radio label {
+ vertical-align: middle;
+ padding-right: 10px;
+}
+/* Lightbox radiobuttons section end */
+/* Lightbox dhtmlx combo section */
+.dhx_cal_light .combo {
+ padding: 4px;
+}
+.dhx_cal_light_wide .dhx_combo_box {
+ width: 608px !important;
+ left: 10px;
+}
+/* Lightbox dhtmlx combo section end */
+/* Agenda week start */
+.dhx_wa_column {
+ float: left;
+}
+.dhx_wa_column_last .dhx_wa_day_cont {
+ border-left: 1px dotted #8894A3;
+}
+.dhx_wa_scale_bar {
+ font-family: Tahoma;
+ padding-left: 10px;
+ font-size: 11px;
+ border-top: 1px dotted #8894A3;
+ border-bottom: 1px dotted #8894A3;
+}
+.dhx_wa_day_data {
+ background-color: #FCFEFC;
+ overflow-y: auto;
+}
+.dhx_wa_ev_body {
+ border-bottom: 1px dotted #778899;
+ font-size: 12px;
+ padding: 5px 0 5px 7px;
+}
+.dhx_wa_dnd {
+ font-family: Tahoma;
+ position: absolute;
+ padding-right: 7px;
+ color: #887AE2 !important;
+ background-color: #FFE763 !important;
+ border: 1px solid #B7A543;
+}
+.dhx_cal_event_selected {
+ background-color: #9cc1db;
+ color: white;
+}
+/* Agenda week end */
+/* timeline second scale start */
+.dhx_second_scale_bar {
+ border-bottom: 1px dotted #586A7E;
+ padding-top: 2px;
+}
+/* timeline second scale end */
+/* grid view */
+.dhx_cal_header div div {
+ border-left: 1px dotted #8894A3;
+}
+.dhx_grid_area {
+ width: 100%;
+ height: 100%;
+ overflow-y: auto;
+ background-color: #FCFEFC;
+}
+.dhx_grid_area table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ width: 100%;
+ table-layout: fixed;
+}
+.dhx_grid_area td {
+ table-layout: fixed;
+ text-align: center;
+}
+.dhx_grid_line {
+ height: 21px;
+ clear: both;
+ overflow: hidden;
+}
+.dhx_grid_line div {
+ float: left;
+ cursor: default;
+ padding-top: 0;
+ padding-bottom: 0;
+ text-align: center;
+ line-height: 21px;
+ overflow: hidden;
+}
+.dhx_grid_area td,
+.dhx_grid_line div {
+ padding-left: 8px;
+ padding-right: 8px;
+}
+.dhx_grid_area tr.dhx_grid_event {
+ height: 21px;
+ overflow: hidden;
+ margin: 0 0 1px 0;
+}
+.dhx_grid_area tr.dhx_grid_event td {
+ /*borders for old ies*/
+ border-bottom: 1px solid #ECEEF4;
+}
+.dhx_grid_area tr.dhx_grid_event:nth-child(2n+1) td,
+.dhx_grid_area tr.dhx_grid_event:nth-child(2n) td {
+ border-bottom-width: 0px;
+ border-bottom-style: none;
+}
+.dhx_grid_area tr.dhx_grid_event:nth-child(2n) {
+ background-color: #ECEEF4;
+}
+.dhx_grid_area .dhx_grid_dummy {
+ table-layout: auto;
+ margin: 0 !important;
+ padding: 0 !important;
+}
+.dhx_grid_v_border {
+ position: absolute;
+ border-right: 1px solid #A4BED4;
+ width: 1px;
+ height: 100%;
+}
+.dhx_grid_event_selected {
+ background-color: #9cc1db !important;
+ color: white !important;
+}
+.dhx_grid_sort_desc .dhx_grid_view_sort {
+ background-position: 0 -55px;
+}
+.dhx_grid_sort_asc .dhx_grid_view_sort {
+ background-position: 0 -66px;
+}
+.dhx_grid_view_sort {
+ width: 10px;
+ height: 10px;
+ position: absolute;
+ border: none !important;
+ top: 5px;
+ background-repeat: no-repeat;
+ background-image: url(imgs/images.png);
+}
+/* end grid */
+/* marked timespans */
+.dhx_marked_timespan {
+ position: absolute;
+ width: 100%;
+}
+.dhx_time_block {
+ position: absolute;
+ width: 100%;
+ background: silver;
+ opacity: 0.4;
+ filter: alpha(opacity=40);
+ z-index: 1;
+}
+.dhx_time_block_reset {
+ opacity: 1;
+ filter: alpha(opacity=100);
+}
+.dhx_scheduler_month .dhx_marked_timespan {
+ display: none;
+}
+.dhx_mini_calendar .dhx_marked_timespan {
+ display: none;
+}
+/* now time */
+.dhx_now_time {
+ width: 100%;
+ border-bottom: 2px solid red;
+ z-index: 1;
+}
+.dhx_scheduler_month .dhx_now_time {
+ border-bottom: 0;
+ border-left: 2px solid red;
+}
+.dhx_matrix_now_time {
+ border-left: 2px solid red;
+ z-index: 1;
+}
+.dhx_now_time,
+.dhx_matrix_now_time {
+ opacity: 0.5;
+}
+/* Quick info */
+.dhx_cal_quick_info {
+ border: 2px solid #888;
+ border-radius: 5px;
+ position: absolute;
+ z-index: 300;
+ background-color: #8e99ae;
+ background-color: rgba(98, 107, 127, 0.5);
+ padding-left: 7px;
+ width: 300px;
+ transition: left 0.5s ease, right 0.5s;
+ -moz-transition: left 0.5s ease, right 0.5s;
+ -webkit-transition: left 0.5s ease, right 0.5s;
+ -o-transition: left 0.5s ease, right 0.5s;
+}
+.dhx_no_animate {
+ transition: none;
+ -moz-transition: none;
+ -webkit-transition: none;
+ -o-transition: none;
+}
+.dhx_cal_quick_info.dhx_qi_left .dhx_qi_big_icon {
+ float: right;
+}
+.dhx_cal_qi_title {
+ padding: 5px 0px 10px 5px;
+ color: #FFF;
+ letter-spacing: 1px;
+}
+.dhx_cal_qi_tdate {
+ font-size: 14px;
+}
+.dhx_cal_qi_tcontent {
+ font-size: 18px;
+ font-weight: bold;
+}
+.dhx_cal_qi_content {
+ border: 1px solid #888;
+ background-color: #fefefe;
+ padding: 16px 8px;
+ font-size: 14px;
+ color: #444;
+ width: 275px;
+ overflow: hidden;
+}
+.dhx_qi_big_icon {
+ border-radius: 3px;
+ color: #444;
+ margin: 5px 9px 5px 0px;
+ min-width: 60px;
+ line-height: 20px;
+ vertical-align: middle;
+ padding: 5px 10px 5px 5px;
+ cursor: pointer;
+ background-color: #fefefe;
+ border-bottom: 1px solid #666;
+ border-right: 1px solid #666;
+ float: left;
+}
+.dhx_cal_qi_controls div {
+ float: left;
+ height: 20px;
+ text-align: center;
+ line-height: 20px;
+}
+.dhx_qi_big_icon .dhx_menu_icon {
+ margin: 0 8px 0 0px;
+}
+.dhx_drag_marker {
+ width: 100%;
+ filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
+ opacity: 0.5;
+ background-color: #FFE763;
+ position: absolute;
+ box-sizing: border-box !important;
+ border-top: 1px solid #B6B6B6;
+ border-bottom: 1px solid #b6b6b6;
+}
+/* bootstrap CSS fix start */
+.dhx_cal_navline div,
+.dhx_cal_header,
+.dhx_cal_header div,
+.dhx_cal_data div,
+.dhx_cal_light,
+.dhx_cal_light div {
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+.dhx_cal_light .dhx_cal_radio label {
+ margin-bottom: 0;
+}
+.dhx_cal_event div {
+ line-height: normal;
+}
+/* bootstrap CSS fix end */
+.dhx_cal_container {
+ background-color: #C2D5FC;
+ font-family: Tahoma;
+ font-size: 8pt;
+ position: relative;
+ overflow: hidden;
+}
+.dhx_cal_container div {
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.dhx_cal_navline {
+ height: 20px;
+ position: absolute;
+ z-index: 3;
+ width: 750px;
+ color: #2F3A48;
+}
+.dhx_cal_navline div {
+ position: absolute;
+ top: 2px;
+ white-space: nowrap;
+}
+.dhx_cal_navline .dhx_cal_date {
+ font-weight: 600;
+ left: 210px;
+ padding-top: 1px;
+}
+.dhx_cal_button .dhx_left_bg {
+ width: 1px;
+ overflow: hidden;
+ height: 17px;
+ z-index: 20;
+ top: 0px;
+}
+.dhx_cal_prev_button {
+ background-image: url(imgs/buttons.png);
+ background-position: 0px 0px;
+ width: 29px;
+ height: 17px;
+ left: 50px;
+ cursor: pointer;
+}
+.dhx_cal_next_button {
+ background-image: url(imgs/buttons.png);
+ background-position: -30px 0px;
+ width: 29px;
+ height: 17px;
+ left: 80px;
+ cursor: pointer;
+}
+.dhx_cal_today_button {
+ background-image: url(imgs/buttons.png);
+ background-position: -60px 0px;
+ width: 75px;
+ height: 17px;
+ left: 112px;
+ cursor: pointer;
+ text-align: center;
+ text-decoration: underline;
+}
+.dhx_cal_tab {
+ width: 59px;
+ height: 19px;
+ text-align: center;
+ text-decoration: underline;
+ padding-top: 2px;
+ cursor: pointer;
+ background-color: #D8E1EA;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ -moz-border-radius-topleft: 4px;
+ -moz-border-radius-topright: 4px;
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+}
+.dhx_cal_tab.active {
+ text-decoration: none;
+ cursor: default;
+ font-weight: bold;
+ border: 1px dotted #586A7E;
+ border-bottom: 0;
+ background-color: #C2D5FC;
+}
+.dhx_cal_header {
+ position: absolute;
+ left: 10px;
+ top: 23px;
+ width: 750px;
+ border-top: 1px dotted #8894A3;
+ border-right: 1px dotted #8894A3;
+ z-index: 2;
+ overflow: hidden;
+ color: #2F3A48;
+}
+.dhx_cal_data {
+ -webkit-tap-highlight-color: transparent;
+ border-top: 1px dotted #8894A3;
+ position: absolute;
+ top: 44px;
+ width: 600px;
+ overflow-y: auto;
+ overflow-x: hidden;
+ -webkit-overflow-scrolling: touch;
+}
+.dhx_cal_data {
+ -ms-touch-action: pan-y;
+}
+.dhx_cal_event,
+.dhx_cal_event_line,
+.dhx_cal_event_clear {
+ -ms-touch-action: none;
+}
+.dhx_scale_bar {
+ position: absolute;
+ text-align: center;
+ background-color: #C2D5FC;
+ padding-top: 3px;
+ border-left: 1px dotted #586A7E;
+}
+.dhx_scale_holder {
+ position: absolute;
+ border-right: 1px dotted #586A7E;
+ background-image: url(imgs/databg.png);
+}
+.dhx_scale_holder_now {
+ position: absolute;
+ border-right: 1px dotted #586A7E;
+ background-image: url(imgs/databg_now.png);
+}
+.dhx_scale_hour {
+ height: 41px;
+ width: 50px;
+ border-bottom: 1px dotted #8894A3;
+ background-color: #C2D5FC;
+ text-align: center;
+ line-height: 40px;
+ color: #586A7E;
+ overflow: hidden;
+}
+.dhx_month_head {
+ background-color: #EBEFF4;
+ color: #2F3A48;
+ height: 18px;
+ padding-right: 5px;
+ padding-top: 3px;
+ text-align: right;
+ border-right: 1px dotted #586A7E;
+}
+.dhx_month_body {
+ border-right: 1px dotted #586A7E;
+ border-bottom: 1px dotted #586A7E;
+ background-color: #FFFFFF;
+}
+.dhx_now .dhx_month_body {
+ background-color: #E2EDFF;
+}
+.dhx_after .dhx_month_body,
+.dhx_before .dhx_month_body {
+ background-color: #ECECEC;
+}
+.dhx_after .dhx_month_head,
+.dhx_before .dhx_month_head {
+ background-color: #E2E3E6;
+ color: #94A6BB;
+}
+.dhx_now .dhx_month_head {
+ background-color: #D1DEF4;
+ font-weight: bold;
+}
+.dhx_scale_ignore {
+ display: none;
+}
+.dhx_cal_drag {
+ position: absolute;
+ z-index: 9999;
+ background-color: #FFE763;
+ border: 1px solid #B7A543;
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+}
+.dhx_loading {
+ position: absolute;
+ width: 128px;
+ height: 15px;
+ background-image: url(imgs/loading.gif);
+ z-index: 9999;
+}
+.dhx_multi_day_icon,
+.dhx_multi_day {
+ background-color: #E1E6FF;
+ background-repeat: no-repeat;
+ border-right: 1px dotted #8894A3;
+}
+.dhx_multi_day {
+ position: absolute;
+ border-top: 1px dotted #8894A3;
+}
+.dhx_multi_day_icon,
+.dhx_multi_day_icon_small {
+ background-position: center center;
+ background-color: #E1E6FF;
+ background-repeat: no-repeat;
+ border-bottom: 1px dotted #8894A3;
+ border-right: 1px dotted #8894A3;
+}
+.dhx_multi_day_icon {
+ background-image: url(imgs/clock_big.gif);
+}
+.dhx_multi_day_icon_small {
+ background-image: url(imgs/clock_small.gif);
+}
+.dhtmlxLayoutPolyContainer_dhx_skyblue .dhx_cal_container {
+ background-color: #d0e5ff;
+}
+/* left border config option support */
+.dhx_scale_hour_border,
+.dhx_month_body_border,
+.dhx_scale_bar_border,
+.dhx_month_head_border {
+ border-left: 1px dotted #8894A3;
+}
+/* export to PDF and iCal buttons start */
+.dhx_cal_navline .dhx_cal_export {
+ width: 18px;
+ height: 18px;
+ margin: 2px;
+ cursor: pointer;
+ top: 0px;
+}
+.dhx_cal_navline .dhx_cal_export.pdf {
+ left: 2px;
+ background-image: url('imgs/export_pdf.png');
+}
+.dhx_cal_navline .dhx_cal_export.ical {
+ left: 24px;
+ background-image: url('imgs/export_ical.png');
+}
+/* export to PDF and iCal buttons end */
+/*All*/
+.dhx_form_repeat,
+.dhx_form_repeat input {
+ padding: 0;
+ margin: 0;
+ padding-left: 5px;
+ font-family: Tahoma, Verdana;
+ font-size: 11px;
+ line-height: 24px;
+}
+.dhx_form_repeat {
+ overflow: hidden;
+ /*height:115px;*/
+ height: 0px;
+ background-color: #FFF4B5;
+ /*border: 1px solid #DCC43E;*/
+}
+.dhx_cal_light_wide .dhx_form_repeat {
+ background-color: transparent;
+}
+.dhx_repeat_center,
+.dhx_repeat_left {
+ height: 115px;
+ padding: 10px 0 10px 10px;
+ float: left;
+}
+.dhx_repeat_left {
+ width: 95px;
+}
+.dhx_repeat_center {
+ width: 335px;
+ margin-top: 12px;
+}
+.dhx_repeat_divider {
+ float: left;
+ height: 115px;
+ border-left: 1px dotted #DCC43E;
+ /*background-color: #DCC43E;*/
+ width: 1px;
+}
+.dhx_repeat_right {
+ float: right;
+ height: 115px;
+ width: 160px;
+ padding: 10px 3px 10px 10px;
+ margin-top: 7px;
+}
+input.dhx_repeat_text {
+ height: 16px;
+ width: 27px;
+ margin: 0 4px 0 4px;
+ line-height: 18px;
+ padding: 0 0 0 2px;
+}
+.dhx_form_repeat select {
+ height: 20px;
+ width: 87px;
+ padding: 0 0 0 2px;
+ margin: 0 4px 0 4px;
+}
+input.dhx_repeat_date {
+ height: 18px;
+ width: 80px;
+ padding: 0 0 0 2px;
+ margin: 0 4px 0 4px;
+ background-repeat: no-repeat;
+ background-position: 64px 0;
+ border: 1px #7f9db9 solid;
+ line-height: 18px;
+}
+input.dhx_repeat_radio {
+ margin-right: 4px;
+}
+input.dhx_repeat_checkbox {
+ margin: 4px 4px 0 0;
+}
+.dhx_repeat_days td {
+ padding-right: 5px;
+}
+.dhx_repeat_days label {
+ font-size: 10px;
+}
+.dhx_custom_button {
+ width: 90px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ -ms-border-radius: 4px;
+ -o-border-radius: 4px;
+ border-radius: 4px;
+}
+.dhx_custom_button_recurring {
+ background-image: url(imgs/but_repeat.gif);
+ background-position: -5px 20px;
+ width: 20px;
+ margin-right: 10px;
+}
+/* increase width of lightbox */
+.dhx_cal_light_rec {
+ width: 640px;
+}
+.dhx_cal_light_rec .dhx_cal_larea {
+ width: 632px;
+}
+.dhx_cal_light_rec.dhx_cal_light_wide {
+ width: 816px;
+}
+.dhx_cal_light_rec.dhx_cal_light_wide .dhx_cal_larea {
+ width: 808px;
+}
+/* event start */
+.dhx_cal_event .dhx_title {
+ border-width: 1px 1px 0 1px;
+ -webkit-border-top-left-radius: 1px;
+ -webkit-border-top-right-radius: 1px;
+ -moz-border-radius-topleft: 1px;
+ -moz-border-radius-topright: 1px;
+ border-top-left-radius: 1px;
+ border-top-right-radius: 1px;
+ font-family: "Segoe UI", Arial;
+ font-weight: bold;
+ font-size: 12px;
+ height: 14px;
+ line-height: 14px;
+}
+.dhx_cal_event .dhx_body,
+.dhx_cal_event.dhx_cal_select_menu .dhx_body {
+ padding-bottom: 8px;
+ -webkit-border-bottom-right-radius: 1px;
+ -webkit-border-bottom-left-radius: 1px;
+ -moz-border-radius-bottomright: 1px;
+ -moz-border-radius-bottomleft: 1px;
+ border-bottom-right-radius: 1px;
+ border-bottom-left-radius: 1px;
+}
+.dhx_cal_event .dhx_header,
+.dhx_cal_event.dhx_cal_select_menu .dhx_footer {
+ display: none;
+}
+.dhx_cal_event .dhx_footer {
+ height: 15px;
+ border: 0;
+ background-color: transparent !important;
+ margin-top: -11px;
+}
+.dhx_cal_event .dhx_footer:hover {
+ background: url(imgs_flat/resizing.png) no-repeat center center;
+}
+.dhx_cal_event .dhx_header,
+.dhx_cal_event .dhx_body,
+.dhx_cal_event .dhx_title {
+ background-color: #5B9BE0;
+ border-color: transparent;
+ color: white;
+}
+.dhx_cal_event .dhx_body,
+.dhx_cal_event.dhx_cal_select_menu .dhx_body {
+ border-bottom: 1px solid white;
+ border-bottom-left-radius: 2px;
+ border-bottom-right-radius: 2px;
+}
+.dhx_cal_event.dhx_cal_editor {
+ border: 1px solid transparent;
+}
+.dhx_cal_editor {
+ font-size: 12px;
+ font-family: "Segoe UI", Arial;
+}
+div.dhx_menu_head,
+div.dhx_menu_icon {
+ background-image: url(imgs_flat/controls.png);
+}
+.dhx_cal_event_line {
+ border: 1px solid transparent;
+ background-color: #5B9BE0;
+ color: #FFF;
+ height: 17px;
+ line-height: 17px;
+ -webkit-border-radius: 1px;
+ -moz-border-radius: 1px;
+ border-radius: 1px;
+}
+.dhx_cal_event_line:hover div {
+ background: url(imgs_flat/resize_dots.png) repeat-y;
+}
+.dhx_cal_event_line_start {
+ -webkit-border-top-left-radius: 1px;
+ -webkit-border-bottom-left-radius: 1px;
+ -moz-border-radius-topleft: 1px;
+ -moz-border-radius-bottomleft: 1px;
+ border-top-left-radius: 1px;
+ border-bottom-left-radius: 1px;
+}
+.dhx_cal_event_line_end {
+ -webkit-border-top-right-radius: 1px;
+ -webkit-border-bottom-right-radius: 1px;
+ -moz-border-radius-topright: 1px;
+ -moz-border-radius-bottomright: 1px;
+ border-top-right-radius: 1px;
+ border-bottom-right-radius: 1px;
+}
+.dhx_cal_event .dhx_body,
+.dhx_cal_event_line {
+ font-size: 12px;
+ font-family: "Segoe UI", Arial;
+}
+.dhx_cal_event:hover .dhx_footer {
+ background: url(imgs_flat/resizing.png) no-repeat center center;
+}
+/* event end */
+/* scales, containers start */
+.dhx_cal_container {
+ background-color: white;
+ font-family: "Segoe UI", Arial;
+}
+.dhx_cal_data {
+ border-top: 1px solid #CECECE;
+}
+.dhx_scale_holder {
+ background-image: url(imgs_flat/databg.png);
+ border-right: 1px solid #CECECE;
+}
+.dhx_scale_holder_now {
+ background-image: url(imgs_flat/databg_now.png);
+ border-right: 1px solid #CECECE;
+}
+.dhx_scale_hour {
+ border-bottom: 1px solid #CECECE;
+ background-color: white;
+ font: 11px/44px Arial;
+ font-family: "Segoe UI", Arial;
+ font-weight: lighter;
+ color: #767676;
+}
+.dhx_scale_h {
+ display: inline-block;
+ font-size: 22px;
+}
+.dhx_scale_m {
+ display: inline-block;
+ font-size: 11px;
+ line-height: 35px;
+ vertical-align: top;
+}
+.dhx_cal_header {
+ border: 1px solid #CECECE;
+ border-left: 0;
+ border-bottom: 0;
+}
+.dhx_scale_bar {
+ border-left: 1px solid #CECECE;
+ font: 12px/16px "Segoe UI", Arial;
+ color: #767676;
+ line-height: 30px;
+ padding-top: 2px;
+ background-color: white;
+}
+.dhx_scale_bar > a {
+ color: #5780AD;
+ text-decoration: none;
+}
+.dhx_scale_bar > a:hover {
+ text-decoration: underline;
+}
+.dhx_month_head > a {
+ color: #5780AD;
+ text-decoration: none;
+}
+.dhx_month_head > a:hover {
+ text-decoration: underline;
+}
+/* scales, containers end */
+/* navigation start */
+.dhx_cal_navline div {
+ top: 14px;
+}
+.dhx_cal_tab,
+.dhx_cal_date,
+.dhx_cal_today_button,
+.dhx_cal_prev_button,
+.dhx_cal_next_button {
+ -webkit-border-radius: 0px;
+ -moz-border-radius: 0px;
+ border-radius: 0px;
+ border: none;
+ color: #454544;
+ height: 30px;
+ line-height: 30px;
+ background: none;
+ font-family: "Segoe UI", Arial;
+ font-weight: lighter;
+}
+.dhx_cal_navline .dhx_cal_date {
+ border: 0;
+ color: #454544;
+ font-family: "Segoe UI", Arial;
+ font-weight: lighter;
+ font-size: 22px;
+ text-align: center;
+ top: 14px;
+ position: absolute;
+ left: 0;
+ width: 100%;
+ z-index: -1;
+}
+.dhx_cal_today_button {
+ background: none;
+ color: #5780AD;
+ font-size: 13px;
+ font-weight: bolder;
+ left: auto;
+ right: 123px;
+ text-decoration: none;
+ width: 80px;
+}
+.dhx_cal_prev_button,
+.dhx_cal_next_button {
+ left: auto;
+ width: 46px;
+}
+.dhx_cal_prev_button {
+ right: 61px;
+ background: url(imgs_flat/arrow_left.png) no-repeat center center;
+}
+.dhx_cal_next_button {
+ right: 14px;
+ background: url(imgs_flat/arrow_right.png) no-repeat center center;
+}
+.dhx_cal_tab {
+ color: #5780AD;
+ font-size: 13px;
+ font-weight: bolder;
+ padding-top: 0;
+ text-decoration: none;
+ width: 60px;
+}
+.dhx_cal_tab:hover,
+.dhx_cal_today_button:hover {
+ text-decoration: underline;
+}
+.dhx_cal_tab.active {
+ background-color: #5780AD;
+ border: none;
+ color: #FFFFFF;
+ font-family: "Segoe UI", Arial;
+ font-weight: lighter;
+ text-decoration: none;
+}
+.dhx_cal_tab_standalone {
+ padding: 0 5px;
+}
+.dhx_multi_day,
+.dhx_multi_day_icon_small,
+.dhx_multi_day_icon {
+ background-color: white;
+}
+.dhx_multi_day {
+ border-top: 1px solid #CECECE;
+}
+.dhx_multi_day_icon,
+.dhx_multi_day_icon_small {
+ border-bottom: 1px solid #CECECE;
+ border-right: 1px solid #CECECE;
+}
+.dhx_multi_day_icon_small {
+ background-image: url(imgs_flat/clock.png);
+}
+.dhx_multi_day_icon {
+ background-image: url(imgs_flat/clock_big.gif);
+}
+/* navigation end */
+/* month view start */
+.dhx_month_head,
+.dhx_after .dhx_month_head,
+.dhx_before .dhx_month_head,
+.dhx_after .dhx_month_body,
+.dhx_before .dhx_month_body {
+ background-color: white;
+}
+.dhx_month_head {
+ height: 21px;
+ padding-top: 0;
+ font: 12px/21px "Segoe UI", Arial;
+ color: #5780AD;
+ border-right: 1px solid #CECECE;
+}
+.dhx_after .dhx_month_head,
+.dhx_before .dhx_month_head,
+.dhx_after .dhx_month_head,
+.dhx_before .dhx_month_head {
+ color: #bbbbbb;
+}
+.dhx_month_body {
+ border-right: 1px solid #CECECE;
+ border-bottom: 1px solid #CECECE;
+}
+.dhx_now .dhx_month_head,
+.dhx_now .dhx_month_body {
+ background-color: #FFF3A1;
+ font-weight: normal;
+}
+.dhx_cal_event_clear {
+ color: #0E64A0;
+}
+/* month view end */
+/* lightbox start */
+.dhx_cal_larea {
+ margin-left: 0;
+}
+.dhx_cal_light_wide .dhx_cal_larea {
+ margin-left: 3px;
+}
+.dhx_cal_light_wide .dhx_wrap_section {
+ padding: 5px 0;
+}
+.dhx_cal_light,
+.dhx_cal_larea,
+.dhx_cal_lsection,
+.dhx_wrap_section,
+.dhx_cal_light_wide .dhx_wrap_section,
+.dhx_cal_ltext textarea {
+ background-color: white;
+ font-family: "Segoe UI", Arial;
+}
+.dhx_cal_lsection,
+.dhx_cal_light_wide .dhx_cal_lsection .dhx_fullday,
+.dhx_cal_lsection .dhx_fullday,
+.dhx_cal_light input {
+ color: #747473;
+ font-family: "Segoe UI", Arial;
+}
+.dhx_cal_light_wide .dhx_wrap_section {
+ border-top: 0;
+ border-bottom: 1px solid #CECECE;
+}
+.dhx_cal_larea {
+ border: 1px solid transparent;
+}
+.dhx_cal_ltext textarea,
+.dhx_cal_light select,
+.dhx_cal_light {
+ color: #2E2E2E;
+}
+.dhx_cal_light {
+ border: none;
+ -webkit-border-radius: 0px;
+ -moz-border-radius: 0px;
+ border-radius: 0px;
+}
+.dhx_cal_light_wide .dhx_cal_lsection,
+.dhx_cal_light_wide .dhx_cal_lsection .dhx_fullday {
+ font-family: "Segoe UI", Arial;
+ font-size: 13px;
+ font-weight: bold;
+}
+.dhx_section_time {
+ background-color: transparent;
+}
+.dhx_save_btn,
+.dhx_cancel_btn,
+.dhx_delete_btn,
+.dhx_btn_set div:first-child {
+ display: none;
+}
+.dhx_btn_set,
+.dhx_btn_set div {
+ height: 30px;
+ padding: 0 20px;
+ line-height: 30px;
+}
+.dhx_btn_set {
+ margin: 12px 0 0 0;
+ padding: 0;
+ font-size: 13px;
+ color: #454544;
+ font-weight: normal;
+ -webkit-border-radius: 0px;
+ -moz-border-radius: 0px;
+ border-radius: 0px;
+}
+.dhx_left_btn_set {
+ margin-left: 20px;
+}
+.dhx_right_btn_set {
+ margin-right: 20px;
+}
+.dhx_save_btn_set {
+ border: none;
+ color: #FFF;
+ background-color: #5B9BE0;
+}
+.dhx_cancel_btn_set {
+ background-color: #FE7510;
+ color: #FFF;
+}
+.dhx_delete_btn_set {
+ border: 1px solid #A4A4A4;
+ color: #747473;
+}
+.dhx_cal_ltitle {
+ height: 30px;
+ line-height: 30px;
+ border-bottom: 1px solid #CECECE;
+}
+.dhx_cal_ltitle span {
+ float: left;
+}
+.dhx_cal_light .dhx_title {
+ font-size: 13px;
+ padding-left: 13px;
+}
+.dhx_mark {
+ display: none;
+}
+.dhx_time {
+ font-size: 12px;
+ padding-left: 10px;
+}
+.dhx_close_icon {
+ float: right;
+ width: 9px;
+ height: 9px;
+ background: url(imgs_flat/close_icon.png) no-repeat center center;
+ padding: 10px;
+ margin-top: 1px;
+}
+.dhx_cal_light_wide .dhx_cal_ltext.dhx_cal_template {
+ line-height: 22px;
+}
+.dhx_cal_ltext textarea {
+ line-height: 20px;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ border: 1px solid #CECECE;
+ background-color: #F9F9F9;
+}
+/* lightbox end */
+/* modal box */
+.dhtmlx_modal_box {
+ border: none;
+ -webkit-border-radius: 0px;
+ -moz-border-radius: 0px;
+ border-radius: 0px;
+ background: white;
+ font-family: "Segoe UI", Arial;
+ width: 330px;
+}
+.dhtmlx_popup_text {
+ font-size: 16px;
+}
+.dhtmlx_popup_controls {
+ padding-bottom: 9px;
+}
+.dhtmlx_popup_button,
+.dhtmlx_popup_button:active,
+.dhtmlx_popup_button div,
+.dhtmlx_popup_button div:active {
+ color: #444;
+ background: white;
+ box-shadow: none;
+ border: none;
+ -webkit-border-radius: 0px;
+ -moz-border-radius: 0px;
+ border-radius: 0px;
+}
+.dhtmlx_popup_button.dhtmlx_ok_button {
+ border: none;
+ background-color: #5B9BE0;
+}
+.dhtmlx_popup_button.dhtmlx_ok_button div {
+ background: #5B9BE0;
+ border: none;
+ color: #FFF;
+}
+.dhtmlx_popup_button.dhtmlx_cancel_button {
+ border: none;
+ background-color: #FE7510;
+}
+.dhtmlx_popup_button.dhtmlx_cancel_button div {
+ background: #FE7510;
+ border: none;
+ color: #FFF;
+}
+/* mobdal box end */
+/* minicalendar */
+.dhx_cal_container.dhx_mini_calendar {
+ box-sizing: border-box;
+ border: none;
+ box-shadow: 0px 2px 10px 0px #AAA;
+ border-radius: 0px;
+}
+.dhx_mini_calendar .dhx_year_month {
+ border: 1px solid #CECECE;
+ font-family: "Segoe UI", Arial;
+}
+.dhx_mini_calendar .dhx_month_head,
+.dhx_mini_calendar .dhx_year_month,
+.dhx_mini_calendar .dhx_month_body,
+.dhx_mini_calendar .dhx_scale_bar,
+.dhx_mini_calendar .dhx_year_body {
+ border-color: transparent;
+}
+.dhx_mini_calendar .dhx_year_body {
+ padding-top: 1px;
+}
+.dhx_mini_calendar .dhx_scale_bar {
+ border-width: 0;
+}
+.dhx_mini_calendar .dhx_year_week {
+ border-bottom: 1px solid #CECECE;
+ padding-top: 1px;
+}
+.dhx_mini_calendar .dhx_month_head {
+ padding-right: 0;
+ margin-right: 1px;
+ text-align: center;
+}
+.dhx_mini_calendar .dhx_cal_prev_button,
+.dhx_mini_calendar .dhx_cal_next_button {
+ border: 0;
+ height: 20px;
+}
+/* minicalendar end */
+.dhx_cal_navline div.dhx_minical_icon {
+ left: 210px;
+ top: 14px;
+ width: 30px;
+ height: 30px;
+ background: url(imgs_flat/calendar.gif) no-repeat;
+ background-position: 3px 5px;
+}
+/* timeline */
+.dhx_cal_event_line .dhx_event_resize {
+ background: none;
+}
+.dhx_cal_event_line .dhx_event_resize:hover {
+ background: url(imgs_flat/resize_dots.png) repeat-y;
+}
+.dhx_matrix_scell,
+.dhx_matrix_cell {
+ border-bottom: 1px solid #CECECE;
+ border-right: 1px solid #CECECE;
+}
+.dhx_cal_header div div {
+ border-left: 1px solid #CECECE;
+}
+.dhx_matrix_scell {
+ font-size: 13px;
+}
+.dhx_matrix_scell.folder {
+ border-right: 0;
+}
+.dhx_second_scale_bar {
+ border-bottom: 1px solid #CECECE;
+}
+/* timeline end */
+/* recurring */
+.dhx_repeat_divider {
+ border-left: 1px solid #CECECE;
+}
+.dhx_custom_button {
+ background-color: white;
+ border: 1px solid #CECECE;
+ color: #747473;
+}
+.dhx_cal_light_wide .dhx_custom_button {
+ margin-top: 6px;
+}
+.dhx_custom_button_recurring {
+ background-image: url(imgs_flat/but_repeat.gif);
+}
+.dhx_form_repeat {
+ background-color: transparent;
+}
+/* recurring end */
+/* agenda */
+.dhx_v_border,
+.dhx_agenda_line div {
+ border-right: 1px solid #CECECE;
+}
+.dhx_cal_header .dhx_agenda_line {
+ height: 100%;
+ line-height: 35px;
+}
+.dhx_cal_header .dhx_agenda_line div {
+ height: 100%;
+ line-height: 35px;
+}
+/* agenda end */
+/* year */
+.dhx_year_month {
+ border: 1px solid #CECECE;
+}
+.dhx_scale_bar_last {
+ border-right: 1px solid #CECECE;
+}
+.dhx_year_body {
+ border-left: 1px solid #CECECE;
+}
+/* year end */
+/* expand */
+.dhx_expand_icon {
+ top: -3px;
+}
+/* expand end */
+/* units view */
+.dhx_scale_bar .dhx_cal_next_button,
+.dhx_scale_bar .dhx_cal_prev_button {
+ width: 20px;
+ height: 100%;
+ top: 0px !important;
+ border: 0;
+}
+.dhx_scale_bar .dhx_cal_next_button {
+ right: 1px !important;
+ border-left: 1px solid #CECECE;
+}
+.dhx_scale_bar .dhx_cal_prev_button {
+ left: 1px !important;
+ border-right: 1px solid #CECECE;
+}
+/* units view end */
+/* map view */
+.dhx_map_line .headline_date,
+.dhx_map_line .headline_description {
+ border: 0;
+}
+.dhx_map_line .headline_date {
+ border-right: 1px solid #CECECE;
+}
+.dhx_cal_header .dhx_map_line {
+ height: 100%;
+}
+.dhx_cal_header .dhx_map_line .headline_date,
+.dhx_cal_header .dhx_map_line .headline_description {
+ height: 100%;
+ line-height: 35px;
+}
+/* map view end */
+/* tooltip start */
+.dhtmlXTooltip.tooltip {
+ border-left: 1px solid #CECECE;
+ border-top: 1px solid #CECECE;
+ color: #747473;
+ font-size: 12px;
+ line-height: 16px;
+}
+/* tooltip end */
+/* week agenda start */
+.dhx_wa_scale_bar {
+ border-top: 1px solid #CECECE;
+ border-bottom: 1px solid #CECECE;
+}
+.dhx_wa_column_last .dhx_wa_day_cont {
+ border-left: 1px solid #CECECE;
+}
+.dhx_wa_ev_body {
+ border-bottom: 1px solid #CECECE;
+}
+.dhx_wa_scale_bar {
+ background-color: #f0ede7;
+}
+.dhx_wa_ev_body.dhx_cal_event_selected {
+ background-color: #fff3a1;
+ color: #362d26;
+}
+.dhx_wa_dnd {
+ background-color: #fddb93 !important;
+ color: #747473 !important;
+ border: 1px solid #ccb177;
+}
+/* week agenda end */
+/* readonly start */
+.dhx_text_disabled {
+ color: #2E2E2E;
+}
+.dhx_cal_ltext .dhx_text_disabled {
+ line-height: 22px;
+}
+/* readonly end */
+/* grid view start */
+.dhx_grid_v_border {
+ border-right-color: #CECECE;
+}
+.dhx_cal_header .dhx_grid_line,
+.dhx_cal_header .dhx_grid_line div {
+ height: 100%;
+ line-height: 35px;
+}
+/* grid view end*/
+/* left border support */
+.dhx_scale_hour_border,
+.dhx_month_body_border,
+.dhx_scale_bar_border,
+.dhx_month_head_border {
+ border-left: 1px solid #CECECE;
+}
+.dhx_cal_quick_info {
+ background: rgba(204, 204, 204, 0.8);
+ border: none;
+ -webkit-border-radius: 0px;
+ -moz-border-radius: 0px;
+ border-radius: 0px;
+ font-family: "Segoe UI", Arial;
+ width: 280px;
+}
+.dhx_cal_qi_title {
+ color: #000;
+}
+.dhx_cal_qi_tdate {
+ color: #444;
+}
+.dhx_cal_qi_content {
+ background: none;
+ border: none;
+ padding: 10px 8px;
+}
+.dhx_qi_big_icon {
+ -webkit-border-radius: 0px;
+ -moz-border-radius: 0px;
+ border-radius: 0px;
+ border: none;
+ color: #FFF;
+ float: none;
+ font-size: 13px;
+}
+.dhx_qi_big_icon .dhx_menu_icon {
+ display: none !important;
+}
+.dhx_cal_quick_info .icon_details {
+ background: #5B9BE0;
+ margin-left: 100px;
+}
+.dhx_cal_quick_info .icon_details div {
+ padding-left: 12px;
+}
+.dhx_cal_quick_info .icon_delete {
+ background: #FE7510;
+}
+.dhx_cal_quick_info .icon_delete div {
+ padding-left: 12px;
+}
+/* export to PDF and iCal buttons start */
+.dhx_cal_navline .dhx_cal_export {
+ width: 32px;
+ height: 32px;
+ margin: 2px;
+ cursor: pointer;
+ top: 12px;
+}
+.dhx_cal_navline .dhx_cal_export.pdf {
+ left: auto;
+ right: 249px;
+ background-image: url('imgs_flat/export_pdf.png');
+}
+.dhx_cal_navline .dhx_cal_export.ical {
+ left: auto;
+ right: 210px;
+ background-image: url('imgs_flat/export_ical.png');
+}
+/* export to PDF and iCal buttons end */
+/* minicalendar */
+.dhx_mini_calendar {
+ font-family: "Segoe UI", Arial;
+ padding: 5px;
+}
+.dhx_mini_calendar .dhx_year_event,
+.dhx_mini_calendar .dhx_calendar_click {
+ border-radius: 0px;
+}
+.dhx_mini_calendar .dhx_month_head {
+ color: #363636;
+ font-family: "Segoe UI", Arial;
+ font-size: 13px;
+ margin: 2px 2px;
+}
+.dhx_mini_calendar .dhx_year_month {
+ color: #454544;
+ line-height: 20px;
+ height: 25px;
+ font-size: 20px;
+ font-weight: lighter;
+}
+.dhx_mini_calendar .dhx_cal_prev_button {
+ top: 8px !important;
+}
+.dhx_mini_calendar .dhx_cal_next_button {
+ top: 8px !important;
+}
+.dhx_mini_calendar .dhx_scale_bar {
+ font-family: "Segoe UI", Arial;
+ font-size: 11px;
+}
diff --git a/codebase/sources/skins/dhtmlxscheduler_glossy.css b/codebase/sources/skins/dhtmlxscheduler_glossy.css
new file mode 100644
index 0000000..1bd718c
--- /dev/null
+++ b/codebase/sources/skins/dhtmlxscheduler_glossy.css
@@ -0,0 +1,1882 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+.dhtmlx_message_area {
+ position: fixed;
+ right: 5px;
+ width: 250px;
+ z-index: 1000;
+}
+.dhtmlx-info {
+ min-width: 120px;
+ padding: 4px 4px 4px 20px;
+ font-family: Tahoma;
+ z-index: 10000;
+ overflow: hidden;
+ margin: 5px;
+ margin-bottom: 10px;
+ -webkit-transition: all .5s ease;
+ -moz-transition: all .5s ease;
+ -o-transition: all .5s ease;
+ transition: all .5s ease;
+}
+.dhtmlx-info.hidden {
+ height: 0px;
+ padding: 0px;
+ border-width: 0px;
+ margin: 0px;
+ overflow: hidden;
+}
+.dhtmlx_modal_box {
+ overflow: hidden;
+ display: inline-block;
+ min-width: 300px;
+ width: 300px;
+ text-align: center;
+ position: fixed;
+ background-color: #fff;
+ background: -webkit-linear-gradient(top, #ffffff 1%, #d0d0d0 99%);
+ background: -moz-linear-gradient(top, #ffffff 1%, #d0d0d0 99%);
+ box-shadow: 0px 0px 14px #888;
+ font-family: Tahoma;
+ z-index: 20000;
+ border-radius: 6px;
+ border: 1px solid #ffffff;
+}
+.dhtmlx_popup_title {
+ border-top-left-radius: 5px;
+ border-top-right-radius: 5px;
+ border-width: 0px;
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAoCAMAAAAIaGBFAAAAhFBMVEVwcHBubm5sbGxqampoaGhmZmZlZWVjY2NhYWFfX19dXV1bW1taWlpYWFhWVlZUVFRSUlJRUVFPT09NTU1LS0tJSUlHR0dGRkZERERCQkJAQEA+Pj49PT09PT0+Pj5AQEBBQUFDQ0NERERGRkZHR0dJSUlKSkpMTExMTEw5OTk5OTk5OTkny8YEAAAAQklEQVQImQXBCRJCAAAAwKVSQqdyjSPXNP7/QLsIhA6OTiJnF7GrRCpzc/fw9PKW+/gqlCq1RqvTG/yMJrPF6m/bAVEhAxxnHG0oAAAAAElFTkSuQmCC);
+ background-image: -webkit-linear-gradient(top, #707070 1%, #3d3d3d 70%, #4c4c4c 97%, #393939 97%);
+ background-image: -moz-linear-gradient(top, #707070 1%, #3d3d3d 70%, #4c4c4c 97%, #393939 97%);
+}
+.dhtmlx-info,
+.dhtmlx_popup_button,
+.dhtmlx_button {
+ user-select: none;
+ -webkit-user-select: none;
+ -moz-user-select: -moz-none;
+ cursor: pointer;
+}
+.dhtmlx_popup_text {
+ overflow: hidden;
+}
+.dhtmlx_popup_controls {
+ border-radius: 6px;
+ padding: 5px;
+}
+.dhtmlx_popup_button,
+.dhtmlx_button {
+ height: 30px;
+ line-height: 30px;
+ display: inline-block;
+ margin: 0 5px;
+ border-radius: 6px;
+ color: #FFF;
+}
+.dhtmlx_popup_button {
+ min-width: 120px;
+}
+div.dhx_modal_cover {
+ background-color: #000;
+ cursor: default;
+ filter: alpha(opacity=20);
+ opacity: 0.2;
+ position: fixed;
+ z-index: 19999;
+ left: 0px;
+ top: 0px;
+ width: 100%;
+ height: 100%;
+ border: none;
+ zoom: 1;
+}
+.dhtmlx-info img,
+.dhtmlx_modal_box img {
+ float: left;
+ margin-right: 20px;
+}
+.dhtmlx-alert-error .dhtmlx_popup_title,
+.dhtmlx-confirm-error .dhtmlx_popup_title {
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAsCAIAAAArRUU2AAAATklEQVR4nIWLuw2AMBBDjVuQiBT2oWbRDATrnB0KQOJoqPzRe3BrHI6dcBASYREKovtK6/6DsDOX+stN+3H1YX9ciRgnYq5EWYhS2dftBIuLT4JyIrPCAAAAAElFTkSuQmCC);
+}
+.dhtmlx-alert-error,
+.dhtmlx-confirm-error {
+ border: 1px solid #ff0000;
+}
+/*Skin section*/
+.dhtmlx_button,
+.dhtmlx_popup_button {
+ box-shadow: 0px 0px 4px #888;
+ border: 1px solid #838383;
+}
+.dhtmlx_button input,
+.dhtmlx_popup_button div {
+ border: 1px solid #FFF;
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAeCAMAAADaS4T1AAAAYFBMVEVwcHBtbW1ra2toaGhmZmZjY2NhYWFeXl5cXFxaWlpXV1dVVVVSUlJQUFBNTU1LS0tJSUlGRkZERERBQUE/Pz88PDw9PT0+Pj5AQEBCQkJDQ0NFRUVHR0dISEhKSkpMTEzqthaMAAAAMklEQVQImQXBhQ2AMAAAsOIMlwWH/8+kRSKVyRVKlVrQaHV6g9FktlhFm93hdLk9Xt8PIfgBvdUqyskAAAAASUVORK5CYII=);
+ background-image: -webkit-linear-gradient(top, #707070 1%, #3d3d3d 70%, #4c4c4c 99%);
+ background-image: -moz-linear-gradient(top, #707070 1%, #3d3d3d 70%, #4c4c4c 99%);
+ border-radius: 6px;
+ font-size: 15px;
+ font-weight: normal;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ color: #fff;
+ padding: 0px;
+ margin: 0px;
+ vertical-align: top;
+ height: 28px;
+ line-height: 28px;
+}
+.dhtmlx_button input:focus,
+.dhtmlx_button input:active,
+.dhtmlx_popup_button div:active,
+.dhtmlx_popup_button div:focus {
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAeCAMAAADaS4T1AAAAXVBMVEVwcHBubm5tbW1sbGxra2tpaWloaGhnZ2dmZmZlZWVjY2NiYmJhYWFgYGBfX19dXV1cXFxbW1taWlpZWVlXV1dWVlZVVVVUVFRTU1NRUVFQUFBPT09OTk5NTU1LS0tT9SY0AAAAMUlEQVQImQXBhQGAMAAAIGxnx2z9/00BiVQmVyhVakGj1ekNRpPZYhVtdofT5fZ4fT8hpwG05JjexgAAAABJRU5ErkJggg==);
+ background-image: -webkit-linear-gradient(top, #707070 1%, #4c4c4c 99%);
+ background-image: -moz-linear-gradient(top, #707070 1%, #4c4c4c 99%);
+}
+.dhtmlx_popup_title {
+ color: #fff;
+ text-shadow: 1px 1px #000;
+ height: 40px;
+ line-height: 40px;
+ font-size: 20px;
+}
+.dhtmlx_popup_text {
+ margin: 15px 15px 5px 15px;
+ font-size: 14px;
+ color: #000;
+ min-height: 30px;
+ border-radius: 6px;
+}
+.dhtmlx-info,
+.dhtmlx-error {
+ font-size: 14px;
+ color: #000;
+ box-shadow: 0px 0px 10px #888;
+ padding: 0px;
+ background-color: #FFF;
+ border-radius: 3px;
+ border: 1px solid #ffffff;
+}
+.dhtmlx-info div {
+ padding: 5px 10px 5px 10px;
+ background-color: #fff;
+ border-radius: 3px;
+ border: 1px solid #B8B8B8;
+}
+.dhtmlx-error {
+ background-color: #d81b1b;
+ border: 1px solid #ff3c3c;
+ box-shadow: 0px 0px 10px #000;
+}
+.dhtmlx-error div {
+ background-color: #d81b1b;
+ border: 1px solid #940000;
+ color: #FFF;
+}
+.dhx_cal_event .dhx_header,
+.dhx_cal_event .dhx_title,
+.dhx_cal_event .dhx_body,
+.dhx_cal_event .dhx_footer {
+ background-color: #FFE763;
+ border: 1px solid #B7A543;
+ color: #887A2E;
+ overflow: hidden;
+ width: 100%;
+ font-family: Tahoma;
+ font-size: 8pt;
+}
+.dhx_move_denied .dhx_cal_event .dhx_header,
+.dhx_move_denied .dhx_cal_event .dhx_title {
+ cursor: default;
+}
+.dhx_cal_event .dhx_header {
+ height: 1px;
+ margin-left: 1px;
+ border-width: 1px 1px 0px 1px;
+ cursor: pointer;
+}
+.dhx_cal_event .dhx_title {
+ height: 12px;
+ border-width: 0px 1px 1px 1px;
+ border-bottom-style: dotted;
+ font-size: 7pt;
+ font-weight: bold;
+ text-align: center;
+ background-position: right;
+ background-repeat: no-repeat;
+ cursor: pointer;
+}
+.dhx_cal_event .dhx_body,
+.dhx_cal_event.dhx_cal_select_menu .dhx_body {
+ border-width: 0 1px 1px 1px;
+ padding: 5px;
+}
+.dhx_cal_event.dhx_cal_select_menu {
+ -webkit-box-shadow: 0 0 1px #FFF;
+ -moz-box-shadow: 0 0 1px #FFF;
+ box-shadow: 0 0 1px #FFF;
+}
+.dhx_resize_denied,
+.dhx_resize_denied .dhx_event_resize {
+ cursor: default !important;
+}
+.dhx_cal_event .dhx_event_resize {
+ cursor: s-resize;
+}
+.dhx_cal_event .dhx_footer,
+.dhx_cal_event .dhx_select_menu_footer {
+ height: 1px;
+ margin-left: 2px;
+ border-width: 0px 1px 1px 1px;
+ position: relative;
+}
+.dhx_cal_event_line {
+ background-color: #FFE763;
+ border: 1px solid #B7A543;
+ border-radius: 3px;
+ font-family: Tahoma;
+ font-size: 8pt;
+ height: 13px;
+ padding-left: 10px;
+ color: #887A2E;
+ cursor: pointer;
+ overflow: hidden;
+}
+.dhx_cal_event_clear {
+ font-family: Tahoma;
+ font-size: 8pt;
+ height: 13px;
+ padding-left: 2px;
+ color: #887A2E;
+ white-space: nowrap;
+ overflow: hidden;
+ cursor: pointer;
+}
+.dhx_in_move {
+ background-color: #FFFF80;
+}
+.dhx_cal_event.dhx_cal_editor {
+ border: 1px solid #B7A543;
+ border-top-style: dotted;
+ z-index: 999;
+ position: absolute;
+ overflow: hidden;
+}
+textarea.dhx_cal_editor {
+ width: 100%;
+ height: 100%;
+ border: 0 solid black;
+ margin: 0;
+ padding: 0;
+ overflow: auto;
+}
+div.dhx_menu_head {
+ background-image: url(imgs/controls.gif);
+ background-position: 0px -43px;
+ width: 10px;
+ height: 10px;
+ margin-left: 5px;
+ margin-top: 1px;
+ border: none;
+ cursor: default;
+}
+div.dhx_menu_icon {
+ background-image: url(imgs/controls.gif);
+ width: 20px;
+ height: 20px;
+ margin-left: -5px;
+ margin-top: 0px;
+ border: none;
+ cursor: pointer;
+}
+div.icon_details {
+ background-position: 0px 0px;
+}
+div.icon_edit {
+ background-position: -22px 0px;
+}
+div.icon_save {
+ background-position: -84px -1px;
+}
+div.icon_cancel {
+ background-position: -62px 0px;
+}
+div.icon_delete {
+ background-position: -42px 0px;
+}
+/*view more link in month view*/
+.dhx_month_link {
+ position: absolute;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ text-align: right;
+ cursor: pointer;
+ padding-right: 10px;
+}
+.dhx_month_link a {
+ color: blue;
+}
+.dhx_month_link a:hover {
+ text-decoration: underline;
+}
+.dhx_global_tip {
+ font-family: Tahoma, Helvetica;
+ text-align: center;
+ font-size: 20px;
+ position: fixed;
+ top: 60px;
+ right: 20px;
+ background-color: rgba(255, 255, 255, 0.7);
+ color: #000;
+ z-index: 10000;
+ padding: 20px 30px;
+ width: 190px;
+}
+.dhx_global_tip div {
+ font-size: 30px;
+}
+@media (-moz-touch-enabled) {
+ .dhx_cal_container {
+ user-select: none;
+ -moz-user-select: none;
+ }
+}
+.dhx_unselectable,
+.dhx_unselectable div {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.dhx_cal_light {
+ -webkit-tap-highlight-color: transparent;
+ background-color: #FFE763;
+ border-radius: 5px;
+ font-family: Tahoma;
+ font-size: 8pt;
+ border: 1px solid #B7A64B;
+ color: #887A2E;
+ position: absolute;
+ z-index: 10001;
+ width: 580px;
+ height: 300px;
+ box-shadow: 5px 5px 5px #888;
+}
+.dhx_cal_light_wide {
+ width: 650px;
+}
+.dhx_mark {
+ position: relative;
+ top: 3px;
+ background-image: url('imgs/controls.gif');
+ background-position: 0px -43px;
+ padding-left: 10px;
+}
+.dhx_ie6 .dhx_mark {
+ background-position: 6px -41px;
+}
+.dhx_cal_light select {
+ font-family: Tahoma;
+ font-size: 8pt;
+ color: #887A2E;
+ padding: 2px;
+ margin: 0px;
+}
+.dhx_cal_ltitle {
+ padding: 2px 0px 2px 5px;
+ overflow: hidden;
+ white-space: nowrap;
+}
+.dhx_cal_ltitle span {
+ white-space: nowrap;
+}
+.dhx_cal_lsection {
+ background-color: #DBCF8C;
+ color: #FFF4B5;
+ font-weight: bold;
+ padding: 5px 0px 3px 10px;
+}
+.dhx_section_time {
+ background-color: #DBCF8C;
+ white-space: nowrap;
+}
+.dhx_cal_lsection .dhx_fullday {
+ float: right;
+ margin-right: 5px;
+ color: #887A2E;
+ font-size: 12px;
+ font-weight: normal;
+ line-height: 20px;
+ vertical-align: top;
+ cursor: pointer;
+}
+.dhx_cal_lsection {
+ font-size: 18px;
+ font-family: Arial;
+}
+.dhx_cal_ltext {
+ padding: 2px 0px 2px 10px;
+ overflow: hidden;
+}
+.dhx_cal_ltext textarea {
+ background-color: #FFF4B5;
+ /* #FFF4B5; should be the same for dhx_cal_larea, was transperent */
+ overflow: auto;
+ border: none;
+ color: #887A2E;
+ height: 100%;
+ width: 100%;
+ outline: none !important;
+ resize: none;
+}
+.dhx_time {
+ font-weight: bold;
+}
+.dhx_cal_light .dhx_title {
+ padding-left: 10px;
+}
+.dhx_cal_larea {
+ border: 1px solid #DCC43E;
+ background-color: #FFF4B5;
+ overflow: hidden;
+ margin-left: 3px;
+ width: 572px;
+ height: 1px;
+}
+.dhx_btn_set {
+ padding: 5px 10px 0px 10px;
+ float: left;
+}
+.dhx_btn_set div {
+ float: left;
+ height: 21px;
+ line-height: 21px;
+ vertical-align: middle;
+ cursor: pointer;
+}
+.dhx_save_btn {
+ background-image: url('imgs/controls.gif');
+ background-position: -84px 0px;
+ width: 21px;
+}
+.dhx_cancel_btn {
+ background-image: url('imgs/controls.gif');
+ background-position: -63px 0px;
+ width: 20px;
+}
+.dhx_delete_btn {
+ background-image: url('imgs/controls.gif');
+ background-position: -42px 0px;
+ width: 20px;
+}
+.dhx_cal_cover {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ z-index: 10000;
+ top: 0px;
+ left: 0px;
+ background-color: black;
+ opacity: 0.1;
+ filter: alpha(opacity=10);
+}
+.dhx_custom_button {
+ padding: 0px 3px 0px 3px;
+ color: #887A2E;
+ font-family: Tahoma;
+ font-size: 8pt;
+ background-color: #FFE763;
+ font-weight: normal;
+ margin-right: 5px;
+ margin-top: 0px;
+ cursor: pointer;
+}
+.dhx_custom_button div {
+ cursor: pointer;
+ float: left;
+ height: 21px;
+ line-height: 21px;
+ vertical-align: middle;
+}
+.dhx_cal_light_wide .dhx_cal_larea {
+ border-top-width: 0px;
+}
+.dhx_cal_light_wide .dhx_cal_lsection {
+ border: 0px;
+ float: left;
+ text-align: right;
+ width: 100px;
+ height: 20px;
+ font-size: 16px;
+ padding: 5px 0px 0px 10px;
+}
+.dhx_cal_light_wide .dhx_wrap_section {
+ border-top: 1px solid #DBCF8C;
+ position: relative;
+ background-color: #DBCF8C;
+ overflow: hidden;
+}
+.dhx_cal_light_wide .dhx_section_time {
+ padding-top: 2px !important;
+ height: 20px !important;
+}
+.dhx_section_time {
+ text-align: center;
+}
+.dhx_cal_light_wide .dhx_cal_larea {
+ width: 730px;
+}
+.dhx_cal_light_wide {
+ width: 738px;
+}
+.dhx_cal_light_wide .dhx_section_time {
+ background: transparent;
+}
+.dhx_cal_light_wide .dhx_cal_checkbox label {
+ padding-left: 0px;
+}
+.dhx_cal_wide_checkbox input {
+ margin-top: 8px;
+ margin-left: 14px;
+}
+.dhx_cal_light input {
+ font-family: Tahoma;
+ font-size: 8pt;
+ color: #887A2E;
+}
+.dhx_cal_light_wide .dhx_cal_lsection .dhx_fullday {
+ float: none;
+ margin-right: 0px;
+ color: #FFF4B5;
+ font-weight: bold;
+ font-size: 16px;
+ font-family: Arial;
+ cursor: pointer;
+}
+.dhx_custom_button {
+ float: right;
+ height: 21px;
+ width: 90px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ -ms-border-radius: 4px;
+ -o-border-radius: 4px;
+ border-radius: 4px;
+}
+.dhx_cal_light_wide .dhx_custom_button {
+ position: absolute;
+ top: 0;
+ right: 0;
+ margin-top: 2px;
+}
+.dhx_cal_light_wide .dhx_repeat_right {
+ margin-right: 55px;
+}
+.dhx_minical_popup {
+ position: absolute;
+ z-index: 10100;
+ width: 251px;
+ height: 175px;
+}
+.dhx_scale_bar_header {
+ position: absolute;
+ border-bottom: 1px dotted #8894A3;
+ width: 100%;
+}
+.dhx_expand_icon {
+ position: absolute;
+ top: 0px;
+ right: 0px;
+ background-image: url(imgs/collapse_expand_icon.gif);
+ width: 18px;
+ height: 18px;
+ cursor: pointer;
+ background-position: 0px 18px;
+ z-index: 16;
+}
+.dhx_scheduler_agenda .dhx_cal_data {
+ background-image: url(imgs/databg.png);
+}
+.dhx_agenda_area {
+ width: 100%;
+ overflow-y: auto;
+ background-image: url(imgs/databg.png);
+}
+.dhx_agenda_line {
+ height: 21px;
+ clear: both;
+ overflow: hidden;
+}
+.dhx_agenda_line div {
+ float: left;
+ width: 188px;
+ border-right: 1px dotted #8894A3;
+ text-align: center;
+ line-height: 21px;
+ overflow: hidden;
+}
+.dhx_agenda_area .dhx_agenda_line div {
+ border-right: 0px dotted #8894A3;
+}
+.dhx_v_border {
+ position: absolute;
+ left: 187px;
+ top: 0;
+ border-right: 1px dotted #8894A3;
+ width: 1px;
+ height: 100%;
+}
+.dhx_agenda_line .dhx_event_icon {
+ width: 20px;
+ border-width: 0px;
+ background: url(imgs/icon.png) no-repeat;
+ background-position: 5px 4px;
+ cursor: pointer;
+}
+.dhx_agenda_line span {
+ padding-left: 5px;
+ line-height: 21px;
+}
+.dhx_year_body {
+ border-left: 1px dotted #586A7E;
+}
+.dhx_year_week {
+ position: relative;
+}
+.dhx_scale_bar_last {
+ border-right: 1px dotted #586A7E;
+}
+.dhx_year_month {
+ height: 18px;
+ padding-top: 3px;
+ border: 1px dotted #586A7E;
+ text-align: center;
+ vertical-align: middle;
+}
+.dhx_year_body .dhx_before .dhx_month_head,
+.dhx_year_body .dhx_after .dhx_month_head,
+.dhx_year_body .dhx_before .dhx_month_head a,
+.dhx_year_body .dhx_after .dhx_month_head a {
+ color: #E2E3E6 !important;
+}
+.dhx_year_body .dhx_month_body {
+ height: 0px;
+ overflow: hidden;
+}
+.dhx_month_head.dhx_year_event {
+ background-color: #FFE763;
+}
+.dhx_year_body .dhx_before .dhx_month_head,
+.dhx_year_body .dhx_after .dhx_month_head {
+ cursor: default;
+}
+.dhx_year_tooltip {
+ border: 1px solid #BBBBBB;
+ background-image: url(imgs/databg.png);
+ position: absolute;
+ z-index: 9998;
+ width: 300px;
+ height: auto;
+ font-family: Tahoma;
+ font-size: 8pt;
+ overflow: hidden;
+}
+.dhx_tooltip_line {
+ line-height: 20px;
+ height: 20px;
+ overflow: hidden;
+}
+.dhx_tooltip_line .dhx_event_icon {
+ width: 20px;
+ height: 20px;
+ padding-right: 10px;
+ float: left;
+ border-width: 0px;
+ position: relative;
+ background: url(imgs/icon.png) no-repeat;
+ background-position: 5px 4px;
+ cursor: pointer;
+}
+.dhx_tooltip_date {
+ float: left;
+ width: auto;
+ padding-left: 5px;
+ text-align: center;
+}
+.dhx_text_disabled {
+ color: #887A2E;
+ font-family: Tahoma;
+ font-size: 8pt;
+}
+.dhx_mini_calendar {
+ -moz-box-shadow: 5px 5px 5px #888;
+ /*Doesn't work in IE*/
+ -khtml-box-shadow: 5px 5px 5px #888;
+ -moz-user-select: -moz-none;
+ -webkit-user-select: none;
+ -user-select: none;
+}
+.dhx_mini_calendar .dhx_month_head {
+ cursor: pointer;
+}
+.dhx_mini_calendar .dhx_calendar_click {
+ background-color: #C2D5FC;
+}
+.dhx_cal_navline div.dhx_minical_icon {
+ width: 18px;
+ height: 18px;
+ left: 190px;
+ top: 1px;
+ cursor: pointer;
+ background-image: url(imgs/calendar.gif);
+}
+.dhx_matrix_scell {
+ height: 100%;
+}
+.dhx_matrix_cell,
+.dhx_matrix_scell {
+ overflow: hidden;
+ text-align: center;
+ vertical-align: middle;
+ border-bottom: 1px dotted #8894A3;
+ border-right: 1px dotted #8894A3;
+}
+.dhx_matrix_cell {
+ background-color: white;
+}
+.dhx_matrix_line {
+ overflow: hidden;
+}
+.dhx_matrix_cell div,
+.dhx_matrix_scell div {
+ overflow: hidden;
+ text-align: center;
+ height: auto;
+}
+.dhx_cal_lsection .dhx_readonly {
+ font-size: 9pt;
+ font-size: 8pt;
+ padding: 2px;
+ color: #887A2E;
+}
+.dhx_cal_event_line .dhx_event_resize {
+ cursor: w-resize;
+ background: url(imgs/resize_dots.png) repeat-y;
+ position: absolute;
+ top: 0;
+ width: 4px;
+ height: 100%;
+}
+.dhx_event_resize_start {
+ left: 0;
+}
+.dhx_event_resize_end {
+ right: 0;
+}
+/* Tree view */
+.dhx_matrix_scell.folder,
+.dhx_data_table.folder .dhx_matrix_cell {
+ background-color: #969394;
+ cursor: pointer;
+}
+.dhx_matrix_scell .dhx_scell_level0 {
+ padding-left: 5px;
+}
+.dhx_matrix_scell .dhx_scell_level1 {
+ padding-left: 20px;
+}
+.dhx_matrix_scell .dhx_scell_level2 {
+ padding-left: 35px;
+}
+.dhx_matrix_scell .dhx_scell_level3 {
+ padding-left: 50px;
+}
+.dhx_matrix_scell .dhx_scell_level4 {
+ padding-left: 65px;
+}
+.dhx_matrix_scell.folder {
+ font-weight: bold;
+ text-align: left;
+}
+.dhx_matrix_scell.folder .dhx_scell_expand {
+ float: left;
+ width: 10px;
+ padding-right: 3px;
+}
+.dhx_matrix_scell.folder .dhx_scell_name {
+ float: left;
+ width: auto;
+}
+.dhx_matrix_scell.item .dhx_scell_name {
+ padding-left: 15px;
+ text-align: left;
+}
+.dhx_data_table.folder .dhx_matrix_cell {
+ border-right: 0;
+}
+.dhx_section_timeline {
+ overflow: hidden;
+ padding: 4px 0 2px 10px;
+}
+.dhx_section_timeline select {
+ width: 552px;
+}
+/* Tree view end*/
+/* Map view */
+.dhx_map_area {
+ width: 100%;
+ height: 100%;
+ overflow-y: auto;
+ overflow-x: hidden;
+ background-image: url(imgs/databg.png);
+}
+.dhx_map_line .dhx_event_icon {
+ width: 20px;
+ border-width: 0px;
+ background: url(imgs/icon.png) no-repeat;
+ background-position: 5px 4px;
+ cursor: pointer;
+}
+.dhx_map_line {
+ height: 21px;
+ clear: both;
+ overflow: hidden;
+}
+.dhx_map {
+ position: absolute;
+}
+.dhx_map_line div {
+ float: left;
+ border-right: 1px dotted #8894A3;
+ text-align: center;
+ line-height: 21px;
+ overflow: hidden;
+}
+.dhx_map_line .headline_description {
+ float: left;
+ border-right: 1px dotted #8894A3;
+ text-align: center;
+ line-height: 21px;
+ overflow: hidden;
+}
+.dhx_map_line .dhx_map_description {
+ float: left;
+ border-right: 0 dotted #8894A3;
+ text-align: center;
+ line-height: 21px;
+ overflow: hidden;
+}
+.dhx_map_line .headline_date,
+.dhx_map_line .headline_description {
+ border-left: 0;
+}
+.dhx_map_line .line_description {
+ float: left;
+ border-right: 1px dotted #8894A3;
+ text-align: left;
+ padding-left: 5px;
+ line-height: 21px;
+ overflow: hidden;
+}
+.dhx_map_line.highlight {
+ background-color: #C4C5CC;
+}
+.dhx_map_area .dhx_map_line div {
+ border-right: 0px dotted #8894A3;
+}
+/* Map view end */
+/* dhtmlXTooltip start */
+.dhtmlXTooltip.tooltip {
+ -moz-box-shadow: 3px 3px 3px #888888;
+ -webkit-box-shadow: 3px 3px 3px #888888;
+ -o-box-shadow: 3px 3px 3px #888888;
+ box-shadow: 3px 3px 3px #888888;
+ filter: progid:DXImageTransform.Microsoft.Shadow(color='#888888', Direction=135, Strength=5);
+ background-color: white;
+ border-left: 1px dotted #887A2E;
+ border-top: 1px dotted #887A2E;
+ color: #887A2E;
+ cursor: default;
+ padding: 10px;
+ position: absolute;
+ z-index: 500;
+ font-family: Tahoma;
+ font-size: 8pt;
+ opacity: 1;
+}
+/* dhtmlXTooltip end */
+/* Lightbox checkbox section */
+.dhx_cal_checkbox label {
+ padding-left: 5px;
+}
+/* Lightbox checkbox section end */
+/* Lightbox radiobuttons section */
+.dhx_cal_light .radio {
+ padding: 2px 0px 2px 10px;
+}
+.dhx_cal_light .radio input,
+.dhx_cal_light .radio label {
+ line-height: 15px;
+}
+.dhx_cal_light .radio input {
+ vertical-align: middle;
+ margin: 0px;
+ padding: 0px;
+}
+.dhx_cal_light .radio label {
+ vertical-align: middle;
+ padding-right: 10px;
+}
+/* Lightbox radiobuttons section end */
+/* Lightbox dhtmlx combo section */
+.dhx_cal_light .combo {
+ padding: 4px;
+}
+.dhx_cal_light_wide .dhx_combo_box {
+ width: 608px !important;
+ left: 10px;
+}
+/* Lightbox dhtmlx combo section end */
+/* Agenda week start */
+.dhx_wa_column {
+ float: left;
+}
+.dhx_wa_column_last .dhx_wa_day_cont {
+ border-left: 1px dotted #8894A3;
+}
+.dhx_wa_scale_bar {
+ font-family: Tahoma;
+ padding-left: 10px;
+ font-size: 11px;
+ border-top: 1px dotted #8894A3;
+ border-bottom: 1px dotted #8894A3;
+}
+.dhx_wa_day_data {
+ background-color: #FCFEFC;
+ overflow-y: auto;
+}
+.dhx_wa_ev_body {
+ border-bottom: 1px dotted #778899;
+ font-size: 12px;
+ padding: 5px 0 5px 7px;
+}
+.dhx_wa_dnd {
+ font-family: Tahoma;
+ position: absolute;
+ padding-right: 7px;
+ color: #887AE2 !important;
+ background-color: #FFE763 !important;
+ border: 1px solid #B7A543;
+}
+.dhx_cal_event_selected {
+ background-color: #9cc1db;
+ color: white;
+}
+/* Agenda week end */
+/* timeline second scale start */
+.dhx_second_scale_bar {
+ border-bottom: 1px dotted #586A7E;
+ padding-top: 2px;
+}
+/* timeline second scale end */
+/* grid view */
+.dhx_cal_header div div {
+ border-left: 1px dotted #8894A3;
+}
+.dhx_grid_area {
+ width: 100%;
+ height: 100%;
+ overflow-y: auto;
+ background-color: #FCFEFC;
+}
+.dhx_grid_area table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ width: 100%;
+ table-layout: fixed;
+}
+.dhx_grid_area td {
+ table-layout: fixed;
+ text-align: center;
+}
+.dhx_grid_line {
+ height: 21px;
+ clear: both;
+ overflow: hidden;
+}
+.dhx_grid_line div {
+ float: left;
+ cursor: default;
+ padding-top: 0;
+ padding-bottom: 0;
+ text-align: center;
+ line-height: 21px;
+ overflow: hidden;
+}
+.dhx_grid_area td,
+.dhx_grid_line div {
+ padding-left: 8px;
+ padding-right: 8px;
+}
+.dhx_grid_area tr.dhx_grid_event {
+ height: 21px;
+ overflow: hidden;
+ margin: 0 0 1px 0;
+}
+.dhx_grid_area tr.dhx_grid_event td {
+ /*borders for old ies*/
+ border-bottom: 1px solid #ECEEF4;
+}
+.dhx_grid_area tr.dhx_grid_event:nth-child(2n+1) td,
+.dhx_grid_area tr.dhx_grid_event:nth-child(2n) td {
+ border-bottom-width: 0px;
+ border-bottom-style: none;
+}
+.dhx_grid_area tr.dhx_grid_event:nth-child(2n) {
+ background-color: #ECEEF4;
+}
+.dhx_grid_area .dhx_grid_dummy {
+ table-layout: auto;
+ margin: 0 !important;
+ padding: 0 !important;
+}
+.dhx_grid_v_border {
+ position: absolute;
+ border-right: 1px solid #A4BED4;
+ width: 1px;
+ height: 100%;
+}
+.dhx_grid_event_selected {
+ background-color: #9cc1db !important;
+ color: white !important;
+}
+.dhx_grid_sort_desc .dhx_grid_view_sort {
+ background-position: 0 -55px;
+}
+.dhx_grid_sort_asc .dhx_grid_view_sort {
+ background-position: 0 -66px;
+}
+.dhx_grid_view_sort {
+ width: 10px;
+ height: 10px;
+ position: absolute;
+ border: none !important;
+ top: 5px;
+ background-repeat: no-repeat;
+ background-image: url(imgs/images.png);
+}
+/* end grid */
+/* marked timespans */
+.dhx_marked_timespan {
+ position: absolute;
+ width: 100%;
+}
+.dhx_time_block {
+ position: absolute;
+ width: 100%;
+ background: silver;
+ opacity: 0.4;
+ filter: alpha(opacity=40);
+ z-index: 1;
+}
+.dhx_time_block_reset {
+ opacity: 1;
+ filter: alpha(opacity=100);
+}
+.dhx_scheduler_month .dhx_marked_timespan {
+ display: none;
+}
+.dhx_mini_calendar .dhx_marked_timespan {
+ display: none;
+}
+/* now time */
+.dhx_now_time {
+ width: 100%;
+ border-bottom: 2px solid red;
+ z-index: 1;
+}
+.dhx_scheduler_month .dhx_now_time {
+ border-bottom: 0;
+ border-left: 2px solid red;
+}
+.dhx_matrix_now_time {
+ border-left: 2px solid red;
+ z-index: 1;
+}
+.dhx_now_time,
+.dhx_matrix_now_time {
+ opacity: 0.5;
+}
+/* Quick info */
+.dhx_cal_quick_info {
+ border: 2px solid #888;
+ border-radius: 5px;
+ position: absolute;
+ z-index: 300;
+ background-color: #8e99ae;
+ background-color: rgba(98, 107, 127, 0.5);
+ padding-left: 7px;
+ width: 300px;
+ transition: left 0.5s ease, right 0.5s;
+ -moz-transition: left 0.5s ease, right 0.5s;
+ -webkit-transition: left 0.5s ease, right 0.5s;
+ -o-transition: left 0.5s ease, right 0.5s;
+}
+.dhx_no_animate {
+ transition: none;
+ -moz-transition: none;
+ -webkit-transition: none;
+ -o-transition: none;
+}
+.dhx_cal_quick_info.dhx_qi_left .dhx_qi_big_icon {
+ float: right;
+}
+.dhx_cal_qi_title {
+ padding: 5px 0px 10px 5px;
+ color: #FFF;
+ letter-spacing: 1px;
+}
+.dhx_cal_qi_tdate {
+ font-size: 14px;
+}
+.dhx_cal_qi_tcontent {
+ font-size: 18px;
+ font-weight: bold;
+}
+.dhx_cal_qi_content {
+ border: 1px solid #888;
+ background-color: #fefefe;
+ padding: 16px 8px;
+ font-size: 14px;
+ color: #444;
+ width: 275px;
+ overflow: hidden;
+}
+.dhx_qi_big_icon {
+ border-radius: 3px;
+ color: #444;
+ margin: 5px 9px 5px 0px;
+ min-width: 60px;
+ line-height: 20px;
+ vertical-align: middle;
+ padding: 5px 10px 5px 5px;
+ cursor: pointer;
+ background-color: #fefefe;
+ border-bottom: 1px solid #666;
+ border-right: 1px solid #666;
+ float: left;
+}
+.dhx_cal_qi_controls div {
+ float: left;
+ height: 20px;
+ text-align: center;
+ line-height: 20px;
+}
+.dhx_qi_big_icon .dhx_menu_icon {
+ margin: 0 8px 0 0px;
+}
+.dhx_drag_marker {
+ width: 100%;
+ filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
+ opacity: 0.5;
+ background-color: #FFE763;
+ position: absolute;
+ box-sizing: border-box !important;
+ border-top: 1px solid #B6B6B6;
+ border-bottom: 1px solid #b6b6b6;
+}
+/* bootstrap CSS fix start */
+.dhx_cal_navline div,
+.dhx_cal_header,
+.dhx_cal_header div,
+.dhx_cal_data div,
+.dhx_cal_light,
+.dhx_cal_light div {
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+.dhx_cal_light .dhx_cal_radio label {
+ margin-bottom: 0;
+}
+.dhx_cal_event div {
+ line-height: normal;
+}
+/* bootstrap CSS fix end */
+.dhx_cal_container {
+ background-color: #C2D5FC;
+ font-family: Tahoma;
+ font-size: 8pt;
+ position: relative;
+ overflow: hidden;
+}
+.dhx_cal_container div {
+ -moz-user-select: none;
+ -moz-user-select: -moz-none;
+}
+.dhx_cal_navline {
+ height: 20px;
+ position: absolute;
+ z-index: 3;
+ width: 750px;
+ color: #2F3A48;
+}
+.dhx_cal_navline div {
+ position: absolute;
+ top: 2px;
+ white-space: nowrap;
+}
+.dhx_cal_navline .dhx_cal_date {
+ font-weight: 600;
+ left: 210px;
+ padding-top: 1px;
+}
+.dhx_cal_button .dhx_left_bg {
+ width: 1px;
+ overflow: hidden;
+ height: 17px;
+ z-index: 20;
+ top: 0px;
+}
+.dhx_cal_prev_button {
+ background-image: url(imgs/buttons.png);
+ background-position: 0px 0px;
+ width: 29px;
+ height: 17px;
+ left: 50px;
+ cursor: pointer;
+}
+.dhx_cal_next_button {
+ background-image: url(imgs/buttons.png);
+ background-position: -30px 0px;
+ width: 29px;
+ height: 17px;
+ left: 80px;
+ cursor: pointer;
+}
+.dhx_cal_today_button {
+ background-image: url(imgs/buttons.png);
+ background-position: -60px 0px;
+ width: 75px;
+ height: 17px;
+ left: 112px;
+ cursor: pointer;
+ text-align: center;
+ text-decoration: underline;
+}
+.dhx_cal_tab {
+ width: 59px;
+ height: 19px;
+ text-align: center;
+ text-decoration: underline;
+ padding-top: 2px;
+ cursor: pointer;
+ background-color: #D8E1EA;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ -moz-border-radius-topleft: 4px;
+ -moz-border-radius-topright: 4px;
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+}
+.dhx_cal_tab.active {
+ text-decoration: none;
+ cursor: default;
+ font-weight: bold;
+ border: 1px dotted #586A7E;
+ border-bottom: 0;
+ background-color: #C2D5FC;
+}
+.dhx_cal_header {
+ position: absolute;
+ left: 10px;
+ top: 23px;
+ width: 750px;
+ border-top: 1px dotted #8894A3;
+ border-right: 1px dotted #8894A3;
+ z-index: 2;
+ overflow: hidden;
+ color: #2F3A48;
+}
+.dhx_cal_data {
+ -webkit-tap-highlight-color: transparent;
+ border-top: 1px dotted #8894A3;
+ position: absolute;
+ top: 44px;
+ width: 600px;
+ overflow-y: auto;
+ overflow-x: hidden;
+ -webkit-overflow-scrolling: touch;
+}
+.dhx_cal_data {
+ -ms-touch-action: pan-y;
+}
+.dhx_cal_event,
+.dhx_cal_event_line,
+.dhx_cal_event_clear {
+ -ms-touch-action: none;
+}
+.dhx_scale_bar {
+ position: absolute;
+ text-align: center;
+ background-color: #C2D5FC;
+ padding-top: 3px;
+ border-left: 1px dotted #586A7E;
+}
+.dhx_scale_holder {
+ position: absolute;
+ border-right: 1px dotted #586A7E;
+ background-image: url(imgs/databg.png);
+}
+.dhx_scale_holder_now {
+ position: absolute;
+ border-right: 1px dotted #586A7E;
+ background-image: url(imgs/databg_now.png);
+}
+.dhx_scale_hour {
+ height: 41px;
+ width: 50px;
+ border-bottom: 1px dotted #8894A3;
+ background-color: #C2D5FC;
+ text-align: center;
+ line-height: 40px;
+ color: #586A7E;
+ overflow: hidden;
+}
+.dhx_month_head {
+ background-color: #EBEFF4;
+ color: #2F3A48;
+ height: 18px;
+ padding-right: 5px;
+ padding-top: 3px;
+ text-align: right;
+ border-right: 1px dotted #586A7E;
+}
+.dhx_month_body {
+ border-right: 1px dotted #586A7E;
+ border-bottom: 1px dotted #586A7E;
+ background-color: #FFFFFF;
+}
+.dhx_now .dhx_month_body {
+ background-color: #E2EDFF;
+}
+.dhx_after .dhx_month_body,
+.dhx_before .dhx_month_body {
+ background-color: #ECECEC;
+}
+.dhx_after .dhx_month_head,
+.dhx_before .dhx_month_head {
+ background-color: #E2E3E6;
+ color: #94A6BB;
+}
+.dhx_now .dhx_month_head {
+ background-color: #D1DEF4;
+ font-weight: bold;
+}
+.dhx_scale_ignore {
+ display: none;
+}
+.dhx_cal_drag {
+ position: absolute;
+ z-index: 9999;
+ background-color: #FFE763;
+ border: 1px solid #B7A543;
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+}
+.dhx_loading {
+ position: absolute;
+ width: 128px;
+ height: 15px;
+ background-image: url(imgs/loading.gif);
+ z-index: 9999;
+}
+.dhx_multi_day_icon,
+.dhx_multi_day {
+ background-color: #E1E6FF;
+ background-repeat: no-repeat;
+ border-right: 1px dotted #8894A3;
+}
+.dhx_multi_day {
+ position: absolute;
+ border-top: 1px dotted #8894A3;
+}
+.dhx_multi_day_icon,
+.dhx_multi_day_icon_small {
+ background-position: center center;
+ background-color: #E1E6FF;
+ background-repeat: no-repeat;
+ border-bottom: 1px dotted #8894A3;
+ border-right: 1px dotted #8894A3;
+}
+.dhx_multi_day_icon {
+ background-image: url(imgs/clock_big.gif);
+}
+.dhx_multi_day_icon_small {
+ background-image: url(imgs/clock_small.gif);
+}
+.dhtmlxLayoutPolyContainer_dhx_skyblue .dhx_cal_container {
+ background-color: #d0e5ff;
+}
+/* left border config option support */
+.dhx_scale_hour_border,
+.dhx_month_body_border,
+.dhx_scale_bar_border,
+.dhx_month_head_border {
+ border-left: 1px dotted #8894A3;
+}
+/* export to PDF and iCal buttons start */
+.dhx_cal_navline .dhx_cal_export {
+ width: 18px;
+ height: 18px;
+ margin: 2px;
+ cursor: pointer;
+ top: 0px;
+}
+.dhx_cal_navline .dhx_cal_export.pdf {
+ left: 2px;
+ background-image: url('imgs/export_pdf.png');
+}
+.dhx_cal_navline .dhx_cal_export.ical {
+ left: 24px;
+ background-image: url('imgs/export_ical.png');
+}
+/* export to PDF and iCal buttons end */
+/*All*/
+.dhx_form_repeat,
+.dhx_form_repeat input {
+ padding: 0;
+ margin: 0;
+ padding-left: 5px;
+ font-family: Tahoma, Verdana;
+ font-size: 11px;
+ line-height: 24px;
+}
+.dhx_form_repeat {
+ overflow: hidden;
+ /*height:115px;*/
+ height: 0px;
+ background-color: #FFF4B5;
+ /*border: 1px solid #DCC43E;*/
+}
+.dhx_cal_light_wide .dhx_form_repeat {
+ background-color: transparent;
+}
+.dhx_repeat_center,
+.dhx_repeat_left {
+ height: 115px;
+ padding: 10px 0 10px 10px;
+ float: left;
+}
+.dhx_repeat_left {
+ width: 95px;
+}
+.dhx_repeat_center {
+ width: 335px;
+ margin-top: 12px;
+}
+.dhx_repeat_divider {
+ float: left;
+ height: 115px;
+ border-left: 1px dotted #DCC43E;
+ /*background-color: #DCC43E;*/
+ width: 1px;
+}
+.dhx_repeat_right {
+ float: right;
+ height: 115px;
+ width: 160px;
+ padding: 10px 3px 10px 10px;
+ margin-top: 7px;
+}
+input.dhx_repeat_text {
+ height: 16px;
+ width: 27px;
+ margin: 0 4px 0 4px;
+ line-height: 18px;
+ padding: 0 0 0 2px;
+}
+.dhx_form_repeat select {
+ height: 20px;
+ width: 87px;
+ padding: 0 0 0 2px;
+ margin: 0 4px 0 4px;
+}
+input.dhx_repeat_date {
+ height: 18px;
+ width: 80px;
+ padding: 0 0 0 2px;
+ margin: 0 4px 0 4px;
+ background-repeat: no-repeat;
+ background-position: 64px 0;
+ border: 1px #7f9db9 solid;
+ line-height: 18px;
+}
+input.dhx_repeat_radio {
+ margin-right: 4px;
+}
+input.dhx_repeat_checkbox {
+ margin: 4px 4px 0 0;
+}
+.dhx_repeat_days td {
+ padding-right: 5px;
+}
+.dhx_repeat_days label {
+ font-size: 10px;
+}
+.dhx_custom_button {
+ width: 90px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ -ms-border-radius: 4px;
+ -o-border-radius: 4px;
+ border-radius: 4px;
+}
+.dhx_custom_button_recurring {
+ background-image: url(imgs/but_repeat.gif);
+ background-position: -5px 20px;
+ width: 20px;
+ margin-right: 10px;
+}
+/* increase width of lightbox */
+.dhx_cal_light_rec {
+ width: 640px;
+}
+.dhx_cal_light_rec .dhx_cal_larea {
+ width: 632px;
+}
+.dhx_cal_light_rec.dhx_cal_light_wide {
+ width: 816px;
+}
+.dhx_cal_light_rec.dhx_cal_light_wide .dhx_cal_larea {
+ width: 808px;
+}
+.dhx_cal_tab.active {
+ border: none;
+}
+.dhx_multi_day {
+ border: none;
+ border-top: 1px solid #A4BED4;
+}
+.dhx_multi_day_icon,
+.dhx_multi_day_icon_small {
+ border-right: none;
+}
+.dhx_cal_container {
+ background-image: url(imgs_glossy/top-days-bg.png);
+ background-position: 0 24px;
+ background-repeat: repeat-x;
+ background-color: #EBEBEB;
+}
+.dhx_cal_navline {
+ background-color: #EBEBEB;
+ height: 23px !important;
+}
+.dhx_cal_prev_button {
+ background-image: url(imgs_glossy/buttons.gif);
+ width: 30px;
+ height: 20px;
+}
+.dhx_cal_next_button {
+ background-image: url(imgs_glossy/buttons.gif);
+ width: 30px;
+ height: 20px;
+}
+.dhx_cal_today_button {
+ padding-top: 3px;
+ background-image: url(imgs_glossy/buttons.gif);
+ width: 67px;
+ left: 110px;
+ text-decoration: none;
+}
+.dhx_cal_navline .dhx_cal_date {
+ padding-top: 4px;
+ left: 230px;
+}
+.dhx_cal_tab {
+ background-image: url(imgs_glossy/white_tab.png);
+ width: 60px;
+ height: 15px;
+ text-decoration: none;
+ padding-top: 4px;
+ margin-top: 4px;
+}
+.dhx_cal_tab.active {
+ background-image: url(imgs_glossy/blue_tab.png);
+ height: 18px;
+ width: 60px;
+ padding-top: 4px;
+ margin-top: 2px;
+}
+.dhx_cal_data {
+ border-top: 1px solid #A4BED4;
+}
+.dhx_cal_header {
+ background-image: url(imgs_glossy/top-days-bg.png);
+ background-repeat: repeat-x;
+ border-top: 0px;
+ border-right: 0px;
+}
+.dhx_scale_bar {
+ background-image: url(imgs_glossy/top-separator.gif);
+ background-position: 0px 0px;
+ background-repeat: no-repeat;
+ background-color: transparent;
+ padding-top: 3px;
+ border-left: 0px;
+}
+.dhx_scale_holder {
+ border-right: 1px solid #A4BED4;
+}
+.dhx_scale_holder_now {
+ border-right: 1px solid #A4BED4;
+}
+.dhx_scale_hour {
+ background-image: url(imgs_glossy/left-time-bg.png);
+ border-bottom: 1px solid #A4BED4;
+ color: #2F3A48;
+}
+.dhx_multi_day {
+ background-image: url(imgs_glossy/multi-days-bg.png);
+ background-repeat: repeat;
+ border-bottom: 1px solid #A4BED4;
+ border-left: 0px;
+}
+.dhx_multi_day_icon,
+.dhx_multi_day_icon_small {
+ background-image: url(imgs_glossy/clock_big.png);
+ border-bottom: 1px solid #A4BED4;
+ border-left: 1px solid #ffffff;
+ background-color: transparent;
+ background-repeat: no-repeat;
+}
+.dhx_multi_day_icon_small {
+ background-image: url(imgs_glossy/clock_small.png);
+}
+.dhx_month_head {
+ background-color: #FFFFFF;
+}
+.dhx_after .dhx_month_head,
+.dhx_before .dhx_month_head {
+ background-color: #EFEDE2;
+}
+.dhx_now .dhx_month_head {
+ background-color: #E4EFFF;
+}
+.dhx_after .dhx_month_body,
+.dhx_before .dhx_month_body {
+ background-color: #EFEDE2;
+}
+.dhx_cal_event div {
+ border: 1px solid #FFBD51;
+ background-color: #FFE4AB;
+ color: #000000;
+}
+.dhx_cal_event_clear {
+ color: #000000;
+}
+.dhx_cal_event_line {
+ background-image: url(imgs_glossy/event-bg.png);
+ border: 1px solid #FFBD51;
+ color: #000000;
+}
+.dhx_in_move {
+ background-image: url(imgs_glossy/move.png);
+}
+.dhx_cal_event .dhx_body {
+ background-color: #FFE4AB;
+}
+.dhx_cal_event .dhx_title {
+ background-color: #FFE4AB;
+}
+.dhx_cal_light {
+ -moz-box-shadow: 5px 5px 5px #888888;
+ -khtml-box-shadow: 5px 5px 5px #888;
+ background-color: #EBEBEB;
+ border: 2px solid #A4BED4;
+ color: #000000;
+}
+.dhx_cal_larea {
+ border: 1px solid #A4BED4;
+ border-width: 0 1px 1px;
+ background-color: #FFFFFF;
+}
+.dhx_cal_lsection {
+ background-image: url(imgs_glossy/lightbox.png);
+ font-size: 14px;
+ padding: 5px 0 5px 10px;
+ color: #000000;
+}
+.dhx_cal_light_wide .dhx_cal_lsection {
+ background-image: url(imgs_glossy/multi-days-bg.png);
+}
+.dhx_cal_ltext textarea {
+ background-color: #ffffff;
+ color: #000000;
+}
+.dhx_cal_light select,
+.dhx_cal_light input {
+ color: #000000;
+}
+.dhx_save_btn {
+ background-image: url(imgs_glossy/controlls5.png);
+}
+.dhx_cancel_btn {
+ background-image: url(imgs_glossy/controlls5.png);
+}
+.dhx_delete_btn {
+ background-image: url(imgs_glossy/controlls5.png);
+}
+div.dhx_menu_head {
+ background-image: url(imgs_glossy/controlls5.png);
+ border: 1px solid #FFE4AB;
+}
+div.dhx_menu_icon {
+ background-image: url(imgs_glossy/controlls5.png);
+ border: medium none;
+}
+.dhx_section_time {
+ height: 20px !important;
+ padding: 7px 0 !important;
+ text-align: center;
+ background: white;
+}
+.dhx_year_month {
+ background-image: url(imgs_glossy/top-days-bg.png);
+ border: 0px;
+}
+.dhx_year_week {
+ background-image: url(imgs_glossy/top-days-bg.png);
+}
+.dhx_month_head {
+ border-right: 1px solid #A4BED4;
+}
+.dhx_month_body,
+.dhx_matrix_cell,
+.dhx_matrix_scell {
+ border-right: 1px solid #A4BED4;
+ border-bottom: 1px solid #A4BED4;
+}
+.dhx_year_body {
+ border-left: 1px solid #A4BED4;
+}
+.dhx_scale_bar_last {
+ border-right: none;
+}
+.dhx_month_head.dhx_year_event {
+ background-color: #FFE4AB;
+}
+.dhx_year_body .dhx_before .dhx_month_head,
+.dhx_year_body .dhx_after .dhx_month_head,
+.dhx_year_body .dhx_before .dhx_month_head a,
+.dhx_year_body .dhx_after .dhx_month_head a {
+ color: #EFEDE2 !important;
+}
+.dhx_cal_lsection .dhx_readonly {
+ color: #000000;
+}
+.dhx_year_tooltip {
+ -moz-box-shadow: 2px 2px 2px #888;
+ /*Doesn't work in IE*/
+ -khtml-box-shadow: 2px 2px 2px #888;
+}
+.dhx_custom_button {
+ margin-top: -2px;
+}
+/*2.3*/
+.dhx_cal_lsection .dhx_fullday {
+ color: #000000;
+}
+.dhx_cal_lsection.dhx_cal_checkbox {
+ height: 16px;
+ line-height: 18px;
+}
+.dhx_cal_light_wide .dhx_cal_lsection.dhx_cal_checkbox {
+ height: 20px;
+}
+.dhx_cal_light_wide .dhx_combo_box {
+ width: 602px !important;
+ left: 0px;
+}
+.dhx_cal_checkbox label {
+ vertical-align: top;
+}
+.dhx_cal_light_wide .dhx_cal_lsection {
+ color: black;
+}
+.dhx_cal_light_wide .dhx_wrap_section {
+ border-top: 1px solid #A4BED4;
+ background-image: url(imgs_glossy/multi-days-bg.png);
+}
+.dhx_cal_light_wide .dhx_cal_ltext {
+ border-left: 1px solid #A4BED4;
+}
+.dhx_cal_light_wide .dhx_cal_ltext {
+ background-color: white;
+}
+.dhx_custom_button {
+ background: white;
+ color: black;
+}
+.dhx_form_repeat {
+ background: white;
+}
+.dhx_repeat_divider {
+ border-left: 1px solid #A4BED4;
+}
+/* timeline second scale start */
+.dhx_cal_header.dhx_second_cal_header {
+ background-image: url("imgs_glossy/second-top-days-bg.png");
+ padding-right: 20px;
+}
+.dhx_cal_header div div {
+ border-left: 0;
+}
+.dhx_scale_bar {
+ padding-top: 4px;
+}
+.dhx_second_scale_bar {
+ border-bottom: 0;
+ padding-top: 4px;
+}
+/* timeline second scale end */
+.dhx_cal_light_wide .dhx_cal_lsection .dhx_fullday,
+.dhx_cal_lsection .dhx_fullday {
+ color: #000000;
+ font-size: 14px;
+}
+.dhx_cal_light_wide .dhx_cal_lsection {
+ font-size: 14px;
+ padding-right: 10px;
+}
+/* left border config option support */
+.dhx_scale_hour_border,
+.dhx_month_body_border,
+.dhx_scale_bar_border,
+.dhx_month_head_border {
+ border-left: 1px solid #A4BED4;
+}
+/* export to PDF and iCal buttons start */
+.dhx_cal_navline .dhx_cal_export {
+ width: 18px;
+ height: 18px;
+ margin: 2px;
+ cursor: pointer;
+ top: 1px;
+}
+.dhx_cal_navline .dhx_cal_export.pdf {
+ left: 2px;
+ background-image: url('imgs_glossy/export_pdf.png');
+}
+.dhx_cal_navline .dhx_cal_export.ical {
+ left: 24px;
+ background-image: url('imgs_glossy/export_ical.png');
+}
+/* export to PDF and iCal buttons end */