2014-04-30 22:24:50 +02:00
/ *
dhtmlxGantt v . 2.1 . 1 Standard
This software is covered by GPL license . You also can obtain Commercial or Enterprise license to use it in non - GPL project - please contact sales @ dhtmlx . com . Usage without proper license is prohibited .
( c ) Dinamenta , UAB .
* /
function dtmlXMLLoaderObject ( t , e , n , i ) { return this . xmlDoc = "" , this . async = "undefined" != typeof n ? n : ! 0 , this . onloadAction = t || null , this . mainObject = e || null , this . waitCall = null , this . rSeed = i || ! 1 , this } function callerFunction ( t , e ) { return this . handler = function ( n ) { return n || ( n = window . event ) , t ( n , e ) , ! 0 } , this . handler } function getAbsoluteLeft ( t ) { return getOffset ( t ) . left } function getAbsoluteTop ( t ) { return getOffset ( t ) . top } function getOffsetSum ( t ) { for ( var e = 0 , n = 0 ; t ; ) e += parseInt ( t . offsetTop ) , n += parseInt ( t . offsetLeft ) , t = t . offsetParent ;
return { top : e , left : n } } function getOffsetRect ( t ) { var e = t . getBoundingClientRect ( ) , n = document . body , i = document . documentElement , a = window . pageYOffset || i . scrollTop || n . scrollTop , s = window . pageXOffset || i . scrollLeft || n . scrollLeft , r = i . clientTop || n . clientTop || 0 , o = i . clientLeft || n . clientLeft || 0 , d = e . top + a - r , l = e . left + s - o ; return { top : Math . round ( d ) , left : Math . round ( l ) } } function getOffset ( t ) { return t . getBoundingClientRect ? getOffsetRect ( t ) : getOffsetSum ( t ) } function convertStringToBoolean ( t ) { switch ( "string" == typeof t && ( t = t . toLowerCase ( ) ) , t ) { case "1" : case "true" : case "yes" : case "y" : case 1 : case ! 0 : return ! 0 ;
default : return ! 1 } } function getUrlSymbol ( t ) { return - 1 != t . indexOf ( "?" ) ? "&" : "?" } function dhtmlDragAndDropObject ( ) { return window . dhtmlDragAndDrop ? window . dhtmlDragAndDrop : ( this . lastLanding = 0 , this . dragNode = 0 , this . dragStartNode = 0 , this . dragStartObject = 0 , this . tempDOMU = null , this . tempDOMM = null , this . waitDrag = 0 , window . dhtmlDragAndDrop = this , this ) } function _dhtmlxError ( ) { return this . catches || ( this . catches = [ ] ) , this } function dhtmlXHeir ( t , e ) { for ( var n in e ) "function" == typeof e [ n ] && ( t [ n ] = e [ n ] ) ; return t } 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 ( e ) { this . dragStart ( t , e ) } , 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 . post _delim = "_" , this . _waitMode = 0 , this . _in _progress = { } , this . _invalid = { } , this . mandatoryFields = [ ] , this . messages = [ ] , this . styles = { updated : "font-weight:bold;" , inserted : "font-weight:bold;" , deleted : "text-decoration : line-through;" , invalid : "background-color:FFE0E0;" , invalid _cell : "border-bottom:2px solid red;" , error : "color:red;" , clear : "font-weight:normal;text-decoration:none;" } , this . enableUTFencoding ( ! 0 ) , dhtmlxEventable ( this ) , this
} window . dhtmlx || ( dhtmlx = function ( t ) { for ( var e in t ) dhtmlx [ e ] = t [ e ] ; return dhtmlx } ) , dhtmlx . extend _api = function ( t , e , n ) { var i = window [ t ] ; i && ( window [ t ] = function ( t ) { var n ; if ( t && "object" == typeof t && ! t . tagName ) { n = i . apply ( this , e . _init ? e . _init ( t ) : arguments ) ; for ( var a in dhtmlx ) e [ a ] && this [ e [ a ] ] ( dhtmlx [ a ] ) ; for ( var a in t ) e [ a ] ? this [ e [ a ] ] ( t [ a ] ) : 0 === a . indexOf ( "on" ) && this . attachEvent ( a , t [ a ] ) } else n = i . apply ( this , arguments ) ; return e . _patch && e . _patch ( this ) , n || this } , window [ t ] . prototype = i . prototype , n && dhtmlXHeir ( window [ t ] . prototype , n ) )
} , dhtmlxAjax = { get : function ( t , e ) { var n = new dtmlXMLLoaderObject ( ! 0 ) ; return n . async = arguments . length < 3 , n . waitCall = e , n . loadXML ( t ) , n } , post : function ( t , e , n ) { var i = new dtmlXMLLoaderObject ( ! 0 ) ; return i . async = arguments . length < 4 , i . waitCall = n , i . loadXML ( t , ! 0 , e ) , i } , getSync : function ( t ) { return this . get ( t , null , ! 0 ) } , postSync : function ( t , e ) { return this . post ( t , e , null , ! 0 ) } } , dtmlXMLLoaderObject . count = 0 , dtmlXMLLoaderObject . prototype . waitLoadFunction = function ( t ) { var e = ! 0 ; return this . check = function ( ) { if ( t && t . onloadAction && ( ! t . xmlDoc . readyState || 4 == t . xmlDoc . readyState ) ) { if ( ! e ) return ;
e = ! 1 , dtmlXMLLoaderObject . count ++ , "function" == typeof t . onloadAction && t . onloadAction ( t . mainObject , null , null , null , t ) , t . waitCall && ( t . waitCall . call ( this , t ) , t . waitCall = null ) } } , this . check } , dtmlXMLLoaderObject . prototype . getXMLTopNode = function ( t , e ) { var n ; if ( this . xmlDoc . responseXML ) { var i = this . xmlDoc . responseXML . getElementsByTagName ( t ) ; if ( 0 === i . length && - 1 != t . indexOf ( ":" ) ) var i = this . xmlDoc . responseXML . getElementsByTagName ( t . split ( ":" ) [ 1 ] ) ; n = i [ 0 ] } else n = this . xmlDoc . documentElement ; if ( n ) return this . _retry = ! 1 , n ;
if ( ! this . _retry && _isIE ) { this . _retry = ! 0 ; var e = this . xmlDoc ; return this . loadXMLString ( this . xmlDoc . responseText . replace ( /^[\s]+/ , "" ) , ! 0 ) , this . getXMLTopNode ( t , e ) } return dhtmlxError . throwError ( "LoadXML" , "Incorrect XML" , [ e || this . xmlDoc , this . mainObject ] ) , document . createElement ( "DIV" ) } , dtmlXMLLoaderObject . prototype . loadXMLString = function ( t , e ) { if ( _isIE ) this . xmlDoc = new ActiveXObject ( "Microsoft.XMLDOM" ) , this . xmlDoc . async = this . async , this . xmlDoc . onreadystatechange = function ( ) { } , this . xmlDoc . loadXML ( t ) ; else { var n = new DOMParser ;
this . xmlDoc = n . parseFromString ( t , "text/xml" ) } e || ( this . onloadAction && this . onloadAction ( this . mainObject , null , null , null , this ) , this . waitCall && ( this . waitCall ( ) , this . waitCall = null ) ) } , dtmlXMLLoaderObject . prototype . loadXML = function ( t , e , n , i ) { this . rSeed && ( t += ( - 1 != t . indexOf ( "?" ) ? "&" : "?" ) + "a_dhx_rSeed=" + ( new Date ) . valueOf ( ) ) , this . filePath = t , this . xmlDoc = ! _isIE && window . XMLHttpRequest ? new XMLHttpRequest : new ActiveXObject ( "Microsoft.XMLHTTP" ) , this . async && ( this . xmlDoc . onreadystatechange = new this . waitLoadFunction ( this ) ) , this . xmlDoc . open ( e ? "POST" : "GET" , t , this . async ) , i ? ( this . xmlDoc . setRequestHeader ( "User-Agent" , "dhtmlxRPC v0.1 (" + navigator . userAgent + ")" ) , this . xmlDoc . setRequestHeader ( "Content-type" , "text/xml" ) ) : e && this . xmlDoc . setRequestHeader ( "Content-type" , "application/x-www-form-urlencoded" ) , this . xmlDoc . setRequestHeader ( "X-Requested-With" , "XMLHttpRequest" ) , this . xmlDoc . send ( null || n ) , this . async || new this . waitLoadFunction ( this ) ( )
} , dtmlXMLLoaderObject . prototype . destructor = function ( ) { return this . _filterXPath = null , this . _getAllNamedChilds = null , this . _retry = null , this . async = null , this . rSeed = null , this . filePath = null , this . onloadAction = null , this . mainObject = null , this . xmlDoc = null , this . doXPath = null , this . doXPathOpera = null , this . doXSLTransToObject = null , this . doXSLTransToString = null , this . loadXML = null , this . loadXMLString = null , this . doSerialization = null , this . xmlNodeToJSON = null , this . getXMLTopNode = null , this . setXSLParamValue = null , null } , dtmlXMLLoaderObject . prototype . xmlNodeToJSON = function ( t ) { for ( var e = { } , n = 0 ; n < t . attributes . length ; n ++ ) e [ t . attributes [ n ] . name ] = t . attributes [ n ] . value ;
e . _tagvalue = t . firstChild ? t . firstChild . nodeValue : "" ; for ( var n = 0 ; n < t . childNodes . length ; n ++ ) { var i = t . childNodes [ n ] . tagName ; i && ( e [ i ] || ( e [ i ] = [ ] ) , e [ i ] . push ( this . xmlNodeToJSON ( t . childNodes [ n ] ) ) ) } return e } , dhtmlDragAndDropObject . prototype . removeDraggableItem = function ( t ) { t . onmousedown = null , t . dragStarter = null , t . dragLanding = null } , dhtmlDragAndDropObject . prototype . addDraggableItem = function ( t , e ) { t . onmousedown = this . preCreateDragCopy , t . dragStarter = e , this . addDragLanding ( t , e ) } , dhtmlDragAndDropObject . prototype . addDragLanding = function ( t , e ) { t . dragLanding = e
} , dhtmlDragAndDropObject . prototype . preCreateDragCopy = function ( t ) { return ! t && ! window . event || 2 != ( t || event ) . button ? window . dhtmlDragAndDrop . waitDrag ? ( window . dhtmlDragAndDrop . waitDrag = 0 , document . body . onmouseup = window . dhtmlDragAndDrop . tempDOMU , document . body . onmousemove = window . dhtmlDragAndDrop . tempDOMM , ! 1 ) : ( window . dhtmlDragAndDrop . dragNode && window . dhtmlDragAndDrop . stopDrag ( t ) , window . dhtmlDragAndDrop . waitDrag = 1 , window . dhtmlDragAndDrop . tempDOMU = document . body . onmouseup , window . dhtmlDragAndDrop . tempDOMM = document . body . onmousemove , window . dhtmlDragAndDrop . dragStartNode = this , w indow . dhtmlDragAndDrop . dragStartObject = this . dragStarter , document . body . onmouseup = window . dhtmlDragAndDrop . preCreateDragCopy , document . body . onmousemove = window . dhtmlDragAndDrop . callDrag , window . dhtmlDragAndDrop . downtime = ( new Date ) . valueOf ( ) , t && t . preventDefault ? ( t . preventDefault ( ) , ! 1 ) : ! 1 ) : void 0
} , dhtmlDragAndDropObject . prototype . callDrag = function ( t ) { t || ( t = window . event ) ; var e = window . dhtmlDragAndDrop ; if ( ! ( ( new Date ) . valueOf ( ) - e . downtime < 100 ) ) { if ( ! e . dragNode ) { if ( ! e . waitDrag ) return e . stopDrag ( t , ! 0 ) ; if ( e . dragNode = e . dragStartObject . _createDragNode ( e . dragStartNode , t ) , ! e . dragNode ) return e . stopDrag ( ) ; e . dragNode . onselectstart = function ( ) { return ! 1 } , e . gldragNode = e . dragNode , document . body . appendChild ( e . dragNode ) , document . body . onmouseup = e . stopDrag , e . waitDrag = 0 , e . dragNode . pWindow = window , e . initFrameRoute ( )
} if ( e . dragNode . parentNode != window . document . body && e . gldragNode ) { var n = e . gldragNode ; e . gldragNode . old && ( n = e . gldragNode . old ) , n . parentNode . removeChild ( n ) ; var i = e . dragNode . pWindow ; if ( n . pWindow && n . pWindow . dhtmlDragAndDrop . lastLanding && n . pWindow . dhtmlDragAndDrop . lastLanding . dragLanding . _dragOut ( n . pWindow . dhtmlDragAndDrop . lastLanding ) , _isIE ) { var a = document . createElement ( "Div" ) ; a . innerHTML = e . dragNode . outerHTML , e . dragNode = a . childNodes [ 0 ] } else e . dragNode = e . dragNode . cloneNode ( ! 0 ) ; e . dragNode . pWindow = window , e . gldragNode . old = e . dragNode , document . body . appendChild ( e . dragNode ) , i . dhtmlDragAndDrop . dragNode = e . dragNode
} e . dragNode . style . left = t . clientX + 15 + ( e . fx ? - 1 * e . fx : 0 ) + ( document . body . scrollLeft || document . documentElement . scrollLeft ) + "px" , e . dragNode . style . top = t . clientY + 3 + ( e . fy ? - 1 * e . fy : 0 ) + ( document . body . scrollTop || document . documentElement . scrollTop ) + "px" ; var s ; s = t . srcElement ? t . srcElement : t . target , e . checkLanding ( s , t ) } } , dhtmlDragAndDropObject . prototype . calculateFramePosition = function ( t ) { if ( window . name ) { for ( var e = parent . frames [ window . name ] . frameElement . offsetParent , n = 0 , i = 0 ; e ; ) n += e . offsetLeft , i += e . offsetTop , e = e . offsetParent ;
if ( parent . dhtmlDragAndDrop ) { var a = parent . dhtmlDragAndDrop . calculateFramePosition ( 1 ) ; n += 1 * a . split ( "_" ) [ 0 ] , i += 1 * a . split ( "_" ) [ 1 ] } if ( t ) return n + "_" + i ; this . fx = n , this . fy = i } return "0_0" } , dhtmlDragAndDropObject . prototype . checkLanding = function ( t , e ) { t && t . dragLanding ? ( this . lastLanding && this . lastLanding . dragLanding . _dragOut ( this . lastLanding ) , this . lastLanding = t , this . lastLanding = this . lastLanding . dragLanding . _dragIn ( this . lastLanding , this . dragStartNode , e . clientX , e . clientY , e ) , this . lastLanding _scr = _isIE ? e . srcElement : e . target ) : t && "BODY" != t . tagName ? this . checkLanding ( t . parentNode , e ) : ( this . lastLanding && this . lastLanding . dragLanding . _dragOut ( this . lastLanding , e . clientX , e . clientY , e ) , this . lastLanding = 0 , this . _onNotFound && this . _onNotFound ( ) )
} , dhtmlDragAndDropObject . prototype . stopDrag = function ( t , e ) { var n = window . dhtmlDragAndDrop ; if ( ! e ) { n . stopFrameRoute ( ) ; var i = n . lastLanding ; n . lastLanding = null , i && i . dragLanding . _drag ( n . dragStartNode , n . dragStartObject , i , _isIE ? event . srcElement : t . target ) } n . lastLanding = null , n . dragNode && n . dragNode . parentNode == document . body && n . dragNode . parentNode . removeChild ( n . dragNode ) , n . dragNode = 0 , n . gldragNode = 0 , n . fx = 0 , n . fy = 0 , n . dragStartNode = 0 , n . dragStartObject = 0 , document . body . onmouseup = n . tempDOMU , document . body . onmousemove = n . tempDOMM , n . tempDOMU = null , n . tempDOMM = null , n . waitDrag = 0
} , dhtmlDragAndDropObject . prototype . stopFrameRoute = function ( t ) { t && window . dhtmlDragAndDrop . stopDrag ( 1 , 1 ) ; for ( var e = 0 ; e < window . frames . length ; e ++ ) try { window . frames [ e ] != t && window . frames [ e ] . dhtmlDragAndDrop && window . frames [ e ] . dhtmlDragAndDrop . stopFrameRoute ( window ) } catch ( n ) { } try { parent . dhtmlDragAndDrop && parent != window && parent != t && parent . dhtmlDragAndDrop . stopFrameRoute ( window ) } catch ( n ) { } } , dhtmlDragAndDropObject . prototype . initFrameRoute = function ( t , e ) { t && ( window . dhtmlDragAndDrop . preCreateDragCopy ( ) , window . dhtmlDragAndDrop . dragStartNode = t . dhtmlDragAndDrop . dragStartNode , window . dhtmlDragAndDrop . dragStartObject = t . dhtmlDragAndDrop . dragStartObject , window . dhtmlDragAndDrop . dragNode = t . dhtmlDragAndDrop . dragNode , window . dhtmlDragAndDrop . gldragNode = t . dhtmlDragAndDrop . dragNode , window . document . body . onmouseup = window . dhtmlDragAndDrop . stopDrag , window . waitDrag = 0 , ! _isIE && e && ( ! _isFF || 1.8 > _FFrv ) && window . dhtmlDragAndDrop . calculateFramePosition ( ) ) ;
try { parent . dhtmlDragAndDrop && parent != window && parent != t && parent . dhtmlDragAndDrop . initFrameRoute ( window ) } catch ( n ) { } for ( var i = 0 ; i < window . frames . length ; i ++ ) try { window . frames [ i ] != t && window . frames [ i ] . dhtmlDragAndDrop && window . frames [ i ] . dhtmlDragAndDrop . initFrameRoute ( window , ! t || e ? 1 : 0 ) } catch ( n ) { } } , _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" ) || "BackCompat" == document . compatMode || ( _isIE = 8 ) ) : "Netscape" == navigator . appName && - 1 != navigator . userAgent . indexOf ( "Trident" ) ? _isIE = 8 : ( _isFF = ! 0 , _FFrv = parseFloat ( navigator . userAgent . split ( "rv:" ) [ 1 ] ) ) , dtmlXMLLoaderObject . prototype . doXPath = function ( t , e , n , i ) { if ( _isKHTML || ! _isIE && ! window . XPathResult ) return this . doXPathOpera ( t , e ) ;
if ( _isIE ) return e || ( e = this . xmlDoc . nodeName ? this . xmlDoc : this . xmlDoc . responseXML ) , e || dhtmlxError . throwError ( "LoadXML" , "Incorrect XML" , [ e || this . xmlDoc , this . mainObject ] ) , n && e . setProperty ( "SelectionNamespaces" , "xmlns:xsl='" + n + "'" ) , "single" == i ? e . selectSingleNode ( t ) : e . selectNodes ( t ) || new Array ( 0 ) ; var a = e ; e || ( e = this . xmlDoc . nodeName ? this . xmlDoc : this . xmlDoc . responseXML ) , e || dhtmlxError . throwError ( "LoadXML" , "Incorrect XML" , [ e || this . xmlDoc , this . mainObject ] ) , - 1 != e . nodeName . indexOf ( "document" ) ? a = e : ( a = e , e = e . ownerDocument ) ;
var s = XPathResult . ANY _TYPE ; "single" == i && ( s = XPathResult . FIRST _ORDERED _NODE _TYPE ) ; var r = [ ] , o = e . evaluate ( t , a , function ( ) { return n } , s , null ) ; if ( s == XPathResult . FIRST _ORDERED _NODE _TYPE ) return o . singleNodeValue ; for ( var d = o . iterateNext ( ) ; d ; ) r [ r . length ] = d , d = o . iterateNext ( ) ; return r } , _dhtmlxError . prototype . catchError = function ( t , e ) { this . catches [ t ] = e } , _dhtmlxError . prototype . throwError = function ( t , e , n ) { return this . catches [ t ] ? this . catches [ t ] ( t , e , n ) : this . catches . ALL ? this . catches . ALL ( t , e , n ) : ( window . alert ( "Error type: " + arguments [ 0 ] + "\nDescription: " + arguments [ 1 ] ) , null )
} , window . dhtmlxError = new _dhtmlxError , dtmlXMLLoaderObject . prototype . doXPathOpera = function ( t , e ) { var n = t . replace ( /[\/]+/gi , "/" ) . split ( "/" ) , i = null , a = 1 ; if ( ! n . length ) return [ ] ; if ( "." == n [ 0 ] ) i = [ e ] ; else { if ( "" !== n [ 0 ] ) return [ ] ; i = ( this . xmlDoc . responseXML || this . xmlDoc ) . getElementsByTagName ( n [ a ] . replace ( /\[[^\]]*\]/g , "" ) ) , a ++ } for ( a ; a < n . length ; a ++ ) i = this . _getAllNamedChilds ( i , n [ a ] ) ; return - 1 != n [ a - 1 ] . indexOf ( "[" ) && ( i = this . _filterXPath ( i , n [ a - 1 ] ) ) , i } , dtmlXMLLoaderObject . prototype . _filterXPath = function ( t , e ) { for ( var n = [ ] , e = e . replace ( /[^\[]*\[\@/g , "" ) . replace ( /[\[\]\@]*/g , "" ) , i = 0 ; i < t . length ; i ++ ) t [ i ] . getAttribute ( e ) && ( n [ n . length ] = t [ i ] ) ;
return n } , dtmlXMLLoaderObject . prototype . _getAllNamedChilds = function ( t , e ) { var n = [ ] ; _isKHTML && ( e = e . toUpperCase ( ) ) ; for ( var i = 0 ; i < t . length ; i ++ ) for ( var a = 0 ; a < t [ i ] . childNodes . length ; a ++ ) _isKHTML ? t [ i ] . childNodes [ a ] . tagName && t [ i ] . childNodes [ a ] . tagName . toUpperCase ( ) == e && ( n [ n . length ] = t [ i ] . childNodes [ a ] ) : t [ i ] . childNodes [ a ] . tagName == e && ( n [ n . length ] = t [ i ] . childNodes [ a ] ) ; return n } , dtmlXMLLoaderObject . prototype . xslDoc = null , dtmlXMLLoaderObject . prototype . setXSLParamValue = function ( t , e , n ) { n || ( n = this . xslDoc ) , n . responseXML && ( n = n . responseXML ) ;
var i = this . doXPath ( "/xsl:stylesheet/xsl:variable[@name='" + t + "']" , n , "http://www.w3.org/1999/XSL/Transform" , "single" ) ; i && ( i . firstChild . nodeValue = e ) } , dtmlXMLLoaderObject . prototype . doXSLTransToObject = function ( t , e ) { t || ( t = this . xslDoc ) , t . responseXML && ( t = t . responseXML ) , e || ( e = this . xmlDoc ) , e . responseXML && ( e = e . responseXML ) ; var n ; if ( _isIE ) { n = new ActiveXObject ( "Msxml2.DOMDocument.3.0" ) ; try { e . transformNodeToObject ( t , n ) } catch ( i ) { n = e . transformNode ( t ) } } else this . XSLProcessor || ( this . XSLProcessor = new XSLTProcessor , this . XSLProcessor . importStylesheet ( t ) ) , n = this . XSLProcessor . transformToDocument ( e ) ;
return n } , dtmlXMLLoaderObject . prototype . doXSLTransToString = function ( t , e ) { var n = this . doXSLTransToObject ( t , e ) ; return "string" == typeof n ? n : this . doSerialization ( n ) } , dtmlXMLLoaderObject . prototype . doSerialization = function ( t ) { if ( t || ( t = this . xmlDoc ) , t . responseXML && ( t = t . responseXML ) , _isIE ) return t . xml ; var e = new XMLSerializer ; return e . serializeToString ( t ) } , dhtmlxEventable = function ( obj ) { 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 t = "ev_" + t . toLowerCase ( ) , this [ t ] ? this [ t ] . apply ( this , e ) : ! 0 } , 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 } 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 ( ":" ) ;
this [ e [ 0 ] ] . removeEvent ( e [ 1 ] ) } } , obj . detachAllEvents = function ( ) { for ( var t in this ) 0 === t . indexOf ( "ev_" ) && ( this . detachEvent ( t ) , this [ t ] = null ) } , obj = null } , window . dhtmlx || ( window . dhtmlx = { } ) , function ( ) { function t ( t , e ) { var i = t . callback ; n ( ! 1 ) , t . box . parentNode . removeChild ( t . box ) , c = t . box = null , i && i ( e ) } function e ( e ) { if ( c ) { e = e || event ; var n = e . which || event . keyCode ; return dhtmlx . message . keyboard && ( ( 13 == n || 32 == n ) && t ( c , ! 0 ) , 27 == n && t ( c , ! 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" } function i ( t , e ) { var n = "dhtmlx_" + t . toLowerCase ( ) . replace ( / /g , "_" ) + "_button" ; return "<div class='dhtmlx_popup_button " + n + "' result='" + e + "' ><div>" + t + "</div></div>" } function a ( t ) { g . area || ( g . area = document . createElement ( "DIV" ) , g . area . className = "dhtmlx_message_area" , g . area . style [ g . position ] = "5px" , document . body . appendChild ( g . area ) ) , g . hide ( t . id ) ; var e = document . createElement ( "DIV" ) ; return e . innerHTML = "<div>" + t . text + "</div>" , e . className = "dhtmlx-info dhtmlx-" + t . type , e . onclick = function ( ) { g . hide ( t . id ) , t = null
} , "bottom" == g . position && g . area . firstChild ? g . area . insertBefore ( e , g . area . firstChild ) : g . area . appendChild ( e ) , t . expire > 0 && ( g . timers [ t . id ] = window . setTimeout ( function ( ) { g . hide ( t . id ) } , t . expire ) ) , g . pull [ t . id ] = e , e = null , t . id } function s ( e , n , a ) { 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 += '<div class="dhtmlx_popup_title">' + e . title + "</div>" ) , r += '<div class="dhtmlx_popup_text"><span>' + ( e . content ? "" : e . text ) + '</span></div><div class="dhtmlx_popup_controls">' , n && ( r += i ( e . ok || "OK" , ! 0 ) ) , a && ( r += i ( e . cancel || "Cancel" , ! 1 ) ) , e . buttons ) for ( var o = 0 ; o < e . buttons . length ; o ++ ) r += i ( e . buttons [ o ] , o ) ;
if ( r += "</div>" , s . innerHTML = r , e . content ) { var d = e . content ; "string" == typeof d && ( d = document . getElementById ( d ) ) , "none" == d . style . display && ( d . style . display = "" ) , s . childNodes [ e . title ? 1 : 0 ] . appendChild ( d ) } return s . onclick = function ( n ) { n = n || event ; var i = n . target || n . srcElement ; if ( i . className || ( i = i . parentNode ) , "dhtmlx_popup_button" == i . className . split ( " " ) [ 0 ] ) { var a = i . getAttribute ( "result" ) ; a = "true" == a || ( "false" == a ? ! 1 : a ) , t ( e , a ) } } , e . box = s , ( n || a ) && ( c = e ) , s } function r ( t , i , a ) { var r = t . tagName ? t : s ( t , i , a ) ; t . hidden || n ( ! 0 ) , document . body . appendChild ( r ) ;
var o = Math . abs ( Math . floor ( ( ( window . innerWidth || document . documentElement . offsetWidth ) - r . offsetWidth ) / 2 ) ) , d = Math . abs ( Math . floor ( ( ( window . innerHeight || document . documentElement . offsetHeight ) - r . offsetHeight ) / 2 ) ) ; return r . style . top = "top" == t . position ? "-3px" : d + "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 d ( t ) { return r ( t , ! 0 , ! 0 ) } function l ( 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 } ) , t
} function h ( t , e , n , i ) { return "object" != typeof t && ( t = { text : t , type : e , expire : n , id : i } ) , t . id = t . id || g . uid ( ) , t . expire = t . expire || g . expire , t } var c = 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" , d ( t ) } , dhtmlx . modalbox = function ( ) { var t = _ . apply ( this , arguments ) ; return t . type = t . type || "alert" , l ( t )
} , dhtmlx . modalbox . hide = function ( t ) { for ( ; t && t . getAttribute && ! t . getAttribute ( "dhxbox" ) ; ) t = t . parentNode ; t && ( t . parentNode . removeChild ( t ) , n ( ! 1 ) ) } ; var g = dhtmlx . message = function ( t ) { t = h . apply ( this , arguments ) , t . type = t . type || "info" ; var e = t . type . split ( "-" ) [ 0 ] ; switch ( e ) { case "alert" : return o ( t ) ; case "confirm" : return d ( t ) ; case "modalbox" : return l ( t ) ; default : return a ( t ) } } ; g . seed = ( new Date ) . valueOf ( ) , g . uid = function ( ) { return g . seed ++ } , g . expire = 4e3 , g . keyboard = ! 0 , g . position = "top" , g . pull = { } , g . timers = { } , g . hideAll = function ( ) { for ( var t in g . pull ) g . hide ( t )
} , g . hide = function ( t ) { var e = g . pull [ t ] ; e && e . parentNode && ( window . setTimeout ( function ( ) { e . parentNode . removeChild ( e ) , e = null } , 2e3 ) , e . className += " hidden" , g . timers [ t ] && window . clearTimeout ( g . timers [ t ] ) , delete g . pull [ t ] ) } } ( ) , gantt = { version : "2.1.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 ) } , 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 } 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 ( ":" ) ; 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 , i ; if ( t && "object" == typeof t ) { for ( i = { } , n = [ Array , Date , Number , String , Boolean ] , e = 0 ; e < n . length ; e ++ ) t instanceof n [ e ] && ( i = e ? new n [ e ] ( t ) : new n [ e ] ) ; for ( e in t ) Object . prototype . hasOwnProperty . apply ( t , [ e ] ) && ( i [ e ] = dhtmlx . copy ( t [ e ] ) ) } return i || t } , dhtmlx . mixin = function ( t , e , n ) { for ( var i in e ) ( ! t [ i ] || n ) && ( t [ i ] = e [ i ] ) ;
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 ) { return function ( ) { return t . apply ( e , arguments ) } } , gantt . _get _position = function ( t ) { var e = 0 , n = 0 ; if ( t . getBoundingClientRect ) { var i = t . getBoundingClientRect ( ) , a = document . body , s = document . documentElement , r = window . pageYOffset || s . scrollTop || a . scrollTop , o = window . pageXOffset || s . scrollLeft || a . scrollLeft , d = s . clientTop || a . clientTop || 0 , l = s . clientLeft || a . clientLeft || 0 ;
return e = i . top + r - d , n = i . left + o - l , { y : Math . round ( e ) , x : Math . round ( n ) , width : t . offsetWidth , height : t . offsetHeight } } 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" ) ; 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 } , dhtmlxEventable ( gantt ) , 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 ) ; if ( null !== n ) { var i = ! gantt . checkEvent ( "onTaskClick" ) || gantt . callEvent ( "onTaskClick" , [ n , t ] ) ; i && gantt . config . select _task && gantt . selectTask ( n ) } else gantt . callEvent ( "onEmptyClick" , [ t ] ) ; gantt . _find _ev _handler ( t , e , gantt . _click , n ) } , gantt . _on _contextmenu = function ( t ) { t = t || window . event ; var e = t . target || t . srcElement , n = gantt . locate ( e ) , i = gantt . locate ( e , gantt . config . link _attribute ) , a = ! gantt . checkEvent ( "onContextMenu" ) || gantt . callEvent ( "onContextMenu" , [ n , i , t ] ) ;
return a || t . preventDefault ( ) , a } , gantt . _find _ev _handler = function ( t , e , n , i ) { for ( var a = ! 0 ; e && e . parentNode ; ) { var s = e . className ; if ( s ) { s = s . split ( " " ) ; for ( var r = 0 ; r < s . length ; r ++ ) s [ r ] && n [ s [ r ] ] && ( a = n [ s [ r ] ] . call ( gantt , t , i , e ) , a = ! ( "undefined" != typeof a && a !== ! 0 ) ) } e = e . parentNode } return a } , gantt . _on _dblclick = function ( t ) { t = t || window . event ; var e = t . target || t . srcElement , n = gantt . locate ( t ) , i = gantt . _find _ev _handler ( t , e , gantt . _dbl _click , n ) ; if ( i && null !== n ) { var a = ! gantt . checkEvent ( "onTaskDblClick" ) || gantt . callEvent ( "onTaskDblClick" , [ n , t ] ) ;
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 = { 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 ) } , this ) , i = ( 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 ) ) , a = dhtmlx . bind ( function ( ) { return dhtmlxDetachEvent ( document . body , "mousemove" , i ) , dhtmlxDetachEvent ( document . body , "mouseup" , a ) , this . dragEnd ( t ) } , this ) ; dhtmlxEvent ( document . body , "mousemove" , i ) , dhtmlxEvent ( document . body , "mouseup" , a ) , document . body . className += " gantt_noselect" } , dragMove : function ( t , e ) { if ( ! this . config . marker && ! this . config . started ) { var n = this . getPosition ( e ) , i = n . x - this . config . pos . x , a = n . y - this . config . pos . y , s = Math . sqrt ( Math . pow ( Math . abs ( i ) , 2 ) + Math . pow ( Math . abs ( a ) , 2 ) ) ;
if ( s > this . config . sensitivity ) { if ( this . config . started = ! 0 , this . config . ignore = ! 1 , this . callEvent ( "onBeforeDragStart" , [ t , e ] ) === ! 1 ) return this . config . ignore = ! 0 , ! 0 ; var r = this . config . marker = document . createElement ( "div" ) ; r . className = "gantt_drag_marker" , r . innerHTML = "Dragging object" , document . body . appendChild ( r ) , this . callEvent ( "onAfterDragStart" , [ t , e ] ) } 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 , 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 ) { this . close ( e ) } , this ) , this . _click . gantt _open = dhtmlx . bind ( function ( t , e ) { this . open ( e ) } , this ) , this . _click . gantt _row = dhtmlx . bind ( function ( t , e , n ) { if ( null !== e ) { var i = this . getTaskNode ( e ) , a = Math . max ( i . offsetLeft - this . config . task _scroll _offset , 0 ) ; this . scrollTo ( a ) , this . callEvent ( "onTaskRowClick" , [ e , n ] ) } } , this ) , this . _click . gantt _grid _head _cell = dhtmlx . bind ( function ( t , e , n ) { var i = n . getAttribute ( "column_id" ) ; if ( this . callEvent ( "onGridHeaderClick" , [ i , t ] ) ) if ( "add" == i ) this . _click . gantt _add ( t , this . config . root _id ) ;
else if ( this . config . sort ) { var a = this . _sort && this . _sort . direction && this . _sort . name == i ? this . _sort . direction : "desc" ; a = "desc" == a ? "asc" : "desc" , this . _sort = { name : i , direction : a } , this . _render _grid _header ( ) , this . sort ( i , "desc" == a ) } } , 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 = e ? this . getTask ( e ) : ! 1 , i = "" ; if ( n ) i = n . start _date ; else { var a = this . _order [ 0 ] ; i = a ? this . getTask ( a ) . start _date : this . getState ( ) . min _date } n && ( n . $open = ! 0 ) ;
var s = { text : gantt . locale . labels . new _task , start _date : this . templates . xml _format ( i ) , duration : 1 , progress : 0 , parent : e } ; s . id = dhtmlx . uid ( ) , this . callEvent ( "onTaskCreated" , [ s ] ) , this . config . details _on _create ? ( s . $new = ! 0 , this . _pull [ s . id ] = this . _init _task ( s ) , this . _add _branch ( s ) , s . $level = this . _item _level ( s ) , this . selectTask ( s . id ) , this . refreshData ( ) , this . showLightbox ( s . id ) ) : ( this . addTask ( s ) , this . showTask ( s . id ) , this . selectTask ( s . id ) ) } } , this ) } , gantt . _render _grid = function ( ) { this . _is _grid _visible ( ) && ( this . _calc _grid _width ( ) , this . _render _grid _header ( ) )
} , gantt . _calc _grid _width = function ( ) { if ( this . config . autofit ) { for ( var t = this . config . columns , e = 0 , n = [ ] , i = [ ] , a = 0 ; a < t . length ; a ++ ) { var s = parseInt ( t [ a ] . width , 10 ) ; window . isNaN ( s ) && ( s = 50 , n . push ( a ) ) , i [ a ] = s , e += s } { var r = this . _get _grid _width ( ) - e ; r / ( n . length > 0 ? n . length : i . length > 0 ? i . length : 1 ) } if ( n . length > 0 ) for ( var o = r / ( n . length ? n . length : 1 ) , a = 0 ; a < n . length ; a ++ ) { var d = n [ a ] ; i [ d ] += o } else for ( var o = r / ( i . length ? i . length : 1 ) , a = 0 ; a < i . length ; a ++ ) i [ a ] += o ; for ( var a = 0 ; a < i . length ; a ++ ) t [ a ] . width = i [ a ] } } , gantt . _render _grid _header = function ( ) { for ( var t = this . config . columns , e = [ ] , n = 0 , i = this . locale . labels , a = this . config . scale _height - 2 , s = 0 ; s < t . length ; s ++ ) { var r = s == t . length - 1 , o = t [ s ] ;
r && this . _get _grid _width ( ) > n + o . width && ( o . width = this . _get _grid _width ( ) - n ) , n += o . width ; var d = this . _sort && o . name == this . _sort . name ? "<div class='gantt_sort gantt_" + this . _sort . direction + "'></div>" : "" , l = [ "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;" , h = o . label || i [ "column_" + o . name ] ; h = h || "" ; var c = "<div class='" + l + "' style='" + _ + "' column_id='" + o . name + "'>" + h + d + "</div>" ; e . push ( c ) } this . $grid _scale . style . height = this . config . scale _height - 1 + "px" , this . $grid _scale . style . lineHeight = a + "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 . config . columns , n = [ ] , i = 0 ; i < e . length ; i ++ ) { var a , s , r = i == e . length - 1 , o = e [ i ] ; "add" == o . name && i == e . length - 1 ? s = "<div class='gantt_add'></div>" : ( s = o . template ? o . template ( t ) : t [ o . name ] , s instanceof Date && ( s = this . templates . date _grid ( s ) ) , s = "<div class='gantt_tree_content'>" + s + "</div>" ) ; var d = "gantt_cell" + ( r ? " gantt_last_cell" : "" ) , l = "" ; if ( o . tree ) { for ( var _ = 0 ; _ < t . $level ; _ ++ ) l += this . templates . grid _indent ( t ) ; var h = this . _branches [ t . id ] && this . _branches [ t . id ] . length > 0 ;
h ? ( l += this . templates . grid _open ( t ) , l += this . templates . grid _folder ( t ) ) : ( l += this . templates . grid _blank ( t ) , l += this . templates . grid _file ( t ) ) } var c = "width:" + ( o . width - ( r ? 1 : 0 ) ) + "px;" ; dhtmlx . defined ( o . align ) && ( c += "text-align:" + o . align + ";" ) , a = "<div class='" + d + "' style='" + c + "'>" + l + s + "</div>" , n . push ( a ) } var d = t . $index % 2 === 0 ? "" : " odd" ; if ( d += t . $transparent ? " gantt_transparent" : "" , this . templates . grid _row _class ) { var g = this . templates . grid _row _class . call ( this , t . start _date , t . end _date , t ) ; g && ( d += " " + g ) } this . getState ( ) . selected _task == t . id && ( d += " gantt_selected" ) ;
var u = document . createElement ( "div" ) ; return u . className = "gantt_row" + d , 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 ) { t && this . _pull [ t ] && ( this . _pull [ t ] . $open = e , 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 . getTaskIndex = function ( t ) { for ( var e = this . _branches [ this . getTask ( t ) . parent ] , n = 0 ; n < e . length ; n ++ ) if ( e [ n ] == t ) return n ; return - 1 } , gantt . getGlobalTaskIndex = function ( t ) { for ( var e = this . _order , n = 0 ; n < e . length ; n ++ ) if ( e [ n ] == t ) return n ; return - 1 } , gantt . moveTask = function ( t , e , n ) { var i = arguments [ 3 ] ; if ( i ) { if ( i === t ) return ;
n = this . getTask ( i ) . parent , e = this . getTaskIndex ( i ) } n = n || this . config . root _id ; var a = this . getTask ( t ) , s = ( this . _branches [ a . parent ] , this . _branches [ n ] ) ; if ( - 1 == e && ( e = s . length + 1 ) , a . parent == n ) { var r = this . getTaskIndex ( t ) ; if ( r == e ) return ; e > r && e -- } this . _replace _branch _child ( a . parent , t ) , s = this . _branches [ n ] ; var o = s [ e ] ; o ? s = s . slice ( 0 , e ) . concat ( [ t ] ) . concat ( s . slice ( e ) ) : s . push ( t ) , a . parent = n , this . _branches [ n ] = s , this . refreshData ( ) } , gantt . _init _dnd = function ( ) { var t = new dhtmlxDnD ( this . $grid _data , { 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 ) ;
if ( ! n ) return ! 1 ; this . hideQuickInfo && this . _hideQuickInfo ( ) ; var i = this . locate ( e ) ; return this . callEvent ( "onRowDragStart" , [ i , e . target || e . srcElement , e ] ) ? void 0 : ! 1 } , this ) ) , t . attachEvent ( "onAfterDragStart" , dhtmlx . bind ( function ( e , n ) { var i = this . _locateHTML ( n ) ; t . config . marker . innerHTML = i . outerHTML , t . config . id = this . locate ( n ) ; var a = this . getTask ( t . config . id ) ; a . $open = ! 1 , a . $transparent = ! 0 , this . refreshData ( ) } , this ) ) , t . lastTaskOfLevel = function ( t ) { for ( var e = gantt . _order , n = gantt . _pull , i = null , a = 0 , s = e . length ; s > a ; a ++ ) n [ e [ a ] ] . $level == t && ( i = n [ e [ a ] ] ) ;
return i ? i . id : null } , t . attachEvent ( "onDragMove" , dhtmlx . bind ( function ( e , n ) { var i = t . config , a = this . _get _position ( this . $grid _data ) , s = a . x + 10 , r = n . pos . y - 10 ; r < a . y && ( r = a . y ) , r > a . y + this . $grid _data . offsetHeight - this . config . row _height && ( r = a . y + this . $grid _data . offsetHeight - this . config . row _height ) , i . marker . style . left = s + "px" , i . marker . style . top = r + "px" ; var o = document . elementFromPoint ( a . x - document . body . scrollLeft + 1 , r - document . body . scrollTop ) , d = this . locate ( o ) , l = this . getTask ( t . config . id ) ; if ( this . isTaskExists ( d ) || ( d = t . lastTaskOfLevel ( l . $level ) , d == t . config . id && ( d = null ) ) , this . isTaskExists ( d ) ) { var _ = gantt . _get _position ( o ) , h = this . getTask ( d ) ;
if ( _ . y + o . offsetHeight / 2 < r ) { var c = this . getGlobalTaskIndex ( h . id ) , g = this . _pull [ this . _order [ c + 1 + ( h . id == l . id ? 1 : 0 ) ] ] ; if ( g ) { if ( g . id == l . id ) return ; h = g } else if ( g = this . _pull [ this . _order [ c ] ] , g . $level == l . $level ) return this . moveTask ( l . id , - 1 , g . parent ) , void ( i . target = "next:" + g . id ) } if ( h . $level == l . $level && l . id != h . id ) this . moveTask ( l . id , 0 , 0 , h . id ) , i . target = h . id ; else { if ( l . id == h . id ) return ; var c = this . getGlobalTaskIndex ( h . id ) , u = this . _pull [ this . _order [ c - 1 ] ] ; u && u . $level == l . $level && l . id != u . id && ( this . moveTask ( l . id , - 1 , u . parent ) , i . target = "next:" + u . id )
} } return ! 0 } , this ) ) , t . attachEvent ( "onDragEnd" , dhtmlx . bind ( function ( ) { this . getTask ( t . config . id ) . $transparent = ! 1 , this . refreshData ( ) , this . callEvent ( "onRowDragEnd" , [ t . config . id , t . config . target ] ) } , this ) ) } , gantt . _scale _helpers = { getSum : function ( t , e , n ) { void 0 === n && ( n = t . length - 1 ) , void 0 === e && ( e = 0 ) ; for ( var i = 0 , a = e ; n >= a ; a ++ ) i += t [ a ] ; return i } , setSumWidth : function ( t , e , n , i ) { var a = e . width ; void 0 === i && ( i = a . length - 1 ) , void 0 === n && ( n = 0 ) ; var s = i - n + 1 ; if ( ! ( n > a . length - 1 || 0 >= s || i > a . length - 1 ) ) { var r = this . getSum ( a , n , i ) , o = t - r ;
this . adjustSize ( o , a , n , i ) , this . adjustSize ( - o , a , i + 1 ) , e . full _width = this . getSum ( a ) } } , splitSize : function ( t , e ) { for ( var n = [ ] , i = 0 ; e > i ; i ++ ) n [ i ] = 0 ; return this . adjustSize ( t , n ) , n } , adjustSize : function ( t , e , n , i ) { n || ( n = 0 ) , void 0 === i && ( i = e . length - 1 ) ; for ( var a = i - n + 1 , s = this . getSum ( e , n , i ) , r = 0 , o = n ; i >= o ; o ++ ) { var d = Math . floor ( t * ( s ? e [ o ] / s : 1 / a ) ) ; s -= e [ o ] , t -= d , a -- , e [ o ] += d , r += d } e [ e . length - 1 ] += t } , 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 : - 1
} ) } , primaryScale : function ( ) { 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 , i ) { for ( var a = this . splitSize ( i , t . length ) , s = n , r = [ ] , o = t . length - 1 ; o >= 0 ; o -- ) { var d = o == t . length - 1 , l = this . initScaleConfig ( t [ o ] ) ; d && this . processIgnores ( l ) , this . initColSizes ( l , e , s , a [ o ] ) , this . limitVisibleRange ( l ) , d && ( s = l . full _width ) , r . unshift ( l ) } for ( var o = 0 ; o < r . length - 1 ; o ++ ) this . alineScaleColumns ( r [ r . length - 1 ] , r [ o ] ) ;
return r } , _ignore _time _config : function ( t ) { return this . config . skip _off _time ? ! this . isWorkTime ( t ) : ! 1 } , 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 } ; e = 0 ; for ( var i = 0 ; i < t . trace _x . length ; i ++ ) n . call ( gantt , t . trace _x [ i ] ) || this . _ignore _time _config . call ( gantt , t . trace _x [ i ] ) ? ( t . ignore _x [ t . trace _x [ i ] . valueOf ( ) ] = ! 0 , t . ignored _colls = ! 0 ) : e ++ } t . display _count = e } , initColSizes : function ( t , e , n , i ) { var a = n ; t . height = i ; var s = void 0 === t . display _count ? t . count : t . display _count ;
s || ( s = 1 ) , t . col _width = Math . floor ( a / s ) , e && t . col _width < e && ( t . col _width = e , a = 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 ( a - 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 , height : 0 , width : [ ] , 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 , i , a ) { for ( var s = e . trace _x , r = t . trace _x , o = n || 0 , d = i || r . length - 1 , l = 0 , _ = 1 ; _ < s . length ; _ ++ ) for ( var h = o ; d >= h ; h ++ ) + r [ h ] != + s [ _ ] || ( a && a . apply ( this , [ l , _ , o , h ] ) , o = h , l = _ ) } , alineScaleColumns : function ( t , e , n , i ) { this . iterateScales ( t , e , n , i , function ( n , i , a , s ) { var r = this . getSum ( t . width , a , s - 1 ) , o = this . getSum ( e . width , n , i - 1 ) ; o != r && this . setSumWidth ( r , e , n , i - 1 ) } ) } , eachColumn : function ( t , e , n ) { var i = new Date ( gantt . _min _date ) , a = new Date ( gantt . _max _date ) ; gantt . date [ t + "_start" ] && ( i = gantt . date [ t + "_start" ] ( i ) ) ;
for ( var s = new Date ( i ) ; + a > + s ; ) n . call ( this , new Date ( s ) ) , s = gantt . date . add ( s , e , t ) } , limitVisibleRange : function ( t ) { var e = t . trace _x , n = 0 , i = t . width . length - 1 , a = 0 ; if ( + e [ 0 ] < + gantt . _min _date && n != i ) { var s = Math . floor ( t . width [ 0 ] * ( ( e [ 1 ] - gantt . _min _date ) / ( e [ 1 ] - e [ 0 ] ) ) ) ; a += t . width [ 0 ] - s , t . width [ 0 ] = s , e [ 0 ] = new Date ( gantt . _min _date ) } var r = e . length - 1 , o = e [ r ] , d = gantt . date . add ( o , t . step , t . unit ) ; if ( + d > + gantt . _max _date && r > 0 ) { var s = t . width [ r ] - Math . floor ( t . width [ r ] * ( ( d - gantt . _max _date ) / ( d - o ) ) ) ; a += t . width [ r ] - s , t . width [ r ] = s } if ( a ) { for ( var l = this . getSum ( t . width ) , _ = 0 , h = 0 ; h < t . width . length ; h ++ ) { var c = Math . floor ( a * ( t . width [ h ] / l ) ) ;
t . width [ h ] += c , _ += c } this . adjustSize ( a - _ , t . width ) } } } , gantt . _tasks _dnd = { drag : null , _events : { before _start : { } , before _finish : { } , 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" , after _finish : "onAfterTaskDrag" } ; for ( var n in this . _events ) for ( var i in t ) this . _events [ n ] [ i ] = 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 ) } , 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 , pos : null , start _x : null , start _y : null , obj : null , left : null } } , _resize : function ( t , e , n ) { var i = gantt . config , a = this . _drag _task _coords ( t , n ) ; n . left ? ( t . start _date = gantt . _date _from _pos ( a . start + e ) , t . start _date || ( t . start _date = new Date ( gantt . getState ( ) . min _date ) ) ) : ( t . end _date = gantt . _date _from _pos ( a . end + e ) , t . end _date || ( t . end _date = new Date ( gantt . getState ( ) . max _date ) ) ) , t . end _date - t . start _date < i . 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 i = this . _drag _task _coords ( t , n ) , a = Math . max ( 0 , n . pos . x - i . start ) ; t . progress = Math . min ( 1 , a / ( i . end - i . start ) ) } , _move : function ( t , e , n ) { var i = this . _drag _task _coords ( t , n ) , a = gantt . _date _from _pos ( i . start + e ) , s = gantt . _date _from _pos ( i . end + e ) ; a ? s ? ( t . start _date = a , t . end _date = s ) : ( t . end _date = new Date ( gantt . getState ( ) . max _date ) , t . start _date = gantt . _date _from _pos ( gantt . posFromDate ( t . end _date ) - ( i . end - i . start ) ) ) : ( t . start _date = new Date ( gantt . getState ( ) . min _date ) , t . end _date = gantt . _date _from _pos ( gantt . posFromDate ( t . start _date ) + ( i . end - i . start ) ) )
} , _drag _task _coords : function ( t , e ) { var n = e . obj _s _x = e . obj _s _x || gantt . posFromDate ( t . start _date ) , i = e . obj _e _x = e . obj _e _x || gantt . posFromDate ( t . end _date ) ; return { start : n , end : i } } , 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 ) { 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 i = gantt . _date _from _pos ( n . x ) ; if ( ! i || isNaN ( i . getTime ( ) ) ) return ;
var a = n . x - e . start _x , s = gantt . getTask ( e . id ) ; if ( this . _handlers [ e . mode ] ) { var r = dhtmlx . mixin ( { } , s ) , o = dhtmlx . mixin ( { } , s ) ; this . _handlers [ e . mode ] . apply ( this , [ o , a , 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 && ! gantt . config . readonly && ! this . drag . mode ) { this . clear _drag _state ( ) , e = e || t . target || t . srcElement ; var n = gantt . _trim ( e . className || "" ) ;
if ( ! n || ! this . _get _drag _mode ( n ) ) return e . parentNode ? this . on _mouse _down ( t , e . parentNode ) : void 0 ; var i = this . _get _drag _mode ( n ) ; if ( i ) if ( i . mode && i . mode != gantt . config . drag _mode . ignore && gantt . config [ "drag_" + i . mode ] ) { var a = gantt . locate ( e ) , s = dhtmlx . copy ( gantt . getTask ( a ) || { } ) ; if ( gantt . _is _flex _task ( s ) && i . mode != gantt . config . drag _mode . progress ) return void this . clear _drag _state ( ) ; i . id = a ; var r = gantt . _get _mouse _pos ( t ) ; i . start _x = r . x , i . start _y = r . y , i . obj = s , this . drag . start _drag = i } else this . clear _drag _state ( ) ; else if ( gantt . checkEvent ( "onMouseDown" ) && gantt . callEvent ( "onMouseDown" , [ n . split ( " " ) [ 0 ] ] ) && e . parentNode ) return this . on _mouse _down ( t , e . parentNode )
} } , _fix _dnd _scale _time : function ( t , e ) { var n = gantt . _tasks . unit , i = gantt . _tasks . step ; gantt . config . round _dnd _dates || ( n = "minute" , i = gantt . config . time _step ) , e . mode == gantt . config . drag _mode . resize ? e . left ? t . start _date = gantt . _get _closest _date ( { date : t . start _date , unit : n , step : i } ) : t . end _date = gantt . _get _closest _date ( { date : t . end _date , unit : n , step : i } ) : e . mode == gantt . config . drag _mode . move && ( t . start _date = gantt . _get _closest _date ( { date : t . start _date , unit : n , step : i } ) , t . end _date = gantt . calculateEndDate ( t . start _date , t . duration , gantt . config . duration _unit ) )
} , _fix _working _times : function ( t , e ) { 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 , dir : "past" } ) : e . mode == gantt . config . drag _mode . move && ( gantt . isWorkTime ( t . start _date ) ? gantt . isWorkTime ( new Date ( + t . end _date - 1 ) ) || ( t . end _date = gantt . getClosestWorkTime ( { date : t . end _date , dir : "past" } ) , t . start _date = gantt . calculateEndDate ( t . end _date , - 1 * t . duration ) ) : ( t . start _date = gantt . getClosestWorkTime ( { date : t . start _date , dir : "future" } ) , t . end _date = gantt . calculateEndDate ( t . start _date , t . duration ) ) ) )
} , 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 i = e . id ; gantt . _init _task _timing ( n ) , gantt . updateTask ( n . id ) , this . _fireEvent ( "after_finish" , e . mode , [ i , e . mode , t ] ) , this . clear _drag _state ( ) } 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 ( " " ) , i = n [ 0 ] , a = { mode : null , left : null } ; switch ( i ) { case "gantt_task_line" : case "gantt_task_content" : a . mode = e . move ; break ; case "gantt_task_drag" : a . mode = e . resize , a . left = n [ 1 ] && - 1 !== n [ 1 ] . indexOf ( "left" , n [ 1 ] . length - "left" . length ) ? ! 0 : ! 1 ; break ; case "gantt_task_progress_drag" : a . mode = e . progress ; break ; case "gantt_link_control" : case "gantt_link_point" : a . mode = e . ignore ; break ; default : a = null } return a } , _start _dnd : function ( t ) { var e = this . drag = this . drag . start _drag ;
delete e . start _drag ; var n = gantt . config , i = e . id ; n [ "drag_" + e . mode ] && gantt . callEvent ( "onBeforeDrag" , [ i , e . mode , t ] ) && this . _fireEvent ( "before_start" , e . mode , [ i , e . mode , t ] ) ? delete e . start _drag : this . clear _drag _state ( ) } , _fireEvent : function ( t , e , n ) { dhtmlx . assert ( this . _events [ t ] , "Invalid stage:{" + t + "}" ) ; var i = this . _events [ t ] [ e ] ; return dhtmlx . assert ( i , "Unknown after drop mode:{" + e + "}" ) , dhtmlx . assert ( n , "Invalid event arguments" ) , gantt . checkEvent ( i ) ? gantt . callEvent ( i , n ) : ! 0 } } , gantt . _render _link = function ( t ) { var e = this . getLink ( t ) ;
gantt . _linkRenderer . render _item ( e , this . $task _links ) } , 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 , i ) { var a = null ; if ( a = "object" == typeof t ? t : { source : t , target : e , type : this . _get _link _type ( n , i ) } , ! a ) return ! 1 ; if ( ! ( a . source && a . target && a . type ) ) return ! 1 ; if ( a . source == a . target ) return ! 1 ; var s = ! 0 ;
return this . checkEvent ( "onLinkValidation" ) && ( s = this . callEvent ( "onLinkValidation" , [ a ] ) ) , s } , gantt . _render _link _element = function ( t ) { var e = this . _path _builder . get _points ( t ) , n = gantt . _drawer , i = n . get _lines ( e ) , a = document . createElement ( "div" ) , s = "gantt_task_link" , r = this . templates . link _class ? this . templates . link _class ( t ) : "" ; r && ( s += " " + r ) , a . className = s , a . setAttribute ( gantt . config . link _attribute , t . id ) ; for ( var o = 0 ; o < i . length ; o ++ ) o == i . length - 1 && ( i [ o ] . size -= gantt . config . link _arrow _size ) , a . appendChild ( n . render _line ( i [ o ] , i [ o + 1 ] ) ) ;
var d = i [ i . length - 1 ] . direction , l = gantt . _render _link _arrow ( e [ e . length - 1 ] , d ) ; return a . appendChild ( l ) , a } , gantt . _render _link _arrow = function ( t , e ) { var n = document . createElement ( "div" ) , i = gantt . _drawer , a = t . y , s = t . x , r = gantt . config . link _arrow _size , o = gantt . config . row _height , d = "gantt_link_arrow gantt_link_arrow_" + e ; switch ( e ) { case i . dirs . right : a -= ( r - o ) / 2 , s -= r ; break ; case i . dirs . left : a -= ( r - o ) / 2 ; break ; case i . dirs . up : s -= ( r - o ) / 2 ; break ; case i . dirs . down : a -= r , s -= ( r - o ) / 2 } return n . style . cssText = [ "top:" + a + "px" , "left:" + s + "px" ] . join ( ";" ) , n . className = d , n
} , gantt . _drawer = { current _pos : null , dirs : { left : "left" , right : "right" , up : "up" , down : "down" } , path : [ ] , clear : function ( ) { this . current _pos = null , this . path = [ ] } , point : function ( t ) { this . current _pos = dhtmlx . copy ( t ) } , get _lines : function ( t ) { 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 , i = this . _get _line ( n , e ) ; this . path . push ( i ) , this . current _pos = e } , get _path : function ( ) { return this . path } , get _wrapper _sizes : function ( t ) { var e , n = gantt . config . link _wrapper _width , i = ( gantt . config . link _line _width , t . y + ( gantt . config . row _height - n ) / 2 ) ;
switch ( t . direction ) { case this . dirs . left : e = { top : i , height : n , lineHeight : n , left : t . x - t . size - n / 2 , width : t . size + n } ; break ; case this . dirs . right : e = { top : i , lineHeight : n , height : n , left : t . x - n / 2 , width : t . size + n } ; break ; case this . dirs . up : e = { top : i - t . size , lineHeight : t . size + n , height : t . size + n , left : t . x - n / 2 , width : n } ; break ; case this . dirs . down : e = { top : i , lineHeight : t . size + n , height : t . size + n , left : t . x - n / 2 , width : n } } return e } , get _line _sizes : function ( t ) { var e , n = gantt . config . link _line _width , i = gantt . config . link _wrapper _width , a = t . size + n ;
switch ( t . direction ) { case this . dirs . left : case this . dirs . right : e = { height : n , width : a , marginTop : ( i - n ) / 2 , marginLeft : ( i - n ) / 2 } ; break ; case this . dirs . up : case this . dirs . down : e = { height : a , width : n , marginTop : ( i - n ) / 2 , marginLeft : ( i - n ) / 2 } } return e } , 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 i = this . get _line _sizes ( t ) , a = document . createElement ( "div" ) ;
return a . style . cssText = [ "height:" + i . height + "px" , "width:" + i . width + "px" , "margin-top:" + i . marginTop + "px" , "margin-left:" + i . marginLeft + "px" ] . join ( ";" ) , a . className = "gantt_link_line_" + t . direction , n . appendChild ( a ) , n } , _get _line : function ( t , e ) { var n = this . get _direction ( t , e ) , i = { x : t . x , y : t . y , direction : this . get _direction ( t , e ) } ; return i . size = Math . abs ( n == this . dirs . left || n == this . dirs . right ? t . x - e . x : t . y - e . y ) , i } , 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
} } , 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 ] } , 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 i = gantt . _drawer . dirs ; switch ( t ) { case i . left : n . x -= e ; break ; case i . right : n . x += e ; break ; case i . up : n . y -= e ; break ; case i . down : n . y += e } return this . point ( n ) } , get _points : function ( t ) { var e = this . get _endpoint ( t ) , n = gantt . config , i = e . e _y - e . y , a = e . e _x - e . x , 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 , i ) , this . point _to ( s . right , a ) ) : ( this . point _to ( s . right , a ) , this . point _to ( s . down , i ) ) , 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 ) a -= r , this . point _to ( s . down , i ) , this . point _to ( s . right , a ) ; else { a -= 2 * r ; var d = i > 0 ? 1 : - 1 ; this . point _to ( s . down , d * ( n . row _height / 2 ) ) , this . point _to ( s . right , a ) , this . point _to ( s . down , d * ( Math . abs ( i ) - 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 , a ) , this . point _to ( s . down , i ) ) : ( this . point _to ( s . down , i ) , this . point _to ( s . right , a ) ) , 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 ) { a += 2 * r ; var d = i > 0 ? 1 : - 1 ; this . point _to ( s . down , d * ( n . row _height / 2 ) ) , this . point _to ( s . right , a ) , this . point _to ( s . down , d * ( Math . abs ( i ) - n . row _height / 2 ) ) , this . point _to ( s . left , r ) } else a += r , this . point _to ( s . down , i ) , this . point _to ( s . right , a ) ;
return this . path } , get _endpoint : function ( t ) { var e = gantt . config . links , n = ! 1 , i = ! 1 ; t . type == e . start _to _start ? n = i = ! 0 : t . type == e . finish _to _finish ? n = i = ! 1 : t . type == e . finish _to _start ? ( n = ! 1 , i = ! 0 ) : t . type == e . start _to _finish ? ( n = ! 0 , i = ! 1 ) : dhtmlx . assert ( ! 1 , "Invalid link type" ) ; var a = gantt . _get _task _visible _pos ( gantt . _pull [ t . source ] , n ) , s = gantt . _get _task _visible _pos ( gantt . _pull [ t . target ] , i ) ; return { x : a . x , e _x : s . x , y : a . y , e _y : s . y } } } , gantt . _init _links _dnd = function ( ) { function t ( t , e , n ) { var i = gantt . _get _task _pos ( t , ! ! e ) ; return i . y += gantt . _get _task _height ( ) / 2 , n = n || 0 , i . x += ( e ? - 1 : 1 ) * n , i
} function e ( t ) { var e = i ( ) , 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 a = gantt . templates . drag _link _class ( e . from , e . from _start , e . to , e . to _start ) ; a && n . push ( a ) ; var s = "<div class='" + a + "'>" + gantt . templates . drag _link ( e . from , e . from _start , e . to , e . to _start ) + "</div>" ; t . innerHTML = s } function n ( t , e ) { t . style . left = e . x + 5 + "px" , t . style . top = e . y + 5 + "px" } function i ( ) { return { from : gantt . _link _source _task , to : gantt . _link _target _task , from _start : gantt . _link _source _task _start , to _start : gantt . _link _target _task _start }
} function a ( ) { gantt . _link _source _task = gantt . _link _source _task _start = gantt . _link _target _task = null , gantt . _link _target _task _start = ! 0 } function s ( t , e , n , a ) { var s = d ( ) , l = i ( ) , _ = [ "gantt_link_direction" ] ; gantt . templates . link _direction _class && _ . push ( gantt . templates . link _direction _class ( l . from , l . from _start , l . to , l . to _start ) ) ; var h = Math . sqrt ( Math . pow ( n - t , 2 ) + Math . pow ( a - e , 2 ) ) ; if ( h = Math . max ( 0 , h - 3 ) ) { s . className = _ . join ( " " ) ; var c = ( a - e ) / ( n - t ) , g = Math . atan ( c ) ; 2 == o ( t , n , e , a ) ? g += Math . PI : 3 == o ( t , n , e , a ) && ( g -= Math . PI ) ; var u = Math . sin ( g ) , f = Math . cos ( g ) , p = Math . round ( e ) , m = Math . round ( t ) , v = [ "-webkit-transform: rotate(" + g + "rad)" , "-moz-transform: rotate(" + g + "rad)" , "-ms-transform: rotate(" + g + "rad)" , "-o-transform: rotate(" + g + "rad)" , "transform: rotate(" + g + "rad)" , "width:" + Math . round ( h ) + "px" ] ;
if ( - 1 != window . navigator . userAgent . indexOf ( "MSIE 8.0" ) ) { v . push ( '-ms-filter: "' + r ( u , f ) + '"' ) ; var k = Math . abs ( Math . round ( t - n ) ) , x = Math . abs ( Math . round ( a - e ) ) ; switch ( o ( t , n , e , a ) ) { case 1 : p -= x ; break ; case 2 : m -= k , p -= x ; break ; case 3 : m -= k } } v . push ( "top:" + p + "px" ) , v . push ( "left:" + m + "px" ) , s . style . cssText = v . 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 , i ) { return e >= t ? n >= i ? 1 : 4 : n >= i ? 2 : 3 } function d ( ) { return _ . _direction || ( _ . _direction = document . createElement ( "div" ) , gantt . $task _links . appendChild ( _ . _direction ) ) , _ . _direction
} function l ( ) { _ . _direction && ( _ . _direction . parentNode && _ . _direction . parentNode . removeChild ( _ . _direction ) , _ . _direction = null ) } var _ = new dhtmlxDnD ( this . $task _bars , { sensitivity : 0 , updates _per _second : 60 } ) , h = "task_left" , c = "task_right" , g = "gantt_link_point" , u = "gantt_link_control" ; _ . attachEvent ( "onBeforeDragStart" , dhtmlx . bind ( function ( e , n ) { if ( gantt . config . readonly ) return ! 1 ; var i = n . target || n . srcElement ; if ( a ( ) , gantt . getState ( ) . drag _id ) return ! 1 ; if ( gantt . _locate _css ( i , g ) ) { gantt . _locate _css ( i , h ) && ( gantt . _link _source _task _start = ! 0 ) ;
var s = gantt . _link _source _task = this . locate ( n ) , r = gantt . getTask ( s ) , o = 0 ; return 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 } , this ) ) , _ . attachEvent ( "onAfterDragStart" , dhtmlx . bind ( function ( ) { e ( _ . config . marker ) } , this ) ) , _ . attachEvent ( "onDragMove" , dhtmlx . bind ( function ( i , a ) { var r = _ . config , o = _ . getPosition ( a ) ; n ( r . marker , o ) ; var d = gantt . _is _link _drop _area ( a ) , l = gantt . _link _target _task , h = gantt . _link _landing , g = gantt . _link _target _task _start , f = gantt . locate ( a ) , p = ! 0 ;
if ( d && ( p = ! gantt . _locate _css ( a , c ) , d = ! ! f ) , gantt . _link _target _task = f , gantt . _link _landing = d , gantt . _link _target _task _start = p , d ) { var m = gantt . getTask ( f ) , v = gantt . _locate _css ( a , u ) , k = 0 ; v && ( k = Math . floor ( v . offsetWidth / 2 ) ) , this . _dir _end = t ( m , ! ! gantt . _link _target _task _start , k ) } else this . _dir _end = gantt . _get _mouse _pos ( a ) ; var x = ! ( h == d && l == f && g == p ) ; return x && ( l && gantt . refreshTask ( l , ! 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 } , this ) ) , _ . attachEvent ( "onDragEnd" , dhtmlx . bind ( function ( ) { var t = i ( ) ;
if ( t . from && t . to && t . from != t . to ) { var e = gantt . _get _link _type ( t . from _start , t . to _start ) ; e && gantt . addLink ( { source : t . from , target : t . to , type : e } ) } a ( ) , t . from && gantt . refreshTask ( t . from , ! 1 ) , t . to && gantt . refreshTask ( t . to , ! 1 ) , l ( ) } , 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 , link _source _id : this . _link _source _task , link _source _start : this . _link _source _task _start }
} , gantt . _init _tasks = function ( ) { function t ( t , e , n , i ) { for ( var a = 0 ; a < t . length ; a ++ ) t [ a ] . change _id ( e , n ) , t [ a ] . render _item ( i ) } this . _tasks = { col _width : this . config . columnWidth , width : [ ] , 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 . _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 ) , i = this . getTask ( e ) , a = null ;
return n . parentNode && n . parentNode . className && ( a = n . parentNode . className . indexOf ( "_left" ) > - 1 ? i . $target [ 0 ] : i . $source [ 0 ] ) , a && this . _delete _link _handler ( a , t ) , ! 1 } , this ) , this . _tasks _dnd . init ( ) , this . _init _links _dnd ( ) ; var e = this . _create _filter ( "_filter_task" , "_is_grid_visible" ) , n = this . _create _filter ( "_filter_task" , "_is_chart_visible" ) , i = this . _create _filter ( "_filter_link" , "_is_chart_visible" ) ; this . _taskRenderer = gantt . _task _renderer ( "line" , this . _render _task _element , this . $task _bars , n ) , this . _linkRenderer = gantt . _task _renderer ( "links" , this . _render _link _element , this . $task _links , i ) , this . _gridRenderer = gantt . _task _renderer ( "grid_items" , this . _render _grid _item , this . $grid _data , e ) , this . _bgRenderer = gantt . _task _renderer ( "bg_lines" , this . _render _bg _line , this . $task _bg , n ) , this . attachEvent ( "onTaskIdChange" , function ( e , n ) { var i = this . _get _task _renderers ( ) ;
t ( i , e , n , this . getTask ( n ) ) } ) , this . attachEvent ( "onLinkIdChange" , function ( e , n ) { var i = this . _get _link _renderers ( ) ; t ( i , e , n , this . getLink ( n ) ) } ) } , gantt . _create _filter = function ( t ) { return t instanceof Array || ( t = Array . prototype . slice . call ( arguments , 0 ) ) , function ( e ) { for ( var n = ! 0 , i = 0 , a = t . length ; a > i ; i ++ ) { var s = t [ i ] ; 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 , i = null ; return this . config . start _date && this . config . end _date && ( n = this . config . start _date . valueOf ( ) , i = this . config . end _date . valueOf ( ) , + e . start _date > i || + 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 ) ? this . callEvent ( "onBeforeLinkDisplay" , [ t , e ] ) : ! 1 } , gantt . _get _task _renderers = function ( ) { return [ this . _taskRenderer , this . _gridRenderer , this . _bgRenderer ] } , gantt . _get _link _renderers = function ( ) { return [ this . _linkRenderer ] } , gantt . _delete _link _handler = function ( t , e ) { if ( t && this . callEvent ( "onLinkDblClick" , [ t , e ] ) ) { if ( this . config . readonly ) return ; var n = "" , 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 , n , function ( ) { gantt . deleteLink ( t ) } ) } , gantt . config . touch ? 300 : 1 ) } } , gantt . getTaskNode = function ( t ) { return this . _taskRenderer . rendered [ t ] } , 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 . _update _parents ( n . id , ! 0 ) , t . push ( n ) } return t } , gantt . _get _links _data = function ( ) { var t = [ ] ; for ( var e in this . _lpull ) t . push ( this . _lpull [ e ] ) ;
return t } , gantt . _render _data = function ( ) { this . _update _layout _sizes ( ) ; for ( var t = this . _get _tasks _data ( ) , e = this . _get _task _renderers ( ) , n = 0 ; n < e . length ; n ++ ) e [ n ] . render _items ( t ) ; var i = gantt . _get _links _data ( ) ; e = this . _get _link _renderers ( ) ; for ( var n = 0 ; n < e . length ; n ++ ) e [ n ] . render _items ( i ) } , gantt . _update _layout _sizes = function ( ) { var t = this . _tasks ; if ( 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 . width = t . full _width + "px" , this . _is _grid _visible ( ) ) { for ( var e = this . config . columns , n = 0 , i = 0 ; i < e . length ; i ++ ) n += e [ i ] . width ;
this . $grid _data . style . width = Math . max ( n - 1 , 0 ) + "px" } } , gantt . _init _tasks _range = function ( ) { var t = this . config . scale _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 ) ) ) ; var e = this . _get _tasks _data ( ) , n = this . _init _task ( { id : this . config . root _id } ) ; e . push ( n ) ; var i = - 1 / 0 , a = 1 / 0 ; this . eachTask ( function ( t ) { t . end _date && + t . end _date > + i && ( i = new Date ( t . end _date ) ) } , this . config . root _id ) , this . eachTask ( function ( t ) { t . start _date && + t . start _date < + a && ( a = new Date ( t . start _date ) )
} , this . config . root _id ) , this . _min _date = a , this . _max _date = i , i && i != - 1 / 0 || ( 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 == + a && ( this . _min _date = this . date . add ( this . date [ t + "_start" ] ( this . _min _date ) , - 1 , t ) ) , this . _max _date = this . date [ t + "_start" ] ( this . _max _date ) , this . _max _date = this . date . add ( this . _max _date , 1 , t ) } , gantt . _prepare _scale _html = function ( t ) { var e = [ ] , n = null , i = null , a = null ; ( t . template || t . date ) && ( i = t . template || this . date . date _to _str ( t . date ) ) , a = t . css || gantt . templates . scale _cell _class ;
for ( var s = 0 ; s < t . count ; s ++ ) { n = new Date ( t . trace _x [ s ] ) ; var r = i . call ( this , n ) , o = t . width [ s ] , d = "" , l = "" , _ = "" ; if ( o ) { d = "width:" + o + "px;" , _ = "gantt_scale_cell" + ( s == t . count - 1 ? " gantt_last_cell" : "" ) , l = a . call ( this , n ) , l && ( _ += " " + l ) ; var h = "<div class='" + _ + "' style='" + d + "'>" + r + "</div>" ; e . push ( h ) } } return e . join ( "" ) } , gantt . _render _tasks _scales = function ( ) { this . _init _tasks _range ( ) , this . _scroll _resize ( ) , this . _set _sizes ( ) ; var t = "" , e = 0 , n = 0 , i = 0 ; if ( this . _is _chart _visible ( ) ) { var a = this . _scale _helpers , s = [ a . primaryScale ( ) ] . concat ( this . config . subscales ) ;
i = this . config . scale _height - 1 , a . sortScales ( s ) ; for ( var r = this . _get _resize _options ( ) , o = r . x ? 0 : this . $task . offsetWidth , d = a . prepareConfigs ( s , this . config . min _column _width , o , i ) , l = this . _tasks = d [ d . length - 1 ] , _ = [ ] , h = this . templates . scale _row _class , c = 0 ; c < d . length ; c ++ ) { var g = "gantt_scale_line" , u = h ( d [ c ] ) ; u && ( g += " " + u ) , _ . push ( '<div class="' + g + '" style="height:' + d [ c ] . height + "px;line-height:" + d [ c ] . height + 'px">' + this . _prepare _scale _html ( d [ c ] ) + "</div>" ) } t = _ . join ( "" ) , e = l . full _width + this . $scroll _ver . offsetWidth + "px" , n = l . full _width + "px" , i += "px"
} this . $task . style . display = this . _is _chart _visible ( ) ? "" : "none" , this . $task _scale . style . height = i , this . $task _data . style . width = this . $task _scale . style . width = e , this . $task _links . style . width = this . $task _bars . style . width = n , this . $task _scale . innerHTML = t } , gantt . _render _bg _line = function ( t ) { var e = gantt . _tasks , n = e . count , i = [ ] ; if ( gantt . config . show _task _cells ) for ( var a = 0 ; n > a ; a ++ ) { var s = e . width [ a ] , r = "" , o = "" ; if ( s > 0 ) { r = "width:" + s + "px;" , o = "gantt_task_cell" + ( a == n - 1 ? " gantt_last_cell" : "" ) , _ = this . templates . task _cell _class ( t , e . trace _x [ a ] ) , _ && ( o += " " + _ ) ;
var d = "<div class='" + o + "' style='" + r + "'></div>" ; i . push ( d ) } } var l = t . $index % 2 !== 0 , _ = gantt . templates . task _row _class ( t . start _date , t . end _date , t ) , h = "gantt_task_row" + ( l ? " odd" : "" ) + ( _ ? " " + _ : "" ) ; this . getState ( ) . selected _task == t . id && ( h += " gantt_selected" ) ; var c = document . createElement ( "div" ) ; return c . className = h , c . style . height = gantt . config . row _height + "px" , c . setAttribute ( this . config . task _attribute , t . id ) , c . innerHTML = i . join ( "" ) , c } , 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 } return ! 1 } , gantt . refreshTask = function ( t , e ) { var n = this . _get _task _renderers ( ) , i = this . getTask ( t ) ; if ( i && this . isTaskVisible ( t ) ) for ( var a = 0 ; a < n . length ; a ++ ) n [ a ] . render _item ( i ) ; else for ( var a = 0 ; a < n . length ; a ++ ) n [ a ] . remove _item ( t ) ; if ( void 0 === e || e ) { for ( var i = this . getTask ( t ) , a = 0 ; a < i . $source . length ; a ++ ) gantt . refreshLink ( i . $source [ a ] ) ; for ( var a = 0 ; a < i . $target . length ; a ++ ) gantt . refreshLink ( i . $target [ a ] )
} } , gantt . refreshLink = function ( t ) { this . isLinkExists ( t ) ? gantt . _render _link ( t ) : gantt . _linkRenderer . remove _item ( t ) } , gantt . _combine _item _class = function ( t , e , n ) { var i = [ t ] ; e && i . push ( e ) ; var a = gantt . getState ( ) , s = this . getTask ( n ) ; this . _get _safe _type ( s . type ) == this . config . types . milestone && i . push ( "gantt_milestone" ) , this . _get _safe _type ( s . type ) == this . config . types . project && i . push ( "gantt_project" ) , this . _is _flex _task ( s ) && i . push ( "gantt_dependent_task" ) , this . config . select _task && n == a . selected _task && i . push ( "gantt_selected" ) , n == a . drag _id && i . push ( "gantt_drag_" + a . drag _mode ) ;
var r = gantt . _get _link _state ( ) ; if ( r . link _source _id == n && i . push ( "gantt_link_source" ) , r . link _target _id == n && i . push ( "gantt_link_target" ) , 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 , d = r . link _source _start , l = r . link _target _start , _ = gantt . isLinkAllowed ( o , n , d , l ) , h = "" ; h = _ ? l ? "link_start_allow" : "link_finish_allow" : l ? "link_start_deny" : "link_finish_deny" , i . push ( h ) } return i . join ( " " ) } , gantt . _render _pair = function ( t , e , n , i ) { var a = gantt . getState ( ) ;
+ n . end _date <= + a . max _date && t . appendChild ( i ( e + " task_right" ) ) , + n . start _date >= + a . min _date && t . appendChild ( i ( 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 ( ) { return this . _get _task _height ( ) } , gantt . _get _visible _milestone _width = function ( ) { var t = gantt . _get _task _height ( ) ; return Math . sqrt ( 2 * t * t ) } , gantt . _get _task _width = function ( t ) { return Math . round ( this . _get _task _pos ( t , ! 1 ) . x - this . _get _task _pos ( t , ! 0 ) . x )
} , gantt . _render _task _element = function ( t ) { var e = this . _get _task _pos ( t ) , n = this . config , i = this . _get _task _height ( ) , a = Math . floor ( ( this . config . row _height - i ) / 2 ) ; t . type == n . types . milestone && n . link _line _width > 1 && ( a += 1 ) ; var s = document . createElement ( "div" ) , r = gantt . _get _task _width ( t ) , o = this . _get _safe _type ( t . type ) ; s . setAttribute ( this . config . task _attribute , t . id ) , s . appendChild ( gantt . _render _task _content ( t , r ) ) , s . className = this . _combine _item _class ( "gantt_task_line" , this . templates . task _class ( t . start _date , t . end _date , t ) , t . id ) , s . style . cssText = [ "left:" + e . x + "px" , "top:" + ( a + e . y ) + "px" , "height:" + i + "px" , "line-height:" + i + "px" , "width:" + r + "px" ] . join ( ";" ) ;
var d = this . _render _leftside _content ( t ) ; return d && s . appendChild ( d ) , d = this . _render _rightside _content ( t ) , d && s . appendChild ( d ) , n . show _progress && o != this . config . types . milestone && this . _render _task _progress ( t , s , r ) , this . config . readonly || ( 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" ) ; return e . className = t , e } ) , n . drag _links && gantt . _render _pair ( s , "gantt_link_control" , t , function ( t ) { var e = document . createElement ( "div" ) ;
e . className = t , e . style . cssText = [ "height:" + i + "px" , "line-height:" + i + "px" ] . join ( ";" ) ; var n = document . createElement ( "div" ) ; return n . className = "gantt_link_point" , e . appendChild ( n ) , e } ) ) , s } , gantt . _render _side _content = function ( t , e , n ) { if ( ! e ) return null ; var i = e ( t . start _date , t . end _date , t ) ; if ( ! i ) return null ; var a = document . createElement ( "div" ) ; return a . className = "gantt_side_content " + n , a . innerHTML = i , a } , gantt . _render _leftside _content = function ( t ) { 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 ] } : { $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 i in n ) for ( var a = e [ i ] , s = 0 ; s < a . length ; s ++ ) for ( var r = gantt . getLink ( a [ s ] ) , o = 0 ; o < n [ i ] . length ; o ++ ) if ( r . type == n [ i ] [ o ] ) return "gantt_link_crossing" ; return "" } , 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 i = 1 * t . progress || 0 ; n = Math . max ( n - 2 , 0 ) ; var a = document . createElement ( "div" ) , s = Math . round ( n * i ) ;
if ( s = Math . min ( n , s ) , a . style . width = s + "px" , a . className = "gantt_task_progress" , a . innerHTML = this . templates . progress _text ( t . start _date , t . end _date , t ) , e . appendChild ( a ) , this . config . drag _progress && ! gantt . config . readonly ) { var r = document . createElement ( "div" ) ; r . style . left = s + "px" , r . className = "gantt_task_progress_drag" , a . appendChild ( r ) , e . appendChild ( r ) } } , gantt . _get _line = function ( t ) { var e = { second : 1 , minute : 60 , hour : 3600 , day : 86400 , week : 604800 , month : 2592e3 , year : 31536e3 } ; return e [ t ] || 0 } , gantt . _date _from _pos = function ( t ) { var e = this . _tasks ;
if ( 0 > t || t > e . full _width ) return null ; for ( var n = 0 , i = 0 ; i + e . width [ n ] < t ; ) i += e . width [ n ] , n ++ ; var a = ( t - i ) / e . width [ n ] , s = gantt . _get _coll _duration ( e , e . trace _x [ n ] ) , r = new Date ( e . trace _x [ n ] . valueOf ( ) + Math . round ( a * s ) ) ; return r } , gantt . posFromDate = function ( t ) { var e = gantt . _day _index _by _date ( t ) ; dhtmlx . assert ( e >= 0 , "Invalid day index" ) ; for ( var n = Math . floor ( e ) , i = e % 1 , a = 0 , s = 1 ; n >= s ; s ++ ) a += gantt . _tasks . width [ s - 1 ] ; return i && ( a += n < gantt . _tasks . width . length ? gantt . _tasks . width [ n ] * ( i % 1 ) : 1 ) , a } , gantt . _day _index _by _date = function ( t ) { var e = new Date ( t ) , n = gantt . _tasks . trace _x , i = gantt . _tasks . ignore _x ;
if ( + e <= this . _min _date ) return 0 ; if ( + e >= this . _max _date ) return n . length ; for ( var a = 0 ; a < n . length - 1 && ( ! ( + e < n [ a + 1 ] ) || i [ + n [ a + 1 ] ] ) ; a ++ ) ; return a + ( t - n [ a ] ) / gantt . _get _coll _duration ( gantt . _tasks , n [ a ] ) } , gantt . _get _coll _duration = function ( t , e ) { 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 . _get _task _coord = function ( t , e , n ) { e = e !== ! 1 , n = n || 0 ; var i = t . type == this . config . types . milestone , a = this . posFromDate ( e || i ? t . start _date : t . end _date ) , s = this . _y _from _ind ( this . _get _visible _order ( t . id ) ) ;
return i && ( e ? a -= n : a += n ) , { x : a , y : s } } , 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 ) } , 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 } ;
var n = _isIE ? document . documentElement : document . body , e = { x : t . clientX + n . scrollLeft - n . clientLeft , y : t . clientY + n . scrollTop - n . clientTop } , i = gantt . _get _position ( gantt . $task _data ) ; return e . x = e . x - i . x + gantt . $task _data . scrollLeft , e . y = e . y - i . y + gantt . $task _data . scrollTop , e } , gantt . _task _renderer = function ( t , e , n , i ) { 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" ) , this . _task _area _renderers [ t ] = { render _item : function ( a , s ) { var r = gantt . _task _area _pulls [ t ] ;
if ( s = s || n , i && ! i ( a ) ) return void this . remove _item ( a . id ) ; var o = e . call ( gantt , a ) ; o && ( r [ a . id ] ? this . replace _item ( a . id , o ) : ( r [ a . id ] = o , s . appendChild ( o ) ) ) } , render _items : function ( e , i ) { this . rendered = gantt . _task _area _pulls [ t ] = { } , i = i || n , i . innerHTML = "" ; for ( var a = document . createDocumentFragment ( ) , s = 0 , r = e . length ; r > s ; s ++ ) this . render _item ( e [ s ] , a ) ; i . 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 ) { 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 } , this . _task _area _renderers [ t ] ) } , gantt . _pull = { } , gantt . _branches = { } , gantt . _order = [ ] , gantt . _lpull = { } , gantt . load = function ( t , e , n ) { dhtmlx . assert ( arguments . length , "Invalid load arguments" ) , this . callEvent ( "onLoadStart" , [ ] ) ; var i = "json" , a = null ; arguments . length >= 3 ? ( i = e , a = n ) : "string" == typeof arguments [ 1 ] ? i = arguments [ 1 ] : "function" == typeof arguments [ 1 ] && ( a = arguments [ 1 ] ) , dhtmlxAjax . get ( t , dhtmlx . bind ( function ( t ) { this . on _load ( t , i ) , "function" == typeof a && a . call ( this )
} , this ) ) } , gantt . parse = function ( t , e ) { this . on _load ( { xmlDoc : { responseText : t } } , e ) } , gantt . serialize = function ( t ) { return t = t || "json" , this [ t ] . serialize ( ) } , gantt . on _load = function ( t , e ) { e || ( e = "json" ) , dhtmlx . assert ( this [ e ] , "Invalid data type:'" + e + "'" ) ; var n = t . xmlDoc . responseText , i = this [ e ] . parse ( n , t ) ; this . _process _loading ( i ) , this . callEvent ( "onLoadEnd" , [ ] ) } , gantt . _process _loading = function ( t ) { t . collections && this . _load _collections ( t . collections ) ; for ( var e = t . data , n = 0 ; n < e . length ; n ++ ) { var i = e [ n ] ; this . _init _task ( i ) , this . callEvent ( "onTaskLoading" , [ i ] ) && ( this . _pull [ i . id ] = i , this . _add _branch ( i ) )
} this . _sync _order ( ) ; for ( var n in this . _pull ) this . _pull [ n ] . $level = this . _item _level ( this . _pull [ n ] ) ; this . _init _links ( t . links || ( t . collections ? t . collections . links : [ ] ) ) } , 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 ; for ( var n in t ) if ( t . hasOwnProperty ( n ) ) { e = ! 0 ; var i = t [ n ] , a = this . serverList [ n ] ; if ( ! a ) continue ; a . splice ( 0 , a . length ) ; for ( var s = 0 ; s < i . length ; s ++ ) { var r = i [ s ] , o = dhtmlx . copy ( r ) ;
o . key = o . value ; for ( var d in r ) if ( r . hasOwnProperty ( d ) ) { if ( "value" == d || "label" == d ) continue ; o [ d ] = r [ d ] } a . push ( o ) } } e && this . callEvent ( "onOptionsLoad" , [ ] ) } , gantt . _sync _order = function ( ) { this . _order = [ ] , this . _sync _order _item ( { parent : this . config . root _id , $open : ! 0 , $ignore : ! 0 , id : this . config . root _id } ) , this . _scroll _resize ( ) , this . _set _sizes ( ) } , gantt . attachEvent ( "onBeforeTaskDisplay" , function ( t , e ) { return ! e . $ignore } ) , gantt . _sync _order _item = function ( t ) { 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 . _branches [ t . id ] ;
if ( e ) for ( var n = 0 ; n < e . length ; n ++ ) this . _sync _order _item ( this . _pull [ e [ n ] ] ) } } , gantt . _get _visible _order = function ( t ) { dhtmlx . assert ( t , "Invalid argument" ) ; for ( var e = this . _order , n = 0 , i = e . length ; i > n ; n ++ ) if ( e [ n ] == t ) return n ; return - 1 } , gantt . eachTask = function ( t , e , n ) { e = e || this . config . root _id , n = n || this ; var i = this . _branches [ e ] ; if ( i ) for ( var a = 0 ; a < i . length ; a ++ ) { var s = this . _pull [ i [ a ] ] ; t . call ( n , s ) , this . _branches [ 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
} , _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 ] ) ; return e . start _date = gantt . templates . xml _format ( e . start _date ) , e . end _date && ( e . end _date = gantt . templates . xml _format ( e . end _date ) ) , e } , serialize : function ( ) { var t = [ ] , e = [ ] ; gantt . eachTask ( function ( 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 } } } , gantt . xml = { _xmlNodeToJSON : function ( t , e ) { for ( var n = { } , i = 0 ; i < t . attributes . length ; i ++ ) n [ t . attributes [ i ] . name ] = t . attributes [ i ] . value ;
if ( ! e ) { for ( var i = 0 ; i < t . childNodes . length ; i ++ ) { var a = t . childNodes [ i ] ; 1 == a . nodeType && ( n [ a . tagName ] = a . firstChild ? a . firstChild . nodeValue : "" ) } n . text || ( n . text = t . firstChild ? t . firstChild . nodeValue : "" ) } return n } , _getCollections : function ( t ) { for ( var e = { } , n = t . doXPath ( "//coll_options" ) , i = 0 ; i < n . length ; i ++ ) for ( var a = n [ i ] . getAttribute ( "for" ) , s = e [ a ] = [ ] , r = t . doXPath ( ".//item" , n [ i ] ) , o = 0 ; o < r . length ; o ++ ) { for ( var d = r [ o ] , l = d . attributes , _ = { key : r [ o ] . getAttribute ( "value" ) , label : r [ o ] . getAttribute ( "label" ) } , h = 0 ; h < l . length ; h ++ ) { var c = l [ h ] ;
"value" != c . nodeName && "label" != c . nodeName && ( _ [ c . nodeName ] = c . nodeValue ) } s . push ( _ ) } return e } , _getXML : function ( t , e , n ) { n = n || "data" , e . getXMLTopNode || ( e = new dtmlXMLLoaderObject ( function ( ) { } ) , e . loadXMLString ( t ) ) ; var i = e . getXMLTopNode ( n ) ; if ( i . tagName != n ) throw "Invalid XML data" ; var a = i . getAttribute ( "dhx_security" ) ; return a && ( dhtmlx . security _key = a ) , e } , parse : function ( t , e ) { e = this . _getXML ( t , e ) ; for ( var n = { } , i = n . data = [ ] , a = e . doXPath ( "//task" ) , s = 0 ; s < a . length ; s ++ ) i [ s ] = this . _xmlNodeToJSON ( a [ s ] ) ; return n . collections = this . _getCollections ( e ) , n
} , _copyLink : function ( t ) { return "<item id='" + t . id + "' source='" + t . source + "' target='" + t . target + "' type='" + t . type + "' />" } , _copyObject : function ( t ) { var e = gantt . templates . xml _format ( t . start _date ) , n = gantt . templates . xml _format ( t . end _date ) ; return "<task id='" + t . id + "' parent='" + ( t . parent || "" ) + "' start_date='" + e + "' duration='" + t . duration + "' open='" + ! ! t . open + "' progress='" + t . progress + "' end_date='" + n + "'><![CDATA[" + t . text + "]]></task>" } , serialize : function ( ) { var t = [ ] , e = [ ] ; gantt . eachTask ( function ( e ) { t . push ( this . _copyObject ( e ) )
} , this . config . root _id , this ) ; for ( var n in gantt . _lpull ) e . push ( this . _copyLink ( gantt . _lpull [ n ] ) ) ; return "<data>" + t . join ( "" ) + "<coll_options for='links'>" + e . join ( "" ) + "</coll_options></data>" } } , gantt . oldxml = { parse : function ( t , e ) { e = gantt . xml . _getXML ( t , e , "projects" ) ; for ( var n = { collections : { links : [ ] } } , i = n . data = [ ] , a = e . doXPath ( "//task" ) , s = 0 ; s < a . length ; s ++ ) { i [ s ] = gantt . xml . _xmlNodeToJSON ( a [ s ] ) ; var r = a [ s ] . parentNode ; i [ s ] . parent = "project" == r . tagName ? "project-" + r . getAttribute ( "id" ) : r . parentNode . getAttribute ( "id" ) } a = e . doXPath ( "//project" ) ;
for ( var s = 0 ; s < a . length ; s ++ ) { var o = gantt . xml . _xmlNodeToJSON ( a [ s ] , ! 0 ) ; o . id = "project-" + o . id , i . push ( o ) } for ( var s = 0 ; s < i . length ; s ++ ) { var o = i [ s ] ; 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" ) } } , 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 } , _get _unit _order : function ( t ) { 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 , n = this . _timestamp ( t ) ; null !== n ? this . dates [ n ] = e : this . hours = e } , unset _time : function ( t ) { if ( t ) { var e = this . _timestamp ( t ) ;
null !== e && delete this . dates [ e ] } else this . hours = [ ] } , is _working _unit : function ( t , e , n ) { return gantt . config . work _time ? ( 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 ) : ! 0 } , is _work _day : function ( t ) { var e = this . get _working _hours ( t ) ; return e instanceof Array ? e . length > 0 : ! 1 } , is _work _hour : function ( t ) { for ( var e = this . get _working _hours ( t ) , n = t . getHours ( ) , i = 0 ; i < e . length ; i += 2 ) { if ( void 0 === e [ i + 1 ] ) return e [ i ] == n ; if ( n >= e [ i ] && n < e [ i + 1 ] ) return ! 0
} return ! 1 } , get _working _hours : function ( t ) { 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 , i ) { if ( ! n ) return ! 1 ; for ( var a = new Date ( t ) , s = new Date ( e ) , i = i || 1 , r = 0 ; a . valueOf ( ) < s . valueOf ( ) ; ) this . is _working _unit ( a , n ) && r ++ , a = gantt . date . add ( a , i , n ) ; return r } , add _worktime : function ( t , e , n , i ) { if ( ! n ) return ! 1 ; for ( var a = new Date ( t ) , s = 0 , i = i || 1 , e = 1 * e ; e > s ; ) { var r = gantt . date . add ( a , i , n ) ;
this . is _working _unit ( i > 0 ? a : r , n ) && s ++ , a = r } return a } , 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 ) , i = new Date ( n ) , a = new Date ( n ) , s = ! 0 , r = 3e3 , o = 0 , d = "any" == t . dir || ! t . dir , l = 1 ; for ( "past" == t . dir && ( l = - 1 ) ; ! this . is _working _unit ( n , e ) ; ) if ( d && ( n = s ? i : a , l = - 1 * l ) , n = gantt . date . add ( n , l , e ) , d && ( s ? i = n : a = n ) , s = ! s , o ++ , o > r ) return dhtmlx . assert ( ! 1 , "Invalid working time check" ) , ! 1 ; return ( n == a || "past" == t . dir ) && ( n = gantt . date . add ( n , 1 , e ) ) , n } } , gantt . getTask = function ( t ) { return dhtmlx . assert ( this . _pull [ t ] ) , this . _pull [ t ]
} , gantt . getTaskByTime = function ( t , e ) { var n = this . _pull , i = [ ] ; if ( t || e ) { t = + t || - 1 / 0 , e = + e || 1 / 0 ; for ( var a in n ) { var s = n [ a ] ; + s . start _date < e && + s . end _date > t && i . push ( s ) } } else for ( var a in n ) i . push ( n [ a ] ) ; return i } , gantt . isTaskExists = function ( t ) { return dhtmlx . defined ( this . _pull [ t ] ) } , gantt . isTaskVisible = function ( t ) { if ( ! this . _pull [ t ] ) return ! 1 ; if ( ! ( + this . _pull [ t ] . start _date < + this . _max _date && + this . _pull [ t ] . end _date > + this . _min _date ) ) return ! 1 ; for ( var e = 0 , n = this . _order . length ; n > e ; e ++ ) if ( this . _order [ e ] == 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 . _update _parents ( e . id ) , this . refreshTask ( e . id ) , this . callEvent ( "onAfterTaskUpdate" , [ t , e ] ) , this . _sync _order ( ) , void this . _adjust _scales ( ) ) } , gantt . _add _branch = function ( t ) { this . _branches [ t . parent ] || ( this . _branches [ t . parent ] = [ ] ) ; for ( var e = this . _branches [ t . parent ] , n = ! 1 , i = 0 , a = e . length ; a > i ; i ++ ) if ( e [ i ] == t . id ) { n = ! 0 ;
break } n || e . push ( t . id ) , this . _sync _parent ( t ) , this . _sync _order ( ) } , gantt . _move _branch = function ( t , e , n ) { t . parent = n , this . _sync _parent ( t ) , this . _replace _branch _child ( e , t . id ) , n ? this . _add _branch ( t ) : delete this . _branches [ t . id ] , t . $level = this . _item _level ( t ) , this . _sync _order ( ) } , gantt . _resync _parent = function ( t ) { this . _move _branch ( t , t . $rendered _parent , t . parent ) } , gantt . _sync _parent = function ( t ) { t . $rendered _parent = t . parent } , gantt . _is _parent _sync = function ( t ) { return t . $rendered _parent == t . parent } , gantt . _replace _branch _child = function ( t , e , n ) { var i = this . _branches [ t ] ;
if ( i ) { for ( var a = [ ] , s = 0 ; s < i . length ; s ++ ) i [ s ] != e ? a . push ( i [ s ] ) : n && a . push ( n ) ; this . _branches [ t ] = a } this . _sync _order ( ) } , gantt . addTask = function ( t , e ) { return dhtmlx . defined ( e ) || ( e = t . parent || 0 ) , dhtmlx . defined ( this . _pull [ e ] ) || ( e = 0 ) , t . parent = e , t = this . _init _task ( t ) , this . callEvent ( "onBeforeTaskAdd" , [ t . id , t ] ) === ! 1 ? ! 1 : ( this . _pull [ t . id ] = t , this . _add _branch ( t ) , this . refreshData ( ) , this . callEvent ( "onAfterTaskAdd" , [ t . id , t ] ) , this . _adjust _scales ( ) , t . id ) } , gantt . deleteTask = function ( t ) { return this . _deleteTask ( t ) } , gantt . _deleteTask = function ( t , e ) { var n = this . getTask ( t ) ;
if ( ! e && this . callEvent ( "onBeforeTaskDelete" , [ t , n ] ) === ! 1 ) return ! 1 ; ! e && this . _dp && this . _dp . setUpdateMode ( "off" ) ; var i = this . _branches [ n . id ] || [ ] ; this . _update _flags ( t , ! 1 ) ; for ( var a = 0 ; a < i . length ; a ++ ) this . _silentStart ( ) , this . _deleteTask ( i [ a ] , ! 0 ) , this . _dp && ( this . _dp . _ganttMode = "tasks" , this . _dp . setUpdated ( i [ a ] , ! 0 , "deleted" ) ) , this . _silentEnd ( ) ; for ( ! e && this . _dp && this . _dp . setUpdateMode ( "cell" ) ; n . $source . length > 0 ; ) this . deleteLink ( n . $source [ 0 ] ) ; for ( ; n . $target . length > 0 ; ) this . deleteLink ( n . $target [ 0 ] ) ; return delete this . _pull [ t ] , this . _move _branch ( n , n . parent , null ) , e || ( this . callEvent ( "onAfterTaskDelete" , [ t , n ] ) , this . refreshData ( ) ) , ! 0
} , gantt . clearAll = function ( ) { this . _pull = { } , this . _branches = { } , this . _order = [ ] , this . _order _full = [ ] , this . _lpull = { } , this . refreshData ( ) , this . callEvent ( "onClear" , [ ] ) } , gantt . _update _flags = function ( t , e ) { 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 ) { var n = this . _pull [ e ] = this . _pull [ t ] ; this . _pull [ e ] . id = e , delete this . _pull [ t ] ; for ( var i in this . _pull ) this . _pull [ i ] . parent == t && ( this . _pull [ i ] . parent = e ) ;
this . _update _flags ( t , e ) , this . _replace _branch _child ( n . parent , 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 ( t ) { for ( var e in this . config . types ) if ( this . config . types [ e ] == t ) return t ; return gantt . config . types . 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 ) { var n = this . _working _time _helper ; return n . is _working _unit ( t , e || this . config . duration _unit ) } , gantt . getClosestWorkTime = function ( t ) { var e = this . _working _time _helper ; return t instanceof Date && ( t = { 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 . calculateEndDate = function ( t , e ) { var n = this . _working _time _helper , i = e >= 0 ? 1 : - 1 ; return n . add _worktime ( t , Math . abs ( e ) , 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 ) ) , gantt . config . work _time && gantt . config . correct _work _time && ( t . start _date && ( t . start _date = gantt . getClosestWorkTime ( t . start _date ) ) , t . end _date && ( t . end _date = gantt . getClosestWorkTime ( t . end _date ) ) ) , gantt . _init _task _timing ( t ) , t . $source = [ ] , t . $target = [ ] , t . parent = t . parent || this . config . root _id , t . $open = dhtmlx . defined ( t . open ) ? t . open : ! 1 , t . $level = this . _item _level ( t ) , t
} , gantt . _init _task _timing = function ( t ) { void 0 === t . $rendered _type ? t . $rendered _type = t . type : t . $rendered _type != t . type && ( delete t . $no _end , delete t . $no _start , t . $rendered _type = t . type ) , void 0 !== t . $no _end && void 0 !== t . $no _start || t . type == this . config . types . milestone || ( t . type == this . config . types . project ? t . $no _end = t . $no _start = ! 0 : ( t . $no _end = ! ( t . end _date || t . duration ) , t . $no _start = ! t . start _date ) ) , t . type == 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 . _update _parents = function ( t , e ) { if ( t ) { for ( var n = this . getTask ( t ) ; ! n . $no _end && ! n . $no _start && n . parent && this . isTaskExists ( n . parent ) ; ) n = this . getTask ( n . parent ) ; if ( n . $no _end ) { var i = 0 ; this . eachTask ( function ( t ) { t . end _date && + t . end _date > + i && ( i = new Date ( t . end _date ) ) } , n . id ) , i && ( n . end _date = i ) } if ( n . $no _start ) { var a = 1 / 0 ; this . eachTask ( function ( t ) { t . start _date && + t . start _date < + a && ( a = new Date ( t . start _date ) ) } , n . id ) , 1 / 0 != a && ( n . start _date = a ) } ( n . $no _end || n . $no _start ) && ( this . _init _task _timing ( n ) , e || this . refreshTask ( n . id , ! 0 ) ) , n . parent && this . isTaskExists ( n . parent ) && this . _update _parents ( n . parent , e )
} } , 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 ) ; n && this . isTaskExists ( n . parent ) ; ) if ( n = this . getTask ( n . parent ) , n && n . id == e ) return ! 0 ; return ! 1 } , gantt . _get _closest _date = function ( t ) { for ( var e = t . date , n = t . step , i = t . unit , a = gantt . date [ i + "_start" ] ( new Date ( this . _min _date ) ) ; + e > + a ; ) a = gantt . date . add ( a , n , i ) ; var s = gantt . date . add ( a , - 1 * n , i ) ; return t . dir && "future" == t . dir ? a : t . dir && "past" == t . dir ? s : Math . abs ( e - s ) < Math . abs ( a - e ) ? s : a
} , 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 . _item _level = function ( t ) { for ( var e = 0 ; t . parent && dhtmlx . defined ( this . _pull [ t . parent ] ) ; ) t = this . _pull [ t . parent ] , e ++ ; return e } , gantt . sort = function ( t , e , n ) { var i = ! arguments [ 3 ] ; dhtmlx . defined ( n ) || ( n = this . config . root _id ) , dhtmlx . defined ( t ) || ( t = "order" ) ; var a = "string" == typeof t ? function ( n , i ) { var a = n [ t ] > i [ t ] ; return e && ( a = ! a ) , a ? 1 : - 1
} : t , s = this . _branches [ n ] ; if ( s ) { for ( var r = [ ] , o = s . length - 1 ; o >= 0 ; o -- ) r [ o ] = this . _pull [ s [ o ] ] ; r . sort ( a ) ; for ( var o = 0 ; o < r . length ; o ++ ) s [ o ] = r [ o ] . id , this . sort ( t , e , s [ o ] , ! 0 ) } i && this . refreshData ( ) } , gantt . getNext = function ( t ) { for ( var e = 0 ; e < this . _order . length - 1 ; e ++ ) 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 . _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" , deleted : "gantt_deleted" , invalid : "gantt_invalid" , error : "gantt_error" , clear : "" } , t . _methods = [ "_row_style" , "setCellTextStyle" , "_change_id" , "_delete_task" ] , this . attachEvent ( "onAfterTaskAdd" , function ( e ) { t . _ganttMode = "tasks" , t . setUpdated ( e , ! 0 , "inserted" )
} ) , this . attachEvent ( "onAfterTaskUpdate" , function ( e ) { t . _ganttMode = "tasks" , t . setUpdated ( e , ! 0 ) } ) , this . attachEvent ( "onAfterTaskDelete" , function ( e ) { t . _ganttMode = "tasks" , t . setUpdated ( e , ! 0 , "deleted" ) } ) , this . attachEvent ( "onAfterLinkUpdate" , function ( e ) { t . _ganttMode = "links" , t . setUpdated ( e , ! 0 ) } ) , this . attachEvent ( "onAfterLinkAdd" , function ( e ) { t . _ganttMode = "links" , t . setUpdated ( e , ! 0 , "inserted" ) } ) , this . attachEvent ( "onAfterLinkDelete" , function ( e ) { t . _ganttMode = "links" , t . setUpdated ( e , ! 0 , "deleted" ) } ) , this . attachEvent ( "onRowDragEnd" , function ( e , n ) { t . _ganttMode = "tasks" , this . getTask ( e ) . target = n , t . setUpdated ( e , ! 0 , "order" )
} ) , t . attachEvent ( "onBeforeDataSending" , function ( ) { return this . serverProcessor = this . _serverProcessor + getUrlSymbol ( this . _serverProcessor ) + "gantt_mode=" + this . _ganttMode , ! 0 } ) , 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 } ; var i = { } ; for ( var a in n ) if ( "$" != a . substr ( 0 , 1 ) ) { var s = n [ a ] ; i [ a ] = s instanceof Date ? this . templates . xml _format ( s ) : s } return n . $no _start && ( n . start _date = "" , n . duration = "" ) , n . $no _end && ( n . end _date = "" , n . duration = "" ) , i [ t . action _param ] = this . getUserData ( e , t . action _param ) , i
} , 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 ) { var i = gantt . getTaskRowNode ( e ) ; if ( i ) if ( n ) i . className += " " + n ; else { var a = / (gantt_updated|gantt_inserted|gantt_deleted|gantt_invalid|gantt_error)/g ; i . className = i . className . replace ( a , "" ) } } } , this . _delete _task = function ( ) { } , this . _dp = t } , 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 ) { 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 . 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 ) { 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 ] ) } , gantt . refreshData = function ( ) { this . _sync _order ( ) , this . _render _data ( ) } , gantt . _configure = function ( t , e ) { for ( var n in e ) "undefined" == typeof t [ n ] && ( t [ n ] = e [ n ] ) } , gantt . _init _skin = function ( ) { if ( ! gantt . skin ) for ( var t = document . getElementsByTagName ( "link" ) , e = 0 ; e < t . length ; e ++ ) { var n = t [ e ] . href . match ( "dhtmlxgantt_([a-z]+).css" ) ; if ( n ) { gantt . skin = n [ 1 ] ; break } } gantt . skin || ( gantt . skin = "terrace" ) ; var i = gantt . skins [ gantt . skin ] ; this . _configure ( gantt . config , i . config ) ;
var a = gantt . config . columns ; a [ 1 ] && "undefined" == typeof a [ 1 ] . width && ( a [ 1 ] . width = i . _second _column _width ) , a [ 2 ] && "undefined" == typeof a [ 2 ] . width && ( a [ 2 ] . width = i . _third _column _width ) , i . _lightbox _template && ( gantt . _lightbox _template = i . _lightbox _template ) , gantt . _init _skin = function ( ) { } } , gantt . skins = { } , gantt . _lightbox _methods = { } , gantt . _lightbox _template = "<div class='dhx_cal_ltitle'><span class='dhx_mark'> </span><span class='dhx_time'></span><span class='dhx_title'></span></div><div class='dhx_cal_larea'></div>" , gantt . showLightbox = function ( t ) { if ( t && ! this . config . readonly && 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 ) { var t = gantt . _tasks , e = this . _get _line ( t . unit ) * t . step / 60 ; return e >= 1440 && ( e = this . config . time _step ) , e } return this . config . time _step } , gantt . getLabel = function ( t , e ) { for ( var n = this . _get _typed _lightbox _config ( ) , i = 0 ; i < n . length ; i ++ ) if ( n [ i ] . map _to == t ) for ( var a = n [ i ] . options , s = 0 ; s < a . length ; s ++ ) if ( a [ s ] . key == e ) return a [ s ] . label ; return "" } , gantt . updateCollection = function ( t , e ) { var e = e . slice ( 0 ) , 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 ) ; var e = document . createElement ( "DIV" ) ; e . className = "dhx_cal_light" ; var n = this . _is _lightbox _timepicker ( ) ; ( gantt . config . wide _form || n ) && ( e . className += " dhx_cal_light_wide" ) , n && ( gantt . config . wide _form = ! 0 , e . className += " dhx_cal_light_full" ) , e . style . visibility = "hidden" ;
var i = this . _lightbox _template , a = this . config . buttons _left ; for ( var s in a ) i += "<div class='dhx_btn_set dhx_left_btn_set " + a [ s ] + "_set'><div dhx_button='1' class='" + a [ s ] + "'></div><div>" + this . locale . labels [ a [ s ] ] + "</div></div>" ; a = this . config . buttons _right ; for ( var s in a ) i += "<div class='dhx_btn_set dhx_right_btn_set " + a [ s ] + "_set' style='float:right;'><div dhx_button='1' class='" + a [ s ] + "'></div><div>" + this . locale . labels [ a [ s ] ] + "</div></div>" ; i += "</div>" , e . innerHTML = i , 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 r = this . _get _typed _lightbox _config ( t ) ; i = this . _render _sections ( r ) ; for ( var o = e . getElementsByTagName ( "div" ) , s = 0 ; s < o . length ; s ++ ) { var d = o [ s ] ; if ( "dhx_cal_larea" == d . className ) { d . innerHTML = i ; 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 ++ ) { var i = this . form _blocks [ t [ n ] . type ] ;
if ( i ) { t [ n ] . id = "area_" + dhtmlx . uid ( ) ; var a = t [ n ] . hidden ? " style='display:none'" : "" , s = "" ; t [ n ] . button && ( s = "<div class='dhx_custom_button' index='" + n + "'><div class='dhx_custom_button_" + t [ n ] . button + "'></div><div>" + this . locale . labels [ "button_" + t [ n ] . button ] + "</div></div>" ) , this . config . wide _form && ( e += "<div class='dhx_wrap_section' " + a + ">" ) , e += "<div id='" + t [ n ] . id + "' class='dhx_cal_lsection'>" + s + this . locale . labels [ "section_" + t [ n ] . name ] + "</div>" + i . render . call ( this , t [ n ] ) , e += "</div>" } } return e } , gantt . resizeLightbox = function ( ) { var t = this . _lightbox ;
if ( t ) { var e = t . childNodes [ 1 ] ; e . style . height = "0px" , e . style . height = e . scrollHeight + "px" , t . style . height = e . scrollHeight + this . config . lightbox _additional _height + "px" , e . style . height = e . scrollHeight + "px" } } , gantt . _center _lightbox = function ( t ) { if ( t ) { t . style . display = "block" ; var e = window . pageYOffset || document . body . scrollTop || document . documentElement . scrollTop , n = window . pageXOffset || document . body . scrollLeft || document . documentElement . scrollLeft , i = window . innerHeight || document . documentElement . clientHeight ; t . style . top = e ? Math . round ( e + Math . max ( ( i - t . offsetHeight ) / 2 , 0 ) ) + "px" : Math . round ( Math . max ( ( i - t . offsetHeight ) / 2 , 0 ) + 9 ) + "px" , t . style . left = document . documentElement . scrollWidth > document . body . offsetWidth ? Math . round ( n + ( document . body . offsetWidth - t . offsetWidth ) / 2 ) + "px" : Math . round ( ( document . body . offsetWidth - t . offsetWidth ) / 2 ) + "px"
} } , gantt . showCover = function ( ) { if ( ! this . _cover ) { this . _cover = document . createElement ( "DIV" ) , this . _cover . className = "dhx_cal_cover" ; var t = void 0 !== document . height ? document . height : document . body . offsetHeight , e = document . documentElement ? document . documentElement . scrollHeight : 0 ; this . _cover . style . height = Math . max ( t , e ) + "px" , document . body . appendChild ( this . _cover ) } } , gantt . _init _lightbox _events = function ( ) { gantt . lightbox _events = { } , gantt . lightbox _events . dhx _save _btn = function ( ) { gantt . _save _lightbox ( ) } , gantt . lightbox _events . dhx _delete _btn = function ( ) { gantt . callEvent ( "onLightboxDelete" , [ gantt . _lightbox _id ] ) && gantt . $click . buttons [ "delete" ] ( gantt . _lightbox _id )
} , gantt . lightbox _events . dhx _cancel _btn = function ( ) { gantt . _cancel _lightbox ( ) } , gantt . lightbox _events [ "default" ] = function ( t , e ) { if ( e . getAttribute ( "dhx_button" ) ) gantt . callEvent ( "onLightboxButton" , [ e . className , e , t ] ) ; else { var n , i , a ; - 1 != e . className . indexOf ( "dhx_custom_button" ) && ( - 1 != e . className . indexOf ( "dhx_custom_button_" ) ? ( n = e . parentNode . getAttribute ( "index" ) , a = e . parentNode . parentNode ) : ( n = e . getAttribute ( "index" ) , a = e . parentNode , e = e . firstChild ) ) ; var s = gantt . _get _typed _lightbox _config ( ) ; n && ( i = gantt . form _blocks [ s [ n ] . type ] , i . button _click ( n , e , a , a . nextSibling ) )
} } , dhtmlxEvent ( gantt . getLightbox ( ) , "click" , function ( t ) { t = t || window . event ; var e = t . target ? t . target : t . srcElement ; if ( e . className || ( e = e . previousSibling ) , e && e . className && 0 === e . className . indexOf ( "dhx_btn_set" ) && ( e = e . firstChild ) , e && e . className ) { var n = dhtmlx . defined ( gantt . lightbox _events [ e . className ] ) ? gantt . lightbox _events [ e . className ] : gantt . lightbox _events [ "default" ] ; return n ( t , e ) } return ! 1 } ) , gantt . getLightbox ( ) . onkeydown = function ( t ) { switch ( ( t || event ) . keyCode ) { case gantt . keys . edit _save : if ( ( t || event ) . shiftKey ) return ;
gantt . _save _lightbox ( ) ; break ; case gantt . keys . edit _cancel : gantt . _cancel _lightbox ( ) } } } , gantt . _cancel _lightbox = function ( ) { var t = this . getLightboxValues ( ) ; this . callEvent ( "onLightboxCancel" , [ this . _lightbox _id , t . $new ] ) , t . $new && ( this . _deleteTask ( t . id , ! 0 ) , this . refreshData ( ) ) , this . hideLightbox ( ) } , gantt . _save _lightbox = function ( ) { var t = this . getLightboxValues ( ) ; this . callEvent ( "onLightboxSave" , [ this . _lightbox _id , t , ! ! t . $new ] ) && ( t . $new ? ( delete t . $new , this . addTask ( t ) ) : ( dhtmlx . mixin ( this . getTask ( t . id ) , t , ! 0 ) , this . updateTask ( t . id ) ) , this . refreshData ( ) , this . hideLightbox ( ) )
} , gantt . getLightboxValues = function ( ) { for ( var t = dhtmlx . mixin ( { } , this . getTask ( this . _lightbox _id ) ) , e = this . _get _typed _lightbox _config ( ) , n = 0 ; n < e . length ; n ++ ) { var i = document . getElementById ( e [ n ] . id ) ; i = i ? i . nextSibling : i ; var a = this . form _blocks [ e [ n ] . type ] , s = a . get _value . call ( this , i , t , e [ n ] ) ; "auto" != e [ n ] . map _to && ( t [ e [ n ] . map _to ] = s ) } return t } , gantt . hideLightbox = function ( ) { var t = this . getLightbox ( ) ; t && ( t . style . display = "none" ) , this . _lightbox _id = null , this . hideCover ( ) , this . callEvent ( "onAfterLightbox" , [ ] ) } , gantt . hideCover = function ( ) { this . _cover && this . _cover . parentNode . removeChild ( this . _cover ) , this . _cover = null
} , gantt . resetLightbox = function ( ) { gantt . _lightbox && ! gantt . _custom _lightbox && gantt . _lightbox . parentNode . removeChild ( gantt . _lightbox ) , gantt . _lightbox = null } , gantt . _set _lightbox _values = function ( t , e ) { var n = t , i = e . getElementsByTagName ( "span" ) ; gantt . templates . lightbox _header ? ( i [ 1 ] . innerHTML = "" , i [ 2 ] . innerHTML = gantt . templates . lightbox _header ( n . start _date , n . end _date , n ) ) : ( i [ 1 ] . innerHTML = this . templates . task _time ( n . start _date , n . end _date , n ) , i [ 2 ] . innerHTML = ( this . templates . task _text ( n . start _date , n . end _date , n ) || "" ) . substr ( 0 , 70 ) ) ;
for ( var a = this . _get _typed _lightbox _config ( this . getLightboxType ( ) ) , s = 0 ; s < a . length ; s ++ ) { var r = a [ s ] ; if ( this . form _blocks [ r . type ] ) { var o = document . getElementById ( r . id ) . nextSibling , d = this . form _blocks [ r . type ] , l = dhtmlx . defined ( n [ r . map _to ] ) ? n [ r . map _to ] : r . default _value ; d . set _value . call ( this , o , l , n , r ) , r . focus && d . focus . call ( this , o ) } } t . id && ( gantt . _lightbox _id = t . id ) } , gantt . _fill _lightbox = function ( t , e ) { var n = this . getTask ( t ) ; this . _set _lightbox _values ( n , e ) } , gantt . getLightboxSection = function ( t ) { var e = this . _get _typed _lightbox _config ( ) , n = 0 ;
for ( n ; n < e . length && e [ n ] . name != t ; n ++ ) ; var i = e [ n ] ; this . _lightbox || this . getLightbox ( ) ; var a = document . getElementById ( i . id ) , s = a . nextSibling , r = { section : i , header : a , node : s , getValue : function ( t ) { return this . form _blocks [ i . type ] . get _value ( s , t || { } , i ) } , setValue : function ( t , e ) { return this . form _blocks [ i . type ] . set _value ( s , t , e || { } , i ) } } , o = this . _lightbox _methods [ "get_" + i . type + "_control" ] ; return o ? o ( r ) : r } , gantt . _lightbox _methods . get _template _control = function ( t ) { return t . control = t . node , t } , gantt . _lightbox _methods . get _select _control = function ( t ) { return t . control = t . node . getElementsByTagName ( "select" ) [ 0 ] , t
} , gantt . _lightbox _methods . get _textarea _control = function ( t ) { return t . control = t . node . getElementsByTagName ( "textarea" ) [ 0 ] , t } , gantt . _lightbox _methods . get _time _control = function ( t ) { return t . control = t . node . getElementsByTagName ( "select" ) , t } , gantt . _init _dnd _events = function ( ) { dhtmlxEvent ( document . body , "mousemove" , gantt . _move _while _dnd ) , dhtmlxEvent ( document . body , "mouseup" , gantt . _finish _dnd ) , gantt . _init _dnd _events = function ( ) { } } , gantt . _move _while _dnd = function ( t ) { if ( gantt . _dnd _start _lb ) { document . dhx _unselectable || ( document . body . className += " dhx_unselectable" , document . dhx _unselectable = ! 0 ) ;
var e = gantt . getLightbox ( ) , n = t && t . target ? [ t . pageX , t . pageY ] : [ event . clientX , event . clientY ] ; e . style . top = gantt . _lb _start [ 1 ] + n [ 1 ] - gantt . _dnd _start _lb [ 1 ] + "px" , e . style . left = gantt . _lb _start [ 0 ] + n [ 0 ] - gantt . _dnd _start _lb [ 0 ] + "px" } } , gantt . _ready _to _dnd = function ( t ) { var e = gantt . getLightbox ( ) ; gantt . _lb _start = [ parseInt ( e . style . left , 10 ) , parseInt ( e . style . top , 10 ) ] , gantt . _dnd _start _lb = t && t . target ? [ t . pageX , t . pageY ] : [ event . clientX , event . clientY ] } , gantt . _finish _dnd = function ( ) { gantt . _lb _start && ( gantt . _lb _start = gantt . _dnd _start _lb = ! 1 , document . body . className = document . body . className . replace ( " dhx_unselectable" , "" ) , document . dhx _unselectable = ! 1 )
} , gantt . _focus = function ( t , e ) { t && t . focus && ( gantt . config . touch || ( e && t . select && t . select ( ) , t . focus ( ) ) ) } , gantt . form _blocks = { getTimePicker : function ( t , e ) { var n = t . time _format ; if ( ! n ) { var n = [ "%d" , "%m" , "%Y" ] ; gantt . _get _line ( gantt . _tasks . unit ) < gantt . _get _line ( "day" ) && n . push ( "%H:%i" ) } t . _time _format _order = { size : 0 } ; var i = this . config , a = this . date . date _part ( new Date ( gantt . _min _date . valueOf ( ) ) ) , s = 1440 , r = 0 ; gantt . config . limit _time _select && ( s = 60 * i . last _hour + 1 , r = 60 * i . first _hour , a . setHours ( i . first _hour ) ) ; for ( var o = "" , d = 0 ; d < n . length ; d ++ ) { var l = n [ d ] ;
d > 0 && ( o += " " ) ; var _ = "" ; switch ( l ) { case "%Y" : t . _time _format _order [ 2 ] = d , t . _time _format _order . size ++ ; for ( var h = a . getFullYear ( ) - 5 , c = 0 ; 10 > c ; c ++ ) _ += "<option value='" + ( h + c ) + "'>" + ( h + c ) + "</option>" ; break ; case "%m" : t . _time _format _order [ 1 ] = d , t . _time _format _order . size ++ ; for ( var c = 0 ; 12 > c ; c ++ ) _ += "<option value='" + c + "'>" + this . locale . date . month _full [ c ] + "</option>" ; break ; case "%d" : t . _time _format _order [ 0 ] = d , t . _time _format _order . size ++ ; for ( var c = 1 ; 32 > c ; c ++ ) _ += "<option value='" + c + "'>" + c + "</option>" ; break ; case "%H:%i" : var s = 1440 , r = 0 ;
t . _time _format _order [ 3 ] = d , t . _time _format _order . size ++ ; var c = r , g = a . getDate ( ) ; for ( t . _time _values = [ ] ; s > c ; ) { var u = this . templates . time _picker ( a ) ; _ += "<option value='" + c + "'>" + u + "</option>" , t . _time _values . push ( c ) , a . setTime ( a . valueOf ( ) + 60 * this . _get _timepicker _step ( ) * 1e3 ) ; var f = a . getDate ( ) != g ? 1 : 0 ; c = 24 * f * 60 + 60 * a . getHours ( ) + a . getMinutes ( ) } } if ( _ ) { var p = t . readonly ? "disabled='disabled'" : "" , m = e ? " style='display:none'" : "" ; o += "<select " + p + m + ">" + _ + "</select>" } } return o } , _fill _lightbox _select : function ( t , e , n , i ) { if ( t [ e + i [ 0 ] ] . value = n . getDate ( ) , t [ e + i [ 1 ] ] . value = n . getMonth ( ) , t [ e + i [ 2 ] ] . value = n . getFullYear ( ) , dhtmlx . defined ( i [ 3 ] ) ) { var a = 60 * n . getHours ( ) + n . getMinutes ( ) ;
a = Math . round ( a / gantt . _get _timepicker _step ( ) ) * gantt . _get _timepicker _step ( ) , t [ e + i [ 3 ] ] . value = a } } , template : { render : function ( t ) { var e = ( t . height || "30" ) + "px" ; return "<div class='dhx_cal_ltext dhx_cal_template' style='height:" + e + ";'></div>" } , set _value : function ( t , e ) { t . innerHTML = e || "" } , get _value : function ( t ) { return t . innerHTML || "" } , focus : function ( ) { } } , textarea : { render : function ( t ) { var e = ( t . height || "130" ) + "px" ; return "<div class='dhx_cal_ltext' style='height:" + e + ";'><textarea></textarea></div>" } , set _value : function ( t , e ) { t . firstChild . value = e || ""
} , get _value : function ( t ) { return t . firstChild . value } , focus : function ( t ) { var e = t . firstChild ; gantt . _focus ( e , ! 0 ) } } , select : { render : function ( t ) { for ( var e = ( t . height || "23" ) + "px" , n = "<div class='dhx_cal_ltext' style='height:" + e + ";'><select style='width:100%;'>" , i = 0 ; i < t . options . length ; i ++ ) n += "<option value='" + t . options [ i ] . key + "'>" + t . options [ i ] . label + "</option>" ; return n += "</select></div>" } , set _value : function ( t , e , n , i ) { var a = t . firstChild ; ! a . _dhx _onchange && i . onchange && ( a . onchange = i . onchange , a . _dhx _onchange = ! 0 ) , "undefined" == typeof e && ( e = ( a . options [ 0 ] || { } ) . value ) , a . value = e || ""
} , get _value : function ( t ) { return t . firstChild . value } , focus : function ( t ) { var e = t . firstChild ; gantt . _focus ( e , ! 0 ) } } , time : { render : function ( t ) { var e = this . form _blocks . getTimePicker . call ( this , t ) , n = [ "<div style='height:30px;padding-top:0px;font-size:inherit;text-align:center;' class='dhx_section_time'>" ] ; return n . push ( e ) , t . single _date ? ( e = this . form _blocks . getTimePicker . call ( this , t , ! 0 ) , n . push ( "<span></span>" ) ) : n . push ( "<span style='font-weight:normal; font-size:10pt;'> – </span>" ) , n . push ( e ) , n . push ( "</div>" ) , n . join ( "" )
} , set _value : function ( t , e , n , i ) { { var a = this . config , s = t . getElementsByTagName ( "select" ) , r = i . _time _format _order ; i . _time _format _size } if ( a . auto _end _date ) for ( var o = function ( ) { var t = new Date ( s [ r [ 2 ] ] . value , s [ r [ 1 ] ] . value , s [ r [ 0 ] ] . value , 0 , 0 ) , e = gantt . calculateEndDate ( t , 1 ) ; this . form _blocks . _fill _lightbox _select ( s , r . size , e , r , a ) } , d = 0 ; 4 > d ; d ++ ) s [ d ] . onchange = o ; this . form _blocks . _fill _lightbox _select ( s , 0 , n . start _date , r , a ) , this . form _blocks . _fill _lightbox _select ( s , r . size , n . end _date , r , a ) } , get _value : function ( t , e , n ) { var i = t . getElementsByTagName ( "select" ) , a = n . _time _format _order , s = 0 , r = 0 ;
if ( dhtmlx . defined ( a [ 3 ] ) ) { var o = parseInt ( i [ a [ 3 ] ] . value , 10 ) ; s = Math . floor ( o / 60 ) , r = o % 60 } if ( e . start _date = new Date ( i [ a [ 2 ] ] . value , i [ a [ 1 ] ] . value , i [ a [ 0 ] ] . value , s , r ) , s = r = 0 , dhtmlx . defined ( a [ 3 ] ) ) { var o = parseInt ( i [ a . size + a [ 3 ] ] . value , 10 ) ; s = Math . floor ( o / 60 ) , r = o % 60 } return e . end _date = new Date ( i [ a [ 2 ] + a . size ] . value , i [ a [ 1 ] + a . size ] . value , i [ a [ 0 ] + a . size ] . value , s , r ) , e . end _date <= e . start _date && ( e . end _date = gantt . date . add ( e . start _date , gantt . _get _timepicker _step ( ) , "minute" ) ) , { start _date : new Date ( e . start _date ) , end _date : new Date ( e . end _date ) }
} , focus : function ( t ) { gantt . _focus ( t . getElementsByTagName ( "select" ) [ 0 ] ) } } , duration : { render : function ( t ) { var e = this . form _blocks . getTimePicker . call ( this , t ) ; e = "<div class='dhx_time_selects'>" + e + "</div>" ; var n = this . locale . labels [ this . config . duration _unit + "s" ] , i = t . single _date ? ' style="display:none"' : "" , a = t . readonly ? " disabled='disabled'" : "" , s = "<div class='dhx_gantt_duration' " + i + "><input type='button' class='dhx_gantt_duration_dec' value='-'" + a + "><input type='text' value='5' class='dhx_gantt_duration_value'" + a + "><input type='button' class='dhx_gantt_duration_inc' value='+'" + a + "> " + n + " <span></span></div>" , r = "<div style='height:30px;padding-top:0px;font-size:inherit;' class='dhx_section_time'>" + e + " " + s + "</div>" ;
return r } , set _value : function ( t , e , n , i ) { function a ( ) { var e = gantt . form _blocks . duration . _get _start _date . call ( gantt , t , i ) , n = gantt . form _blocks . duration . _get _duration . call ( gantt , t , i ) , a = gantt . calculateEndDate ( e , n ) ; h . innerHTML = gantt . templates . task _date ( a ) } function s ( t ) { var e = l . value ; e = parseInt ( e , 10 ) , window . isNaN ( e ) && ( e = 0 ) , e += t , 1 > e && ( e = 1 ) , l . value = e , a ( ) } var r = this . config , o = t . getElementsByTagName ( "select" ) , d = t . getElementsByTagName ( "input" ) , l = d [ 1 ] , _ = [ d [ 0 ] , d [ 2 ] ] , h = t . getElementsByTagName ( "span" ) [ 0 ] , c = i . _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 = a , o [ 1 ] . onchange = a , o [ 2 ] . onchange = a , o [ 3 ] && ( o [ 3 ] . onchange = a ) , l . 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 ( ) { a ( ) } , 1 ) } , this ) , l . onchange = dhtmlx . bind ( function ( ) { a ( ) } , this ) , this . form _blocks . _fill _lightbox _select ( o , 0 , n . start _date , c , r ) ;
var g ; g = n . end _date ? gantt . calculateDuration ( n . start _date , n . end _date ) : n . duration , g = Math . round ( g ) , l . value = g , a ( ) } , _get _start _date : function ( t , e ) { var n = t . getElementsByTagName ( "select" ) , i = e . _time _format _order , a = 0 , s = 0 ; if ( dhtmlx . defined ( i [ 3 ] ) ) { var r = parseInt ( n [ i [ 3 ] ] . value , 10 ) ; a = Math . floor ( r / 60 ) , s = r % 60 } return new Date ( n [ i [ 2 ] ] . value , n [ i [ 1 ] ] . value , n [ i [ 0 ] ] . value , a , s ) } , _get _duration : function ( t ) { var e = t . getElementsByTagName ( "input" ) [ 1 ] ; return e = parseInt ( e . value , 10 ) , window . isNaN ( e ) && ( e = 1 ) , 0 > e && ( e *= - 1 ) , e } , get _value : function ( t , e , n ) { e . start _date = this . form _blocks . duration . _get _start _date ( t , n ) ;
var i = this . form _blocks . duration . _get _duration ( t , n ) ; return e . end _date = this . calculateEndDate ( e . start _date , i ) , e . duration = i , { start _date : new Date ( e . start _date ) , end _date : new Date ( e . end _date ) } } , focus : function ( t ) { gantt . _focus ( t . getElementsByTagName ( "select" ) [ 0 ] ) } } , typeselect : { render : function ( t ) { var e = gantt . config . types , n = gantt . locale . labels , i = [ ] ; for ( var a in e ) i . push ( { key : e [ a ] , label : n [ "type_" + a ] } ) ; t . options = i ; var s = t . onchange ; return t . onchange = function ( ) { gantt . getState ( ) . lightbox ; gantt . changeLightboxType ( this . value ) , "function" == typeof s && s . apply ( this , arguments )
} , gantt . form _blocks . select . render . apply ( this , arguments ) } , set _value : function ( ) { return gantt . form _blocks . select . set _value . apply ( this , arguments ) } , get _value : function ( ) { return gantt . form _blocks . select . get _value . apply ( this , arguments ) } , focus : function ( ) { return gantt . form _blocks . select . focus . apply ( this , arguments ) } } , parent : { _filter : function ( t , e , n ) { var i = e . filter || function ( ) { return ! 0 } ; t = t . slice ( 0 ) ; for ( var a = 0 ; a < t . length ; a ++ ) { var s = t [ a ] ; ( s . id == n || gantt . isChildOf ( s . id , n ) || i ( s . id , s ) === ! 1 ) && ( t . splice ( a , 1 ) , a -- ) } return t
} , _display : function ( t , e ) { var n = [ ] , i = [ ] ; 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 a = t . template || gantt . templates . task _text , s = 0 ; s < n . length ; s ++ ) { var r = a . apply ( gantt , [ n [ s ] . start _date , n [ s ] . end _date , n [ s ] ] ) ; void 0 === r && ( r = "" ) , i . push ( { key : n [ s ] . id , label : r } ) } return t . options = i , 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 , i ) { var a = document . createElement ( "div" ) ; a . innerHTML = gantt . form _blocks . parent . _display ( i , n . id ) ; var s = a . removeChild ( a . firstChild ) ; return t . onselect = null , t . parentNode . replaceChild ( s , t ) , gantt . form _blocks . select . set _value . apply ( this , [ s , e , n , i ] ) } , get _value : function ( ) { return gantt . form _blocks . select . get _value . apply ( this , arguments ) } , focus : function ( ) { return gantt . form _blocks . select . focus . apply ( this , arguments ) } } } , gantt . _is _lightbox _timepicker = function ( ) { 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 , i ) { if ( ! t ) return n ( ) ; var a = { text : t } ; e && ( a . title = e ) , i && ( a . ok = i ) , n && ( a . callback = function ( t ) { t && n ( ) } ) , dhtmlx . confirm ( a ) } , 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 , i = this . getLightboxValues ( ) , a = dhtmlx . copy ( this . getTask ( n ) ) ;
this . resetLightbox ( ) ; var s = dhtmlx . mixin ( a , i , ! 0 ) , r = this . getLightbox ( t ? t : void 0 ) ; this . _set _lightbox _values ( s , r ) , this . _center _lightbox ( this . getLightbox ( ) ) , this . callEvent ( "onLightboxChange" , [ e , this . getLightboxType ( ) ] ) } else this . resetLightbox ( ) , this . getLightbox ( t ? t : void 0 ) ; this . callEvent ( "onLightboxChange" , [ e , this . getLightboxType ( ) ] ) } , dataProcessor . prototype = { setTransactionMode : function ( t , e ) { this . _tMode = t , this . _tSend = e } , escape : function ( t ) { return this . _utf ? encodeURIComponent ( t ) : escape ( t ) } , enableUTFencoding : function ( t ) { this . _utf = convertStringToBoolean ( t )
} , setDataColumns : function ( t ) { this . _columns = "string" == typeof t ? t . split ( "," ) : t } , getSyncState : function ( ) { return ! this . updatedRows . length } , enableDataNames : function ( t ) { this . _endnm = convertStringToBoolean ( t ) } , enablePartialDataSend : function ( t ) { this . _changed = convertStringToBoolean ( 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 ) { var i = this . findRow ( t ) ;
n = n || "updated" ; var a = this . obj . getUserData ( t , this . action _param ) ; a && "updated" == n && ( n = a ) , e ? ( this . set _invalid ( t , ! 1 ) , this . updatedRows [ i ] = 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 ( i , 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 i = "" , a = this . is _invalid ( t ) ; if ( a && ( i = this . styles [ a ] , e = ! 0 ) , this . callEvent ( "onRowMark" , [ t , e , n , a ] ) && ( i = this . styles [ e ? n : "clear" ] + i , this . obj [ this . _methods [ 0 ] ] ( t , i ) , a && a . details ) ) { i += this . styles [ a + "_cell" ] ;
for ( var s = 0 ; s < a . details . length ; s ++ ) a . details [ s ] && this . obj [ this . _methods [ 1 ] ] ( t , s , i ) } } , getState : function ( t ) { return this . obj . getUserData ( t , this . action _param ) } , is _invalid : function ( t ) { return this . _invalid [ t ] } , set _invalid : function ( t , e , n ) { n && ( e = { value : e , details : n , toString : function ( ) { return this . value . toString ( ) } } ) , this . _invalid [ t ] = e } , 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 ) { if ( "string" == typeof t ) return t ; if ( "undefined" != typeof e ) return this . serialize _one ( t , "" ) ; var n = [ ] , i = [ ] ; for ( var a in t ) t . hasOwnProperty ( a ) && ( n . push ( this . serialize _one ( t [ a ] , a + this . post _delim ) ) , i . push ( a ) ) ; return n . push ( "ids=" + this . escape ( i . 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 = [ ] ; for ( var i in t ) t . hasOwnProperty ( i ) && n . push ( this . escape ( ( e || "" ) + i ) + "=" + this . escape ( t [ i ] ) ) ; return n . join ( "&" ) } , _sendData : function ( t , e ) { if ( t ) { if ( ! this . callEvent ( "onBeforeDataSending" , e ? [ e , this . getState ( e ) , t ] : [ null , null , t ] ) ) return ! 1 ; e && ( this . _in _progress [ e ] = ( new Date ) . valueOf ( ) ) ; var n = new dtmlXMLLoaderObject ( this . afterUpdate , this , ! 0 ) , i = this . serverProcessor + ( this . _user ? getUrlSymbol ( this . serverProcessor ) + [ "dhx_user=" + this . _user , "dhx_version=" + this . obj . getUserData ( 0 , "version" ) ] . join ( "&" ) : "" ) ; "POST" != this . _tMode ? n . loadXML ( i + ( - 1 != i . indexOf ( "?" ) ? "&" : "?" ) + this . serialize ( t , e ) ) : n . loadXML ( i , ! 0 , this . serialize ( t , e ) ) , this . _waitMode ++
} } , sendAllData : function ( ) { 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
} } } , _getAllData : function ( ) { for ( var t = { } , e = ! 1 , n = 0 ; n < this . updatedRows . length ; n ++ ) { var i = this . updatedRows [ n ] ; this . _in _progress [ i ] || this . is _invalid ( i ) || this . callEvent ( "onBeforeUpdate" , [ i , this . getState ( i ) ] ) && ( t [ i ] = this . _getRowData ( i , i + this . post _delim ) , e = ! 0 , this . _in _progress [ i ] = ( new Date ) . valueOf ( ) ) } return e ? t : null } , 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 ; 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 , i ) { var a = t , s = "error" != n && "invalid" != n ; if ( s || this . set _invalid ( t , n ) , this . _uActions && this . _uActions [ n ] && ! this . _uActions [ n ] ( i ) ) return delete this . _in _progress [ a ] ; "wait" != this . _in _progress [ a ] && 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 [ a ] , this . callEvent ( "onAfterUpdate" , [ t , n , e , i ] )
} "wait" != this . _in _progress [ a ] ? ( s && this . obj . setUserData ( t , this . action _param , "" ) , delete this . _in _progress [ a ] ) : ( delete this . _in _progress [ a ] , this . setUpdated ( e , ! 0 , this . obj . getUserData ( t , this . action _param ) ) ) , this . callEvent ( "onAfterUpdate" , [ r , n , e , i ] ) } , afterUpdate : function ( t , e , n , i , a ) { if ( a . getXMLTopNode ( "data" ) , a . xmlDoc . responseXML ) { for ( var s = a . doXPath ( "//data/action" ) , r = 0 ; r < s . length ; r ++ ) { var o = s [ r ] , d = o . getAttribute ( "type" ) , l = o . getAttribute ( "sid" ) , _ = o . getAttribute ( "tid" ) ; t . afterUpdateCallback ( l , _ , d , o ) } t . finalizeUpdate ( )
} } , 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" , [ ] ) } , 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 ) } , 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 , i ) { this . afterAutoUpdate ( t , e , n , i )
} ) , this . attachEvent ( "onFullSync" , function ( ) { this . fullSync ( ) } ) ; var n = this ; window . setInterval ( function ( ) { n . loadUpdate ( ) } , t ) } , afterAutoUpdate : function ( t , e ) { return "collision" == e ? ( this . _need _update = ! 0 , ! 1 ) : ! 0 } , fullSync : function ( ) { return this . _need _update === ! 0 && ( 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 ) )
} , _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 , e = this . obj . getUserData ( 0 , "version" ) , n = this . serverProcessor + getUrlSymbol ( 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 i = 0 ; i < n . length ; i ++ ) { var a = n [ i ] . getAttribute ( "status" ) , s = n [ i ] . getAttribute ( "id" ) , r = n [ i ] . getAttribute ( "parent" ) ; switch ( a ) { case "inserted" : t . callEvent ( "insertCallback" , [ n [ i ] , s , r ] ) ; break ; case "updated" : t . callEvent ( "updateCallback" , [ n [ i ] , s , r ] ) ; break ; case "deleted" : t . callEvent ( "deleteCallback" , [ n [ i ] , s , r ] ) } } t . _silent _mode = ! 1 } t . _update _busy = ! 1 , t = null } ) } } , dhtmlx . assert = function ( t , e ) { t || dhtmlx . message ( { type : "error" , text : e , expire : - 1 } ) } , gantt . init = function ( t , e , n ) { 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 . config . scroll _size || ( this . config . scroll _size = this . _detectScrollSize ( ) ) , this . _reinit ( t ) , this . attachEvent ( "onLoadEnd" , this . render ) , dhtmlxEvent ( window , "resize" , this . _on _resize ) , this . init = function ( t ) { this . $container && ( this . $container . innerHTML = "" ) , this . _reinit ( t )
} , this . callEvent ( "onGanttReady" , [ ] ) } , gantt . _reinit = function ( t ) { this . _init _html _area ( t ) , this . _set _sizes ( ) , this . _task _area _pulls = { } , this . _task _area _renderers = { } , this . _init _touch _events ( ) , this . _init _templates ( ) , this . _init _grid ( ) , this . _init _tasks ( ) , this . render ( ) , 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 )
} , 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 = "<div class='gantt_container'><div class='gantt_grid'></div><div class='gantt_task'></div>" ; e += "<div class='gantt_ver_scroll'><div></div></div><div class='gantt_hor_scroll'><div></div></div></div>" , this . _obj . innerHTML = e , this . $container = this . _obj . firstChild ; var n = this . $container . childNodes ; this . $grid = n [ 0 ] , this . $task = n [ 1 ] , this . $scroll _ver = n [ 2 ] , this . $scroll _hor = n [ 3 ] , this . $grid . innerHTML = "<div class='gantt_grid_scale'></div><div class='gantt_grid_data'></div>" , this . $grid _scale = this . $grid . childNodes [ 0 ] , this . $grid _data = this . $grid . childNodes [ 1 ] , this . $task . innerHTML = "<div class='gantt_task_scale'></div><div class='gantt_data_area'><div class='gantt_task_bg'></div><div class='gantt_links_area'></div><div class='gantt_bars_area'></div></div>" , this . $task _scale = this . $task . childNodes [ 0 ] , this . $task _data = this . $task . childNodes [ 1 ] , this . $task _bg = this . $task _data . childNodes [ 0 ] , this . $task _links = this . $task _data . childNodes [ 1 ] , this . $task _bars = this . $task _data . childNodes [ 2 ]
} , gantt . $click = { buttons : { edit : function ( t ) { gantt . showLightbox ( t ) } , "delete" : function ( t ) { var e = gantt . locale . labels . confirm _deleting , n = gantt . locale . labels . confirm _deleting _title ; gantt . _dhtmlx _confirm ( e , n , function ( ) { var e = gantt . getTask ( t ) ; e . $new ? ( gantt . _deleteTask ( t , ! 0 ) , gantt . refreshData ( ) ) : gantt . deleteTask ( t ) , gantt . hideLightbox ( ) } ) } } } , gantt . _calculate _content _height = function ( ) { var t = this . config . scale _height , e = this . _order . length * this . config . row _height , n = this . _scroll _hor ? this . config . scroll _size + 1 : 0 ; return this . _is _grid _visible ( ) || this . _is _chart _visible ( ) ? t + e + 2 + n : 0
} , gantt . _calculate _content _width = function ( ) { { var t = this . _get _grid _width ( ) , e = this . _tasks ? this . _tasks . full _width : 0 ; this . _scroll _ver ? this . config . scroll _size + 1 : 0 } return this . _is _chart _visible ( ) || ( e = 0 ) , this . _is _grid _visible ( ) || ( t = 0 ) , t + e + 1 } , gantt . _get _resize _options = function ( ) { var t = { x : ! 1 , y : ! 1 } ; return "xy" == this . config . autosize ? t . x = t . y = ! 0 : "y" == this . config . autosize || this . config . autosize === ! 0 ? t . y = ! 0 : "x" == this . config . autosize && ( t . x = ! 0 ) , t } , gantt . _set _sizes = function ( ) { var t = this . _get _resize _options ( ) ; if ( t . y && ( this . _obj . style . height = this . _calculate _content _height ( ) + "px" ) , t . x && ( this . _obj . style . width = this . _calculate _content _width ( ) + "px" ) , this . _y = this . _obj . clientHeight , ! ( this . _y < 20 ) ) { this . $grid . style . height = this . $task . style . height = Math . max ( this . _y - this . $scroll _hor . offsetHeight - 2 , 0 ) + "px" ;
var e = Math . max ( this . _y - ( this . config . scale _height || 0 ) - this . $scroll _hor . offsetHeight - 2 , 0 ) ; this . $grid _data . style . height = this . $task _data . style . height = e + "px" ; var n = Math . max ( this . _get _grid _width ( ) - 1 , 0 ) ; this . $grid . style . width = n + "px" , this . $grid . style . display = 0 === n ? "none" : "" , this . _x = this . _obj . clientWidth , this . _x < 20 || ( this . $grid _data . style . width = Math . max ( this . _get _grid _width ( ) - 1 , 0 ) + "px" , this . $task . style . width = Math . max ( this . _x - this . _get _grid _width ( ) - 2 , 0 ) + "px" ) } } , gantt . getScrollState = function ( ) { return { x : this . $task . scrollLeft , y : this . $task _data . scrollTop }
} , gantt . scrollTo = function ( t , e ) { 1 * t == t && ( this . $task . scrollLeft = t ) , 1 * e == e && ( this . $task _data . scrollTop = e , this . $grid _data . scrollTop = e ) } , gantt . showDate = function ( t ) { var e = this . posFromDate ( t ) , n = Math . max ( e - this . config . task _scroll _offset , 0 ) ; this . scrollTo ( n ) } , gantt . showTask = function ( t ) { var e = this . getTaskNode ( t ) ; if ( e ) { var n = Math . max ( e . offsetLeft - this . config . task _scroll _offset , 0 ) , i = e . offsetTop - ( this . $task _data . offsetHeight - this . config . row _height ) / 2 ; this . scrollTo ( n , i ) } } , gantt . _on _resize = gantt . setSizes = function ( ) { gantt . _set _sizes ( ) , gantt . _scroll _resize ( )
} , gantt . render = function ( ) { if ( this . _render _grid ( ) , this . _render _tasks _scales ( ) , this . _scroll _resize ( ) , this . _on _resize ( ) , this . _render _data ( ) , this . config . initial _scroll ) { var t = this . _order [ 0 ] || this . config . root _id ; t && this . showTask ( t ) } this . callEvent ( "onGanttRender" , [ ] ) } , gantt . _set _scroll _events = function ( ) { dhtmlxEvent ( this . $scroll _hor , "scroll" , function ( ) { if ( ! gantt . _touch _scroll _active ) { var t = gantt . $scroll _hor . scrollLeft ; gantt . scrollTo ( t ) } } ) , dhtmlxEvent ( this . $scroll _ver , "scroll" , function ( ) { if ( ! gantt . _touch _scroll _active ) { var t = gantt . $scroll _ver . scrollTop ;
gantt . $grid _data . scrollTop = t , gantt . scrollTo ( null , t ) } } ) , dhtmlxEvent ( this . $task , "scroll" , function ( ) { var t = gantt . $task . scrollLeft , e = gantt . $scroll _hor . scrollLeft ; e != t && ( gantt . $scroll _hor . scrollLeft = t ) } ) , dhtmlxEvent ( this . $task _data , "scroll" , function ( ) { var t = gantt . $task _data . scrollTop , e = gantt . $scroll _ver . scrollTop ; e != t && ( gantt . $scroll _ver . scrollTop = t ) } ) , dhtmlxEvent ( gantt . $container , "mousewheel" , function ( t ) { var e = gantt . _get _resize _options ( ) ; if ( t . wheelDeltaX ) { if ( e . x ) return ! 0 ; var n = t . wheelDeltaX / - 40 , i = gantt . $task . scrollLeft + 30 * n ;
gantt . scrollTo ( i , null ) , gantt . $scroll _hor . scrollTop = a } else { if ( e . y ) return ! 0 ; var n = t . wheelDelta / - 40 ; "undefined" == typeof t . wheelDelta && ( n = t . detail ) ; var a = gantt . $grid _data . scrollTop + 30 * n ; gantt . scrollTo ( null , a ) , gantt . $scroll _ver . scrollTop = a } return t . preventDefault && t . preventDefault ( ) , t . cancelBubble = ! 0 , ! 1 } ) } , gantt . _scroll _resize = function ( ) { if ( ! ( this . _x < 20 || this . _y < 20 ) ) { var t = this . _get _grid _width ( ) , e = this . _x - t , n = this . _y - this . config . scale _height , i = this . config . scroll _size + 1 , a = this . $task _data . offsetWidth - i , s = this . config . row _height * this . _order . length , r = this . _get _resize _options ( ) , o = this . _scroll _hor = r . x ? ! 1 : a > e , d = this . _scroll _ver = r . y ? ! 1 : s > n ;
this . $scroll _hor . style . display = o ? "block" : "none" , this . $scroll _hor . style . height = ( o ? i : 0 ) + "px" , this . $scroll _hor . style . width = this . _x - ( d ? i : 2 ) + "px" , this . $scroll _hor . firstChild . style . width = a + t + i + 2 + "px" , this . $scroll _ver . style . display = d ? "block" : "none" , this . $scroll _ver . style . width = ( d ? i : 0 ) + "px" , this . $scroll _ver . style . height = this . _y - ( o ? i : 0 ) - this . config . scale _height + "px" , this . $scroll _ver . style . top = this . config . scale _height + "px" , this . $scroll _ver . firstChild . style . height = this . config . scale _height + s + "px" } } , gantt . locate = function ( t ) { var e = gantt . _get _target _node ( t ) ;
if ( "gantt_task_cell" == e . className ) return null ; for ( var n = arguments [ 1 ] || this . config . task _attribute ; e ; ) { if ( e . getAttribute ) { var i = e . getAttribute ( n ) ; if ( i ) return i } e = e . parentNode } return null } , gantt . _get _target _node = function ( t ) { var e ; return t . tagName ? e = t : ( t = t || window . event , e = t . target || t . srcElement ) , e } , gantt . _trim = function ( t ) { var e = String . prototype . trim || function ( ) { return this . replace ( /^\s+|\s+$/g , "" ) } ; return e . apply ( t ) } , gantt . _locate _css = function ( t , e , n ) { void 0 === n && ( n = ! 0 ) ; for ( var i = gantt . _get _target _node ( t ) , a = "" ; i ; ) { if ( a = i . className ) { var s = a . indexOf ( e ) ;
if ( s >= 0 ) { if ( ! n ) return i ; var r = 0 === s || ! gantt . _trim ( a . charAt ( s - 1 ) ) , o = s + e . length >= a . length || ! gantt . _trim ( a . charAt ( s + e . length ) ) ; if ( r && o ) return i } } i = i . parentNode } return null } , gantt . _locateHTML = function ( t , e ) { var n = gantt . _get _target _node ( t ) ; for ( e = e || this . config . task _attribute ; n ; ) { if ( n . getAttribute ) { var i = n . getAttribute ( e ) ; if ( i ) return n } n = n . parentNode } return null } , gantt . getTaskRowNode = function ( t ) { for ( var e = this . $grid _data . childNodes , n = this . config . task _attribute , i = 0 ; i < e . length ; i ++ ) if ( e [ i ] . getAttribute ) { var a = e [ i ] . getAttribute ( n ) ;
if ( a == t ) return e [ i ] } return null } , gantt . getState = function ( ) { return { drag _id : this . _tasks _dnd . drag . id , drag _mode : this . _tasks _dnd . drag . mode , drag _from _start : this . _tasks _dnd . drag . left , selected _task : this . _selected _task , min _date : new Date ( this . _min _date ) , max _date : new Date ( this . _max _date ) , lightbox : this . _lightbox _id } } , gantt . _checkTimeout = function ( t , e ) { if ( ! e ) return ! 0 ; var n = 1e3 / e ; return 1 > n ? ! 0 : t . _on _timeout ? ! 1 : ( setTimeout ( function ( ) { delete t . _on _timeout } , n ) , t . _on _timeout = ! 0 , ! 0 ) } , gantt . selectTask = function ( t ) { if ( ! this . config . select _task ) return ! 1 ;
if ( t ) { if ( this . _selected _task == t ) return this . _selected _task ; if ( ! this . callEvent ( "onBeforeTaskSelected" , [ t ] ) ) return ! 1 ; this . unselectTask ( ) , this . _selected _task = t , this . refreshTask ( t ) , this . callEvent ( "onTaskSelected" , [ t ] ) } return this . _selected _task } , gantt . unselectTask = function ( ) { var t = this . _selected _task ; t && ( this . _selected _task = null , this . refreshTask ( t ) , this . callEvent ( "onTaskUnselected" , [ t ] ) ) } , gantt . getSelectedId = function ( ) { return dhtmlx . defined ( this . _selected _task ) ? this . _selected _task : null } , gantt . changeLightboxType = function ( t ) { return this . getLightboxType ( ) == t ? ! 0 : void gantt . _silent _redraw _lightbox ( t )
} , gantt . date = { init : function ( ) { for ( var t = gantt . locale . date . month _short , e = gantt . locale . date . month _short _hash = { } , n = 0 ; n < t . length ; n ++ ) e [ t [ n ] ] = n ; for ( var t = gantt . locale . date . month _full , e = gantt . locale . date . month _full _hash = { } , n = 0 ; n < t . length ; n ++ ) e [ t [ n ] ] = n } , date _part : function ( t ) { return t . setHours ( 0 ) , t . setMinutes ( 0 ) , t . setSeconds ( 0 ) , t . setMilliseconds ( 0 ) , t . getHours ( ) && t . setTime ( t . getTime ( ) + 36e5 * ( 24 - t . getHours ( ) ) ) , t } , time _part : function ( t ) { return ( t . valueOf ( ) / 1e3 - 60 * t . getTimezoneOffset ( ) ) % 86400 } , week _start : function ( t ) { var e = t . getDay ( ) ;
return gantt . config . start _on _monday && ( 0 === e ? e = 6 : e -- ) , this . date _part ( this . add ( t , - 1 * e , "day" ) ) } , month _start : function ( t ) { return t . setDate ( 1 ) , this . date _part ( t ) } , year _start : function ( t ) { return t . setMonth ( 0 ) , this . month _start ( t ) } , day _start : function ( t ) { return this . date _part ( t ) } , hour _start : function ( t ) { var e = t . getHours ( ) ; return this . day _start ( t ) , t . setHours ( e ) , t } , minute _start : function ( t ) { var e = t . getMinutes ( ) ; return this . hour _start ( t ) , t . setMinutes ( e ) , t } , _add _days : function ( t , e ) { var n = new Date ( t . valueOf ( ) ) ; return n . setDate ( n . getDate ( ) + e ) , ! t . getHours ( ) && n . getHours ( ) && n . setTime ( n . getTime ( ) + 36e5 * ( 24 - n . getHours ( ) ) ) , n
} , add : function ( t , e , n ) { var i = new Date ( t . valueOf ( ) ) ; switch ( n ) { case "day" : i = gantt . date . _add _days ( i , e ) ; break ; case "week" : i = gantt . date . _add _days ( i , 7 * e ) ; break ; case "month" : i . setMonth ( i . getMonth ( ) + e ) ; break ; case "year" : i . setYear ( i . getFullYear ( ) + e ) ; break ; case "hour" : i . setTime ( i . getTime ( ) + 60 * e * 60 * 1e3 ) ; break ; case "minute" : i . setTime ( i . getTime ( ) + 60 * e * 1e3 ) ; break ; default : return gantt . date [ "add_" + n ] ( t , e , n ) } return i } , to _fixed : function ( t ) { return 10 > t ? "0" + t : t } , copy : function ( t ) { return new Date ( t . valueOf ( ) ) } , date _to _str : function ( t , e ) { return t = t . replace ( /%[a-zA-Z]/g , function ( t ) { switch ( t ) { case "%d" : return '"+gantt.date.to_fixed(date.getDate())+"' ;
case "%m" : return '"+gantt.date.to_fixed((date.getMonth()+1))+"' ; case "%j" : return '"+date.getDate()+"' ; case "%n" : return '"+(date.getMonth()+1)+"' ; case "%y" : return '"+gantt.date.to_fixed(date.getFullYear()%100)+"' ; case "%Y" : return '"+date.getFullYear()+"' ; case "%D" : return '"+gantt.locale.date.day_short[date.getDay()]+"' ; case "%l" : return '"+gantt.locale.date.day_full[date.getDay()]+"' ; case "%M" : return '"+gantt.locale.date.month_short[date.getMonth()]+"' ; case "%F" : return '"+gantt.locale.date.month_full[date.getMonth()]+"' ;
case "%h" : return '"+gantt.date.to_fixed((date.getHours()+11)%12+1)+"' ; case "%g" : return '"+((date.getHours()+11)%12+1)+"' ; case "%G" : return '"+date.getHours()+"' ; case "%H" : return '"+gantt.date.to_fixed(date.getHours())+"' ; case "%i" : return '"+gantt.date.to_fixed(date.getMinutes())+"' ; case "%a" : return '"+(date.getHours()>11?"pm":"am")+"' ; case "%A" : return '"+(date.getHours()>11?"PM":"AM")+"' ; case "%s" : return '"+gantt.date.to_fixed(date.getSeconds())+"' ; case "%W" : return '"+gantt.date.to_fixed(gantt.date.getISOWeek(date))+"' ;
default : return t } } ) , e && ( t = t . replace ( /date\.get/g , "date.getUTC" ) ) , new Function ( "date" , 'return "' + t + '";' ) } , str _to _date : function ( t , e ) { for ( var n = "var temp=date.match(/[a-zA-Z]+|[0-9]+/g);" , i = t . match ( /%[a-zA-Z]/g ) , a = 0 ; a < i . length ; a ++ ) switch ( i [ a ] ) { case "%j" : case "%d" : n += "set[2]=temp[" + a + "]||1;" ; break ; case "%n" : case "%m" : n += "set[1]=(temp[" + a + "]||1)-1;" ; break ; case "%y" : n += "set[0]=temp[" + a + "]*1+(temp[" + a + "]>50?1900:2000);" ; break ; case "%g" : case "%G" : case "%h" : case "%H" : n += "set[3]=temp[" + a + "]||0;" ; break ; case "%i" : n += "set[4]=temp[" + a + "]||0;" ;
break ; case "%Y" : n += "set[0]=temp[" + a + "]||0;" ; break ; case "%a" : case "%A" : n += "set[3]=set[3]%12+((temp[" + a + "]||'').toLowerCase()=='am'?0:12);" ; break ; case "%s" : n += "set[5]=temp[" + a + "]||0;" ; break ; case "%M" : n += "set[1]=gantt.locale.date.month_short_hash[temp[" + a + "]]||0;" ; break ; case "%F" : n += "set[1]=gantt.locale.date.month_full_hash[temp[" + a + "]]||0;" } var s = "set[0],set[1],set[2],set[3],set[4],set[5]" ; return e && ( s = " Date.UTC(" + s + ")" ) , new Function ( "date" , "var set=[0,0,1,0,0,0]; " + n + " return new Date(" + s + ");" ) } , getISOWeek : function ( t ) { if ( ! t ) return ! 1 ;
var e = t . getDay ( ) ; 0 === e && ( e = 7 ) ; var n = new Date ( t . valueOf ( ) ) ; n . setDate ( t . getDate ( ) + ( 4 - e ) ) ; var i = n . getFullYear ( ) , a = Math . round ( ( n . getTime ( ) - new Date ( i , 0 , 1 ) . getTime ( ) ) / 864e5 ) , s = 1 + Math . floor ( a / 7 ) ; return s } , getUTCISOWeek : function ( t ) { return this . getISOWeek ( t ) } , convert _to _utc : function ( t ) { return new Date ( t . getUTCFullYear ( ) , t . getUTCMonth ( ) , t . getUTCDate ( ) , t . getUTCHours ( ) , t . getUTCMinutes ( ) , t . getUTCSeconds ( ) ) } , parseDate : function ( t , e ) { return "string" == typeof t && ( dhtmlx . defined ( e ) && ( e = "string" == typeof e ? dhtmlx . defined ( gantt . templates [ e ] ) ? gantt . templates [ e ] : gantt . date . str _to _date ( e ) : gantt . templates . xml _date ) , t = e ( t ) ) , t
} } , gantt . config || ( gantt . config = { } ) , gantt . config || ( gantt . config = { } ) , gantt . templates || ( gantt . templates = { } ) , function ( ) { dhtmlx . mixin ( gantt . config , { links : { finish _to _start : "0" , start _to _start : "1" , finish _to _finish : "2" , start _to _finish : "3" } , types : { task : "task" , project : "project" , milestone : "milestone" } , duration _unit : "day" , work _time : ! 1 , correct _work _time : ! 1 , skip _off _time : ! 1 , autosize : ! 1 , show _links : ! 0 , show _task _cells : ! 0 , show _chart : ! 0 , show _grid : ! 0 , min _duration : 36e5 , xml _date : "%d-%m-%Y %H:%i" , api _date : "%d-%m-%Y %H:%i" , start _on _monday : ! 0 , server _utc : ! 1 , show _progress : ! 0 , fit _tasks : ! 1 , select _task : ! 0 , readonly : ! 1 , date _grid : "%Y-%m-%d" , drag _links : ! 0 , drag _progress : ! 0 , drag _resize : ! 0 , drag _move : ! 0 , drag _mode : { resize : "resize" , progress : "progress" , move : "move" , ignore : "ignore" } , round _dnd _dates : ! 0 , link _wrapper _width : 20 , root _id : 0 , autofit : ! 0 , columns : [ { name : "text" , tree : ! 0 , width : "*" } , { name : "start_date" , align : "center" } , { name : "duration" , align : "center" } , { name : "add" , width : "44" } ] , step : 1 , scale _unit : "day" , subscales : [ ] , time _step : 60 , duration _step : 1 , date _scale : "%d %M" , task _date : "%d %F %Y" , time _picker : "%H:%i" , task _attribute : "task_id" , link _attribute : "link_id" , buttons _left : [ "dhx_save_btn" , "dhx_cancel_btn" ] , buttons _right : [ "dhx_delete_btn" ] , lightbox : { sections : [ { name : "description" , height : 70 , map _to : "text" , type : "textarea" , focus : ! 0 } , { name : "time" , height : 72 , type : "duration" , map _to : "auto" } ] , project _sections : [ { name : "description" , height : 70 , map _to : "text" , type : "textarea" , focus : ! 0 } , { name : "type" , type : "typeselect" , map _to : "type" } , { name : "time" , height : 72 , type : "duration" , readonly : ! 0 , map _to : "auto" } ] , milestone _sections : [ { name : "description" , height : 70 , map _to : "text" , type : "textarea" , focus : ! 0 } , { name : "type" , type : "typeselect" , map _to : "type" } , { name : "time" , height : 72 , type : "duration" , single _date : ! 0 , map _to : "auto" } ] } , drag _lightbox : ! 0 , sort : ! 1 , details _on _create : ! 0 , details _on _dblclick : ! 0 , initial _scroll : ! 0 , task _scroll _offset : 100 , task _height : "full" , min _column _width : 70 } ) , gantt . keys = { edit _save : 13 , edit _cancel : 27 } , gantt . _init _template = function ( t , e ) { var n = this . _reg _templates || { } ;
this . config [ t ] && n [ t ] != this . config [ t ] && ( e && this . templates [ t ] || ( this . templates [ t ] = this . date . date _to _str ( this . config [ t ] ) , n [ t ] = this . config [ t ] ) ) , this . _reg _templates = n } , gantt . _init _templates = function ( ) { var t = gantt . locale . labels ; t . dhx _save _btn = t . icon _save , t . dhx _cancel _btn = t . icon _cancel , t . dhx _delete _btn = t . icon _delete ; var e = this . date . date _to _str , n = this . config ; gantt . _init _template ( "date_scale" , ! 0 ) , gantt . _init _template ( "date_grid" , ! 0 ) , gantt . _init _template ( "task_date" , ! 0 ) , dhtmlx . mixin ( this . templates , { xml _date : this . date . str _to _date ( n . xml _date , n . server _utc ) , xml _format : e ( n . xml _date , n . server _utc ) , api _date : this . date . str _to _date ( n . api _date ) , progress _text : function ( ) { return ""
} , grid _header _class : function ( ) { return "" } , task _text : function ( t , e , n ) { return n . text } , task _class : function ( ) { return "" } , grid _row _class : function ( ) { return "" } , task _row _class : function ( ) { return "" } , task _cell _class : function ( ) { return "" } , scale _cell _class : function ( ) { return "" } , scale _row _class : function ( ) { return "" } , grid _indent : function ( ) { return "<div class='gantt_tree_indent'></div>" } , grid _folder : function ( t ) { return "<div class='gantt_tree_icon gantt_folder_" + ( t . $open ? "open" : "closed" ) + "'></div>" } , grid _file : function ( ) { return "<div class='gantt_tree_icon gantt_file'></div>"
} , grid _open : function ( t ) { return "<div class='gantt_tree_icon gantt_" + ( t . $open ? "close" : "open" ) + "'></div>" } , grid _blank : function ( ) { return "<div class='gantt_tree_icon gantt_blank'></div>" } , task _time : function ( t , e ) { return gantt . templates . task _date ( t ) + " - " + gantt . templates . task _date ( e ) } , time _picker : e ( n . time _picker ) , link _class : function ( ) { return "" } , link _description : function ( t ) { var e = gantt . getTask ( t . source ) , n = gantt . getTask ( t . target ) ; return "<b>" + e . text + "</b> – <b>" + n . text + "</b>" } , drag _link : function ( t , e , n , i ) { t = gantt . getTask ( t ) ;
var a = gantt . locale . labels , s = "<b>" + t . text + "</b> " + ( e ? a . link _start : a . link _end ) + "<br/>" ; return n && ( n = gantt . getTask ( n ) , s += "<b> " + n . text + "</b> " + ( i ? a . link _start : a . link _end ) + "<br/>" ) , s } , drag _link _class : function ( t , e , n , i ) { var a = "" ; if ( t && n ) { var s = gantt . isLinkAllowed ( t , n , e , i ) ; a = " " + ( s ? "gantt_link_allow" : "gantt_link_deny" ) } return "gantt_link_tooltip" + a } } ) , this . callEvent ( "onTemplatesReady" , [ ] ) } } ( ) , window . jQuery && ! function ( t ) { var e = [ ] ; t . fn . dhx _gantt = function ( n ) { if ( n = n || { } , "string" != typeof n ) { var i = [ ] ; return this . each ( function ( ) { if ( this && this . getAttribute && ! this . getAttribute ( "dhxgantt" ) ) { for ( var t in n ) "data" != t && ( gantt . config [ t ] = n [ t ] ) ;
gantt . init ( this ) , n . data && gantt . parse ( n . data ) , i . push ( gantt ) } } ) , 1 === i . length ? i [ 0 ] : i } return e [ n ] ? e [ n ] . apply ( this , [ ] ) : void t . error ( "Method " + n + " does not exist on jQuery.dhx_gantt" ) } } ( jQuery ) , window . dhtmlx && ( dhtmlx . attaches || ( dhtmlx . attaches = { } ) , dhtmlx . attaches . attachGantt = function ( t , e ) { var n = document . createElement ( "DIV" ) ; n . id = "gantt_" + dhtmlx . uid ( ) , n . style . width = "100%" , n . style . height = "100%" , n . cmp = "grid" , document . body . appendChild ( n ) , this . attachObject ( n . id ) ; var i = this . vs [ this . av ] ; i . grid = gantt , gantt . init ( n . id , t , e ) , n . firstChild . style . border = "none" , i . gridId = n . id , i . gridObj = n ;
var a = "_viewRestore" ; return this . vs [ this [ a ] ( ) ] . grid } ) , gantt . locale = { date : { month _full : [ "January" , "February" , "March" , "April" , "May" , "June" , "July" , "August" , "September" , "October" , "November" , "December" ] , month _short : [ "Jan" , "Feb" , "Mar" , "Apr" , "May" , "Jun" , "Jul" , "Aug" , "Sep" , "Oct" , "Nov" , "Dec" ] , day _full : [ "Sunday" , "Monday" , "Tuesday" , "Wednesday" , "Thursday" , "Friday" , "Saturday" ] , day _short : [ "Sun" , "Mon" , "Tue" , "Wed" , "Thu" , "Fri" , "Sat" ] } , labels : { new _task : "New task" , icon _save : "Save" , icon _cancel : "Cancel" , icon _details : "Details" , icon _edit : "Edit" , icon _delete : "Delete" , confirm _closing : "" , confirm _deleting : "Task will be deleted permanently, are you sure?" , section _description : "Description" , section _time : "Time period" , section _type : "Type" , column _text : "Task name" , column _start _date : "Start time" , column _duration : "Duration" , column _add : "" , link : "Link" , confirm _link _deleting : "will be deleted" , link _start : " (start)" , link _end : " (end)" , type _task : "Task" , type _project : "Project" , type _milestone : "Milestone" , minutes : "Minutes" , hours : "Hours" , days : "Days" , weeks : "Week" , months : "Months" , years : "Years" } } , gantt . skins . skyblue = { config : { grid _width : 350 , row _height : 27 , scale _height : 27 , task _height : 24 , link _line _width : 1 , link _arrow _size : 8 , lightbox _additional _height : 75 } , _second _column _width : 95 , _third _column _width : 80 } , gantt . skins . meadow = { config : { grid _width : 350 , row _height : 27 , scale _height : 30 , task _height : 24 , link _line _width : 2 , link _arrow _size : 6 , lightbox _additional _height : 72 } , _second _column _width : 95 , _third _column _width : 80 } , gantt . skins . terrace = { config : { grid _width : 360 , row _height : 35 , scale _height : 35 , task _height : 24 , link _line _width : 2 , link _arrow _size : 6 , lightbox _additional _height : 75 } , _second _column _width : 90 , _third _column _width : 70 } , gantt . skins . broadway = { config : { grid _width : 360 , row _height : 35 , scale _height : 35 , task _height : 24 , link _line _width : 1 , link _arrow _size : 7 , lightbox _additional _height : 86 } , _second _column _width : 90 , _third _column _width : 80 , _lightbox _template : "<div class='dhx_cal_ltitle'><span class='dhx_mark'> </span><span class='dhx_time'></span><span class='dhx_title'></span><div class='dhx_cancel_btn'></div></div><div class='dhx_cal_larea'></div>" , _config _buttons _left : { } , _config _buttons _right : { dhx _delete _btn : "icon_delete" , dhx _save _btn : "icon_save" } } , gantt . config . touch _drag = 50 , gantt . config . touch = ! 0 , gantt . _init _touch _events = function ( ) { "force" != this . config . touch && ( this . config . touch = this . config . touch && ( - 1 != navigator . userAgent . indexOf ( "Mobile" ) || - 1 != navigator . userAgent . indexOf ( "iPad" ) || - 1 != navigator . userAgent . indexOf ( "Android" ) || - 1 != navigator . userAgent . indexOf ( "Touch" ) ) ) , this . config . touch && ( window . navigator . msPointerEnabled ? this . _touch _events ( [ "MSPointerMove" , "MSPointerDown" , "MSPointerUp" ] , function ( t ) { return t . pointerType == t . MSPOINTER _TYPE _MOUSE ? null : t
} , function ( t ) { return ! t || t . pointerType == t . MSPOINTER _TYPE _MOUSE } ) : this . _touch _events ( [ "touchmove" , "touchstart" , "touchend" ] , function ( t ) { return t . touches && t . touches . length > 1 ? null : t . touches [ 0 ] ? { target : t . target , pageX : t . touches [ 0 ] . pageX , pageY : t . touches [ 0 ] . pageY } : t } , function ( ) { return ! 1 } ) ) } , gantt . _touch _events = function ( t , e , n ) { function i ( t ) { return t && t . preventDefault && t . preventDefault ( ) , ( t || event ) . cancelBubble = ! 0 , ! 1 } var a , s = 0 , r = ! 1 , o = ! 1 , d = null ; this . _gantt _touch _event _ready || ( this . _gantt _touch _event _ready = 1 , dhtmlxEvent ( document . body , t [ 0 ] , function ( t ) { if ( ! n ( t ) && r ) { var l = e ( t ) ;
if ( l && d ) { var _ = d . pageX - l . pageX , h = d . pageY - l . pageY ; ! o && ( Math . abs ( _ ) > 5 || Math . abs ( h ) > 5 ) && ( gantt . _touch _scroll _active = o = ! 0 , s = 0 , a = gantt . getScrollState ( ) ) , o && gantt . scrollTo ( a . x + _ , a . y + h ) } return i ( t ) } } ) ) , dhtmlxEvent ( this . $container , "contextmenu" , function ( t ) { return r ? i ( t ) : void 0 } ) , dhtmlxEvent ( this . $container , t [ 1 ] , function ( t ) { if ( ! n ( t ) ) { if ( t . touches && t . touches . length > 1 ) return void ( r = ! 1 ) ; if ( r = ! 0 , d = e ( t ) , d && s ) { var a = new Date ; 500 > a - s ? ( gantt . _on _dblclick ( d ) , i ( t ) ) : s = a } else s = new Date } } ) , dhtmlxEvent ( this . $container , t [ 2 ] , function ( t ) { n ( t ) || ( gantt . _touch _scroll _active = r = o = ! 1 )
} ) } ;
//# sourceMappingURL=sources/dhtmlxgantt.js.map