tmarkerstyle
function dhtmlxEvent(t, e, n) {
t.addEventListener ? t.addEventListener(e, n, !1) : t.attachEvent && t.attachEvent("on" + e, n)
}
function dhtmlxDetachEvent(t, e, n) {
t.removeEventListener ? t.removeEventListener(e, n, !1) : t.detachEvent && t.detachEvent("on" + e, n)
}
function dhtmlxDnD(t, e) {
e && (this._settings = e), dhtmlxEventable(this), dhtmlxEvent(t, "mousedown", dhtmlx.bind(function(n) {
e.original_target = {
tmarkerstyle How to dowload it? tmarkerstyle
target: n.target || n.srcElement
}, this.dragStart(t, n)
}, this))
}
function dataProcessor(t) {
return this.serverProcessor = t, this.action_param = "!nativeeditor_status", this.object = null, this.updatedRows = [], this.autoUpdate = !0, this.updateMode = "cell", this._tMode = "GET", this._headers = null, this._payload = null, 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;",
tmarkerstyle How to use it? tmarkerstyle
invalid: "background-color:FFE0E0;",
invalid_cell: "border-bottom:2px solid red;",
error: "color:red;",
clear: "font-weight:normal;text-decoration:none;"
}, this.enableUTFencoding(!0), dhx4._eventable(this), this
}
function createCSSClass(t, e) {
var n = document.createElement("style");
n.type = "text/css", document.getElementsByTagName("head")[0].appendChild(n), (n.sheet || {}).insertRule ? n.sheet.insertRule(t + "{" + e + "}", 0) : (n.styleSheet || n.sheet).addRule(t, e)
tmarkerstyle How to get it? tmarkerstyle
}
function checkIfEventHandlingAllowed(t) {
if ("none" != gantt.getLightbox().style.display) return !1;
if (document.getElementsByClassName("dhtmlx_modal_box").length > 0) return !1;
for (var e = t.target || t.srcElement, n = 0; n < allowedElements.length; n++) {
var a = allowedElements[n];
if (e.localName == a) return !0
}
return !1
tmarkerstyle How to use it? tmarkerstyle
}
function createCSSClass(t, e) {
var n = document.createElement("style");
n.type = "text/css", document.getElementsByTagName("head")[0].appendChild(n), (n.sheet || {}).insertRule ? n.sheet.insertRule(t + "{" + e + "}", 0) : (n.styleSheet || n.sheet).addRule(t, e)
}
function selectLink(t) {
if (currentLinkId) {
if (currentLinkId == t) return !1;
tmarkerstyle How to get it for free? tmarkerstyle
prevLinkId = currentLinkId, currentLinkId = t, gantt.refreshLink(prevLinkId), gantt.refreshLink(currentLinkId)
} else currentLinkId = t, gantt.refreshLink(t)
}
function unselectLink() {
currentLinkId && (prevLinkId = currentLinkId, currentLinkId = null, gantt.refreshLink(prevLinkId))
}
function deleteLink(t) {
t && dhtmlx.confirm(linkDeleteConfirmation, function(e) {
tmarkerstyle How to get it? tmarkerstyle
e && gantt.deleteLink(t)
})
}
function selectTask(t) {
gantt.selectTask(t)
}
function unselectTask() {
gantt.unselectTask()
tmarkerstyle PasteShr tmarkerstyle
}
function deleteTask(t) {
return gantt.callEvent("onBeforeTaskDelete", [t, gantt.getTask(t)]) ? void(t && dhtmlx.confirm(taskDeleteConfirmation, function(e) {
e && gantt.deleteTask(t)
})) : !1
}
function getTaskFitValue(t) {
var e = gantt.posFromDate(t.start_date),
tmarkerstyle How to dowload it? tmarkerstyle
n = gantt.posFromDate(t.end_date),
a = n - e,
i = t.text ? t.text.length * gantt.config._letter_size_coefficient : 1;
if (i > a) {
var s = gantt.getState().max_date,
r = gantt.posFromDate(s);
return i > r - n ? "left" : "right"
}
return "center"
}
tmarkerstyle PasteShr tmarkerstyle
function rightSideTextTemplate(t, e, n) {
return "right" === getTaskFitValue(n) ? n.text : ""
}
function leftSideTextTemplate(t, e, n) {
return "left" === getTaskFitValue(n) ? n.text : ""
}
function taskTextTemplate(t, e, n) {
tmarkerstyle How to use it? tmarkerstyle
return "center" === getTaskFitValue(n) ? n.text : ""
}
"undefined" == typeof window.dhx4 && (window.dhx4 = {
version: "4.1.3",
skin: null,
skinDetect: function(t) {
return {
10: "dhx_skyblue",
20: "dhx_web",
30: "dhx_terrace"
tmarkerstyle How to dowload it? tmarkerstyle
}[this.readFromCss(t + "_skin_detect")] || null
},
readFromCss: function(t, e) {
var n = document.createElement("DIV");
n.className = t, null != document.body.firstChild ? document.body.insertBefore(n, document.body.firstChild) : document.body.appendChild(n);
var a = n[e || "offsetWidth"];
return n.parentNode.removeChild(n), n = null, a
},
lastId: 1,
newId: function() {
tmarkerstyle How to get it? tmarkerstyle
return this.lastId++
},
zim: {
data: {},
step: 5,
first: function() {
return 100
},
last: function() {
var t = this.first();
tmarkerstyle PasteShr tmarkerstyle
for (var e in this.data) t = Math.max(t, this.data[e]);
return t
},
reserve: function(t) {
return this.data[t] = this.last() + this.step, this.data[t]
},
clear: function(t) {
null != this.data[t] && (this.data[t] = null, delete this.data[t])
}
},
tmarkerstyle PasteShr tmarkerstyle
s2b: function(t) {
return "string" == typeof t && (t = t.toLowerCase()), 1 == t || 1 == t || "true" == t || "1" == t || "yes" == t || "y" == t
},
s2j: function(s) {
var obj = null;
dhx4.temp = null;
try {
eval("dhx4.temp=" + s)
} catch (e) {
dhx4.temp = null
tmarkerstyle How to use it? tmarkerstyle
}
return obj = dhx4.temp, dhx4.temp = null, obj
},
absLeft: function(t) {
return "string" == typeof t && (t = document.getElementById(t)), this.getOffset(t).left
},
absTop: function(t) {
return "string" == typeof t && (t = document.getElementById(t)), this.getOffset(t).top
},
_aOfs: function(t) {
tmarkerstyle How to get it? tmarkerstyle
for (var e = 0, n = 0; t;) e += parseInt(t.offsetTop), n += parseInt(t.offsetLeft), t = t.offsetParent;
return {
top: e,
left: n
}
},
_aOfsRect: function(t) {
var e = t.getBoundingClientRect(),
n = document.body,
a = document.documentElement,
tmarkerstyle How to dowload it? tmarkerstyle
i = window.pageYOffset || a.scrollTop || n.scrollTop,
s = window.pageXOffset || a.scrollLeft || n.scrollLeft,
r = a.clientTop || n.clientTop || 0,
o = a.clientLeft || n.clientLeft || 0,
l = e.top + i - r,
d = e.left + s - o;
return {
top: Math.round(l),
left: Math.round(d)
}
tmarkerstyle How to get it for free? tmarkerstyle
},
getOffset: function(t) {
return t.getBoundingClientRect ? this._aOfsRect(t) : this._aOfs(t)
},
_isObj: function(t) {
return null != t && "object" == typeof t && "undefined" == typeof t.length
},
_copyObj: function(t) {
if (this._isObj(t)) {
var e = {};
tmarkerstyle How to dowload it? tmarkerstyle
for (var n in t) e[n] = "object" == typeof t[n] && null != t[n] ? this._copyObj(t[n]) : t[n]
} else
for (var e = [], n = 0; n < t.length; n++) e[n] = "object" == typeof t[n] && null != t[n] ? this._copyObj(t[n]) : t[n];
return e
},
screenDim: function() {
var t = navigator.userAgent.indexOf("MSIE") >= 0,
e = {};
return e.left = document.body.scrollLeft, e.right = e.left + (window.innerWidth || document.body.clientWidth), e.top = Math.max((t ? document.documentElement : document.getElementsByTagName("html")[0]).scrollTop, document.body.scrollTop), e.bottom = e.top + (t ? Math.max(document.documentElement.clientHeight || 0, document.documentElement.offsetHeight || 0) : window.innerHeight), e
},
tmarkerstyle How to dowload it? tmarkerstyle
selectTextRange: function(t, e, n) {
t = "string" == typeof t ? document.getElementById(t) : t;
var a = t.value.length;
if (e = Math.max(Math.min(e, a), 0), n = Math.min(n, a), t.setSelectionRange) try {
t.setSelectionRange(e, n)
} catch (i) {} else if (t.createTextRange) {
var s = t.createTextRange();
s.moveStart("character", e), s.moveEnd("character", n - a);
try {
s.select()
tmarkerstyle PasteShr tmarkerstyle
} catch (i) {}
}
},
transData: null,
transDetect: function() {
if (null == this.transData) {
this.transData = {
transProp: !1,
transEv: null
};
tmarkerstyle PasteShr tmarkerstyle
var t = {
MozTransition: "transitionend",
WebkitTransition: "webkitTransitionEnd",
OTransition: "oTransitionEnd",
msTransition: "transitionend",
transition: "transitionend"
};
for (var e in t) 0 == this.transData.transProp && null != document.documentElement.style[e] && (this.transData.transProp = e, this.transData.transEv = t[e]);
t = null
}
tmarkerstyle How to dowload it? tmarkerstyle
return this.transData
},
_xmlNodeValue: function(t) {
for (var e = "", n = 0; n < t.childNodes.length; n++) e += null != t.childNodes[n].nodeValue ? t.childNodes[n].nodeValue.toString().replace(/^[\n\r\s]{0,}/, "").replace(/[\n\r\s]{0,}$/, "") : "";
return e
}
}, window.dhx4.isIE = navigator.userAgent.indexOf("MSIE") >= 0 || navigator.userAgent.indexOf("Trident") >= 0, window.dhx4.isIE6 = null == window.XMLHttpRequest && navigator.userAgent.indexOf("MSIE") >= 0, window.dhx4.isIE7 = navigator.userAgent.indexOf("MSIE 7.0") >= 0 && navigator.userAgent.indexOf("Trident") < 0, window.dhx4.isIE8 = navigator.userAgent.indexOf("MSIE 8.0") >= 0 && navigator.userAgent.indexOf("Trident") >= 0, window.dhx4.isOpera = navigator.userAgent.indexOf("Opera") >= 0, window.dhx4.isChrome = navigator.userAgent.indexOf("Chrome") >= 0, window.dhx4.isKHTML = navigator.userAgent.indexOf("Safari") >= 0 || navigator.userAgent.indexOf("Konqueror") >= 0, window.dhx4.isFF = navigator.userAgent.indexOf("Firefox") >= 0, window.dhx4.isIPad = navigator.userAgent.search(/iPad/gi) >= 0), "undefined" == typeof window.dhx4.ajax && (window.dhx4.ajax = {
cache: !1,
method: "get",
parse: function(t) {
tmarkerstyle PasteShr tmarkerstyle
if ("string" != typeof t) return t;
if (t = t.replace(/^[\s]+/, ""), window.DOMParser && !dhx4.isIE) var e = (new window.DOMParser).parseFromString(t, "text/xml");
else if (window.ActiveXObject !== window.undefined) {
var e = new window.ActiveXObject("Microsoft.XMLDOM");
e.async = "false", e.loadXML(t)
}
return e
},
xmltop: function(t, e, n) {
if ("undefined" == typeof e.status || e.status < 400) {
tmarkerstyle How to get it? tmarkerstyle
var a = e.responseXML ? e.responseXML || e : dhx4.ajax.parse(e.responseText || e);
if (a && null !== a.documentElement && !a.getElementsByTagName("parsererror").length) return a.getElementsByTagName(t)[0]
}
return -1 !== n && dhx4.callEvent("onLoadXMLError", ["Incorrect XML", arguments[1], n]), document.createElement("DIV")
},
xpath: function(t, e) {
if (e.nodeName || (e = e.responseXML || e), dhx4.isIE) return e.selectNodes(t) || [];
for (var n, a = [], i = (e.ownerDocument || e).evaluate(t, e, null, XPathResult.ANY_TYPE, null); n = i.iterateNext();) a.push(n);
return a
},
tmarkerstyle How to use it? tmarkerstyle
query: function(t) {
dhx4.ajax._call(t.method || "GET", t.url, t.data || "", t.async || !0, t.callback, null, t.headers)
},
get: function(t, e) {
this._call("GET", t, null, !0, e)
},
getSync: function(t) {
return this._call("GET", t, null, !1)
},
put: function(t, e, n) {
tmarkerstyle How to dowload it? tmarkerstyle
this._call("PUT", t, e, !0, n)
},
del: function(t, e, n) {
this._call("DELETE", t, e, !0, n)
},
post: function(t, e, n) {
1 == arguments.length ? e = "" : 2 != arguments.length || "function" != typeof e && "function" != typeof window[e] ? e = String(e) : (n = e, e = ""), this._call("POST", t, e, !0, n)
},
postSync: function(t, e) {
return e = null == e ? "" : String(e), this._call("POST", t, e, !1)
tmarkerstyle How to dowload it? tmarkerstyle
},
getLong: function(t, e) {
this._call("GET", t, null, !0, e, {
url: t
})
},
postLong: function(t, e, n) {
2 == arguments.length && (n = e, e = ""), this._call("POST", t, e, !0, n, {
url: t,
postData: e
tmarkerstyle How to use it? tmarkerstyle
})
},
_call: function(t, e, n, a, i, s, r) {
var o = window.XMLHttpRequest && !dhx4.isIE ? new XMLHttpRequest : new ActiveXObject("Microsoft.XMLHTTP"),
l = null != navigator.userAgent.match(/AppleWebKit/) && null != navigator.userAgent.match(/Qt/) && null != navigator.userAgent.match(/Safari/);
if (1 == a && (o.onreadystatechange = function() {
if (4 == o.readyState || 1 == l && 3 == o.readyState) {
if ((200 != o.status || "" == o.responseText) && !dhx4.callEvent("onAjaxError", [o])) return;
window.setTimeout(function() {
"function" == typeof i && i.apply(window, [{
tmarkerstyle PasteShr tmarkerstyle
xmlDoc: o
}]), null != s && ("undefined" != typeof s.postData ? dhx4.ajax.postLong(s.url, s.postData, i) : dhx4.ajax.getLong(s.url, i)), i = null, o = null
}, 1)
}
}), "GET" == t && 1 != this.cache && (e += (e.indexOf("?") >= 0 ? "&" : "?") + "dhxr" + (new Date).getTime() + "=1"), o.open(t, e, a), r)
for (var d in r) o.setRequestHeader(d, r[d]);
else "POST" == t.toUpperCase() || "PUT" == t || "DELETE" == t ? o.setRequestHeader("Content-Type", "application/x-www-form-urlencoded") : "GET" == t && (n = null);
return o.setRequestHeader("X-Requested-With", "XMLHttpRequest"), o.send(n), a ? void 0 : {
xmlDoc: o
}
tmarkerstyle PasteShr tmarkerstyle
}
}), "undefined" == typeof window.dhx4._eventable && (window.dhx4._eventable = function(t, e) {
return "clear" == e ? (t.detachAllEvents(), t.dhxevs = null, t.attachEvent = null, t.detachEvent = null, t.checkEvent = null, t.callEvent = null, t.detachAllEvents = null, void(t = null)) : (t.dhxevs = {
data: {}
}, t.attachEvent = function(t, e) {
t = String(t).toLowerCase(), this.dhxevs.data[t] || (this.dhxevs.data[t] = {});
var n = window.dhx4.newId();
return this.dhxevs.data[t][n] = e, n
}, t.detachEvent = function(t) {
for (var e in this.dhxevs.data) {
tmarkerstyle PasteShr tmarkerstyle
var n = 0;
for (var a in this.dhxevs.data[e]) a == t ? (this.dhxevs.data[e][a] = null, delete this.dhxevs.data[e][a]) : n++;
0 == n && (this.dhxevs.data[e] = null, delete this.dhxevs.data[e])
}
}, t.checkEvent = function(t) {
return t = String(t).toLowerCase(), null != this.dhxevs.data[t]
}, t.callEvent = function(t, e) {
if (t = String(t).toLowerCase(), null == this.dhxevs.data[t]) return !0;
var n = !0;
for (var a in this.dhxevs.data[t]) n = this.dhxevs.data[t][a].apply(this, e) && n;
tmarkerstyle How to dowload it? tmarkerstyle
return n
}, t.detachAllEvents = function() {
for (var t in this.dhxevs.data) {
for (var e in this.dhxevs.data[t]) this.dhxevs.data[t][e] = null, delete this.dhxevs.data[t][e];
this.dhxevs.data[t] = null, delete this.dhxevs.data[t]
}
}, void(t = null))
}, dhx4._eventable(dhx4)), "undefined" == typeof window.dhtmlx && (window.dhtmlx = {
extend: function(t, e) {
for (var n in e) t[n] || (t[n] = e[n]);
tmarkerstyle How to get it? tmarkerstyle
return t
},
extend_api: function(t, e, n) {
var a = window[t];
a && (window[t] = function(t) {
if (t && "object" == typeof t && !t.tagName) {
var n = a.apply(this, e._init ? e._init(t) : arguments);
for (var i in dhtmlx) e[i] && this[e[i]](dhtmlx[i]);
for (var i in t) e[i] ? this[e[i]](t[i]) : 0 === i.indexOf("on") && this.attachEvent(i, t[i])
} else var n = a.apply(this, arguments);
tmarkerstyle How to dowload it? tmarkerstyle
return e._patch && e._patch(this), n || this
}, window[t].prototype = a.prototype, n && dhtmlx.extend(window[t].prototype, n))
},
url: function(t) {
return -1 != t.indexOf("?") ? "&" : "?"
}
}), _isFF = !1, _isIE = !1, _isOpera = !1, _isKHTML = !1, _isMacOS = !1, _isChrome = !1, _FFrv = !1, _KHTMLrv = !1, _OperaRv = !1, -1 != navigator.userAgent.indexOf("Macintosh") && (_isMacOS = !0), navigator.userAgent.toLowerCase().indexOf("chrome") > -1 && (_isChrome = !0), -1 != navigator.userAgent.indexOf("Safari") || -1 != navigator.userAgent.indexOf("Konqueror") ? (_KHTMLrv = parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf("Safari") + 7, 5)), _KHTMLrv > 525 ? (_isFF = !0, _FFrv = 1.9) : _isKHTML = !0) : -1 != navigator.userAgent.indexOf("Opera") ? (_isOpera = !0, _OperaRv = parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf("Opera") + 6, 3))) : -1 != navigator.appName.indexOf("Microsoft") ? (_isIE = !0, (-1 != navigator.appVersion.indexOf("MSIE 8.0") || -1 != navigator.appVersion.indexOf("MSIE 9.0") || -1 != navigator.appVersion.indexOf("MSIE 10.0") || document.documentMode > 7) && "BackCompat" != document.compatMode && (_isIE = 8)) : "Netscape" == navigator.appName && -1 != navigator.userAgent.indexOf("Trident") ? _isIE = 8 : (_isFF = !0, _FFrv = parseFloat(navigator.userAgent.split("rv:")[1])), "undefined" == typeof window.dhtmlxEvent, null == dhtmlxEvent.touchDelay && (dhtmlxEvent.touchDelay = 2e3), "undefined" == typeof dhtmlxEvent.initTouch && (dhtmlxEvent.initTouch = function() {
function t() {
if (n) {
var t = document.createEvent("HTMLEvents");
tmarkerstyle How to use it? tmarkerstyle
t.initEvent("dblclick", !0, !0), n.dispatchEvent(t), e = n = null
}
}
var e, n, a, i;
dhtmlxEvent(document.body, "touchstart", function(s) {
n = s.touches[0].target, a = s.touches[0].clientX, i = s.touches[0].clientY, e = window.setTimeout(t, dhtmlxEvent.touchDelay)
}), dhtmlxEvent(document.body, "touchmove", function(t) {
e && (Math.abs(t.touches[0].clientX - a) > 50 || Math.abs(t.touches[0].clientY - i) > 50) && (window.clearTimeout(e), e = n = !1)
}), dhtmlxEvent(document.body, "touchend", function() {
e && (window.clearTimeout(e), e = n = !1)
tmarkerstyle How to get it for free? tmarkerstyle
}), dhtmlxEvent.initTouch = function() {}
}), window.dhtmlx || (window.dhtmlx = {}),
function() {
function t(t, e) {
var a = t.callback;
n(!1), t.box.parentNode.removeChild(t.box), g = t.box = null, a && a(e)
}
function e(e) {
if (g) {
tmarkerstyle How to get it? tmarkerstyle
e = e || event;
var n = e.which || event.keyCode;
return dhtmlx.message.keyboard && ((13 == n || 32 == n) && t(g, !0), 27 == n && t(g, !1)), e.preventDefault && e.preventDefault(), !(e.cancelBubble = !0)
}
}
function n(t) {
n.cover || (n.cover = document.createElement("DIV"), n.cover.onkeydown = e, n.cover.className = "dhx_modal_cover", document.body.appendChild(n.cover)), document.body.scrollHeight, n.cover.style.display = t ? "inline-block" : "none"
}
tmarkerstyle PasteShr tmarkerstyle
function a(t, e) {
var n = "dhtmlx_" + t.toLowerCase().replace(/ /g, "_") + "_button";
return "
" + t + "
"
}
function i(t) {
h.area || (h.area = document.createElement("DIV"), h.area.className = "dhtmlx_message_area", h.area.style[h.position] = "5px", document.body.appendChild(h.area)), h.hide(t.id);
var e = document.createElement("DIV");
return e.innerHTML = "
" + t.text + "
", e.className = "dhtmlx-info dhtmlx-" + t.type, e.onclick = function() {
h.hide(t.id), t = null
tmarkerstyle PasteShr tmarkerstyle
}, "bottom" == h.position && h.area.firstChild ? h.area.insertBefore(e, h.area.firstChild) : h.area.appendChild(e), t.expire > 0 && (h.timers[t.id] = window.setTimeout(function() {
h.hide(t.id)
}, t.expire)), h.pull[t.id] = e, e = null, t.id
}
function s(e, n, i) {
var s = document.createElement("DIV");
s.className = " dhtmlx_modal_box dhtmlx-" + e.type, s.setAttribute("dhxbox", 1);
var r = "";
if (e.width && (s.style.width = e.width), e.height && (s.style.height = e.height), e.title && (r += '
' + e.title + "
"), r += '
' + (e.content ? "" : e.text) + '
', n && (r += a(e.ok || "OK", !0)), i && (r += a(e.cancel || "Cancel", !1)), e.buttons)
tmarkerstyle How to dowload it? tmarkerstyle
for (var o = 0; o < e.buttons.length; o++) r += a(e.buttons[o], o);
if (r += "
", s.innerHTML = r, e.content) {
var l = e.content;
"string" == typeof l && (l = document.getElementById(l)), "none" == l.style.display && (l.style.display = ""), s.childNodes[e.title ? 1 : 0].appendChild(l)
}
return s.onclick = function(n) {
n = n || event;
var a = n.target || n.srcElement;
if (a.className || (a = a.parentNode), "dhtmlx_popup_button" == a.className.split(" ")[0]) {
var i = a.getAttribute("result");
tmarkerstyle How to use it? tmarkerstyle
i = "true" == i || ("false" == i ? !1 : i), t(e, i)
}
}, e.box = s, (n || i) && (g = e), s
}
function r(t, a, i) {
var r = t.tagName ? t : s(t, a, i);
t.hidden || n(!0), document.body.appendChild(r);
var o = Math.abs(Math.floor(((window.innerWidth || document.documentElement.offsetWidth) - r.offsetWidth) / 2)),
l = Math.abs(Math.floor(((window.innerHeight || document.documentElement.offsetHeight) - r.offsetHeight) / 2));
tmarkerstyle How to use it? tmarkerstyle
return r.style.top = "top" == t.position ? "-3px" : l + "px", r.style.left = o + "px", r.onkeydown = e, r.focus(), t.hidden && dhtmlx.modalbox.hide(r), r
}
function o(t) {
return r(t, !0, !1)
}
function l(t) {
return r(t, !0, !0)
}
tmarkerstyle PasteShr tmarkerstyle
function d(t) {
return r(t)
}
function _(t, e, n) {
return "object" != typeof t && ("function" == typeof e && (n = e, e = ""), t = {
text: t,
type: e,
callback: n
tmarkerstyle How to dowload it? tmarkerstyle
}), t
}
function c(t, e, n, a) {
return "object" != typeof t && (t = {
text: t,
type: e,
expire: n,
id: a
}), t.id = t.id || h.uid(), t.expire = t.expire || h.expire, t
tmarkerstyle How to get it for free? tmarkerstyle
}
var g = null;
document.attachEvent ? document.attachEvent("onkeydown", e) : document.addEventListener("keydown", e, !0), dhtmlx.alert = function() {
var t = _.apply(this, arguments);
return t.type = t.type || "confirm", o(t)
}, dhtmlx.confirm = function() {
var t = _.apply(this, arguments);
return t.type = t.type || "alert", l(t)
}, dhtmlx.modalbox = function() {
var t = _.apply(this, arguments);
tmarkerstyle How to get it? tmarkerstyle
return t.type = t.type || "alert", d(t)
}, dhtmlx.modalbox.hide = function(t) {
for (; t && t.getAttribute && !t.getAttribute("dhxbox");) t = t.parentNode;
t && (t.parentNode.removeChild(t), n(!1))
};
var h = dhtmlx.message = function(t) {
t = c.apply(this, arguments), t.type = t.type || "info";
var e = t.type.split("-")[0];
switch (e) {
case "alert":
tmarkerstyle How to get it for free? tmarkerstyle
return o(t);
case "confirm":
return l(t);
case "modalbox":
return d(t);
default:
return i(t)
}
};
h.seed = (new Date).valueOf(), h.uid = function() {
tmarkerstyle How to dowload it? tmarkerstyle
return h.seed++
}, h.expire = 4e3, h.keyboard = !0, h.position = "top", h.pull = {}, h.timers = {}, h.hideAll = function() {
for (var t in h.pull) h.hide(t)
}, h.hide = function(t) {
var e = h.pull[t];
e && e.parentNode && (window.setTimeout(function() {
e.parentNode.removeChild(e), e = null
}, 2e3), e.className += " hidden", h.timers[t] && window.clearTimeout(h.timers[t]), delete h.pull[t])
}
}(), gantt = {
tmarkerstyle How to get it for free? tmarkerstyle
version: "3.3.1"
}, dhtmlxEventable = function(obj) {
obj._silent_mode = !1, obj._silentStart = function() {
this._silent_mode = !0
}, obj._silentEnd = function() {
this._silent_mode = !1
}, obj.attachEvent = function(t, e, n) {
return t = "ev_" + t.toLowerCase(), this[t] || (this[t] = new this._eventCatcher(n || this)), t + ":" + this[t].addEvent(e)
}, obj.callEvent = function(t, e) {
return this._silent_mode ? !0 : (t = "ev_" + t.toLowerCase(), this[t] ? this[t].apply(this, e) : !0)
tmarkerstyle How to get it? tmarkerstyle
}, obj.checkEvent = function(t) {
return !!this["ev_" + t.toLowerCase()]
}, obj._eventCatcher = function(obj) {
var dhx_catch = [],
z = function() {
for (var t = !0, e = 0; e < dhx_catch.length; e++)
if (dhx_catch[e]) {
var n = dhx_catch[e].apply(obj, arguments);
t = t && n
}
tmarkerstyle How to use it? tmarkerstyle
return t
};
return z.addEvent = function(ev) {
return "function" != typeof ev && (ev = eval(ev)), ev ? dhx_catch.push(ev) - 1 : !1
}, z.removeEvent = function(t) {
dhx_catch[t] = null
}, z
}, obj.detachEvent = function(t) {
if (t) {
var e = t.split(":");
tmarkerstyle How to use it? tmarkerstyle
this[e[0]].removeEvent(e[1])
}
}, obj.detachAllEvents = function() {
for (var t in this) 0 === t.indexOf("ev_") && delete this[t]
}, obj = null
}, dhtmlx.copy = function(t) {
var e, n, a;
if (t && "object" == typeof t) {
for (a = {}, n = [Array, Date, Number, String, Boolean], e = 0; e < n.length; e++) t instanceof n[e] && (a = e ? new n[e](t) : new n[e]);
for (e in t) Object.prototype.hasOwnProperty.apply(t, [e]) && (a[e] = dhtmlx.copy(t[e]))
tmarkerstyle How to use it? tmarkerstyle
}
return a || t
}, dhtmlx.mixin = function(t, e, n) {
for (var a in e)(!t[a] || n) && (t[a] = e[a]);
return t
}, dhtmlx.defined = function(t) {
return "undefined" != typeof t
}, dhtmlx.uid = function() {
return this._seed || (this._seed = (new Date).valueOf()), this._seed++, this._seed
}, dhtmlx.bind = function(t, e) {
tmarkerstyle How to get it for free? tmarkerstyle
return t.bind ? t.bind(e) : function() {
return t.apply(e, arguments)
}
}, gantt._get_position = function(t) {
var e = 0,
n = 0;
if (t.getBoundingClientRect) {
var a = t.getBoundingClientRect(),
i = document.body,
s = document.documentElement,
tmarkerstyle How to dowload it? tmarkerstyle
r = window.pageYOffset || s.scrollTop || i.scrollTop,
o = window.pageXOffset || s.scrollLeft || i.scrollLeft,
l = s.clientTop || i.clientTop || 0,
d = s.clientLeft || i.clientLeft || 0;
return e = a.top + r - l, n = a.left + o - d, {
y: Math.round(e),
x: Math.round(n),
width: t.offsetWidth,
height: t.offsetHeight
}
tmarkerstyle How to get it for free? tmarkerstyle
}
for (; t;) e += parseInt(t.offsetTop, 10), n += parseInt(t.offsetLeft, 10), t = t.offsetParent;
return {
y: e,
x: n,
width: t.offsetWidth,
height: t.offsetHeight
}
}, gantt._detectScrollSize = function() {
var t = document.createElement("div");
tmarkerstyle How to dowload it? tmarkerstyle
t.style.cssText = "visibility:hidden;position:absolute;left:-1000px;width:100px;padding:0px;margin:0px;height:110px;min-height:100px;overflow-y:scroll;", document.body.appendChild(t);
var e = t.offsetWidth - t.clientWidth;
return document.body.removeChild(t), e
}, window.dhtmlx && (dhtmlx.attaches || (dhtmlx.attaches = {}), dhtmlx.attaches.attachGantt = function(t, e, n) {
var a = document.createElement("DIV");
a.id = "gantt_" + dhtmlx.uid(), a.style.width = "100%", a.style.height = "100%", a.cmp = "grid", n = n || window.gantt, document.body.appendChild(a), this.attachObject(a.id);
var i = this.vs[this.av];
i.grid = n, n.init(a.id, t, e), a.firstChild.style.border = "none", i.gridId = a.id, i.gridObj = a;
var s = "_viewRestore";
return this.vs[this[s]()].grid
tmarkerstyle How to get it? tmarkerstyle
}), "undefined" != typeof window.dhtmlXCellObject && (dhtmlXCellObject.prototype.attachGantt = function(t, e, n) {
var a = document.createElement("DIV");
return a.id = "gantt_" + dhtmlx.uid(), a.style.width = "100%", a.style.height = "100%", a.cmp = "grid", document.body.appendChild(a), this.attachObject(a.id), n = n || window.gantt, n.init(a.id, t, e), a.firstChild.style.border = "none", a = null, this.callEvent("_onContentAttach", []), this.dataObj
}), dhtmlxEventable(gantt), dhx4.ajax.cache = !0, gantt._click = {}, gantt._dbl_click = {}, gantt._context_menu = {}, gantt._on_click = function(t) {
t = t || window.event;
var e = t.target || t.srcElement,
n = gantt.locate(t),
a = !0;
if (null !== n ? a = !gantt.checkEvent("onTaskClick") || gantt.callEvent("onTaskClick", [n, t]) : gantt.callEvent("onEmptyClick", [t]), a) {
var i = gantt._find_ev_handler(t, e, gantt._click, n);
tmarkerstyle How to get it for free? tmarkerstyle
if (!i) return;
n && gantt.getTask(n) && gantt.config.select_task && gantt.selectTask(n)
}
}, gantt._on_contextmenu = function(t) {
t = t || window.event;
var e = t.target || t.srcElement,
n = gantt.locate(e),
a = gantt.locate(e, gantt.config.link_attribute),
i = !gantt.checkEvent("onContextMenu") || gantt.callEvent("onContextMenu", [n, a, t]);
return i || (t.preventDefault ? t.preventDefault() : t.returnValue = !1), i
tmarkerstyle PasteShr tmarkerstyle
}, gantt._find_ev_handler = function(t, e, n, a) {
for (var i = !0; e;) {
var s = gantt._getClassName(e);
if (s) {
s = s.split(" ");
for (var r = 0; r < s.length; r++)
if (s[r] && n[s[r]]) {
var o = n[s[r]].call(gantt, t, a, e);
i = i && !("undefined" != typeof o && o !== !0)
}
tmarkerstyle How to dowload it? tmarkerstyle
}
e = e.parentNode
}
return i
}, gantt._on_dblclick = function(t) {
t = t || window.event;
var e = t.target || t.srcElement,
n = gantt.locate(t),
a = !gantt.checkEvent("onTaskDblClick") || gantt.callEvent("onTaskDblClick", [n, t]);
if (a) {
tmarkerstyle PasteShr tmarkerstyle
var i = gantt._find_ev_handler(t, e, gantt._dbl_click, n);
if (!i) return;
null !== n && gantt.getTask(n) && a && gantt.config.details_on_dblclick && gantt.showLightbox(n)
}
}, gantt._on_mousemove = function(t) {
if (gantt.checkEvent("onMouseMove")) {
var e = gantt.locate(t);
gantt._last_move_event = t, gantt.callEvent("onMouseMove", [e, t])
}
}, dhtmlxDnD.prototype = {
tmarkerstyle How to use it? tmarkerstyle
dragStart: function(t, e) {
this.config = {
obj: t,
marker: null,
started: !1,
pos: this.getPosition(e),
sensitivity: 4
}, this._settings && dhtmlx.mixin(this.config, this._settings, !0);
var n = dhtmlx.bind(function(e) {
return this.dragMove(t, e)
tmarkerstyle How to dowload it? tmarkerstyle
}, this),
a = (dhtmlx.bind(function(e) {
return this.dragScroll(t, e)
}, this), dhtmlx.bind(function(t) {
return dhtmlx.defined(this.config.updates_per_second) && !gantt._checkTimeout(this, this.config.updates_per_second) ? !0 : n(t)
}, this)),
i = dhtmlx.bind(function() {
return dhtmlxDetachEvent(document.body, "mousemove", a), dhtmlxDetachEvent(document.body, "mouseup", i), this.dragEnd(t)
}, this);
dhtmlxEvent(document.body, "mousemove", a), dhtmlxEvent(document.body, "mouseup", i), document.body.className += " gantt_noselect"
tmarkerstyle How to get it? tmarkerstyle
},
dragMove: function(t, e) {
if (!this.config.marker && !this.config.started) {
var n = this.getPosition(e),
a = n.x - this.config.pos.x,
i = n.y - this.config.pos.y,
s = Math.sqrt(Math.pow(Math.abs(a), 2) + Math.pow(Math.abs(i), 2));
if (s > this.config.sensitivity) {
if (this.config.started = !0, this.config.ignore = !1, this.callEvent("onBeforeDragStart", [t, this.config.original_target]) === !1) return this.config.ignore = !0, !0;
var r = this.config.marker = document.createElement("div");
tmarkerstyle How to get it for free? tmarkerstyle
r.className = "gantt_drag_marker", r.innerHTML = "Dragging object", document.body.appendChild(r), this.callEvent("onAfterDragStart", [t, this.config.original_target])
} else this.config.ignore = !0
}
this.config.ignore || (e.pos = this.getPosition(e), this.config.marker.style.left = e.pos.x + "px", this.config.marker.style.top = e.pos.y + "px", this.callEvent("onDragMove", [t, e]))
},
dragEnd: function() {
this.config.marker && (this.config.marker.parentNode.removeChild(this.config.marker), this.config.marker = null, this.callEvent("onDragEnd", [])), document.body.className = document.body.className.replace(" gantt_noselect", "")
},
getPosition: function(t) {
var e = 0,
tmarkerstyle How to get it for free? tmarkerstyle
n = 0;
return t = t || window.event, t.pageX || t.pageY ? (e = t.pageX, n = t.pageY) : (t.clientX || t.clientY) && (e = t.clientX + document.body.scrollLeft + document.documentElement.scrollLeft, n = t.clientY + document.body.scrollTop + document.documentElement.scrollTop), {
x: e,
y: n
}
}
}, gantt._init_grid = function() {
this._click.gantt_close = dhtmlx.bind(function(t, e) {
return this.close(e), !1
}, this), this._click.gantt_open = dhtmlx.bind(function(t, e) {
tmarkerstyle How to get it for free? tmarkerstyle
return this.open(e), !1
}, this), this._click.gantt_row = dhtmlx.bind(function(t, e, n) {
if (null !== e) {
var a = this.getTask(e);
this.config.scroll_on_click && this.showDate(a.start_date), this.callEvent("onTaskRowClick", [e, n])
}
}, this), this._click.gantt_grid_head_cell = dhtmlx.bind(function(t, e, n) {
var a = n.getAttribute("column_id");
if (this.callEvent("onGridHeaderClick", [a, t])) {
if ("add" == a) return void this._click.gantt_add(t, this.config.root_id);
tmarkerstyle How to get it? tmarkerstyle
if (this.config.sort) {
for (var i, s = a, r = 0; this.config.columns.length; r++)
if (this.config.columns[r].name == a) {
i = this.config.columns[r];
break
}
if (i && void 0 !== i.sort && i.sort !== !0 && (s = i.sort, !s)) return;
var o = this._sort && this._sort.direction && this._sort.name == a ? this._sort.direction : "desc";
o = "desc" == o ? "asc" : "desc", this._sort = {
name: a,
tmarkerstyle PasteShr tmarkerstyle
direction: o
}, this.sort(s, "desc" == o)
}
}
}, this), !this.config.sort && this.config.order_branch && this._init_dnd(), this._click.gantt_add = dhtmlx.bind(function(t, e) {
if (!this.config.readonly) {
var n = {};
return this.createTask(n, e ? e : this.config.root_id), !1
}
}, this), this._init_resize && this._init_resize()
tmarkerstyle PasteShr tmarkerstyle
}, gantt._render_grid = function() {
this._is_grid_visible() && (this._calc_grid_width(), this._render_grid_header())
}, gantt._calc_grid_width = function() {
for (var t = this.getGridColumns(), e = 0, n = [], a = [], i = 0; i < t.length; i++) {
var s = parseInt(t[i].width, 10);
window.isNaN(s) && (s = 50, n.push(i)), a[i] = s, e += s
}
if (this.config.autofit || n.length) {
var r = this._get_grid_width() - e;
if (r / (n.length > 0 ? n.length : a.length > 0 ? a.length : 1), n.length > 0)
tmarkerstyle How to get it? tmarkerstyle
for (var o = r / (n.length ? n.length : 1), i = 0; i < n.length; i++) {
var l = n[i];
a[l] += o
} else
for (var o = r / (a.length ? a.length : 1), i = 0; i < a.length; i++) a[i] += o;
for (var i = 0; i < a.length; i++) t[i].width = a[i]
} else this.config.grid_width = e
}, gantt._render_grid_header = function() {
for (var t = this.getGridColumns(), e = [], n = 0, a = this.locale.labels, i = this.config.scale_height - 2, s = 0; s < t.length; s++) {
var r = s == t.length - 1,
tmarkerstyle How to use it? tmarkerstyle
o = t[s];
r && this._get_grid_width() > n + o.width && (o.width = this._get_grid_width() - n), n += o.width;
var l = this._sort && o.name == this._sort.name ? "" : "",
d = ["gantt_grid_head_cell", "gantt_grid_head_" + o.name, r ? "gantt_last_cell" : "", this.templates.grid_header_class(o.name, o)].join(" "),
_ = "width:" + (o.width - (r ? 1 : 0)) + "px;",
c = o.label || a["column_" + o.name];
c = c || "";
var g = "
" + c + l + "
";
e.push(g)
}
tmarkerstyle How to get it for free? tmarkerstyle
this.$grid_scale.style.height = this.config.scale_height - 1 + "px", this.$grid_scale.style.lineHeight = i + "px", this.$grid_scale.style.width = n - 1 + "px", this.$grid_scale.innerHTML = e.join("")
}, gantt._render_grid_item = function(t) {
if (!gantt._is_grid_visible()) return null;
for (var e = this.getGridColumns(), n = [], a = 0; a < e.length; a++) {
var i, s, r = a == e.length - 1,
o = e[a];
"add" == o.name ? s = "" : (s = o.template ? o.template(t) : t[o.name], s instanceof Date && (s = this.templates.date_grid(s, t)), s = "
" + s + "
");
var l = "gantt_cell" + (r ? " gantt_last_cell" : ""),
d = "";
if (o.tree) {
tmarkerstyle How to get it? tmarkerstyle
for (var _ = 0; _ < t.$level; _++) d += this.templates.grid_indent(t);
var c = this._has_children(t.id);
c ? (d += this.templates.grid_open(t), d += this.templates.grid_folder(t)) : (d += this.templates.grid_blank(t), d += this.templates.grid_file(t))
}
var g = "width:" + (o.width - (r ? 1 : 0)) + "px;";
dhtmlx.defined(o.align) && (g += "text-align:" + o.align + ";"), i = "
" + d + s + "
", n.push(i)
}
var l = t.$index % 2 === 0 ? "" : " odd";
if (l += t.$transparent ? " gantt_transparent" : "", l += t.$dataprocessor_class ? " " + t.$dataprocessor_class : "", this.templates.grid_row_class) {
var h = this.templates.grid_row_class.call(this, t.start_date, t.end_date, t);
tmarkerstyle How to get it for free? tmarkerstyle
h && (l += " " + h)
}
this.getState().selected_task == t.id && (l += " gantt_selected");
var u = document.createElement("div");
return u.className = "gantt_row" + l, u.style.height = this.config.row_height + "px", u.style.lineHeight = gantt.config.row_height + "px", u.setAttribute(this.config.task_attribute, t.id), u.innerHTML = n.join(""), u
}, gantt.open = function(t) {
gantt._set_item_state(t, !0), this.callEvent("onTaskOpened", [t])
}, gantt.close = function(t) {
gantt._set_item_state(t, !1), this.callEvent("onTaskClosed", [t])
}, gantt._set_item_state = function(t, e) {
tmarkerstyle How to dowload it? tmarkerstyle
t && this._pull[t] && (this._pull[t].$open = e, gantt._refresh_on_toggle_element(t))
}, gantt._refresh_on_toggle_element = function() {
this.refreshData()
}, gantt._is_grid_visible = function() {
return this.config.grid_width && this.config.show_grid
}, gantt._get_grid_width = function() {
return this._is_grid_visible() ? this._is_chart_visible() ? this.config.grid_width : this._x : 0
}, gantt.moveTask = function(t, e, n) {
var a = arguments[3];
if (a) {
tmarkerstyle How to dowload it? tmarkerstyle
if (a === t) return;
n = this.getParent(a), e = this.getTaskIndex(a)
}
if (t != n) {
n = n || this.config.root_id;
var i = this.getTask(t),
s = this.getParent(i.id),
r = (this.getChildren(this.getParent(i.id)), this.getChildren(n));
if (-1 == e && (e = r.length + 1), s == n) {
var o = this.getTaskIndex(t);
tmarkerstyle How to get it for free? tmarkerstyle
if (o == e) return
}
if (this.callEvent("onBeforeTaskMove", [t, n, e]) !== !1) {
this._replace_branch_child(s, t), r = this.getChildren(n);
var l = r[e];
l ? r = r.slice(0, e).concat([t]).concat(r.slice(e)) : r.push(t), this.setParent(i, n), this._branches[n] = r, i.$level = this.calculateTaskLevel(i), i.$drop_target = 1 * e > 0 ? a ? (this.getTaskIndex(t) > this.getTaskIndex(a) ? "next:" : "") + a : "next:" + gantt.getPrevSibling(t) : r[1 * e + 1] ? r[1 * e + 1] : n, this.callEvent("onAfterTaskMove", [t, n, e]) && this.refreshData()
}
}
}, gantt._init_dnd = function() {
var t = new dhtmlxDnD(this.$grid_data, {
tmarkerstyle PasteShr tmarkerstyle
updates_per_second: 60
});
dhtmlx.defined(this.config.dnd_sensitivity) && (t.config.sensitivity = this.config.dnd_sensitivity), t.attachEvent("onBeforeDragStart", dhtmlx.bind(function(e, n) {
var a = this._locateHTML(n);
if (!a) return !1;
this.hideQuickInfo && this._hideQuickInfo();
var i = this.locate(n),
s = gantt.getTask(i);
return gantt._is_readonly(s) ? !1 : (t.config.initial_open_state = s.$open, this.callEvent("onRowDragStart", [i, n.target || n.srcElement, n]) ? void 0 : !1)
}, this)), t.attachEvent("onAfterDragStart", dhtmlx.bind(function(e, n) {
tmarkerstyle How to get it? tmarkerstyle
var a = this._locateHTML(n);
t.config.marker.innerHTML = a.outerHTML, t.config.id = this.locate(n);
var i = this.getTask(t.config.id);
t.config.index = this.getTaskIndex(t.config.id), t.config.parent = i.parent, i.$open = !1, i.$transparent = !0, this.refreshData()
}, this)), t.lastTaskOfLevel = function(t) {
for (var e = gantt._order, n = gantt._pull, a = null, i = 0, s = e.length; s > i; i++) n[e[i]].$level == t && (a = n[e[i]]);
return a ? a.id : null
}, t._getGridPos = dhtmlx.bind(function(t) {
var e = this._get_position(this.$grid_data),
n = e.x,
tmarkerstyle How to get it for free? tmarkerstyle
a = t.pos.y - 10;
return a < e.y && (a = e.y), a > e.y + this.$grid_data.offsetHeight - this.config.row_height && (a = e.y + this.$grid_data.offsetHeight - this.config.row_height), e.x = n, e.y = a, e
}, this), t.attachEvent("onDragMove", dhtmlx.bind(function(e, n) {
function a(t, e) {
return t.$level == e.$level || gantt.config.order_branch_free
}
var i = t.config,
s = t._getGridPos(n);
i.marker.style.left = s.x + 10 + "px", i.marker.style.top = s.y + "px", s = t._getGridPos(n);
var r = (s.x, s.y),
tmarkerstyle How to get it for free? tmarkerstyle
o = document.elementFromPoint(s.x - document.body.scrollLeft + 1, r - document.body.scrollTop),
l = this.locate(o),
d = this.getTask(t.config.id);
if (this.isTaskExists(l) || (l = t.lastTaskOfLevel(gantt.config.order_branch_free ? d.$level : 0), l == t.config.id && (l = null)), this.isTaskExists(l)) {
var _ = gantt._get_position(o),
c = this.getTask(l);
if (_.y + o.offsetHeight / 2 < r) {
var g = this.getGlobalTaskIndex(c.id),
h = this._pull[this._order[g + 1]];
if (h) {
tmarkerstyle How to use it? tmarkerstyle
if (h.id == d.id) return;
c = h
} else if (h = this._pull[this._order[g]], a(h, d) && h.id != d.id) return void this.moveTask(d.id, -1, this.getParent(h.id))
}
for (var g = this.getGlobalTaskIndex(c.id), u = this._pull[this._order[g - 1]], f = 1;
(!u || u.id == c.id) && g - f >= 0;) u = this._pull[this._order[g - f]],
f++;
if (d.id == c.id) return;
a(c, d) && d.id != c.id ? this.moveTask(d.id, 0, 0, c.id) : c.$level != d.$level - 1 || gantt.getChildren(c.id).length ? u && a(u, d) && d.id != u.id && this.moveTask(d.id, -1, this.getParent(u.id)) : this.moveTask(d.id, 0, c.id)
}
tmarkerstyle How to use it? tmarkerstyle
return !0
}, this)), t.attachEvent("onDragEnd", dhtmlx.bind(function() {
var e = this.getTask(t.config.id);
this.callEvent("onBeforeRowDragEnd", [t.config.id, t.config.parent, t.config.index]) === !1 ? (this.moveTask(t.config.id, t.config.index, t.config.parent), e.$drop_target = null) : this.callEvent("onRowDragEnd", [t.config.id, e.$drop_target]), e.$transparent = !1, e.$open = t.config.initial_open_state, this.refreshData()
}, this))
}, gantt.getGridColumns = function() {
return this.config.columns
}, gantt._has_children = function(t) {
return this.getChildren(t).length > 0
}, gantt._render_grid_header_resize = function() {
tmarkerstyle How to dowload it? tmarkerstyle
for (var t = this.getGridColumns(), e = 0, n = this.config.scale_height, a = (this._get_position(this.$grid_scale), 0); a < t.length; a++) {
var i = (a == t.length - 1, t[a]);
if (e += i.width, i.resize) {
var s = document.createElement("div");
s.className = "gantt_grid_column_resize_wrap", s.style.top = "0px", s.style.height = n + "px", s.innerHTML = "", s.setAttribute(this.config.grid_resizer_column_attribute, a), this.$grid_scale.appendChild(s), s.style.left = Math.max(0, e - 1 - s.offsetWidth / 2) + "px"
}
}
if (this.config.grid_resize) {
var r = document.createElement("div");
r.className = "gantt_grid_resize_wrap", r.style.top = "0px", r.style.height = this.$grid.offsetHeight + "px", r.innerHTML = "", r.setAttribute(this.config.grid_resizer_attribute, !0), this.$grid_scale.appendChild(r), r.style.left = Math.max(0, this.config.grid_width - 1 - r.offsetWidth / 2) + "px"
tmarkerstyle PasteShr tmarkerstyle
}
}, gantt._init_resize = function() {
var t = new dhtmlxDnD(this.$grid_scale, {
updates_per_second: 60
});
dhtmlx.defined(this.config.dnd_sensitivity) && (t.config.sensitivity = this.config.dnd_sensitivity), t.attachEvent("onBeforeDragStart", dhtmlx.bind(function(t, e) {
var n = this._locateHTML(e, this.config.grid_resizer_column_attribute);
if (!n) return !1;
var a = this.locate(e, this.config.grid_resizer_column_attribute),
i = this.getGridColumns()[a];
tmarkerstyle How to get it? tmarkerstyle
return gantt.callEvent("onColumnResizeStart", [a, i]) === !1 ? !1 : void 0
}, this)), t.attachEvent("onAfterDragStart", dhtmlx.bind(function(e, n) {
var a = this.locate(n, this.config.grid_resizer_column_attribute);
t.config.marker.innerHTML = "", t.config.marker.className += " gantt_grid_resize_area", t.config.marker.style.height = this.$grid.offsetHeight + "px", t.config.marker.style.top = "0px", t.config.drag_index = a
}, this)), t.attachEvent("onDragMove", dhtmlx.bind(function() {
var e = t.config,
n = this.getGridColumns(),
a = this._get_position(this.$grid_scale),
i = parseInt(e.marker.style.left, 10),
s = this.config.min_grid_column_width,
tmarkerstyle How to dowload it? tmarkerstyle
r = this.$grid_data.offsetWidth - this.config.min_grid_column_width * (n.length - e.drag_index - 2),
o = 0,
l = 0;
i -= a.x - 1;
for (var d = 0; d < e.drag_index; d++) s += n[d].width, o += n[d].width;
return s > i && (i = s), this.config.keep_grid_width && i > r && (i = r), l = i - o, e.marker.style.top = a.y + "px", e.marker.style.left = a.x - 1 + o + "px", e.marker.style.width = l + "px", e.left = i - 1, gantt.callEvent("onColumnResize", [e.drag_index, n[e.drag_index], l - 1]), !0
}, this)), t.attachEvent("onDragEnd", dhtmlx.bind(function() {
for (var e = this.getGridColumns(), n = 0, a = parseInt(t.config.drag_index, 10), i = e[a], s = 0; a > s; s++) n += e[s].width;
var r = i.min_width && t.config.left - n < i.min_width ? i.min_width : t.config.left - n;
if (gantt.callEvent("onColumnResizeEnd", [a, i, r]) !== !1 && i.width != r) {
tmarkerstyle How to dowload it? tmarkerstyle
if (i.width = r, this.config.keep_grid_width)
for (var s = a + 1, o = e.length; o > s; s++) e[s].width = "add" == e[s].name ? 1 * e[s].width || 44 : null;
else {
for (var s = a, o = e.length; o > s; s++) n += e[s].width;
this.config.grid_width = n
}
this.render()
}
}, this));
var e = new dhtmlxDnD(this.$grid, {
tmarkerstyle How to get it? tmarkerstyle
updates_per_second: 60
});
dhtmlx.defined(this.config.dnd_sensitivity) && (e.config.sensitivity = this.config.dnd_sensitivity), e.attachEvent("onBeforeDragStart", dhtmlx.bind(function(t, e) {
var n = this._locateHTML(e, this.config.grid_resizer_attribute);
return n ? gantt.callEvent("onGridResizeStart", [gantt.config.grid_width]) === !1 ? !1 : void 0 : !1
}, this)), e.attachEvent("onAfterDragStart", dhtmlx.bind(function() {
e.config.marker.innerHTML = "", e.config.marker.className += " gantt_grid_resize_area", e.config.marker.style.height = this.$grid.offsetHeight + "px", e.config.marker.style.top = "0px"
}, this)), e.attachEvent("onDragMove", dhtmlx.bind(function() {
for (var t = e.config, n = this.config.columns, a = this._get_position(this.$grid), i = parseInt(t.marker.style.left, 10), s = 0, r = 0; r < n.length; r++) n[r].hide || (s += n[r].min_width ? n[r].min_width : this.config.min_grid_column_width);
return i -= a.x - 1, s > i && (i = s), t.marker.style.top = a.y + "px", t.marker.style.left = a.x - 1 + "px", t.marker.style.width = i + "px", t.left = i - 1, gantt.callEvent("onGridResize", [this.config.grid_width, i - 1]), !0
tmarkerstyle How to use it? tmarkerstyle
}, this)), e.attachEvent("onDragEnd", dhtmlx.bind(function() {
for (var t = this.config.columns, n = 0, a = e.config.left, i = 0, s = t.length; s > i; i++) t[i].hide || (n += t[i].width);
for (var r = t.length, o = a - n, i = 0; r > i; i++)
if (!t[i].hide) {
var l = Math.floor(o * (t[i].width / n));
n -= t[i].width;
var d = t[i].width + l;
(t[i].min_width && d >= t[i].min_width || !t[i].min_width || d > t[i].width) && (o -= l, t[i].width = d)
}
for (var _ = o > 0 ? 1 : -1; o > 0 && 1 === _ || 0 > o && -1 === _;) {
tmarkerstyle How to get it for free? tmarkerstyle
var c = o;
for (i = 0; r > i; i++) {
var g = t[i].width + _;
if ((t[i].min_width && g >= t[i].min_width || !t[i].min_width || d > t[i].width) && (o -= _, t[i].width = g, 0 == o)) break
}
if (c == o) break
}
gantt.callEvent("onGridResizeEnd", [this.config.grid_width, a]) !== !1 && (this.config.grid_width = a, this.render())
}, this))
}, gantt.attachEvent("onGanttRender", function() {
tmarkerstyle How to get it for free? tmarkerstyle
gantt._render_grid_header_resize()
}),
function() {
var t = gantt._has_children;
gantt._has_children = function(e) {
return t.apply(this, arguments) ? !0 : this.isTaskExists(e) ? this.getTask(e).$has_child : !1
}
}(), gantt._need_dynamic_loading = function(t) {
if (gantt.config.branch_loading && gantt._load_url) {
var e = gantt.getUserData(t, "was_rendered");
tmarkerstyle PasteShr tmarkerstyle
if (!e && gantt._has_children(t)) return !0
}
return !1
}, gantt._refresh_on_toggle_element = function(t) {
gantt._need_dynamic_loading(t) || this.refreshData()
}, gantt.attachEvent("onTaskOpened", function(t) {
if (gantt.config.branch_loading && gantt._load_url && gantt._need_dynamic_loading(t)) {
var e = gantt._load_url;
e = e.replace(/(\?|&)?parent_id=.+&?/, "");
var n = e.indexOf("?") >= 0 ? "&" : "?",
tmarkerstyle How to dowload it? tmarkerstyle
a = 0;
this._cached_scroll_pos && this._cached_scroll_pos.y && (a = Math.max(this._cached_scroll_pos.y, 0)), gantt.load(e + n + "parent_id=" + encodeURIComponent(t), this._load_type, function() {
a && gantt.scrollTo(null, a)
}), gantt.setUserData(t, "was_rendered", !0)
}
}), gantt.getGridColumns = function() {
for (var t = gantt.config.columns, e = [], n = 0; n < t.length; n++) t[n].hide || e.push(t[n]);
return e
}, gantt.getGridColumn = function(t) {
for (var e = gantt.config.columns, n = 0; n < e.length; n++)
tmarkerstyle How to get it? tmarkerstyle
if (e[n].name == t) return e[n];
return null
}, gantt._scale_helpers = {
getSum: function(t, e, n) {
void 0 === n && (n = t.length - 1), void 0 === e && (e = 0);
for (var a = 0, i = e; n >= i; i++) a += t[i];
return a
},
setSumWidth: function(t, e, n, a) {
var i = e.width;
tmarkerstyle PasteShr tmarkerstyle
void 0 === a && (a = i.length - 1), void 0 === n && (n = 0);
var s = a - n + 1;
if (!(n > i.length - 1 || 0 >= s || a > i.length - 1)) {
var r = this.getSum(i, n, a),
o = t - r;
this.adjustSize(o, i, n, a), this.adjustSize(-o, i, a + 1), e.full_width = this.getSum(i)
}
},
splitSize: function(t, e) {
for (var n = [], a = 0; e > a; a++) n[a] = 0;
tmarkerstyle PasteShr tmarkerstyle
return this.adjustSize(t, n), n
},
adjustSize: function(t, e, n, a) {
n || (n = 0), void 0 === a && (a = e.length - 1);
for (var i = a - n + 1, s = this.getSum(e, n, a), r = 0, o = n; a >= o; o++) {
var l = Math.floor(t * (s ? e[o] / s : 1 / i));
s -= e[o], t -= l, i--, e[o] += l, r += l
}
e[e.length - 1] += t
},
tmarkerstyle How to use it? tmarkerstyle
sortScales: function(t) {
function e(t, e) {
var n = new Date(1970, 0, 1);
return gantt.date.add(n, e, t) - n
}
t.sort(function(t, n) {
return e(t.unit, t.step) < e(n.unit, n.step) ? 1 : e(t.unit, t.step) > e(n.unit, n.step) ? -1 : 0
})
},
primaryScale: function() {
tmarkerstyle PasteShr tmarkerstyle
return gantt._init_template("date_scale"), {
unit: gantt.config.scale_unit,
step: gantt.config.step,
template: gantt.templates.date_scale,
date: gantt.config.date_scale,
css: gantt.templates.scale_cell_class
}
},
prepareConfigs: function(t, e, n, a) {
for (var i = this.splitSize(a, t.length), s = n, r = [], o = t.length - 1; o >= 0; o--) {
tmarkerstyle PasteShr tmarkerstyle
var l = o == t.length - 1,
d = this.initScaleConfig(t[o]);
l && this.processIgnores(d), this.initColSizes(d, e, s, i[o]), this.limitVisibleRange(d), l && (s = d.full_width), r.unshift(d)
}
for (var o = 0; o < r.length - 1; o++) this.alineScaleColumns(r[r.length - 1], r[o]);
for (var o = 0; o < r.length; o++) this.setPosSettings(r[o]);
return r
},
setPosSettings: function(t) {
for (var e = 0, n = t.trace_x.length; n > e; e++) t.left.push((t.width[e - 1] || 0) + (t.left[e - 1] || 0))
tmarkerstyle PasteShr tmarkerstyle
},
_ignore_time_config: function(t) {
return this.config.skip_off_time ? !this.isWorkTime(t) : !1
},
processIgnores: function(t) {
t.ignore_x = {}, t.display_count = t.count
},
initColSizes: function(t, e, n, a) {
var i = n;
t.height = a;
tmarkerstyle PasteShr tmarkerstyle
var s = void 0 === t.display_count ? t.count : t.display_count;
s || (s = 1), t.col_width = Math.floor(i / s), e && t.col_width < e && (t.col_width = e, i = t.col_width * s), t.width = [];
for (var r = t.ignore_x || {}, o = 0; o < t.trace_x.length; o++) t.width[o] = r[t.trace_x[o].valueOf()] || t.display_count == t.count ? 0 : 1;
this.adjustSize(i - this.getSum(t.width), t.width), t.full_width = this.getSum(t.width)
},
initScaleConfig: function(t) {
var e = dhtmlx.mixin({
count: 0,
col_width: 0,
full_width: 0,
tmarkerstyle PasteShr tmarkerstyle
height: 0,
width: [],
left: [],
trace_x: []
}, t);
return this.eachColumn(t.unit, t.step, function(t) {
e.count++, e.trace_x.push(new Date(t))
}), e
},
iterateScales: function(t, e, n, a, i) {
tmarkerstyle How to get it? tmarkerstyle
for (var s = e.trace_x, r = t.trace_x, o = n || 0, l = a || r.length - 1, d = 0, _ = 1; _ < s.length; _++)
for (var c = o; l >= c; c++) + r[c] != +s[_] || (i && i.apply(this, [d, _, o, c]), o = c, d = _)
},
alineScaleColumns: function(t, e, n, a) {
this.iterateScales(t, e, n, a, function(n, a, i, s) {
var r = this.getSum(t.width, i, s - 1),
o = this.getSum(e.width, n, a - 1);
o != r && this.setSumWidth(r, e, n, a - 1)
})
},
tmarkerstyle PasteShr tmarkerstyle
eachColumn: function(t, e, n) {
var a = new Date(gantt._min_date),
i = new Date(gantt._max_date);
gantt.date[t + "_start"] && (a = gantt.date[t + "_start"](a));
var s = new Date(a);
for (+s >= +i && (i = gantt.date.add(s, e, t)); + i > +s;) {
n.call(this, new Date(s));
var r = s.getTimezoneOffset();
s = gantt.date.add(s, e, t), s = gantt._correct_dst_change(s, r, e, t), gantt.date[t + "_start"] && (s = gantt.date[t + "_start"](s))
}
tmarkerstyle PasteShr tmarkerstyle
},
limitVisibleRange: function(t) {
var e = t.trace_x,
n = 0,
a = t.width.length - 1,
i = 0;
if (+e[0] < +gantt._min_date && n != a) {
var s = Math.floor(t.width[0] * ((e[1] - gantt._min_date) / (e[1] - e[0])));
i += t.width[0] - s, t.width[0] = s, e[0] = new Date(gantt._min_date)
}
tmarkerstyle PasteShr tmarkerstyle
var r = e.length - 1,
o = e[r],
l = gantt.date.add(o, t.step, t.unit);
if (+l > +gantt._max_date && r > 0) {
var s = t.width[r] - Math.floor(t.width[r] * ((l - gantt._max_date) / (l - o)));
i += t.width[r] - s, t.width[r] = s
}
if (i) {
for (var d = this.getSum(t.width), _ = 0, c = 0; c < t.width.length; c++) {
var g = Math.floor(i * (t.width[c] / d));
tmarkerstyle How to use it? tmarkerstyle
t.width[c] += g, _ += g
}
this.adjustSize(i - _, t.width)
}
}
}, gantt._scale_helpers.processIgnores = function(t) {
var e = t.count;
if (t.ignore_x = {}, gantt.ignore_time || gantt.config.skip_off_time) {
var n = gantt.ignore_time || function() {
return !1
tmarkerstyle How to get it? tmarkerstyle
};
e = 0;
for (var a = 0; a < t.trace_x.length; a++) n.call(gantt, t.trace_x[a]) || this._ignore_time_config.call(gantt, t.trace_x[a]) ? (t.ignore_x[t.trace_x[a].valueOf()] = !0, t.ignored_colls = !0) : e++
}
t.display_count = e
}, gantt._tasks_dnd = {
drag: null,
_events: {
before_start: {},
before_finish: {},
tmarkerstyle How to dowload it? tmarkerstyle
after_finish: {}
},
_handlers: {},
init: function() {
this.clear_drag_state();
var t = gantt.config.drag_mode;
this.set_actions();
var e = {
before_start: "onBeforeTaskDrag",
before_finish: "onBeforeTaskChanged",
tmarkerstyle How to get it for free? tmarkerstyle
after_finish: "onAfterTaskDrag"
};
for (var n in this._events)
for (var a in t) this._events[n][a] = e[n];
this._handlers[t.move] = this._move, this._handlers[t.resize] = this._resize, this._handlers[t.progress] = this._resize_progress
},
set_actions: function() {
var t = gantt.$task_data;
dhtmlxEvent(t, "mousemove", dhtmlx.bind(function(t) {
this.on_mouse_move(t || event)
tmarkerstyle How to get it? tmarkerstyle
}, this)), dhtmlxEvent(t, "mousedown", dhtmlx.bind(function(t) {
this.on_mouse_down(t || event)
}, this)), dhtmlxEvent(t, "mouseup", dhtmlx.bind(function(t) {
this.on_mouse_up(t || event)
}, this))
},
clear_drag_state: function() {
this.drag = {
id: null,
mode: null,
tmarkerstyle PasteShr tmarkerstyle
pos: null,
start_x: null,
start_y: null,
obj: null,
left: null
}
},
_resize: function(t, e, n) {
var a = gantt.config,
i = this._drag_task_coords(t, n);
tmarkerstyle How to dowload it? tmarkerstyle
n.left ? (t.start_date = gantt.dateFromPos(i.start + e), t.start_date || (t.start_date = new Date(gantt.getState().min_date))) : (t.end_date = gantt.dateFromPos(i.end + e), t.end_date || (t.end_date = new Date(gantt.getState().max_date))), t.end_date - t.start_date < a.min_duration && (n.left ? t.start_date = gantt.calculateEndDate(t.end_date, -1) : t.end_date = gantt.calculateEndDate(t.start_date, 1)), gantt._init_task_timing(t)
},
_resize_progress: function(t, e, n) {
var a = this._drag_task_coords(t, n),
i = Math.max(0, n.pos.x - a.start);
t.progress = Math.min(1, i / (a.end - a.start))
},
_move: function(t, e, n) {
var a = this._drag_task_coords(t, n),
i = gantt.dateFromPos(a.start + e),
tmarkerstyle How to get it for free? tmarkerstyle
s = gantt.dateFromPos(a.end + e);
i ? s ? (t.start_date = i, t.end_date = s) : (t.end_date = new Date(gantt.getState().max_date), t.start_date = gantt.dateFromPos(gantt.posFromDate(t.end_date) - (a.end - a.start))) : (t.start_date = new Date(gantt.getState().min_date), t.end_date = gantt.dateFromPos(gantt.posFromDate(t.start_date) + (a.end - a.start)))
},
_drag_task_coords: function(t, e) {
var n = e.obj_s_x = e.obj_s_x || gantt.posFromDate(t.start_date),
a = e.obj_e_x = e.obj_e_x || gantt.posFromDate(t.end_date);
return {
start: n,
end: a
}
tmarkerstyle PasteShr tmarkerstyle
},
on_mouse_move: function(t) {
this.drag.start_drag && this._start_dnd(t);
var e = this.drag;
if (e.mode) {
if (!gantt._checkTimeout(this, 40)) return;
this._update_on_move(t)
}
},
_update_on_move: function(t) {
tmarkerstyle How to get it for free? tmarkerstyle
var e = this.drag;
if (e.mode) {
var n = gantt._get_mouse_pos(t);
if (e.pos && e.pos.x == n.x) return;
e.pos = n;
var a = gantt.dateFromPos(n.x);
if (!a || isNaN(a.getTime())) return;
var i = n.x - e.start_x,
s = gantt.getTask(e.id);
if (this._handlers[e.mode]) {
tmarkerstyle How to get it? tmarkerstyle
var r = dhtmlx.mixin({}, s),
o = dhtmlx.mixin({}, s);
this._handlers[e.mode].apply(this, [o, i, e]), dhtmlx.mixin(s, o, !0), gantt._update_parents(e.id, !0), gantt.callEvent("onTaskDrag", [s.id, e.mode, o, r, t]), dhtmlx.mixin(s, o, !0), gantt._update_parents(e.id), gantt.refreshTask(e.id)
}
}
},
on_mouse_down: function(t, e) {
if (2 != t.button) {
var n = gantt.locate(t),
a = null;
tmarkerstyle How to get it for free? tmarkerstyle
if (gantt.isTaskExists(n) && (a = gantt.getTask(n)), !gantt._is_readonly(a) && !this.drag.mode) {
this.clear_drag_state(), e = e || t.target || t.srcElement;
var i = gantt._getClassName(e);
if (!i || !this._get_drag_mode(i)) return e.parentNode ? this.on_mouse_down(t, e.parentNode) : void 0;
var s = this._get_drag_mode(i);
if (s)
if (s.mode && s.mode != gantt.config.drag_mode.ignore && gantt.config["drag_" + s.mode]) {
if (n = gantt.locate(e), a = dhtmlx.copy(gantt.getTask(n) || {}), gantt._is_readonly(a)) return this.clear_drag_state(), !1;
if (gantt._is_flex_task(a) && s.mode != gantt.config.drag_mode.progress) return void this.clear_drag_state();
s.id = n;
tmarkerstyle How to dowload it? tmarkerstyle
var r = gantt._get_mouse_pos(t);
s.start_x = r.x, s.start_y = r.y, s.obj = a, this.drag.start_drag = s
} else this.clear_drag_state();
else if (gantt.checkEvent("onMouseDown") && gantt.callEvent("onMouseDown", [i.split(" ")[0]]) && e.parentNode) return this.on_mouse_down(t, e.parentNode)
}
}
},
_fix_dnd_scale_time: function(t, e) {
function n(t) {
gantt.isWorkTime(t.start_date) || (t.start_date = gantt.calculateEndDate(t.start_date, -1, gantt.config.duration_unit))
tmarkerstyle How to get it? tmarkerstyle
}
function a(t) {
gantt.isWorkTime(new Date(t.end_date - 1)) || (t.end_date = gantt.calculateEndDate(t.end_date, 1, gantt.config.duration_unit))
}
var i = gantt._tasks.unit,
s = gantt._tasks.step;
gantt.config.round_dnd_dates || (i = "minute", s = gantt.config.time_step), e.mode == gantt.config.drag_mode.resize ? e.left ? (t.start_date = gantt.roundDate({
date: t.start_date,
unit: i,
tmarkerstyle How to get it? tmarkerstyle
step: s
}), n(t)) : (t.end_date = gantt.roundDate({
date: t.end_date,
unit: i,
step: s
}), a(t)) : e.mode == gantt.config.drag_mode.move && (t.start_date = gantt.roundDate({
date: t.start_date,
unit: i,
step: s
}), n(t), t.end_date = gantt.calculateEndDate(t.start_date, t.duration, gantt.config.duration_unit))
tmarkerstyle How to get it? tmarkerstyle
},
_fix_working_times: function(t, e) {
var e = e || {
mode: gantt.config.drag_mode.move
};
gantt.config.work_time && gantt.config.correct_work_time && (e.mode == gantt.config.drag_mode.resize ? e.left ? t.start_date = gantt.getClosestWorkTime({
date: t.start_date,
dir: "future"
}) : t.end_date = gantt.getClosestWorkTime({
date: t.end_date,
tmarkerstyle How to use it? tmarkerstyle
dir: "past"
}) : e.mode == gantt.config.drag_mode.move && gantt.correctTaskWorkTime(t))
},
on_mouse_up: function(t) {
var e = this.drag;
if (e.mode && e.id) {
var n = gantt.getTask(e.id);
if (gantt.config.work_time && gantt.config.correct_work_time && this._fix_working_times(n, e), this._fix_dnd_scale_time(n, e), gantt._init_task_timing(n), this._fireEvent("before_finish", e.mode, [e.id, e.mode, dhtmlx.copy(e.obj), t])) {
var a = e.id;
gantt._init_task_timing(n), this._fireEvent("after_finish", e.mode, [a, e.mode, t]), this.clear_drag_state(), gantt.updateTask(n.id)
tmarkerstyle PasteShr tmarkerstyle
} else e.obj._dhx_changed = !1, dhtmlx.mixin(n, e.obj, !0), gantt.updateTask(n.id)
}
this.clear_drag_state()
},
_get_drag_mode: function(t) {
var e = gantt.config.drag_mode,
n = (t || "").split(" "),
a = n[0],
i = {
mode: null,
tmarkerstyle How to use it? tmarkerstyle
left: null
};
switch (a) {
case "gantt_task_line":
case "gantt_task_content":
i.mode = e.move;
break;
case "gantt_task_drag":
i.mode = e.resize, i.left = n[1] && -1 !== n[1].indexOf("left", n[1].length - "left".length) ? !0 : !1;
break;
tmarkerstyle PasteShr tmarkerstyle
case "gantt_task_progress_drag":
i.mode = e.progress;
break;
case "gantt_link_control":
case "gantt_link_point":
i.mode = e.ignore;
break;
default:
i = null
}
tmarkerstyle How to use it? tmarkerstyle
return i
},
_start_dnd: function(t) {
var e = this.drag = this.drag.start_drag;
delete e.start_drag;
var n = gantt.config,
a = e.id;
n["drag_" + e.mode] && gantt.callEvent("onBeforeDrag", [a, e.mode, t]) && this._fireEvent("before_start", e.mode, [a, e.mode, t]) ? delete e.start_drag : this.clear_drag_state()
},
_fireEvent: function(t, e, n) {
tmarkerstyle PasteShr tmarkerstyle
dhtmlx.assert(this._events[t], "Invalid stage:{" + t + "}");
var a = this._events[t][e];
return dhtmlx.assert(a, "Unknown after drop mode:{" + e + "}"), dhtmlx.assert(n, "Invalid event arguments"), gantt.checkEvent(a) ? gantt.callEvent(a, n) : !0
}
}, gantt.roundTaskDates = function(t) {
var e = gantt._tasks_dnd.drag;
e || (e = {
mode: gantt.config.drag_mode.move
}), gantt._tasks_dnd._fix_dnd_scale_time(t, e)
}, gantt._render_link = function(t) {
tmarkerstyle How to get it? tmarkerstyle
for (var e = this.getLink(t), n = gantt._get_link_renderers(), a = 0; a < n.length; a++) n[a].render_item(e)
}, gantt._get_link_type = function(t, e) {
var n = null;
return t && e ? n = gantt.config.links.start_to_start : !t && e ? n = gantt.config.links.finish_to_start : t || e ? t && !e && (n = gantt.config.links.start_to_finish) : n = gantt.config.links.finish_to_finish, n
}, gantt.isLinkAllowed = function(t, e, n, a) {
var i = null;
if (i = "object" == typeof t ? t : {
source: t,
target: e,
type: this._get_link_type(n, a)
tmarkerstyle How to use it? tmarkerstyle
}, !i) return !1;
if (!(i.source && i.target && i.type)) return !1;
if (i.source == i.target) return !1;
var s = !0;
return this.checkEvent("onLinkValidation") && (s = this.callEvent("onLinkValidation", [i])), s
}, gantt._render_link_element = function(t) {
var e = this._path_builder.get_points(t),
n = gantt._drawer,
a = n.get_lines(e),
i = document.createElement("div"),
tmarkerstyle How to dowload it? tmarkerstyle
s = "gantt_task_link";
t.color && (s += " gantt_link_inline_color");
var r = this.templates.link_class ? this.templates.link_class(t) : "";
r && (s += " " + r), this.config.highlight_critical_path && this.isCriticalLink && this.isCriticalLink(t) && (s += " gantt_critical_link"), i.className = s, i.setAttribute(gantt.config.link_attribute, t.id);
for (var o = 0; o < a.length; o++) {
o == a.length - 1 && (a[o].size -= gantt.config.link_arrow_size);
var l = n.render_line(a[o], a[o + 1]);
t.color && (l.firstChild.style.backgroundColor = t.color), i.appendChild(l)
}
var d = a[a.length - 1].direction,
tmarkerstyle How to get it for free? tmarkerstyle
_ = gantt._render_link_arrow(e[e.length - 1], d);
return t.color && (_.style.borderColor = t.color), i.appendChild(_), i
}, gantt._render_link_arrow = function(t, e) {
var n = document.createElement("div"),
a = gantt._drawer,
i = t.y,
s = t.x,
r = gantt.config.link_arrow_size,
o = gantt.config.row_height,
l = "gantt_link_arrow gantt_link_arrow_" + e;
tmarkerstyle How to get it for free? tmarkerstyle
switch (e) {
case a.dirs.right:
i -= (r - o) / 2, s -= r;
break;
case a.dirs.left:
i -= (r - o) / 2;
break;
case a.dirs.up:
s -= r;
break;
tmarkerstyle How to get it? tmarkerstyle
case a.dirs.down:
i += 2 * r, s -= r
}
return n.style.cssText = ["top:" + i + "px", "left:" + s + "px"].join(";"), n.className = l, n
}, gantt._drawer = {
current_pos: null,
dirs: {
left: "left",
right: "right",
up: "up",
tmarkerstyle How to get it? tmarkerstyle
down: "down"
},
path: [],
clear: function() {
this.current_pos = null, this.path = []
},
point: function(t) {
this.current_pos = dhtmlx.copy(t)
},
get_lines: function(t) {
tmarkerstyle How to use it? tmarkerstyle
this.clear(), this.point(t[0]);
for (var e = 1; e < t.length; e++) this.line_to(t[e]);
return this.get_path()
},
line_to: function(t) {
var e = dhtmlx.copy(t),
n = this.current_pos,
a = this._get_line(n, e);
this.path.push(a), this.current_pos = e
},
tmarkerstyle How to get it for free? tmarkerstyle
get_path: function() {
return this.path
},
get_wrapper_sizes: function(t) {
var e, n = gantt.config.link_wrapper_width,
a = (gantt.config.link_line_width, t.y + (gantt.config.row_height - n) / 2);
switch (t.direction) {
case this.dirs.left:
e = {
top: a,
tmarkerstyle How to get it? tmarkerstyle
height: n,
lineHeight: n,
left: t.x - t.size - n / 2,
width: t.size + n
};
break;
case this.dirs.right:
e = {
top: a,
lineHeight: n,
tmarkerstyle How to use it? tmarkerstyle
height: n,
left: t.x - n / 2,
width: t.size + n
};
break;
case this.dirs.up:
e = {
top: a - t.size,
lineHeight: t.size + n,
height: t.size + n,
tmarkerstyle How to get it? tmarkerstyle
left: t.x - n / 2,
width: n
};
break;
case this.dirs.down:
e = {
top: a,
lineHeight: t.size + 2 * n,
height: t.size + 2 * n,
left: t.x - n / 2,
tmarkerstyle How to dowload it? tmarkerstyle
width: n
}
}
return e
},
get_line_sizes: function(t) {
var e, n = gantt.config.link_line_width,
a = gantt.config.link_wrapper_width,
i = t.size + n;
switch (t.direction) {
tmarkerstyle How to get it? tmarkerstyle
case this.dirs.left:
case this.dirs.right:
e = {
height: n,
width: i,
marginTop: (a - n) / 2,
marginLeft: (a - n) / 2
};
break;
case this.dirs.up:
tmarkerstyle How to get it for free? tmarkerstyle
case this.dirs.down:
e = {
height: i,
width: n,
marginTop: (a - n) / 2,
marginLeft: (a - n) / 2
}
}
return e
},
tmarkerstyle How to get it? tmarkerstyle
render_line: function(t) {
var e = this.get_wrapper_sizes(t),
n = document.createElement("div");
n.style.cssText = ["top:" + e.top + "px", "left:" + e.left + "px", "height:" + e.height + "px", "width:" + e.width + "px"].join(";"), n.className = "gantt_line_wrapper";
var a = this.get_line_sizes(t),
i = document.createElement("div");
return i.style.cssText = ["height:" + a.height + "px", "width:" + a.width + "px", "margin-top:" + a.marginTop + "px", "margin-left:" + a.marginLeft + "px"].join(";"), i.className = "gantt_link_line_" + t.direction, n.appendChild(i), n
},
_get_line: function(t, e) {
var n = this.get_direction(t, e),
tmarkerstyle PasteShr tmarkerstyle
a = {
x: t.x,
y: t.y,
direction: this.get_direction(t, e)
};
return a.size = Math.abs(n == this.dirs.left || n == this.dirs.right ? t.x - e.x : t.y - e.y), a
},
get_direction: function(t, e) {
var n = 0;
return n = e.x < t.x ? this.dirs.left : e.x > t.x ? this.dirs.right : e.y > t.y ? this.dirs.down : this.dirs.up
tmarkerstyle How to use it? tmarkerstyle
}
}, gantt._y_from_ind = function(t) {
return t * gantt.config.row_height
}, gantt._path_builder = {
path: [],
clear: function() {
this.path = []
},
current: function() {
return this.path[this.path.length - 1]
tmarkerstyle How to dowload it? tmarkerstyle
},
point: function(t) {
return t ? (this.path.push(dhtmlx.copy(t)), t) : this.current()
},
point_to: function(t, e, n) {
n = n ? {
x: n.x,
y: n.y
} : dhtmlx.copy(this.point());
var a = gantt._drawer.dirs;
tmarkerstyle How to get it for free? tmarkerstyle
switch (t) {
case a.left:
n.x -= e;
break;
case a.right:
n.x += e;
break;
case a.up:
n.y -= e;
break;
tmarkerstyle PasteShr tmarkerstyle
case a.down:
n.y += e
}
return this.point(n)
},
get_points: function(t) {
var e = this.get_endpoint(t),
n = gantt.config,
a = e.e_y - e.y,
i = e.e_x - e.x,
tmarkerstyle How to get it? tmarkerstyle
s = gantt._drawer.dirs;
this.clear(), this.point({
x: e.x,
y: e.y
});
var r = 2 * n.link_arrow_size,
o = e.e_x > e.x;
if (t.type == gantt.config.links.start_to_start) this.point_to(s.left, r), o ? (this.point_to(s.down, a), this.point_to(s.right, i)) : (this.point_to(s.right, i), this.point_to(s.down, a)), this.point_to(s.right, r);
else if (t.type == gantt.config.links.finish_to_start)
if (o = e.e_x > e.x + 2 * r, this.point_to(s.right, r), o) i -= r, this.point_to(s.down, a), this.point_to(s.right, i);
tmarkerstyle PasteShr tmarkerstyle
else {
i -= 2 * r;
var l = a > 0 ? 1 : -1;
this.point_to(s.down, l * (n.row_height / 2)), this.point_to(s.right, i), this.point_to(s.down, l * (Math.abs(a) - n.row_height / 2)), this.point_to(s.right, r)
} else if (t.type == gantt.config.links.finish_to_finish) this.point_to(s.right, r), o ? (this.point_to(s.right, i), this.point_to(s.down, a)) : (this.point_to(s.down, a), this.point_to(s.right, i)), this.point_to(s.left, r);
else if (t.type == gantt.config.links.start_to_finish)
if (o = e.e_x > e.x - 2 * r, this.point_to(s.left, r), o) {
i += 2 * r;
var l = a > 0 ? 1 : -1;
this.point_to(s.down, l * (n.row_height / 2)), this.point_to(s.right, i), this.point_to(s.down, l * (Math.abs(a) - n.row_height / 2)), this.point_to(s.left, r)
tmarkerstyle How to get it for free? tmarkerstyle
} else i += r, this.point_to(s.down, a), this.point_to(s.right, i);
return this.path
},
get_endpoint: function(t) {
var e = gantt.config.links,
n = !1,
a = !1;
t.type == e.start_to_start ? n = a = !0 : t.type == e.finish_to_finish ? n = a = !1 : t.type == e.finish_to_start ? (n = !1, a = !0) : t.type == e.start_to_finish ? (n = !0, a = !1) : dhtmlx.assert(!1, "Invalid link type");
var i = gantt._get_task_visible_pos(gantt._pull[t.source], n),
s = gantt._get_task_visible_pos(gantt._pull[t.target], a);
tmarkerstyle How to dowload it? tmarkerstyle
return {
x: i.x,
e_x: s.x,
y: i.y,
e_y: s.y
}
}
}, gantt._init_links_dnd = function() {
function t(t, e, n) {
var a = gantt._get_task_pos(t, !! e);
tmarkerstyle How to use it? tmarkerstyle
return a.y += gantt._get_task_height() / 2, n = n || 0, a.x += (e ? -1 : 1) * n, a
}
function e(t) {
var e = a(),
n = ["gantt_link_tooltip"];
e.from && e.to && n.push(gantt.isLinkAllowed(e.from, e.to, e.from_start, e.to_start) ? "gantt_allowed_link" : "gantt_invalid_link");
var i = gantt.templates.drag_link_class(e.from, e.from_start, e.to, e.to_start);
i && n.push(i);
var s = "
";
tmarkerstyle PasteShr tmarkerstyle
t.innerHTML = s
}
function n(t, e) {
t.style.left = e.x + 5 + "px", t.style.top = e.y + 5 + "px"
}
function a() {
return {
from: gantt._link_source_task,
tmarkerstyle How to get it for free? tmarkerstyle
to: gantt._link_target_task,
from_start: gantt._link_source_task_start,
to_start: gantt._link_target_task_start
}
}
function i() {
gantt._link_source_task = gantt._link_source_task_start = gantt._link_target_task = null, gantt._link_target_task_start = !0
}
tmarkerstyle PasteShr tmarkerstyle
function s(t, e, n, i) {
var s = l(),
d = a(),
_ = ["gantt_link_direction"];
gantt.templates.link_direction_class && _.push(gantt.templates.link_direction_class(d.from, d.from_start, d.to, d.to_start));
var c = Math.sqrt(Math.pow(n - t, 2) + Math.pow(i - e, 2));
if (c = Math.max(0, c - 3)) {
s.className = _.join(" ");
var g = (i - e) / (n - t),
h = Math.atan(g);
tmarkerstyle How to dowload it? tmarkerstyle
2 == o(t, n, e, i) ? h += Math.PI : 3 == o(t, n, e, i) && (h -= Math.PI);
var u = Math.sin(h),
f = Math.cos(h),
p = Math.round(e),
v = Math.round(t),
m = ["-webkit-transform: rotate(" + h + "rad)", "-moz-transform: rotate(" + h + "rad)", "-ms-transform: rotate(" + h + "rad)", "-o-transform: rotate(" + h + "rad)", "transform: rotate(" + h + "rad)", "width:" + Math.round(c) + "px"];
if (-1 != window.navigator.userAgent.indexOf("MSIE 8.0")) {
m.push('-ms-filter: "' + r(u, f) + '"');
var k = Math.abs(Math.round(t - n)),
x = Math.abs(Math.round(i - e));
tmarkerstyle How to get it? tmarkerstyle
switch (o(t, n, e, i)) {
case 1:
p -= x;
break;
case 2:
v -= k, p -= x;
break;
case 3:
v -= k
}
tmarkerstyle PasteShr tmarkerstyle
}
m.push("top:" + p + "px"), m.push("left:" + v + "px"), s.style.cssText = m.join(";")
}
}
function r(t, e) {
return "progid:DXImageTransform.Microsoft.Matrix(M11 = " + e + ",M12 = -" + t + ",M21 = " + t + ",M22 = " + e + ",SizingMethod = 'auto expand')"
}
function o(t, e, n, a) {
tmarkerstyle How to get it? tmarkerstyle
return e >= t ? n >= a ? 1 : 4 : n >= a ? 2 : 3
}
function l() {
return _._direction || (_._direction = document.createElement("div"), gantt.$task_links.appendChild(_._direction)), _._direction
}
function d() {
_._direction && (_._direction.parentNode && _._direction.parentNode.removeChild(_._direction), _._direction = null)
}
tmarkerstyle How to use it? tmarkerstyle
var _ = new dhtmlxDnD(this.$task_bars, {
sensitivity: 0,
updates_per_second: 60
}),
c = "task_left",
g = "task_right",
h = "gantt_link_point",
u = "gantt_link_control";
_.attachEvent("onBeforeDragStart", dhtmlx.bind(function(e, n) {
var a = n.target || n.srcElement;
tmarkerstyle How to get it? tmarkerstyle
if (i(), gantt.getState().drag_id) return !1;
if (gantt._locate_css(a, h)) {
gantt._locate_css(a, c) && (gantt._link_source_task_start = !0);
var s = gantt._link_source_task = this.locate(n),
r = gantt.getTask(s);
if (gantt._is_readonly(r)) return i(), !1;
var o = 0;
return gantt._get_safe_type(r.type) == gantt.config.types.milestone && (o = (gantt._get_visible_milestone_width() - gantt._get_milestone_width()) / 2), this._dir_start = t(r, !! gantt._link_source_task_start, o), !0
}
return !1
tmarkerstyle How to get it? tmarkerstyle
}, this)), _.attachEvent("onAfterDragStart", dhtmlx.bind(function() {
e(_.config.marker)
}, this)), _.attachEvent("onDragMove", dhtmlx.bind(function(a, i) {
var r = _.config,
o = _.getPosition(i);
n(r.marker, o);
var l = gantt._is_link_drop_area(i),
d = gantt._link_target_task,
c = gantt._link_landing,
h = gantt._link_target_task_start,
tmarkerstyle How to dowload it? tmarkerstyle
f = gantt.locate(i),
p = !0;
if (l && (p = !gantt._locate_css(i, g), l = !! f), gantt._link_target_task = f, gantt._link_landing = l, gantt._link_target_task_start = p, l) {
var v = gantt.getTask(f),
m = gantt._locate_css(i, u),
k = 0;
m && (k = Math.floor(m.offsetWidth / 2)), this._dir_end = t(v, !! gantt._link_target_task_start, k)
} else this._dir_end = gantt._get_mouse_pos(i);
var x = !(c == l && d == f && h == p);
return x && (d && gantt.refreshTask(d, !1), f && gantt.refreshTask(f, !1)), x && e(r.marker), s(this._dir_start.x, this._dir_start.y, this._dir_end.x, this._dir_end.y), !0
tmarkerstyle How to get it? tmarkerstyle
}, this)), _.attachEvent("onDragEnd", dhtmlx.bind(function() {
var t = a();
if (t.from && t.to && t.from != t.to) {
var e = gantt._get_link_type(t.from_start, t.to_start),
n = {
source: t.from,
target: t.to,
type: e
};
n.type && gantt.isLinkAllowed(n) && gantt.addLink(n)
tmarkerstyle How to get it? tmarkerstyle
}
i(), t.from && gantt.refreshTask(t.from, !1), t.to && gantt.refreshTask(t.to, !1), d()
}, this)), gantt._is_link_drop_area = function(t) {
return !!gantt._locate_css(t, u)
}
}, gantt._get_link_state = function() {
return {
link_landing_area: this._link_landing,
link_target_id: this._link_target_task,
link_target_start: this._link_target_task_start,
tmarkerstyle How to get it for free? tmarkerstyle
link_source_id: this._link_source_task,
link_source_start: this._link_source_task_start
}
}, gantt._init_tasks = function() {
function t(t, e, n, a) {
for (var i = 0; i < t.length; i++) t[i].change_id(e, n), t[i].render_item(a)
}
this._tasks = {
col_width: this.config.columnWidth,
width: [],
tmarkerstyle How to get it for free? tmarkerstyle
full_width: 0,
trace_x: [],
rendered: {}
}, this._click.gantt_task_link = dhtmlx.bind(function(t) {
var e = this.locate(t, gantt.config.link_attribute);
e && this.callEvent("onLinkClick", [e, t])
}, this), this._click.gantt_scale_cell = dhtmlx.bind(function(t) {
var e = gantt._get_mouse_pos(t),
n = gantt.dateFromPos(e.x),
a = Math.floor(gantt._day_index_by_date(n)),
tmarkerstyle How to get it? tmarkerstyle
i = gantt._tasks.trace_x[a];
gantt.callEvent("onScaleClick", [t, i])
}, this), this._dbl_click.gantt_task_link = dhtmlx.bind(function(t, e) {
var e = this.locate(t, gantt.config.link_attribute);
this._delete_link_handler(e, t)
}, this), this._dbl_click.gantt_link_point = dhtmlx.bind(function(t, e, n) {
var e = this.locate(t),
a = this.getTask(e),
i = null;
return n.parentNode && gantt._getClassName(n.parentNode) && (i = gantt._getClassName(n.parentNode).indexOf("_left") > -1 ? a.$target[0] : a.$source[0]), i && this._delete_link_handler(i, t), !1
tmarkerstyle How to get it? tmarkerstyle
}, this), this._tasks_dnd.init(), this._init_links_dnd(), this._link_layers.clear();
var e = this.addLinkLayer({
renderer: this._render_link_element,
container: this.$task_links,
filter: gantt._create_filter(["_filter_link", "_is_chart_visible"])
});
this._linkRenderer = this._link_layers.getRenderer(e), this._task_layers.clear();
var n = this.addTaskLayer({
renderer: this._render_task_element,
container: this.$task_bars,
tmarkerstyle How to dowload it? tmarkerstyle
filter: gantt._create_filter(["_filter_task", "_is_chart_visible"])
});
this._taskRenderer = this._task_layers.getRenderer(n), this.addTaskLayer({
renderer: this._render_grid_item,
container: this.$grid_data,
filter: gantt._create_filter(["_filter_task", "_is_grid_visible"])
}), this.addTaskLayer({
renderer: this._render_bg_line,
container: this.$task_bg,
filter: gantt._create_filter(["_filter_task", "_is_chart_visible", "_is_std_background"])
tmarkerstyle How to use it? tmarkerstyle
}), this._onTaskIdChange && this.detachEvent(this._onTaskIdChange), this._onTaskIdChange = this.attachEvent("onTaskIdChange", function(e, n) {
var a = this._get_task_renderers();
t(a, e, n, this.getTask(n))
}), this._onLinkIdChange && this.detachEvent(this._onLinkIdChange), this._onLinkIdChange = this.attachEvent("onLinkIdChange", function(e, n) {
var a = this._get_link_renderers();
t(a, e, n, this.getLink(n))
})
}, gantt._create_filter = function(t) {
return t instanceof Array || (t = Array.prototype.slice.call(arguments, 0)),
function(e) {
tmarkerstyle PasteShr tmarkerstyle
for (var n = !0, a = 0, i = t.length; i > a; a++) {
var s = t[a];
gantt[s] && (n = n && gantt[s].apply(gantt, [e.id, e]) !== !1)
}
return n
}
}, gantt._is_chart_visible = function() {
return !!this.config.show_chart
}, gantt._filter_task = function(t, e) {
var n = null,
tmarkerstyle How to get it? tmarkerstyle
a = null;
return this.config.start_date && this.config.end_date && (n = this.config.start_date.valueOf(), a = this.config.end_date.valueOf(), +e.start_date > a || +e.end_date < +n) ? !1 : !0
}, gantt._filter_link = function(t, e) {
return this.config.show_links ? !gantt.isTaskVisible(e.source) || !gantt.isTaskVisible(e.target) || gantt._isAllowedUnscheduledTask(gantt.getTask(e.source)) || gantt._isAllowedUnscheduledTask(gantt.getTask(e.target)) ? !1 : this.callEvent("onBeforeLinkDisplay", [t, e]) : !1
}, gantt._is_std_background = function() {
return !this.config.static_background
}, gantt._delete_link_handler = function(t, e) {
if (t && this.callEvent("onLinkDblClick", [t, e])) {
var n = gantt.getLink(t);
if (gantt._is_readonly(n)) return;
tmarkerstyle How to use it? tmarkerstyle
var a = "",
i = gantt.locale.labels.link + " " + this.templates.link_description(this.getLink(t)) + " " + gantt.locale.labels.confirm_link_deleting;
window.setTimeout(function() {
gantt._dhtmlx_confirm(i, a, function() {
gantt.deleteLink(t)
})
}, gantt.config.touch ? 300 : 1)
}
}, gantt.getTaskNode = function(t) {
return this._taskRenderer.rendered[t]
tmarkerstyle How to get it? tmarkerstyle
}, gantt.getLinkNode = function(t) {
return this._linkRenderer.rendered[t]
}, gantt._get_tasks_data = function() {
for (var t = [], e = 0; e < this._order.length; e++) {
var n = this._pull[this._order[e]];
n.$index = e, this.resetProjectDates(n), t.push(n)
}
return t
}, gantt._get_links_data = function() {
var t = [];
tmarkerstyle How to use it? tmarkerstyle
for (var e in this._lpull) t.push(this._lpull[e]);
return t
}, gantt._render_data = function() {
if (this.callEvent("onBeforeDataRender", []), this._is_render_active()) {
this._sync_order(), this._update_layout_sizes(), this.config.static_background && this._render_bg_canvas();
for (var t = this._get_tasks_data(), e = this._get_task_renderers(), n = 0; n < e.length; n++) e[n].render_items(t);
var a = gantt._get_links_data();
e = this._get_link_renderers();
for (var n = 0; n < e.length; n++) e[n].render_items(a);
tmarkerstyle PasteShr tmarkerstyle
this.callEvent("onDataRender", [])
}
}, gantt._update_layout_sizes = function() {
var t = this._tasks;
t.bar_height = this._get_task_height(), this.$task_data.style.height = Math.max(this.$task.offsetHeight - this.config.scale_height, 0) + "px", this.$task_bg.style.height = "", this.$task_bg.style.backgroundImage = "";
for (var e = this.$task_data.childNodes, n = 0, a = e.length; a > n; n++) {
var i = e[n];
this._is_layer(i) && i.style && (i.style.width = t.full_width + "px")
}
if (this._is_grid_visible()) {
tmarkerstyle How to dowload it? tmarkerstyle
for (var s = this.getGridColumns(), r = 0, n = 0; n < s.length; n++) r += s[n].width;
this.$grid_data.style.width = Math.max(r - 1, 0) + "px"
}
}, gantt._scale_range_unit = function() {
var t = this.config.scale_unit;
if (this.config.scale_offset_minimal) {
var e = this._get_scales();
t = e[e.length - 1].unit
}
return t
tmarkerstyle How to get it? tmarkerstyle
}, gantt._init_tasks_range = function() {
var t = this._scale_range_unit();
if (this.config.start_date && this.config.end_date) return this._min_date = this.date[t + "_start"](new Date(this.config.start_date)), void(this._max_date = this.date[t + "_start"](new Date(this.config.end_date)));
this._get_tasks_data();
var e = this.getSubtaskDates();
this._min_date = e.start_date, this._max_date = e.end_date, this._max_date && this._max_date || (this._min_date = new Date, this._max_date = new Date(this._min_date)), this._min_date = this.date[t + "_start"](this._min_date), this._min_date = this.calculateEndDate(this.date[t + "_start"](this._min_date), -1, t), this._max_date = this.date[t + "_start"](this._max_date), this._max_date = this.calculateEndDate(this._max_date, 2, t)
}, gantt._prepare_scale_html = function(t) {
var e = [],
n = null,
a = null,
tmarkerstyle PasteShr tmarkerstyle
i = null;
(t.template || t.date) && (a = t.template || this.date.date_to_str(t.date)), i = t.css || function() {}, !t.css && this.config.inherit_scale_class && (i = gantt.templates.scale_cell_class);
for (var s = 0; s < t.count; s++) {
n = new Date(t.trace_x[s]);
var r = a.call(this, n),
o = t.width[s],
l = "",
d = "",
_ = "";
if (o) {
tmarkerstyle PasteShr tmarkerstyle
l = "width:" + o + "px;", _ = "gantt_scale_cell" + (s == t.count - 1 ? " gantt_last_cell" : ""), d = i.call(this, n), d && (_ += " " + d);
var c = "
" + r + "
";
e.push(c)
}
}
return e.join("")
}, gantt._get_scales = function() {
var t = this._scale_helpers,
e = [t.primaryScale()].concat(this.config.subscales);
return t.sortScales(e), e
tmarkerstyle How to get it for free? tmarkerstyle
}, gantt._render_tasks_scales = function() {
this._init_tasks_range(), this._scroll_resize(), this._set_sizes();
var t = "",
e = 0,
n = 0,
a = 0;
if (this._is_chart_visible()) {
var i = this._scale_helpers,
s = this._get_scales();
a = this.config.scale_height - 1;
tmarkerstyle How to get it for free? tmarkerstyle
for (var r = this._get_resize_options(), o = r.x ? Math.max(this.config.autosize_min_width, 0) : this.$task.offsetWidth, l = i.prepareConfigs(s, this.config.min_column_width, o, a), d = this._tasks = l[l.length - 1], _ = [], c = this.templates.scale_row_class, g = 0; g < l.length; g++) {
var h = "gantt_scale_line",
u = c(l[g]);
u && (h += " " + u), _.push('
' + this._prepare_scale_html(l[g]) + "
")
}
t = _.join(""), e = d.full_width + this.$scroll_ver.offsetWidth + "px", n = d.full_width + "px", a += "px"
}
this.$task.style.display = this._is_chart_visible() ? "" : "none", this.$task_scale.style.height = a, this.$task_data.style.width = this.$task_scale.style.width = e, this.$task_scale.innerHTML = t
}, gantt._render_bg_line = function(t) {
var e = gantt._tasks,
tmarkerstyle How to get it for free? tmarkerstyle
n = e.count,
a = document.createElement("div");
if (gantt.config.show_task_cells)
for (var i = 0; n > i; i++) {
var s = e.width[i],
r = "";
if (s > 0) {
var o = document.createElement("div");
o.style.width = s + "px", r = "gantt_task_cell" + (i == n - 1 ? " gantt_last_cell" : ""), d = this.templates.task_cell_class(t, e.trace_x[i]), d && (r += " " + d), o.className = r, a.appendChild(o)
}
tmarkerstyle How to use it? tmarkerstyle
}
var l = t.$index % 2 !== 0,
d = gantt.templates.task_row_class(t.start_date, t.end_date, t),
_ = "gantt_task_row" + (l ? " odd" : "") + (d ? " " + d : "");
return this.getState().selected_task == t.id && (_ += " gantt_selected"), a.className = _, a.style.height = gantt.config.row_height + "px", a.setAttribute(this.config.task_attribute, t.id), a
}, gantt._render_bg_canvas = function() {}, gantt._adjust_scales = function() {
if (this.config.fit_tasks) {
var t = +this._min_date,
e = +this._max_date;
if (this._init_tasks_range(), +this._min_date != t || +this._max_date != e) return this.render(), this.callEvent("onScaleAdjusted", []), !0
tmarkerstyle How to get it for free? tmarkerstyle
}
return !1
}, gantt.refreshTask = function(t, e) {
if (this._is_render_active()) {
var n = this._get_task_renderers(),
a = this.getTask(t);
if (a && this.isTaskVisible(t)) {
for (var i = 0; i < n.length; i++) n[i].render_item(a);
if (void 0 !== e && !e) return;
for (var i = 0; i < a.$source.length; i++) gantt.refreshLink(a.$source[i]);
tmarkerstyle How to dowload it? tmarkerstyle
for (var i = 0; i < a.$target.length; i++) gantt.refreshLink(a.$target[i])
} else this._render_data()
}
}, gantt.refreshLink = function(t) {
if (this._is_render_active())
if (this.isLinkExists(t)) this._render_link(t);
else
for (var e = this._get_link_renderers(), n = 0; n < e.length; n++) e[n].remove_item(t)
}, gantt._combine_item_class = function(t, e, n) {
var a = [t];
tmarkerstyle How to use it? tmarkerstyle
e && a.push(e);
var i = gantt.getState(),
s = this.getTask(n);
this._get_safe_type(s.type) == this.config.types.milestone && a.push("gantt_milestone"), this._get_safe_type(s.type) == this.config.types.project && a.push("gantt_project"), this._is_flex_task(s) && a.push("gantt_dependent_task"), this.config.select_task && n == i.selected_task && a.push("gantt_selected"), n == i.drag_id && (a.push("gantt_drag_" + i.drag_mode), i.touch_drag && a.push("gantt_touch_" + i.drag_mode));
var r = gantt._get_link_state();
if (r.link_source_id == n && a.push("gantt_link_source"), r.link_target_id == n && a.push("gantt_link_target"), this.config.highlight_critical_path && this.isCriticalTask && this.isCriticalTask(s) && a.push("gantt_critical_task"), r.link_landing_area && r.link_target_id && r.link_source_id && r.link_target_id != r.link_source_id) {
var o = r.link_source_id,
l = r.link_source_start,
d = r.link_target_start,
_ = gantt.isLinkAllowed(o, n, l, d),
tmarkerstyle PasteShr tmarkerstyle
c = "";
c = _ ? d ? "link_start_allow" : "link_finish_allow" : d ? "link_start_deny" : "link_finish_deny", a.push(c)
}
return a.join(" ")
}, gantt._render_pair = function(t, e, n, a) {
var i = gantt.getState(); + n.end_date <= +i.max_date && t.appendChild(a(e + " task_right")), +n.start_date >= +i.min_date && t.appendChild(a(e + " task_left"))
}, gantt._get_task_height = function() {
var t = this.config.task_height;
return "full" == t && (t = this.config.row_height - 5), t = Math.min(t, this.config.row_height), Math.max(t, 0)
}, gantt._get_milestone_width = function() {
tmarkerstyle How to get it for free? tmarkerstyle
return this._get_task_height()
}, gantt._get_visible_milestone_width = function() {
var t = gantt._get_task_height();
return Math.sqrt(2 * t * t)
}, gantt.getTaskPosition = function(t, e, n) {
var a = this.posFromDate(e || t.start_date),
i = this.posFromDate(n || t.end_date);
i = Math.max(a, i);
var s = this.getTaskTop(t.id),
r = this.config.task_height;
tmarkerstyle How to get it for free? tmarkerstyle
return {
left: a,
top: s,
height: r,
width: Math.max(i - a, 0)
}
}, gantt._get_task_width = function(t) {
return Math.round(this._get_task_pos(t, !1).x - this._get_task_pos(t, !0).x)
}, gantt._is_readonly = function(t) {
return t && t[this.config.editable_property] ? !1 : t && t[this.config.readonly_property] || this.config.readonly
tmarkerstyle How to get it? tmarkerstyle
}, gantt._task_default_render = function(t) {
if (!this._isAllowedUnscheduledTask(t)) {
var e = this._get_task_pos(t),
n = this.config,
a = this._get_task_height(),
i = Math.floor((this.config.row_height - a) / 2);
this._get_safe_type(t.type) == n.types.milestone && n.link_line_width > 1 && (i += 1);
var s = document.createElement("div"),
r = gantt._get_task_width(t),
o = this._get_safe_type(t.type);
tmarkerstyle How to dowload it? tmarkerstyle
s.setAttribute(this.config.task_attribute, t.id), n.show_progress && o != this.config.types.milestone && this._render_task_progress(t, s, r);
var l = gantt._render_task_content(t, r);
t.textColor && (l.style.color = t.textColor), s.appendChild(l);
var d = this._combine_item_class("gantt_task_line", this.templates.task_class(t.start_date, t.end_date, t), t.id);
(t.color || t.progressColor || t.textColor) && (d += " gantt_task_inline_color"), s.className = d;
var _ = ["left:" + e.x + "px", "top:" + (i + e.y) + "px", "height:" + a + "px", "line-height:" + a + "px", "width:" + r + "px"];
t.color && _.push("background-color:" + t.color), t.textColor && _.push("color:" + t.textColor), s.style.cssText = _.join(";");
var c = this._render_leftside_content(t);
return c && s.appendChild(c), c = this._render_rightside_content(t), c && s.appendChild(c), this._is_readonly(t) || (n.drag_resize && !this._is_flex_task(t) && o != this.config.types.milestone && gantt._render_pair(s, "gantt_task_drag", t, function(t) {
var e = document.createElement("div");
tmarkerstyle How to dowload it? tmarkerstyle
return e.className = t, e
}), n.drag_links && this.config.show_links && gantt._render_pair(s, "gantt_link_control", t, function(t) {
var e = document.createElement("div");
e.className = t, e.style.cssText = ["height:" + a + "px", "line-height:" + a + "px"].join(";");
var n = document.createElement("div");
return n.className = "gantt_link_point", e.appendChild(n), e
})), s
}
}, gantt._render_task_element = function(t) {
var e = this.config.type_renderers,
tmarkerstyle How to get it for free? tmarkerstyle
n = e[this._get_safe_type(t.type)],
a = this._task_default_render;
return n || (n = a), n.call(this, t, dhtmlx.bind(a, this))
}, gantt._render_side_content = function(t, e, n) {
if (!e) return null;
var a = e(t.start_date, t.end_date, t);
if (!a) return null;
var i = document.createElement("div");
return i.className = "gantt_side_content " + n, i.innerHTML = a, i
}, gantt._render_leftside_content = function(t) {
tmarkerstyle How to use it? tmarkerstyle
var e = "gantt_left " + gantt._get_link_crossing_css(!0, t);
return gantt._render_side_content(t, this.templates.leftside_text, e)
}, gantt._render_rightside_content = function(t) {
var e = "gantt_right " + gantt._get_link_crossing_css(!1, t);
return gantt._render_side_content(t, this.templates.rightside_text, e)
}, gantt._get_conditions = function(t) {
return t ? {
$source: [gantt.config.links.start_to_start],
$target: [gantt.config.links.start_to_start, gantt.config.links.finish_to_start]
} : {
tmarkerstyle PasteShr tmarkerstyle
$source: [gantt.config.links.finish_to_start, gantt.config.links.finish_to_finish],
$target: [gantt.config.links.finish_to_finish]
}
}, gantt._get_link_crossing_css = function(t, e) {
var n = gantt._get_conditions(t);
for (var a in n)
for (var i = e[a], s = 0; s < i.length; s++)
for (var r = gantt.getLink(i[s]), o = 0; o < n[a].length; o++)
if (r.type == n[a][o]) return "gantt_link_crossing";
return ""
tmarkerstyle How to get it? tmarkerstyle
}, gantt._render_task_content = function(t) {
var e = document.createElement("div");
return this._get_safe_type(t.type) != this.config.types.milestone && (e.innerHTML = this.templates.task_text(t.start_date, t.end_date, t)), e.className = "gantt_task_content", e
}, gantt._render_task_progress = function(t, e, n) {
var a = 1 * t.progress || 0;
n = Math.max(n - 2, 0);
var i = document.createElement("div"),
s = Math.round(n * a);
if (s = Math.min(n, s), t.progressColor && (i.style.backgroundColor = t.progressColor, i.style.opacity = 1), i.style.width = s + "px", i.className = "gantt_task_progress", i.innerHTML = this.templates.progress_text(t.start_date, t.end_date, t), e.appendChild(i), this.config.drag_progress && !gantt._is_readonly(t)) {
var r = document.createElement("div");
tmarkerstyle How to use it? tmarkerstyle
r.style.left = s + "px", r.className = "gantt_task_progress_drag", i.appendChild(r), e.appendChild(r)
}
}, gantt._get_line = function(t) {
var e = {
second: 1,
minute: 60,
hour: 3600,
day: 86400,
week: 604800,
month: 2592e3,
tmarkerstyle How to get it? tmarkerstyle
year: 31536e3
};
return e[t] || 0
}, gantt.dateFromPos = function(t) {
var e = this._tasks;
if (0 > t || t > e.full_width || !e.full_width) return null;
var n = this._findBinary(this._tasks.left, t),
a = this._tasks.left[n],
i = e.width[n] || e.col_width,
s = 0;
tmarkerstyle How to dowload it? tmarkerstyle
i && (s = (t - a) / i);
var r = 0;
s && (r = gantt._get_coll_duration(e, e.trace_x[n]));
var o = new Date(e.trace_x[n].valueOf() + Math.round(s * r));
return o
}, gantt.posFromDate = function(t) {
var e = gantt._day_index_by_date(t);
dhtmlx.assert(e >= 0, "Invalid day index");
var n = Math.floor(e),
a = e % 1,
tmarkerstyle PasteShr tmarkerstyle
i = gantt._tasks.left[Math.min(n, gantt._tasks.width.length - 1)];
return n == gantt._tasks.width.length && (i += gantt._tasks.width[gantt._tasks.width.length - 1]), a && (i += n < gantt._tasks.width.length ? gantt._tasks.width[n] * (a % 1) : 1), i
}, gantt._day_index_by_date = function(t) {
var e = new Date(t).valueOf(),
n = gantt._tasks.trace_x,
a = gantt._tasks.ignore_x;
if (e <= this._min_date) return 0;
if (e >= this._max_date) return n.length;
for (var i = gantt._findBinary(n, e), s = +gantt._tasks.trace_x[i]; a[s];) s = gantt._tasks.trace_x[++i];
return s ? i + (t - n[i]) / gantt._get_coll_duration(gantt._tasks, n[i]) : 0
tmarkerstyle How to dowload it? tmarkerstyle
}, gantt._findBinary = function(t, e) {
for (var n, a, i, s = 0, r = t.length - 1; r >= s;)
if (n = Math.floor((s + r) / 2), a = +t[n], i = +t[n - 1], e > a) s = n + 1;
else {
if (!(a > e)) return n;
if (!isNaN(i) && e > i) return n - 1;
r = n - 1
}
return t.length - 1
}, gantt._get_coll_duration = function(t, e) {
tmarkerstyle How to get it? tmarkerstyle
return gantt.date.add(e, t.step, t.unit) - e
}, gantt._get_x_pos = function(t, e) {
e = e !== !1, gantt.posFromDate(e ? t.start_date : t.end_date)
}, gantt.getTaskTop = function(t) {
return this._y_from_ind(this.getGlobalTaskIndex(t))
}, gantt._get_task_coord = function(t, e, n) {
e = e !== !1, n = n || 0;
var a = this._get_safe_type(t.type) == this.config.types.milestone,
i = null;
i = e || a ? t.start_date || this._default_task_date(t) : t.end_date || this.calculateEndDate(this._default_task_date(t));
tmarkerstyle How to get it? tmarkerstyle
var s = this.posFromDate(i),
r = this.getTaskTop(t.id);
return a && (e ? s -= n : s += n), {
x: s,
y: r
}
}, gantt._get_task_pos = function(t, e) {
e = e !== !1;
var n = gantt._get_milestone_width() / 2;
return this._get_task_coord(t, e, n)
tmarkerstyle How to dowload it? tmarkerstyle
}, gantt._get_task_visible_pos = function(t, e) {
e = e !== !1;
var n = gantt._get_visible_milestone_width() / 2;
return this._get_task_coord(t, e, n)
}, gantt._correct_shift = function(t, e) {
return t -= 6e4 * (new Date(gantt._min_date).getTimezoneOffset() - new Date(t).getTimezoneOffset()) * (e ? -1 : 1)
}, gantt._get_mouse_pos = function(t) {
if (t.pageX || t.pageY) var e = {
x: t.pageX,
y: t.pageY
tmarkerstyle How to use it? tmarkerstyle
};
var n = _isIE ? document.documentElement : document.body,
e = {
x: t.clientX + n.scrollLeft - n.clientLeft,
y: t.clientY + n.scrollTop - n.clientTop
}, a = gantt._get_position(gantt.$task_data);
return e.x = e.x - a.x + gantt.$task_data.scrollLeft, e.y = e.y - a.y + gantt.$task_data.scrollTop, e
}, gantt._is_layer = function(t) {
return t && t.hasAttribute && t.hasAttribute(this.config.layer_attribute)
}, gantt._task_renderer = function(t, e, n, a) {
tmarkerstyle PasteShr tmarkerstyle
return this._task_area_pulls || (this._task_area_pulls = {}), this._task_area_renderers || (this._task_area_renderers = {}), this._task_area_renderers[t] ? this._task_area_renderers[t] : (e || dhtmlx.assert(!1, "Invalid renderer call"), n && n.setAttribute(this.config.layer_attribute, !0), this._task_area_renderers[t] = {
render_item: function(i, s) {
var r = gantt._task_area_pulls[t];
if (s = s || n, a && !a(i)) return void this.remove_item(i.id);
var o = e.call(gantt, i);
o && (r[i.id] ? this.replace_item(i.id, o) : (r[i.id] = o, s.appendChild(o)))
},
clear: function(e) {
this.rendered = gantt._task_area_pulls[t] = {}, e = e || n, e && (e.innerHTML = "")
},
tmarkerstyle How to dowload it? tmarkerstyle
render_items: function(t, e) {
e = e || n, this.clear(e);
for (var a = document.createDocumentFragment(), i = 0, s = t.length; s > i; i++) this.render_item(t[i], a);
e.appendChild(a)
},
replace_item: function(t, e) {
var n = this.rendered[t];
n && n.parentNode && n.parentNode.replaceChild(e, n), this.rendered[t] = e
},
remove_item: function(t) {
tmarkerstyle How to get it for free? tmarkerstyle
var e = this.rendered[t];
e && e.parentNode && e.parentNode.removeChild(e), delete this.rendered[t]
},
change_id: function(t, e) {
this.rendered[e] = this.rendered[t], delete this.rendered[t]
},
rendered: this._task_area_pulls[t],
node: n,
unload: function() {
this.clear(), delete gantt._task_area_renderers[t], delete gantt._task_area_pulls[t]
tmarkerstyle How to get it? tmarkerstyle
}
}, this._task_area_renderers[t])
}, gantt._clear_renderers = function() {
for (var t in this._task_area_renderers) this._task_renderer(t).unload()
}, gantt._render_bg_canvas = function() {
var t = gantt._tasks,
e = gantt.$task_bg,
n = document.createElement("canvas"),
a = gantt.config.row_height,
i = t.col_width;
tmarkerstyle How to get it for free? tmarkerstyle
if (n.getContext) {
n.height = a, n.width = i;
var s = document.createElement("div"),
r = document.createElement("div");
s.className = "gantt_task_row", r.className = "gantt_task_cell", s.style.display = r.style.display = "none", e.appendChild(s), s.appendChild(r);
var o = n.getContext("2d");
o.beginPath(), o.moveTo(0, a), o.lineTo(i, a), o.lineWidth = 1, o.strokeStyle = getComputedStyle(s).getPropertyValue("border-bottom-color") || "#ebebeb", o.stroke(), o.beginPath(), o.moveTo(i, a), o.lineTo(i, 0), o.lineWidth = 1, o.strokeStyle = getComputedStyle(r).getPropertyValue("border-right-color") || "#ebebeb", o.stroke(), t.fill_img = n.toDataURL(), e.style.height = a * gantt._order.length + "px", e.style.backgroundImage = "url(" + t.fill_img + ")", e.removeChild(s)
}
}, gantt.attachEvent("onGanttReady", function() {
gantt._task_layers.add(), gantt._link_layers.add()
tmarkerstyle How to get it for free? tmarkerstyle
}), gantt._layers = {
prepareConfig: function(t) {
return "function" == typeof t && (t = {
renderer: t
}), t.id = dhtmlx.uid(), t.container || (t.container = document.createElement("div")), t
},
create: function(t, e) {
return {
tempCollection: [],
renderers: {},
tmarkerstyle How to use it? tmarkerstyle
container: t,
getRenderers: function() {
var t = [];
for (var e in this.renderers) t.push(this.renderers[e]);
return t
},
getRenderer: function(t) {
return this.renderers[t]
},
add: function(t) {
tmarkerstyle How to get it for free? tmarkerstyle
if (t && this.tempCollection.push(t), this.container())
for (var n = this.container(), a = this.tempCollection, i = 0; i < a.length; i++) {
var t = a[i],
s = t.container,
r = t.id,
o = t.topmost;
if (!s.parentNode)
if (o) n.appendChild(s);
else {
var l = e ? e() : n.firstChild;
tmarkerstyle PasteShr tmarkerstyle
l ? n.insertBefore(s, l) : n.appendChild(s)
}
this.renderers[r] = gantt._task_renderer(r, t.renderer, s, t.filter), this.tempCollection.splice(i, 1), i--
}
},
remove: function(t) {
this.renderers[t].unload(), delete this.renderers[t]
},
clear: function() {
for (var t in this.renderers) this.renderers[t].unload();
tmarkerstyle How to use it? tmarkerstyle
this.renderers = {}
}
}
}
}, gantt._create_filter = function(t) {
return t instanceof Array || (t = Array.prototype.slice.call(arguments, 0)),
function(e) {
for (var n = !0, a = 0, i = t.length; i > a; a++) {
var s = t[a];
gantt[s] && (n = n && gantt[s].call(gantt, e.id, e) !== !1)
tmarkerstyle PasteShr tmarkerstyle
}
return n
}
}, gantt._add_generic_layer = function(t, e) {
return function(n) {
return void 0 === n.filter && (n.filter = gantt._create_filter(e)), n = gantt._layers.prepareConfig(n), t.add(n), n.id
}
}, gantt._task_layers = gantt._layers.create(function() {
return gantt.$task_data
}, function() {
tmarkerstyle How to use it? tmarkerstyle
return gantt.$task_links
}), gantt._link_layers = gantt._layers.create(function() {
return gantt.$task_data
}), gantt.addTaskLayer = gantt._add_generic_layer(gantt._task_layers, ["_filter_task", "_is_chart_visible"]), gantt.removeTaskLayer = function(t) {
gantt._task_layers.remove(t)
}, gantt.addLinkLayer = gantt._add_generic_layer(gantt._link_layers, ["_filter_link", "_is_chart_visible"]), gantt.removeLinkLayer = function(t) {
gantt._link_layers.remove(t)
}, gantt._get_task_renderers = function() {
return this._task_layers.getRenderers()
}, gantt._get_link_renderers = function() {
tmarkerstyle PasteShr tmarkerstyle
return this._link_layers.getRenderers()
}, gantt._pull = {}, gantt._branches = {}, gantt._order = [], gantt._lpull = {}, gantt._order_full = [], gantt.load = function(t, e, n) {
this._load_url = t, dhtmlx.assert(arguments.length, "Invalid load arguments"), this.callEvent("onLoadStart", []);
var a = "json",
i = null;
arguments.length >= 3 ? (a = e, i = n) : "string" == typeof arguments[1] ? a = arguments[1] : "function" == typeof arguments[1] && (i = arguments[1]), this._load_type = a, dhx4.ajax.get(t, dhtmlx.bind(function(t) {
this.on_load(t, a), this.callEvent("onLoadEnd", []), "function" == typeof i && i.call(this)
}, this))
}, gantt.parse = function(t, e) {
this.on_load({
tmarkerstyle How to get it for free? tmarkerstyle
xmlDoc: {
responseText: t
}
}, e)
}, gantt.serialize = function(t) {
return t = t || "json", this[t].serialize()
}, gantt.on_load = function(t, e) {
this.callEvent("onBeforeParse", []), e || (e = "json"), dhtmlx.assert(this[e], "Invalid data type:'" + e + "'");
var n = t.xmlDoc.responseText,
a = this[e].parse(n, t);
tmarkerstyle PasteShr tmarkerstyle
this._process_loading(a)
}, gantt._process_loading = function(t) {
t.collections && this._load_collections(t.collections);
for (var e, n = t.data, a = 0; a < n.length; a++) e = n[a], this._init_task(e), this.callEvent("onTaskLoading", [e]) && (this._order_full.push(e.id), this._pull[e.id] = e);
for (var a in this._pull) e = this._pull[a], this.setParent(e, this.getParent(e) || this.config.root_id);
for (var a = 0; a < this._order_full.length; a++) e = this._pull[this._order_full[a]], this._add_branch(e), e.$level = this.calculateTaskLevel(e);
if (this._sync_order(), this._init_links(t.links || (t.collections ? t.collections.links : [])), this.callEvent("onParse", []), this.render(), this.config.initial_scroll) {
var i = this._order[0] || this.config.root_id;
i && this.showTask(i)
}
tmarkerstyle How to get it? tmarkerstyle
}, gantt._init_links = function(t) {
if (t)
for (var e = 0; e < t.length; e++)
if (t[e]) {
var n = this._init_link(t[e]);
this._lpull[n.id] = n
}
this._sync_links()
}, gantt._load_collections = function(t) {
var e = !1;
tmarkerstyle How to get it for free? tmarkerstyle
for (var n in t)
if (t.hasOwnProperty(n)) {
e = !0;
var a = t[n],
i = this.serverList[n];
if (!i) continue;
i.splice(0, i.length);
for (var s = 0; s < a.length; s++) {
var r = a[s],
o = dhtmlx.copy(r);
tmarkerstyle How to use it? tmarkerstyle
o.key = o.value;
for (var l in r)
if (r.hasOwnProperty(l)) {
if ("value" == l || "label" == l) continue;
o[l] = r[l]
}
i.push(o)
}
}
e && this.callEvent("onOptionsLoad", [])
tmarkerstyle How to get it for free? tmarkerstyle
}, gantt._sync_order = function(t) {
this._order = [], this._sync_order_item({
parent: this.config.root_id,
$open: !0,
$ignore: !0,
id: this.config.root_id
}), t || (this._scroll_resize(), this._set_sizes())
}, gantt.attachEvent("onBeforeTaskDisplay", function(t, e) {
return !e.$ignore
}), gantt._sync_order_item = function(t) {
tmarkerstyle How to get it? tmarkerstyle
if (t.id && this._filter_task(t.id, t) && this.callEvent("onBeforeTaskDisplay", [t.id, t]) && this._order.push(t.id), t.$open) {
var e = this.getChildren(t.id);
if (e)
for (var n = 0; n < e.length; n++) this._sync_order_item(this._pull[e[n]])
}
}, gantt.getTaskCount = function() {
return this._order_full.length
}, gantt.getVisibleTaskCount = function() {
return this._order.length
}, gantt.getTaskIndex = function(t) {
tmarkerstyle How to use it? tmarkerstyle
for (var e = this.getChildren(this.getParent(t)), n = 0; n < e.length; n++)
if (e[n] == t) return n;
return -1
}, gantt.getGlobalTaskIndex = function(t) {
dhtmlx.assert(t, "Invalid argument");
for (var e = this._order, n = 0, a = e.length; a > n; n++)
if (e[n] == t) return n;
return -1
}, gantt._get_visible_order = gantt.getGlobalTaskIndex, gantt.eachTask = function(t, e, n) {
e = e || this.config.root_id, n = n || this;
tmarkerstyle How to get it? tmarkerstyle
var a = this.getChildren(e);
if (a)
for (var i = 0; i < a.length; i++) {
var s = this._pull[a[i]];
t.call(n, s), this.hasChild(s.id) && this.eachTask(t, s.id, n)
}
}, gantt.json = {
parse: function(data) {
return dhtmlx.assert(data, "Invalid data"), "string" == typeof data && (window.JSON ? data = JSON.parse(data) : (gantt._temp = eval("(" + data + ")"), data = gantt._temp || {}, gantt._temp = null)), data.dhx_security && (dhtmlx.security_key = data.dhx_security), data
},
tmarkerstyle How to get it for free? tmarkerstyle
_copyLink: function(t) {
var e = {};
for (var n in t) e[n] = t[n];
return e
},
_copyObject: function(t) {
var e = {};
for (var n in t) "$" != n.charAt(0) && (e[n] = t[n], e[n] instanceof Date && (e[n] = gantt.templates.xml_format(e[n])));
return e
},
tmarkerstyle How to dowload it? tmarkerstyle
serialize: function() {
var t = [],
e = [];
gantt.eachTask(function(e) {
gantt.resetProjectDates(e), t.push(this._copyObject(e))
}, gantt.config.root_id, this);
for (var n in gantt._lpull) e.push(this._copyLink(gantt._lpull[n]));
return {
data: t,
links: e
tmarkerstyle PasteShr tmarkerstyle
}
}
}, gantt.xml = {
_xmlNodeToJSON: function(t, e) {
for (var n = {}, a = 0; a < t.attributes.length; a++) n[t.attributes[a].name] = t.attributes[a].value;
if (!e) {
for (var a = 0; a < t.childNodes.length; a++) {
var i = t.childNodes[a];
1 == i.nodeType && (n[i.tagName] = i.firstChild ? i.firstChild.nodeValue : "")
}
tmarkerstyle PasteShr tmarkerstyle
n.text || (n.text = t.firstChild ? t.firstChild.nodeValue : "")
}
return n
},
_getCollections: function(t) {
for (var e = {}, n = dhx4.ajax.xpath("//coll_options", t), a = 0; a < n.length; a++)
for (var i = n[a].getAttribute("for"), s = e[i] = [], r = dhx4.ajax.xpath(".//item", n[a]), o = 0; o < r.length; o++) {
for (var l = r[o], d = l.attributes, _ = {
key: r[o].getAttribute("value"),
label: r[o].getAttribute("label")
tmarkerstyle How to dowload it? tmarkerstyle
}, c = 0; c < d.length; c++) {
var g = d[c];
"value" != g.nodeName && "label" != g.nodeName && (_[g.nodeName] = g.nodeValue)
}
s.push(_)
}
return e
},
_getXML: function(t, e, n) {
n = n || "data", e.getXMLTopNode || (e = dhx4.ajax.parse(e));
tmarkerstyle How to get it? tmarkerstyle
var a = dhx4.ajax.xmltop(n, e.xmlDoc);
if (a.tagName != n) throw "Invalid XML data";
var i = a.getAttribute("dhx_security");
return i && (dhtmlx.security_key = i), a
},
parse: function(t, e) {
e = this._getXML(t, e);
for (var n = {}, a = n.data = [], i = dhx4.ajax.xpath("//task", e), s = 0; s < i.length; s++) a[s] = this._xmlNodeToJSON(i[s]);
return n.collections = this._getCollections(e), n
},
tmarkerstyle How to get it? tmarkerstyle
_copyLink: function(t) {
return ""
},
_copyObject: function(t) {
return ""
},
serialize: function() {
for (var t = [], e = [], n = gantt.json.serialize(), a = 0, i = n.data.length; i > a; a++) t.push(this._copyObject(n.data[a]));
for (var a = 0, i = n.links.length; i > a; a++) e.push(this._copyLink(n.links[a]));
return "" + t.join("") + "" + e.join("") + ""
tmarkerstyle PasteShr tmarkerstyle
}
}, gantt.oldxml = {
parse: function(t, e) {
e = gantt.xml._getXML(t, e, "projects");
for (var n = {
collections: {
links: []
}
}, a = n.data = [], i = dhx4.ajax.xpath("//task", e), s = 0; s < i.length; s++) {
a[s] = gantt.xml._xmlNodeToJSON(i[s]);
tmarkerstyle How to get it for free? tmarkerstyle
var r = i[s].parentNode;
a[s].parent = "project" == r.tagName ? "project-" + r.getAttribute("id") : r.parentNode.getAttribute("id")
}
i = dhx4.ajax.xpath("//project", e);
for (var s = 0; s < i.length; s++) {
var o = gantt.xml._xmlNodeToJSON(i[s], !0);
o.id = "project-" + o.id, a.push(o)
}
for (var s = 0; s < a.length; s++) {
var o = a[s];
tmarkerstyle How to use it? tmarkerstyle
o.start_date = o.startdate || o.est, o.end_date = o.enddate, o.text = o.name, o.duration = o.duration / 8, o.open = 1, o.duration || o.end_date || (o.duration = 1), o.predecessortasks && n.collections.links.push({
target: o.id,
source: o.predecessortasks,
type: gantt.config.links.finish_to_start
})
}
return n
},
serialize: function() {
dhtmlx.message("Serialization to 'old XML' is not implemented")
tmarkerstyle PasteShr tmarkerstyle
}
}, gantt.serverList = function(t, e) {
return e ? this.serverList[t] = e.slice(0) : this.serverList[t] || (this.serverList[t] = []), this.serverList[t]
}, gantt._working_time_helper = {
units: ["year", "month", "week", "day", "hour", "minute"],
hours: [8, 17],
dates: {
0: !1,
6: !1
},
tmarkerstyle How to get it for free? tmarkerstyle
_working_units_cache: {
_cache: {},
get: function(t, e) {
if (!t || !e) return -1;
var n = this._cache,
a = e.getTime(),
i = -1;
return n && n[t] && void 0 !== n[t][a] && (i = n[t][a]), i
},
put: function(t, e, n) {
tmarkerstyle PasteShr tmarkerstyle
if (!t || !e) return !1;
var a = this._cache,
i = e.getTime();
return n = !! n, a ? (a[t] || (a[t] = {}), a[t][i] = n, !0) : !1
},
clear: function() {
this._cache = {}
}
},
_get_unit_order: function(t) {
tmarkerstyle PasteShr tmarkerstyle
for (var e = 0, n = this.units.length; n > e; e++)
if (this.units[e] == t) return e;
dhtmlx.assert(!1, "Incorrect duration unit")
},
_timestamp: function(t) {
var e = null;
return t.day || 0 === t.day ? e = t.day : t.date && (e = gantt.date.date_part(new Date(t.date)).valueOf()), e
},
set_time: function(t) {
var e = void 0 !== t.hours ? t.hours : !0,
tmarkerstyle How to use it? tmarkerstyle
n = this._timestamp(t);
null !== n ? this.dates[n] = e : this.hours = e, this._working_units_cache.clear()
},
unset_time: function(t) {
if (t) {
var e = this._timestamp(t);
null !== e && delete this.dates[e]
} else this.hours = [];
this._working_units_cache.clear()
},
tmarkerstyle How to dowload it? tmarkerstyle
is_working_unit: function(t, e, n) {
if (!gantt.config.work_time) return !0;
var a = this._working_units_cache.get(e, t);
return -1 == a && (a = this._check_is_working_unit(t, e, n), this._working_units_cache.put(e, t, a)), a
},
_check_is_working_unit: function(t, e, n) {
return void 0 === n && (n = this._get_unit_order(e)), void 0 === n ? !1 : n && !this.is_working_unit(t, this.units[n - 1], n - 1) ? !1 : this["is_work_" + e] ? this["is_work_" + e](t) : !0
},
is_work_day: function(t) {
var e = this.get_working_hours(t);
tmarkerstyle How to get it? tmarkerstyle
return e instanceof Array ? e.length > 0 : !1
},
is_work_hour: function(t) {
for (var e = this.get_working_hours(t), n = t.getHours(), a = 0; a < e.length; a += 2) {
if (void 0 === e[a + 1]) return e[a] == n;
if (n >= e[a] && n < e[a + 1]) return !0
}
return !1
},
get_working_hours: function(t) {
tmarkerstyle How to get it? tmarkerstyle
var e = this._timestamp({
date: t
}),
n = !0;
return void 0 !== this.dates[e] ? n = this.dates[e] : void 0 !== this.dates[t.getDay()] && (n = this.dates[t.getDay()]), n === !0 ? this.hours : n ? n : []
},
get_work_units_between: function(t, e, n, a) {
if (!n) return !1;
for (var i = new Date(t), s = new Date(e), a = a || 1, r = 0; i.valueOf() < s.valueOf();) this.is_working_unit(i, n) && r++, i = gantt.date.add(i, a, n);
return r
tmarkerstyle How to use it? tmarkerstyle
},
is_work_units_between: function(t, e, n, a) {
if (!n) return !1;
for (var i = new Date(t), s = new Date(e), a = a || 1; i.valueOf() < s.valueOf();) {
if (this.is_working_unit(i, n)) return !0;
i = gantt.date.add(i, a, n)
}
return !1
},
add_worktime: function(t, e, n, a) {
tmarkerstyle How to use it? tmarkerstyle
if (!n) return !1;
var i = new Date(t),
s = 0,
a = a || 1,
e = 1 * e;
if (gantt.config.work_time) {
for (; e > s;) {
var r = gantt.date.add(i, a, n);
this.is_working_unit(new Date(a > 0 ? r.valueOf() - 1 : r.valueOf() + 1), n) && s++, i = r
}
tmarkerstyle How to get it? tmarkerstyle
return i
}
return gantt.date.add(i, a * e, n)
},
get_closest_worktime: function(t) {
if (this.is_working_unit(t.date, t.unit)) return t.date;
var e = t.unit,
n = gantt.date[e + "_start"](t.date),
a = new Date(n),
i = new Date(n),
tmarkerstyle PasteShr tmarkerstyle
s = !0,
r = 3e3,
o = 0,
l = "any" == t.dir || !t.dir,
d = 1;
for ("past" == t.dir && (d = -1); !this.is_working_unit(n, e);) {
l && (n = s ? a : i, d = -1 * d);
var _ = n.getTimezoneOffset();
if (n = gantt.date.add(n, d, e), n = gantt._correct_dst_change(n, _, d, e), gantt.date[e + "_start"] && (n = gantt.date[e + "_start"](n)), l && (s ? a = n : i = n), s = !s, o++, o > r) return dhtmlx.assert(!1, "Invalid working time check"), !1
}
tmarkerstyle How to get it? tmarkerstyle
return (n == i || "past" == t.dir) && (n = gantt.date.add(n, 1, e)), n
}
}, gantt.getTask = function(t) {
return dhtmlx.assert(t, "Invalid argument for gantt.getTask"), dhtmlx.assert(this._pull[t], "Task not found id=" + t), this._pull[t]
}, gantt.getTaskByTime = function(t, e) {
var n = this._pull,
a = [];
if (t || e) {
t = +t || -(1 / 0), e = +e || 1 / 0;
for (var i in n) {
tmarkerstyle How to dowload it? tmarkerstyle
var s = n[i]; + s.start_date < e && +s.end_date > t && a.push(s)
}
} else
for (var i in n) a.push(n[i]);
return a
}, gantt.isTaskExists = function(t) {
return dhtmlx.defined(this._pull[t])
}, gantt.isUnscheduledTask = function(t) {
return !!t.unscheduled || !t.start_date
}, gantt._isAllowedUnscheduledTask = function(t) {
tmarkerstyle How to get it? tmarkerstyle
return t.unscheduled && gantt.config.show_unscheduled
}, gantt.isTaskVisible = function(t) {
if (!this._pull[t]) return !1;
var e = this._pull[t];
if (!(+e.start_date < +this._max_date && +e.end_date > +this._min_date || gantt._isAllowedUnscheduledTask(e))) return !1;
for (var n = 0, a = this._order.length; a > n; n++)
if (this._order[n] == t) return !0;
return !1
}, gantt.updateTask = function(t, e) {
return dhtmlx.defined(e) || (e = this.getTask(t)), this.callEvent("onBeforeTaskUpdate", [t, e]) === !1 ? !1 : (this._pull[e.id] = e, this._is_parent_sync(e) || this._resync_parent(e), this._isAllowedUnscheduledTask(e) && (this._init_task(e), this._sync_links()), this._update_parents(e.id), this.refreshTask(e.id), this.callEvent("onAfterTaskUpdate", [t, e]), this._sync_order(), void this._adjust_scales())
tmarkerstyle How to dowload it? tmarkerstyle
}, gantt._add_branch = function(t, e) {
var n = this.getParent(t);
this.hasChild(n) || (this._branches[n] = []);
for (var a = this.getChildren(n), i = !1, s = 0, r = a.length; r > s; s++)
if (a[s] == t.id) {
i = !0;
break
}
i || (1 * e == e ? a.splice(e, 0, t.id) : a.push(t.id)), this._sync_parent(t)
}, gantt._move_branch = function(t, e, n) {
tmarkerstyle How to get it for free? tmarkerstyle
this.setParent(t, n), this._sync_parent(t), this._replace_branch_child(e, t.id), this.isTaskExists(n) || n == this.config.root_id ? this._add_branch(t) : delete this._branches[t.id], t.$level = this.calculateTaskLevel(t), this._sync_order()
}, gantt._resync_parent = function(t) {
this._move_branch(t, t.$rendered_parent, this.getParent(t))
}, gantt._sync_parent = function(t) {
t.$rendered_parent = this.getParent(t)
}, gantt._is_parent_sync = function(t) {
return t.$rendered_parent == this.getParent(t)
}, gantt._replace_branch_child = function(t, e, n) {
var a = this.getChildren(t);
if (a) {
tmarkerstyle How to get it? tmarkerstyle
for (var i = [], s = 0; s < a.length; s++) a[s] != e ? i.push(a[s]) : n && i.push(n);
this._branches[t] = i
}
this._sync_order()
}, gantt.addTask = function(t, e, n) {
return dhtmlx.defined(e) || (e = this.getParent(t) || 0), this.isTaskExists(e) || (e = 0), this.setParent(t, e), t = this._init_task(t), this.callEvent("onBeforeTaskAdd", [t.id, t]) === !1 ? !1 : (this._pull[t.id] = t, this._add_branch(t, n), this.refreshData(), this._adjust_scales(), this.callEvent("onAfterTaskAdd", [t.id, t]), t.id)
}, gantt._default_task_date = function(t, e) {
var n = e && e != this.config.root_id ? this.getTask(e) : !1,
a = "";
if (n) a = n.start_date;
tmarkerstyle How to use it? tmarkerstyle
else {
var i = this._order[0];
a = i ? this.getTask(i).start_date ? this.getTask(i).start_date : this.getTask(i).end_date ? this.calculateEndDate(this.getTask(i).end_date, -this.config.duration_step) : "" : this.config.start_date || this.getState().min_date
}
return dhtmlx.assert(a, "Invalid dates"), new Date(a)
}, gantt._set_default_task_timing = function(t) {
t.start_date = t.start_date || gantt._default_task_date(t, this.getParent(t)), t.duration = t.duration || this.config.duration_step, t.end_date = t.end_date || this.calculateEndDate(t.start_date, t.duration)
}, gantt.createTask = function(t, e, n) {
if (t = t || {}, t.id = dhtmlx.uid(), t.start_date || (t.start_date = gantt._default_task_date(t, e)), void 0 === t.text && (t.text = gantt.locale.labels.new_task), void 0 === t.duration && (t.duration = 1), e) {
this.setParent(t, e);
tmarkerstyle How to dowload it? tmarkerstyle
var a = this.getTask(e);
a.$open = !0
}
return this.callEvent("onTaskCreated", [t]) ? (this.config.details_on_create ? (t.$new = !0, this._pull[t.id] = this._init_task(t), this._add_branch(t, n), t.$level = this.calculateTaskLevel(t), this.selectTask(t.id), this.refreshData(), this.showLightbox(t.id)) : this.addTask(t, e, n) && (this.showTask(t.id), this.selectTask(t.id)), t.id) : null
}, gantt.deleteTask = function(t) {
return this._deleteTask(t)
}, gantt._getChildLinks = function(t) {
var e = this.getTask(t);
if (!e) return [];
for (var n = e.$source.concat(e.$target), a = this.getChildren(e.id), i = 0; i < a.length; i++) n = n.concat(this._getChildLinks(a[i]));
tmarkerstyle How to get it? tmarkerstyle
for (var s = {}, i = 0; i < n.length; i++) s[n[i]] = !0;
n = [];
for (var i in s) n.push(i);
return n
}, gantt._getTaskTree = function(t) {
var e = this.getTask(t);
if (!e) return [];
for (var n = [], a = this.getChildren(e.id), i = 0; i < a.length; i++) n.push(a[i]), n = n.concat(this._getTaskTree(a[i]));
return n
}, gantt._deleteRelatedLinks = function(t, e) {
tmarkerstyle How to get it for free? tmarkerstyle
var n = this._dp && !e,
a = "",
i = n ? "off" != this._dp.updateMode : !1;
n && (a = this._dp.updateMode, this._dp.setUpdateMode("off"));
for (var s = 0; s < t.length; s++) n && (this._dp.setGanttMode("links"), this._dp.setUpdated(t[s], !0, "deleted")), this._deleteLink(t[s], !0);
n && (this._dp.setUpdateMode(a), i && this._dp.sendAllData())
}, gantt._deleteRelatedTasks = function(t, e) {
var n = this._dp && !e,
a = "";
n && (a = this._dp.updateMode, this._dp.setGanttMode("tasks"), this._dp.setUpdateMode("off"));
tmarkerstyle How to get it for free? tmarkerstyle
for (var i = this._getTaskTree(t), s = 0; s < i.length; s++) {
var r = i[s];
this._unset_task(r), n && this._dp.setUpdated(r, !0, "deleted")
}
n && this._dp.setUpdateMode(a)
}, gantt._unset_task = function(t) {
var e = this.getTask(t);
this._update_flags(t, null), delete this._pull[t], this._move_branch(e, this.getParent(e), null)
}, gantt._deleteTask = function(t, e) {
var n = this.getTask(t);
tmarkerstyle How to dowload it? tmarkerstyle
if (!e && this.callEvent("onBeforeTaskDelete", [t, n]) === !1) return !1;
var a = gantt._getChildLinks(t);
return this._deleteRelatedTasks(t, e), this._deleteRelatedLinks(a, e), this._unset_task(t), e || (this.callEvent("onAfterTaskDelete", [t, n]), this.refreshData()), !0
}, gantt.clearAll = function() {
this._clear_data(), this.callEvent("onClear", []), this.refreshData()
}, gantt._clear_data = function() {
this._pull = {}, this._branches = {}, this._order = [], this._order_full = [], this._lpull = {}, this._update_flags(), this.userdata = {}
}, gantt._update_flags = function(t, e) {
void 0 === t ? (this._lightbox_id = this._selected_task = null, this._tasks_dnd.drag && (this._tasks_dnd.drag.id = null)) : (this._lightbox_id == t && (this._lightbox_id = e), this._selected_task == t && (this._selected_task = e), this._tasks_dnd.drag && this._tasks_dnd.drag.id == t && (this._tasks_dnd.drag.id = e))
}, gantt.changeTaskId = function(t, e) {
tmarkerstyle How to get it? tmarkerstyle
var n = this._pull[e] = this._pull[t];
this._pull[e].id = e, delete this._pull[t];
for (var a in this._pull) {
var i = this._pull[a];
this.getParent(i) == t && this.setParent(i, e)
}
this._update_flags(t, e), this._replace_branch_child(this.getParent(n), t, e), this.callEvent("onTaskIdChange", [t, e])
}, gantt._get_duration_unit = function() {
return 1e3 * gantt._get_line(this.config.duration_unit) || this.config.duration_unit
}, gantt._get_safe_type = function() {
tmarkerstyle How to get it? tmarkerstyle
return "task"
}, gantt._get_type_name = function(t) {
for (var e in this.config.types)
if (this.config.types[e] == t) return e;
return "task"
}, gantt.getWorkHours = function(t) {
return this._working_time_helper.get_working_hours(t)
}, gantt.setWorkTime = function(t) {
this._working_time_helper.set_time(t)
}, gantt.isWorkTime = function(t, e) {
tmarkerstyle How to use it? tmarkerstyle
var n = this._working_time_helper;
return n.is_working_unit(t, e || this.config.duration_unit)
}, gantt.correctTaskWorkTime = function(t) {
gantt.config.work_time && gantt.config.correct_work_time && (gantt.isWorkTime(t.start_date) ? gantt.isWorkTime(new Date(+t.end_date - 1)) || (t.end_date = gantt.calculateEndDate(t.start_date, t.duration)) : (t.start_date = gantt.getClosestWorkTime({
date: t.start_date,
dir: "future"
}), t.end_date = gantt.calculateEndDate(t.start_date, t.duration)))
}, gantt.getClosestWorkTime = function(t) {
var e = this._working_time_helper;
return t instanceof Date && (t = {
tmarkerstyle How to use it? tmarkerstyle
date: t
}), t.dir = t.dir || "any", t.unit = t.unit || this.config.duration_unit, e.get_closest_worktime(t)
}, gantt.calculateDuration = function(t, e) {
var n = this._working_time_helper;
return n.get_work_units_between(t, e, this.config.duration_unit, this.config.duration_step)
}, gantt._hasDuration = function(t, e) {
var n = this._working_time_helper;
return n.is_work_units_between(t, e, this.config.duration_unit, this.config.duration_step)
}, gantt.calculateEndDate = function(t, e, n) {
var a = this._working_time_helper,
tmarkerstyle PasteShr tmarkerstyle
i = e >= 0 ? 1 : -1;
return a.add_worktime(t, Math.abs(e), n || this.config.duration_unit, i * this.config.duration_step)
}, gantt._init_task = function(t) {
return dhtmlx.defined(t.id) || (t.id = dhtmlx.uid()), t.start_date && (t.start_date = gantt.date.parseDate(t.start_date, "xml_date")), t.end_date && (t.end_date = gantt.date.parseDate(t.end_date, "xml_date")), t.start_date ? !t.end_date && t.duration && (t.end_date = this.calculateEndDate(t.start_date, t.duration)) : t.end_date && void 0 !== t.duration && (t.start_date = this.calculateEndDate(t.end_date, -t.duration)), this._isAllowedUnscheduledTask(t) && this._set_default_task_timing(t), gantt._init_task_timing(t), t.start_date && t.end_date && gantt.correctTaskWorkTime(t), t.$source = [], t.$target = [], void 0 === t.parent && this.setParent(t, this.config.root_id), dhtmlx.defined(t.$open) || (t.$open = dhtmlx.defined(t.open) ? t.open : this.config.open_tree_initially), t.$level = this.calculateTaskLevel(t), t
}, gantt._init_task_timing = function(t) {
var e = this._get_safe_type(t.type);
void 0 === t.$rendered_type ? t.$rendered_type = e : t.$rendered_type != e && (delete t.$no_end, delete t.$no_start, t.$rendered_type = e), void 0 !== t.$no_end && void 0 !== t.$no_start || e == this.config.types.milestone || (e == this.config.types.project ? (t.$no_end = t.$no_start = !0, this._set_default_task_timing(t)) : (t.$no_end = !(t.end_date || t.duration), t.$no_start = !t.start_date, this._isAllowedUnscheduledTask(t) && (t.$no_end = t.$no_start = !1))), e == this.config.types.milestone && (t.end_date = t.start_date), t.start_date && t.end_date && (t.duration = this.calculateDuration(t.start_date, t.end_date)), t.duration = t.duration || 0
}, gantt._is_flex_task = function(t) {
return !(!t.$no_end && !t.$no_start)
}, gantt.resetProjectDates = function(t) {
tmarkerstyle How to use it? tmarkerstyle
if (t.$no_end || t.$no_start) {
var e = this.getSubtaskDates(t.id);
this._assign_project_dates(t, e.start_date, e.end_date)
}
}, gantt.getSubtaskDates = function(t) {
var e = null,
n = null,
a = void 0 !== t ? t : gantt.config.root_id;
return this.eachTask(function(t) {
this._get_safe_type(t.type) == gantt.config.types.project || this.isUnscheduledTask(t) || (t.start_date && !t.$no_start && (!e || e > t.start_date.valueOf()) && (e = t.start_date.valueOf()), t.end_date && !t.$no_end && (!n || n < t.end_date.valueOf()) && (n = t.end_date.valueOf()))
tmarkerstyle How to get it? tmarkerstyle
}, a), {
start_date: e ? new Date(e) : null,
end_date: n ? new Date(n) : null
}
}, gantt._assign_project_dates = function(t, e, n) {
t.$no_start && (t.start_date = e && e != 1 / 0 ? new Date(e) : this._default_task_date(t, this.getParent(t))), t.$no_end && (t.end_date = n && n != -(1 / 0) ? new Date(n) : this.calculateEndDate(t.start_date, this.config.duration_step)), (t.$no_start || t.$no_end) && this._init_task_timing(t)
}, gantt._update_parents = function(t, e) {
if (t) {
for (var n = this.getTask(t), a = this.getParent(n); !n.$no_end && !n.$no_start && a && this.isTaskExists(a);) n = this.getTask(a), a = this.getParent(n);
(n.$no_start || n.$no_end) && (gantt.resetProjectDates(n), e || this.refreshTask(n.id, !0)), a && this.isTaskExists(a) && this._update_parents(a, e)
tmarkerstyle How to dowload it? tmarkerstyle
}
}, gantt.isChildOf = function(t, e) {
if (!this.isTaskExists(t)) return !1;
if (e === this.config.root_id) return this.isTaskExists(t);
for (var n = this.getTask(t), a = this.getParent(t); n && this.isTaskExists(a);) {
if (n = this.getTask(a), n && n.id == e) return !0;
a = this.getParent(n)
}
return !1
}, gantt.roundDate = function(t) {
tmarkerstyle How to get it? tmarkerstyle
t instanceof Date && (t = {
date: t,
unit: gantt._tasks.unit,
step: gantt._tasks.step
});
var e, n, a = t.date,
i = t.step,
s = t.unit;
if (s == gantt._tasks.unit && i == gantt._tasks.step && +a >= +gantt._min_date && +a <= +gantt._max_date) {
var r = Math.floor(gantt._day_index_by_date(a));
tmarkerstyle PasteShr tmarkerstyle
n = new Date(gantt._tasks.trace_x[r]), e = new Date(n), gantt._tasks.trace_x[r + 1] && (e = new Date(gantt._tasks.trace_x[r + 1]))
} else {
for (e = gantt.date[s + "_start"](new Date(this._min_date)); + a > +e;) {
e = gantt.date[s + "_start"](gantt.date.add(e, i, s));
var o = e.getTimezoneOffset();
e = gantt.date.add(e, i, s), e = gantt._correct_dst_change(e, o, e, s), gantt.date[s + "_start"] && (e = gantt.date[s + "_start"](e))
}
n = gantt.date.add(e, -1 * i, s)
}
return t.dir && "future" == t.dir ? e : t.dir && "past" == t.dir ? n : Math.abs(a - n) < Math.abs(e - a) ? n : e
tmarkerstyle How to dowload it? tmarkerstyle
}, gantt.attachEvent("onBeforeTaskUpdate", function(t, e) {
return gantt._init_task_timing(e), !0
}), gantt.attachEvent("onBeforeTaskAdd", function(t, e) {
return gantt._init_task_timing(e), !0
}), gantt.calculateTaskLevel = function(t) {
for (var e = 0; this.getParent(t) && this.isTaskExists(this.getParent(t));) t = this.getTask(this.getParent(t)), e++;
return e
}, gantt.sort = function(t, e, n, a) {
var i = !a;
this.isTaskExists(n) || (n = this.config.root_id), t || (t = "order");
tmarkerstyle How to get it? tmarkerstyle
var s = "string" == typeof t ? function(e, n) {
if (e[t] == n[t]) return 0;
var a = e[t] > n[t];
return a ? 1 : -1
} : t;
if (e) {
var r = s;
s = function(t, e) {
return r(e, t)
}
tmarkerstyle PasteShr tmarkerstyle
}
var o = this.getChildren(n);
if (o) {
for (var l = [], d = o.length - 1; d >= 0; d--) l[d] = this._pull[o[d]];
l.sort(s);
for (var d = 0; d < l.length; d++) o[d] = l[d].id, this.sort(t, e, o[d], !0)
}
i && this.render()
}, gantt.getNext = function(t) {
for (var e = 0; e < this._order.length - 1; e++)
tmarkerstyle How to get it for free? tmarkerstyle
if (this._order[e] == t) return this._order[e + 1];
return null
}, gantt.getPrev = function(t) {
for (var e = 1; e < this._order.length; e++)
if (this._order[e] == t) return this._order[e - 1];
return null
}, gantt._get_parent_id = function(t) {
var e = this.config.root_id;
return t && (e = t.parent), e
}, gantt.getParent = function(t) {
tmarkerstyle How to use it? tmarkerstyle
var e = null;
return t.id ? e = t : this.isTaskExists(t) && (e = gantt.getTask(t)), this._get_parent_id(e)
}, gantt.setParent = function(t, e) {
t.parent = e
}, gantt.getSiblings = function(t) {
if (!this.isTaskExists(t)) return [];
var e = this.getParent(t);
return this.getChildren(e)
}, gantt.getNextSibling = function(t) {
for (var e = this.getSiblings(t), n = 0, a = e.length; a > n; n++)
tmarkerstyle How to dowload it? tmarkerstyle
if (e[n] == t) return e[n + 1] || null;
return null
}, gantt.getPrevSibling = function(t) {
for (var e = this.getSiblings(t), n = 0, a = e.length; a > n; n++)
if (e[n] == t) return e[n - 1] || null;
return null
}, gantt._dp_init = function(t) {
t.setTransactionMode("POST", !0), t.serverProcessor += (-1 != t.serverProcessor.indexOf("?") ? "&" : "?") + "editing=true", t._serverProcessor = t.serverProcessor, t.styles = {
updated: "gantt_updated",
inserted: "gantt_inserted",
tmarkerstyle PasteShr tmarkerstyle
deleted: "gantt_deleted",
invalid: "gantt_invalid",
error: "gantt_error",
clear: ""
}, t._methods = ["_row_style", "setCellTextStyle", "_change_id", "_delete_task"], t.setGanttMode = function(e) {
var n = t.modes || {};
t._ganttMode && (n[t._ganttMode] = {
_in_progress: t._in_progress,
_invalid: t._invalid,
updatedRows: t.updatedRows
tmarkerstyle PasteShr tmarkerstyle
});
var a = n[e];
a || (a = n[e] = {
_in_progress: {},
_invalid: {},
updatedRows: []
}), t._in_progress = a._in_progress, t._invalid = a._invalid, t.updatedRows = a.updatedRows, t.modes = n, t._ganttMode = e
}, this._sendTaskOrder = function(e, n) {
n.$drop_target && (t.setGanttMode("tasks"), this.getTask(e).target = n.$drop_target, t.setUpdated(e, !0, "order"), delete this.getTask(e).$drop_target)
}, this.attachEvent("onAfterTaskAdd", function(e) {
tmarkerstyle How to get it? tmarkerstyle
t.setGanttMode("tasks"), t.setUpdated(e, !0, "inserted")
}), this.attachEvent("onAfterTaskUpdate", function(e, n) {
t.setGanttMode("tasks"), t.setUpdated(e, !0), gantt._sendTaskOrder(e, n)
}), this.attachEvent("onAfterTaskDelete", function(e) {
t.setGanttMode("tasks"), t.setUpdated(e, !0, "deleted"), "off" == t.updateMode || t._tSend || t.sendAllData()
}), this.attachEvent("onAfterLinkUpdate", function(e) {
t.setGanttMode("links"), t.setUpdated(e, !0)
}), this.attachEvent("onAfterLinkAdd", function(e) {
t.setGanttMode("links"), t.setUpdated(e, !0, "inserted")
}), this.attachEvent("onAfterLinkDelete", function(e) {
tmarkerstyle How to use it? tmarkerstyle
t.setGanttMode("links"), t.setUpdated(e, !0, "deleted")
}), this.attachEvent("onRowDragEnd", function(t) {
gantt._sendTaskOrder(t, gantt.getTask(t))
}), t.attachEvent("onBeforeDataSending", function() {
var t = this._serverProcessor;
if ("REST" == this._tMode) {
var e = this._ganttMode.substr(0, this._ganttMode.length - 1);
t = t.substring(0, t.indexOf("?") > -1 ? t.indexOf("?") : t.length), this.serverProcessor = t + ("/" == t.slice(-1) ? "" : "/") + e
} else this.serverProcessor = t + window.dhtmlx.url(t) + "gantt_mode=" + this._ganttMode;
return !0
tmarkerstyle How to use it? tmarkerstyle
}), this._init_dp_live_update_hooks(t);
var e = t.afterUpdate;
t.afterUpdate = function() {
var n;
n = 3 == arguments.length ? arguments[1] : arguments[4];
var a = t._ganttMode,
i = n.filePath;
a = "REST" != this._tMode ? -1 != i.indexOf("gantt_mode=links") ? "links" : "tasks" : i.indexOf("/link") > i.indexOf("/task") ? "links" : "tasks", t.setGanttMode(a);
var s = e.apply(t, arguments);
return t.setGanttMode(a), s
tmarkerstyle How to get it for free? tmarkerstyle
}, t._getRowData = dhtmlx.bind(function(e) {
var n;
n = "tasks" == t._ganttMode ? this.isTaskExists(e) ? this.getTask(e) : {
id: e
} : this.isLinkExists(e) ? this.getLink(e) : {
id: e
}, n = dhtmlx.copy(n);
var a = {};
for (var i in n)
if ("$" != i.substr(0, 1)) {
tmarkerstyle How to get it? tmarkerstyle
var s = n[i];
a[i] = s instanceof Date ? this.templates.xml_format(s) : null === s ? "" : s
}
return n.$no_start && (n.start_date = "", n.duration = ""), n.$no_end && (n.end_date = "", n.duration = ""), a[t.action_param] = this.getUserData(e, t.action_param), a
}, this), this._change_id = dhtmlx.bind(function(e, n) {
"tasks" != t._ganttMode ? this.changeLinkId(e, n) : this.changeTaskId(e, n)
}, this), this._row_style = function(e, n) {
if ("tasks" == t._ganttMode && gantt.isTaskExists(e)) {
var a = gantt.getTask(e);
a.$dataprocessor_class = n, gantt.refreshTask(e)
tmarkerstyle How to dowload it? tmarkerstyle
}
}, this._delete_task = function() {}, this._dp = t, gantt._patch_dhx4_ajax()
}, gantt._patch_dhx4_ajax = function() {
var t = parseInt((dhx4.version || "").split(".").join(""), 10);
413 >= t && (window.dhx4.ajax._call = function(t, e, n, a, i, s, r) {
var o = window.XMLHttpRequest && !dhx4.isIE ? new XMLHttpRequest : new ActiveXObject("Microsoft.XMLHTTP"),
l = null != navigator.userAgent.match(/AppleWebKit/) && null != navigator.userAgent.match(/Qt/) && null != navigator.userAgent.match(/Safari/);
if (1 == a && (o.onreadystatechange = function() {
if (4 == o.readyState || 1 == l && 3 == o.readyState) {
if ((200 != o.status || "" == o.responseText) && !dhx4.callEvent("onAjaxError", [o])) return;
tmarkerstyle How to get it for free? tmarkerstyle
window.setTimeout(function() {
"function" == typeof i && i.apply(window, [{
xmlDoc: o,
filePath: e
}]), null != s && ("undefined" != typeof s.postData ? dhx4.ajax.postLong(s.url, s.postData, i) : dhx4.ajax.getLong(s.url, i)), i = null, o = null
}, 1)
}
}), "GET" == t && 1 != this.cache && (e += (e.indexOf("?") >= 0 ? "&" : "?") + "dhxr" + (new Date).getTime() + "=1"), o.open(t, e, a), r)
for (var d in r) o.setRequestHeader(d, r[d]);
else "POST" == t.toUpperCase() || "PUT" == t || "DELETE" == t ? o.setRequestHeader("Content-Type", "application/x-www-form-urlencoded") : "GET" == t && (n = null);
tmarkerstyle How to get it for free? tmarkerstyle
return o.setRequestHeader("X-Requested-With", "XMLHttpRequest"), o.send(n), a ? void 0 : {
xmlDoc: o,
filePath: e
}
}), gantt._patch_dhx4_ajax = function() {}
}, gantt.getUserData = function(t, e) {
return this.userdata || (this.userdata = {}), this.userdata[t] && this.userdata[t][e] ? this.userdata[t][e] : ""
}, gantt.setUserData = function(t, e, n) {
this.userdata || (this.userdata = {}), this.userdata[t] || (this.userdata[t] = {}), this.userdata[t][e] = n
}, gantt._init_link = function(t) {
tmarkerstyle PasteShr tmarkerstyle
return dhtmlx.defined(t.id) || (t.id = dhtmlx.uid()), t
}, gantt._sync_links = function() {
for (var t in this._pull) this._pull[t].$source = [], this._pull[t].$target = [];
for (var t in this._lpull) {
var e = this._lpull[t];
this._pull[e.source] && this._pull[e.source].$source.push(t), this._pull[e.target] && this._pull[e.target].$target.push(t)
}
}, gantt.getLink = function(t) {
return dhtmlx.assert(this._lpull[t], "Link doesn't exist"), this._lpull[t]
}, gantt.getLinks = function() {
tmarkerstyle How to use it? tmarkerstyle
var t = [];
for (var e in gantt._lpull) t.push(gantt._lpull[e]);
return t
}, gantt.isLinkExists = function(t) {
return dhtmlx.defined(this._lpull[t])
}, gantt.addLink = function(t) {
return t = this._init_link(t), this.callEvent("onBeforeLinkAdd", [t.id, t]) === !1 ? !1 : (this._lpull[t.id] = t, this._sync_links(), this._render_link(t.id), this.callEvent("onAfterLinkAdd", [t.id, t]), t.id)
}, gantt.updateLink = function(t, e) {
return dhtmlx.defined(e) || (e = this.getLink(t)), this.callEvent("onBeforeLinkUpdate", [t, e]) === !1 ? !1 : (this._lpull[t] = e, this._sync_links(), this._render_link(t), this.callEvent("onAfterLinkUpdate", [t, e]), !0)
}, gantt.deleteLink = function(t) {
tmarkerstyle How to get it for free? tmarkerstyle
return this._deleteLink(t)
}, gantt._deleteLink = function(t, e) {
var n = this.getLink(t);
return e || this.callEvent("onBeforeLinkDelete", [t, n]) !== !1 ? (delete this._lpull[t], this._sync_links(), this.refreshLink(t), e || this.callEvent("onAfterLinkDelete", [t, n]), !0) : !1
}, gantt.changeLinkId = function(t, e) {
this._lpull[e] = this._lpull[t], this._lpull[e].id = e, delete this._lpull[t], this._sync_links(), this.callEvent("onLinkIdChange", [t, e])
}, gantt.getChildren = function(t) {
return dhtmlx.defined(this._branches[t]) ? this._branches[t] : []
}, gantt.hasChild = function(t) {
return dhtmlx.defined(this._branches[t]) && this._branches[t].length
tmarkerstyle How to get it? tmarkerstyle
}, gantt.refreshData = function() {
this._render_data()
}, gantt._configure = function(t, e, n) {
for (var a in e)("undefined" == typeof t[a] || n) && (t[a] = e[a])
}, gantt._init_skin = function() {
gantt._get_skin(!1), gantt._init_skin = function() {}
}, gantt._get_skin = function(t) {
if (!gantt.skin || t)
for (var e = document.getElementsByTagName("link"), n = 0; n < e.length; n++) {
var a = e[n].href.match("dhtmlxgantt_([a-z]+).css");
tmarkerstyle PasteShr tmarkerstyle
if (a) {
gantt.skin = a[1];
break
}
}
gantt.skin || (gantt.skin = "terrace");
var i = gantt.skins[gantt.skin];
this._configure(gantt.config, i.config, t);
var s = gantt.getGridColumns();
s[1] && "undefined" == typeof s[1].width && (s[1].width = i._second_column_width), s[2] && "undefined" == typeof s[2].width && (s[2].width = i._third_column_width), i._lightbox_template && (gantt._lightbox_template = i._lightbox_template), gantt.resetLightbox()
tmarkerstyle How to use it? tmarkerstyle
}, gantt.resetSkin = function() {
this.skin = "", this._get_skin(!0)
}, gantt.skins = {}, gantt._lightbox_methods = {}, gantt._lightbox_template = "
", gantt.showLightbox = function(t) {
if (t && !gantt._is_readonly(this.getTask(t)) && this.callEvent("onBeforeLightbox", [t])) {
var e = this.getTask(t),
n = this.getLightbox(this._get_safe_type(e.type));
this._center_lightbox(n), this.showCover(), this._fill_lightbox(t, n), this.callEvent("onLightbox", [t])
}
}, gantt._get_timepicker_step = function() {
if (this.config.round_dnd_dates) {
tmarkerstyle How to dowload it? tmarkerstyle
var t = gantt._tasks,
e = this._get_line(t.unit) * t.step / 60;
return (e >= 1440 || !this._is_chart_visible()) && (e = this.config.time_step), e
}
return this.config.time_step
}, gantt.getLabel = function(t, e) {
for (var n = this._get_typed_lightbox_config(), a = 0; a < n.length; a++)
if (n[a].map_to == t)
for (var i = n[a].options, s = 0; s < i.length; s++)
if (i[s].key == e) return i[s].label;
tmarkerstyle How to get it? tmarkerstyle
return ""
}, gantt.updateCollection = function(t, e) {
e = e.slice(0);
var n = gantt.serverList(t);
return n ? (n.splice(0, n.length), n.push.apply(n, e || []), void gantt.resetLightbox()) : !1
}, gantt.getLightboxType = function() {
return this._get_safe_type(this._lightbox_type)
}, gantt.getLightbox = function(t) {
if (void 0 === t && (t = this.getLightboxType()), !this._lightbox || this.getLightboxType() != this._get_safe_type(t)) {
this._lightbox_type = this._get_safe_type(t);
tmarkerstyle How to use it? tmarkerstyle
var e = document.createElement("DIV");
e.className = "gantt_cal_light";
var n = this._is_lightbox_timepicker();
(gantt.config.wide_form || n) && (e.className += " gantt_cal_light_wide"), n && (gantt.config.wide_form = !0, e.className += " gantt_cal_light_full"), e.style.visibility = "hidden";
for (var a = this._lightbox_template, i = this.config.buttons_left, s = 0; s < i.length; s++) {
var r = this.config._migrate_buttons[i[s]] ? this.config._migrate_buttons[i[s]] : i[s];
a += "
" + this.locale.labels[r] + "
"
}
i = this.config.buttons_right;
for (var s = 0; s < i.length; s++) {
tmarkerstyle How to use it? tmarkerstyle
var r = this.config._migrate_buttons[i[s]] ? this.config._migrate_buttons[i[s]] : i[s];
a += "
" + this.locale.labels[r] + "
"
}
a += "", e.innerHTML = a, gantt.config.drag_lightbox && (e.firstChild.onmousedown = gantt._ready_to_dnd, e.firstChild.onselectstart = function() {
return !1
}, e.firstChild.style.cursor = "pointer", gantt._init_dnd_events()), document.body.insertBefore(e, document.body.firstChild), this._lightbox = e;
var o = this._get_typed_lightbox_config(t);
a = this._render_sections(o);
for (var l = e.getElementsByTagName("div"), s = 0; s < l.length; s++) {
var d = l[s];
tmarkerstyle How to dowload it? tmarkerstyle
if ("gantt_cal_larea" == d.className) {
d.innerHTML = a;
break
}
}
this.resizeLightbox(), this._init_lightbox_events(this), e.style.display = "none", e.style.visibility = "visible"
}
return this._lightbox
}, gantt._render_sections = function(t) {
for (var e = "", n = 0; n < t.length; n++) {
tmarkerstyle PasteShr tmarkerstyle
var a = this.form_blocks[t[n].type];
if (a) {
t[n].id = "area_" + dhtmlx.uid();
var i = t[n].hidden ? " style='display:none'" : "",
s = "";
t[n].button && (s = "
"), n.join("")
},
set_value: function(t, e, n, a) {
var i = a,
s = t.getElementsByTagName("select"),
tmarkerstyle How to get it? tmarkerstyle
r = a._time_format_order;
if (a._time_format_size, i.auto_end_date)
for (var o = function() {
_ = new Date(s[r[2]].value, s[r[1]].value, s[r[0]].value, 0, 0), c = gantt.calculateEndDate(_, 1), this.form_blocks._fill_lightbox_select(s, r.size, c, r, i)
}, l = 0; 4 > l; l++) s[l].onchange = o;
var d = gantt._resolve_default_mapping(a);
"string" == typeof d && (d = {
start_date: d
});
var _ = n[d.start_date] || new Date,
tmarkerstyle PasteShr tmarkerstyle
c = n[d.end_date] || gantt.calculateEndDate(_, 1);
this.form_blocks._fill_lightbox_select(s, 0, _, r, i), this.form_blocks._fill_lightbox_select(s, r.size, c, r, i)
},
get_value: function(t, e, n) {
var a = t.getElementsByTagName("select"),
i = n._time_format_order,
s = 0,
r = 0;
if (dhtmlx.defined(i[3])) {
var o = parseInt(a[i[3]].value, 10);
tmarkerstyle PasteShr tmarkerstyle
s = Math.floor(o / 60), r = o % 60
}
var l = new Date(a[i[2]].value, a[i[1]].value, a[i[0]].value, s, r);
if (s = r = 0, dhtmlx.defined(i[3])) {
var o = parseInt(a[i.size + i[3]].value, 10);
s = Math.floor(o / 60), r = o % 60
}
var d = new Date(a[i[2] + i.size].value, a[i[1] + i.size].value, a[i[0] + i.size].value, s, r);
l >= d && (d = gantt.date.add(l, gantt._get_timepicker_step(), "minute"));
var _ = gantt._resolve_default_mapping(n),
tmarkerstyle How to dowload it? tmarkerstyle
c = {
start_date: new Date(l),
end_date: new Date(d)
};
return "string" == typeof _ ? c.start_date : c
},
focus: function(t) {
gantt._focus(t.getElementsByTagName("select")[0])
}
},
tmarkerstyle PasteShr tmarkerstyle
duration: {
render: function(t) {
var e = this.form_blocks.getTimePicker.call(this, t);
e = "
" + e + "
";
var n = this.locale.labels[this.config.duration_unit + "s"],
a = t.single_date ? ' style="display:none"' : "",
i = t.readonly ? " disabled='disabled'" : "",
s = "
" + n + "
",
r = "
" + e + " " + s + "
";
return r
tmarkerstyle How to get it for free? tmarkerstyle
},
set_value: function(t, e, n, a) {
function i() {
var e = gantt.form_blocks.duration._get_start_date.call(gantt, t, a),
n = gantt.form_blocks.duration._get_duration.call(gantt, t, a),
i = gantt.calculateEndDate(e, n);
c.innerHTML = gantt.templates.task_date(i)
}
function s(t) {
tmarkerstyle How to use it? tmarkerstyle
var e = d.value;
e = parseInt(e, 10),
window.isNaN(e) && (e = 0), e += t, 1 > e && (e = 1), d.value = e, i()
}
var r = a,
o = t.getElementsByTagName("select"),
l = t.getElementsByTagName("input"),
d = l[1],
_ = [l[0], l[2]],
c = t.getElementsByTagName("span")[0],
tmarkerstyle How to dowload it? tmarkerstyle
g = a._time_format_order;
_[0].onclick = dhtmlx.bind(function() {
s(-1 * this.config.duration_step)
}, this), _[1].onclick = dhtmlx.bind(function() {
s(1 * this.config.duration_step)
}, this), o[0].onchange = i, o[1].onchange = i, o[2].onchange = i, o[3] && (o[3].onchange = i), d.onkeydown = dhtmlx.bind(function(t) {
t = t || window.event;
var e = t.charCode || t.keyCode || t.which;
return 40 == e ? (s(-1 * this.config.duration_step), !1) : 38 == e ? (s(1 * this.config.duration_step), !1) : void window.setTimeout(function() {
i()
tmarkerstyle How to use it? tmarkerstyle
}, 1)
}, this), d.onchange = dhtmlx.bind(function() {
i()
}, this);
var h = gantt._resolve_default_mapping(a);
"string" == typeof h && (h = {
start_date: h
});
var u = n[h.start_date] || new Date,
f = n[h.end_date] || gantt.calculateEndDate(u, 1),
tmarkerstyle How to dowload it? tmarkerstyle
p = Math.round(n[h.duration]) || gantt.calculateDuration(u, f);
gantt.form_blocks._fill_lightbox_select(o, 0, u, g, r), d.value = p, i()
},
_get_start_date: function(t, e) {
var n = t.getElementsByTagName("select"),
a = e._time_format_order,
i = 0,
s = 0;
if (dhtmlx.defined(a[3])) {
var r = n[a[3]],
tmarkerstyle How to dowload it? tmarkerstyle
o = parseInt(r.value, 10);
isNaN(o) && r.hasAttribute("data-value") && (o = parseInt(r.getAttribute("data-value"), 10)), i = Math.floor(o / 60), s = o % 60
}
return new Date(n[a[2]].value, n[a[1]].value, n[a[0]].value, i, s)
},
_get_duration: function(t) {
var e = t.getElementsByTagName("input")[1];
return e = parseInt(e.value, 10), (!e || window.isNaN(e)) && (e = 1), 0 > e && (e *= -1), e
},
get_value: function(t, e, n) {
tmarkerstyle How to use it? tmarkerstyle
var a = gantt.form_blocks.duration._get_start_date(t, n),
i = gantt.form_blocks.duration._get_duration(t, n),
s = gantt.calculateEndDate(a, i),
r = gantt._resolve_default_mapping(n),
o = {
start_date: new Date(a),
end_date: new Date(s),
duration: i
};
return "string" == typeof r ? o.start_date : o
tmarkerstyle How to get it for free? tmarkerstyle
},
focus: function(t) {
gantt._focus(t.getElementsByTagName("select")[0])
}
},
parent: {
_filter: function(t, e, n) {
var a = e.filter || function() {
return !0
};
tmarkerstyle How to get it for free? tmarkerstyle
t = t.slice(0);
for (var i = 0; i < t.length; i++) {
var s = t[i];
(s.id == n || gantt.isChildOf(s.id, n) || a(s.id, s) === !1) && (t.splice(i, 1), i--)
}
return t
},
_display: function(t, e) {
var n = [],
a = [];
tmarkerstyle How to get it for free? tmarkerstyle
e && (n = gantt.getTaskByTime(), t.allow_root && n.unshift({
id: gantt.config.root_id,
text: t.root_label || ""
}), n = this._filter(n, t, e), t.sort && n.sort(t.sort));
for (var i = t.template || gantt.templates.task_text, s = 0; s < n.length; s++) {
var r = i.apply(gantt, [n[s].start_date, n[s].end_date, n[s]]);
void 0 === r && (r = ""), a.push({
key: n[s].id,
label: r
})
tmarkerstyle PasteShr tmarkerstyle
}
return t.options = a, t.map_to = t.map_to || "parent", gantt.form_blocks.select.render.apply(this, arguments)
},
render: function(t) {
return gantt.form_blocks.parent._display(t, !1)
},
set_value: function(t, e, n, a) {
var i = document.createElement("div");
i.innerHTML = gantt.form_blocks.parent._display(a, n.id);
var s = i.removeChild(i.firstChild);
tmarkerstyle How to get it? tmarkerstyle
return t.onselect = null, t.parentNode.replaceChild(s, t), gantt.form_blocks.select.set_value.apply(gantt, [s, e, n, a])
},
get_value: function() {
return gantt.form_blocks.select.get_value.apply(gantt, arguments)
},
focus: function() {
return gantt.form_blocks.select.focus.apply(gantt, arguments)
}
}
}, gantt._is_lightbox_timepicker = function() {
tmarkerstyle How to use it? tmarkerstyle
for (var t = this._get_typed_lightbox_config(), e = 0; e < t.length; e++)
if ("time" == t[e].name && "time" == t[e].type) return !0;
return !1
}, gantt._dhtmlx_confirm = function(t, e, n, a) {
if (!t) return n();
var i = {
text: t
};
e && (i.title = e), a && (i.ok = a), n && (i.callback = function(t) {
t && n()
tmarkerstyle How to use it? tmarkerstyle
}), dhtmlx.confirm(i)
}, gantt._get_typed_lightbox_config = function(t) {
void 0 === t && (t = this.getLightboxType());
var e = this._get_type_name(t);
return gantt.config.lightbox[e + "_sections"] ? gantt.config.lightbox[e + "_sections"] : gantt.config.lightbox.sections
}, gantt._silent_redraw_lightbox = function(t) {
var e = this.getLightboxType();
if (this.getState().lightbox) {
var n = this.getState().lightbox,
a = this.getLightboxValues(),
tmarkerstyle How to dowload it? tmarkerstyle
i = dhtmlx.copy(this.getTask(n));
this.resetLightbox();
var s = dhtmlx.mixin(i, a, !0),
r = this.getLightbox(t ? t : void 0);
this._center_lightbox(this.getLightbox()), this._set_lightbox_values(s, r)
} else this.resetLightbox(), this.getLightbox(t ? t : void 0);
this.callEvent("onLightboxChange", [e, this.getLightboxType()])
}, gantt._extend_to_optional = function(t) {
var e = t,
n = {
tmarkerstyle How to use it? tmarkerstyle
render: e.render,
focus: e.focus,
set_value: function(t, a, i, s) {
var r = gantt._resolve_default_mapping(s);
if (!i[r.start_date] || "start_date" == r.start_date && this._isAllowedUnscheduledTask(i)) {
n.disable(t, s);
var o = {};
for (var l in r) o[r[l]] = i[l];
return e.set_value.call(gantt, t, a, o, s)
}
tmarkerstyle How to get it? tmarkerstyle
return n.enable(t, s), e.set_value.call(gantt, t, a, i, s)
},
get_value: function(t, n, a) {
return a.disabled ? {
start_date: null
} : e.get_value.call(gantt, t, n, a)
},
update_block: function(t, e) {
if (gantt.callEvent("onSectionToggle", [gantt._lightbox_id, e]), t.style.display = e.disabled ? "none" : "block", e.button) {
var n = t.previousSibling.firstChild.firstChild,
tmarkerstyle How to use it? tmarkerstyle
a = gantt.locale.labels,
i = e.disabled ? a[e.name + "_enable_button"] : a[e.name + "_disable_button"];
n.nextSibling.innerHTML = i
}
gantt.resizeLightbox()
},
disable: function(t, e) {
e.disabled = !0, n.update_block(t, e)
},
enable: function(t, e) {
tmarkerstyle How to get it? tmarkerstyle
e.disabled = !1, n.update_block(t, e)
},
button_click: function(t, e, a, i) {
if (gantt.callEvent("onSectionButton", [gantt._lightbox_id, a]) !== !1) {
var s = gantt._get_typed_lightbox_config()[t];
s.disabled ? n.enable(i, s) : n.disable(i, s)
}
}
};
return n
tmarkerstyle How to dowload it? tmarkerstyle
}, gantt.form_blocks.duration_optional = gantt._extend_to_optional(gantt.form_blocks.duration), gantt.form_blocks.time_optional = gantt._extend_to_optional(gantt.form_blocks.time), dataProcessor.prototype = {
setTransactionMode: function(t, e) {
"object" == typeof t ? (this._tMode = t.mode || this._tMode, this._headers = this._headers || t.headers, this._payload = this._payload || t.payload) : (this._tMode = t, this._tSend = e), "REST" == this._tMode && (this._tSend = !1, this._endnm = !0)
},
escape: function(t) {
return this._utf ? encodeURIComponent(t) : escape(t)
},
enableUTFencoding: function(t) {
this._utf = dhx4.s2b(t)
},
tmarkerstyle How to use it? tmarkerstyle
setDataColumns: function(t) {
this._columns = "string" == typeof t ? t.split(",") : t
},
getSyncState: function() {
return !this.updatedRows.length
},
enableDataNames: function(t) {
this._endnm = dhx4.s2b(t)
},
enablePartialDataSend: function(t) {
tmarkerstyle How to get it? tmarkerstyle
this._changed = dhx4.s2b(t)
},
setUpdateMode: function(t, e) {
this.autoUpdate = "cell" == t, this.updateMode = t, this.dnd = e
},
ignore: function(t, e) {
this._silent_mode = !0, t.call(e || window), this._silent_mode = !1
},
setUpdated: function(t, e, n) {
if (!this._silent_mode) {
tmarkerstyle How to use it? tmarkerstyle
var a = this.findRow(t);
n = n || "updated";
var i = this.obj.getUserData(t, this.action_param);
i && "updated" == n && (n = i), e ? (this.set_invalid(t, !1), this.updatedRows[a] = t, this.obj.setUserData(t, this.action_param, n), this._in_progress[t] && (this._in_progress[t] = "wait")) : this.is_invalid(t) || (this.updatedRows.splice(a, 1), this.obj.setUserData(t, this.action_param, "")), e || this._clearUpdateFlag(t), this.markRow(t, e, n), e && this.autoUpdate && this.sendData(t)
}
},
_clearUpdateFlag: function() {},
markRow: function(t, e, n) {
var a = "",
i = this.is_invalid(t);
tmarkerstyle How to use it? tmarkerstyle
if (i && (a = this.styles[i], e = !0), this.callEvent("onRowMark", [t, e, n, i]) && (a = this.styles[e ? n : "clear"] + a, this.obj[this._methods[0]](t, a), i && i.details)) {
a += this.styles[i + "_cell"];
for (var s = 0; s < i.details.length; s++) i.details[s] && this.obj[this._methods[1]](t, s, a)
}
},
getState: function(t) {
return this.obj.getUserData(t, this.action_param)
},
is_invalid: function(t) {
return this._invalid[t]
tmarkerstyle PasteShr tmarkerstyle
},
set_invalid: function(t, e, n) {
n && (e = {
value: e,
details: n,
toString: function() {
return this.value.toString()
}
}), this._invalid[t] = e
},
tmarkerstyle How to get it? tmarkerstyle
checkBeforeUpdate: function() {
return !0
},
sendData: function(t) {
return !this._waitMode || "tree" != this.obj.mytype && !this.obj._h2 ? (this.obj.editStop && this.obj.editStop(), "undefined" == typeof t || this._tSend ? this.sendAllData() : this._in_progress[t] ? !1 : (this.messages = [], !this.checkBeforeUpdate(t) && this.callEvent("onValidationError", [t, this.messages]) ? !1 : void this._beforeSendData(this._getRowData(t), t))) : void 0
},
_beforeSendData: function(t, e) {
return this.callEvent("onBeforeUpdate", [e, this.getState(e), t]) ? void this._sendData(t, e) : !1
},
serialize: function(t, e) {
tmarkerstyle How to get it? tmarkerstyle
if ("string" == typeof t) return t;
if ("undefined" != typeof e) return this.serialize_one(t, "");
var n = [],
a = [];
for (var i in t) t.hasOwnProperty(i) && (n.push(this.serialize_one(t[i], i + this.post_delim)), a.push(i));
return n.push("ids=" + this.escape(a.join(","))), dhtmlx.security_key && n.push("dhx_security=" + dhtmlx.security_key), n.join("&")
},
serialize_one: function(t, e) {
if ("string" == typeof t) return t;
var n = [];
tmarkerstyle How to get it? tmarkerstyle
for (var a in t)
if (t.hasOwnProperty(a)) {
if (("id" == a || a == this.action_param) && "REST" == this._tMode) continue;
n.push(this.escape((e || "") + a) + "=" + this.escape(t[a]))
}
return n.join("&")
},
_sendData: function(t, e) {
if (t) {
if (!this.callEvent("onBeforeDataSending", e ? [e, this.getState(e), t] : [null, null, t])) return !1;
tmarkerstyle How to use it? tmarkerstyle
e && (this._in_progress[e] = (new Date).valueOf());
var n = this,
a = function(a) {
var i = [];
if (e) i.push(e);
else if (t)
for (var s in t) i.push(s);
return n.afterUpdate(n, a, i)
}, i = this.serverProcessor + (this._user ? dhtmlx.url(this.serverProcessor) + ["dhx_user=" + this._user, "dhx_version=" + this.obj.getUserData(0, "version")].join("&") : "");
if ("GET" == this._tMode) dhx4.ajax.get(i + (-1 != i.indexOf("?") ? "&" : "?") + this.serialize(t, e), a);
tmarkerstyle How to use it? tmarkerstyle
else if ("POST" == this._tMode) dhx4.ajax.post(i, this.serialize(t, e), a);
else if ("REST" == this._tMode) {
var s = this.getState(e),
r = i.replace(/(\&|\?)editing\=true/, ""),
o = "",
l = "post";
if ("inserted" == s ? o = this.serialize(t, e) : "deleted" == s ? (l = "DELETE", r = r + ("/" == r.slice(-1) ? "" : "/") + e) : (l = "PUT", o = this.serialize(t, e), r = r + ("/" == r.slice(-1) ? "" : "/") + e), this._payload)
for (var d in this._payload) r = r + dhtmlx.url(r) + this.escape(d) + "=" + this.escape(this._payload[d]);
dhx4.ajax.query({
url: r,
tmarkerstyle How to get it for free? tmarkerstyle
method: l,
headers: this._headers,
data: o,
callback: a
})
}
this._waitMode++
}
},
sendAllData: function() {
tmarkerstyle How to dowload it? tmarkerstyle
if (this.updatedRows.length) {
this.messages = [];
for (var t = !0, e = 0; e < this.updatedRows.length; e++) t &= this.checkBeforeUpdate(this.updatedRows[e]);
if (!t && !this.callEvent("onValidationError", ["", this.messages])) return !1;
if (this._tSend) this._sendData(this._getAllData());
else
for (var e = 0; e < this.updatedRows.length; e++)
if (!this._in_progress[this.updatedRows[e]]) {
if (this.is_invalid(this.updatedRows[e])) continue;
if (this._beforeSendData(this._getRowData(this.updatedRows[e]), this.updatedRows[e]), this._waitMode && ("tree" == this.obj.mytype || this.obj._h2)) return
tmarkerstyle How to use it? tmarkerstyle
}
}
},
_getAllData: function() {
for (var t = {}, e = !1, n = 0; n < this.updatedRows.length; n++) {
var a = this.updatedRows[n];
this._in_progress[a] || this.is_invalid(a) || this.callEvent("onBeforeUpdate", [a, this.getState(a), this._getRowData(a)]) && (t[a] = this._getRowData(a, a + this.post_delim), e = !0, this._in_progress[a] = (new Date).valueOf())
}
return e ? t : null
},
tmarkerstyle PasteShr tmarkerstyle
setVerificator: function(t, e) {
this.mandatoryFields[t] = e || function(t) {
return "" !== t
}
},
clearVerificator: function(t) {
this.mandatoryFields[t] = !1
},
findRow: function(t) {
var e = 0;
tmarkerstyle How to dowload it? tmarkerstyle
for (e = 0; e < this.updatedRows.length && t != this.updatedRows[e]; e++);
return e
},
defineAction: function(t, e) {
this._uActions || (this._uActions = []), this._uActions[t] = e
},
afterUpdateCallback: function(t, e, n, a) {
var i = t,
s = "error" != n && "invalid" != n;
if (s || this.set_invalid(t, n), this._uActions && this._uActions[n] && !this._uActions[n](a)) return delete this._in_progress[i];
tmarkerstyle How to get it for free? tmarkerstyle
"wait" != this._in_progress[i] && this.setUpdated(t, !1);
var r = t;
switch (n) {
case "inserted":
case "insert":
e != t && (this.obj[this._methods[2]](t, e), t = e);
break;
case "delete":
case "deleted":
return this.obj.setUserData(t, this.action_param, "true_deleted"), this.obj[this._methods[3]](t), delete this._in_progress[i], this.callEvent("onAfterUpdate", [t, n, e, a])
tmarkerstyle How to get it? tmarkerstyle
}
"wait" != this._in_progress[i] ? (s && this.obj.setUserData(t, this.action_param, ""), delete this._in_progress[i]) : (delete this._in_progress[i], this.setUpdated(e, !0, this.obj.getUserData(t, this.action_param))), this.callEvent("onAfterUpdate", [r, n, e, a])
},
afterUpdate: function(t, e, n) {
if (window.JSON) try {
var a = JSON.parse(e.xmlDoc.responseText),
i = a.action || this.getState(n) || "updated",
s = a.sid || n[0],
r = a.tid || n[0];
return t.afterUpdateCallback(s, r, i, a), void t.finalizeUpdate()
tmarkerstyle How to dowload it? tmarkerstyle
} catch (o) {}
var l = dhx4.ajax.xmltop("data", e.xmlDoc);
if (!l) return this.cleanUpdate(n);
var d = dhx4.ajax.xpath("//data/action", l);
if (!d.length) return this.cleanUpdate(n);
for (var _ = 0; _ < d.length; _++) {
var c = d[_],
i = c.getAttribute("type"),
s = c.getAttribute("sid"),
r = c.getAttribute("tid");
tmarkerstyle How to dowload it? tmarkerstyle
t.afterUpdateCallback(s, r, i, c)
}
t.finalizeUpdate()
},
cleanUpdate: function(t) {
if (t)
for (var e = 0; e < t.length; e++) delete this._in_progress[t[e]]
},
finalizeUpdate: function() {
this._waitMode && this._waitMode--, ("tree" == this.obj.mytype || this.obj._h2) && this.updatedRows.length && this.sendData(), this.callEvent("onAfterUpdateFinish", []), this.updatedRows.length || this.callEvent("onFullSync", [])
tmarkerstyle How to get it? tmarkerstyle
},
init: function(t) {
this.obj = t, this.obj._dp_init && this.obj._dp_init(this)
},
setOnAfterUpdate: function(t) {
this.attachEvent("onAfterUpdate", t)
},
enableDebug: function() {},
setOnBeforeUpdateHandler: function(t) {
this.attachEvent("onBeforeDataSending", t)
tmarkerstyle How to use it? tmarkerstyle
},
setAutoUpdate: function(t, e) {
t = t || 2e3, this._user = e || (new Date).valueOf(), this._need_update = !1, this._loader = null, this._update_busy = !1, this.attachEvent("onAfterUpdate", function(t, e, n, a) {
this.afterAutoUpdate(t, e, n, a)
}), this.attachEvent("onFullSync", function() {
this.fullSync()
});
var n = this;
window.setInterval(function() {
n.loadUpdate()
tmarkerstyle How to get it? tmarkerstyle
}, t)
},
afterAutoUpdate: function(t, e) {
return "collision" == e ? (this._need_update = !0, !1) : !0
},
fullSync: function() {
return 1 == this._need_update && (this._need_update = !1, this.loadUpdate()), !0
},
getUpdates: function(t, e) {
return this._update_busy ? !1 : (this._update_busy = !0, this._loader = this._loader || new dtmlXMLLoaderObject(!0), this._loader.async = !0, this._loader.waitCall = e, void this._loader.loadXML(t))
tmarkerstyle How to get it for free? tmarkerstyle
},
_v: function(t) {
return t.firstChild ? t.firstChild.nodeValue : ""
},
_a: function(t) {
for (var e = [], n = 0; n < t.length; n++) e[n] = this._v(t[n]);
return e
},
loadUpdate: function() {
var t = this,
tmarkerstyle How to dowload it? tmarkerstyle
e = this.obj.getUserData(0, "version"),
n = this.serverProcessor + dhtmlx.url(this.serverProcessor) + ["dhx_user=" + this._user, "dhx_version=" + e].join("&");
n = n.replace("editing=true&", ""), this.getUpdates(n, function() {
var e = t._loader.doXPath("//userdata");
t.obj.setUserData(0, "version", t._v(e[0]));
var n = t._loader.doXPath("//update");
if (n.length) {
t._silent_mode = !0;
for (var a = 0; a < n.length; a++) {
var i = n[a].getAttribute("status"),
tmarkerstyle How to dowload it? tmarkerstyle
s = n[a].getAttribute("id"),
r = n[a].getAttribute("parent");
switch (i) {
case "inserted":
t.callEvent("insertCallback", [n[a], s, r]);
break;
case "updated":
t.callEvent("updateCallback", [n[a], s, r]);
break;
case "deleted":
tmarkerstyle How to get it? tmarkerstyle
t.callEvent("deleteCallback", [n[a], s, r])
}
}
t._silent_mode = !1
}
t._update_busy = !1, t = null
})
}
}, gantt._init_dp_live_update_hooks = function(t) {
t.attachEvent("insertCallback", gantt._insert_callback), t.attachEvent("updateCallback", gantt._update_callback), t.attachEvent("deleteCallback", gantt._delete_callback)
tmarkerstyle How to dowload it? tmarkerstyle
}, gantt._update_callback = function(t, e) {
var n = t.data || gantt.xml._xmlNodeToJSON(t.firstChild);
if (gantt.isTaskExists(e)) {
var a = gantt.getTask(e);
for (var i in n) {
var s = n[i];
switch (i) {
case "id":
continue;
case "start_date":
tmarkerstyle How to use it? tmarkerstyle
case "end_date":
s = gantt.templates.xml_date(s);
break;
case "duration":
a.end_date = gantt.calculateEndDate(a.start_date, s)
}
a[i] = s
}
gantt.updateTask(e), gantt.refreshData()
}
tmarkerstyle How to use it? tmarkerstyle
}, gantt._insert_callback = function(t, e, n, a) {
var i = t.data || gantt.xml._xmlNodeToJSON(t.firstChild),
s = {
add: gantt.addTask,
isExist: gantt.isTaskExists
};
"links" == a && (s.add = gantt.addLink, s.isExist = gantt.isLinkExists), s.isExist.call(gantt, e) || (i.id = e, s.add.call(gantt, i))
}, gantt._delete_callback = function(t, e, n, a) {
var i = {
"delete": gantt.deleteTask,
tmarkerstyle PasteShr tmarkerstyle
isExist: gantt.isTaskExists
};
"links" == a && (i["delete"] = gantt.deleteLink, i.isExist = gantt.isLinkExists), i.isExist.call(gantt, e) && i["delete"].call(gantt, e)
}, gantt._get_safe_type = function(t) {
for (var e in this.config.types)
if (this.config.types[e] == t) return t;
return gantt.config.types.task
}, gantt.form_blocks.typeselect = {
render: function(t) {
var e = gantt.config.types,
tmarkerstyle How to get it? tmarkerstyle
n = gantt.locale.labels,
a = [],
i = t.filter || function() {
return !0
};
for (var s in e) 0 == !i(s, e[s]) && a.push({
key: e[s],
label: n["type_" + s]
});
t.options = a;
tmarkerstyle PasteShr tmarkerstyle
var r = t.onchange;
return t.onchange = function() {
gantt.getState().lightbox, gantt.changeLightboxType(this.value), "function" == typeof r && r.apply(this, arguments)
}, gantt.form_blocks.select.render.apply(gantt, arguments)
},
set_value: function() {
return gantt.form_blocks.select.set_value.apply(gantt, arguments)
},
get_value: function() {
return gantt.form_blocks.select.get_value.apply(gantt, arguments)
tmarkerstyle How to get it for free? tmarkerstyle
},
focus: function() {
return gantt.form_blocks.select.focus.apply(this, arguments)
}
},
function() {
function t() {
return gantt._cached_functions.update_if_changed(gantt), gantt._cached_functions.active || gantt._cached_functions.activate(), !0
}
gantt._cached_functions = {
tmarkerstyle PasteShr tmarkerstyle
cache: {},
mode: !1,
critical_path_mode: !1,
wrap_methods: function(t, e) {
if (e._prefetch_originals)
for (var n in e._prefetch_originals) e[n] = e._prefetch_originals[n];
e._prefetch_originals = {};
for (var n = 0; n < t.length; n++) this.prefetch(t[n], e)
},
prefetch: function(t, e) {
tmarkerstyle PasteShr tmarkerstyle
var n = e[t];
if (n) {
var a = this;
e._prefetch_originals[t] = n, e[t] = function() {
if (a.active) {
var e = a.get_arguments_hash(Array.prototype.slice.call(arguments));
a.cache[t] || (a.cache[t] = {});
var i = a.cache[t];
if (a.has_cached_value(i, e)) return a.get_cached_value(i, e);
var s = n.apply(this, arguments);
tmarkerstyle How to get it? tmarkerstyle
return a.cache_value(i, e, s), s
}
return n.apply(this, arguments)
}
}
return n
},
cache_value: function(t, e, n) {
this.is_date(n) && (n = new Date(n)), t[e] = n
},
tmarkerstyle PasteShr tmarkerstyle
has_cached_value: function(t, e) {
return t.hasOwnProperty(e)
},
get_cached_value: function(t, e) {
var n = t[e];
return this.is_date(n) && (n = new Date(n)), n
},
is_date: function(t) {
return t && t.getUTCDate
},
tmarkerstyle PasteShr tmarkerstyle
get_arguments_hash: function(t) {
for (var e = [], n = 0; n < t.length; n++) e.push(this.stringify_argument(t[n]));
return "(" + e.join(";") + ")"
},
stringify_argument: function(t) {
var e = "";
return e = t.id ? t.id : this.is_date(t) ? t.valueOf() : t, e + ""
},
activate: function() {
this.clear(), this.active = !0
tmarkerstyle How to use it? tmarkerstyle
},
deactivate: function() {
this.clear(), this.active = !1
},
clear: function() {
this.cache = {}
},
setup: function(t) {
var e = [],
n = ["isCriticalTask", "isCriticalLink", "_isProjectEnd", "_getProjectEnd"];
tmarkerstyle PasteShr tmarkerstyle
"auto" == this.mode ? t.config.highlight_critical_path && (e = n) : this.mode === !0 && (e = n), this.wrap_methods(e, t)
},
update_if_changed: function(t) {
var e = this.critical_path_mode != t.config.highlight_critical_path || this.mode !== t.config.optimize_render;
e && (this.critical_path_mode = t.config.highlight_critical_path, this.mode = t.config.optimize_render, this.setup(t))
}
}, gantt.attachEvent("onBeforeGanttRender", t), gantt.attachEvent("onBeforeDataRender", t), gantt.attachEvent("onBeforeParse", t), gantt.attachEvent("onDataRender", function() {
gantt._cached_functions.deactivate()
}), gantt.attachEvent("onBeforeGanttReady", function() {
return gantt._cached_functions.update_if_changed(gantt), !0
tmarkerstyle How to dowload it? tmarkerstyle
})
}(), dhtmlx.assert = function(t, e) {
t || gantt.config.show_errors && gantt.callEvent("onError", [e]) !== !1 && dhtmlx.message({
type: "error",
text: e,
expire: -1
})
}, gantt.init = function(t, e, n) {
this.callEvent("onBeforeGanttReady", []), e && n && (this.config.start_date = this._min_date = new Date(e), this.config.end_date = this._max_date = new Date(n)), this._init_skin(), this.date.init(), this.config.scroll_size || (this.config.scroll_size = this._detectScrollSize()), dhtmlxEvent(window, "resize", this._on_resize), this.init = function(t) {
this.$container && this.$container.parentNode && (this.$container.parentNode.removeChild(this.$container), this.$container = null), this._reinit(t)
tmarkerstyle PasteShr tmarkerstyle
}, this._reinit(t)
}, gantt._reinit = function(t) {
this._init_html_area(t), this._set_sizes(), this._clear_renderers(), this.resetLightbox(), this._update_flags(), this._init_touch_events(), this._init_templates(), this._init_grid(), this._init_tasks(), this._set_scroll_events(), dhtmlxEvent(this.$container, "click", this._on_click), dhtmlxEvent(this.$container, "dblclick", this._on_dblclick), dhtmlxEvent(this.$container, "mousemove", this._on_mousemove), dhtmlxEvent(this.$container, "contextmenu", this._on_contextmenu), this.callEvent("onGanttReady", []), this.render()
}, gantt._init_html_area = function(t) {
this._obj = "string" == typeof t ? document.getElementById(t) : t, dhtmlx.assert(this._obj, "Invalid html container: " + t);
var e = "