odoo/addons/base_calendar/static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler.js

3735 lines
118 KiB
JavaScript

/*
dhtmlxScheduler v.2.3
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
(c) DHTMLX Ltd.
*/
dhtmlx = function (B) {
for (var A in B) {
dhtmlx[A] = B[A]
}
return dhtmlx
};
dhtmlx.extend_api = function (A, D, C) {
var B = window[A];
if (!B) {
return
}
window[A] = function (G) {
if (G && typeof G == "object" && !G.tagName && !(G instanceof Array)) {
var F = B.apply(this, (D._init ? D._init(G) : arguments));
for (var E in dhtmlx) {
if (D[E]) {
this[D[E]](dhtmlx[E])
}
}
for (var E in G) {
if (D[E]) {
this[D[E]](G[E])
} else {
if (E.indexOf("on") == 0) {
this.attachEvent(E, G[E])
}
}
}
} else {
var F = B.apply(this, arguments)
}
if (D._patch) {
D._patch(this)
}
return F || this
};
window[A].prototype = B.prototype;
if (C) {
dhtmlXHeir(window[A].prototype, C)
}
};
dhtmlxAjax = {
get: function (A, C) {
var B = new dtmlXMLLoaderObject(true);
B.async = (arguments.length < 3);
B.waitCall = C;
B.loadXML(A);
return B
},
post: function (A, C, D) {
var B = new dtmlXMLLoaderObject(true);
B.async = (arguments.length < 4);
B.waitCall = D;
B.loadXML(A, true, C);
return B
},
getSync: function (A) {
return this.get(A, null, true)
},
postSync: function (A, B) {
return this.post(A, B, null, true)
}
};
function dtmlXMLLoaderObject(B, D, C, A) {
this.xmlDoc = "";
if (typeof(C) != "undefined") {
this.async = C
} else {
this.async = true
}
this.onloadAction = B || null;
this.mainObject = D || null;
this.waitCall = null;
this.rSeed = A || false;
return this
}
dtmlXMLLoaderObject.prototype.waitLoadFunction = function (B) {
var A = true;
this.check = function () {
if ((B) && (B.onloadAction != null)) {
if ((!B.xmlDoc.readyState) || (B.xmlDoc.readyState == 4)) {
if (!A) {
return
}
A = false;
if (typeof B.onloadAction == "function") {
B.onloadAction(B.mainObject, null, null, null, B)
}
if (B.waitCall) {
B.waitCall.call(this, B);
B.waitCall = null
}
}
}
};
return this.check
};
dtmlXMLLoaderObject.prototype.getXMLTopNode = function (C, A) {
if (this.xmlDoc.responseXML) {
var B = this.xmlDoc.responseXML.getElementsByTagName(C);
if (B.length == 0 && C.indexOf(":") != -1) {
var B = this.xmlDoc.responseXML.getElementsByTagName((C.split(":"))[1])
}
var E = B[0]
} else {
var E = this.xmlDoc.documentElement
}
if (E) {
this._retry = false;
return E
}
if ((_isIE) && (!this._retry)) {
var D = this.xmlDoc.responseText;
var A = this.xmlDoc;
this._retry = true;
this.xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
this.xmlDoc.async = false;
this.xmlDoc.loadXML(D);
return this.getXMLTopNode(C, A)
}
dhtmlxError.throwError("LoadXML", "Incorrect XML", [(A || this.xmlDoc), this.mainObject]);
return document.createElement("DIV")
};
dtmlXMLLoaderObject.prototype.loadXMLString = function (B) {
try {
var C = new DOMParser();
this.xmlDoc = C.parseFromString(B, "text/xml")
} catch (A) {
this.xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
this.xmlDoc.async = this.async;
this.xmlDoc.loadXML(B)
}
this.onloadAction(this.mainObject, null, null, null, this);
if (this.waitCall) {
this.waitCall();
this.waitCall = null
}
};
dtmlXMLLoaderObject.prototype.loadXML = function (C, B, A, D) {
if (this.rSeed) {
C += ((C.indexOf("?") != -1) ? "&" : "?") + "a_dhx_rSeed=" + (new Date()).valueOf()
}
this.filePath = C;
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(B ? "POST" : "GET", C, this.async);
if (D) {
this.xmlDoc.setRequestHeader("User-Agent", "dhtmlxRPC v0.1 (" + navigator.userAgent + ")");
this.xmlDoc.setRequestHeader("Content-type", "text/xml")
} else {
if (B) {
this.xmlDoc.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
}
}
this.xmlDoc.setRequestHeader("X-Requested-With", "XMLHttpRequest");
this.xmlDoc.send(null || A);
if (!this.async) {
(new this.waitLoadFunction(this))()
}
};
dtmlXMLLoaderObject.prototype.destructor = function () {
this.onloadAction = null;
this.mainObject = null;
this.xmlDoc = null;
return null
};
dtmlXMLLoaderObject.prototype.xmlNodeToJSON = function (D) {
var C = {};
for (var B = 0; B < D.attributes.length; B++) {
C[D.attributes[B].name] = D.attributes[B].value
}
C._tagvalue = D.firstChild ? D.firstChild.nodeValue : "";
for (var B = 0; B < D.childNodes.length; B++) {
var A = D.childNodes[B].tagName;
if (A) {
if (!C[A]) {
C[A] = []
}
C[A].push(this.xmlNodeToJSON(D.childNodes[B]))
}
}
return C
};
function callerFunction(A, B) {
this.handler = function (C) {
if (!C) {
C = window.event
}
A(C, B);
return true
};
return this.handler
}
function getAbsoluteLeft(A) {
return getOffset(A).left
}
function getAbsoluteTop(A) {
return getOffset(A).top
}
function getOffsetSum(A) {
var C = 0,
B = 0;
while (A) {
C = C + parseInt(A.offsetTop);
B = B + parseInt(A.offsetLeft);
A = A.offsetParent
}
return {
top: C,
left: B
}
}
function getOffsetRect(D) {
var G = D.getBoundingClientRect();
var H = document.body;
var B = document.documentElement;
var A = window.pageYOffset || B.scrollTop || H.scrollTop;
var E = window.pageXOffset || B.scrollLeft || H.scrollLeft;
var F = B.clientTop || H.clientTop || 0;
var I = B.clientLeft || H.clientLeft || 0;
var J = G.top + A - F;
var C = G.left + E - I;
return {
top: Math.round(J),
left: Math.round(C)
}
}
function getOffset(A) {
if (A.getBoundingClientRect && !_isChrome) {
return getOffsetRect(A)
} else {
return getOffsetSum(A)
}
}
function convertStringToBoolean(A) {
if (typeof(A) == "string") {
A = A.toLowerCase()
}
switch (A) {
case "1":
case "true":
case "yes":
case "y":
case 1:
case true:
return true;
break;
default:
return false
}
}
function getUrlSymbol(A) {
if (A.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 (A) {
A.onmousedown = null;
A.dragStarter = null;
A.dragLanding = null
};
dhtmlDragAndDropObject.prototype.addDraggableItem = function (A, B) {
A.onmousedown = this.preCreateDragCopy;
A.dragStarter = B;
this.addDragLanding(A, B)
};
dhtmlDragAndDropObject.prototype.addDragLanding = function (A, B) {
A.dragLanding = B
};
dhtmlDragAndDropObject.prototype.preCreateDragCopy = function (A) {
if ((A || event) && (A || 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
}
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 ((A) && (A.preventDefault)) {
A.preventDefault();
return false
}
return false
};
dhtmlDragAndDropObject.prototype.callDrag = function (C) {
if (!C) {
C = window.event
}
dragger = window.dhtmlDragAndDrop;
if ((new Date()).valueOf() - dragger.downtime < 100) {
return
}
if ((C.button == 0) && (_isIE)) {
return dragger.stopDrag()
}
if (!dragger.dragNode && dragger.waitDrag) {
dragger.dragNode = dragger.dragStartObject._createDragNode(dragger.dragStartNode, C);
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()
}
if (dragger.dragNode.parentNode != window.document.body) {
var A = dragger.gldragNode;
if (dragger.gldragNode.old) {
A = dragger.gldragNode.old
}
A.parentNode.removeChild(A);
var B = dragger.dragNode.pWindow;
if (_isIE) {
var E = document.createElement("Div");
E.innerHTML = dragger.dragNode.outerHTML;
dragger.dragNode = E.childNodes[0]
} else {
dragger.dragNode = dragger.dragNode.cloneNode(true)
}
dragger.dragNode.pWindow = window;
dragger.gldragNode.old = dragger.dragNode;
document.body.appendChild(dragger.dragNode);
B.dhtmlDragAndDrop.dragNode = dragger.dragNode
}
dragger.dragNode.style.left = C.clientX + 15 + (dragger.fx ? dragger.fx * (-1) : 0) + (document.body.scrollLeft || document.documentElement.scrollLeft) + "px";
dragger.dragNode.style.top = C.clientY + 3 + (dragger.fy ? dragger.fy * (-1) : 0) + (document.body.scrollTop || document.documentElement.scrollTop) + "px";
if (!C.srcElement) {
var D = C.target
} else {
D = C.srcElement
}
dragger.checkLanding(D, C)
};
dhtmlDragAndDropObject.prototype.calculateFramePosition = function (E) {
if (window.name) {
var C = parent.frames[window.name].frameElement.offsetParent;
var D = 0;
var B = 0;
while (C) {
D += C.offsetLeft;
B += C.offsetTop;
C = C.offsetParent
}
if ((parent.dhtmlDragAndDrop)) {
var A = parent.dhtmlDragAndDrop.calculateFramePosition(1);
D += A.split("_")[0] * 1;
B += A.split("_")[1] * 1
}
if (E) {
return D + "_" + B
} else {
this.fx = D
}
this.fy = B
}
return "0_0"
};
dhtmlDragAndDropObject.prototype.checkLanding = function (B, A) {
if ((B) && (B.dragLanding)) {
if (this.lastLanding) {
this.lastLanding.dragLanding._dragOut(this.lastLanding)
}
this.lastLanding = B;
this.lastLanding = this.lastLanding.dragLanding._dragIn(this.lastLanding, this.dragStartNode, A.clientX, A.clientY, A);
this.lastLanding_scr = (_isIE ? A.srcElement : A.target)
} else {
if ((B) && (B.tagName != "BODY")) {
this.checkLanding(B.parentNode, A)
} else {
if (this.lastLanding) {
this.lastLanding.dragLanding._dragOut(this.lastLanding, A.clientX, A.clientY, A)
}
this.lastLanding = 0;
if (this._onNotFound) {
this._onNotFound()
}
}
}
};
dhtmlDragAndDropObject.prototype.stopDrag = function (B, C) {
dragger = window.dhtmlDragAndDrop;
if (!C) {
dragger.stopFrameRoute();
var A = dragger.lastLanding;
dragger.lastLanding = null;
if (A) {
A.dragLanding._drag(dragger.dragStartNode, dragger.dragStartObject, A, (_isIE ? event.srcElement : B.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 (C) {
if (C) {
window.dhtmlDragAndDrop.stopDrag(1, 1)
}
for (var A = 0; A < window.frames.length; A++) {
try {
if ((window.frames[A] != C) && (window.frames[A].dhtmlDragAndDrop)) {
window.frames[A].dhtmlDragAndDrop.stopFrameRoute(window)
}
} catch (B) {}
}
try {
if ((parent.dhtmlDragAndDrop) && (parent != window) && (parent != C)) {
parent.dhtmlDragAndDrop.stopFrameRoute(window)
}
} catch (B) {}
};
dhtmlDragAndDropObject.prototype.initFrameRoute = function (C, D) {
if (C) {
window.dhtmlDragAndDrop.preCreateDragCopy({});
window.dhtmlDragAndDrop.dragStartNode = C.dhtmlDragAndDrop.dragStartNode;
window.dhtmlDragAndDrop.dragStartObject = C.dhtmlDragAndDrop.dragStartObject;
window.dhtmlDragAndDrop.dragNode = C.dhtmlDragAndDrop.dragNode;
window.dhtmlDragAndDrop.gldragNode = C.dhtmlDragAndDrop.dragNode;
window.document.body.onmouseup = window.dhtmlDragAndDrop.stopDrag;
window.waitDrag = 0;
if (((!_isIE) && (D)) && ((!_isFF) || (_FFrv < 1.8))) {
window.dhtmlDragAndDrop.calculateFramePosition()
}
}
try {
if ((parent.dhtmlDragAndDrop) && (parent != window) && (parent != C)) {
parent.dhtmlDragAndDrop.initFrameRoute(window)
}
} catch (B) {}
for (var A = 0; A < window.frames.length; A++) {
try {
if ((window.frames[A] != C) && (window.frames[A].dhtmlDragAndDrop)) {
window.frames[A].dhtmlDragAndDrop.initFrameRoute(window, ((!C || D) ? 1 : 0))
}
} catch (B) {}
}
};
var _isFF = false;
var _isIE = false;
var _isOpera = false;
var _isKHTML = false;
var _isMacOS = false;
var _isChrome = 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)) {
var _KHTMLrv = parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf("Safari") + 7, 5));
if (_KHTMLrv > 525) {
_isFF = true;
var _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 && document.compatMode != "BackCompat") {
_isIE = 8
}
} else {
_isFF = true;
var _FFrv = parseFloat(navigator.userAgent.split("rv:")[1])
}
}
}
dtmlXMLLoaderObject.prototype.doXPath = function (C, E, D, I) {
if (_isKHTML || (!_isIE && !window.XPathResult)) {
return this.doXPathOpera(C, E)
}
if (_isIE) {
if (!E) {
if (!this.xmlDoc.nodeName) {
E = this.xmlDoc.responseXML
} else {
E = this.xmlDoc
}
}
if (!E) {
dhtmlxError.throwError("LoadXML", "Incorrect XML", [(E || this.xmlDoc), this.mainObject])
}
if (D != null) {
E.setProperty("SelectionNamespaces", "xmlns:xsl='" + D + "'")
}
if (I == "single") {
return E.selectSingleNode(C)
} else {
return E.selectNodes(C) || new Array(0)
}
} else {
var A = E;
if (!E) {
if (!this.xmlDoc.nodeName) {
E = this.xmlDoc.responseXML
} else {
E = this.xmlDoc
}
}
if (!E) {
dhtmlxError.throwError("LoadXML", "Incorrect XML", [(E || this.xmlDoc), this.mainObject])
}
if (E.nodeName.indexOf("document") != -1) {
A = E
} else {
A = E;
E = E.ownerDocument
}
var G = XPathResult.ANY_TYPE;
if (I == "single") {
G = XPathResult.FIRST_ORDERED_NODE_TYPE
}
var F = new Array();
var B = E.evaluate(C, A, function (J) {
return D
}, G, null);
if (G == XPathResult.FIRST_ORDERED_NODE_TYPE) {
return B.singleNodeValue
}
var H = B.iterateNext();
while (H) {
F[F.length] = H;
H = B.iterateNext()
}
return F
}
};
function _dhtmlxError(B, A, C) {
if (!this.catches) {
this.catches = new Array()
}
return this
}
_dhtmlxError.prototype.catchError = function (B, A) {
this.catches[B] = A
};
_dhtmlxError.prototype.throwError = function (B, A, C) {
if (this.catches[B]) {
return this.catches[B](B, A, C)
}
if (this.catches.ALL) {
return this.catches.ALL(B, A, C)
}
alert("Error type: " + arguments[0] + "\nDescription: " + arguments[1]);
return null
};
window.dhtmlxError = new _dhtmlxError();
dtmlXMLLoaderObject.prototype.doXPathOpera = function (C, A) {
var E = C.replace(/[\/]+/gi, "/").split("/");
var D = null;
var B = 1;
if (!E.length) {
return []
}
if (E[0] == ".") {
D = [A]
} else {
if (E[0] == "") {
D = (this.xmlDoc.responseXML || this.xmlDoc).getElementsByTagName(E[B].replace(/\[[^\]]*\]/g, ""));
B++
} else {
return []
}
}
for (B; B < E.length; B++) {
D = this._getAllNamedChilds(D, E[B])
}
if (E[B - 1].indexOf("[") != -1) {
D = this._filterXPath(D, E[B - 1])
}
return D
};
dtmlXMLLoaderObject.prototype._filterXPath = function (B, A) {
var D = new Array();
var A = A.replace(/[^\[]*\[\@/g, "").replace(/[\[\]\@]*/g, "");
for (var C = 0; C < B.length; C++) {
if (B[C].getAttribute(A)) {
D[D.length] = B[C]
}
}
return D
};
dtmlXMLLoaderObject.prototype._getAllNamedChilds = function (B, A) {
var E = new Array();
if (_isKHTML) {
A = A.toUpperCase()
}
for (var D = 0; D < B.length; D++) {
for (var C = 0; C < B[D].childNodes.length; C++) {
if (_isKHTML) {
if (B[D].childNodes[C].tagName && B[D].childNodes[C].tagName.toUpperCase() == A) {
E[E.length] = B[D].childNodes[C]
}
} else {
if (B[D].childNodes[C].tagName == A) {
E[E.length] = B[D].childNodes[C]
}
}
}
}
return E
};
function dhtmlXHeir(B, A) {
for (var C in A) {
if (typeof(A[C]) == "function") {
B[C] = A[C]
}
}
return B
}
function dhtmlxEvent(B, C, A) {
if (B.addEventListener) {
B.addEventListener(C, A, false)
} else {
if (B.attachEvent) {
B.attachEvent("on" + C, A)
}
}
}
dtmlXMLLoaderObject.prototype.xslDoc = null;
dtmlXMLLoaderObject.prototype.setXSLParamValue = function (B, C, D) {
if (!D) {
D = this.xslDoc
}
if (D.responseXML) {
D = D.responseXML
}
var A = this.doXPath("/xsl:stylesheet/xsl:variable[@name='" + B + "']", D, "http://www.w3.org/1999/XSL/Transform", "single");
if (A != null) {
A.firstChild.nodeValue = C
}
};
dtmlXMLLoaderObject.prototype.doXSLTransToObject = function (D, B) {
if (!D) {
D = this.xslDoc
}
if (D.responseXML) {
D = D.responseXML
}
if (!B) {
B = this.xmlDoc
}
if (B.responseXML) {
B = B.responseXML
}
if (!_isIE) {
if (!this.XSLProcessor) {
this.XSLProcessor = new XSLTProcessor();
this.XSLProcessor.importStylesheet(D)
}
var A = this.XSLProcessor.transformToDocument(B)
} else {
var A = new ActiveXObject("Msxml2.DOMDocument.3.0");
try {
B.transformNodeToObject(D, A)
} catch (C) {
A = B.transformNode(D)
}
}
return A
};
dtmlXMLLoaderObject.prototype.doXSLTransToString = function (C, B) {
var A = this.doXSLTransToObject(C, B);
if (typeof(A) == "string") {
return A
}
return this.doSerialization(A)
};
dtmlXMLLoaderObject.prototype.doSerialization = function (B) {
if (!B) {
B = this.xmlDoc
}
if (B.responseXML) {
B = B.responseXML
}
if (!_isIE) {
var A = new XMLSerializer();
return A.serializeToString(B)
} else {
return B.xml
}
};
dhtmlxEventable = function (obj) {
obj.dhx_SeverCatcherPath = "";
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))
};
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] != null) {
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 != false) {
var list = id.split(":");
this[list[0]].removeEvent(list[1])
}
}
};
function dataProcessor(A) {
this.serverProcessor = A;
this.action_param = "!nativeeditor_status";
this.object = null;
this.updatedRows = [];
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 = {
setTransactionMode: function (B, A) {
this._tMode = B;
this._tSend = A
},
escape: function (A) {
if (this._utf) {
return encodeURIComponent(A)
} else {
return escape(A)
}
},
enableUTFencoding: function (A) {
this._utf = convertStringToBoolean(A)
},
setDataColumns: function (A) {
this._columns = (typeof A == "string") ? A.split(",") : A
},
getSyncState: function () {
return !this.updatedRows.length
},
enableDataNames: function (A) {
this._endnm = convertStringToBoolean(A)
},
enablePartialDataSend: function (A) {
this._changed = convertStringToBoolean(A)
},
setUpdateMode: function (B, A) {
this.autoUpdate = (B == "cell");
this.updateMode = B;
this.dnd = A
},
ignore: function (B, A) {
this._silent_mode = true;
B.call(A || window);
this._silent_mode = false
},
setUpdated: function (D, C, E) {
if (this._silent_mode) {
return
}
var B = this.findRow(D);
E = E || "updated";
var A = this.obj.getUserData(D, this.action_param);
if (A && E == "updated") {
E = A
}
if (C) {
this.set_invalid(D, false);
this.updatedRows[B] = D;
this.obj.setUserData(D, this.action_param, E);
if (this._in_progress[D]) {
this._in_progress[D] = "wait"
}
} else {
if (!this.is_invalid(D)) {
this.updatedRows.splice(B, 1);
this.obj.setUserData(D, this.action_param, "")
}
}
if (!C) {
this._clearUpdateFlag(D)
}
this.markRow(D, C, E);
if (C && this.autoUpdate) {
this.sendData(D)
}
},
_clearUpdateFlag: function (A) {},
markRow: function (F, C, E) {
var D = "";
var B = this.is_invalid(F);
if (B) {
D = this.styles[B];
C = true
}
if (this.callEvent("onRowMark", [F, C, E, B])) {
D = this.styles[C ? E : "clear"] + D;
this.obj[this._methods[0]](F, D);
if (B && B.details) {
D += this.styles[B + "_cell"];
for (var A = 0; A < B.details.length; A++) {
if (B.details[A]) {
this.obj[this._methods[1]](F, A, D)
}
}
}
}
},
getState: function (A) {
return this.obj.getUserData(A, this.action_param)
},
is_invalid: function (A) {
return this._invalid[A]
},
set_invalid: function (C, B, A) {
if (A) {
B = {
value: B,
details: A,
toString: function () {
return this.value.toString()
}
}
}
this._invalid[C] = B
},
checkBeforeUpdate: function (A) {
return true
},
sendData: function (A) {
if (this._waitMode && (this.obj.mytype == "tree" || this.obj._h2)) {
return
}
if (this.obj.editStop) {
this.obj.editStop()
}
if (typeof A == "undefined" || this._tSend) {
return this.sendAllData()
}
if (this._in_progress[A]) {
return false
}
this.messages = [];
if (!this.checkBeforeUpdate(A) && this.callEvent("onValidatationError", [A, this.messages])) {
return false
}
this._beforeSendData(this._getRowData(A), A)
},
_beforeSendData: function (A, B) {
if (!this.callEvent("onBeforeUpdate", [B, this.getState(B), A])) {
return false
}
this._sendData(A, B)
},
serialize: function (D, E) {
if (typeof D == "string") {
return D
}
if (typeof E != "undefined") {
return this.serialize_one(D, "")
} else {
var A = [];
var C = [];
for (var B in D) {
if (D.hasOwnProperty(B)) {
A.push(this.serialize_one(D[B], B + this.post_delim));
C.push(B)
}
}
A.push("ids=" + this.escape(C.join(",")));
return A.join("&")
}
},
serialize_one: function (D, B) {
if (typeof D == "string") {
return D
}
var A = [];
for (var C in D) {
if (D.hasOwnProperty(C)) {
A.push(this.escape((B || "") + C) + "=" + this.escape(D[C]))
}
}
return A.join("&")
},
_sendData: function (B, C) {
if (!B) {
return
}
if (!this.callEvent("onBeforeDataSending", C ? [C, this.getState(C), B] : [null, null, B])) {
return false
}
if (C) {
this._in_progress[C] = (new Date()).valueOf()
}
var A = new dtmlXMLLoaderObject(this.afterUpdate, this, true);
var D = this.serverProcessor + (this._user ? (getUrlSymbol(this.serverProcessor) + ["dhx_user=" + this._user, "dhx_version=" + this.obj.getUserData(0, "version")].join("&")) : "");
if (this._tMode != "POST") {
A.loadXML(D + ((D.indexOf("?") != -1) ? "&" : "?") + this.serialize(B, C))
} else {
A.loadXML(D, true, this.serialize(B, C))
}
this._waitMode++
},
sendAllData: function () {
if (!this.updatedRows.length) {
return
}
this.messages = [];
var B = true;
for (var A = 0; A < this.updatedRows.length; A++) {
B &= this.checkBeforeUpdate(this.updatedRows[A])
}
if (!B && !this.callEvent("onValidatationError", ["", this.messages])) {
return false
}
if (this._tSend) {
this._sendData(this._getAllData())
} else {
for (var A = 0; A < this.updatedRows.length; A++) {
if (!this._in_progress[this.updatedRows[A]]) {
if (this.is_invalid(this.updatedRows[A])) {
continue
}
this._beforeSendData(this._getRowData(this.updatedRows[A]), this.updatedRows[A]);
if (this._waitMode && (this.obj.mytype == "tree" || this.obj._h2)) {
return
}
}
}
}
},
_getAllData: function (D) {
var B = {};
var A = false;
for (var C = 0; C < this.updatedRows.length; C++) {
var E = this.updatedRows[C];
if (this._in_progress[E] || this.is_invalid(E)) {
continue
}
if (!this.callEvent("onBeforeUpdate", [E, this.getState(E)])) {
continue
}
B[E] = this._getRowData(E, E + this.post_delim);
A = true;
this._in_progress[E] = (new Date()).valueOf()
}
return A ? B : null
},
setVerificator: function (B, A) {
this.mandatoryFields[B] = A || (function (C) {
return (C != "")
})
},
clearVerificator: function (A) {
this.mandatoryFields[A] = false
},
findRow: function (B) {
var A = 0;
for (A = 0; A < this.updatedRows.length; A++) {
if (B == this.updatedRows[A]) {
break
}
}
return A
},
defineAction: function (A, B) {
if (!this._uActions) {
this._uActions = []
}
this._uActions[A] = B
},
afterUpdateCallback: function (B, G, F, E) {
var A = B;
var D = (F != "error" && F != "invalid");
if (!D) {
this.set_invalid(B, F)
}
if ((this._uActions) && (this._uActions[F]) && (!this._uActions[F](E))) {
return (delete this._in_progress[A])
}
if (this._in_progress[A] != "wait") {
this.setUpdated(B, false)
}
var C = B;
switch (F) {
case "inserted":
case "insert":
if (G != B) {
this.obj[this._methods[2]](B, G);
B = G
}
break;
case "delete":
case "deleted":
this.obj.setUserData(B, this.action_param, "true_deleted");
this.obj[this._methods[3]](B);
delete this._in_progress[A];
return this.callEvent("onAfterUpdate", [B, F, G, E]);
break
}
if (this._in_progress[A] != "wait") {
if (D) {
this.obj.setUserData(B, this.action_param, "")
}
delete this._in_progress[A]
} else {
delete this._in_progress[A];
this.setUpdated(G, true, this.obj.getUserData(B, this.action_param))
}
this.callEvent("onAfterUpdate", [B, F, G, E])
},
afterUpdate: function (G, K, I, H, F) {
F.getXMLTopNode("data");
if (!F.xmlDoc.responseXML) {
return
}
var J = F.doXPath("//data/action");
for (var D = 0; D < J.length; D++) {
var E = J[D];
var C = E.getAttribute("type");
var A = E.getAttribute("sid");
var B = E.getAttribute("tid");
G.afterUpdateCallback(A, B, C, E)
}
G.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", [])
}
},
init: function (A) {
this.obj = A;
if (this.obj._dp_init) {
this.obj._dp_init(this)
}
},
setOnAfterUpdate: function (A) {
this.attachEvent("onAfterUpdate", A)
},
enableDebug: function (A) {},
setOnBeforeUpdateHandler: function (A) {
this.attachEvent("onBeforeDataSending", A)
},
/* starts autoupdate mode
@param interval
time interval for sending update requests
*/
setAutoUpdate: function (C, B) {
C = C || 2000;
this._user = B || (new Date()).valueOf();
this._need_update = false;
this._loader = null;
this._update_busy = false;
this.attachEvent("onAfterUpdate", function (D, F, G, E) {
this.afterAutoUpdate(D, F, G, E)
});
this.attachEvent("onFullSync", function () {
this.fullSync()
});
var A = this;
window.setInterval(function () {
A.loadUpdate()
}, C)
},
/* process updating request answer
if status == collision version is depricated
set flag for autoupdating immidiatly
*/
afterAutoUpdate: function (A, C, D, B) {
if (C == "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 (A, B) {
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 = B;
this._loader.loadXML(A)
},
/* returns xml node value
@param node
xml node
*/
_v: function (A) {
if (A.firstChild) {
return A.firstChild.nodeValue
}
return ""
},
/* returns values array of xml nodes array
@param arr
array of xml nodes
*/
_a: function (A) {
var C = [];
for (var B = 0; B < A.length; B++) {
C[B] = this._v(A[B])
}
return C
},
/* loads updates and processes them
*/
loadUpdate: function () {
var B = this;
var A = this.obj.getUserData(0, "version");
var C = this.serverProcessor + getUrlSymbol(this.serverProcessor) + ["dhx_user=" + this._user, "dhx_version=" + A].join("&");
C = C.replace("editing=true&", "");
this.getUpdates(C, function () {
var F = B._loader.doXPath("//userdata");
B.obj.setUserData(0, "version", B._v(F[0]));
var D = B._loader.doXPath("//update");
if (D.length) {
B._silent_mode = true;
for (var G = 0; G < D.length; G++) {
var E = D[G].getAttribute("status");
var I = D[G].getAttribute("id");
var H = D[G].getAttribute("parent");
switch (E) {
case "inserted":
B.callEvent("insertCallback", [D[G], I, H]);
break;
case "updated":
B.callEvent("updateCallback", [D[G], I, H]);
break;
case "deleted":
B.callEvent("deleteCallback", [D[G], I, H]);
break
}
}
B._silent_mode = false
}
B._update_busy = false;
B = null
})
}
};
if (window.dhtmlXGridObject) {
dhtmlXGridObject.prototype._init_point_connector = dhtmlXGridObject.prototype._init_point;
dhtmlXGridObject.prototype._init_point = function () {
var A = function (E) {
E = E.replace(/(\?|\&)connector[^\f]*/g, "");
return E + (E.indexOf("?") != -1 ? "&" : "?") + "connector=true" + (mygrid.hdr.rows.length > 0 ? "&dhx_no_header=1" : "")
};
var D = function (E) {
return A(E) + (this._connector_sorting || "") + (this._connector_filter || "")
};
var C = function (F, G, E) {
this._connector_sorting = "&dhx_sort[" + G + "]=" + E;
return D.call(this, F)
};
var B = function (F, E, H) {
for (var G = 0; G < E.length; G++) {
E[G] = "dhx_filter[" + E[G] + "]=" + encodeURIComponent(H[G])
}
this._connector_filter = "&" + E.join("&");
return D.call(this, F)
};
this.attachEvent("onCollectValues", function (E) {
if (this._con_f_used[E]) {
if (typeof(this._con_f_used[E]) == "object") {
return this._con_f_used[E]
} else {
return false
}
}
return true
});
this.attachEvent("onDynXLS", function () {
this.xmlFileUrl = D.call(this, this.xmlFileUrl);
return true
});
this.attachEvent("onBeforeSorting", function (H, G, F) {
if (G == "connector") {
var E = this;
this.clearAndLoad(C.call(this, this.xmlFileUrl, H, F), function () {
E.setSortImgState(true, H, F)
});
return false
}
return true
});
this.attachEvent("onFilterStart", function (F, E) {
if (this._con_f_used.length) {
this.clearAndLoad(B.call(this, this.xmlFileUrl, F, E));
return false
}
return true
});
this.attachEvent("onXLE", function (F, E, H, G) {
if (!G) {
return
}
});
if (this._init_point_connector) {
this._init_point_connector()
}
};
dhtmlXGridObject.prototype._con_f_used = [];
dhtmlXGridObject.prototype._in_header_connector_text_filter = function (B, A) {
if (!this._con_f_used[A]) {
this._con_f_used[A] = 1
}
return this._in_header_text_filter(B, A)
};
dhtmlXGridObject.prototype._in_header_connector_select_filter = function (B, A) {
if (!this._con_f_used[A]) {
this._con_f_used[A] = 2
}
return this._in_header_select_filter(B, A)
};
dhtmlXGridObject.prototype.load_connector = dhtmlXGridObject.prototype.load;
dhtmlXGridObject.prototype.load = function (B, E, D) {
if (!this._colls_loaded && this.cellType) {
var A = [];
for (var C = 0; C < this.cellType.length; C++) {
if (this.cellType[C].indexOf("co") == 0 || this._con_f_used[C] == 2) {
A.push(C)
}
}
if (A.length) {
arguments[0] += (arguments[0].indexOf("?") != -1 ? "&" : "?") + "connector=true&dhx_colls=" + A.join(",")
}
}
return this.load_connector.apply(this, arguments)
};
dhtmlXGridObject.prototype._parseHead_connector = dhtmlXGridObject.prototype._parseHead;
dhtmlXGridObject.prototype._parseHead = function (A, L, I) {
this._parseHead_connector.apply(this, arguments);
if (!this._colls_loaded) {
var J = this.xmlLoader.doXPath("./coll_options", arguments[0]);
for (var F = 0; F < J.length; F++) {
var H = J[F].getAttribute("for");
var K = [];
var C = null;
if (this.cellType[H] == "combo") {
C = this.getColumnCombo(H)
}
if (this.cellType[H].indexOf("co") == 0) {
C = this.getCombo(H)
}
var E = this.xmlLoader.doXPath("./item", J[F]);
for (var D = 0; D < E.length; D++) {
var B = E[D].getAttribute("value");
if (C) {
var G = E[D].getAttribute("label") || B;
if (C.addOption) {
C.addOption([
[B, G]
])
} else {
C.put(B, G)
}
K[K.length] = G
} else {
K[K.length] = B
}
}
if (this._con_f_used[H * 1]) {
this._con_f_used[H * 1] = K
}
}
this._colls_loaded = true
}
}
}
if (window.dataProcessor) {
dataProcessor.prototype.init_original = dataProcessor.prototype.init;
dataProcessor.prototype.init = function (A) {
this.init_original(A);
A._dataprocessor = this;
this.setTransactionMode("POST", true);
this.serverProcessor += (this.serverProcessor.indexOf("?") != -1 ? "&" : "?") + "editing=true"
}
}
dhtmlxError.catchError("LoadXML", function (B, A, C) {
alert(C[0].responseText)
});
window.dhtmlXScheduler = window.scheduler = {
version: 2.2
};
dhtmlxEventable(scheduler);
scheduler.init = function (C, A, B) {
A = A || (new Date());
B = B || "week";
this._obj = (typeof C == "string") ? document.getElementById(C) : C;
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();
dhtmlxEvent(window, "resize", function () {
window.clearTimeout(scheduler._resize_timer);
scheduler._resize_timer = window.setTimeout(function () {
if (scheduler.callEvent("onSchedulerResize", [])) {
scheduler.update_view()
}
}, 100)
});
this.set_sizes();
this.setCurrentView(A, B)
};
scheduler.xy = {
nav_height: 22,
min_event_height: 40,
scale_width: 50,
bar_height: 20,
scroll_width: 18,
scale_height: 20,
month_scale_height: 20,
menu_width: 25,
margin_top: 0,
margin_left: 0,
editor_width: 140
};
scheduler.keys = {
edit_save: 13,
edit_cancel: 27
};
scheduler.set_sizes = function () {
var B = this._x = this._obj.clientWidth - this.xy.margin_left;
var D = this._y = this._obj.clientHeight - this.xy.margin_top;
var E = this._table_view ? 0 : (this.xy.scale_width + this.xy.scroll_width);
var A = this._table_view ? -1 : this.xy.scale_width;
this.set_xy(this._els.dhx_cal_navline[0], B, this.xy.nav_height, 0, 0);
this.set_xy(this._els.dhx_cal_header[0], B - E, this.xy.scale_height, A, this.xy.nav_height + (this._quirks ? -1 : 1));
var F = this._els.dhx_cal_navline[0].offsetHeight;
if (F > 0) {
this.xy.nav_height = F
}
var C = this.xy.scale_height + this.xy.nav_height + (this._quirks ? -2 : 0);
this.set_xy(this._els.dhx_cal_data[0], B, D - (C + 2), 0, C + 2)
};
scheduler.set_xy = function (D, B, C, A, E) {
D.style.width = Math.max(0, B) + "px";
D.style.height = Math.max(0, C) + "px";
if (arguments.length > 3) {
D.style.left = A + "px";
D.style.top = E + "px"
}
};
scheduler.get_elements = function () {
var D = this._obj.getElementsByTagName("DIV");
for (var C = 0; C < D.length; C++) {
var A = D[C].className;
if (!this._els[A]) {
this._els[A] = []
}
this._els[A].push(D[C]);
var B = scheduler.locale.labels[D[C].getAttribute("name") || A];
if (B) {
D[C].innerHTML = B
}
}
};
scheduler.set_actions = function () {
for (var A in this._els) {
if (this._click[A]) {
for (var B = 0; B < this._els[A].length; B++) {
this._els[A][B].onclick = scheduler._click[A]
}
}
}
this._obj.onselectstart = function (C) {
return false
};
this._obj.onmousemove = function (C) {
scheduler._on_mouse_move(C || event)
};
this._obj.onmousedown = function (C) {
scheduler._on_mouse_down(C || event)
};
this._obj.onmouseup = function (C) {
scheduler._on_mouse_up(C || event)
};
this._obj.ondblclick = function (C) {
scheduler._on_dbl_click(C || event)
}
};
scheduler.select = function (A) {
if (this._table_view || !this.getEvent(A)._timed) {
return
}
if (this._select_id == A) {
return
}
this.editStop(false);
this.unselect();
this._select_id = A;
this.updateEvent(A)
};
scheduler.unselect = function (B) {
if (B && B != this._select_id) {
return
}
var A = this._select_id;
this._select_id = null;
if (A) {
this.updateEvent(A)
}
};
scheduler.getState = function () {
return {
mode: this._mode,
date: this._date,
min_date: this._min_date,
max_date: this._max_date,
editor_id: this._edit_id,
lightbox_id: this._lightbox_id
}
};
scheduler._click = {
dhx_cal_data: function (C) {
var B = C ? C.target : event.srcElement;
var D = scheduler._locate_event(B);
C = C || event;
if ((D && !scheduler.callEvent("onClick", [D, C])) || scheduler.config.readonly) {
return
}
if (D) {
scheduler.select(D);
var A = B.className;
if (A.indexOf("_icon") != -1) {
scheduler._click.buttons[A.split(" ")[1].replace("icon_", "")](D)
}
} else {
scheduler._close_not_saved()
}
},
dhx_cal_prev_button: function () {
scheduler._click.dhx_cal_next_button(0, -1)
},
dhx_cal_next_button: function (B, A) {
scheduler.setCurrentView(scheduler.date.add(scheduler.date[scheduler._mode + "_start"](scheduler._date), (A || 1), scheduler._mode))
},
dhx_cal_today_button: function () {
scheduler.setCurrentView(new Date())
},
dhx_cal_tab: function () {
var A = this.getAttribute("name").split("_")[0];
scheduler.setCurrentView(scheduler._date, A)
},
buttons: {
"delete": function (B) {
var A = scheduler.locale.labels.confirm_deleting;
if (!A || confirm(A)) {
scheduler.deleteEvent(B)
}
},
edit: function (A) {
scheduler.edit(A)
},
save: function (A) {
scheduler.editStop(true)
},
details: function (A) {
scheduler.showLightbox(A)
},
cancel: function (A) {
scheduler.editStop(false)
}
}
};
scheduler.addEventNow = function (G, B, D) {
var C = {};
if (typeof G == "object") {
C = G;
G = null
}
var E = (this.config.event_duration || this.config.time_step) * 60000;
if (!G) {
G = Math.round((new Date()).valueOf() / E) * E
}
var A = new Date(G);
if (!B) {
var F = this.config.first_hour;
if (F > A.getHours()) {
A.setHours(F);
G = A.valueOf()
}
B = G + E
}
C.start_date = C.start_date || A;
C.end_date = C.end_date || new Date(B);
C.text = C.text || this.locale.labels.new_event;
C.id = this._drag_id = this.uid();
this._drag_mode = "new-size";
this._loading = true;
this.addEvent(C);
this.callEvent("onEventCreated", [this._drag_id, D]);
this._loading = false;
this._drag_event = {};
this._on_mouse_up(D)
};
scheduler._on_dbl_click = function (C, D) {
D = D || (C.target || C.srcElement);
if (this.config.readonly) {
return
}
var A = D.className.split(" ")[0];
switch (A) {
case "dhx_scale_holder":
case "dhx_scale_holder_now":
case "dhx_month_body":
if (!scheduler.config.dblclick_create) {
break
}
var G = this._mouse_coords(C);
var F = this._min_date.valueOf() + (G.y * this.config.time_step + (this._table_view ? 0 : G.x) * 24 * 60) * 60000;
F = this._correct_shift(F);
this.addEventNow(F, null, C);
break;
case "dhx_body":
case "dhx_cal_event_line":
case "dhx_cal_event_clear":
var E = this._locate_event(D);
if (!this.callEvent("onDblClick", [E, C])) {
return
}
if (this.config.details_on_dblclick || this._table_view || !this.getEvent(E)._timed) {
this.showLightbox(E)
} else {
this.edit(E)
}
break;
case "":
if (D.parentNode) {
return scheduler._on_dbl_click(C, D.parentNode)
}
default:
var B = this["dblclick_" + A];
if (B) {
B.call(this, C)
}
break
}
};
scheduler._mouse_coords = function (D) {
var F;
var A = document.body;
var E = document.documentElement;
if (D.pageX || D.pageY) {
F = {
x: D.pageX,
y: D.pageY
}
} else {
F = {
x: D.clientX + (A.scrollLeft || E.scrollLeft || 0) - A.clientLeft,
y: D.clientY + (A.scrollTop || E.scrollTop || 0) - A.clientTop
}
}
F.x -= getAbsoluteLeft(this._obj) + (this._table_view ? 0 : this.xy.scale_width);
F.y -= getAbsoluteTop(this._obj) + this.xy.nav_height + (this._dy_shift || 0) + this.xy.scale_height - this._els.dhx_cal_data[0].scrollTop;
F.ev = D;
var C = this["mouse_" + this._mode];
if (C) {
return C.call(this, F)
}
if (!this._table_view) {
F.x = Math.max(0, Math.ceil(F.x / this._cols[0]) - 1);
F.y = Math.max(0, Math.ceil(F.y * 60 / (this.config.time_step * this.config.hour_size_px)) - 1) + this.config.first_hour * (60 / this.config.time_step)
} else {
var B = 0;
for (B = 1; B < this._colsS.heights.length; B++) {
if (this._colsS.heights[B] > F.y) {
break
}
}
F.y = (Math.max(0, Math.ceil(F.x / this._cols[0]) - 1) + Math.max(0, B - 1) * 7) * 24 * 60 / this.config.time_step;
F.x = 0
}
return F
};
scheduler._close_not_saved = function () {
if (new Date().valueOf() - (scheduler._new_event || 0) > 500 && scheduler._edit_id) {
var A = scheduler.locale.labels.confirm_closing;
if (!A || confirm(A)) {
scheduler.editStop(scheduler.config.positive_closing)
}
}
};
scheduler._correct_shift = function (B, A) {
return B -= ((new Date(scheduler._min_date)).getTimezoneOffset() - (new Date(B)).getTimezoneOffset()) * 60000 * (A ? -1 : 1)
};
scheduler._on_mouse_move = function (F) {
if (this._drag_mode) {
var G = this._mouse_coords(F);
if (!this._drag_pos || this._drag_pos.x != G.x || this._drag_pos.y != G.y) {
if (this._edit_id != this._drag_id) {
this._close_not_saved()
}
this._drag_pos = G;
if (this._drag_mode == "create") {
this._close_not_saved();
this._loading = true;
var B = this._min_date.valueOf() + (G.y * this.config.time_step + (this._table_view ? 0 : G.x) * 24 * 60) * 60000;
B = this._correct_shift(B);
if (!this._drag_start) {
this._drag_start = B;
return
}
var E = B;
if (E == this._drag_start) {
return
}
this._drag_id = this.uid();
this.addEvent(new Date(this._drag_start), new Date(E), this.locale.labels.new_event, this._drag_id, G.fields);
this.callEvent("onEventCreated", [this._drag_id, F]);
this._loading = false;
this._drag_mode = "new-size"
}
var H = this.getEvent(this._drag_id);
var B, E;
if (this._drag_mode == "move") {
B = this._min_date.valueOf() + (G.y * this.config.time_step + G.x * 24 * 60) * 60000;
if (!G.custom && this._table_view) {
B += this.date.time_part(H.start_date) * 1000
}
B = this._correct_shift(B);
E = H.end_date.valueOf() - (H.start_date.valueOf() - B)
} else {
B = H.start_date.valueOf();
if (this._table_view) {
E = this._min_date.valueOf() + G.y * this.config.time_step * 60000 + (G.custom ? 0 : 24 * 60 * 60000)
} else {
E = this.date.date_part(new Date(H.end_date)).valueOf() + G.y * this.config.time_step * 60000;
this._els.dhx_cal_data[0].style.cursor = "s-resize";
if (this._mode == "week" || this._mode == "day") {
E = this._correct_shift(E)
}
}
if (this._drag_mode == "new-size") {
if (E <= this._drag_start) {
var D = G.shift || ((this._table_view && !G.custom) ? 24 * 60 * 60000 : 0);
B = E - D;
E = this._drag_start + (D || (this.config.time_step * 60000))
} else {
B = this._drag_start
}
} else {
if (E <= B) {
E = B + this.config.time_step * 60000
}
}
}
var I = new Date(E - 1);
var C = new Date(B);
if (this._table_view || (I.getDate() == C.getDate() && I.getHours() < this.config.last_hour)) {
H.start_date = C;
H.end_date = new Date(E);
if (this.config.update_render) {
this.update_view()
} else {
this.updateEvent(this._drag_id)
}
}
if (this._table_view) {
this.for_rendered(this._drag_id, function (J) {
J.className += " dhx_in_move"
})
}
}
} else {
if (scheduler.checkEvent("onMouseMove")) {
var A = this._locate_event(F.target || F.srcElement);
this.callEvent("onMouseMove", [A, F])
}
}
};
scheduler._on_mouse_context = function (A, B) {
return this.callEvent("onContextMenu", [this._locate_event(B), A])
};
scheduler._on_mouse_down = function (A, B) {
if (this.config.readonly || this._drag_mode) {
return
}
B = B || (A.target || A.srcElement);
if (A.button == 2 || A.ctrlKey) {
return this._on_mouse_context(A, B)
}
switch (B.className.split(" ")[0]) {
case "dhx_cal_event_line":
case "dhx_cal_event_clear":
if (this._table_view) {
this._drag_mode = "move"
}
break;
case "dhx_header":
case "dhx_title":
this._drag_mode = "move";
break;
case "dhx_footer":
this._drag_mode = "resize";
break;
case "dhx_scale_holder":
case "dhx_scale_holder_now":
case "dhx_month_body":
case "dhx_matrix_cell":
this._drag_mode = "create";
break;
case "":
if (B.parentNode) {
return scheduler._on_mouse_down(A, B.parentNode)
}
default:
this._drag_mode = null;
this._drag_id = null
}
if (this._drag_mode) {
var C = this._locate_event(B);
if (!this.config["drag_" + this._drag_mode] || !this.callEvent("onBeforeDrag", [C, this._drag_mode, A])) {
this._drag_mode = this._drag_id = 0
} else {
this._drag_id = C;
this._drag_event = this._copy_event(this.getEvent(this._drag_id) || {})
}
}
this._drag_start = null
};
scheduler._on_mouse_up = function (B) {
if (this._drag_mode && this._drag_id) {
this._els.dhx_cal_data[0].style.cursor = "default";
var A = this.getEvent(this._drag_id);
if (this._drag_event._dhx_changed || !this._drag_event.start_date || A.start_date.valueOf() != this._drag_event.start_date.valueOf() || A.end_date.valueOf() != this._drag_event.end_date.valueOf()) {
var C = (this._drag_mode == "new-size");
if (!this.callEvent("onBeforeEventChanged", [A, B, C])) {
if (C) {
this.deleteEvent(A.id, true)
} else {
A.start_date = this._drag_event.start_date;
A.end_date = this._drag_event.end_date;
this.updateEvent(A.id)
}
} else {
if (C && this.config.edit_on_create) {
this.unselect();
this._new_event = new Date();
if (this._table_view || this.config.details_on_create) {
this._drag_mode = null;
return this.showLightbox(this._drag_id)
}
this._drag_pos = true;
this._select_id = this._edit_id = this._drag_id
} else {
if (!this._new_event) {
this.callEvent(C ? "onEventAdded" : "onEventChanged", [this._drag_id, this.getEvent(this._drag_id)])
}
}
}
}
if (this._drag_pos) {
this.render_view_data()
}
}
this._drag_mode = null;
this._drag_pos = null
};
scheduler.update_view = function () {
this._reset_scale();
if (this._load_mode && this._load()) {
return this._render_wait = true
}
this.render_view_data()
};
scheduler.setCurrentView = function (B, E) {
if (!this.callEvent("onBeforeViewChange", [this._mode, this._date, E, B])) {
return
}
if (this[this._mode + "_view"] && E && this._mode != E) {
this[this._mode + "_view"](false)
}
this._close_not_saved();
this._mode = E || this._mode;
this._date = B;
this._table_view = (this._mode == "month");
var D = this._els.dhx_cal_tab;
for (var C = 0; C < D.length; C++) {
D[C].className = "dhx_cal_tab" + ((D[C].getAttribute("name") == this._mode + "_tab") ? " active" : "")
}
var A = this[this._mode + "_view"];
A ? A(true) : this.update_view();
this.callEvent("onViewChange", [this._mode, this._date])
};
scheduler._render_x_header = function (B, D, E, C) {
var A = document.createElement("DIV");
A.className = "dhx_scale_bar";
this.set_xy(A, this._cols[B] - 1, this.xy.scale_height - 2, D, 0);
A.innerHTML = this.templates[this._mode + "_scale_date"](E, this._mode);
C.appendChild(A)
};
scheduler._reset_scale = function () {
if (!this.templates[this._mode + "_date"]) {
return
}
var M = this._els.dhx_cal_header[0];
var R = this._els.dhx_cal_data[0];
var P = this.config;
M.innerHTML = "";
R.scrollTop = 0;
R.innerHTML = "";
var K = ((P.readonly || (!P.drag_resize)) ? " dhx_resize_denied" : "") + ((P.readonly || (!P.drag_move)) ? " dhx_move_denied" : "");
if (K) {
R.className = "dhx_cal_data" + K
}
this._cols = [];
this._colsS = {
height: 0
};
this._dy_shift = 0;
this.set_sizes();
var I = parseInt(M.style.width);
var C = 0;
var O, Q, A, N;
Q = this.date[this._mode + "_start"](new Date(this._date.valueOf()));
O = A = this._table_view ? scheduler.date.week_start(Q) : Q;
N = this.date.date_part(new Date());
var D = scheduler.date.add(Q, 1, this._mode);
var E = 7;
if (!this._table_view) {
var G = this.date["get_" + this._mode + "_end"];
if (G) {
D = G(Q)
}
E = Math.round((D.valueOf() - Q.valueOf()) / (1000 * 60 * 60 * 24))
}
this._min_date = O;
this._els.dhx_cal_date[0].innerHTML = this.templates[this._mode + "_date"](Q, D, this._mode);
for (var L = 0; L < E; L++) {
this._cols[L] = Math.floor(I / (E - L));
this._render_x_header(L, C, O, M);
if (!this._table_view) {
var F = document.createElement("DIV");
var B = "dhx_scale_holder";
if (O.valueOf() == N.valueOf()) {
B = "dhx_scale_holder_now"
}
F.className = B + " " + this.templates.week_date_class(O, N);
this.set_xy(F, this._cols[L] - 1, P.hour_size_px * (P.last_hour - P.first_hour), C + this.xy.scale_width + 1, 0);
R.appendChild(F)
}
O = this.date.add(O, 1, "day");
I -= this._cols[L];
C += this._cols[L];
this._colsS[L] = (this._cols[L - 1] || 0) + (this._colsS[L - 1] || (this._table_view ? 0 : this.xy.scale_width + 2))
}
this._max_date = O;
this._colsS[E] = this._cols[E - 1] + this._colsS[E - 1];
if (this._table_view) {
this._reset_month_scale(R, Q, A)
} else {
this._reset_hours_scale(R, Q, A);
if (P.multi_day) {
var J = document.createElement("DIV");
J.className = "dhx_multi_day";
J.style.visibility = "hidden";
this.set_xy(J, parseInt(M.style.width), 0, this.xy.scale_width, 0);
R.appendChild(J);
var H = J.cloneNode(true);
H.className = "dhx_multi_day_icon";
H.style.visibility = "hidden";
this.set_xy(H, this.xy.scale_width - 1, 0, 0, 0);
R.appendChild(H);
this._els.dhx_multi_day = [J, H]
}
}
};
scheduler._reset_hours_scale = function (B, A, E) {
var G = document.createElement("DIV");
G.className = "dhx_scale_holder";
var C = new Date(1980, 1, 1, this.config.first_hour, 0, 0);
for (var D = this.config.first_hour * 1; D < this.config.last_hour; D++) {
var F = document.createElement("DIV");
F.className = "dhx_scale_hour";
F.style.height = this.config.hour_size_px - (this._quirks ? 0 : 1) + "px";
F.style.width = this.xy.scale_width + "px";
F.innerHTML = scheduler.templates.hour_scale(C);
G.appendChild(F);
C = this.date.add(C, 1, "hour")
}
B.appendChild(G);
if (this.config.scroll_hour) {
B.scrollTop = this.config.hour_size_px * (this.config.scroll_hour - this.config.first_hour)
}
};
scheduler._reset_month_scale = function (J, K, I) {
var H = scheduler.date.add(K, 1, "month");
var A = new Date();
this.date.date_part(A);
this.date.date_part(I);
var N = Math.ceil((H.valueOf() - I.valueOf()) / (60 * 60 * 24 * 1000 * 7));
var B = [];
var L = (Math.floor(J.clientHeight / N) - 22);
this._colsS.height = L + 22;
var G = this._colsS.heights = [];
for (var E = 0; E <= 7; E++) {
B[E] = " style='height:" + L + "px; width:" + ((this._cols[E] || 0) - 1) + "px;' "
}
var D = 0;
this._min_date = I;
var F = "<table cellpadding='0' cellspacing='0'>";
for (var E = 0; E < N; E++) {
F += "<tr>";
for (var C = 0; C < 7; C++) {
F += "<td";
var M = "";
if (I < K) {
M = "dhx_before"
} else {
if (I >= H) {
M = "dhx_after"
} else {
if (I.valueOf() == A.valueOf()) {
M = "dhx_now"
}
}
}
F += " class='" + M + " " + this.templates.month_date_class(I, A) + "' ";
F += "><div class='dhx_month_head'>" + this.templates.month_day(I) + "</div><div class='dhx_month_body' " + B[C] + "></div></td>";
I = this.date.add(I, 1, "day")
}
F += "</tr>";
G[E] = D;
D += this._colsS.height
}
F += "</table>";
this._max_date = I;
J.innerHTML = F;
return I
};
scheduler.getLabel = function (E, D) {
var F = this.config.lightbox.sections;
for (var C = 0; C < F.length; C++) {
if (F[C].map_to == E) {
var B = F[C].options;
for (var A = 0; A < B.length; A++) {
if (B[A].key == D) {
return B[A].label
}
}
}
}
return ""
};
scheduler.date = {
date_part: function (A) {
A.setHours(0);
A.setMinutes(0);
A.setSeconds(0);
A.setMilliseconds(0);
return A
},
time_part: function (A) {
return (A.valueOf() / 1000 - A.getTimezoneOffset() * 60) % 86400
},
week_start: function (B) {
var A = B.getDay();
if (scheduler.config.start_on_monday) {
if (A == 0) {
A = 6
} else {
A--
}
}
return this.date_part(this.add(B, -1 * A, "day"))
},
month_start: function (A) {
A.setDate(1);
return this.date_part(A)
},
year_start: function (A) {
A.setMonth(0);
return this.month_start(A)
},
day_start: function (A) {
return this.date_part(A)
},
add: function (B, C, D) {
var A = new Date(B.valueOf());
switch (D) {
case "day":
A.setDate(A.getDate() + C);
break;
case "week":
A.setDate(A.getDate() + 7 * C);
break;
case "month":
A.setMonth(A.getMonth() + C);
break;
case "year":
A.setYear(A.getFullYear() + C);
break;
case "hour":
A.setHours(A.getHours() + C);
break;
case "minute":
A.setMinutes(A.getMinutes() + C);
break;
default:
return scheduler.date["add_" + D](B, C, D)
}
return A
},
to_fixed: function (A) {
if (A < 10) {
return "0" + A
}
return A
},
copy: function (A) {
return new Date(A.valueOf())
},
date_to_str: function (B, A) {
B = B.replace(/%[a-zA-Z]/g, function (C) {
switch (C) {
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 C
}
});
if (A) {
B = B.replace(/date\.get/g, "date.getUTC")
}
return new Function("date", 'return "' + B + '";')
},
str_to_date: function (E, C) {
var F = "var temp=date.split(/[^0-9a-zA-Z]+/g);";
var A = E.match(/%[a-zA-Z]/g);
for (var B = 0; B < A.length; B++) {
switch (A[B]) {
case "%j":
case "%d":
F += "set[2]=temp[" + B + "]||1;";
break;
case "%n":
case "%m":
F += "set[1]=(temp[" + B + "]||1)-1;";
break;
case "%y":
F += "set[0]=temp[" + B + "]*1+(temp[" + B + "]>50?1900:2000);";
break;
case "%g":
case "%G":
case "%h":
case "%H":
F += "set[3]=temp[" + B + "]||0;";
break;
case "%i":
F += "set[4]=temp[" + B + "]||0;";
break;
case "%Y":
F += "set[0]=temp[" + B + "]||0;";
break;
case "%a":
case "%A":
F += "set[3]=set[3]%12+((temp[" + B + "]||'').toLowerCase()=='am'?0:12);";
break;
case "%s":
F += "set[5]=temp[" + B + "]||0;";
break
}
}
var D = "set[0],set[1],set[2],set[3],set[4],set[5]";
if (C) {
D = " Date.UTC(" + D + ")"
}
return new Function("date", "var set=[0,0,1,0,0,0]; " + F + " return new Date(" + D + ");")
},
getISOWeek: function (C) {
if (!C) {
return false
}
var B = C.getDay();
if (B == 0) {
B = 7
}
var D = new Date(C.valueOf());
D.setDate(C.getDate() + (4 - B));
var A = D.getFullYear();
var F = Math.floor((D.getTime() - new Date(A, 0, 1).getTime()) / 86400000);
var E = 1 + Math.floor(F / 7);
return E
},
getUTCISOWeek: function (A) {
return this.getISOWeek(A)
}
};
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: "",
confirm_deleting: "Event will be deleted permanently, are you sure?",
section_description: "Description",
section_time: "Time period",
full_day: "Full day",
confirm_recurring: "Do you want to edit the whole set of repeated events?",
section_recurring: "Repeat event",
button_recurring: "Disabled",
button_recurring_open: "Enabled",
agenda_tab: "Agenda",
date: "Date",
description: "Description",
year_tab: "Year"
}
};
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",
hour_size_px: 42,
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,
click_form_details: 0,
server_utc: false,
positive_closing: false,
icons_edit: ["icon_save", "icon_cancel"],
icons_select: ["icon_details", "icon_edit", "icon_delete"],
lightbox: {
sections: [{
name: "description",
height: 200,
map_to: "text",
type: "textarea",
focus: true
}, {
name: "time",
height: 72,
type: "time",
map_to: "auto"
}]
}
};
scheduler.templates = {};
scheduler.init_templates = function () {
var B = scheduler.date.date_to_str;
var C = scheduler.config;
var A = function (E, D) {
for (var F in D) {
if (!E[F]) {
E[F] = D[F]
}
}
};
A(scheduler.templates, {
day_date: B(C.default_date),
month_date: B(C.month_date),
week_date: function (E, D) {
return scheduler.templates.day_date(E) + " &ndash; " + scheduler.templates.day_date(scheduler.date.add(D, -1, "day"))
},
day_scale_date: B(C.default_date),
month_scale_date: B(C.week_date),
week_scale_date: B(C.day_date),
hour_scale: B(C.hour_date),
time_picker: B(C.hour_date),
event_date: B(C.hour_date),
month_day: B(C.month_day),
xml_date: scheduler.date.str_to_date(C.xml_date, C.server_utc),
load_format: B(C.load_date, C.server_utc),
xml_format: B(C.xml_date, C.server_utc),
api_date: scheduler.date.str_to_date(C.api_date),
event_header: function (F, D, E) {
return scheduler.templates.event_date(F) + " - " + scheduler.templates.event_date(D)
},
event_text: function (F, D, E) {
return E.text
},
event_class: function (F, D, E) {
return ""
},
month_date_class: function (D) {
return ""
},
week_date_class: function (D) {
return ""
},
event_bar_date: function (F, D, E) {
return scheduler.templates.event_date(F) + " "
},
event_bar_text: function (F, D, E) {
return E.text
}
});
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()
};
scheduler.addEvent = function (A, G, D, F, B) {
var C = A;
if (arguments.length != 1) {
C = B || {};
C.start_date = A;
C.end_date = G;
C.text = D;
C.id = F
}
C.id = C.id || scheduler.uid();
C.text = C.text || "";
if (typeof C.start_date == "string") {
C.start_date = this.templates.api_date(C.start_date)
}
if (typeof C.end_date == "string") {
C.end_date = this.templates.api_date(C.end_date)
}
C._timed = this.is_one_day_event(C);
var E = !this._events[C.id];
this._events[C.id] = C;
this.event_updated(C);
if (!this._loading) {
this.callEvent(E ? "onEventAdded" : "onEventChanged", [C.id, C])
}
};
scheduler.deleteEvent = function (C, A) {
var B = this._events[C];
if (!A && !this.callEvent("onBeforeEventDelete", [C, B])) {
return
}
if (B) {
delete this._events[C];
this.unselect(C);
this.event_updated(B)
}
};
scheduler.getEvent = function (A) {
return this._events[A]
};
scheduler.setEvent = function (B, A) {
this._events[B] = A
};
scheduler.for_rendered = function (C, B) {
for (var A = this._rendered.length - 1; A >= 0; A--) {
if (this._rendered[A].getAttribute("event_id") == C) {
B(this._rendered[A], A)
}
}
};
scheduler.changeEventId = function (C, A) {
if (C == A) {
return
}
var B = this._events[C];
if (B) {
B.id = A;
this._events[A] = B;
delete this._events[C]
}
this.for_rendered(C, function (D) {
D.setAttribute("event_id", A)
});
if (this._select_id == C) {
this._select_id = A
}
if (this._edit_id == C) {
this._edit_id = A
}
this.callEvent("onEventIdChange", [C, A])
};
(function () {
var A = ["text", "Text", "start_date", "StartDate", "end_date", "EndDate"];
var C = function (E) {
return function (F) {
return (scheduler.getEvent(F))[E]
}
};
var D = function (E) {
return function (H, G) {
var F = scheduler.getEvent(H);
F[E] = G;
F._changed = true;
F._timed = this.is_one_day_event(F);
scheduler.event_updated(F, true)
}
};
for (var B = 0; B < A.length; B += 2) {
scheduler["getEvent" + A[B + 1]] = C(A[B]);
scheduler["setEvent" + A[B + 1]] = D(A[B])
}
})();
scheduler.event_updated = function (A, B) {
if (this.is_visible_events(A)) {
this.render_view_data()
} else {
this.clear_event(A.id)
}
};
scheduler.is_visible_events = function (A) {
if (A.start_date < this._max_date && this._min_date < A.end_date) {
return true
}
return false
};
scheduler.is_one_day_event = function (A) {
var B = A.end_date.getDate() - A.start_date.getDate();
if (!B) {
return A.start_date.getMonth() == A.end_date.getMonth() && A.start_date.getFullYear() == A.end_date.getFullYear()
} else {
if (B < 0) {
B = Math.ceil((A.end_date.valueOf() - A.start_date.valueOf()) / (24 * 60 * 60 * 1000))
}
return (B == 1 && !A.end_date.getHours() && !A.end_date.getMinutes() && (A.start_date.getHours() || A.start_date.getMinutes()))
}
};
scheduler.get_visible_events = function () {
var A = [];
var B = this["filter_" + this._mode];
for (var C in this._events) {
if (this.is_visible_events(this._events[C])) {
if (this._table_view || this.config.multi_day || this._events[C]._timed) {
if (!B || B(C, this._events[C])) {
A.push(this._events[C])
}
}
}
}
return A
};
scheduler.render_view_data = function () {
if (this._not_render) {
this._render_wait = true;
return
}
this._render_wait = false;
this.clear_view();
var B = this.get_visible_events();
if (this.config.multi_day && !this._table_view) {
var D = [];
var A = [];
for (var C = 0; C < B.length; C++) {
if (B[C]._timed) {
D.push(B[C])
} else {
A.push(B[C])
}
}
this._table_view = true;
this.render_data(A);
this._table_view = false;
this.render_data(D)
} else {
this.render_data(B)
}
};
scheduler.render_data = function (A, C) {
A = this._pre_render_events(A, C);
for (var B = 0; B < A.length; B++) {
if (this._table_view) {
this.render_event_bar(A[B])
} else {
this.render_event(A[B])
}
}
};
scheduler._pre_render_events = function (M, A) {
var G = this.xy.bar_height;
var D = this._colsS.heights;
var F = this._colsS.heights = [0, 0, 0, 0, 0, 0, 0];
if (!this._table_view) {
M = this._pre_render_events_line(M, A)
} else {
M = this._pre_render_events_table(M, A)
}
if (this._table_view) {
if (A) {
this._colsS.heights = D
} else {
var B = this._els.dhx_cal_data[0].firstChild;
if (B.rows) {
for (var E = 0; E < B.rows.length; E++) {
F[E]++;
if ((F[E]) * G > this._colsS.height - 22) {
var N = B.rows[E].cells;
for (var C = 0; C < N.length; C++) {
N[C].childNodes[1].style.height = F[E] * G + "px"
}
F[E] = (F[E - 1] || 0) + N[0].offsetHeight
}
F[E] = (F[E - 1] || 0) + B.rows[E].cells[0].offsetHeight
}
F.unshift(0);
if (B.parentNode.offsetHeight < B.parentNode.scrollHeight && !B._h_fix) {
for (var E = 0; E < B.rows.length; E++) {
var L = B.rows[E].cells[6].childNodes[0];
var J = L.offsetWidth - scheduler.xy.scroll_width + "px";
L.style.width = J;
L.nextSibling.style.width = J
}
B._h_fix = true
}
} else {
if (!M.length && this._els.dhx_multi_day[0].style.visibility == "visible") {
F[0] = -1
}
if (M.length || F[0] == -1) {
var H = B.parentNode.childNodes;
var I = (F[0] + 1) * G + "px";
for (var E = 0; E < H.length; E++) {
if (this._colsS[E]) {
H[E].style.top = I
}
}
var K = this._els.dhx_multi_day[0];
K.style.top = "0px";
K.style.height = I;
K.style.visibility = (F[0] == -1 ? "hidden" : "visible");
K = this._els.dhx_multi_day[1];
K.style.height = I;
K.style.visibility = (F[0] == -1 ? "hidden" : "visible");
K.className = F[0] ? "dhx_multi_day_icon" : "dhx_multi_day_icon_small";
this._dy_shift = (F[0] + 1) * G;
F[0] = 0
}
}
}
}
return M
};
scheduler._get_event_sday = function (A) {
return Math.floor((A.start_date.valueOf() - this._min_date.valueOf()) / (24 * 60 * 60 * 1000))
};
scheduler._pre_render_events_line = function (H, A) {
H.sort(function (K, J) {
return K.start_date > J.start_date ? 1 : -1
});
var G = [];
var I = [];
for (var C = 0; C < H.length; C++) {
var F = H[C];
var D = F.start_date.getHours();
var B = F.end_date.getHours();
F._sday = this._get_event_sday(F);
if (!G[F._sday]) {
G[F._sday] = []
}
if (!A) {
F._inner = false;
var E = G[F._sday];
while (E.length && E[E.length - 1].end_date <= F.start_date) {
E.splice(E.length - 1, 1)
}
if (E.length) {
E[E.length - 1]._inner = true
}
F._sorder = E.length;
E.push(F);
if (E.length > (E.max_count || 0)) {
E.max_count = E.length
}
}
if (D < this.config.first_hour || B >= this.config.last_hour) {
I.push(F);
H[C] = F = this._copy_event(F);
if (D < this.config.first_hour) {
F.start_date.setHours(this.config.first_hour);
F.start_date.setMinutes(0)
}
if (B >= this.config.last_hour) {
F.end_date.setMinutes(0);
F.end_date.setHours(this.config.last_hour)
}
if (F.start_date > F.end_date || D == this.config.last_hour) {
H.splice(C, 1);
C--;
continue
}
}
}
if (!A) {
for (var C = 0; C < H.length; C++) {
H[C]._count = G[H[C]._sday].max_count
}
for (var C = 0; C < I.length; C++) {
I[C]._count = G[I[C]._sday].max_count
}
}
return H
};
scheduler._time_order = function (A) {
A.sort(function (C, B) {
if (C.start_date.valueOf() == B.start_date.valueOf()) {
if (C._timed && !B._timed) {
return 1
}
if (!C._timed && B._timed) {
return -1
}
return 0
}
return C.start_date > B.start_date ? 1 : -1
})
};
scheduler._pre_render_events_table = function (P, C) {
this._time_order(P);
var F = [];
var A = [
[],
[],
[],
[],
[],
[],
[]
];
var N = this._colsS.heights;
var I;
var M = this._cols.length;
for (var G = 0; G < P.length; G++) {
var L = P[G];
var J = (I || L.start_date);
var H = L.end_date;
if (J < this._min_date) {
J = this._min_date
}
if (H > this._max_date) {
H = this._max_date
}
var E = this.locate_holder_day(J, false, L);
L._sday = E % M;
var O = this.locate_holder_day(H, true, L) || M;
L._eday = (O % M) || M;
L._length = O - E;
L._sweek = Math.floor((this._correct_shift(J.valueOf(), 1) - this._min_date.valueOf()) / (60 * 60 * 1000 * 24 * M));
var K = A[L._sweek];
var D;
for (D = 0; D < K.length; D++) {
if (K[D]._eday <= L._sday) {
break
}
}
L._sorder = D;
if (L._sday + L._length <= M) {
I = null;
F.push(L);
K[D] = L;
N[L._sweek] = K.length - 1
} else {
var B = this._copy_event(L);
B._length = M - L._sday;
B._eday = M;
B._sday = L._sday;
B._sweek = L._sweek;
B._sorder = L._sorder;
B.end_date = this.date.add(J, B._length, "day");
F.push(B);
K[D] = B;
I = B.end_date;
N[L._sweek] = K.length - 1;
G--;
continue
}
}
return F
};
scheduler._copy_dummy = function () {
this.start_date = new Date(this.start_date);
this.end_date = new Date(this.end_date)
};
scheduler._copy_event = function (A) {
this._copy_dummy.prototype = A;
return new this._copy_dummy()
};
scheduler._rendered = [];
scheduler.clear_view = function () {
for (var A = 0; A < this._rendered.length; A++) {
var B = this._rendered[A];
if (B.parentNode) {
B.parentNode.removeChild(B)
}
}
this._rendered = []
};
scheduler.updateEvent = function (B) {
var A = this.getEvent(B);
this.clear_event(B);
if (A && this.is_visible_events(A)) {
this.render_data([A], true)
}
};
scheduler.clear_event = function (A) {
this.for_rendered(A, function (C, B) {
if (C.parentNode) {
C.parentNode.removeChild(C)
}
scheduler._rendered.splice(B, 1)
})
};
scheduler.render_event = function (L) {
var D = scheduler.xy.menu_width;
if (L._sday < 0) {
return
}
var M = scheduler.locate_holder(L._sday);
if (!M) {
return
}
var F = L.start_date.getHours() * 60 + L.start_date.getMinutes();
var C = (L.end_date.getHours() * 60 + L.end_date.getMinutes()) || (scheduler.config.last_hour * 60);
var K = (Math.round((F * 60 * 1000 - this.config.first_hour * 60 * 60 * 1000) * this.config.hour_size_px / (60 * 60 * 1000))) % (this.config.hour_size_px * 24) + 1;
var O = Math.max(scheduler.xy.min_event_height, (C - F) * this.config.hour_size_px / 60) + 1;
var B = Math.floor((M.clientWidth - D) / L._count);
var E = L._sorder * B + 1;
if (!L._inner) {
B = B * (L._count - L._sorder)
}
var J = this._render_v_bar(L.id, D + E, K, B, O, L._text_style, scheduler.templates.event_header(L.start_date, L.end_date, L), scheduler.templates.event_text(L.start_date, L.end_date, L));
this._rendered.push(J);
M.appendChild(J);
E = E + parseInt(M.style.left, 10) + D;
K += this._dy_shift;
if (this._edit_id == L.id) {
J.style.zIndex = 1;
B = Math.max(B - 4, scheduler.xy.editor_width);
var J = document.createElement("DIV");
J.setAttribute("event_id", L.id);
this.set_xy(J, B, O - 20, E, K + 14);
J.className = "dhx_cal_editor";
var A = document.createElement("DIV");
this.set_xy(A, B - 6, O - 26);
A.style.cssText += ";margin:2px 2px 2px 2px;overflow:hidden;";
J.appendChild(A);
this._els.dhx_cal_data[0].appendChild(J);
this._rendered.push(J);
A.innerHTML = "<textarea class='dhx_cal_editor'>" + L.text + "</textarea>";
if (this._quirks7) {
A.firstChild.style.height = O - 12 + "px"
}
this._editor = A.firstChild;
this._editor.onkeypress = function (Q) {
if ((Q || event).shiftKey) {
return true
}
var P = (Q || event).keyCode;
if (P == scheduler.keys.edit_save) {
scheduler.editStop(true)
}
if (P == scheduler.keys.edit_cancel) {
scheduler.editStop(false)
}
};
this._editor.onselectstart = function (P) {
return (P || event).cancelBubble = true
};
A.firstChild.focus();
this._els.dhx_cal_data[0].scrollLeft = 0;
A.firstChild.select()
}
if (this._select_id == L.id) {
var N = this.config["icons_" + ((this._edit_id == L.id) ? "edit" : "select")];
var I = "";
for (var H = 0; H < N.length; H++) {
I += "<div class='dhx_menu_icon " + N[H] + "' title='" + this.locale.labels[N[H]] + "'></div>"
}
var G = this._render_v_bar(L.id, E - D + 1, K, D, N.length * 20 + 26, "", "<div class='dhx_menu_head'></div>", I, true);
G.style.left = E - D + 1;
this._els.dhx_cal_data[0].appendChild(G);
this._rendered.push(G)
}
};
scheduler._render_v_bar = function (D, M, L, N, H, B, F, E, A) {
var J = document.createElement("DIV");
var K = this.getEvent(D);
var I = "dhx_cal_event";
var C = scheduler.templates.event_class(K.start_date, K.end_date, K);
if (C) {
I = I + " " + C
}
var G = jQuery('<div>',
{
'event_id': D,
'class': I
}).css({
'position':'absolute',
'top': L,
'left': M,
'width': (N - 4),
'height': H
}).append(
jQuery('<div>', {
'class': 'dhx_header',
'width': (N - 6)
}),
jQuery('<div>', {
'class': 'dhx_title'
}).html(F),
jQuery('<div>', {
'class': 'dhx_body',
'width': (N - (this._quirks ? 4 : 14)),
'height': (H - (this._quirks ? 20 : 30))
}).html(E),
jQuery('<div>', {
'class': 'dhx_footer',
'width': (N - 8),
'margin-top': A ? 1 : ''
})
)
if(K.color) {
jQuery('div', G).css({'background': K.color, 'color': '#FFFFFF'})
}
jQuery(J).html(G);
return J.firstChild
};
scheduler.locate_holder = function (A) {
if (this._mode == "day") {
return this._els.dhx_cal_data[0].firstChild
}
return this._els.dhx_cal_data[0].childNodes[A]
};
scheduler.locate_holder_day = function (B, C) {
var A = Math.floor((this._correct_shift(B, 1) - this._min_date) / (60 * 60 * 24 * 1000));
if (C && this.date.time_part(B)) {
A++
}
return A
};
scheduler.render_event_bar = function (H) {
var J = this._els.dhx_cal_data[0];
var I = this._colsS[H._sday];
var A = this._colsS[H._eday];
if (A == I) {
A = this._colsS[H._eday + 1]
}
var D = this.xy.bar_height;
var G = this._colsS.heights[H._sweek] + (this._colsS.height ? (this.xy.month_scale_height + 2) : 2) + H._sorder * D;
var F = document.createElement("DIV");
var E = H._timed ? "dhx_cal_event_clear" : "dhx_cal_event_line";
var B = scheduler.templates.event_class(H.start_date, H.end_date, H);
if (B) {
E = E + " " + B
}
var c_innerHTML = " ";
var C = jQuery('<div>',
{
'event_id': H.id,
'class': E
}).css({
'position': 'absolute',
'top': G,
'left': I,
'width': (A - I - 15)
})
if (H._timed) {
c_innerHTML = scheduler.templates.event_bar_date(H.start_date, H.end_date, H)
}
C.html(c_innerHTML + scheduler.templates.event_bar_text(H.start_date, H.end_date, H))
jQuery(F).html(C);
if (H.color) {
if (H._length) {
C.css({'background-color':H.color, 'color': '#FFFFFF'});
} else {
C.css('color',H.color);;
}
}
if(H.title) {
C.attr('title',H.title);
}
this._rendered.push(F.firstChild);
J.appendChild(F.firstChild)
};
scheduler._locate_event = function (A) {
var B = null;
while (A && !B && A.getAttribute) {
B = A.getAttribute("event_id");
A = A.parentNode
}
return B
};
scheduler.edit = function (A) {
if (this._edit_id == A) {
return
}
this.editStop(false, A);
this._edit_id = A;
this.updateEvent(A)
};
scheduler.editStop = function (B, C) {
if (C && this._edit_id == C) {
return
}
var A = this.getEvent(this._edit_id);
if (A) {
if (B) {
A.text = this._editor.value
}
this._edit_id = null;
this._editor = null;
this.updateEvent(A.id);
this._edit_stop_event(A, B)
}
};
scheduler._edit_stop_event = function (A, B) {
if (this._new_event) {
if (!B) {
this.deleteEvent(A.id, true)
} else {
this.callEvent("onEventAdded", [A.id, A])
}
this._new_event = null
} else {
if (B) {
this.callEvent("onEventChanged", [A.id, A])
}
}
};
scheduler.getEvents = function (E, D) {
var A = [];
for (var B in this._events) {
var C = this._events[B];
if (C && C.start_date < D && C.end_date > E) {
A.push(C)
}
}
return A
};
scheduler._loaded = {};
scheduler._load = function (C, F) {
C = C || this._load_url;
C += (C.indexOf("?") == -1 ? "?" : "&") + "timeshift=" + (new Date()).getTimezoneOffset();
if (this.config.prevent_cache) {
C += "&uid=" + this.uid()
}
var E;
F = F || this._date;
if (this._load_mode) {
var B = this.templates.load_format;
F = this.date[this._load_mode + "_start"](new Date(F.valueOf()));
while (F > this._min_date) {
F = this.date.add(F, -1, this._load_mode)
}
E = F;
var D = true;
while (E < this._max_date) {
E = this.date.add(E, 1, this._load_mode);
if (this._loaded[B(F)] && D) {
F = this.date.add(F, 1, this._load_mode)
} else {
D = false
}
}
var A = E;
do {
E = A;
A = this.date.add(E, -1, this._load_mode)
} while (A > F && this._loaded[B(A)]);
if (E <= F) {
return false
}
dhtmlxAjax.get(C + "&from=" + B(F) + "&to=" + B(E), function (G) {
scheduler.on_load(G)
});
while (F < E) {
this._loaded[B(F)] = true;
F = this.date.add(F, 1, this._load_mode)
}
} else {
dhtmlxAjax.get(C, function (G) {
scheduler.on_load(G)
})
}
this.callEvent("onXLS", []);
return true
};
scheduler.on_load = function (A) {
this._loading = true;
if (this._process) {
var B = this[this._process].parse(A.xmlDoc.responseText)
} else {
var B = this._magic_parser(A)
}
this._not_render = true;
for (var C = 0; C < B.length; C++) {
if (!this.callEvent("onEventLoading", [B[C]])) {
continue
}
this.addEvent(B[C])
}
this._not_render = false;
if (this._render_wait) {
this.render_view_data()
}
if (this._after_call) {
this._after_call()
}
this._after_call = null;
this._loading = false;
this.callEvent("onXLE", [])
};
scheduler.json = {};
scheduler.json.parse = function (data) {
if (typeof data == "string") {
eval("scheduler._temp = " + data + ";");
data = scheduler._temp
}
var evs = [];
for (var i = 0; i < data.length; i++) {
data[i].start_date = scheduler.templates.xml_date(data[i].start_date);
data[i].end_date = scheduler.templates.xml_date(data[i].end_date);
evs.push(data[i])
}
return evs
};
scheduler.parse = function (B, A) {
this._process = A;
this.on_load({
xmlDoc: {
responseText: B
}
})
};
scheduler.load = function (A, B) {
if (typeof B == "string") {
this._process = B;
B = arguments[2]
}
this._load_url = A;
this._after_call = B;
this._load(A, this._date)
};
scheduler.setLoadMode = function (A) {
if (A == "all") {
A = ""
}
this._load_mode = A
};
scheduler.refresh = function (A) {
alert("not implemented")
};
scheduler.serverList = function (A) {
return this.serverList[A] = (this.serverList[A] || [])
};
scheduler._userdata = {};
scheduler._magic_parser = function (I) {
if (!I.getXMLTopNode) {
var B = I.xmlDoc.responseText;
I = new dtmlXMLLoaderObject(function () {});
I.loadXMLString(B)
}
var F = I.getXMLTopNode("data");
if (F.tagName != "data") {
return []
}
var A = I.doXPath("//coll_options");
for (var E = 0; E < A.length; E++) {
var H = A[E].getAttribute("for");
var G = this.serverList[H];
if (!G) {
continue
}
G.splice(0, G.length);
var K = I.doXPath(".//item", A[E]);
for (var C = 0; C < K.length; C++) {
G.push({
key: K[C].getAttribute("value"),
label: K[C].getAttribute("label")
})
}
}
if (A.length) {
scheduler.callEvent("onOptionsLoad", [])
}
var L = I.doXPath("//userdata");
for (var E = 0; E < L.length; E++) {
var D = this.xmlNodeToJSON(L[E]);
this._userdata[D.name] = D.text
}
var J = [];
var F = I.doXPath("//event");
for (var E = 0; E < F.length; E++) {
J[E] = this.xmlNodeToJSON(F[E]);
J[E].text = J[E].text || J[E]._tagvalue;
J[E].start_date = this.templates.xml_date(J[E].start_date);
J[E].end_date = this.templates.xml_date(J[E].end_date)
}
return J
};
scheduler.xmlNodeToJSON = function (C) {
var B = {};
for (var A = 0; A < C.attributes.length; A++) {
B[C.attributes[A].name] = C.attributes[A].value
}
for (var A = 0; A < C.childNodes.length; A++) {
var D = C.childNodes[A];
if (D.nodeType == 1) {
B[D.tagName] = D.firstChild ? D.firstChild.nodeValue : ""
}
}
if (!B.text) {
B.text = C.firstChild ? C.firstChild.nodeValue : ""
}
return B
};
scheduler.attachEvent("onXLS", function () {
if (this.config.show_loading === true) {
var A;
A = this.config.show_loading = document.createElement("DIV");
A.className = "dhx_loading";
A.style.left = Math.round((this._x - 128) / 2) + "px";
A.style.top = Math.round((this._y - 15) / 2) + "px";
this._obj.appendChild(A)
}
});
scheduler.attachEvent("onXLE", function () {
var A;
if (A = this.config.show_loading) {
if (typeof A == "object") {
this._obj.removeChild(A);
this.config.show_loading = true
}
}
});
scheduler.ical = {
parse: function (H) {
var E = H.match(RegExp(this.c_start + "[^\f]*" + this.c_end, ""));
if (!E.length) {
return
}
E[0] = E[0].replace(/[\r\n]+(?=[a-z \t])/g, " ");
E[0] = E[0].replace(/\;[^:\r\n]*/g, "");
var B = [];
var D;
var C = RegExp("(?:" + this.e_start + ")([^\f]*?)(?:" + this.e_end + ")", "g");
while (D = C.exec(E)) {
var F = {};
var G;
var A = /[^\r\n]+[\r\n]+/g;
while (G = A.exec(D[1])) {
this.parse_param(G.toString(), F)
}
if (F.uid && !F.id) {
F.id = F.uid
}
B.push(F)
}
return B
},
parse_param: function (E, C) {
var D = E.indexOf(":");
if (D == -1) {
return
}
var A = E.substr(0, D).toLowerCase();
var B = E.substr(D + 1).replace(/\\\,/g, ",").replace(/[\r\n]+$/, "");
if (A == "summary") {
A = "text"
} else {
if (A == "dtstart") {
A = "start_date";
B = this.parse_date(B, 0, 0)
} else {
if (A == "dtend") {
A = "end_date";
if (C.start_date && C.start_date.getHours() == 0) {
B = this.parse_date(B, 24, 0)
} else {
B = this.parse_date(B, 23, 59)
}
}
}
}
C[A] = B
},
parse_date: function (G, F, D) {
var E = G.split("T");
if (E[1]) {
F = E[1].substr(0, 2);
D = E[1].substr(2, 2)
}
var C = E[0].substr(0, 4);
var B = parseInt(E[0].substr(4, 2), 10) - 1;
var A = E[0].substr(6, 2);
if (scheduler.config.server_utc && !E[1]) {
return new Date(Date.UTC(C, B, A, F, D))
}
return new Date(C, B, A, F, D)
},
c_start: "BEGIN:VCALENDAR",
e_start: "BEGIN:VEVENT",
e_end: "END:VEVENT",
c_end: "END:VCALENDAR"
};
scheduler.form_blocks = {
textarea: {
render: function (B) {
var A = (B.height || "130") + "px";
return "<div class='dhx_cal_ltext' style='height:" + A + ";'><textarea></textarea></div>"
},
set_value: function (B, C, A) {
B.firstChild.value = C || ""
},
get_value: function (B, A) {
return B.firstChild.value
},
focus: function (B) {
var A = B.firstChild;
A.select();
A.focus()
}
},
select: {
render: function (D) {
var A = (D.height || "23") + "px";
var C = "<div class='dhx_cal_ltext' style='height:" + A + ";'><select style='width:552px;'>";
for (var B = 0; B < D.options.length; B++) {
C += "<option value='" + D.options[B].key + "'>" + D.options[B].label + "</option>"
}
C += "</select></div>";
return C
},
set_value: function (B, C, A) {
if (typeof C == "undefined") {
C = (B.firstChild.options[0] || {}).value
}
B.firstChild.value = C || ""
},
get_value: function (B, A) {
return B.firstChild.value
},
focus: function (B) {
var A = B.firstChild;
if (A.select) {
A.select()
}
A.focus()
}
},
time: {
render: function () {
var A = scheduler.config;
var E = this.date.date_part(new Date());
var D = 24 * 60,
G = 0;
if (scheduler.config.limit_time_select) {
D = 60 * A.last_hour + 1;
G = 60 * A.first_hour;
E.setHours(A.first_hour)
}
var C = "<select>";
for (var B = G; B < D; B += this.config.time_step * 1) {
var F = this.templates.time_picker(E);
C += "<option value='" + B + "'>" + F + "</option>";
E = this.date.add(E, this.config.time_step, "minute")
}
C += "</select> <select>";
for (var B = 1; B < 32; B++) {
C += "<option value='" + B + "'>" + B + "</option>"
}
C += "</select> <select>";
for (var B = 0; B < 12; B++) {
C += "<option value='" + B + "'>" + this.locale.date.month_full[B] + "</option>"
}
C += "</select> <select>";
E = E.getFullYear() - 5;
for (var B = 0; B < 10; B++) {
C += "<option value='" + (E + B) + "'>" + (E + B) + "</option>"
}
C += "</select> ";
return "<div style='height:30px; padding-top:0px; font-size:inherit;' class='dhx_cal_lsection dhx_section_time'>" + C + "<span style='font-weight:normal; font-size:10pt;'> &nbsp;&ndash;&nbsp; </span>" + C + "</div>"
},
set_value: function (A, I, G) {
var J = A.getElementsByTagName("select");
if (scheduler.config.full_day) {
if (!A._full_day) {
A.previousSibling.innerHTML += "<div class='dhx_fullday_checkbox'><label><input type='checkbox' name='full_day' value='true'> " + scheduler.locale.labels.full_day + "&nbsp;</label></input></div>";
A._full_day = true
}
var H = A.previousSibling.getElementsByTagName("input")[0];
var F = (scheduler.date.time_part(G.start_date) == 0 && scheduler.date.time_part(G.end_date) == 0 && G.end_date.valueOf() - G.start_date.valueOf() < 2 * 24 * 60 * 60 * 1000);
H.checked = F;
for (var B in J) {
J[B].disabled = H.checked
}
H.onclick = function () {
if (H.checked) {
var K = new Date(G.start_date);
var M = new Date(G.end_date);
scheduler.date.date_part(K);
M = scheduler.date.add(K, 1, "day")
}
for (var L in J) {
J[L].disabled = H.checked
}
C(J, 0, K || G.start_date);
C(J, 4, M || G.end_date)
}
}
if (scheduler.config.auto_end_date && scheduler.config.event_duration) {
function E() {
G.start_date = new Date(J[3].value, J[2].value, J[1].value, 0, J[0].value);
G.end_date.setTime(G.start_date.getTime() + (scheduler.config.event_duration * 60 * 1000));
C(J, 4, G.end_date)
}
for (var D = 0; D < 4; D++) {
J[D].onchange = E
}
}
function C(L, K, M) {
L[K + 0].value = Math.round((M.getHours() * 60 + M.getMinutes()) / scheduler.config.time_step) * scheduler.config.time_step;
L[K + 1].value = M.getDate();
L[K + 2].value = M.getMonth();
L[K + 3].value = M.getFullYear()
}
C(J, 0, G.start_date);
C(J, 4, G.end_date)
},
get_value: function (B, A) {
s = B.getElementsByTagName("select");
A.start_date = new Date(s[3].value, s[2].value, s[1].value, 0, s[0].value);
A.end_date = new Date(s[7].value, s[6].value, s[5].value, 0, s[4].value);
if (A.end_date <= A.start_date) {
A.end_date = scheduler.date.add(A.start_date, scheduler.config.time_step, "minute")
}
},
focus: function (A) {
A.getElementsByTagName("select")[0].focus()
}
}
};
scheduler.showCover = function (A) {
this.show_cover();
if (A) {
A.style.display = "block";
var B = getOffset(this._obj);
A.style.top = Math.round(B.top + (this._obj.offsetHeight - A.offsetHeight) / 2) + "px";
A.style.left = Math.round(B.left + (this._obj.offsetWidth - A.offsetWidth) / 2) + "px"
}
};
scheduler.showLightbox = function (B) {
if (!B) {
return
}
if (!this.callEvent("onBeforeLightbox", [B])) {
return
}
var A = this._get_lightbox();
this.showCover(A);
this._fill_lightbox(B, A);
this.callEvent("onLightbox", [B])
};
scheduler._fill_lightbox = function (H, E) {
var D = this.getEvent(H);
var B = E.getElementsByTagName("span");
if (scheduler.templates.lightbox_header) {
B[1].innerHTML = "";
B[2].innerHTML = scheduler.templates.lightbox_header(D.start_date, D.end_date, D)
} else {
B[1].innerHTML = this.templates.event_header(D.start_date, D.end_date, D);
B[2].innerHTML = (this.templates.event_bar_text(D.start_date, D.end_date, D) || "").substr(0, 70)
}
var F = this.config.lightbox.sections;
for (var A = 0; A < F.length; A++) {
var C = document.getElementById(F[A].id).nextSibling;
var G = this.form_blocks[F[A].type];
G.set_value.call(this, C, D[F[A].map_to], D, F[A]);
if (F[A].focus) {
G.focus.call(this, C)
}
}
scheduler._lightbox_id = H
};
scheduler._lightbox_out = function (D) {
var E = this.config.lightbox.sections;
for (var B = 0; B < E.length; B++) {
var C = document.getElementById(E[B].id).nextSibling;
var F = this.form_blocks[E[B].type];
var A = F.get_value.call(this, C, D, E[B]);
if (E[B].map_to != "auto") {
D[E[B].map_to] = A
}
}
return D
};
scheduler._empty_lightbox = function () {
var C = scheduler._lightbox_id;
var B = this.getEvent(C);
var A = this._get_lightbox();
this._lightbox_out(B);
B._timed = this.is_one_day_event(B);
this.setEvent(B.id, B);
this._edit_stop_event(B, true);
this.render_view_data()
};
scheduler.hide_lightbox = function (A) {
this.hideCover(this._get_lightbox());
this._lightbox_id = null;
this.callEvent("onAfterLightbox", [])
};
scheduler.hideCover = function (A) {
if (A) {
A.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 () {
this._cover = document.createElement("DIV");
this._cover.className = "dhx_cal_cover";
document.body.appendChild(this._cover)
};
scheduler.save_lightbox = function () {
if (this.checkEvent("onEventSave") && !this.callEvent("onEventSave", [this._lightbox_id, this._lightbox_out({
id: this._lightbox_id
}), this._new_event])) {
return
}
this._empty_lightbox();
this.hide_lightbox()
};
scheduler.startLightbox = function (B, A) {
this._lightbox_id = B;
this.showCover(A)
};
scheduler.endLightbox = function (B, A) {
this._edit_stop_event(scheduler.getEvent(this._lightbox_id), B);
if (B) {
scheduler.render_view_data()
}
this.hideCover(A)
};
scheduler.resetLightbox = function () {
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._get_lightbox().onclick = function (C) {
var E = C ? C.target : event.srcElement;
if (!E.className) {
E = E.previousSibling
}
if (E && E.className) {
switch (E.className) {
case "dhx_save_btn":
scheduler.save_lightbox();
break;
case "dhx_delete_btn":
var F = scheduler.locale.labels.confirm_deleting;
if (!F || confirm(F)) {
scheduler.deleteEvent(scheduler._lightbox_id);
scheduler._new_event = null;
scheduler.hide_lightbox()
}
break;
case "dhx_cancel_btn":
scheduler.cancel_lightbox();
break;
default:
if (E.className.indexOf("dhx_custom_button_") != -1) {
var A = E.parentNode.getAttribute("index");
var D = scheduler.form_blocks[scheduler.config.lightbox.sections[A].type];
var B = E.parentNode.parentNode;
D.button_click(A, E, B, B.nextSibling)
}
}
}
};
this._get_lightbox().onkeypress = function (A) {
switch ((A || event).keyCode) {
case scheduler.keys.edit_save:
if ((A || event).shiftKey) {
return
}
scheduler.save_lightbox();
break;
case scheduler.keys.edit_cancel:
scheduler.cancel_lightbox();
break
}
}
};
scheduler.setLightboxSize = function () {
var B = this._lightbox;
if (!B) {
return
}
var A = B.childNodes[1];
A.style.height = "0px";
A.style.height = A.scrollHeight + "px";
B.style.height = A.scrollHeight + 50 + "px";
A.style.height = A.scrollHeight + "px"
};
scheduler._get_lightbox = function () {
if (!this._lightbox) {
var G = document.createElement("DIV");
G.className = "dhx_cal_light";
if (/msie|MSIE 6/.test(navigator.userAgent)) {
G.className += " dhx_ie6"
}
G.style.visibility = "hidden";
G.innerHTML = this._lightbox_template;
document.body.insertBefore(G, document.body.firstChild);
this._lightbox = G;
var E = this.config.lightbox.sections;
var C = "";
for (var B = 0; B < E.length; B++) {
var F = this.form_blocks[E[B].type];
if (!F) {
continue
}
E[B].id = "area_" + this.uid();
var A = "";
if (E[B].button) {
A = "<div style='float:right;' class='dhx_custom_button' index='" + B + "'><div class='dhx_custom_button_" + E[B].name + "'></div><div>" + this.locale.labels["button_" + E[B].button] + "</div></div>"
}
C += "<div id='" + E[B].id + "' class='dhx_cal_lsection'>" + A + this.locale.labels["section_" + E[B].name] + "</div>" + F.render.call(this, E[B])
}
var D = G.getElementsByTagName("div");
D[4].innerHTML = scheduler.locale.labels.icon_save;
D[7].innerHTML = scheduler.locale.labels.icon_cancel;
D[10].innerHTML = scheduler.locale.labels.icon_delete;
D[1].innerHTML = C;
this.setLightboxSize();
this._init_lightbox_events(this);
G.style.display = "none";
G.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><div class='dhx_btn_set'><div class='dhx_save_btn'></div><div>&nbsp;</div></div><div class='dhx_btn_set'><div class='dhx_cancel_btn'></div><div>&nbsp;</div></div><div class='dhx_btn_set' style='float:right;'><div class='dhx_delete_btn'></div><div>&nbsp;</div></div>";
scheduler._dp_init = function (A) {
A._methods = ["setEventTextStyle", "", "changeEventId", "deleteEvent"];
this.attachEvent("onEventAdded", function (B) {
if (!this._loading && this.validId(B)) {
A.setUpdated(B, true, "inserted")
}
});
this.attachEvent("onBeforeEventDelete", function (C) {
if (!this.validId(C)) {
return
}
var B = A.getState(C);
if (B == "inserted" || this._new_event) {
A.setUpdated(C, false);
return true
}
if (B == "deleted") {
return false
}
if (B == "true_deleted") {
return true
}
A.setUpdated(C, true, "deleted");
return false
});
this.attachEvent("onEventChanged", function (B) {
if (!this._loading && this.validId(B)) {
A.setUpdated(B, true, "updated")
}
});
A._getRowData = function (F, B) {
var D = this.obj.getEvent(F);
var E = {};
for (var C in D) {
if (C.indexOf("_") == 0) {
continue
}
if (D[C] && D[C].getUTCFullYear) {
E[C] = this.obj.templates.xml_format(D[C])
} else {
E[C] = D[C]
}
}
return E
};
A._clearUpdateFlag = function () {};
A.attachEvent("insertCallback", scheduler._update_callback);
A.attachEvent("updateCallback", scheduler._update_callback);
A.attachEvent("deleteCallback", function (B, C) {
this.obj.setUserData(C, this.action_param, "true_deleted");
this.obj.deleteEvent(C)
})
};
scheduler.setUserData = function (C, A, B) {
if (C) {
this.getEvent(C)[A] = B
} else {
this._userdata[A] = B
}
};
scheduler.getUserData = function (B, A) {
return B ? this.getEvent(B)[A] : this._userdata[A]
};
scheduler.setEventTextStyle = function (C, A) {
this.for_rendered(C, function (D) {
D.style.cssText += ";" + A
});
var B = this.getEvent(C);
B._text_style = A;
this.event_updated(B)
};
scheduler.validId = function (A) {
return true
};
scheduler._update_callback = function (B, C) {
var A = scheduler.xmlNodeToJSON(B.firstChild);
A.text = A.text || A._tagvalue;
A.start_date = scheduler.templates.xml_date(A.start_date);
A.end_date = scheduler.templates.xml_date(A.end_date);
scheduler.addEvent(A)
};
/*
dhtmlxScheduler v.2.3
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
(c) DHTMLX Ltd.
*/