From 51a39baab99cac9503e04a1f079df86d8d338a02 Mon Sep 17 00:00:00 2001 From: nathangray Date: Thu, 16 Nov 2017 13:42:17 -0700 Subject: [PATCH 01/33] Fix missing milestone class --- js/dhtmlxGantt/codebase/dhtmlxgantt.js | 600 +++++++++--------- .../codebase/sources/dhtmlxgantt.js | 192 +++--- 2 files changed, 396 insertions(+), 396 deletions(-) diff --git a/js/dhtmlxGantt/codebase/dhtmlxgantt.js b/js/dhtmlxGantt/codebase/dhtmlxgantt.js index 1466f4ac..9c88a9d7 100644 --- a/js/dhtmlxGantt/codebase/dhtmlxgantt.js +++ b/js/dhtmlxGantt/codebase/dhtmlxgantt.js @@ -5,304 +5,304 @@ dhtmlxGantt v.4.0.0 Stardard This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. (c) Dinamenta, UAB. -*/ -gantt={version:"4.0.0"},gantt.event=function(t,e,n){t.addEventListener?t.addEventListener(e,n,!1):t.attachEvent&&t.attachEvent("on"+e,n)},gantt.eventRemove=function(t,e,n){t.removeEventListener?t.removeEventListener(e,n,!1):t.detachEvent&&t.detachEvent("on"+e,n)},gantt._eventable=function(t){t._silent_mode=!1,t._silentStart=function(){this._silent_mode=!0},t._silentEnd=function(){this._silent_mode=!1},t.attachEvent=function(t,e,n){return t="ev_"+t.toLowerCase(),this[t]||(this[t]=new this._eventCatcher(n||this)), -t+":"+this[t].addEvent(e)},t.callEvent=function(t,e){return this._silent_mode?!0:(t="ev_"+t.toLowerCase(),this[t]?this[t].apply(this,e):!0)},t.checkEvent=function(t){return!!this["ev_"+t.toLowerCase()]},t._eventCatcher=function(t){var e=[],n=function(){for(var n=!0,a=0;athis.config.sensitivity){if(this.config.started=!0,this.config.ignore=!1,this.callEvent("onBeforeDragStart",[t,this.config.original_target])===!1)return this.config.ignore=!0,!0;var r=this.config.marker=document.createElement("div");r.className="gantt_drag_marker", -r.innerHTML="Dragging object",document.body.appendChild(r),this.callEvent("onAfterDragStart",[t,this.config.original_target])}else this.config.ignore=!0}this.config.ignore||(e.pos=this.getPosition(e),this.config.marker.style.left=e.pos.x+"px",this.config.marker.style.top=e.pos.y+"px",this.callEvent("onDragMove",[t,e]))},dragEnd:function(t){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=this.bind(function(t,e,n){return this.close(e),!1},this),this._click.gantt_open=this.bind(function(t,e,n){return this.open(e),!1},this),this._click.gantt_row=this.bind(function(t,e,n){ -if(null!==e){var a=this.getTask(e);this.config.scroll_on_click&&this.showDate(a.start_date),this.callEvent("onTaskRowClick",[e,n])}},this),this._click.gantt_grid_head_cell=this.bind(function(t,e,n){var a=n.getAttribute("column_id");if(this.callEvent("onGridHeaderClick",[a,t])){if("add"==a)return void this._click.gantt_add(t,this.config.root_id);if(this.config.sort){for(var i,s=a,r=0;this.config.columns.length;r++)if(this.config.columns[r].name==a){i=this.config.columns[r];break}if(i&&void 0!==i.sort&&i.sort!==!0&&(s=i.sort, -!s))return;var o=this._sort&&this._sort.direction&&this._sort.name==a?this._sort.direction:"desc";o="desc"==o?"asc":"desc",this._sort={name:a,direction:o},this.sort(s,"desc"==o)}}},this),!this.config.sort&&this.config.order_branch&&this._init_dnd(),this._click.gantt_add=this.bind(function(t,e,n){if(!this.config.readonly){var a={};return this.createTask(a,e?e:this.config.root_id),!1}},this),this._init_resize&&this._init_resize()},gantt._render_grid=function(){this._is_grid_visible()&&(this._calc_grid_width(), -this._render_grid_header())},gantt._calc_grid_width=function(){for(var t=this.getGridColumns(),e=0,n=[],a=[],i=0;i0?n.length:a.length>0?a.length:1);if(n.length>0)for(var o=r/(n.length?n.length:1),i=0;in+_&&(o.width=_=this._get_grid_width()-n),n+=_;var d=this._sort&&o.name==this._sort.name?"
":"",l=["gantt_grid_head_cell","gantt_grid_head_"+o.name,r?"gantt_last_cell":"",this.templates.grid_header_class(o.name,o)].join(" "),g="width:"+(_-(r?1:0))+"px;",h=o.label||a["column_"+o.name]; -h=h||"";var c="
"+h+d+"
";e.push(c)}this.$grid_scale.style.height=this.config.scale_height-1+"px",this.$grid_scale.style.lineHeight=i+"px",this.$grid_scale.style.width=n-1+"px",this.$grid_scale.innerHTML=e.join("")},gantt._render_grid_item=function(t){if(!gantt._is_grid_visible())return null;for(var e=this.getGridColumns(),n=[],a=0;a":(s=o.template?o.template(t):t[o.name], -s instanceof Date&&(s=this.templates.date_grid(s,t)),s="
"+s+"
");var _="gantt_cell"+(r?" gantt_last_cell":""),d="";if(o.tree){for(var l=0;l"+d+s+"", -n.push(i)}var _=t.$index%2===0?"":" odd";if(_+=t.$transparent?" gantt_transparent":"",_+=t.$dataprocessor_class?" "+t.$dataprocessor_class:"",this.templates.grid_row_class){var c=this.templates.grid_row_class.call(this,t.start_date,t.end_date,t);c&&(_+=" "+c)}this.getState().selected_task==t.id&&(_+=" gantt_selected");var u=document.createElement("div");return u.className="gantt_row"+_,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,gantt._refresh_on_toggle_element(t))},gantt._refresh_on_toggle_element=function(t){this.refreshData()},gantt._is_grid_visible=function(){return this.config.grid_width&&this.config.show_grid},gantt._get_grid_width=function(){ -return this._is_grid_visible()?this._is_chart_visible()?this.config.grid_width:this._x:0},gantt.moveTask=function(t,e,n){var a=arguments[3];if(a){if(a===t)return;n=this.getParent(a),e=this.getTaskIndex(a)}if(t!=n){n=n||this.config.root_id;var i=this.getTask(t),s=this.getParent(i.id),r=(this.getChildren(this.getParent(i.id)),this.getChildren(n));if(-1==e&&(e=r.length+1),s==n){var o=this.getTaskIndex(t);if(o==e)return}if(this.callEvent("onBeforeTaskMove",[t,n,e])!==!1){this._replace_branch_child(s,t), -r=this.getChildren(n);var _=r[e];_?r=r.slice(0,e).concat([t]).concat(r.slice(e)):r.push(t),this.setParent(i,n),this._branches[n]=r,i.$level=this.calculateTaskLevel(i),1*e>0?a?i.$drop_target=(this.getTaskIndex(t)>this.getTaskIndex(a)?"next:":"")+a:i.$drop_target="next:"+gantt.getPrevSibling(t):r[1*e+1]?i.$drop_target=r[1*e+1]:i.$drop_target=n,this.callEvent("onAfterTaskMove",[t,n,e])&&this.refreshData()}}},gantt._init_dnd=function(){var t=new gantt._DnD(this.$grid_data,{updates_per_second:60});this.defined(this.config.dnd_sensitivity)&&(t.config.sensitivity=this.config.dnd_sensitivity), -t.attachEvent("onBeforeDragStart",this.bind(function(e,n){var a=this._locateHTML(n);if(!a)return!1;this.hideQuickInfo&&this._hideQuickInfo();var i=this.locate(n),s=gantt.getTask(i);return gantt._is_readonly(s)?!1:(t.config.initial_open_state=s.$open,this.callEvent("onRowDragStart",[i,n.target||n.srcElement,n])?void 0:!1)},this)),t.attachEvent("onAfterDragStart",this.bind(function(e,n){var a=this._locateHTML(n);t.config.marker.innerHTML=a.outerHTML,t.config.id=this.locate(n);var i=this.getTask(t.config.id); -t.config.index=this.getTaskIndex(t.config.id),t.config.parent=i.parent,i.$open=!1,i.$transparent=!0,this.refreshData()},this)),t.lastTaskOfLevel=function(t){for(var e=gantt._order,n=gantt._pull,a=null,i=0,s=e.length;s>i;i++)n[e[i]].$level==t&&(a=n[e[i]]);return a?a.id:null},t._getGridPos=this.bind(function(t){var e=this._get_position(this.$grid_data),n=e.x,a=t.pos.y-10;return ae.y+this.$grid_data.offsetHeight-this.config.row_height&&(a=e.y+this.$grid_data.offsetHeight-this.config.row_height), -e.x=n,e.y=a,e},this),t.attachEvent("onDragMove",this.bind(function(e,n){function a(t,e){return t.$level==e.$level||gantt.config.order_branch_free}var i=t.config,s=t._getGridPos(n);i.marker.style.left=s.x+10+"px",i.marker.style.top=s.y+"px",s=t._getGridPos(n);var r=(s.x,s.y),o=document.documentElement.scrollTop||document.body.scrollTop,_=document.documentElement.scrollLeft||document.body.scrollLeft,d=document.elementFromPoint(s.x-_+1,r-o),l=this.locate(d),g=this.getTask(t.config.id);if(this.isTaskExists(l)||(l=t.lastTaskOfLevel(gantt.config.order_branch_free?g.$level:0), -l==t.config.id&&(l=null)),this.isTaskExists(l)){var h=gantt._get_position(d),c=this.getTask(l);if(h.y+d.offsetHeight/2=0;)p=this._pull[this._order[u-v]],v++;if(g.id==c.id)return;a(c,g)&&g.id!=c.id?this.moveTask(g.id,0,0,c.id):c.$level!=g.$level-1||gantt.getChildren(c.id).length?p&&a(p,g)&&g.id!=p.id&&this.moveTask(g.id,-1,this.getParent(p.id)):this.moveTask(g.id,0,c.id); -}return!0},this)),t.attachEvent("onDragEnd",this.bind(function(){var e=this.getTask(t.config.id);this.callEvent("onBeforeRowDragEnd",[t.config.id,t.config.parent,t.config.index])===!1?(this.moveTask(t.config.id,t.config.index,t.config.parent),e.$drop_target=null):this.callEvent("onRowDragEnd",[t.config.id,e.$drop_target]),e.$transparent=!1,e.$open=t.config.initial_open_state,this.refreshData()},this))},gantt.getGridColumns=function(){return this.config.columns},gantt._has_children=function(t){return this.getChildren(t).length>0; -},gantt._scale_helpers={getSum:function(t,e,n){void 0===n&&(n=t.length-1),void 0===e&&(e=0);for(var a=0,i=e;n>=i;i++)a+=t[i];return a},setSumWidth:function(t,e,n,a){var i=e.width;void 0===a&&(a=i.length-1),void 0===n&&(n=0);var s=a-n+1;if(!(n>i.length-1||0>=s||a>i.length-1)){var r=this.getSum(i,n,a),o=t-r;this.adjustSize(o,i,n,a),this.adjustSize(-o,i,a+1),e.full_width=this.getSum(i)}},splitSize:function(t,e){for(var n=[],a=0;e>a;a++)n[a]=0;return this.adjustSize(t,n),n},adjustSize:function(t,e,n,a){ -n||(n=0),void 0===a&&(a=e.length-1);for(var i=a-n+1,s=this.getSum(e,n,a),r=0,o=n;a>=o;o++){var _=Math.floor(t*(s?e[o]/s:1/i));s-=e[o],t-=_,i--,e[o]+=_,r+=_}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:0})},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,a){for(var i=this.splitSize(a,t.length),s=n,r=[],o=t.length-1;o>=0;o--){var _=o==t.length-1,d=this.initScaleConfig(t[o]);_&&this.processIgnores(d),this.initColSizes(d,e,s,i[o]),this.limitVisibleRange(d),_&&(s=d.full_width),r.unshift(d)}for(var o=0;oe;e++)t.left.push((t.width[e-1]||0)+(t.left[e-1]||0)); -},_ignore_time_config:function(t){return this.config.skip_off_time?!this.isWorkTime(t):!1},processIgnores:function(t){t.ignore_x={},t.display_count=t.count},initColSizes:function(t,e,n,a){var i=n;t.height=a;var s=void 0===t.display_count?t.count:t.display_count;s||(s=1),t.col_width=Math.floor(i/s),e&&t.col_width=g;g++)+r[g]!=+s[l]||(i&&i.apply(this,[d,l,o,g]),o=g,d=l)},alineScaleColumns:function(t,e,n,a){this.iterateScales(t,e,n,a,function(n,a,i,s){ -var r=this.getSum(t.width,i,s-1),o=this.getSum(e.width,n,a-1);o!=r&&this.setSumWidth(r,e,n,a-1)})},eachColumn:function(t,e,n){var a=new Date(gantt._min_date),i=new Date(gantt._max_date);gantt.date[t+"_start"]&&(a=gantt.date[t+"_start"](a));var s=new Date(a);for(+s>=+i&&(i=gantt.date.add(s,e,t));+i>+s;){n.call(this,new Date(s));var r=s.getTimezoneOffset();s=gantt.date.add(s,e,t),s=gantt._correct_dst_change(s,r,e,t),gantt.date[t+"_start"]&&(s=gantt.date[t+"_start"](s))}},limitVisibleRange:function(t){ -var e=t.trace_x,n=0,a=t.width.length-1,i=0;if(+e[0]<+gantt._min_date&&n!=a){var s=Math.floor(t.width[0]*((e[1]-gantt._min_date)/(e[1]-e[0])));i+=t.width[0]-s,t.width[0]=s,e[0]=new Date(gantt._min_date)}var r=e.length-1,o=e[r],_=gantt.date.add(o,t.step,t.unit);if(+_>+gantt._max_date&&r>0){var s=t.width[r]-Math.floor(t.width[r]*((_-gantt._max_date)/(_-o)));i+=t.width[r]-s,t.width[r]=s}if(i){for(var d=this.getSum(t.width),l=0,g=0;gt.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(gantt.copy(t)),t):this.current()},point_to:function(t,e,n){n=n?{x:n.x,y:n.y}:gantt.copy(this.point());var a=gantt._drawer.dirs;switch(t){case a.left:n.x-=e;break;case a.right:n.x+=e;break;case a.up:n.y-=e;break;case a.down:n.y+=e}return this.point(n)},get_points:function(t){ -var e=this.get_endpoint(t),n=gantt.config,a=e.e_y-e.y,i=e.e_x-e.x,s=gantt._drawer.dirs;this.clear(),this.point({x:e.x,y:e.y});var r=2*n.link_arrow_size,o=e.e_x>e.x;if(t.type==gantt.config.links.start_to_start)this.point_to(s.left,r),o?(this.point_to(s.down,a),this.point_to(s.right,i)):(this.point_to(s.right,i),this.point_to(s.down,a)),this.point_to(s.right,r);else if(t.type==gantt.config.links.finish_to_start)if(o=e.e_x>e.x+2*r,this.point_to(s.right,r),o)i-=r,this.point_to(s.down,a),this.point_to(s.right,i);else{ -i-=2*r;var _=a>0?1:-1;this.point_to(s.down,_*(n.row_height/2)),this.point_to(s.right,i),this.point_to(s.down,_*(Math.abs(a)-n.row_height/2)),this.point_to(s.right,r)}else if(t.type==gantt.config.links.finish_to_finish)this.point_to(s.right,r),o?(this.point_to(s.right,i),this.point_to(s.down,a)):(this.point_to(s.down,a),this.point_to(s.right,i)),this.point_to(s.left,r);else if(t.type==gantt.config.links.start_to_finish)if(o=e.e_x>e.x-2*r,this.point_to(s.left,r),o){i+=2*r;var _=a>0?1:-1;this.point_to(s.down,_*(n.row_height/2)), -this.point_to(s.right,i),this.point_to(s.down,_*(Math.abs(a)-n.row_height/2)),this.point_to(s.left,r)}else i+=r,this.point_to(s.down,a),this.point_to(s.right,i);return this.path},get_endpoint:function(t){var e=gantt.config.links,n=!1,a=!1;t.type==e.start_to_start?n=a=!0:t.type==e.finish_to_finish?n=a=!1:t.type==e.finish_to_start?(n=!1,a=!0):t.type==e.start_to_finish?(n=!0,a=!1):gantt.assert(!1,"Invalid link type");var i=gantt._get_task_visible_pos(gantt._pull[t.source],n),s=gantt._get_task_visible_pos(gantt._pull[t.target],a); -return{x:i.x,e_x:s.x,y:i.y,e_y:s.y}}},gantt._init_links_dnd=function(){function t(t,e,n){var a=gantt._get_task_pos(t,!!e);return a.y+=gantt._get_task_height()/2,n=n||0,a.x+=(e?-1:1)*n,a}function e(t){var e=a(),n=["gantt_link_tooltip"];e.from&&e.to&&(gantt.isLinkAllowed(e.from,e.to,e.from_start,e.to_start)?n.push("gantt_allowed_link"):n.push("gantt_invalid_link"));var i=gantt.templates.drag_link_class(e.from,e.from_start,e.to,e.to_start);i&&n.push(i);var s="
"+gantt.templates.drag_link(e.from,e.from_start,e.to,e.to_start)+"
"; -t.innerHTML=s}function n(t,e){t.style.left=e.x+5+"px",t.style.top=e.y+5+"px"}function a(){return{from:gantt._link_source_task,to:gantt._link_target_task,from_start:gantt._link_source_task_start,to_start:gantt._link_target_task_start}}function i(){gantt._link_source_task=gantt._link_source_task_start=gantt._link_target_task=null,gantt._link_target_task_start=!0}function s(t,e,n,i){var s=_(),d=a(),l=["gantt_link_direction"];gantt.templates.link_direction_class&&l.push(gantt.templates.link_direction_class(d.from,d.from_start,d.to,d.to_start)); -var g=Math.sqrt(Math.pow(n-t,2)+Math.pow(i-e,2));if(g=Math.max(0,g-3)){s.className=l.join(" ");var h=(i-e)/(n-t),c=Math.atan(h);2==o(t,n,e,i)?c+=Math.PI:3==o(t,n,e,i)&&(c-=Math.PI);var u=Math.sin(c),f=Math.cos(c),p=Math.round(e),v=Math.round(t),m=["-webkit-transform: rotate("+c+"rad)","-moz-transform: rotate("+c+"rad)","-ms-transform: rotate("+c+"rad)","-o-transform: rotate("+c+"rad)","transform: rotate("+c+"rad)","width:"+Math.round(g)+"px"];if(-1!=window.navigator.userAgent.indexOf("MSIE 8.0")){ -m.push('-ms-filter: "'+r(u,f)+'"');var k=Math.abs(Math.round(t-n)),b=Math.abs(Math.round(i-e));switch(o(t,n,e,i)){case 1:p-=b;break;case 2:v-=k,p-=b;break;case 3:v-=k}}m.push("top:"+p+"px"),m.push("left:"+v+"px"),s.style.cssText=m.join(";")}}function r(t,e){return"progid:DXImageTransform.Microsoft.Matrix(M11 = "+e+",M12 = -"+t+",M21 = "+t+",M22 = "+e+",SizingMethod = 'auto expand')"}function o(t,e,n,a){return e>=t?n>=a?1:4:n>=a?2:3}function _(){return l._direction||(l._direction=document.createElement("div"), -gantt.$task_links.appendChild(l._direction)),l._direction}function d(){l._direction&&(l._direction.parentNode&&l._direction.parentNode.removeChild(l._direction),l._direction=null)}var l=new gantt._DnD(this.$task_bars,{sensitivity:0,updates_per_second:60}),g="task_left",h="task_right",c="gantt_link_point",u="gantt_link_control";l.attachEvent("onBeforeDragStart",gantt.bind(function(e,n){var a=n.target||n.srcElement;if(i(),gantt.getState().drag_id)return!1;if(gantt._locate_css(a,c)){gantt._locate_css(a,g)&&(gantt._link_source_task_start=!0); -var s=gantt._link_source_task=this.locate(n),r=gantt.getTask(s);if(gantt._is_readonly(r))return i(),!1;var o=0;return gantt._get_safe_type(r.type)==gantt.config.types.milestone&&(o=(gantt._get_visible_milestone_width()-gantt._get_milestone_width())/2),this._dir_start=t(r,!!gantt._link_source_task_start,o),!0}return!1},this)),l.attachEvent("onAfterDragStart",gantt.bind(function(t,n){e(l.config.marker)},this)),l.attachEvent("onDragMove",gantt.bind(function(a,i){var r=l.config,o=l.getPosition(i);n(r.marker,o); -var _=gantt._is_link_drop_area(i),d=gantt._link_target_task,g=gantt._link_landing,c=gantt._link_target_task_start,f=gantt.locate(i),p=!0;if(_&&(p=!gantt._locate_css(i,h),_=!!f),gantt._link_target_task=f,gantt._link_landing=_,gantt._link_target_task_start=p,_){var v=gantt.getTask(f),m=gantt._locate_css(i,u),k=0;m&&(k=Math.floor(m.offsetWidth/2)),this._dir_end=t(v,!!gantt._link_target_task_start,k)}else this._dir_end=gantt._get_mouse_pos(i);var b=!(g==_&&d==f&&c==p);return b&&(d&&gantt.refreshTask(d,!1), -f&&gantt.refreshTask(f,!1)),b&&e(r.marker),s(this._dir_start.x,this._dir_start.y,this._dir_end.x,this._dir_end.y),!0},this)),l.attachEvent("onDragEnd",gantt.bind(function(){var t=a();if(t.from&&t.to&&t.from!=t.to){var e=gantt._get_link_type(t.from_start,t.to_start),n={source:t.from,target:t.to,type:e};n.type&&gantt.isLinkAllowed(n)&&gantt.addLink(n)}i(),t.from&&gantt.refreshTask(t.from,!1),t.to&&gantt.refreshTask(t.to,!1),d()},this)),gantt._is_link_drop_area=function(t){return!!gantt._locate_css(t,u); -}},gantt._get_link_state=function(){return{link_landing_area:this._link_landing,link_target_id:this._link_target_task,link_target_start:this._link_target_task_start,link_source_id:this._link_source_task,link_source_start:this._link_source_task_start}},gantt._task_renderer=function(t,e,n,a){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||this.assert(!1,"Invalid renderer call"), -n&&n.setAttribute(this.config.layer_attribute,!0),this._task_area_renderers[t]={render_item:function(t,i){if(i=i||n,a&&!a(t))return void this.remove_item(t.id);var s=e.call(gantt,t);this.append(t,s,i)},clear:function(e){this.rendered=gantt._task_area_pulls[t]={},this.clear_container(e)},clear_container:function(t){t=t||n,t&&(t.innerHTML="")},render_items:function(t,e){e=e||n;var a=document.createDocumentFragment();this.clear(e);for(var i=0,s=t.length;s>i;i++)this.render_item(t[i],a);e.appendChild(a); -},append:function(t,e,n){e&&(this.rendered[t.id]&&this.rendered[t.id].parentNode?this.replace_item(t.id,e):n.appendChild(e),this.rendered[t.id]=e)},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){this.hide(t),delete this.rendered[t]},hide:function(t){var e=this.rendered[t];e&&e.parentNode&&e.parentNode.removeChild(e)},restore:function(t){var e=this.rendered[t.id];e?e.parentNode||this.append(t,e,n):this.render_item(t,n); -},change_id:function(t,e){this.rendered[e]=this.rendered[t],delete this.rendered[t]},rendered:this._task_area_pulls[t],node:n,unload:function(){this.clear(),delete gantt._task_area_renderers[t],delete gantt._task_area_pulls[t]}},this._task_area_renderers[t])},gantt._clear_renderers=function(){for(var t in this._task_area_renderers)this._task_renderer(t).unload()},gantt._is_layer=function(t){return t&&t.hasAttribute&&t.hasAttribute(this.config.layer_attribute)},gantt._init_tasks=function(){function t(t,e,n,a){ -for(var i=0;i-1?a.$target[0]:a.$source[0]),i&&this._delete_link_handler(i,t),!1},this),this._tasks_dnd.init(),this._init_links_dnd(),this._link_layers.clear(); -var e=this.addLinkLayer({renderer:this._render_link_element,container:this.$task_links,filter:gantt._create_filter([gantt._filter_link,gantt._is_chart_visible].concat(this._get_link_filters()))});this._linkRenderer=this._link_layers.getRenderer(e),this._task_layers.clear();var n=this.addTaskLayer({renderer:this._render_task_element,container:this.$task_bars,filter:gantt._create_filter([gantt._filter_task,gantt._is_chart_visible].concat(this._get_task_filters()))});this._taskRenderer=this._task_layers.getRenderer(n), -this.addTaskLayer({renderer:this._render_grid_item,container:this.$grid_data,filter:gantt._create_filter([gantt._filter_task,gantt._is_grid_visible].concat(this._get_task_filters()))}),this.addTaskLayer({renderer:this._render_bg_line,container:this.$task_bg,filter:gantt._create_filter([gantt._filter_task,gantt._is_chart_visible,gantt._is_std_background].concat(this._get_task_filters()))}),this._onTaskIdChange&&this.detachEvent(this._onTaskIdChange),this._onTaskIdChange=this.attachEvent("onTaskIdChange",function(e,n){ -var a=this._get_task_renderers();t(a,e,n,this.getTask(n))}),this._onLinkIdChange&&this.detachEvent(this._onLinkIdChange),this._onLinkIdChange=this.attachEvent("onLinkIdChange",function(e,n){var a=this._get_link_renderers();t(a,e,n,this.getLink(n))})},gantt._get_task_filters=function(){return[]},gantt._get_link_filters=function(){return[]},gantt._is_chart_visible=function(){return!!this.config.show_chart},gantt._filter_task=function(t,e){var n=null,a=null;return this.config.start_date&&this.config.end_date&&(n=this.config.start_date.valueOf(), -a=this.config.end_date.valueOf(),+e.start_date>a||+e.end_date<+n)?!1:!0},gantt._filter_link=function(t,e){return this.config.show_links?!gantt.isTaskVisible(e.source)||!gantt.isTaskVisible(e.target)||gantt._isAllowedUnscheduledTask(gantt.getTask(e.source))||gantt._isAllowedUnscheduledTask(gantt.getTask(e.target))?!1:this.callEvent("onBeforeLinkDisplay",[t,e]):!1},gantt._is_std_background=function(){return!this.config.static_background},gantt._delete_link_handler=function(t,e){if(t&&this.callEvent("onLinkDblClick",[t,e])){ -var n=gantt.getLink(t);if(gantt._is_readonly(n))return;var a="",i=gantt.locale.labels.link+" "+this.templates.link_description(this.getLink(t))+" "+gantt.locale.labels.confirm_link_deleting;window.setTimeout(function(){gantt._dhtmlx_confirm(i,a,function(){gantt.deleteLink(t)})},gantt.config.touch?300:1)}},gantt.getTaskNode=function(t){return this._taskRenderer.rendered[t]},gantt.getLinkNode=function(t){return this._linkRenderer.rendered[t]},gantt._get_tasks_data=function(){for(var t=[],e=this._get_data_range(),n=0;nn;n++){var i=e[n];this._is_layer(i)&&i.style&&(i.style.width=t.full_width+"px")}if(this._is_grid_visible()){for(var s=this.getGridColumns(),r=0,n=0;n"+r+"";e.push(g)}}return e.join("")},gantt._get_scales=function(){var t=this._scale_helpers,e=[t.primaryScale()].concat(this.config.subscales);return t.sortScales(e),e},gantt._render_tasks_scales=function(){this._init_tasks_range(),this._scroll_resize(),this._set_sizes();var t="",e=0,n=0,a=0;if(this._is_chart_visible()){var i=this._scale_helpers,s=this._get_scales(); -a=this.config.scale_height-1;for(var r=this._get_resize_options(),o=r.x?Math.max(this.config.autosize_min_width,0):this.$task.offsetWidth,_=i.prepareConfigs(s,this.config.min_column_width,o,a),d=this._tasks=_[_.length-1],l=[],g=this.templates.scale_row_class,h=0;h<_.length;h++){var c="gantt_scale_line",u=g(_[h]);u&&(c+=" "+u),l.push('
'+this._prepare_scale_html(_[h])+"
")}t=l.join(""),e=d.full_width+this.$scroll_ver.offsetWidth+"px", -n=d.full_width+"px",a+="px"}this._is_chart_visible()?this.$task.style.display="":this.$task.style.display="none",this.$task_scale.style.height=a,this.$task_data.style.width=this.$task_scale.style.width=e,this.$task_scale.innerHTML=t},gantt._render_bg_line=function(t){var e=gantt._tasks,n=e.count,a=document.createElement("div");if(gantt.config.show_task_cells)for(var i=0;n>i;i++){var s=e.width[i],r="";if(s>0){var o=document.createElement("div");o.style.width=s+"px",r="gantt_task_cell"+(i==n-1?" gantt_last_cell":""), -d=this.templates.task_cell_class(t,e.trace_x[i]),d&&(r+=" "+d),o.className=r,a.appendChild(o)}}var _=t.$index%2!==0,d=gantt.templates.task_row_class(t.start_date,t.end_date,t),l="gantt_task_row"+(_?" odd":"")+(d?" "+d:"");return this.getState().selected_task==t.id&&(l+=" gantt_selected"),a.className=l,gantt.config.smart_rendering&&(a.style.position="absolute",a.style.top=this.getTaskTop(t.id)+"px",a.style.width="100%"),a.style.height=gantt.config.row_height+"px",a.setAttribute(this.config.task_attribute,t.id), -a},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){if(this._is_render_active()){var n=this._get_task_renderers(),a=this.getTask(t);if(a&&this.isTaskVisible(t)){for(var i=0;i=+i.min_date&&t.appendChild(a(e+" task_left"))},gantt._get_task_height=function(){var t=this.config.task_height;return"full"==t&&(t=this.config.row_height-5), -t=Math.min(t,this.config.row_height),Math.max(t,0)},gantt._get_milestone_width=function(){return this._get_task_height()},gantt._get_visible_milestone_width=function(){var t=gantt._get_task_height();return Math.sqrt(2*t*t)},gantt.getTaskPosition=function(t,e,n){var a=this.posFromDate(e||t.start_date),i=this.posFromDate(n||t.end_date);i=Math.max(a,i);var s=this.getTaskTop(t.id),r=gantt._get_task_height();return{left:a,top:s,height:r,width:Math.max(i-a,0)}},gantt._get_task_width=function(t,e,n){return Math.round(this._get_task_pos(t,!1).x-this._get_task_pos(t,!0).x); -},gantt._is_readonly=function(t){return t&&t[this.config.editable_property]?!1:t&&t[this.config.readonly_property]||this.config.readonly},gantt._task_default_render=function(t){if(!this._isAllowedUnscheduledTask(t)){var e=this._get_task_pos(t),n=this.config,a=this._get_task_height(),i=Math.floor((this.config.row_height-a)/2);this._get_safe_type(t.type)==n.types.milestone&&n.link_line_width>1&&(i+=1);var s=document.createElement("div"),r=gantt._get_task_width(t),o=this._get_safe_type(t.type);s.setAttribute(this.config.task_attribute,t.id), -n.show_progress&&o!=this.config.types.milestone&&this._render_task_progress(t,s,r);var _=gantt._render_task_content(t,r);t.textColor&&(_.style.color=t.textColor),s.appendChild(_);var d=this._combine_item_class("gantt_task_line",this.templates.task_class(t.start_date,t.end_date,t),t.id);(t.color||t.progressColor||t.textColor)&&(d+=" gantt_task_inline_color"),s.className=d;var l=["left:"+e.x+"px","top:"+(i+e.y)+"px","height:"+a+"px","line-height:"+a+"px","width:"+r+"px"];t.color&&l.push("background-color:"+t.color), -t.textColor&&l.push("color:"+t.textColor),s.style.cssText=l.join(";");var g=this._render_leftside_content(t);return g&&s.appendChild(g),g=this._render_rightside_content(t),g&&s.appendChild(g),this._is_readonly(t)||(n.drag_resize&&!this._is_flex_task(t)&&o!=this.config.types.milestone&&gantt._render_pair(s,"gantt_task_drag",t,function(t){var e=document.createElement("div");return e.className=t,e}),n.drag_links&&this.config.show_links&&gantt._render_pair(s,"gantt_link_control",t,function(t){var e=document.createElement("div"); -e.className=t,e.style.cssText=["height:"+a+"px","line-height:"+a+"px"].join(";");var n=document.createElement("div");return n.className="gantt_link_point",e.appendChild(n),e})),s}},gantt._render_task_element=function(t){var e=this.config.type_renderers,n=e[this._get_safe_type(t.type)],a=this._task_default_render;return n||(n=a),n.call(this,t,this.bind(a,this))},gantt._render_side_content=function(t,e,n){if(!e)return null;var a=e(t.start_date,t.end_date,t);if(!a)return null;var i=document.createElement("div"); -return i.className="gantt_side_content "+n,i.innerHTML=a,i},gantt._render_leftside_content=function(t){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 a in n)for(var i=e[a],s=0;st||t>e.full_width||!e.full_width)return null;var n=this._findBinary(this._tasks.left,t),a=this._tasks.left[n],i=e.width[n]||e.col_width,s=0;i&&(s=(t-a)/i);var r=0;s&&(r=gantt._get_coll_duration(e,e.trace_x[n]));var o=new Date(e.trace_x[n].valueOf()+Math.round(s*r)); -return o},gantt.posFromDate=function(t){var e=gantt._day_index_by_date(t);this.assert(e>=0,"Invalid day index");var n=Math.floor(e),a=e%1,i=gantt._tasks.left[Math.min(n,gantt._tasks.width.length-1)];return n==gantt._tasks.width.length&&(i+=gantt._tasks.width[gantt._tasks.width.length-1]),a&&(i+=n=this._max_date)return n.length; -for(var i=gantt._findBinary(n,e),s=+gantt._tasks.trace_x[i];a[s];)s=gantt._tasks.trace_x[++i];return s?i+(t-n[i])/gantt._get_coll_duration(gantt._tasks,n[i]):0},gantt._findBinary=function(t,e){for(var n,a,i,s=0,r=t.length-1;r>=s;)if(n=Math.floor((s+r)/2),a=+t[n],i=+t[n-1],e>a)s=n+1;else{if(!(a>e))return n;if(!isNaN(i)&&e>i)return n-1;r=n-1}return t.length-1},gantt._get_coll_duration=function(t,e){return gantt.date.add(e,t.step,t.unit)-e},gantt._get_x_pos=function(t,e){e=e!==!1;gantt.posFromDate(e?t.start_date:t.end_date); -},gantt.getTaskTop=function(t){return this._y_from_ind(this.getGlobalTaskIndex(t))},gantt._get_task_coord=function(t,e,n){e=e!==!1,n=n||0;var a=this._get_safe_type(t.type)==this.config.types.milestone,i=null;i=e||a?t.start_date||this._default_task_date(t):t.end_date||this.calculateEndDate(this._default_task_date(t));var s=this.posFromDate(i),r=this.getTaskTop(t.id);return a&&(e?s-=n:s+=n),{x:s,y:r}},gantt._get_task_pos=function(t,e){e=e!==!1;var n=gantt._get_milestone_width()/2;return this._get_task_coord(t,e,n); -},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=gantt.env.isIE?document.documentElement:document.body,e={x:t.clientX+n.scrollLeft-n.clientLeft,y:t.clientY+n.scrollTop-n.clientTop},a=gantt._get_position(gantt.$task_data); -return e.x=e.x-a.x+gantt.$task_data.scrollLeft,e.y=e.y-a.y+gantt.$task_data.scrollTop,e},gantt._is_layer=function(t){return t&&t.hasAttribute&&t.hasAttribute(this.config.layer_attribute)},gantt.attachEvent("onGanttReady",function(){gantt._task_layers.add(),gantt._link_layers.add()}),gantt._layers={prepareConfig:function(t){"function"==typeof t&&(t={renderer:t});t.id=gantt.uid();return t.container||(t.container=document.createElement("div")),t},create:function(t,e){return{tempCollection:[],renderers:{}, -container:t,getRenderers:function(){var t=[];for(var e in this.renderers)t.push(this.renderers[e]);return t},getRenderer:function(t){return this.renderers[t]},add:function(t){if(t&&this.tempCollection.push(t),this.container())for(var n=this.container(),a=this.tempCollection,i=0;ia;a++){var s=t[a];s&&(n=n&&s.apply(gantt,[e.id,e])!==!1)}return n}},gantt._add_generic_layer=function(t,e){return function(n){return void 0===n.filter&&(n.filter=gantt._create_filter(e)), -n=gantt._layers.prepareConfig(n),t.add(n),n.id}},gantt._task_layers=gantt._layers.create(function(){return gantt.$task_data},function(){return gantt.$task_links}),gantt._link_layers=gantt._layers.create(function(){return gantt.$task_data}),gantt.addTaskLayer=gantt._add_generic_layer(gantt._task_layers,[gantt._filter_task,gantt._is_chart_visible].concat(gantt._get_task_filters())),gantt.removeTaskLayer=function(t){gantt._task_layers.remove(t)},gantt.addLinkLayer=gantt._add_generic_layer(gantt._link_layers,[gantt._filter_link,gantt._is_chart_visible].concat(gantt._get_link_filters())), -gantt.removeLinkLayer=function(t){gantt._link_layers.remove(t)},gantt._get_task_renderers=function(){return this._task_layers.getRenderers()},gantt._get_link_renderers=function(){return this._link_layers.getRenderers()},gantt._pull={},gantt._branches={},gantt._order=[],gantt._lpull={},gantt._links=[],gantt._order_full=[],gantt.load=function(t,e,n){this._load_url=t,this.assert(arguments.length,"Invalid load arguments"),this.callEvent("onLoadStart",[]);var a="json",i=null;arguments.length>=3?(a=e,i=n):"string"==typeof arguments[1]?a=arguments[1]:"function"==typeof arguments[1]&&(i=arguments[1]), -this._load_type=a,this.ajax.get(t,gantt.bind(function(t){this.on_load(t,a),this.callEvent("onLoadEnd",[]),"function"==typeof i&&i.call(this)},this))},gantt.parse=function(t,e){this.on_load({xmlDoc:{responseText:t}},e)},gantt.serialize=function(t){return t=t||"json",this[t].serialize()},gantt.on_load=function(t,e){this.callEvent("onBeforeParse",[]),e||(e="json"),this.assert(this[e],"Invalid data type:'"+e+"'");var n=t.xmlDoc.responseText,a=this[e].parse(n,t);this._process_loading(a)},gantt._load_task=function(t){ -return this._init_task(t),this.callEvent("onTaskLoading",[t])?(this._pull[t.id]=t,!0):!1},gantt._build_pull=function(t){for(var e=null,n=[],a=0,i=t.length;i>a;a++)e=t[a],this._load_task(e)&&n.push(e);return n},gantt._build_hierarchy=function(t){for(var e=null,n=0,a=t.length;a>n;n++)e=t[n],this.setParent(e,this.getParent(e)||this.config.root_id);for(var n=0,a=t.length;a>n;n++)e=t[n],this._add_branch(e),e.$level=this.calculateTaskLevel(e)},gantt._process_loading=function(t){t.collections&&this._load_collections(t.collections); -var e=this._build_pull(t.data);if(this._build_hierarchy(e),this._sync_order(),this._order_synced=!0,this._init_links(t.links||(t.collections?t.collections.links:[])),this.callEvent("onParse",[]),this.render(),this.config.initial_scroll){var n=this._order[0]||this.config.root_id;n&&this.showTask(n)}},gantt._init_links=function(t){if(t)for(var e=0;e"},_copyObject:function(t){return""; -},serialize:function(){for(var t=[],e=[],n=gantt.json.serialize(),a=0,i=n.data.length;i>a;a++)t.push(this._copyObject(n.data[a]));for(var a=0,i=n.links.length;i>a;a++)e.push(this._copyLink(n.links[a]));return""+t.join("")+""+e.join("")+""}},gantt.oldxml={parse:function(t,e){e=gantt.xml._getXML(t,e,"projects");for(var n={collections:{links:[]}},a=n.data=[],i=gantt.ajax.xpath("//task",e),s=0;se;e++)if(this.units[e]==t)return e;gantt.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,this._working_units_cache.clear()},unset_time:function(t){if(t){var e=this._timestamp(t);null!==e&&delete this.dates[e]}else this.hours=[];this._working_units_cache.clear()},is_working_unit:function(t,e,n){if(!gantt.config.work_time)return!0;var a=this._working_units_cache.get(e,t);return-1==a&&(a=this._check_is_working_unit(t,e,n),this._working_units_cache.put(e,t,a)),a},_check_is_working_unit:function(t,e,n){return void 0===n&&(n=this._get_unit_order(e)),void 0===n?!1:n&&!this.is_working_unit(t,this.units[n-1],n-1)?!1:this["is_work_"+e]?this["is_work_"+e](t):!0; -},is_work_day:function(t){var e=this.get_working_hours(t);return e instanceof Array?e.length>0:!1},is_work_hour:function(t){for(var e=this.get_working_hours(t),n=t.getHours(),a=0;a=e[a]&&ns;){var r=this.next_date(i,n,a);this.is_working_unit(a>0?new Date(r.valueOf()-1):new Date(r.valueOf()+1),n)&&s++,i=r}return i}return gantt.date.add(i,a*e,n)},get_closest_worktime:function(t){if(this.is_working_unit(t.date,t.unit))return t.date;var e=t.unit,n=gantt.date[e+"_start"](t.date),a=new Date(n),i=new Date(n),s=!0,r=3e3,o=0,_="any"==t.dir||!t.dir,d=1;for("past"==t.dir&&(d=-1);!this.is_working_unit(n,e);){ -_&&(n=s?a:i,d=-1*d);var l=n.getTimezoneOffset();if(n=gantt.date.add(n,d,e),n=gantt._correct_dst_change(n,l,d,e),gantt.date[e+"_start"]&&(n=gantt.date[e+"_start"](n)),_&&(s?a=n:i=n),s=!s,o++,o>r)return gantt.assert(!1,"Invalid working time check"),!1}return(n==i||"past"==t.dir)&&(n=gantt.date.add(n,1,e)),n}},gantt.getTask=function(t){gantt.assert(t,"Invalid argument for gantt.getTask");var e=this._pull[t];return gantt.assert(e,"Task not found id="+t),e},gantt.getTaskByTime=function(t,e){var n=this._pull,a=[]; -if(t||e){t=+t||-(1/0),e=+e||1/0;for(var i in n){var s=n[i];+s.start_datet&&a.push(s)}}else for(var i in n)a.push(n[i]);return a},gantt.isTaskExists=function(t){return gantt.defined(this._pull[t])},gantt.isUnscheduledTask=function(t){return!!t.unscheduled||!t.start_date},gantt._isAllowedUnscheduledTask=function(t){return t.unscheduled&&gantt.config.show_unscheduled},gantt.isTaskVisible=function(t){if(!this._pull[t])return!1;var e=this._pull[t];return(+e.start_date<+this._max_date&&+e.end_date>+this._min_date||gantt._isAllowedUnscheduledTask(e))&&void 0!==this._order_search[t]?!0:!1; -},gantt.updateTask=function(t,e){return gantt.defined(e)||(e=this.getTask(t)),this.callEvent("onBeforeTaskUpdate",[t,e])===!1?!1:(this._pull[e.id]=e,this._is_parent_sync(e)||this._resync_parent(e),this._isAllowedUnscheduledTask(e)&&(this._init_task(e),this._sync_links()),this._update_parents(e.id),this.refreshTask(e.id),this.callEvent("onAfterTaskUpdate",[t,e]),this._sync_order(),void this._adjust_scales())},gantt._add_branch=function(t,e){var n=this.getParent(t);this.hasChild(n)||(this._branches[n]=[]); -for(var a=this.getChildren(n),i=!1,s=0,r=a.length;r>s;s++)if(a[s]==t.id){i=!0;break}i||(1*e==e?a.splice(e,0,t.id):a.push(t.id)),this._sync_parent(t)},gantt._move_branch=function(t,e,n){this.setParent(t,n),this._sync_parent(t),this._replace_branch_child(e,t.id),this.isTaskExists(n)||n==this.config.root_id?this._add_branch(t):delete this._branches[t.id],t.$level=this.calculateTaskLevel(t),this._sync_order()},gantt._resync_parent=function(t){this._move_branch(t,t.$rendered_parent,this.getParent(t))}, -gantt._sync_parent=function(t){t.$rendered_parent=this.getParent(t)},gantt._is_parent_sync=function(t){return t.$rendered_parent==this.getParent(t)},gantt._replace_branch_child=function(t,e,n){var a=this.getChildren(t);if(a){for(var i=[],s=0;s=0?1:-1;return a.add_worktime(t,Math.abs(e),n||this.config.duration_unit,i*this.config.duration_step)},gantt._init_task=function(t){return gantt.defined(t.id)||(t.id=gantt.uid()),t.start_date&&(t.start_date=gantt.date.parseDate(t.start_date,"xml_date")),t.end_date&&(t.end_date=gantt.date.parseDate(t.end_date,"xml_date")),t.start_date?!t.end_date&&t.duration&&(t.end_date=this.calculateEndDate(t.start_date,t.duration)):t.end_date&&void 0!==t.duration&&(t.start_date=this.calculateEndDate(t.end_date,-t.duration)), -this._isAllowedUnscheduledTask(t)&&this._set_default_task_timing(t),gantt._init_task_timing(t),t.start_date&&t.end_date&&gantt.correctTaskWorkTime(t),t.$source=[],t.$target=[],void 0===t.parent&&this.setParent(t,this.config.root_id),gantt.defined(t.$open)||(t.$open=gantt.defined(t.open)?t.open:this.config.open_tree_initially),t.$level=this.calculateTaskLevel(t),t},gantt._init_task_timing=function(t){var e=this._get_safe_type(t.type);void 0===t.$rendered_type?t.$rendered_type=e:t.$rendered_type!=e&&(delete t.$no_end, -delete t.$no_start,t.$rendered_type=e),void 0!==t.$no_end&&void 0!==t.$no_start||e==this.config.types.milestone||(e==this.config.types.project?(t.$no_end=t.$no_start=!0,this._set_default_task_timing(t)):(t.$no_end=!(t.end_date||t.duration),t.$no_start=!t.start_date,this._isAllowedUnscheduledTask(t)&&(t.$no_end=t.$no_start=!1))),e==this.config.types.milestone&&(t.end_date=t.start_date),t.start_date&&t.end_date&&(t.duration=this.calculateDuration(t.start_date,t.end_date)),t.duration=t.duration||0}, -gantt._is_flex_task=function(t){return!(!t.$no_end&&!t.$no_start)},gantt.resetProjectDates=function(t){if(t.$no_end||t.$no_start){var e=this.getSubtaskDates(t.id);this._assign_project_dates(t,e.start_date,e.end_date)}},gantt.getSubtaskDates=function(t){var e=null,n=null,a=void 0!==t?t:gantt.config.root_id;return this.eachTask(function(t){this._get_safe_type(t.type)==gantt.config.types.project||this.isUnscheduledTask(t)||(t.start_date&&!t.$no_start&&(!e||e>t.start_date.valueOf())&&(e=t.start_date.valueOf()), -t.end_date&&!t.$no_end&&(!n||n=+gantt._min_date&&+i<=+gantt._max_date)a=Math.floor(gantt._day_index_by_date(i)),gantt._tasks.trace_x[a]||(a-=1),n=new Date(gantt._tasks.trace_x[a]),e=new Date(n),e=gantt._tasks.trace_x[a+1]?new Date(gantt._tasks.trace_x[a+1]):gantt.date.add(n,s,r);else{for(a=Math.floor(gantt._day_index_by_date(i)), -e=gantt.date[r+"_start"](new Date(this._min_date)),gantt._tasks.trace_x[a]&&(e=gantt.date[r+"_start"](gantt._tasks.trace_x[a]));+i>+e;){e=gantt.date[r+"_start"](gantt.date.add(e,s,r));var o=e.getTimezoneOffset();e=gantt.date.add(e,s,r),e=gantt._correct_dst_change(e,o,e,r),gantt.date[r+"_start"]&&(e=gantt.date[r+"_start"](e))}n=gantt.date.add(e,-1*s,r)}return t.dir&&"future"==t.dir?e:t.dir&&"past"==t.dir?n:Math.abs(i-n)n[t];return a?1:-1}:t;if(e){var r=s;s=function(t,e){return r(e,t)}}var o=this.getChildren(n); -if(o){for(var _=[],d=o.length-1;d>=0;d--)_[d]=this._pull[o[d]];_.sort(s);for(var d=0;d<_.length;d++)o[d]=_[d].id,this.sort(t,e,o[d],!0)}i&&this.render()},gantt.getNext=function(t){for(var e=0;en;n++)if(e[n]==t)return e[n+1]||null;return null},gantt.getPrevSibling=function(t){for(var e=this.getSiblings(t),n=0,a=e.length;a>n;n++)if(e[n]==t)return e[n-1]||null;return null},gantt._dp_init=function(t){ -t.setTransactionMode("POST",!0),t.serverProcessor+=(-1!=t.serverProcessor.indexOf("?")?"&":"?")+"editing=true",t._serverProcessor=t.serverProcessor,t.styles={updated:"gantt_updated",order:"gantt_updated",inserted:"gantt_inserted",deleted:"gantt_deleted",invalid:"gantt_invalid",error:"gantt_error",clear:""},t._methods=["_row_style","setCellTextStyle","_change_id","_delete_task"],t.setGanttMode=function(e){var n=t.modes||{};t._ganttMode&&(n[t._ganttMode]={_in_progress:t._in_progress,_invalid:t._invalid, -updatedRows:t.updatedRows});var a=n[e];a||(a=n[e]={_in_progress:{},_invalid:{},updatedRows:[]}),t._in_progress=a._in_progress,t._invalid=a._invalid,t.updatedRows=a.updatedRows,t.modes=n,t._ganttMode=e},this._sendTaskOrder=function(e,n){n.$drop_target&&(t.setGanttMode("tasks"),this.getTask(e).target=n.$drop_target,t.setUpdated(e,!0,"order"),delete this.getTask(e).$drop_target)},this.attachEvent("onAfterTaskAdd",function(e,n){t.setGanttMode("tasks"),t.setUpdated(e,!0,"inserted")}),this.attachEvent("onAfterTaskUpdate",function(e,n){ -t.setGanttMode("tasks"),t.setUpdated(e,!0),gantt._sendTaskOrder(e,n)}),this.attachEvent("onAfterTaskDelete",function(e,n){t.setGanttMode("tasks"),t.setUpdated(e,!0,"deleted"),"off"==t.updateMode||t._tSend||t.sendAllData()}),this.attachEvent("onAfterLinkUpdate",function(e,n){t.setGanttMode("links"),t.setUpdated(e,!0)}),this.attachEvent("onAfterLinkAdd",function(e,n){t.setGanttMode("links"),t.setUpdated(e,!0,"inserted")}),this.attachEvent("onAfterLinkDelete",function(e,n){t.setGanttMode("links"),t.setUpdated(e,!0,"deleted"); -}),this.attachEvent("onRowDragEnd",function(t,e){gantt._sendTaskOrder(t,gantt.getTask(t))});var e=null,n=null;this.attachEvent("onTaskIdChange",function(a,i){if(t._waitMode){var s=gantt.getChildren(i);if(s.length){e=e||{};for(var r=0;r-1?t.indexOf("?"):t.length),this.serverProcessor=t+("/"==t.slice(-1)?"":"/")+e}else this.serverProcessor=t+gantt._urlSeparator(t)+"gantt_mode="+this._ganttMode; -return!0}),this._init_dp_live_update_hooks(t);var a=t.afterUpdate;t.afterUpdate=function(){var e;e=3==arguments.length?arguments[1]:arguments[4];var n=t._ganttMode,i=e.filePath;n="REST"!=this._tMode?-1!=i.indexOf("gantt_mode=links")?"links":"tasks":i.indexOf("/link")>i.indexOf("/task")?"links":"tasks",t.setGanttMode(n);var s=a.apply(t,arguments);return t.setGanttMode(n),s},t._getRowData=gantt.bind(function(e,n){var a;a="tasks"==t._ganttMode?this.isTaskExists(e)?this.getTask(e):{id:e}:this.isLinkExists(e)?this.getLink(e):{ -id:e},a=gantt.copy(a);var i={};for(var s in a)if("$"!=s.substr(0,1)){var r=a[s];r instanceof Date?i[s]=this.templates.xml_format(r):null===r?i[s]="":i[s]=r}return a.$no_start&&(a.start_date="",a.duration=""),a.$no_end&&(a.end_date="",a.duration=""),i[t.action_param]=this.getUserData(e,t.action_param),i},this),this._change_id=gantt.bind(function(e,n){"tasks"!=t._ganttMode?this.changeLinkId(e,n):this.changeTaskId(e,n)},this),this._row_style=function(e,n){if("tasks"==t._ganttMode&&gantt.isTaskExists(e)){ -var a=gantt.getTask(e);a.$dataprocessor_class=n,gantt.refreshTask(e)}},this._delete_task=function(t,e){},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 gantt.defined(t.id)||(t.id=gantt.uid()),t},gantt._sync_links=function(){for(var t=null,e=0,n=this._order_full.length;n>e;e++)t=this._pull[this._order_full[e]], -t.$source=[],t.$target=[];this._links=[];for(var a in this._lpull){var i=this._lpull[a];this._links.push(i),this._pull[i.source]&&this._pull[i.source].$source.push(a),this._pull[i.target]&&this._pull[i.target].$target.push(a)}},gantt.getLink=function(t){return gantt.assert(this._lpull[t],"Link doesn't exist"),this._lpull[t]},gantt.getLinks=function(){var t=[];for(var e in gantt._lpull)t.push(gantt._lpull[e]);return t},gantt.isLinkExists=function(t){return gantt.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 gantt.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[t]&&(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 gantt.defined(this._branches[t])?this._branches[t]:[]},gantt.hasChild=function(t){return gantt.defined(this._branches[t])&&this._branches[t].length; -},gantt.refreshData=function(){this._render_data()},gantt._isTask=function(t){return!(t.type&&t.type==gantt.config.types.project||t.$no_start||t.$no_end)},gantt._isProject=function(t){return!this._isTask(t)},gantt._configure=function(t,e,n){for(var a in e)("undefined"==typeof t[a]||n)&&(t[a]=e[a])},gantt._init_skin=function(){gantt._get_skin(!1),gantt._init_skin=function(){}},gantt._get_skin=function(t){if(!gantt.skin||t)for(var e=document.getElementsByTagName("link"),n=0;n=1440||!this._is_chart_visible())&&(e=this.config.time_step),e}return this.config.time_step},gantt.getLabel=function(t,e){for(var n=this._get_typed_lightbox_config(),a=0;a
"+this.locale.labels[r]+"
"}i=this.config.buttons_right;for(var s=0;s
"+this.locale.labels[r]+"
"; -}a+="",e.innerHTML=a,gantt.config.drag_lightbox&&(e.firstChild.onmousedown=gantt._ready_to_dnd,e.firstChild.onselectstart=function(){return!1},e.firstChild.style.cursor="pointer",gantt._init_dnd_events()),document.body.insertBefore(e,document.body.firstChild),this._lightbox=e;var o=this._get_typed_lightbox_config(t);a=this._render_sections(o);for(var _=e.getElementsByTagName("div"),s=0;s<_.length;s++){var d=_[s];if("gantt_cal_larea"==d.className){d.innerHTML=a;break}}this.resizeLightbox(),this._init_lightbox_events(this), -e.style.display="none",e.style.visibility="visible"}return this._lightbox},gantt._render_sections=function(t){for(var e="",n=0;n
"+this.locale.labels["button_"+t[n].button]+"
"),this.config.wide_form&&(e+="
"), -e+="
"+s+this.locale.labels["section_"+t[n].name]+"
"+a.render.call(this,t[n]),e+="
"}}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,a=window.innerHeight||document.documentElement.clientHeight; -e?t.style.top=Math.round(e+Math.max((a-t.offsetHeight)/2,0))+"px":t.style.top=Math.round(Math.max((a-t.offsetHeight)/2,0)+9)+"px",document.documentElement.scrollWidth>document.body.offsetWidth?t.style.left=Math.round(n+(document.body.offsetWidth-t.offsetWidth)/2)+"px":t.style.left=Math.round((document.body.offsetWidth-t.offsetWidth)/2)+"px"}},gantt.showCover=function(){if(!this._cover){this._cover=document.createElement("DIV"),this._cover.className="gantt_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.gantt_save_btn=function(t){gantt._save_lightbox()},gantt.lightbox_events.gantt_delete_btn=function(t){gantt.callEvent("onLightboxDelete",[gantt._lightbox_id])&&(gantt.isTaskExists(gantt._lightbox_id)?gantt.$click.buttons["delete"](gantt._lightbox_id):gantt.hideLightbox())},gantt.lightbox_events.gantt_cancel_btn=function(t){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,a,i,s=gantt._getClassName(e);-1!=s.indexOf("gantt_custom_button")&&(-1!=s.indexOf("gantt_custom_button_")?(n=e.parentNode.getAttribute("index"),i=e.parentNode.parentNode):(n=e.getAttribute("index"),i=e.parentNode,e=e.firstChild));var r=gantt._get_typed_lightbox_config();n&&(a=gantt.form_blocks[r[n].type],a.button_click(n,e,i,i.nextSibling))}},this.event(gantt.getLightbox(),"click",function(t){ -t=t||window.event;var e=t.target?t.target:t.srcElement,n=gantt._getClassName(e);if(n||(e=e.previousSibling,n=gantt._getClassName(e)),e&&n&&0===n.indexOf("gantt_btn_set")&&(e=e.firstChild,n=gantt._getClassName(e)),e&&n){var a=gantt.defined(gantt.lightbox_events[e.className])?gantt.lightbox_events[e.className]:gantt.lightbox_events["default"];return a(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]),gantt.isTaskExists(t.id)&&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._replace_branch_child(this.getParent(t.id),t.id),this.addTask(t)):this.isTaskExists(t.id)&&(this.mixin(this.getTask(t.id),t,!0), -this.updateTask(t.id)),this.refreshData(),this.hideLightbox())},gantt._resolve_default_mapping=function(t){var e=t.map_to,n={time:!0,time_optional:!0,duration:!0,duration_optional:!0};return n[t.type]&&("auto"==t.map_to?e={start_date:"start_date",end_date:"end_date",duration:"duration"}:"string"==typeof t.map_to&&(e={start_date:t.map_to})),e},gantt.getLightboxValues=function(){var t={};gantt.isTaskExists(this._lightbox_id)&&(t=this.mixin({},this.getTask(this._lightbox_id)));for(var e=this._get_typed_lightbox_config(),n=0;n0&&(o+=" ");var l="";switch(d){case"%Y":t._time_format_order[2]=_,t._time_format_order.size++;var g,h,c,u;t.year_range&&(isNaN(t.year_range)?t.year_range.push&&(c=t.year_range[0],u=t.year_range[1]):g=t.year_range),g=g||10,h=h||Math.floor(g/2), -c=c||i.getFullYear()-h,u=u||c+g;for(var f=c;u>f;f++)l+="";break;case"%m":t._time_format_order[1]=_,t._time_format_order.size++;for(var f=0;12>f;f++)l+="";break;case"%d":t._time_format_order[0]=_,t._time_format_order.size++;for(var f=1;32>f;f++)l+="";break;case"%H:%i":t._time_format_order[3]=_,t._time_format_order.size++;var f=r,p=i.getDate();for(t._time_values=[];s>f;){ -var v=this.templates.time_picker(i);l+="",t._time_values.push(f),i.setTime(i.valueOf()+60*this._get_timepicker_step()*1e3);var m=i.getDate()!=p?1:0;f=24*m*60+60*i.getHours()+i.getMinutes()}}if(l){var k=t.readonly?"disabled='disabled'":"",b=e?" style='display:none'":"";o+=""}}return o},_fill_lightbox_select:function(t,e,n,a,i){if(t[e+a[0]].value=n.getDate(),t[e+a[1]].value=n.getMonth(),t[e+a[2]].value=n.getFullYear(),gantt.defined(a[3])){ -var s=60*n.getHours()+n.getMinutes();s=Math.round(s/gantt._get_timepicker_step())*gantt._get_timepicker_step();var r=t[e+a[3]];r.value=s,r.setAttribute("data-value",s)}},template:{render:function(t){var e=(t.height||"30")+"px";return"
"},set_value:function(t,e,n,a){t.innerHTML=e||""},get_value:function(t,e,n){return t.innerHTML||""},focus:function(t){}},textarea:{render:function(t){var e=(t.height||"130")+"px";return"
"; -},set_value:function(t,e,n){t.firstChild.value=e||""},get_value:function(t,e){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="
"},set_value:function(t,e,n,a){var i=t.firstChild;!i._dhx_onchange&&a.onchange&&(i.onchange=a.onchange, -i._dhx_onchange=!0),"undefined"==typeof e&&(e=(i.options[0]||{}).value),i.value=e||""},get_value:function(t,e){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=["
"];return n.push(e),t.single_date?(e=this.form_blocks.getTimePicker.call(this,t,!0),n.push("")):n.push("  –  "), -n.push(e),n.push("
"),n.join("")},set_value:function(t,e,n,a){var i=a,s=t.getElementsByTagName("select"),r=a._time_format_order;a._time_format_size;if(i.auto_end_date)for(var o=function(){l=new Date(s[r[2]].value,s[r[1]].value,s[r[0]].value,0,0),g=gantt.calculateEndDate(l,1),this.form_blocks._fill_lightbox_select(s,r.size,g,r,i)},_=0;4>_;_++)s[_].onchange=o;var d=gantt._resolve_default_mapping(a);"string"==typeof d&&(d={start_date:d});var l=n[d.start_date]||new Date,g=n[d.end_date]||gantt.calculateEndDate(l,1); -this.form_blocks._fill_lightbox_select(s,0,l,r,i),this.form_blocks._fill_lightbox_select(s,r.size,g,r,i)},get_value:function(t,e,n){var a=t.getElementsByTagName("select"),i=n._time_format_order,s=0,r=0;if(gantt.defined(i[3])){var o=parseInt(a[i[3]].value,10);s=Math.floor(o/60),r=o%60}var _=new Date(a[i[2]].value,a[i[1]].value,a[i[0]].value,s,r);if(s=r=0,gantt.defined(i[3])){var o=parseInt(a[i.size+i[3]].value,10);s=Math.floor(o/60),r=o%60}var d=new Date(a[i[2]+i.size].value,a[i[1]+i.size].value,a[i[0]+i.size].value,s,r); -_>=d&&(d=gantt.date.add(_,gantt._get_timepicker_step(),"minute"));var l=gantt._resolve_default_mapping(n),g={start_date:new Date(_),end_date:new Date(d)};return"string"==typeof l?g.start_date:g},focus:function(t){gantt._focus(t.getElementsByTagName("select")[0])}},duration:{render:function(t){var e=this.form_blocks.getTimePicker.call(this,t);e="
"+e+"
";var n=this.locale.labels[this.config.duration_unit+"s"],a=t.single_date?' style="display:none"':"",i=t.readonly?" disabled='disabled'":"",s="
"+n+"
",r="
"+e+" "+s+"
"; -return r},set_value:function(t,e,n,a){function i(){var e=gantt.form_blocks.duration._get_start_date.call(gantt,t,a),n=gantt.form_blocks.duration._get_duration.call(gantt,t,a),i=gantt.calculateEndDate(e,n);g.innerHTML=gantt.templates.task_date(i)}function s(t){var e=d.value;e=parseInt(e,10),window.isNaN(e)&&(e=0),e+=t,1>e&&(e=1),d.value=e,i()}var r=a,o=t.getElementsByTagName("select"),_=t.getElementsByTagName("input"),d=_[1],l=[_[0],_[2]],g=t.getElementsByTagName("span")[0],h=a._time_format_order;l[0].onclick=gantt.bind(function(){ -s(-1*this.config.duration_step)},this),l[1].onclick=gantt.bind(function(){s(1*this.config.duration_step)},this),o[0].onchange=i,o[1].onchange=i,o[2].onchange=i,o[3]&&(o[3].onchange=i),d.onkeydown=gantt.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(t){i()},1)},this),d.onchange=gantt.bind(function(t){i()},this);var c=gantt._resolve_default_mapping(a);"string"==typeof c&&(c={ -start_date:c});var u=n[c.start_date]||new Date,f=n[c.end_date]||gantt.calculateEndDate(u,1),p=Math.round(n[c.duration])||gantt.calculateDuration(u,f);gantt.form_blocks._fill_lightbox_select(o,0,u,h,r),d.value=p,i()},_get_start_date:function(t,e){var n=t.getElementsByTagName("select"),a=e._time_format_order,i=0,s=0;if(gantt.defined(a[3])){var r=n[a[3]],o=parseInt(r.value,10);isNaN(o)&&r.hasAttribute("data-value")&&(o=parseInt(r.getAttribute("data-value"),10)),i=Math.floor(o/60),s=o%60}return new Date(n[a[2]].value,n[a[1]].value,n[a[0]].value,i,s); -},_get_duration:function(t,e){var n=t.getElementsByTagName("input")[1];return n=parseInt(n.value,10),(!n||window.isNaN(n))&&(n=1),0>n&&(n*=-1),n},get_value:function(t,e,n){var a=gantt.form_blocks.duration._get_start_date(t,n),i=gantt.form_blocks.duration._get_duration(t,n),s=gantt.calculateEndDate(a,i),r=gantt._resolve_default_mapping(n),o={start_date:new Date(a),end_date:new Date(s),duration:i};return"string"==typeof r?o.start_date:o},focus:function(t){gantt._focus(t.getElementsByTagName("select")[0]); -}},parent:{_filter:function(t,e,n){var a=e.filter||function(){return!0};t=t.slice(0);for(var i=0;i
",this.$grid_scale=this.$grid.childNodes[0], -this.$grid_data=this.$grid.childNodes[1],this.$task.innerHTML="
",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(){if(!gantt.isTaskExists(t))return void gantt.hideLightbox();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._clean_el_size=function(t){ -return 1*(t||"").toString().replace("px","")||0},gantt._get_box_styles=function(){var t=null;t=window.getComputedStyle?window.getComputedStyle(this._obj,null):{width:this._obj.clientWidth,height:this._obj.clientHeight};var e=["width","height","paddingTop","paddingBottom","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","borderTopWidth","borderBottomWidth"],n={boxSizing:"border-box"==t.boxSizing};t.MozBoxSizing&&(n.boxSizing="border-box"==t.MozBoxSizing);for(var a=0;aMath.abs(i)){if(n.x)return!0;if(!gantt.$scroll_hor||!gantt.$scroll_hor.offsetWidth)return!0; -var s=a/-40,r=gantt.$task.scrollLeft,o=r+30*s;if(gantt.scrollTo(o,null),gantt.$scroll_hor.scrollLeft=o,r==gantt.$task.scrollLeft)return!0}else{if(n.y)return!0;if(!gantt.$scroll_ver||!gantt.$scroll_ver.offsetHeight)return!0;var s=i/-40;"undefined"==typeof i&&(s=t.detail);var _=gantt.$scroll_ver.scrollTop,d=gantt.$scroll_ver.scrollTop+30*s;if(!gantt.config.prevent_default_scroll&&gantt._cached_scroll_pos&&(gantt._cached_scroll_pos.y==d||gantt._cached_scroll_pos.y<=0&&0>=d))return!0;if(gantt.scrollTo(null,d), -gantt.$scroll_ver.scrollTop=d,_==gantt.$scroll_ver.scrollTop)return!0}return t.preventDefault&&t.preventDefault(),t.cancelBubble=!0,!1}this.event(this.$scroll_hor,"scroll",function(){if(new Date-(gantt._wheel_time||0)<100)return!0;if(!gantt._touch_scroll_active){var t=gantt.$scroll_hor.scrollLeft;gantt.scrollTo(t)}}),this.event(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)}}),this.event(this.$task,"scroll",function(){ -var t=gantt.$task.scrollLeft,e=gantt.$scroll_hor.scrollLeft;e!=t&&(gantt.$scroll_hor.scrollLeft=t)}),this.event(this.$task_data,"scroll",function(){var t=gantt.$task_data.scrollTop,e=gantt.$scroll_ver.scrollTop;e!=t&&(gantt.$scroll_ver.scrollTop=t)});var e=gantt.env.isFF;e?this.event(gantt.$container,"wheel",t):this.event(gantt.$container,"mousewheel",t)},gantt._scroll_resize=function(){if(!(this._x<20||this._y<20)){var t=this._scroll_sizes();t.x?(this.$scroll_hor.style.display="block",this.$scroll_hor.style.height=t.scroll_size+"px", -this.$scroll_hor.style.width=t.x+"px",this.$scroll_hor.firstChild.style.width=t.x_inner+"px"):(this.$scroll_hor.style.display="none",this.$scroll_hor.style.height=this.$scroll_hor.style.width="0px"),t.y?(this.$scroll_ver.style.display="block",this.$scroll_ver.style.width=t.scroll_size+"px",this.$scroll_ver.style.height=t.y+"px",this.$scroll_ver.style.top=this.config.scale_height+"px",this.$scroll_ver.firstChild.style.height=t.y_inner+"px"):(this.$scroll_ver.style.display="none",this.$scroll_ver.style.width=this.$scroll_ver.style.height="0px"); -}},gantt._scroll_sizes=function(){var t=this._get_grid_width(),e=Math.max(this._x-t,0),n=Math.max(this._y-this.config.scale_height,0),a=this.config.scroll_size+1,i=Math.max(this.$task_data.offsetWidth-a,0),s=this.config.row_height*this._order.length,r=this._get_resize_options(),o=this._scroll_hor=r.x?!1:i>e,_=this._scroll_ver=r.y?!1:s>n,d={x:!1,y:!1,scroll_size:a,x_inner:i+t+a+2,y_inner:this.config.scale_height+s};return o&&(d.x=Math.max(this._x-(_?a:2),0)),_&&(d.y=Math.max(this._y-(o?a:0)-this.config.scale_height,0)), -d},gantt._getClassName=function(t){if(!t)return"";var e=t.className||"";return e.baseVal&&(e=e.baseVal),e.indexOf||(e=""),gantt._trim(e)},gantt.locate=function(t){var e=gantt._get_target_node(t),n=gantt._getClassName(e);if((n||"").indexOf("gantt_task_cell")>=0)return null;for(var a=arguments[1]||this.config.task_attribute;e;){if(e.getAttribute){var i=e.getAttribute(a);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 a=gantt._get_target_node(t),i="";a;){if(i=gantt._getClassName(a)){var s=i.indexOf(e);if(s>=0){if(!n)return a;var r=0===s||!gantt._trim(i.charAt(s-1)),o=s+e.length>=i.length||!gantt._trim(i.charAt(s+e.length));if(r&&o)return a}}a=a.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 a=n.getAttribute(e);if(a)return n}n=n.parentNode}return null},gantt.getTaskRowNode=function(t){for(var e=this.$grid_data.childNodes,n=this.config.task_attribute,a=0;an?!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(t){var t=t||this._selected_task;t&&(this._selected_task=null,this.refreshTask(t),this.callEvent("onTaskUnselected",[t]))},gantt.getSelectedId=function(){return this.defined(this._selected_task)?this._selected_task:null},gantt.changeLightboxType=function(t){return this.getLightboxType()==t?!0:void gantt._silent_redraw_lightbox(t)},gantt._is_render_active=function(){return!this._skip_render; -},gantt._correct_dst_change=function(t,e,n,a){var i=gantt._get_line(a)*n;if(i>3600&&86400>i){var s=t.getTimezoneOffset()-e;s&&(t=gantt.date.add(t,s,"minute"))}return t},gantt.batchUpdate=function(t,e){var n,a=this._dp&&"off"!=this._dp.updateMode;a&&(n=this._dp.updateMode,this._dp.setUpdateMode("off"));var i=this._sync_order;this._sync_order=function(){};var s=this._sync_links;this._sync_links=function(){};var r=this._adjust_scales;this._adjust_scales=function(){};var o={},_=this.resetProjectDates; -this.resetProjectDates=function(t){o[t.id]=t},this._skip_render=!0,this.callEvent("onBeforeBatchUpdate",[]);try{t()}catch(d){}this.callEvent("onAfterBatchUpdate",[]),this._sync_order=i,this._sync_order(),this._sync_links=s,this._sync_links(),this.resetProjectDates=_;for(var l in o)this.resetProjectDates(o[l]);this._adjust_scales=r,this._adjust_scales(),this._skip_render=!1,e||this.render(),a&&(this._dp.setUpdateMode(n),this._dp.setGanttMode("tasks"),this._dp.sendData(),this._dp.setGanttMode("links"), -this._dp.sendData())},gantt.env={isIE:navigator.userAgent.indexOf("MSIE")>=0||navigator.userAgent.indexOf("Trident")>=0,isIE6:!window.XMLHttpRequest&&navigator.userAgent.indexOf("MSIE")>=0,isIE7:navigator.userAgent.indexOf("MSIE 7.0")>=0&&navigator.userAgent.indexOf("Trident")<0,isIE8:navigator.userAgent.indexOf("MSIE 8.0")>=0&&navigator.userAgent.indexOf("Trident")>=0,isOpera:navigator.userAgent.indexOf("Opera")>=0,isChrome:navigator.userAgent.indexOf("Chrome")>=0,isKHTML:navigator.userAgent.indexOf("Safari")>=0||navigator.userAgent.indexOf("Konqueror")>=0, -isFF:navigator.userAgent.indexOf("Firefox")>=0,isIPad:navigator.userAgent.search(/iPad/gi)>=0,isEdge:-1!=navigator.userAgent.indexOf("Edge")},gantt.ajax={cache:!0,method:"get",parse:function(t){if("string"!=typeof t)return t;var e;return t=t.replace(/^[\s]+/,""),window.DOMParser&&!gantt.env.isIE?e=(new window.DOMParser).parseFromString(t,"text/xml"):window.ActiveXObject!==window.undefined&&(e=new window.ActiveXObject("Microsoft.XMLDOM"),e.async="false",e.loadXML(t)),e},xmltop:function(t,e,n){if("undefined"==typeof e.status||e.status<400){ -var a=e.responseXML?e.responseXML||e:gantt.ajax.parse(e.responseText||e);if(a&&null!==a.documentElement&&!a.getElementsByTagName("parsererror").length)return a.getElementsByTagName(t)[0]}return-1!==n&&gantt.callEvent("onLoadXMLError",["Incorrect XML",arguments[1],n]),document.createElement("DIV")},xpath:function(t,e){if(e.nodeName||(e=e.responseXML||e),gantt.env.isIE)return e.selectNodes(t)||[];for(var n,a=[],i=(e.ownerDocument||e).evaluate(t,e,null,XPathResult.ANY_TYPE,null);;){if(n=i.iterateNext(), -!n)break;a.push(n)}return a},query:function(t){gantt.ajax._call(t.method||"GET",t.url,t.data||"",t.async||!0,t.callback,null,t.headers)},get:function(t,e){this._call("GET",t,null,!0,e)},getSync:function(t){return this._call("GET",t,null,!1)},put:function(t,e,n){this._call("PUT",t,e,!0,n)},del:function(t,e,n){this._call("DELETE",t,e,!0,n)},post:function(t,e,n){1==arguments.length?e="":2!=arguments.length||"function"!=typeof e&&"function"!=typeof window[e]?e=String(e):(n=e,e=""),this._call("POST",t,e,!0,n); -},postSync:function(t,e){return e=null===e?"":String(e),this._call("POST",t,e,!1)},getLong:function(t,e){this._call("GET",t,null,!0,e,{url:t})},postLong:function(t,e,n){2==arguments.length&&(n=e,e=""),this._call("POST",t,e,!0,n,{url:t,postData:e})},_call:function(t,e,n,a,i,s,r){var o=window.XMLHttpRequest&&!gantt.env.isIE?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP"),_=null!==navigator.userAgent.match(/AppleWebKit/)&&null!==navigator.userAgent.match(/Qt/)&&null!==navigator.userAgent.match(/Safari/); -if(a&&(o.onreadystatechange=function(){if(4==o.readyState||_&&3==o.readyState){if((200!=o.status||""===o.responseText)&&!gantt.callEvent("onAjaxError",[o]))return;window.setTimeout(function(){"function"==typeof i&&i.apply(window,[{xmlDoc:o,filePath:e}]),s&&("undefined"!=typeof s.postData?gantt.ajax.postLong(s.url,s.postData,i):gantt.ajax.getLong(s.url,i)),i=null,o=null},1)}}),"GET"!=t||this.cache||(e+=(e.indexOf("?")>=0?"&":"?")+"dhxr"+(new Date).getTime()+"=1"),o.open(t,e,a),r)for(var d in r)o.setRequestHeader(d,r[d]);else"POST"==t.toUpperCase()||"PUT"==t||"DELETE"==t?o.setRequestHeader("Content-Type","application/x-www-form-urlencoded"):"GET"==t&&(n=null); -return o.setRequestHeader("X-Requested-With","XMLHttpRequest"),o.send(n),a?void 0:{xmlDoc:o,filePath:e}}},gantt._urlSeparator=function(t){return-1!=t.indexOf("?")?"&":"?"},function(){function t(t,e){var a=t.callback;n(!1),t.box.parentNode.removeChild(t.box),h=t.box=null,a&&a(e)}function e(e){if(h){e=e||event;var n=e.which||event.keyCode;return gantt.message.keyboard&&((13==n||32==n)&&t(h,!0),27==n&&t(h,!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 a(t,e){var n="gantt_"+t.toLowerCase().replace(/ /g,"_")+"_button dhtmlx_"+t.toLowerCase().replace(/ /g,"_")+"_button";return"
"+t+"
"}function i(t){c.area||(c.area=document.createElement("DIV"),c.area.className="gantt_message_area dhtmlx_message_area", -c.area.style[c.position]="5px",document.body.appendChild(c.area)),c.hide(t.id);var e=document.createElement("DIV");return e.innerHTML="
"+t.text+"
",e.className="gantt-info dhtmlx-info gantt-"+t.type+" dhtmlx-"+t.type,e.onclick=function(){c.hide(t.id),t=null},"bottom"==c.position&&c.area.firstChild?c.area.insertBefore(e,c.area.firstChild):c.area.appendChild(e),t.expire>0&&(c.timers[t.id]=window.setTimeout(function(){c.hide(t.id)},t.expire)),c.pull[t.id]=e,e=null,t.id}function s(e,n,i){var s=document.createElement("DIV"); -s.className=" gantt_modal_box dhtmlx_modal_box gantt-"+e.type+" dhtmlx-"+e.type,s.setAttribute("dhxbox",1);var r="";if(e.width&&(s.style.width=e.width),e.height&&(s.style.height=e.height),e.title&&(r+='
'+e.title+"
"),r+='
'+(e.content?"":e.text)+'
',n&&(r+=a(e.ok||"OK",!0)),i&&(r+=a(e.cancel||"Cancel",!1)),e.buttons)for(var o=0;o=0&&!t.getHours()&&n.getHours()&&(n.getDate()<=t.getDate()||n.getMonth()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);",a=t.match(/%[a-zA-Z]/g),i=0;i50?1900:2000);";break;case"%g":case"%G": -case"%h":case"%H":n+="set[3]=temp["+i+"]||0;";break;case"%i":n+="set[4]=temp["+i+"]||0;";break;case"%Y":n+="set[0]=temp["+i+"]||0;";break;case"%a":case"%A":n+="set[3]=set[3]%12+((temp["+i+"]||'').toLowerCase()=='am'?0:12);";break;case"%s":n+="set[5]=temp["+i+"]||0;";break;case"%M":n+="set[1]=gantt.locale.date.month_short_hash[temp["+i+"]]||0;";break;case"%F":n+="set[1]=gantt.locale.date.month_full_hash[temp["+i+"]]||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 a=n.getFullYear(),i=Math.round((n.getTime()-new Date(a,0,1).getTime())/864e5),s=1+Math.floor(i/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&&(gantt.defined(e)&&(e="string"==typeof e?gantt.defined(gantt.templates[e])?gantt.templates[e]:gantt.date.str_to_date(e):gantt.templates.xml_date),t=t?e(t):null),t}},gantt.date.quarter_start=function(t){gantt.date.month_start(t);var e,n=t.getMonth();return e=n>=9?9:n>=6?6:n>=3?3:0,t.setMonth(e),t},gantt.date.add_quarter=function(t,e){return gantt.date.add(t,3*e,"month")},gantt.config||(gantt.config={}),gantt.config||(gantt.config={}),gantt.templates||(gantt.templates={}), -function(){gantt.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,autosize_min_width:0,show_links:!0,show_task_cells:!0,static_background:!1,branch_loading:!1,show_loading:!1,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,scroll_on_click:!0,preserve_scroll:!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:!1,columns:[{name:"text",tree:!0,width:"*",resize:!0},{name:"start_date",align:"center",resize:!0},{name:"duration",align:"center"},{name:"add",width:"44"}],step:1,scale_unit:"day",scale_offset_minimal:!0, -subscales:[],inherit_scale_class:!1,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",layer_attribute:"data-layer",buttons_left:["gantt_save_btn","gantt_cancel_btn"],_migrate_buttons:{dhx_save_btn:"gantt_save_btn",dhx_cancel_btn:"gantt_cancel_btn",dhx_delete_btn:"gantt_delete_btn"},buttons_right:["gantt_delete_btn"],lightbox:{sections:[{name:"description",height:70,map_to:"text",type:"textarea",focus:!0},{name:"time", -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",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",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,order_branch:!1,order_branch_free:!1,task_height:"full",min_column_width:70,min_grid_column_width:70,grid_resizer_column_attribute:"column_index",grid_resizer_attribute:"grid_resizer",keep_grid_width:!1,grid_resize:!1,show_unscheduled:!0,readonly_property:"readonly",editable_property:"editable",type_renderers:{},open_tree_initially:!1,optimize_render:!0,prevent_default_scroll:!1,show_errors:!0}),gantt.keys={edit_save:13,edit_cancel:27},gantt._init_template=function(t,e,n){var a=this._reg_templates||{}; -n=n||t,this.config[t]&&a[n]!=this.config[t]&&(e&&this.templates[n]||(this.templates[n]=this.date.date_to_str(this.config[t]),a[n]=this.config[t])),this._reg_templates=a},gantt._init_templates=function(){var t=gantt.locale.labels;t.gantt_save_btn=t.icon_save,t.gantt_cancel_btn=t.icon_cancel,t.gantt_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,"grid_date_format"),gantt._init_template("task_date",!0),gantt.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(t,e,n){return""},grid_header_class:function(t,e){return""},task_text:function(t,e,n){return n.text},task_class:function(t,e,n){return""},grid_row_class:function(t,e,n){return""},task_row_class:function(t,e,n){return""},task_cell_class:function(t,e){return""},scale_cell_class:function(t){return""},scale_row_class:function(t){return""},grid_indent:function(t){ -return"
"},grid_folder:function(t){return"
"},grid_file:function(t){return"
"},grid_open:function(t){return"
"},grid_blank:function(t){return"
"},date_grid:function(t,e){return e&&gantt.isUnscheduledTask(e)&&gantt.config.show_unscheduled?gantt.templates.task_unscheduled_time(e):gantt.templates.grid_date_format(t); -},task_time:function(t,e,n){return gantt.isUnscheduledTask(n)&&gantt.config.show_unscheduled?gantt.templates.task_unscheduled_time(n):gantt.templates.task_date(t)+" - "+gantt.templates.task_date(e)},task_unscheduled_time:function(t){return""},time_picker:e(n.time_picker),link_class:function(t){return""},link_description:function(t){var e=gantt.getTask(t.source),n=gantt.getTask(t.target);return""+e.text+""+n.text+""},drag_link:function(t,e,n,a){t=gantt.getTask(t);var i=gantt.locale.labels,s=""+t.text+" "+(e?i.link_start:i.link_end)+"
"; -return n&&(n=gantt.getTask(n),s+=" "+n.text+" "+(a?i.link_start:i.link_end)+"
"),s},drag_link_class:function(t,e,n,a){var i="";if(t&&n){var s=gantt.isLinkAllowed(t,n,e,a);i=" "+(s?"gantt_link_allow":"gantt_link_deny")}return"gantt_link_tooltip"+i}}),this.callEvent("onTemplatesReady",[])}}(),window.jQuery&&!function(t){var e=[];t.fn.dhx_gantt=function(n){if(n=n||{},"string"!=typeof n){var a=[];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),a.push(gantt)}}),1===a.length?a[0]:a}return e[n]?e[n].apply(this,[]):void t.error("Method "+n+" does not exist on jQuery.dhx_gantt")}}(jQuery),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,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,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,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,link_line_width:1,link_arrow_size:7,lightbox_additional_height:86},_second_column_width:90,_third_column_width:80,_lightbox_template:"
 
", -_config_buttons_left:{},_config_buttons_right:{gantt_delete_btn:"icon_delete",gantt_save_btn:"icon_save"}},gantt.config.touch_drag=500,gantt.config.touch=!0,gantt.config.touch_feedback=!0,gantt._touch_feedback=function(){gantt.config.touch_feedback&&navigator.vibrate&&navigator.vibrate(1)},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,clientX:t.touches[0].clientX,clientY:t.touches[0].clientY}:t},function(){ -return!1}))},gantt._touch_events=function(t,e,n){function a(t){return t&&t.preventDefault&&t.preventDefault(),(t||event).cancelBubble=!0,!1}function i(t){var e=gantt._task_area_pulls,n=gantt.getTask(t);if(n&&gantt.isTaskVisible(t))for(var a in e)if(n=e[a][t],n&&n.getAttribute("task_id")&&n.getAttribute("task_id")==t){var i=n.cloneNode(!0);return g=n,e[a][t]=i,n.style.display="none",i.className+=" gantt_drag_move ",n.parentNode.appendChild(i),i}}var s,r=0,o=!1,_=!1,d=null,l=null,g=null;this._gantt_touch_event_ready||(this._gantt_touch_event_ready=1, -gantt.event(gantt.$container,t[0],function(t){if(!n(t)&&o){l&&clearTimeout(l);var i=e(t);if(gantt._tasks_dnd.drag.id||gantt._tasks_dnd.drag.start_drag)return gantt._tasks_dnd.on_mouse_move(i),t.preventDefault&&t.preventDefault(),t.cancelBubble=!0,!1;if(i&&d){var g=d.pageX-i.pageX,h=d.pageY-i.pageY;if(!_&&(Math.abs(g)>5||Math.abs(h)>5)&&(gantt._touch_scroll_active=_=!0,r=0,s=gantt.getScrollState()),_){gantt.scrollTo(s.x+g,s.y+h);var c=gantt.getScrollState();if(s.x!=c.x&&h>2*g||s.y!=c.y&&g>2*h)return a(t); -}}return a(t)}})),gantt.event(this.$container,"contextmenu",function(t){return o?a(t):void 0}),gantt.event(this.$container,t[1],function(t){if(!n(t)){if(t.touches&&t.touches.length>1)return void(o=!1);if(o=!0,d=e(t),d&&r){var s=new Date;500>s-r?(gantt._on_dblclick(d),a(t)):r=s}else r=new Date;l=setTimeout(function(){var t=gantt.locate(d);!t||gantt._locate_css(d,"gantt_link_control")||gantt._locate_css(d,"gantt_grid_data")||(gantt._tasks_dnd.on_mouse_down(d),gantt._tasks_dnd.drag&&gantt._tasks_dnd.drag.start_drag&&(i(t), -gantt._tasks_dnd._start_dnd(d),gantt._touch_drag=!0,gantt.refreshTask(t),gantt._touch_feedback())),l=null},gantt.config.touch_drag)}}),gantt.event(this.$container,t[2],function(t){if(!n(t)){l&&clearTimeout(l),gantt._touch_drag=!1,o=!1;var a=e(t);gantt._tasks_dnd.on_mouse_up(a),g&&(gantt.refreshTask(gantt.locate(g)),g.parentNode&&(g.parentNode.removeChild(g),gantt._touch_feedback())),gantt._touch_scroll_active=o=_=!1,g=null}})},function(){function t(t,e){var n=gantt.env.isIE?"":"%c",a=[n,'"',t,'"',n," has been deprecated in dhtmlxGantt v4.0 and will stop working in v5.0. Use ",n,'"',e,'"',n," instead. \nSee more details at http://docs.dhtmlx.com/gantt/migrating.html "].join(""),i=window.console.warn||window.console.log,s=[a]; -gantt.env.isIE||(s=s.concat(["font-weight:bold","font-weight:normal","font-weight:bold","font-weight:normal"])),i.apply(window.console,s)}function e(e){return function(){return t("dhtmlx."+e,"gantt."+e),gantt[e].apply(gantt,arguments)}}window.dhtmlx||(window.dhtmlx={});for(var n=["message","alert","confirm","modalbox","uid","copy","mixin","defined","bind","assert"],a=0;athis.config.sensitivity){if(this.config.started=!0,this.config.ignore=!1,this.callEvent("onBeforeDragStart",[t,this.config.original_target])===!1)return this.config.ignore=!0,!0;var r=this.config.marker=document.createElement("div");r.className="gantt_drag_marker", +r.innerHTML="Dragging object",document.body.appendChild(r),this.callEvent("onAfterDragStart",[t,this.config.original_target])}else this.config.ignore=!0}this.config.ignore||(e.pos=this.getPosition(e),this.config.marker.style.left=e.pos.x+"px",this.config.marker.style.top=e.pos.y+"px",this.callEvent("onDragMove",[t,e]))},dragEnd:function(t){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=this.bind(function(t,e,n){return this.close(e),!1},this),this._click.gantt_open=this.bind(function(t,e,n){return this.open(e),!1},this),this._click.gantt_row=this.bind(function(t,e,n){ +if(null!==e){var a=this.getTask(e);this.config.scroll_on_click&&this.showDate(a.start_date),this.callEvent("onTaskRowClick",[e,n])}},this),this._click.gantt_grid_head_cell=this.bind(function(t,e,n){var a=n.getAttribute("column_id");if(this.callEvent("onGridHeaderClick",[a,t])){if("add"==a)return void this._click.gantt_add(t,this.config.root_id);if(this.config.sort){for(var i,s=a,r=0;this.config.columns.length;r++)if(this.config.columns[r].name==a){i=this.config.columns[r];break}if(i&&void 0!==i.sort&&i.sort!==!0&&(s=i.sort, +!s))return;var o=this._sort&&this._sort.direction&&this._sort.name==a?this._sort.direction:"desc";o="desc"==o?"asc":"desc",this._sort={name:a,direction:o},this.sort(s,"desc"==o)}}},this),!this.config.sort&&this.config.order_branch&&this._init_dnd(),this._click.gantt_add=this.bind(function(t,e,n){if(!this.config.readonly){var a={};return this.createTask(a,e?e:this.config.root_id),!1}},this),this._init_resize&&this._init_resize()},gantt._render_grid=function(){this._is_grid_visible()&&(this._calc_grid_width(), +this._render_grid_header())},gantt._calc_grid_width=function(){for(var t=this.getGridColumns(),e=0,n=[],a=[],i=0;i0?n.length:a.length>0?a.length:1);if(n.length>0)for(var o=r/(n.length?n.length:1),i=0;in+_&&(o.width=_=this._get_grid_width()-n),n+=_;var d=this._sort&&o.name==this._sort.name?"
":"",l=["gantt_grid_head_cell","gantt_grid_head_"+o.name,r?"gantt_last_cell":"",this.templates.grid_header_class(o.name,o)].join(" "),g="width:"+(_-(r?1:0))+"px;",h=o.label||a["column_"+o.name]; +h=h||"";var c="
"+h+d+"
";e.push(c)}this.$grid_scale.style.height=this.config.scale_height-1+"px",this.$grid_scale.style.lineHeight=i+"px",this.$grid_scale.style.width=n-1+"px",this.$grid_scale.innerHTML=e.join("")},gantt._render_grid_item=function(t){if(!gantt._is_grid_visible())return null;for(var e=this.getGridColumns(),n=[],a=0;a
":(s=o.template?o.template(t):t[o.name], +s instanceof Date&&(s=this.templates.date_grid(s,t)),s="
"+s+"
");var _="gantt_cell"+(r?" gantt_last_cell":""),d="";if(o.tree){for(var l=0;l"+d+s+"", +n.push(i)}var _=t.$index%2===0?"":" odd";if(_+=t.$transparent?" gantt_transparent":"",_+=t.$dataprocessor_class?" "+t.$dataprocessor_class:"",this.templates.grid_row_class){var c=this.templates.grid_row_class.call(this,t.start_date,t.end_date,t);c&&(_+=" "+c)}this.getState().selected_task==t.id&&(_+=" gantt_selected");var u=document.createElement("div");return u.className="gantt_row"+_,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,gantt._refresh_on_toggle_element(t))},gantt._refresh_on_toggle_element=function(t){this.refreshData()},gantt._is_grid_visible=function(){return this.config.grid_width&&this.config.show_grid},gantt._get_grid_width=function(){ +return this._is_grid_visible()?this._is_chart_visible()?this.config.grid_width:this._x:0},gantt.moveTask=function(t,e,n){var a=arguments[3];if(a){if(a===t)return;n=this.getParent(a),e=this.getTaskIndex(a)}if(t!=n){n=n||this.config.root_id;var i=this.getTask(t),s=this.getParent(i.id),r=(this.getChildren(this.getParent(i.id)),this.getChildren(n));if(-1==e&&(e=r.length+1),s==n){var o=this.getTaskIndex(t);if(o==e)return}if(this.callEvent("onBeforeTaskMove",[t,n,e])!==!1){this._replace_branch_child(s,t), +r=this.getChildren(n);var _=r[e];_?r=r.slice(0,e).concat([t]).concat(r.slice(e)):r.push(t),this.setParent(i,n),this._branches[n]=r,i.$level=this.calculateTaskLevel(i),1*e>0?a?i.$drop_target=(this.getTaskIndex(t)>this.getTaskIndex(a)?"next:":"")+a:i.$drop_target="next:"+gantt.getPrevSibling(t):r[1*e+1]?i.$drop_target=r[1*e+1]:i.$drop_target=n,this.callEvent("onAfterTaskMove",[t,n,e])&&this.refreshData()}}},gantt._init_dnd=function(){var t=new gantt._DnD(this.$grid_data,{updates_per_second:60});this.defined(this.config.dnd_sensitivity)&&(t.config.sensitivity=this.config.dnd_sensitivity), +t.attachEvent("onBeforeDragStart",this.bind(function(e,n){var a=this._locateHTML(n);if(!a)return!1;this.hideQuickInfo&&this._hideQuickInfo();var i=this.locate(n),s=gantt.getTask(i);return gantt._is_readonly(s)?!1:(t.config.initial_open_state=s.$open,this.callEvent("onRowDragStart",[i,n.target||n.srcElement,n])?void 0:!1)},this)),t.attachEvent("onAfterDragStart",this.bind(function(e,n){var a=this._locateHTML(n);t.config.marker.innerHTML=a.outerHTML,t.config.id=this.locate(n);var i=this.getTask(t.config.id); +t.config.index=this.getTaskIndex(t.config.id),t.config.parent=i.parent,i.$open=!1,i.$transparent=!0,this.refreshData()},this)),t.lastTaskOfLevel=function(t){for(var e=gantt._order,n=gantt._pull,a=null,i=0,s=e.length;s>i;i++)n[e[i]].$level==t&&(a=n[e[i]]);return a?a.id:null},t._getGridPos=this.bind(function(t){var e=this._get_position(this.$grid_data),n=e.x,a=t.pos.y-10;return ae.y+this.$grid_data.offsetHeight-this.config.row_height&&(a=e.y+this.$grid_data.offsetHeight-this.config.row_height), +e.x=n,e.y=a,e},this),t.attachEvent("onDragMove",this.bind(function(e,n){function a(t,e){return t.$level==e.$level||gantt.config.order_branch_free}var i=t.config,s=t._getGridPos(n);i.marker.style.left=s.x+10+"px",i.marker.style.top=s.y+"px",s=t._getGridPos(n);var r=(s.x,s.y),o=document.documentElement.scrollTop||document.body.scrollTop,_=document.documentElement.scrollLeft||document.body.scrollLeft,d=document.elementFromPoint(s.x-_+1,r-o),l=this.locate(d),g=this.getTask(t.config.id);if(this.isTaskExists(l)||(l=t.lastTaskOfLevel(gantt.config.order_branch_free?g.$level:0), +l==t.config.id&&(l=null)),this.isTaskExists(l)){var h=gantt._get_position(d),c=this.getTask(l);if(h.y+d.offsetHeight/2=0;)p=this._pull[this._order[u-v]],v++;if(g.id==c.id)return;a(c,g)&&g.id!=c.id?this.moveTask(g.id,0,0,c.id):c.$level!=g.$level-1||gantt.getChildren(c.id).length?p&&a(p,g)&&g.id!=p.id&&this.moveTask(g.id,-1,this.getParent(p.id)):this.moveTask(g.id,0,c.id); +}return!0},this)),t.attachEvent("onDragEnd",this.bind(function(){var e=this.getTask(t.config.id);this.callEvent("onBeforeRowDragEnd",[t.config.id,t.config.parent,t.config.index])===!1?(this.moveTask(t.config.id,t.config.index,t.config.parent),e.$drop_target=null):this.callEvent("onRowDragEnd",[t.config.id,e.$drop_target]),e.$transparent=!1,e.$open=t.config.initial_open_state,this.refreshData()},this))},gantt.getGridColumns=function(){return this.config.columns},gantt._has_children=function(t){return this.getChildren(t).length>0; +},gantt._scale_helpers={getSum:function(t,e,n){void 0===n&&(n=t.length-1),void 0===e&&(e=0);for(var a=0,i=e;n>=i;i++)a+=t[i];return a},setSumWidth:function(t,e,n,a){var i=e.width;void 0===a&&(a=i.length-1),void 0===n&&(n=0);var s=a-n+1;if(!(n>i.length-1||0>=s||a>i.length-1)){var r=this.getSum(i,n,a),o=t-r;this.adjustSize(o,i,n,a),this.adjustSize(-o,i,a+1),e.full_width=this.getSum(i)}},splitSize:function(t,e){for(var n=[],a=0;e>a;a++)n[a]=0;return this.adjustSize(t,n),n},adjustSize:function(t,e,n,a){ +n||(n=0),void 0===a&&(a=e.length-1);for(var i=a-n+1,s=this.getSum(e,n,a),r=0,o=n;a>=o;o++){var _=Math.floor(t*(s?e[o]/s:1/i));s-=e[o],t-=_,i--,e[o]+=_,r+=_}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:0})},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,a){for(var i=this.splitSize(a,t.length),s=n,r=[],o=t.length-1;o>=0;o--){var _=o==t.length-1,d=this.initScaleConfig(t[o]);_&&this.processIgnores(d),this.initColSizes(d,e,s,i[o]),this.limitVisibleRange(d),_&&(s=d.full_width),r.unshift(d)}for(var o=0;oe;e++)t.left.push((t.width[e-1]||0)+(t.left[e-1]||0)); +},_ignore_time_config:function(t){return this.config.skip_off_time?!this.isWorkTime(t):!1},processIgnores:function(t){t.ignore_x={},t.display_count=t.count},initColSizes:function(t,e,n,a){var i=n;t.height=a;var s=void 0===t.display_count?t.count:t.display_count;s||(s=1),t.col_width=Math.floor(i/s),e&&t.col_width=g;g++)+r[g]!=+s[l]||(i&&i.apply(this,[d,l,o,g]),o=g,d=l)},alineScaleColumns:function(t,e,n,a){this.iterateScales(t,e,n,a,function(n,a,i,s){ +var r=this.getSum(t.width,i,s-1),o=this.getSum(e.width,n,a-1);o!=r&&this.setSumWidth(r,e,n,a-1)})},eachColumn:function(t,e,n){var a=new Date(gantt._min_date),i=new Date(gantt._max_date);gantt.date[t+"_start"]&&(a=gantt.date[t+"_start"](a));var s=new Date(a);for(+s>=+i&&(i=gantt.date.add(s,e,t));+i>+s;){n.call(this,new Date(s));var r=s.getTimezoneOffset();s=gantt.date.add(s,e,t),s=gantt._correct_dst_change(s,r,e,t),gantt.date[t+"_start"]&&(s=gantt.date[t+"_start"](s))}},limitVisibleRange:function(t){ +var e=t.trace_x,n=0,a=t.width.length-1,i=0;if(+e[0]<+gantt._min_date&&n!=a){var s=Math.floor(t.width[0]*((e[1]-gantt._min_date)/(e[1]-e[0])));i+=t.width[0]-s,t.width[0]=s,e[0]=new Date(gantt._min_date)}var r=e.length-1,o=e[r],_=gantt.date.add(o,t.step,t.unit);if(+_>+gantt._max_date&&r>0){var s=t.width[r]-Math.floor(t.width[r]*((_-gantt._max_date)/(_-o)));i+=t.width[r]-s,t.width[r]=s}if(i){for(var d=this.getSum(t.width),l=0,g=0;gt.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(gantt.copy(t)),t):this.current()},point_to:function(t,e,n){n=n?{x:n.x,y:n.y}:gantt.copy(this.point());var a=gantt._drawer.dirs;switch(t){case a.left:n.x-=e;break;case a.right:n.x+=e;break;case a.up:n.y-=e;break;case a.down:n.y+=e}return this.point(n)},get_points:function(t){ +var e=this.get_endpoint(t),n=gantt.config,a=e.e_y-e.y,i=e.e_x-e.x,s=gantt._drawer.dirs;this.clear(),this.point({x:e.x,y:e.y});var r=2*n.link_arrow_size,o=e.e_x>e.x;if(t.type==gantt.config.links.start_to_start)this.point_to(s.left,r),o?(this.point_to(s.down,a),this.point_to(s.right,i)):(this.point_to(s.right,i),this.point_to(s.down,a)),this.point_to(s.right,r);else if(t.type==gantt.config.links.finish_to_start)if(o=e.e_x>e.x+2*r,this.point_to(s.right,r),o)i-=r,this.point_to(s.down,a),this.point_to(s.right,i);else{ +i-=2*r;var _=a>0?1:-1;this.point_to(s.down,_*(n.row_height/2)),this.point_to(s.right,i),this.point_to(s.down,_*(Math.abs(a)-n.row_height/2)),this.point_to(s.right,r)}else if(t.type==gantt.config.links.finish_to_finish)this.point_to(s.right,r),o?(this.point_to(s.right,i),this.point_to(s.down,a)):(this.point_to(s.down,a),this.point_to(s.right,i)),this.point_to(s.left,r);else if(t.type==gantt.config.links.start_to_finish)if(o=e.e_x>e.x-2*r,this.point_to(s.left,r),o){i+=2*r;var _=a>0?1:-1;this.point_to(s.down,_*(n.row_height/2)), +this.point_to(s.right,i),this.point_to(s.down,_*(Math.abs(a)-n.row_height/2)),this.point_to(s.left,r)}else i+=r,this.point_to(s.down,a),this.point_to(s.right,i);return this.path},get_endpoint:function(t){var e=gantt.config.links,n=!1,a=!1;t.type==e.start_to_start?n=a=!0:t.type==e.finish_to_finish?n=a=!1:t.type==e.finish_to_start?(n=!1,a=!0):t.type==e.start_to_finish?(n=!0,a=!1):gantt.assert(!1,"Invalid link type");var i=gantt._get_task_visible_pos(gantt._pull[t.source],n),s=gantt._get_task_visible_pos(gantt._pull[t.target],a); +return{x:i.x,e_x:s.x,y:i.y,e_y:s.y}}},gantt._init_links_dnd=function(){function t(t,e,n){var a=gantt._get_task_pos(t,!!e);return a.y+=gantt._get_task_height()/2,n=n||0,a.x+=(e?-1:1)*n,a}function e(t){var e=a(),n=["gantt_link_tooltip"];e.from&&e.to&&(gantt.isLinkAllowed(e.from,e.to,e.from_start,e.to_start)?n.push("gantt_allowed_link"):n.push("gantt_invalid_link"));var i=gantt.templates.drag_link_class(e.from,e.from_start,e.to,e.to_start);i&&n.push(i);var s="
"+gantt.templates.drag_link(e.from,e.from_start,e.to,e.to_start)+"
"; +t.innerHTML=s}function n(t,e){t.style.left=e.x+5+"px",t.style.top=e.y+5+"px"}function a(){return{from:gantt._link_source_task,to:gantt._link_target_task,from_start:gantt._link_source_task_start,to_start:gantt._link_target_task_start}}function i(){gantt._link_source_task=gantt._link_source_task_start=gantt._link_target_task=null,gantt._link_target_task_start=!0}function s(t,e,n,i){var s=_(),d=a(),l=["gantt_link_direction"];gantt.templates.link_direction_class&&l.push(gantt.templates.link_direction_class(d.from,d.from_start,d.to,d.to_start)); +var g=Math.sqrt(Math.pow(n-t,2)+Math.pow(i-e,2));if(g=Math.max(0,g-3)){s.className=l.join(" ");var h=(i-e)/(n-t),c=Math.atan(h);2==o(t,n,e,i)?c+=Math.PI:3==o(t,n,e,i)&&(c-=Math.PI);var u=Math.sin(c),f=Math.cos(c),p=Math.round(e),v=Math.round(t),m=["-webkit-transform: rotate("+c+"rad)","-moz-transform: rotate("+c+"rad)","-ms-transform: rotate("+c+"rad)","-o-transform: rotate("+c+"rad)","transform: rotate("+c+"rad)","width:"+Math.round(g)+"px"];if(-1!=window.navigator.userAgent.indexOf("MSIE 8.0")){ +m.push('-ms-filter: "'+r(u,f)+'"');var k=Math.abs(Math.round(t-n)),b=Math.abs(Math.round(i-e));switch(o(t,n,e,i)){case 1:p-=b;break;case 2:v-=k,p-=b;break;case 3:v-=k}}m.push("top:"+p+"px"),m.push("left:"+v+"px"),s.style.cssText=m.join(";")}}function r(t,e){return"progid:DXImageTransform.Microsoft.Matrix(M11 = "+e+",M12 = -"+t+",M21 = "+t+",M22 = "+e+",SizingMethod = 'auto expand')"}function o(t,e,n,a){return e>=t?n>=a?1:4:n>=a?2:3}function _(){return l._direction||(l._direction=document.createElement("div"), +gantt.$task_links.appendChild(l._direction)),l._direction}function d(){l._direction&&(l._direction.parentNode&&l._direction.parentNode.removeChild(l._direction),l._direction=null)}var l=new gantt._DnD(this.$task_bars,{sensitivity:0,updates_per_second:60}),g="task_left",h="task_right",c="gantt_link_point",u="gantt_link_control";l.attachEvent("onBeforeDragStart",gantt.bind(function(e,n){var a=n.target||n.srcElement;if(i(),gantt.getState().drag_id)return!1;if(gantt._locate_css(a,c)){gantt._locate_css(a,g)&&(gantt._link_source_task_start=!0); +var s=gantt._link_source_task=this.locate(n),r=gantt.getTask(s);if(gantt._is_readonly(r))return i(),!1;var o=0;return gantt._get_safe_type(r.type)==gantt.config.types.milestone&&(o=(gantt._get_visible_milestone_width()-gantt._get_milestone_width())/2),this._dir_start=t(r,!!gantt._link_source_task_start,o),!0}return!1},this)),l.attachEvent("onAfterDragStart",gantt.bind(function(t,n){e(l.config.marker)},this)),l.attachEvent("onDragMove",gantt.bind(function(a,i){var r=l.config,o=l.getPosition(i);n(r.marker,o); +var _=gantt._is_link_drop_area(i),d=gantt._link_target_task,g=gantt._link_landing,c=gantt._link_target_task_start,f=gantt.locate(i),p=!0;if(_&&(p=!gantt._locate_css(i,h),_=!!f),gantt._link_target_task=f,gantt._link_landing=_,gantt._link_target_task_start=p,_){var v=gantt.getTask(f),m=gantt._locate_css(i,u),k=0;m&&(k=Math.floor(m.offsetWidth/2)),this._dir_end=t(v,!!gantt._link_target_task_start,k)}else this._dir_end=gantt._get_mouse_pos(i);var b=!(g==_&&d==f&&c==p);return b&&(d&&gantt.refreshTask(d,!1), +f&&gantt.refreshTask(f,!1)),b&&e(r.marker),s(this._dir_start.x,this._dir_start.y,this._dir_end.x,this._dir_end.y),!0},this)),l.attachEvent("onDragEnd",gantt.bind(function(){var t=a();if(t.from&&t.to&&t.from!=t.to){var e=gantt._get_link_type(t.from_start,t.to_start),n={source:t.from,target:t.to,type:e};n.type&&gantt.isLinkAllowed(n)&&gantt.addLink(n)}i(),t.from&&gantt.refreshTask(t.from,!1),t.to&&gantt.refreshTask(t.to,!1),d()},this)),gantt._is_link_drop_area=function(t){return!!gantt._locate_css(t,u); +}},gantt._get_link_state=function(){return{link_landing_area:this._link_landing,link_target_id:this._link_target_task,link_target_start:this._link_target_task_start,link_source_id:this._link_source_task,link_source_start:this._link_source_task_start}},gantt._task_renderer=function(t,e,n,a){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||this.assert(!1,"Invalid renderer call"), +n&&n.setAttribute(this.config.layer_attribute,!0),this._task_area_renderers[t]={render_item:function(t,i){if(i=i||n,a&&!a(t))return void this.remove_item(t.id);var s=e.call(gantt,t);this.append(t,s,i)},clear:function(e){this.rendered=gantt._task_area_pulls[t]={},this.clear_container(e)},clear_container:function(t){t=t||n,t&&(t.innerHTML="")},render_items:function(t,e){e=e||n;var a=document.createDocumentFragment();this.clear(e);for(var i=0,s=t.length;s>i;i++)this.render_item(t[i],a);e.appendChild(a); +},append:function(t,e,n){e&&(this.rendered[t.id]&&this.rendered[t.id].parentNode?this.replace_item(t.id,e):n.appendChild(e),this.rendered[t.id]=e)},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){this.hide(t),delete this.rendered[t]},hide:function(t){var e=this.rendered[t];e&&e.parentNode&&e.parentNode.removeChild(e)},restore:function(t){var e=this.rendered[t.id];e?e.parentNode||this.append(t,e,n):this.render_item(t,n); +},change_id:function(t,e){this.rendered[e]=this.rendered[t],delete this.rendered[t]},rendered:this._task_area_pulls[t],node:n,unload:function(){this.clear(),delete gantt._task_area_renderers[t],delete gantt._task_area_pulls[t]}},this._task_area_renderers[t])},gantt._clear_renderers=function(){for(var t in this._task_area_renderers)this._task_renderer(t).unload()},gantt._is_layer=function(t){return t&&t.hasAttribute&&t.hasAttribute(this.config.layer_attribute)},gantt._init_tasks=function(){function t(t,e,n,a){ +for(var i=0;i-1?a.$target[0]:a.$source[0]),i&&this._delete_link_handler(i,t),!1},this),this._tasks_dnd.init(),this._init_links_dnd(),this._link_layers.clear(); +var e=this.addLinkLayer({renderer:this._render_link_element,container:this.$task_links,filter:gantt._create_filter([gantt._filter_link,gantt._is_chart_visible].concat(this._get_link_filters()))});this._linkRenderer=this._link_layers.getRenderer(e),this._task_layers.clear();var n=this.addTaskLayer({renderer:this._render_task_element,container:this.$task_bars,filter:gantt._create_filter([gantt._filter_task,gantt._is_chart_visible].concat(this._get_task_filters()))});this._taskRenderer=this._task_layers.getRenderer(n), +this.addTaskLayer({renderer:this._render_grid_item,container:this.$grid_data,filter:gantt._create_filter([gantt._filter_task,gantt._is_grid_visible].concat(this._get_task_filters()))}),this.addTaskLayer({renderer:this._render_bg_line,container:this.$task_bg,filter:gantt._create_filter([gantt._filter_task,gantt._is_chart_visible,gantt._is_std_background].concat(this._get_task_filters()))}),this._onTaskIdChange&&this.detachEvent(this._onTaskIdChange),this._onTaskIdChange=this.attachEvent("onTaskIdChange",function(e,n){ +var a=this._get_task_renderers();t(a,e,n,this.getTask(n))}),this._onLinkIdChange&&this.detachEvent(this._onLinkIdChange),this._onLinkIdChange=this.attachEvent("onLinkIdChange",function(e,n){var a=this._get_link_renderers();t(a,e,n,this.getLink(n))})},gantt._get_task_filters=function(){return[]},gantt._get_link_filters=function(){return[]},gantt._is_chart_visible=function(){return!!this.config.show_chart},gantt._filter_task=function(t,e){var n=null,a=null;return this.config.start_date&&this.config.end_date&&(n=this.config.start_date.valueOf(), +a=this.config.end_date.valueOf(),+e.start_date>a||+e.end_date<+n)?!1:!0},gantt._filter_link=function(t,e){return this.config.show_links?!gantt.isTaskVisible(e.source)||!gantt.isTaskVisible(e.target)||gantt._isAllowedUnscheduledTask(gantt.getTask(e.source))||gantt._isAllowedUnscheduledTask(gantt.getTask(e.target))?!1:this.callEvent("onBeforeLinkDisplay",[t,e]):!1},gantt._is_std_background=function(){return!this.config.static_background},gantt._delete_link_handler=function(t,e){if(t&&this.callEvent("onLinkDblClick",[t,e])){ +var n=gantt.getLink(t);if(gantt._is_readonly(n))return;var a="",i=gantt.locale.labels.link+" "+this.templates.link_description(this.getLink(t))+" "+gantt.locale.labels.confirm_link_deleting;window.setTimeout(function(){gantt._dhtmlx_confirm(i,a,function(){gantt.deleteLink(t)})},gantt.config.touch?300:1)}},gantt.getTaskNode=function(t){return this._taskRenderer.rendered[t]},gantt.getLinkNode=function(t){return this._linkRenderer.rendered[t]},gantt._get_tasks_data=function(){for(var t=[],e=this._get_data_range(),n=0;nn;n++){var i=e[n];this._is_layer(i)&&i.style&&(i.style.width=t.full_width+"px")}if(this._is_grid_visible()){for(var s=this.getGridColumns(),r=0,n=0;n"+r+"";e.push(g)}}return e.join("")},gantt._get_scales=function(){var t=this._scale_helpers,e=[t.primaryScale()].concat(this.config.subscales);return t.sortScales(e),e},gantt._render_tasks_scales=function(){this._init_tasks_range(),this._scroll_resize(),this._set_sizes();var t="",e=0,n=0,a=0;if(this._is_chart_visible()){var i=this._scale_helpers,s=this._get_scales(); +a=this.config.scale_height-1;for(var r=this._get_resize_options(),o=r.x?Math.max(this.config.autosize_min_width,0):this.$task.offsetWidth,_=i.prepareConfigs(s,this.config.min_column_width,o,a),d=this._tasks=_[_.length-1],l=[],g=this.templates.scale_row_class,h=0;h<_.length;h++){var c="gantt_scale_line",u=g(_[h]);u&&(c+=" "+u),l.push('
'+this._prepare_scale_html(_[h])+"
")}t=l.join(""),e=d.full_width+this.$scroll_ver.offsetWidth+"px", +n=d.full_width+"px",a+="px"}this._is_chart_visible()?this.$task.style.display="":this.$task.style.display="none",this.$task_scale.style.height=a,this.$task_data.style.width=this.$task_scale.style.width=e,this.$task_scale.innerHTML=t},gantt._render_bg_line=function(t){var e=gantt._tasks,n=e.count,a=document.createElement("div");if(gantt.config.show_task_cells)for(var i=0;n>i;i++){var s=e.width[i],r="";if(s>0){var o=document.createElement("div");o.style.width=s+"px",r="gantt_task_cell"+(i==n-1?" gantt_last_cell":""), +d=this.templates.task_cell_class(t,e.trace_x[i]),d&&(r+=" "+d),o.className=r,a.appendChild(o)}}var _=t.$index%2!==0,d=gantt.templates.task_row_class(t.start_date,t.end_date,t),l="gantt_task_row"+(_?" odd":"")+(d?" "+d:"");return this.getState().selected_task==t.id&&(l+=" gantt_selected"),a.className=l,gantt.config.smart_rendering&&(a.style.position="absolute",a.style.top=this.getTaskTop(t.id)+"px",a.style.width="100%"),a.style.height=gantt.config.row_height+"px",a.setAttribute(this.config.task_attribute,t.id), +a},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){if(this._is_render_active()){var n=this._get_task_renderers(),a=this.getTask(t);if(a&&this.isTaskVisible(t)){for(var i=0;i=+i.min_date&&t.appendChild(a(e+" task_left"))},gantt._get_task_height=function(){var t=this.config.task_height;return"full"==t&&(t=this.config.row_height-5), +t=Math.min(t,this.config.row_height),Math.max(t,0)},gantt._get_milestone_width=function(){return this._get_task_height()},gantt._get_visible_milestone_width=function(){var t=gantt._get_task_height();return Math.sqrt(2*t*t)},gantt.getTaskPosition=function(t,e,n){var a=this.posFromDate(e||t.start_date),i=this.posFromDate(n||t.end_date);i=Math.max(a,i);var s=this.getTaskTop(t.id),r=gantt._get_task_height();return{left:a,top:s,height:r,width:Math.max(i-a,0)}},gantt._get_task_width=function(t,e,n){return Math.round(this._get_task_pos(t,!1).x-this._get_task_pos(t,!0).x); +},gantt._is_readonly=function(t){return t&&t[this.config.editable_property]?!1:t&&t[this.config.readonly_property]||this.config.readonly},gantt._task_default_render=function(t){if(!this._isAllowedUnscheduledTask(t)){var e=this._get_task_pos(t),n=this.config,a=this._get_task_height(),i=Math.floor((this.config.row_height-a)/2);this._get_safe_type(t.type)==n.types.milestone&&n.link_line_width>1&&(i+=1);var s=document.createElement("div"),r=gantt._get_task_width(t),o=this._get_safe_type(t.type);s.setAttribute(this.config.task_attribute,t.id), +n.show_progress&&o!=this.config.types.milestone&&this._render_task_progress(t,s,r);var _=gantt._render_task_content(t,r);t.textColor&&(_.style.color=t.textColor),s.appendChild(_);var d=this._combine_item_class("gantt_task_line",this.templates.task_class(t.start_date,t.end_date,t),t.id);(t.color||t.progressColor||t.textColor)&&(d+=" gantt_task_inline_color"),s.className=d;var l=["left:"+e.x+"px","top:"+(i+e.y)+"px","height:"+a+"px","line-height:"+a+"px","width:"+r+"px"];t.color&&l.push("background-color:"+t.color), +t.textColor&&l.push("color:"+t.textColor),s.style.cssText=l.join(";");var g=this._render_leftside_content(t);return g&&s.appendChild(g),g=this._render_rightside_content(t),g&&s.appendChild(g),this._is_readonly(t)||(n.drag_resize&&!this._is_flex_task(t)&&o!=this.config.types.milestone&&gantt._render_pair(s,"gantt_task_drag",t,function(t){var e=document.createElement("div");return e.className=t,e}),n.drag_links&&this.config.show_links&&gantt._render_pair(s,"gantt_link_control",t,function(t){var e=document.createElement("div"); +e.className=t,e.style.cssText=["height:"+a+"px","line-height:"+a+"px"].join(";");var n=document.createElement("div");return n.className="gantt_link_point",e.appendChild(n),e})),s}},gantt._render_task_element=function(t){var e=this.config.type_renderers,n=e[this._get_safe_type(t.type)],a=this._task_default_render;return n||(n=a),n.call(this,t,this.bind(a,this))},gantt._render_side_content=function(t,e,n){if(!e)return null;var a=e(t.start_date,t.end_date,t);if(!a)return null;var i=document.createElement("div"); +return i.className="gantt_side_content "+n,i.innerHTML=a,i},gantt._render_leftside_content=function(t){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 a in n)for(var i=e[a],s=0;st||t>e.full_width||!e.full_width)return null;var n=this._findBinary(this._tasks.left,t),a=this._tasks.left[n],i=e.width[n]||e.col_width,s=0;i&&(s=(t-a)/i);var r=0;s&&(r=gantt._get_coll_duration(e,e.trace_x[n]));var o=new Date(e.trace_x[n].valueOf()+Math.round(s*r)); +return o},gantt.posFromDate=function(t){var e=gantt._day_index_by_date(t);this.assert(e>=0,"Invalid day index");var n=Math.floor(e),a=e%1,i=gantt._tasks.left[Math.min(n,gantt._tasks.width.length-1)];return n==gantt._tasks.width.length&&(i+=gantt._tasks.width[gantt._tasks.width.length-1]),a&&(i+=n=this._max_date)return n.length; +for(var i=gantt._findBinary(n,e),s=+gantt._tasks.trace_x[i];a[s];)s=gantt._tasks.trace_x[++i];return s?i+(t-n[i])/gantt._get_coll_duration(gantt._tasks,n[i]):0},gantt._findBinary=function(t,e){for(var n,a,i,s=0,r=t.length-1;r>=s;)if(n=Math.floor((s+r)/2),a=+t[n],i=+t[n-1],e>a)s=n+1;else{if(!(a>e))return n;if(!isNaN(i)&&e>i)return n-1;r=n-1}return t.length-1},gantt._get_coll_duration=function(t,e){return gantt.date.add(e,t.step,t.unit)-e},gantt._get_x_pos=function(t,e){e=e!==!1;gantt.posFromDate(e?t.start_date:t.end_date); +},gantt.getTaskTop=function(t){return this._y_from_ind(this.getGlobalTaskIndex(t))},gantt._get_task_coord=function(t,e,n){e=e!==!1,n=n||0;var a=this._get_safe_type(t.type)==this.config.types.milestone,i=null;i=e||a?t.start_date||this._default_task_date(t):t.end_date||this.calculateEndDate(this._default_task_date(t));var s=this.posFromDate(i),r=this.getTaskTop(t.id);return a&&(e?s-=n:s+=n),{x:s,y:r}},gantt._get_task_pos=function(t,e){e=e!==!1;var n=gantt._get_milestone_width()/2;return this._get_task_coord(t,e,n); +},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=gantt.env.isIE?document.documentElement:document.body,e={x:t.clientX+n.scrollLeft-n.clientLeft,y:t.clientY+n.scrollTop-n.clientTop},a=gantt._get_position(gantt.$task_data); +return e.x=e.x-a.x+gantt.$task_data.scrollLeft,e.y=e.y-a.y+gantt.$task_data.scrollTop,e},gantt._is_layer=function(t){return t&&t.hasAttribute&&t.hasAttribute(this.config.layer_attribute)},gantt.attachEvent("onGanttReady",function(){gantt._task_layers.add(),gantt._link_layers.add()}),gantt._layers={prepareConfig:function(t){"function"==typeof t&&(t={renderer:t});t.id=gantt.uid();return t.container||(t.container=document.createElement("div")),t},create:function(t,e){return{tempCollection:[],renderers:{}, +container:t,getRenderers:function(){var t=[];for(var e in this.renderers)t.push(this.renderers[e]);return t},getRenderer:function(t){return this.renderers[t]},add:function(t){if(t&&this.tempCollection.push(t),this.container())for(var n=this.container(),a=this.tempCollection,i=0;ia;a++){var s=t[a];s&&(n=n&&s.apply(gantt,[e.id,e])!==!1)}return n}},gantt._add_generic_layer=function(t,e){return function(n){return void 0===n.filter&&(n.filter=gantt._create_filter(e)), +n=gantt._layers.prepareConfig(n),t.add(n),n.id}},gantt._task_layers=gantt._layers.create(function(){return gantt.$task_data},function(){return gantt.$task_links}),gantt._link_layers=gantt._layers.create(function(){return gantt.$task_data}),gantt.addTaskLayer=gantt._add_generic_layer(gantt._task_layers,[gantt._filter_task,gantt._is_chart_visible].concat(gantt._get_task_filters())),gantt.removeTaskLayer=function(t){gantt._task_layers.remove(t)},gantt.addLinkLayer=gantt._add_generic_layer(gantt._link_layers,[gantt._filter_link,gantt._is_chart_visible].concat(gantt._get_link_filters())), +gantt.removeLinkLayer=function(t){gantt._link_layers.remove(t)},gantt._get_task_renderers=function(){return this._task_layers.getRenderers()},gantt._get_link_renderers=function(){return this._link_layers.getRenderers()},gantt._pull={},gantt._branches={},gantt._order=[],gantt._lpull={},gantt._links=[],gantt._order_full=[],gantt.load=function(t,e,n){this._load_url=t,this.assert(arguments.length,"Invalid load arguments"),this.callEvent("onLoadStart",[]);var a="json",i=null;arguments.length>=3?(a=e,i=n):"string"==typeof arguments[1]?a=arguments[1]:"function"==typeof arguments[1]&&(i=arguments[1]), +this._load_type=a,this.ajax.get(t,gantt.bind(function(t){this.on_load(t,a),this.callEvent("onLoadEnd",[]),"function"==typeof i&&i.call(this)},this))},gantt.parse=function(t,e){this.on_load({xmlDoc:{responseText:t}},e)},gantt.serialize=function(t){return t=t||"json",this[t].serialize()},gantt.on_load=function(t,e){this.callEvent("onBeforeParse",[]),e||(e="json"),this.assert(this[e],"Invalid data type:'"+e+"'");var n=t.xmlDoc.responseText,a=this[e].parse(n,t);this._process_loading(a)},gantt._load_task=function(t){ +return this._init_task(t),this.callEvent("onTaskLoading",[t])?(this._pull[t.id]=t,!0):!1},gantt._build_pull=function(t){for(var e=null,n=[],a=0,i=t.length;i>a;a++)e=t[a],this._load_task(e)&&n.push(e);return n},gantt._build_hierarchy=function(t){for(var e=null,n=0,a=t.length;a>n;n++)e=t[n],this.setParent(e,this.getParent(e)||this.config.root_id);for(var n=0,a=t.length;a>n;n++)e=t[n],this._add_branch(e),e.$level=this.calculateTaskLevel(e)},gantt._process_loading=function(t){t.collections&&this._load_collections(t.collections); +var e=this._build_pull(t.data);if(this._build_hierarchy(e),this._sync_order(),this._order_synced=!0,this._init_links(t.links||(t.collections?t.collections.links:[])),this.callEvent("onParse",[]),this.render(),this.config.initial_scroll){var n=this._order[0]||this.config.root_id;n&&this.showTask(n)}},gantt._init_links=function(t){if(t)for(var e=0;e"},_copyObject:function(t){return""; +},serialize:function(){for(var t=[],e=[],n=gantt.json.serialize(),a=0,i=n.data.length;i>a;a++)t.push(this._copyObject(n.data[a]));for(var a=0,i=n.links.length;i>a;a++)e.push(this._copyLink(n.links[a]));return""+t.join("")+""+e.join("")+""}},gantt.oldxml={parse:function(t,e){e=gantt.xml._getXML(t,e,"projects");for(var n={collections:{links:[]}},a=n.data=[],i=gantt.ajax.xpath("//task",e),s=0;se;e++)if(this.units[e]==t)return e;gantt.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,this._working_units_cache.clear()},unset_time:function(t){if(t){var e=this._timestamp(t);null!==e&&delete this.dates[e]}else this.hours=[];this._working_units_cache.clear()},is_working_unit:function(t,e,n){if(!gantt.config.work_time)return!0;var a=this._working_units_cache.get(e,t);return-1==a&&(a=this._check_is_working_unit(t,e,n),this._working_units_cache.put(e,t,a)),a},_check_is_working_unit:function(t,e,n){return void 0===n&&(n=this._get_unit_order(e)),void 0===n?!1:n&&!this.is_working_unit(t,this.units[n-1],n-1)?!1:this["is_work_"+e]?this["is_work_"+e](t):!0; +},is_work_day:function(t){var e=this.get_working_hours(t);return e instanceof Array?e.length>0:!1},is_work_hour:function(t){for(var e=this.get_working_hours(t),n=t.getHours(),a=0;a=e[a]&&ns;){var r=this.next_date(i,n,a);this.is_working_unit(a>0?new Date(r.valueOf()-1):new Date(r.valueOf()+1),n)&&s++,i=r}return i}return gantt.date.add(i,a*e,n)},get_closest_worktime:function(t){if(this.is_working_unit(t.date,t.unit))return t.date;var e=t.unit,n=gantt.date[e+"_start"](t.date),a=new Date(n),i=new Date(n),s=!0,r=3e3,o=0,_="any"==t.dir||!t.dir,d=1;for("past"==t.dir&&(d=-1);!this.is_working_unit(n,e);){ +_&&(n=s?a:i,d=-1*d);var l=n.getTimezoneOffset();if(n=gantt.date.add(n,d,e),n=gantt._correct_dst_change(n,l,d,e),gantt.date[e+"_start"]&&(n=gantt.date[e+"_start"](n)),_&&(s?a=n:i=n),s=!s,o++,o>r)return gantt.assert(!1,"Invalid working time check"),!1}return(n==i||"past"==t.dir)&&(n=gantt.date.add(n,1,e)),n}},gantt.getTask=function(t){gantt.assert(t,"Invalid argument for gantt.getTask");var e=this._pull[t];return gantt.assert(e,"Task not found id="+t),e},gantt.getTaskByTime=function(t,e){var n=this._pull,a=[]; +if(t||e){t=+t||-(1/0),e=+e||1/0;for(var i in n){var s=n[i];+s.start_datet&&a.push(s)}}else for(var i in n)a.push(n[i]);return a},gantt.isTaskExists=function(t){return gantt.defined(this._pull[t])},gantt.isUnscheduledTask=function(t){return!!t.unscheduled||!t.start_date},gantt._isAllowedUnscheduledTask=function(t){return t.unscheduled&&gantt.config.show_unscheduled},gantt.isTaskVisible=function(t){if(!this._pull[t])return!1;var e=this._pull[t];return(+e.start_date<+this._max_date&&+e.end_date>+this._min_date||gantt._isAllowedUnscheduledTask(e))&&void 0!==this._order_search[t]?!0:!1; +},gantt.updateTask=function(t,e){return gantt.defined(e)||(e=this.getTask(t)),this.callEvent("onBeforeTaskUpdate",[t,e])===!1?!1:(this._pull[e.id]=e,this._is_parent_sync(e)||this._resync_parent(e),this._isAllowedUnscheduledTask(e)&&(this._init_task(e),this._sync_links()),this._update_parents(e.id),this.refreshTask(e.id),this.callEvent("onAfterTaskUpdate",[t,e]),this._sync_order(),void this._adjust_scales())},gantt._add_branch=function(t,e){var n=this.getParent(t);this.hasChild(n)||(this._branches[n]=[]); +for(var a=this.getChildren(n),i=!1,s=0,r=a.length;r>s;s++)if(a[s]==t.id){i=!0;break}i||(1*e==e?a.splice(e,0,t.id):a.push(t.id)),this._sync_parent(t)},gantt._move_branch=function(t,e,n){this.setParent(t,n),this._sync_parent(t),this._replace_branch_child(e,t.id),this.isTaskExists(n)||n==this.config.root_id?this._add_branch(t):delete this._branches[t.id],t.$level=this.calculateTaskLevel(t),this._sync_order()},gantt._resync_parent=function(t){this._move_branch(t,t.$rendered_parent,this.getParent(t))}, +gantt._sync_parent=function(t){t.$rendered_parent=this.getParent(t)},gantt._is_parent_sync=function(t){return t.$rendered_parent==this.getParent(t)},gantt._replace_branch_child=function(t,e,n){var a=this.getChildren(t);if(a){for(var i=[],s=0;s=0?1:-1;return a.add_worktime(t,Math.abs(e),n||this.config.duration_unit,i*this.config.duration_step)},gantt._init_task=function(t){return gantt.defined(t.id)||(t.id=gantt.uid()),t.start_date&&(t.start_date=gantt.date.parseDate(t.start_date,"xml_date")),t.end_date&&(t.end_date=gantt.date.parseDate(t.end_date,"xml_date")),t.start_date?!t.end_date&&t.duration&&(t.end_date=this.calculateEndDate(t.start_date,t.duration)):t.end_date&&void 0!==t.duration&&(t.start_date=this.calculateEndDate(t.end_date,-t.duration)), +this._isAllowedUnscheduledTask(t)&&this._set_default_task_timing(t),gantt._init_task_timing(t),t.start_date&&t.end_date&&gantt.correctTaskWorkTime(t),t.$source=[],t.$target=[],void 0===t.parent&&this.setParent(t,this.config.root_id),gantt.defined(t.$open)||(t.$open=gantt.defined(t.open)?t.open:this.config.open_tree_initially),t.$level=this.calculateTaskLevel(t),t},gantt._init_task_timing=function(t){var e=this._get_safe_type(t.type);void 0===t.$rendered_type?t.$rendered_type=e:t.$rendered_type!=e&&(delete t.$no_end, +delete t.$no_start,t.$rendered_type=e),void 0!==t.$no_end&&void 0!==t.$no_start||e==this.config.types.milestone||(e==this.config.types.project?(t.$no_end=t.$no_start=!0,this._set_default_task_timing(t)):(t.$no_end=!(t.end_date||t.duration),t.$no_start=!t.start_date,this._isAllowedUnscheduledTask(t)&&(t.$no_end=t.$no_start=!1))),e==this.config.types.milestone&&(t.end_date=t.start_date),t.start_date&&t.end_date&&(t.duration=this.calculateDuration(t.start_date,t.end_date)),t.duration=t.duration||0}, +gantt._is_flex_task=function(t){return!(!t.$no_end&&!t.$no_start)},gantt.resetProjectDates=function(t){if(t.$no_end||t.$no_start){var e=this.getSubtaskDates(t.id);this._assign_project_dates(t,e.start_date,e.end_date)}},gantt.getSubtaskDates=function(t){var e=null,n=null,a=void 0!==t?t:gantt.config.root_id;return this.eachTask(function(t){this._get_safe_type(t.type)==gantt.config.types.project||this.isUnscheduledTask(t)||(t.start_date&&!t.$no_start&&(!e||e>t.start_date.valueOf())&&(e=t.start_date.valueOf()), +t.end_date&&!t.$no_end&&(!n||n=+gantt._min_date&&+i<=+gantt._max_date)a=Math.floor(gantt._day_index_by_date(i)),gantt._tasks.trace_x[a]||(a-=1),n=new Date(gantt._tasks.trace_x[a]),e=new Date(n),e=gantt._tasks.trace_x[a+1]?new Date(gantt._tasks.trace_x[a+1]):gantt.date.add(n,s,r);else{for(a=Math.floor(gantt._day_index_by_date(i)), +e=gantt.date[r+"_start"](new Date(this._min_date)),gantt._tasks.trace_x[a]&&(e=gantt.date[r+"_start"](gantt._tasks.trace_x[a]));+i>+e;){e=gantt.date[r+"_start"](gantt.date.add(e,s,r));var o=e.getTimezoneOffset();e=gantt.date.add(e,s,r),e=gantt._correct_dst_change(e,o,e,r),gantt.date[r+"_start"]&&(e=gantt.date[r+"_start"](e))}n=gantt.date.add(e,-1*s,r)}return t.dir&&"future"==t.dir?e:t.dir&&"past"==t.dir?n:Math.abs(i-n)n[t];return a?1:-1}:t;if(e){var r=s;s=function(t,e){return r(e,t)}}var o=this.getChildren(n); +if(o){for(var _=[],d=o.length-1;d>=0;d--)_[d]=this._pull[o[d]];_.sort(s);for(var d=0;d<_.length;d++)o[d]=_[d].id,this.sort(t,e,o[d],!0)}i&&this.render()},gantt.getNext=function(t){for(var e=0;en;n++)if(e[n]==t)return e[n+1]||null;return null},gantt.getPrevSibling=function(t){for(var e=this.getSiblings(t),n=0,a=e.length;a>n;n++)if(e[n]==t)return e[n-1]||null;return null},gantt._dp_init=function(t){ +t.setTransactionMode("POST",!0),t.serverProcessor+=(-1!=t.serverProcessor.indexOf("?")?"&":"?")+"editing=true",t._serverProcessor=t.serverProcessor,t.styles={updated:"gantt_updated",order:"gantt_updated",inserted:"gantt_inserted",deleted:"gantt_deleted",invalid:"gantt_invalid",error:"gantt_error",clear:""},t._methods=["_row_style","setCellTextStyle","_change_id","_delete_task"],t.setGanttMode=function(e){var n=t.modes||{};t._ganttMode&&(n[t._ganttMode]={_in_progress:t._in_progress,_invalid:t._invalid, +updatedRows:t.updatedRows});var a=n[e];a||(a=n[e]={_in_progress:{},_invalid:{},updatedRows:[]}),t._in_progress=a._in_progress,t._invalid=a._invalid,t.updatedRows=a.updatedRows,t.modes=n,t._ganttMode=e},this._sendTaskOrder=function(e,n){n.$drop_target&&(t.setGanttMode("tasks"),this.getTask(e).target=n.$drop_target,t.setUpdated(e,!0,"order"),delete this.getTask(e).$drop_target)},this.attachEvent("onAfterTaskAdd",function(e,n){t.setGanttMode("tasks"),t.setUpdated(e,!0,"inserted")}),this.attachEvent("onAfterTaskUpdate",function(e,n){ +t.setGanttMode("tasks"),t.setUpdated(e,!0),gantt._sendTaskOrder(e,n)}),this.attachEvent("onAfterTaskDelete",function(e,n){t.setGanttMode("tasks"),t.setUpdated(e,!0,"deleted"),"off"==t.updateMode||t._tSend||t.sendAllData()}),this.attachEvent("onAfterLinkUpdate",function(e,n){t.setGanttMode("links"),t.setUpdated(e,!0)}),this.attachEvent("onAfterLinkAdd",function(e,n){t.setGanttMode("links"),t.setUpdated(e,!0,"inserted")}),this.attachEvent("onAfterLinkDelete",function(e,n){t.setGanttMode("links"),t.setUpdated(e,!0,"deleted"); +}),this.attachEvent("onRowDragEnd",function(t,e){gantt._sendTaskOrder(t,gantt.getTask(t))});var e=null,n=null;this.attachEvent("onTaskIdChange",function(a,i){if(t._waitMode){var s=gantt.getChildren(i);if(s.length){e=e||{};for(var r=0;r-1?t.indexOf("?"):t.length),this.serverProcessor=t+("/"==t.slice(-1)?"":"/")+e}else this.serverProcessor=t+gantt._urlSeparator(t)+"gantt_mode="+this._ganttMode; +return!0}),this._init_dp_live_update_hooks(t);var a=t.afterUpdate;t.afterUpdate=function(){var e;e=3==arguments.length?arguments[1]:arguments[4];var n=t._ganttMode,i=e.filePath;n="REST"!=this._tMode?-1!=i.indexOf("gantt_mode=links")?"links":"tasks":i.indexOf("/link")>i.indexOf("/task")?"links":"tasks",t.setGanttMode(n);var s=a.apply(t,arguments);return t.setGanttMode(n),s},t._getRowData=gantt.bind(function(e,n){var a;a="tasks"==t._ganttMode?this.isTaskExists(e)?this.getTask(e):{id:e}:this.isLinkExists(e)?this.getLink(e):{ +id:e},a=gantt.copy(a);var i={};for(var s in a)if("$"!=s.substr(0,1)){var r=a[s];r instanceof Date?i[s]=this.templates.xml_format(r):null===r?i[s]="":i[s]=r}return a.$no_start&&(a.start_date="",a.duration=""),a.$no_end&&(a.end_date="",a.duration=""),i[t.action_param]=this.getUserData(e,t.action_param),i},this),this._change_id=gantt.bind(function(e,n){"tasks"!=t._ganttMode?this.changeLinkId(e,n):this.changeTaskId(e,n)},this),this._row_style=function(e,n){if("tasks"==t._ganttMode&&gantt.isTaskExists(e)){ +var a=gantt.getTask(e);a.$dataprocessor_class=n,gantt.refreshTask(e)}},this._delete_task=function(t,e){},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 gantt.defined(t.id)||(t.id=gantt.uid()),t},gantt._sync_links=function(){for(var t=null,e=0,n=this._order_full.length;n>e;e++)t=this._pull[this._order_full[e]], +t.$source=[],t.$target=[];this._links=[];for(var a in this._lpull){var i=this._lpull[a];this._links.push(i),this._pull[i.source]&&this._pull[i.source].$source.push(a),this._pull[i.target]&&this._pull[i.target].$target.push(a)}},gantt.getLink=function(t){return gantt.assert(this._lpull[t],"Link doesn't exist"),this._lpull[t]},gantt.getLinks=function(){var t=[];for(var e in gantt._lpull)t.push(gantt._lpull[e]);return t},gantt.isLinkExists=function(t){return gantt.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 gantt.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[t]&&(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 gantt.defined(this._branches[t])?this._branches[t]:[]},gantt.hasChild=function(t){return gantt.defined(this._branches[t])&&this._branches[t].length; +},gantt.refreshData=function(){this._render_data()},gantt._isTask=function(t){return!(t.type&&t.type==gantt.config.types.project||t.$no_start||t.$no_end)},gantt._isProject=function(t){return!this._isTask(t)},gantt._configure=function(t,e,n){for(var a in e)("undefined"==typeof t[a]||n)&&(t[a]=e[a])},gantt._init_skin=function(){gantt._get_skin(!1),gantt._init_skin=function(){}},gantt._get_skin=function(t){if(!gantt.skin||t)for(var e=document.getElementsByTagName("link"),n=0;n=1440||!this._is_chart_visible())&&(e=this.config.time_step),e}return this.config.time_step},gantt.getLabel=function(t,e){for(var n=this._get_typed_lightbox_config(),a=0;a
"+this.locale.labels[r]+"
"}i=this.config.buttons_right;for(var s=0;s
"+this.locale.labels[r]+"
"; +}a+="",e.innerHTML=a,gantt.config.drag_lightbox&&(e.firstChild.onmousedown=gantt._ready_to_dnd,e.firstChild.onselectstart=function(){return!1},e.firstChild.style.cursor="pointer",gantt._init_dnd_events()),document.body.insertBefore(e,document.body.firstChild),this._lightbox=e;var o=this._get_typed_lightbox_config(t);a=this._render_sections(o);for(var _=e.getElementsByTagName("div"),s=0;s<_.length;s++){var d=_[s];if("gantt_cal_larea"==d.className){d.innerHTML=a;break}}this.resizeLightbox(),this._init_lightbox_events(this), +e.style.display="none",e.style.visibility="visible"}return this._lightbox},gantt._render_sections=function(t){for(var e="",n=0;n
"+this.locale.labels["button_"+t[n].button]+"
"),this.config.wide_form&&(e+="
"), +e+="
"+s+this.locale.labels["section_"+t[n].name]+"
"+a.render.call(this,t[n]),e+="
"}}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,a=window.innerHeight||document.documentElement.clientHeight; +e?t.style.top=Math.round(e+Math.max((a-t.offsetHeight)/2,0))+"px":t.style.top=Math.round(Math.max((a-t.offsetHeight)/2,0)+9)+"px",document.documentElement.scrollWidth>document.body.offsetWidth?t.style.left=Math.round(n+(document.body.offsetWidth-t.offsetWidth)/2)+"px":t.style.left=Math.round((document.body.offsetWidth-t.offsetWidth)/2)+"px"}},gantt.showCover=function(){if(!this._cover){this._cover=document.createElement("DIV"),this._cover.className="gantt_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.gantt_save_btn=function(t){gantt._save_lightbox()},gantt.lightbox_events.gantt_delete_btn=function(t){gantt.callEvent("onLightboxDelete",[gantt._lightbox_id])&&(gantt.isTaskExists(gantt._lightbox_id)?gantt.$click.buttons["delete"](gantt._lightbox_id):gantt.hideLightbox())},gantt.lightbox_events.gantt_cancel_btn=function(t){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,a,i,s=gantt._getClassName(e);-1!=s.indexOf("gantt_custom_button")&&(-1!=s.indexOf("gantt_custom_button_")?(n=e.parentNode.getAttribute("index"),i=e.parentNode.parentNode):(n=e.getAttribute("index"),i=e.parentNode,e=e.firstChild));var r=gantt._get_typed_lightbox_config();n&&(a=gantt.form_blocks[r[n].type],a.button_click(n,e,i,i.nextSibling))}},this.event(gantt.getLightbox(),"click",function(t){ +t=t||window.event;var e=t.target?t.target:t.srcElement,n=gantt._getClassName(e);if(n||(e=e.previousSibling,n=gantt._getClassName(e)),e&&n&&0===n.indexOf("gantt_btn_set")&&(e=e.firstChild,n=gantt._getClassName(e)),e&&n){var a=gantt.defined(gantt.lightbox_events[e.className])?gantt.lightbox_events[e.className]:gantt.lightbox_events["default"];return a(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]),gantt.isTaskExists(t.id)&&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._replace_branch_child(this.getParent(t.id),t.id),this.addTask(t)):this.isTaskExists(t.id)&&(this.mixin(this.getTask(t.id),t,!0), +this.updateTask(t.id)),this.refreshData(),this.hideLightbox())},gantt._resolve_default_mapping=function(t){var e=t.map_to,n={time:!0,time_optional:!0,duration:!0,duration_optional:!0};return n[t.type]&&("auto"==t.map_to?e={start_date:"start_date",end_date:"end_date",duration:"duration"}:"string"==typeof t.map_to&&(e={start_date:t.map_to})),e},gantt.getLightboxValues=function(){var t={};gantt.isTaskExists(this._lightbox_id)&&(t=this.mixin({},this.getTask(this._lightbox_id)));for(var e=this._get_typed_lightbox_config(),n=0;n0&&(o+=" ");var l="";switch(d){case"%Y":t._time_format_order[2]=_,t._time_format_order.size++;var g,h,c,u;t.year_range&&(isNaN(t.year_range)?t.year_range.push&&(c=t.year_range[0],u=t.year_range[1]):g=t.year_range),g=g||10,h=h||Math.floor(g/2), +c=c||i.getFullYear()-h,u=u||c+g;for(var f=c;u>f;f++)l+="";break;case"%m":t._time_format_order[1]=_,t._time_format_order.size++;for(var f=0;12>f;f++)l+="";break;case"%d":t._time_format_order[0]=_,t._time_format_order.size++;for(var f=1;32>f;f++)l+="";break;case"%H:%i":t._time_format_order[3]=_,t._time_format_order.size++;var f=r,p=i.getDate();for(t._time_values=[];s>f;){ +var v=this.templates.time_picker(i);l+="",t._time_values.push(f),i.setTime(i.valueOf()+60*this._get_timepicker_step()*1e3);var m=i.getDate()!=p?1:0;f=24*m*60+60*i.getHours()+i.getMinutes()}}if(l){var k=t.readonly?"disabled='disabled'":"",b=e?" style='display:none'":"";o+=""}}return o},_fill_lightbox_select:function(t,e,n,a,i){if(t[e+a[0]].value=n.getDate(),t[e+a[1]].value=n.getMonth(),t[e+a[2]].value=n.getFullYear(),gantt.defined(a[3])){ +var s=60*n.getHours()+n.getMinutes();s=Math.round(s/gantt._get_timepicker_step())*gantt._get_timepicker_step();var r=t[e+a[3]];r.value=s,r.setAttribute("data-value",s)}},template:{render:function(t){var e=(t.height||"30")+"px";return"
"},set_value:function(t,e,n,a){t.innerHTML=e||""},get_value:function(t,e,n){return t.innerHTML||""},focus:function(t){}},textarea:{render:function(t){var e=(t.height||"130")+"px";return"
"; +},set_value:function(t,e,n){t.firstChild.value=e||""},get_value:function(t,e){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="
"},set_value:function(t,e,n,a){var i=t.firstChild;!i._dhx_onchange&&a.onchange&&(i.onchange=a.onchange, +i._dhx_onchange=!0),"undefined"==typeof e&&(e=(i.options[0]||{}).value),i.value=e||""},get_value:function(t,e){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=["
"];return n.push(e),t.single_date?(e=this.form_blocks.getTimePicker.call(this,t,!0),n.push("")):n.push("  –  "), +n.push(e),n.push("
"),n.join("")},set_value:function(t,e,n,a){var i=a,s=t.getElementsByTagName("select"),r=a._time_format_order;a._time_format_size;if(i.auto_end_date)for(var o=function(){l=new Date(s[r[2]].value,s[r[1]].value,s[r[0]].value,0,0),g=gantt.calculateEndDate(l,1),this.form_blocks._fill_lightbox_select(s,r.size,g,r,i)},_=0;4>_;_++)s[_].onchange=o;var d=gantt._resolve_default_mapping(a);"string"==typeof d&&(d={start_date:d});var l=n[d.start_date]||new Date,g=n[d.end_date]||gantt.calculateEndDate(l,1); +this.form_blocks._fill_lightbox_select(s,0,l,r,i),this.form_blocks._fill_lightbox_select(s,r.size,g,r,i)},get_value:function(t,e,n){var a=t.getElementsByTagName("select"),i=n._time_format_order,s=0,r=0;if(gantt.defined(i[3])){var o=parseInt(a[i[3]].value,10);s=Math.floor(o/60),r=o%60}var _=new Date(a[i[2]].value,a[i[1]].value,a[i[0]].value,s,r);if(s=r=0,gantt.defined(i[3])){var o=parseInt(a[i.size+i[3]].value,10);s=Math.floor(o/60),r=o%60}var d=new Date(a[i[2]+i.size].value,a[i[1]+i.size].value,a[i[0]+i.size].value,s,r); +_>=d&&(d=gantt.date.add(_,gantt._get_timepicker_step(),"minute"));var l=gantt._resolve_default_mapping(n),g={start_date:new Date(_),end_date:new Date(d)};return"string"==typeof l?g.start_date:g},focus:function(t){gantt._focus(t.getElementsByTagName("select")[0])}},duration:{render:function(t){var e=this.form_blocks.getTimePicker.call(this,t);e="
"+e+"
";var n=this.locale.labels[this.config.duration_unit+"s"],a=t.single_date?' style="display:none"':"",i=t.readonly?" disabled='disabled'":"",s="
"+n+"
",r="
"+e+" "+s+"
"; +return r},set_value:function(t,e,n,a){function i(){var e=gantt.form_blocks.duration._get_start_date.call(gantt,t,a),n=gantt.form_blocks.duration._get_duration.call(gantt,t,a),i=gantt.calculateEndDate(e,n);g.innerHTML=gantt.templates.task_date(i)}function s(t){var e=d.value;e=parseInt(e,10),window.isNaN(e)&&(e=0),e+=t,1>e&&(e=1),d.value=e,i()}var r=a,o=t.getElementsByTagName("select"),_=t.getElementsByTagName("input"),d=_[1],l=[_[0],_[2]],g=t.getElementsByTagName("span")[0],h=a._time_format_order;l[0].onclick=gantt.bind(function(){ +s(-1*this.config.duration_step)},this),l[1].onclick=gantt.bind(function(){s(1*this.config.duration_step)},this),o[0].onchange=i,o[1].onchange=i,o[2].onchange=i,o[3]&&(o[3].onchange=i),d.onkeydown=gantt.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(t){i()},1)},this),d.onchange=gantt.bind(function(t){i()},this);var c=gantt._resolve_default_mapping(a);"string"==typeof c&&(c={ +start_date:c});var u=n[c.start_date]||new Date,f=n[c.end_date]||gantt.calculateEndDate(u,1),p=Math.round(n[c.duration])||gantt.calculateDuration(u,f);gantt.form_blocks._fill_lightbox_select(o,0,u,h,r),d.value=p,i()},_get_start_date:function(t,e){var n=t.getElementsByTagName("select"),a=e._time_format_order,i=0,s=0;if(gantt.defined(a[3])){var r=n[a[3]],o=parseInt(r.value,10);isNaN(o)&&r.hasAttribute("data-value")&&(o=parseInt(r.getAttribute("data-value"),10)),i=Math.floor(o/60),s=o%60}return new Date(n[a[2]].value,n[a[1]].value,n[a[0]].value,i,s); +},_get_duration:function(t,e){var n=t.getElementsByTagName("input")[1];return n=parseInt(n.value,10),(!n||window.isNaN(n))&&(n=1),0>n&&(n*=-1),n},get_value:function(t,e,n){var a=gantt.form_blocks.duration._get_start_date(t,n),i=gantt.form_blocks.duration._get_duration(t,n),s=gantt.calculateEndDate(a,i),r=gantt._resolve_default_mapping(n),o={start_date:new Date(a),end_date:new Date(s),duration:i};return"string"==typeof r?o.start_date:o},focus:function(t){gantt._focus(t.getElementsByTagName("select")[0]); +}},parent:{_filter:function(t,e,n){var a=e.filter||function(){return!0};t=t.slice(0);for(var i=0;i
",this.$grid_scale=this.$grid.childNodes[0], +this.$grid_data=this.$grid.childNodes[1],this.$task.innerHTML="
",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(){if(!gantt.isTaskExists(t))return void gantt.hideLightbox();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._clean_el_size=function(t){ +return 1*(t||"").toString().replace("px","")||0},gantt._get_box_styles=function(){var t=null;t=window.getComputedStyle?window.getComputedStyle(this._obj,null):{width:this._obj.clientWidth,height:this._obj.clientHeight};var e=["width","height","paddingTop","paddingBottom","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","borderTopWidth","borderBottomWidth"],n={boxSizing:"border-box"==t.boxSizing};t.MozBoxSizing&&(n.boxSizing="border-box"==t.MozBoxSizing);for(var a=0;aMath.abs(i)){if(n.x)return!0;if(!gantt.$scroll_hor||!gantt.$scroll_hor.offsetWidth)return!0; +var s=a/-40,r=gantt.$task.scrollLeft,o=r+30*s;if(gantt.scrollTo(o,null),gantt.$scroll_hor.scrollLeft=o,r==gantt.$task.scrollLeft)return!0}else{if(n.y)return!0;if(!gantt.$scroll_ver||!gantt.$scroll_ver.offsetHeight)return!0;var s=i/-40;"undefined"==typeof i&&(s=t.detail);var _=gantt.$scroll_ver.scrollTop,d=gantt.$scroll_ver.scrollTop+30*s;if(!gantt.config.prevent_default_scroll&&gantt._cached_scroll_pos&&(gantt._cached_scroll_pos.y==d||gantt._cached_scroll_pos.y<=0&&0>=d))return!0;if(gantt.scrollTo(null,d), +gantt.$scroll_ver.scrollTop=d,_==gantt.$scroll_ver.scrollTop)return!0}return t.preventDefault&&t.preventDefault(),t.cancelBubble=!0,!1}this.event(this.$scroll_hor,"scroll",function(){if(new Date-(gantt._wheel_time||0)<100)return!0;if(!gantt._touch_scroll_active){var t=gantt.$scroll_hor.scrollLeft;gantt.scrollTo(t)}}),this.event(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)}}),this.event(this.$task,"scroll",function(){ +var t=gantt.$task.scrollLeft,e=gantt.$scroll_hor.scrollLeft;e!=t&&(gantt.$scroll_hor.scrollLeft=t)}),this.event(this.$task_data,"scroll",function(){var t=gantt.$task_data.scrollTop,e=gantt.$scroll_ver.scrollTop;e!=t&&(gantt.$scroll_ver.scrollTop=t)});var e=gantt.env.isFF;e?this.event(gantt.$container,"wheel",t):this.event(gantt.$container,"mousewheel",t)},gantt._scroll_resize=function(){if(!(this._x<20||this._y<20)){var t=this._scroll_sizes();t.x?(this.$scroll_hor.style.display="block",this.$scroll_hor.style.height=t.scroll_size+"px", +this.$scroll_hor.style.width=t.x+"px",this.$scroll_hor.firstChild.style.width=t.x_inner+"px"):(this.$scroll_hor.style.display="none",this.$scroll_hor.style.height=this.$scroll_hor.style.width="0px"),t.y?(this.$scroll_ver.style.display="block",this.$scroll_ver.style.width=t.scroll_size+"px",this.$scroll_ver.style.height=t.y+"px",this.$scroll_ver.style.top=this.config.scale_height+"px",this.$scroll_ver.firstChild.style.height=t.y_inner+"px"):(this.$scroll_ver.style.display="none",this.$scroll_ver.style.width=this.$scroll_ver.style.height="0px"); +}},gantt._scroll_sizes=function(){var t=this._get_grid_width(),e=Math.max(this._x-t,0),n=Math.max(this._y-this.config.scale_height,0),a=this.config.scroll_size+1,i=Math.max(this.$task_data.offsetWidth-a,0),s=this.config.row_height*this._order.length,r=this._get_resize_options(),o=this._scroll_hor=r.x?!1:i>e,_=this._scroll_ver=r.y?!1:s>n,d={x:!1,y:!1,scroll_size:a,x_inner:i+t+a+2,y_inner:this.config.scale_height+s};return o&&(d.x=Math.max(this._x-(_?a:2),0)),_&&(d.y=Math.max(this._y-(o?a:0)-this.config.scale_height,0)), +d},gantt._getClassName=function(t){if(!t)return"";var e=t.className||"";return e.baseVal&&(e=e.baseVal),e.indexOf||(e=""),gantt._trim(e)},gantt.locate=function(t){var e=gantt._get_target_node(t),n=gantt._getClassName(e);if((n||"").indexOf("gantt_task_cell")>=0)return null;for(var a=arguments[1]||this.config.task_attribute;e;){if(e.getAttribute){var i=e.getAttribute(a);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 a=gantt._get_target_node(t),i="";a;){if(i=gantt._getClassName(a)){var s=i.indexOf(e);if(s>=0){if(!n)return a;var r=0===s||!gantt._trim(i.charAt(s-1)),o=s+e.length>=i.length||!gantt._trim(i.charAt(s+e.length));if(r&&o)return a}}a=a.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 a=n.getAttribute(e);if(a)return n}n=n.parentNode}return null},gantt.getTaskRowNode=function(t){for(var e=this.$grid_data.childNodes,n=this.config.task_attribute,a=0;an?!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(t){var t=t||this._selected_task;t&&(this._selected_task=null,this.refreshTask(t),this.callEvent("onTaskUnselected",[t]))},gantt.getSelectedId=function(){return this.defined(this._selected_task)?this._selected_task:null},gantt.changeLightboxType=function(t){return this.getLightboxType()==t?!0:void gantt._silent_redraw_lightbox(t)},gantt._is_render_active=function(){return!this._skip_render; +},gantt._correct_dst_change=function(t,e,n,a){var i=gantt._get_line(a)*n;if(i>3600&&86400>i){var s=t.getTimezoneOffset()-e;s&&(t=gantt.date.add(t,s,"minute"))}return t},gantt.batchUpdate=function(t,e){var n,a=this._dp&&"off"!=this._dp.updateMode;a&&(n=this._dp.updateMode,this._dp.setUpdateMode("off"));var i=this._sync_order;this._sync_order=function(){};var s=this._sync_links;this._sync_links=function(){};var r=this._adjust_scales;this._adjust_scales=function(){};var o={},_=this.resetProjectDates; +this.resetProjectDates=function(t){o[t.id]=t},this._skip_render=!0,this.callEvent("onBeforeBatchUpdate",[]);try{t()}catch(d){}this.callEvent("onAfterBatchUpdate",[]),this._sync_order=i,this._sync_order(),this._sync_links=s,this._sync_links(),this.resetProjectDates=_;for(var l in o)this.resetProjectDates(o[l]);this._adjust_scales=r,this._adjust_scales(),this._skip_render=!1,e||this.render(),a&&(this._dp.setUpdateMode(n),this._dp.setGanttMode("tasks"),this._dp.sendData(),this._dp.setGanttMode("links"), +this._dp.sendData())},gantt.env={isIE:navigator.userAgent.indexOf("MSIE")>=0||navigator.userAgent.indexOf("Trident")>=0,isIE6:!window.XMLHttpRequest&&navigator.userAgent.indexOf("MSIE")>=0,isIE7:navigator.userAgent.indexOf("MSIE 7.0")>=0&&navigator.userAgent.indexOf("Trident")<0,isIE8:navigator.userAgent.indexOf("MSIE 8.0")>=0&&navigator.userAgent.indexOf("Trident")>=0,isOpera:navigator.userAgent.indexOf("Opera")>=0,isChrome:navigator.userAgent.indexOf("Chrome")>=0,isKHTML:navigator.userAgent.indexOf("Safari")>=0||navigator.userAgent.indexOf("Konqueror")>=0, +isFF:navigator.userAgent.indexOf("Firefox")>=0,isIPad:navigator.userAgent.search(/iPad/gi)>=0,isEdge:-1!=navigator.userAgent.indexOf("Edge")},gantt.ajax={cache:!0,method:"get",parse:function(t){if("string"!=typeof t)return t;var e;return t=t.replace(/^[\s]+/,""),window.DOMParser&&!gantt.env.isIE?e=(new window.DOMParser).parseFromString(t,"text/xml"):window.ActiveXObject!==window.undefined&&(e=new window.ActiveXObject("Microsoft.XMLDOM"),e.async="false",e.loadXML(t)),e},xmltop:function(t,e,n){if("undefined"==typeof e.status||e.status<400){ +var a=e.responseXML?e.responseXML||e:gantt.ajax.parse(e.responseText||e);if(a&&null!==a.documentElement&&!a.getElementsByTagName("parsererror").length)return a.getElementsByTagName(t)[0]}return-1!==n&&gantt.callEvent("onLoadXMLError",["Incorrect XML",arguments[1],n]),document.createElement("DIV")},xpath:function(t,e){if(e.nodeName||(e=e.responseXML||e),gantt.env.isIE)return e.selectNodes(t)||[];for(var n,a=[],i=(e.ownerDocument||e).evaluate(t,e,null,XPathResult.ANY_TYPE,null);;){if(n=i.iterateNext(), +!n)break;a.push(n)}return a},query:function(t){gantt.ajax._call(t.method||"GET",t.url,t.data||"",t.async||!0,t.callback,null,t.headers)},get:function(t,e){this._call("GET",t,null,!0,e)},getSync:function(t){return this._call("GET",t,null,!1)},put:function(t,e,n){this._call("PUT",t,e,!0,n)},del:function(t,e,n){this._call("DELETE",t,e,!0,n)},post:function(t,e,n){1==arguments.length?e="":2!=arguments.length||"function"!=typeof e&&"function"!=typeof window[e]?e=String(e):(n=e,e=""),this._call("POST",t,e,!0,n); +},postSync:function(t,e){return e=null===e?"":String(e),this._call("POST",t,e,!1)},getLong:function(t,e){this._call("GET",t,null,!0,e,{url:t})},postLong:function(t,e,n){2==arguments.length&&(n=e,e=""),this._call("POST",t,e,!0,n,{url:t,postData:e})},_call:function(t,e,n,a,i,s,r){var o=window.XMLHttpRequest&&!gantt.env.isIE?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP"),_=null!==navigator.userAgent.match(/AppleWebKit/)&&null!==navigator.userAgent.match(/Qt/)&&null!==navigator.userAgent.match(/Safari/); +if(a&&(o.onreadystatechange=function(){if(4==o.readyState||_&&3==o.readyState){if((200!=o.status||""===o.responseText)&&!gantt.callEvent("onAjaxError",[o]))return;window.setTimeout(function(){"function"==typeof i&&i.apply(window,[{xmlDoc:o,filePath:e}]),s&&("undefined"!=typeof s.postData?gantt.ajax.postLong(s.url,s.postData,i):gantt.ajax.getLong(s.url,i)),i=null,o=null},1)}}),"GET"!=t||this.cache||(e+=(e.indexOf("?")>=0?"&":"?")+"dhxr"+(new Date).getTime()+"=1"),o.open(t,e,a),r)for(var d in r)o.setRequestHeader(d,r[d]);else"POST"==t.toUpperCase()||"PUT"==t||"DELETE"==t?o.setRequestHeader("Content-Type","application/x-www-form-urlencoded"):"GET"==t&&(n=null); +return o.setRequestHeader("X-Requested-With","XMLHttpRequest"),o.send(n),a?void 0:{xmlDoc:o,filePath:e}}},gantt._urlSeparator=function(t){return-1!=t.indexOf("?")?"&":"?"},function(){function t(t,e){var a=t.callback;n(!1),t.box.parentNode.removeChild(t.box),h=t.box=null,a&&a(e)}function e(e){if(h){e=e||event;var n=e.which||event.keyCode;return gantt.message.keyboard&&((13==n||32==n)&&t(h,!0),27==n&&t(h,!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 a(t,e){var n="gantt_"+t.toLowerCase().replace(/ /g,"_")+"_button dhtmlx_"+t.toLowerCase().replace(/ /g,"_")+"_button";return"
"+t+"
"}function i(t){c.area||(c.area=document.createElement("DIV"),c.area.className="gantt_message_area dhtmlx_message_area", +c.area.style[c.position]="5px",document.body.appendChild(c.area)),c.hide(t.id);var e=document.createElement("DIV");return e.innerHTML="
"+t.text+"
",e.className="gantt-info dhtmlx-info gantt-"+t.type+" dhtmlx-"+t.type,e.onclick=function(){c.hide(t.id),t=null},"bottom"==c.position&&c.area.firstChild?c.area.insertBefore(e,c.area.firstChild):c.area.appendChild(e),t.expire>0&&(c.timers[t.id]=window.setTimeout(function(){c.hide(t.id)},t.expire)),c.pull[t.id]=e,e=null,t.id}function s(e,n,i){var s=document.createElement("DIV"); +s.className=" gantt_modal_box dhtmlx_modal_box gantt-"+e.type+" dhtmlx-"+e.type,s.setAttribute("dhxbox",1);var r="";if(e.width&&(s.style.width=e.width),e.height&&(s.style.height=e.height),e.title&&(r+='
'+e.title+"
"),r+='
'+(e.content?"":e.text)+'
',n&&(r+=a(e.ok||"OK",!0)),i&&(r+=a(e.cancel||"Cancel",!1)),e.buttons)for(var o=0;o=0&&!t.getHours()&&n.getHours()&&(n.getDate()<=t.getDate()||n.getMonth()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);",a=t.match(/%[a-zA-Z]/g),i=0;i50?1900:2000);";break;case"%g":case"%G": +case"%h":case"%H":n+="set[3]=temp["+i+"]||0;";break;case"%i":n+="set[4]=temp["+i+"]||0;";break;case"%Y":n+="set[0]=temp["+i+"]||0;";break;case"%a":case"%A":n+="set[3]=set[3]%12+((temp["+i+"]||'').toLowerCase()=='am'?0:12);";break;case"%s":n+="set[5]=temp["+i+"]||0;";break;case"%M":n+="set[1]=gantt.locale.date.month_short_hash[temp["+i+"]]||0;";break;case"%F":n+="set[1]=gantt.locale.date.month_full_hash[temp["+i+"]]||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 a=n.getFullYear(),i=Math.round((n.getTime()-new Date(a,0,1).getTime())/864e5),s=1+Math.floor(i/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&&(gantt.defined(e)&&(e="string"==typeof e?gantt.defined(gantt.templates[e])?gantt.templates[e]:gantt.date.str_to_date(e):gantt.templates.xml_date),t=t?e(t):null),t}},gantt.date.quarter_start=function(t){gantt.date.month_start(t);var e,n=t.getMonth();return e=n>=9?9:n>=6?6:n>=3?3:0,t.setMonth(e),t},gantt.date.add_quarter=function(t,e){return gantt.date.add(t,3*e,"month")},gantt.config||(gantt.config={}),gantt.config||(gantt.config={}),gantt.templates||(gantt.templates={}), +function(){gantt.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,autosize_min_width:0,show_links:!0,show_task_cells:!0,static_background:!1,branch_loading:!1,show_loading:!1,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,scroll_on_click:!0,preserve_scroll:!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:!1,columns:[{name:"text",tree:!0,width:"*",resize:!0},{name:"start_date",align:"center",resize:!0},{name:"duration",align:"center"},{name:"add",width:"44"}],step:1,scale_unit:"day",scale_offset_minimal:!0, +subscales:[],inherit_scale_class:!1,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",layer_attribute:"data-layer",buttons_left:["gantt_save_btn","gantt_cancel_btn"],_migrate_buttons:{dhx_save_btn:"gantt_save_btn",dhx_cancel_btn:"gantt_cancel_btn",dhx_delete_btn:"gantt_delete_btn"},buttons_right:["gantt_delete_btn"],lightbox:{sections:[{name:"description",height:70,map_to:"text",type:"textarea",focus:!0},{name:"time", +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",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",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,order_branch:!1,order_branch_free:!1,task_height:"full",min_column_width:70,min_grid_column_width:70,grid_resizer_column_attribute:"column_index",grid_resizer_attribute:"grid_resizer",keep_grid_width:!1,grid_resize:!1,show_unscheduled:!0,readonly_property:"readonly",editable_property:"editable",type_renderers:{},open_tree_initially:!1,optimize_render:!0,prevent_default_scroll:!1,show_errors:!0}),gantt.keys={edit_save:13,edit_cancel:27},gantt._init_template=function(t,e,n){var a=this._reg_templates||{}; +n=n||t,this.config[t]&&a[n]!=this.config[t]&&(e&&this.templates[n]||(this.templates[n]=this.date.date_to_str(this.config[t]),a[n]=this.config[t])),this._reg_templates=a},gantt._init_templates=function(){var t=gantt.locale.labels;t.gantt_save_btn=t.icon_save,t.gantt_cancel_btn=t.icon_cancel,t.gantt_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,"grid_date_format"),gantt._init_template("task_date",!0),gantt.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(t,e,n){return""},grid_header_class:function(t,e){return""},task_text:function(t,e,n){return n.text},task_class:function(t,e,n){return""},grid_row_class:function(t,e,n){return""},task_row_class:function(t,e,n){return""},task_cell_class:function(t,e){return""},scale_cell_class:function(t){return""},scale_row_class:function(t){return""},grid_indent:function(t){ +return"
"},grid_folder:function(t){return"
"},grid_file:function(t){return"
"},grid_open:function(t){return"
"},grid_blank:function(t){return"
"},date_grid:function(t,e){return e&&gantt.isUnscheduledTask(e)&&gantt.config.show_unscheduled?gantt.templates.task_unscheduled_time(e):gantt.templates.grid_date_format(t); +},task_time:function(t,e,n){return gantt.isUnscheduledTask(n)&&gantt.config.show_unscheduled?gantt.templates.task_unscheduled_time(n):gantt.templates.task_date(t)+" - "+gantt.templates.task_date(e)},task_unscheduled_time:function(t){return""},time_picker:e(n.time_picker),link_class:function(t){return""},link_description:function(t){var e=gantt.getTask(t.source),n=gantt.getTask(t.target);return""+e.text+""+n.text+""},drag_link:function(t,e,n,a){t=gantt.getTask(t);var i=gantt.locale.labels,s=""+t.text+" "+(e?i.link_start:i.link_end)+"
"; +return n&&(n=gantt.getTask(n),s+=" "+n.text+" "+(a?i.link_start:i.link_end)+"
"),s},drag_link_class:function(t,e,n,a){var i="";if(t&&n){var s=gantt.isLinkAllowed(t,n,e,a);i=" "+(s?"gantt_link_allow":"gantt_link_deny")}return"gantt_link_tooltip"+i}}),this.callEvent("onTemplatesReady",[])}}(),window.jQuery&&!function(t){var e=[];t.fn.dhx_gantt=function(n){if(n=n||{},"string"!=typeof n){var a=[];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),a.push(gantt)}}),1===a.length?a[0]:a}return e[n]?e[n].apply(this,[]):void t.error("Method "+n+" does not exist on jQuery.dhx_gantt")}}(jQuery),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,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,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,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,link_line_width:1,link_arrow_size:7,lightbox_additional_height:86},_second_column_width:90,_third_column_width:80,_lightbox_template:"
 
", +_config_buttons_left:{},_config_buttons_right:{gantt_delete_btn:"icon_delete",gantt_save_btn:"icon_save"}},gantt.config.touch_drag=500,gantt.config.touch=!0,gantt.config.touch_feedback=!0,gantt._touch_feedback=function(){gantt.config.touch_feedback&&navigator.vibrate&&navigator.vibrate(1)},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,clientX:t.touches[0].clientX,clientY:t.touches[0].clientY}:t},function(){ +return!1}))},gantt._touch_events=function(t,e,n){function a(t){return t&&t.preventDefault&&t.preventDefault(),(t||event).cancelBubble=!0,!1}function i(t){var e=gantt._task_area_pulls,n=gantt.getTask(t);if(n&&gantt.isTaskVisible(t))for(var a in e)if(n=e[a][t],n&&n.getAttribute("task_id")&&n.getAttribute("task_id")==t){var i=n.cloneNode(!0);return g=n,e[a][t]=i,n.style.display="none",i.className+=" gantt_drag_move ",n.parentNode.appendChild(i),i}}var s,r=0,o=!1,_=!1,d=null,l=null,g=null;this._gantt_touch_event_ready||(this._gantt_touch_event_ready=1, +gantt.event(gantt.$container,t[0],function(t){if(!n(t)&&o){l&&clearTimeout(l);var i=e(t);if(gantt._tasks_dnd.drag.id||gantt._tasks_dnd.drag.start_drag)return gantt._tasks_dnd.on_mouse_move(i),t.preventDefault&&t.preventDefault(),t.cancelBubble=!0,!1;if(i&&d){var g=d.pageX-i.pageX,h=d.pageY-i.pageY;if(!_&&(Math.abs(g)>5||Math.abs(h)>5)&&(gantt._touch_scroll_active=_=!0,r=0,s=gantt.getScrollState()),_){gantt.scrollTo(s.x+g,s.y+h);var c=gantt.getScrollState();if(s.x!=c.x&&h>2*g||s.y!=c.y&&g>2*h)return a(t); +}}return a(t)}})),gantt.event(this.$container,"contextmenu",function(t){return o?a(t):void 0}),gantt.event(this.$container,t[1],function(t){if(!n(t)){if(t.touches&&t.touches.length>1)return void(o=!1);if(o=!0,d=e(t),d&&r){var s=new Date;500>s-r?(gantt._on_dblclick(d),a(t)):r=s}else r=new Date;l=setTimeout(function(){var t=gantt.locate(d);!t||gantt._locate_css(d,"gantt_link_control")||gantt._locate_css(d,"gantt_grid_data")||(gantt._tasks_dnd.on_mouse_down(d),gantt._tasks_dnd.drag&&gantt._tasks_dnd.drag.start_drag&&(i(t), +gantt._tasks_dnd._start_dnd(d),gantt._touch_drag=!0,gantt.refreshTask(t),gantt._touch_feedback())),l=null},gantt.config.touch_drag)}}),gantt.event(this.$container,t[2],function(t){if(!n(t)){l&&clearTimeout(l),gantt._touch_drag=!1,o=!1;var a=e(t);gantt._tasks_dnd.on_mouse_up(a),g&&(gantt.refreshTask(gantt.locate(g)),g.parentNode&&(g.parentNode.removeChild(g),gantt._touch_feedback())),gantt._touch_scroll_active=o=_=!1,g=null}})},function(){function t(t,e){var n=gantt.env.isIE?"":"%c",a=[n,'"',t,'"',n," has been deprecated in dhtmlxGantt v4.0 and will stop working in v5.0. Use ",n,'"',e,'"',n," instead. \nSee more details at http://docs.dhtmlx.com/gantt/migrating.html "].join(""),i=window.console.warn||window.console.log,s=[a]; +gantt.env.isIE||(s=s.concat(["font-weight:bold","font-weight:normal","font-weight:bold","font-weight:normal"])),i.apply(window.console,s)}function e(e){return function(){return t("dhtmlx."+e,"gantt."+e),gantt[e].apply(gantt,arguments)}}window.dhtmlx||(window.dhtmlx={});for(var n=["message","alert","confirm","modalbox","uid","copy","mixin","defined","bind","assert"],a=0;a"+tasks.join("")+""+links.join("")+""; + return ""+tasks.join("")+""+links.join("")+""; } }; @@ -4797,7 +4797,7 @@ gantt._get_duration_unit = function(){ }; gantt._get_safe_type = function(type){ - return "task"; + return gantt._get_type_name(type); }; gantt._get_type_name = function(type_value){ for(var i in this.config.types){ @@ -6735,30 +6735,30 @@ gantt._extend_to_optional = function(lightbox_block){ gantt.form_blocks.duration_optional = gantt._extend_to_optional(gantt.form_blocks.duration); gantt.form_blocks.time_optional = gantt._extend_to_optional(gantt.form_blocks.time); /** - * @desc: constructor, data processor object + * @desc: constructor, data processor object * @param: serverProcessorURL - url used for update * @type: public */ gantt.dataProcessor = function(serverProcessorURL){ this.serverProcessor = serverProcessorURL; this.action_param="!nativeeditor_status"; - + this.object = null; this.updatedRows = []; //ids of updated rows - + this.autoUpdate = true; this.updateMode = "cell"; - this._tMode="GET"; + this._tMode="GET"; this._headers = null; this._payload = null; this.post_delim = "_"; - + this._waitMode=0; this._in_progress={};//? this._invalid={}; this.mandatoryFields=[]; this.messages=[]; - + this.styles={ updated:"font-weight:bold;", inserted:"font-weight:bold;", @@ -6768,7 +6768,7 @@ gantt.dataProcessor = function(serverProcessorURL){ error:"color:red;", clear:"font-weight:normal;text-decoration:none;" }; - + this.enableUTFencoding(true); gantt._eventable(this); @@ -6801,7 +6801,7 @@ gantt.dataProcessor.prototype={ * @desc: allows to set escaping mode * @param: true - utf based escaping, simple - use current page encoding * @type: public - */ + */ enableUTFencoding:function(mode){ this._utf=!!mode; }, @@ -6862,7 +6862,7 @@ gantt.dataProcessor.prototype={ setUpdated:function(rowId,state,mode){ if (this._silent_mode) return; var ind=this.findRow(rowId); - + mode=mode||"updated"; var existing = this.obj.getUserData(rowId,this.action_param); if (existing && mode == "updated") mode=existing; @@ -6870,7 +6870,7 @@ gantt.dataProcessor.prototype={ this.set_invalid(rowId,false); //clear previous error flag this.updatedRows[ind]=rowId; this.obj.setUserData(rowId,this.action_param,mode); - if (this._in_progress[rowId]) + if (this._in_progress[rowId]) this._in_progress[rowId]="wait"; } else{ if (!this.is_invalid(rowId)){ @@ -6882,12 +6882,12 @@ gantt.dataProcessor.prototype={ //clear changed flag if (!state) this._clearUpdateFlag(rowId); - + this.markRow(rowId,state,mode); if (state && this.autoUpdate) this.sendData(rowId); }, _clearUpdateFlag:function(id){}, - markRow:function(id,state,mode){ + markRow:function(id,state,mode){ var str=""; var invalid=this.is_invalid(id); if (invalid){ @@ -6897,7 +6897,7 @@ gantt.dataProcessor.prototype={ if (this.callEvent("onRowMark",[id,state,mode,invalid])){ //default logic str=this.styles[state?mode:"clear"]+str; - + this.obj[this._methods[0]](id,str); if (invalid && invalid.details){ @@ -6914,7 +6914,7 @@ gantt.dataProcessor.prototype={ is_invalid:function(id){ return this._invalid[id]; }, - set_invalid:function(id,mode,details){ + set_invalid:function(id,mode,details){ if (details) mode={value:mode, details:details, toString:function(){ return this.value.toString(); }}; this._invalid[id]=mode; }, @@ -6923,7 +6923,7 @@ gantt.dataProcessor.prototype={ * @param: rowId - id of row to set update-status for * @type: public */ - checkBeforeUpdate:function(rowId){ + checkBeforeUpdate:function(rowId){ return true; }, /** @@ -6934,17 +6934,17 @@ gantt.dataProcessor.prototype={ sendData:function(rowId){ if (this._waitMode && (this.obj.mytype=="tree" || this.obj._h2)) return; if (this.obj.editStop) this.obj.editStop(); - - + + if(typeof rowId == "undefined" || this._tSend) return this.sendAllData(); if (this._in_progress[rowId]) return false; - + this.messages=[]; if (!this.checkBeforeUpdate(rowId) && this.callEvent("onValidationError",[rowId,this.messages])) return false; this._beforeSendData(this._getRowData(rowId),rowId); }, _beforeSendData:function(data,rowId){ - if (!this.callEvent("onBeforeUpdate",[rowId,this.getState(rowId),data])) return false; + if (!this.callEvent("onBeforeUpdate",[rowId,this.getState(rowId),data])) return false; this._sendData(data,rowId); }, serialize:function(data, id){ @@ -6979,8 +6979,8 @@ gantt.dataProcessor.prototype={ }, _sendData:function(a1,rowId){ if (!a1) return; //nothing to send - if (!this.callEvent("onBeforeDataSending",rowId?[rowId,this.getState(rowId),a1]:[null, null, a1])) return false; - + if (!this.callEvent("onBeforeDataSending",rowId?[rowId,this.getState(rowId),a1]:[null, null, a1])) return false; + if (rowId) this._in_progress[rowId]=(new Date()).valueOf(); @@ -6995,7 +6995,7 @@ gantt.dataProcessor.prototype={ return that.afterUpdate(that,xml,ids); }; - + var a3 = this.serverProcessor+(this._user?(gantt._urlSeparator(this.serverProcessor)+["dhx_user="+this._user,"dhx_version="+this.obj.getUserData(0,"version")].join("&")):""); if (this._tMode=="GET") @@ -7036,14 +7036,14 @@ gantt.dataProcessor.prototype={ this._waitMode++; }, sendAllData:function(){ - if (!this.updatedRows.length) return; + if (!this.updatedRows.length) return; this.messages=[]; var valid=true; for (var i=0; i 0) t.timers[text.id]=window.setTimeout(function(){ t.hide(text.id); @@ -8490,7 +8490,7 @@ gantt._urlSeparator = function(str){ var box = document.createElement("DIV"); box.className = " gantt_modal_box dhtmlx_modal_box gantt-"+config.type + " dhtmlx-"+config.type; box.setAttribute("dhxbox", 1); - + var inner = ''; if (config.width) @@ -8513,7 +8513,7 @@ gantt._urlSeparator = function(str){ if (config.content){ var node = config.content; - if (typeof node == "string") + if (typeof node == "string") node = document.getElementById(node); if (node.style.display == 'none') node.style.display = ""; @@ -8538,7 +8538,7 @@ gantt._urlSeparator = function(str){ } function _createBox(config, ok, cancel){ var box = config.tagName ? config : _boxStructure(config, ok, cancel); - + if (!config.hidden) modality(true); document.body.appendChild(box); @@ -8645,7 +8645,7 @@ gantt._urlSeparator = function(str){ obj = null; },2000); obj.className+=" hidden"; - + if(t.timers[id]) window.clearTimeout(t.timers[id]); delete t.pull[id]; @@ -8770,7 +8770,7 @@ gantt.date={ 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 "\"+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()]+\""; @@ -8806,7 +8806,7 @@ gantt.date={ break; case "%g": case "%G": - case "%h": + case "%h": case "%H": splt+="set[3]=temp["+i+"]||0;"; break; @@ -8815,9 +8815,9 @@ gantt.date={ break; case "%Y": splt+="set[0]=temp["+i+"]||0;"; break; - case "%a": + case "%a": case "%A": splt+="set[3]=set[3]%12+((temp["+i+"]||'').toLowerCase()=='am'?0:12);"; - break; + break; case "%s": splt+="set[5]=temp["+i+"]||0;"; break; case "%M": splt+="set[1]=gantt.locale.date.month_short_hash[temp["+i+"]]||0;"; @@ -9048,7 +9048,7 @@ gantt.mixin(gantt.config, // grid width can be increased after the column has been resized keep_grid_width:false, - + // grid width can be adjusted grid_resize:false, @@ -9224,7 +9224,7 @@ if (window.jQuery){ } }); - + if (views.length === 1) return views[0]; return views; } @@ -9318,7 +9318,7 @@ gantt.skins.terrace = { lightbox_additional_height:75 }, _second_column_width:90, - _third_column_width:70 + _third_column_width:70 }; gantt.skins.broadway = { config:{ @@ -9380,7 +9380,7 @@ gantt._init_touch_events = function(){ clientX:ev.touches[0].clientX, clientY:ev.touches[0].clientY }; - else + else return ev; }, function(){ return false; }); } @@ -9409,7 +9409,7 @@ gantt._touch_events = function(names, accessor, ignore){ //ignore common and scrolling moves if (!action_mode) return; - + if (long_tap_timer) clearTimeout(long_tap_timer); var source = accessor(e); @@ -9474,7 +9474,7 @@ gantt._touch_events = function(names, accessor, ignore){ } else { dblclicktime = new Date(); } - + //long tap long_tap_timer = setTimeout(function(){ var taskId = gantt.locate(action_start); @@ -9492,11 +9492,11 @@ gantt._touch_events = function(names, accessor, ignore){ } } - + long_tap_timer = null; }, gantt.config.touch_drag); }); - + //touch end gantt.event(this.$container, names[2], function(e){ if (ignore(e)) return; @@ -9505,7 +9505,7 @@ gantt._touch_events = function(names, accessor, ignore){ action_mode = false; var source = accessor(e); gantt._tasks_dnd.on_mouse_up(source); - + if(current_target) { gantt.refreshTask(gantt.locate(current_target)); if(current_target.parentNode){ @@ -9513,7 +9513,7 @@ gantt._touch_events = function(names, accessor, ignore){ gantt._touch_feedback(); } } - + gantt._touch_scroll_active = action_mode = scroll_mode = false; current_target = null; }); @@ -9526,7 +9526,7 @@ gantt._touch_events = function(names, accessor, ignore){ (e||event).cancelBubble = true; return false; } - + function cloneTaskRendered(taskId) { var renders = gantt._task_area_pulls; var task = gantt.getTask(taskId); From 62b4d87013f25c48242d34ab2850490e28152b78 Mon Sep 17 00:00:00 2001 From: nathangray Date: Mon, 27 Nov 2017 09:58:26 -0700 Subject: [PATCH 02/33] Update test to match timesheet changes --- tests/DeleteTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/DeleteTest.php b/tests/DeleteTest.php index f1b0b832..88cb61c0 100644 --- a/tests/DeleteTest.php +++ b/tests/DeleteTest.php @@ -737,8 +737,8 @@ protected function checkDatasources($status = '') $check_status = $status == 'open' || $status == 'not-started' ? 'Open(status)' : $status; break; case 'timesheet': - // Timesheet is almost always ignore - $check_status = $status != 'deleted' ? 'ignore' : $status; + // Timesheet is almost always active + $check_status = $status != 'deleted' ? 'active' : $status; break; default: $check_status = $status; From 3c1b7fdefb3b93a6d4fd160f4151890729768010 Mon Sep 17 00:00:00 2001 From: nathangray Date: Tue, 5 Dec 2017 10:55:56 -0700 Subject: [PATCH 03/33] * Projectmanager - add ACL check on timesheet before offering it as an action --- inc/class.projectmanager_elements_ui.inc.php | 21 +++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/inc/class.projectmanager_elements_ui.inc.php b/inc/class.projectmanager_elements_ui.inc.php index 7f59b97b..296c2278 100644 --- a/inc/class.projectmanager_elements_ui.inc.php +++ b/inc/class.projectmanager_elements_ui.inc.php @@ -816,15 +816,22 @@ protected function get_actions() 'checkbox' => true, 'isChecked' => 'javaScript:app.projectmanager.is_ignored', 'onExecute' => 'javaScript:app.projectmanager.ignore_action' - ), - 'timesheet' => array( + ) + ); + $group++; + if ($GLOBALS['egw_info']['user']['apps']['timesheet']) + { + $actions['timesheet'] = array( 'icon' => 'timesheet/navbar', 'caption' => 'Timesheet', 'egw_open' => 'add-timesheet', 'allowOnMultiple' => false, - 'group' => ++$group, - ), - 'infolog-subs' => array( + 'group' => $group, + ); + } + if ($GLOBALS['egw_info']['user']['apps']['infolog']) + { + $actions['infolog-subs'] = array( 'icon' => 'infolog/navbar', 'caption' => 'View subs', 'hint' => 'View all subs of this entry', @@ -835,8 +842,8 @@ protected function get_actions() 'url' => 'menuaction=infolog.infolog_ui.index&action=sp&action_id=$id', 'targetapp' => 'infolog', 'hideOnDisabled' => true - ), - ); + ); + } if ($GLOBALS['egw_info']['user']['apps']['filemanager']) { $actions['filemanager'] = array( From b7e4073e872d502ff36c2d6eced8b3d0a6c54ee6 Mon Sep 17 00:00:00 2001 From: nathangray Date: Fri, 8 Dec 2017 11:07:34 -0700 Subject: [PATCH 04/33] Add test for creating new projects from template --- inc/class.projectmanager_ui.inc.php | 27 +- tests/TemplateTest.php | 442 ++++++++++++++++++++++++++++ 2 files changed, 461 insertions(+), 8 deletions(-) create mode 100644 tests/TemplateTest.php diff --git a/inc/class.projectmanager_ui.inc.php b/inc/class.projectmanager_ui.inc.php index 2fbc01d4..a6ae02f2 100644 --- a/inc/class.projectmanager_ui.inc.php +++ b/inc/class.projectmanager_ui.inc.php @@ -52,15 +52,26 @@ class projectmanager_ui extends projectmanager_bo */ var $filter_labels; + /** + * Etemplate + */ + var $template; + /** * Constructor, calls the constructor of the extended class * * @return projectmanager_ui */ - function __construct() + function __construct(Etemplate $etemplate = null) { parent::__construct(); + if($etemplate === null) + { + $etemplate = new Etemplate(); + } + $this->template = $etemplate; + static::$status_labels = array( 'active' => lang('Active'), 'nonactive' => lang('Nonactive'), @@ -143,7 +154,7 @@ function edit($content=null,$view=false) { if ((int) $this->debug >= 1 || $this->debug == 'edit') $this->debug_message("projectmanager_ui::edit(,$view) content=".print_r($content,true)); - $tpl = new Etemplate('projectmanager.edit'); + $this->template->read('projectmanager.edit'); if (is_array($content)) { @@ -424,7 +435,7 @@ function edit($content=null,$view=false) 'customfields' => $view, 'general_avail[1]' => !$GLOBALS['egw_info']['user']['apps']['admin'], ); - if ($readonlys['delete']) $tpl->disable_cells('delete_sources'); + if ($readonlys['delete']) $this->template->disable_cells('delete_sources'); if (!$this->check_acl(EGW_ACL_EDIT_BUDGET)) { @@ -530,7 +541,7 @@ function edit($content=null,$view=false) $GLOBALS['egw_info']['flags']['app_header'] = lang('projectmanager') . ' - ' . ($this->data['pm_id'] ? ($view ? lang('View project') : lang('Edit project')) : lang('Add project')); - $tpl->exec('projectmanager.projectmanager_ui.edit',$content,$sel_options,$readonlys,$preserv,2); + $this->template->exec('projectmanager.projectmanager_ui.edit',$content,$sel_options,$readonlys,$preserv,2); } /** @@ -685,7 +696,7 @@ function pm_list($content=null,$msg='') { if ((int) $this->debug >= 1 || $this->debug == 'index') $this->debug_message("projectmanager_ui::index(,$msg) content=".print_r($content,true)); - $tpl = new Etemplate('projectmanager.list'); + $this->template->read('projectmanager.list'); if ($_GET['msg']) $msg = $_GET['msg']; @@ -725,7 +736,7 @@ function pm_list($content=null,$msg='') switch($action) { case 'ganttchart': - $tpl->location(array( + $this->template->location(array( 'menuaction' => 'projectmanager.projectmanager_ganttchart.show', 'pm_id' => $pm_id, )); @@ -805,13 +816,13 @@ function pm_list($content=null,$msg='') $sel_options = array( 'project_tree' => $this->ajax_tree(0, true,$this->prefs['current_project']) ); - $tpl->setElementAttribute('project_tree','actions', projectmanager_ui::project_tree_actions()); + $this->template->setElementAttribute('project_tree','actions', projectmanager_ui::project_tree_actions()); if($this->prefs['current_project']) { $content['project_tree'] = 'projectmanager::'.$this->prefs['current_project']; } $GLOBALS['egw_info']['flags']['app_header'] = lang('projectmanager').' - '.lang('Projectlist'); - $tpl->exec('projectmanager.projectmanager_ui.pm_list',$content,$sel_options); + $this->template->exec('projectmanager.projectmanager_ui.pm_list',$content,$sel_options); } /** diff --git a/tests/TemplateTest.php b/tests/TemplateTest.php new file mode 100644 index 00000000..9405abdb --- /dev/null +++ b/tests/TemplateTest.php @@ -0,0 +1,442 @@ +ui = new \projectmanager_ui(); + // I have no idea why this has to be after the call to new \projectmanager_ui(), + // but it fails to find the Etemplate class otherwise + $this->ui->template = $this->etemplate = $this->createPartialMock(Etemplate::class, array('exec','read')); + + $this->bo = $this->ui; + + $this->mockTracking($this->bo, 'projectmanager_tracking'); + + $this->makeProject('template'); + } + + public function tearDown() + { + $this->bo = new \projectmanager_bo(); + + // Delete template + $this->deleteProject($this->pm_id); + // Delete clone + $this->deleteProject($this->cloned_id); + + $this->bo = null; + + // Projectmanager sets a lot of global stuff + unset($GLOBALS['projectmanager_bo']); + unset($GLOBALS['projectmanager_elements_bo']); + } + + public function testCreateFromTemplate() + { + $this->bo->tracking->expects($this->any()) + ->method('track'); + + + // Force links to run notification now so we get valid testing - it + // usually waits until Egw::on_shutdown(); + Link::run_notifies(); + + // Mock the etemplate call + // First time so UI can set up the content array + $this->etemplate->expects($this->exactly(2)) + ->method('exec') + ->will($this->returnCallback(function($method, $content) { + $_content = $content; + return is_array($content) && count($content) > 0; + })); + + // Create new from template + $_GET['template'] = $this->pm_id; + $this->ui->edit(); + + // Could maybe do some checks here... + + // Save + $content = $this->bo->data; + $content['apply'] = true; + $content['template'] = $this->pm_id; + $content['pm_title'] = 'Created from template'; + + // Mock the etemplate call to get ID + $this->ui->edit($content); + + // Template contains a sub-project, which pushes pm_id up by 1 more + $this->cloned_id = ((int)$this->bo->data['pm_id'])-1; + $this->assertNotEquals(-1, $this->cloned_id); + $this->assertNotEquals($this->pm_id, $this->cloned_id); + + //echo "Original ID: {$this->pm_id} Cloned ID: {$this->cloned_id}\n"; + + // Check that elements are there + $this->checkClonedElements($this->cloned_id); + + // Check datasources are there + $this->checkDatasources('open'); + } + + /** + * Make a project so we can test with it + */ + protected function makeProject($status = 'active') + { + $project = array( + 'pm_number' => 'TEST', + 'pm_title' => 'Auto-test for ' . $this->getName(), + 'pm_status' => $status, + 'pm_description' => 'Test project for ' . $this->getName() + ); + + // Save & set modifier, no notifications + try + { + $result = true; + $result = $this->bo->save($project, true, false); + } + catch (\Exception $e) + { + // Something went wrong, we'll just fail + $this->fail($e); + } + + $this->assertFalse((boolean)$result, 'Error making test project'); + $this->assertArrayHasKey('pm_id', $this->bo->data, 'Could not make test project'); + $this->assertThat($this->bo->data['pm_id'], + $this->logicalAnd( + $this->isType('integer'), + $this->greaterThan(0) + ) + ); + $this->pm_id = $this->bo->data['pm_id']; + + // Add some elements + $this->assertGreaterThan(0, count($GLOBALS['egw_info']['apps']), + 'No apps found to use as projectmanager elements' + ); + foreach($GLOBALS['egw_info']['apps'] as $app => $app_vals) + { + // if datasource can not be autoloaded, skip + if (!class_exists($class = $app.'_datasource') || !class_exists($bo_class = '\\'.$app.'_bo')) + { + continue; + } + if(method_exists($this, "make_$app")) + { + $this->{"make_$app"}(); + } + else + { + $this->markTestIncomplete("$app has a datasource, but cannot be tested - add a make_$app() function to ". get_class()); + } + } + + // Force links to run notification now, or we won't get elements since it + // usually waits until Egw::on_shutdown(); + Link::run_notifies(); + + $elements = new \projectmanager_elements_bo($this->bo); + $elements->sync_all($this->pm_id); + + // Make sure all elements are created + $this->checkOriginalElements(false, count($this->elements), "Unable to create all project elements"); + } + + /** + * Make an infolog entry and add it to the project + */ + protected function make_calendar() + { + $bo = new \calendar_boupdate(); + $element = array( + 'title' => "Test calendar for #{$this->pm_id}", + 'des' => 'Test element as part of the project for test ' . $this->getName(), + 'start' => \time(), + 'end' => \time() + 60, + 'pm_id' => $this->pm_id, + ); + $element_id = $bo->save($element); + Link::link('calendar',$element_id,'projectmanager',$this->pm_id); + $this->elements[] = 'calendar:'.$element_id; + } + + /** + * Make an infolog entry and add it to the project + */ + protected function make_infolog() + { + $bo = new \infolog_bo(); + $element = array( + 'info_subject' => "Test infolog for #{$this->pm_id}", + 'info_des' => 'Test element as part of the project for test ' . $this->getName(), + 'info_status' => 'open', + 'pm_id' => $this->pm_id, + 'info_contact' => array('app' => 'projectmanager', 'id' => $this->pm_id) + ); + $element_id = $bo->write($element, true, true, true, true); + $this->elements[] = 'infolog:'.$element_id; + } + + /** + * Make a projectmanager entry and add it to the project + */ + protected function make_projectmanager() + { + $bo = new \projectmanager_bo(); + $bo->data = array( + 'pm_number' => 'SUB-TEST', + 'pm_title' => "Test project for #{$this->pm_id}", + 'pm_status' => 'active', + 'pm_description' => 'Test project for ' . $this->getName() + ); + $bo->save(); + $element_id = $bo->data['pm_id']; + Link::link('projectmanager',$this->pm_id,'projectmanager',$element_id); + $this->elements[] = 'projectmanager:'.$element_id; + } + + /** + * Make a timesheet entry and add it to the project + */ + protected function make_timesheet() + { + $bo = new \timesheet_bo(); + $bo->data = array( + 'ts_title' => "Test timesheet for #{$this->pm_id}", + 'ts_description' => 'Test element as part of the project for test ' . $this->getName(), + 'ts_status' => null, + 'ts_owner' => $GLOBALS['egw_info']['user']['account_id'], + 'ts_start' => \time() + ); + $bo->save(); + $element_id = $bo->data['ts_id']; + Link::link(TIMESHEET_APP,$element_id,'projectmanager',$this->pm_id); + $this->elements[] = 'timesheet:'.$element_id; + } + + /** + * Make a tracker entry and add it to the project + */ + protected function make_tracker() + { + $bo = new \tracker_bo(); + $bo->data = array( + 'tr_summary' => "Test tracker for #{$this->pm_id}", + 'tr_description' => 'Test element as part of the project for test ' . $this->getName(), + 'tr_status' => \tracker_bo::STATUS_OPEN, + 'tr_owner' => $GLOBALS['egw_info']['user']['account_id'] + ); + $bo->save(); + $element_id = $bo->data['tr_id']; + Link::link('tracker',$element_id,'projectmanager',$this->pm_id); + $this->elements[] = 'tracker:'.$element_id; + } + + /** + * Fully delete a project and its elements, no matter what state or settings + */ + protected function deleteProject($pm_id) + { + // Reset, or it'll just return its data instead of reading from DB + $this->bo->data = array(); + + if(!$pm_id) + { + $pm_id = $this->pm_id; + } + // Force links to run notification now, or elements might stay + // usually waits until Egw::on_shutdown(); + Link::run_notifies(); + + $this->bo->delete($pm_id, true); + // Delete again to purge + $this->bo->delete($pm_id, true); + + // Force links to run notification now, or elements might stay + // usually waits until Egw::on_shutdown(); + Link::run_notifies(); + + $this->deleteElements(); + } + + + /** + * Delete all the elements + */ + protected function deleteElements() + { + // Delete all elements + foreach($this->elements as $id) + { + list($app, $id) = explode(':',$id); + + $bo_class = "{$app}_bo"; + + // Delete each entry twice to make sure it's gone + switch($app) + { + case 'calendar': + $bo = new \calendar_boupdate(); + $bo->delete($id,0,true,true); + $bo->delete($id,0,true,true); + break; + case 'infolog': + $bo = new $bo_class(); + $bo->delete($id, true, false, true); + $bo->delete($id, true, false, true); + break; + case 'projectmanager': + $bo = new $bo_class(); + $bo->delete($id); + $bo->delete($id); + break; + case 'timesheet': + $bo = new $bo_class(); + $bo->delete($id); + // Tell Timesheet to ignore ACL to make sure it's gone + $bo->delete($id, true); + break; + case 'tracker': + $bo = new $bo_class(); + // Once is enough for tracker, it doesn't support keeping things + // after deleting + $bo->delete($id); + break; + } + } + } + + /** + * Check that the project elements are present, and have the provided status. + * + * @param String $status + */ + protected function checkOriginalElements($status = '', $expected_count = 0) + { + $element_bo = new \projectmanager_elements_bo(); + $element_count = 0; + + foreach($element_bo->search(array('pm_id' => $this->pm_id), false) as $element) + { + $element_count++; + if ($status) + { + $this->assertEquals($status, $element['pe_status'], "Project element {$element['pe_title']} status was {$element['pe_status']}, expected $status"); + } + } + + $this->assertEquals($expected_count, $element_count, "Incorrect number of elements"); + } + + /** + * Check that the project elements are present, and have the provided status. + * + * @param String $status + */ + protected function checkClonedElements($clone_id) + { + $element_bo = new \projectmanager_elements_bo(); + $element_bo->pm_id = $clone_id; + $element_count = 0; + $indexed_elements = array(); + + foreach($element_bo->search(array('pm_id' => $clone_id), false) as $element) + { + //echo "\tPM:".$element['pm_id'] . ' '.$element['pe_app'] . ':'.$element['pe_app_id'] . "\t".$element['pe_title']."\n"; + $indexed_elements[$element['pe_app']] = $element; + } + foreach($this->elements as $_id) + { + list($app, $id) = explode(':', $_id); + + switch ($app) + { + case 'timesheet': + // Timesheet does not support copying, so won't be there + $this->assertNull($indexed_elements[$app]); + $element_count++; + break; + default: + $this->assertNotNull($indexed_elements[$app]); + $element_count++; + break; + } + } + + $this->assertEquals(count($this->elements), $element_count, "Incorrect number of elements"); + } + + /** + * Check that the datasources are present, and have the provided status. + * Datasource deletion is covered by each app's own setting. + * + * @param String $status + */ + protected function checkDatasources($status = '') + { + $element_bo = new \projectmanager_elements_bo(); + foreach($this->elements as $id) + { + list($app, $id) = explode(':', $id); + + switch ($app) + { + case 'calendar': + // Calendar doesn't really have a status + $check_status = $status != 'deleted' ? '' : $status; + break; + case 'projectmanager': + // PM is active, not open + $check_status = $status == 'open' || $status == 'not-started' ? 'active' : $status; + break; + case 'tracker': + $check_status = $status == 'open' || $status == 'not-started' ? 'Open(status)' : $status; + break; + case 'timesheet': + // Timesheet is almost always active + $check_status = $status != 'deleted' ? 'active' : $status; + break; + default: + $check_status = $status; + break; + } + $ds = $element_bo->datasource($app); + $element = $ds->read($id); + + $this->assertEquals($check_status, $element['pe_status'], + "$app datasource status was {$element['pe_status']}, expected $status" . ($check_status == $status ? '' : " / $check_status") + ); + } + } +} \ No newline at end of file From be5084fb6ba0b809a915d411e9b84f297776da4f Mon Sep 17 00:00:00 2001 From: nathangray Date: Tue, 12 Dec 2017 14:52:19 -0700 Subject: [PATCH 05/33] Fix bug where ACL check did not fully use provided user --- inc/class.projectmanager_bo.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/class.projectmanager_bo.inc.php b/inc/class.projectmanager_bo.inc.php index a3246904..db6a9ec1 100644 --- a/inc/class.projectmanager_bo.inc.php +++ b/inc/class.projectmanager_bo.inc.php @@ -649,7 +649,7 @@ function check_acl($required,$data=0,$no_cache=false,$user=null) if (!is_array($data)) { $data_backup =& $this->data; unset($this->data); - $data =& $this->read($data); + $data =& parent::read($data); $this->data =& $data_backup; unset($data_backup); if (!$data) return null; // $pm_id not found ==> no rights @@ -660,7 +660,7 @@ function check_acl($required,$data=0,$no_cache=false,$user=null) $data =& $this->data; } // rights come from owner grants or role based Acl - $memberships = $GLOBALS['egw']->accounts->memberships($this->user); + $memberships = $GLOBALS['egw']->accounts->memberships($user); $member_from_groups = array_intersect_key((array)$data['pm_members'], $memberships); $grants_from_groups = 0; foreach ($member_from_groups as $member_from_group => $member_acl) { From 3f4f0c2a6807081e14bd9d658b155cb4a94fa696 Mon Sep 17 00:00:00 2001 From: nathangray Date: Wed, 10 Jan 2018 10:42:57 -0700 Subject: [PATCH 06/33] * Allow private custom fields in notifications, with filtering according to set permissions. Private custom fields are removed from notifications to non-users. --- inc/class.projectmanager_tracking.inc.php | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/inc/class.projectmanager_tracking.inc.php b/inc/class.projectmanager_tracking.inc.php index 1bc10e27..94e3a2c8 100644 --- a/inc/class.projectmanager_tracking.inc.php +++ b/inc/class.projectmanager_tracking.inc.php @@ -92,7 +92,7 @@ function __construct(projectmanager_bo $bo) function get_config($name,$data,$old=null) { $projectmanager = $data['pm_id']; - + unset($old); // not used, but required function signature switch($name) { @@ -164,7 +164,7 @@ function get_subject($data,$old) function get_message($data,$old) { if ($data['message']) return $data['message']; // async notification - + if (!$data['pm_modified'] || !$old) { return lang('New Project submitted by %1 at %2', @@ -185,8 +185,6 @@ function get_message($data,$old) */ function get_details($data,$receiver=null) { - unset($receiver); // not used, but required function signature - $members = array(); if ($data['pm_members']) { @@ -231,7 +229,7 @@ function get_details($data,$receiver=null) ); // add custom fields - $details += $this->get_customfields($data); + $details += $this->get_customfields($data, null, $receiver); return $details; } From 6acbb6bef2528be94662e9e93ae3ec7406c3f7e0 Mon Sep 17 00:00:00 2001 From: nathangray Date: Tue, 16 Jan 2018 16:23:11 -0700 Subject: [PATCH 07/33] Rework template test to also check for updated and custom from on the infolog entry --- tests/TemplateTest.php | 65 +++++++++++++++++++++++++++++++++++------- 1 file changed, 54 insertions(+), 11 deletions(-) diff --git a/tests/TemplateTest.php b/tests/TemplateTest.php index 9405abdb..6391f337 100644 --- a/tests/TemplateTest.php +++ b/tests/TemplateTest.php @@ -145,6 +145,10 @@ protected function makeProject($status = 'active') $this->assertGreaterThan(0, count($GLOBALS['egw_info']['apps']), 'No apps found to use as projectmanager elements' ); + + // Make one with a custom from + $this->make_infolog(true); + foreach($GLOBALS['egw_info']['apps'] as $app => $app_vals) { // if datasource can not be autoloaded, skip @@ -194,16 +198,25 @@ protected function make_calendar() /** * Make an infolog entry and add it to the project */ - protected function make_infolog() + protected function make_infolog($custom_from = false) { $bo = new \infolog_bo(); $element = array( 'info_subject' => "Test infolog for #{$this->pm_id}", 'info_des' => 'Test element as part of the project for test ' . $this->getName(), 'info_status' => 'open', - 'pm_id' => $this->pm_id, - 'info_contact' => array('app' => 'projectmanager', 'id' => $this->pm_id) + 'pm_id' => $this->pm_id ); + + if($custom_from) + { + $element['info_des'] .= "\nCustom from"; + $element += array( + 'info_from' => 'Custom from', + 'info_contact' => array('search' => 'Custom from') + ); + } + $element_id = $bo->write($element, true, true, true, true); $this->elements[] = 'infolog:'.$element_id; } @@ -370,31 +383,61 @@ protected function checkClonedElements($clone_id) $element_bo->pm_id = $clone_id; $element_count = 0; $indexed_elements = array(); + $unmatched_elements = $this->elements; + // First infolog has a custom from + $first_infolog = true; foreach($element_bo->search(array('pm_id' => $clone_id), false) as $element) { //echo "\tPM:".$element['pm_id'] . ' '.$element['pe_app'] . ':'.$element['pe_app_id'] . "\t".$element['pe_title']."\n"; - $indexed_elements[$element['pe_app']] = $element; + $indexed_elements[$element['pe_app']][] = $element; } - foreach($this->elements as $_id) + foreach($this->elements as $key => $_id) { list($app, $id) = explode(':', $_id); + $copied = array_shift($indexed_elements[$app]); switch ($app) { case 'timesheet': // Timesheet does not support copying, so won't be there - $this->assertNull($indexed_elements[$app]); - $element_count++; + $this->assertNull($copied, "$app entry $_id got linked"); + unset($unmatched_elements[$key]); + continue 2; + case 'calendar': + // Calendar does not copy, but it does link to the original event + $this->assertNotNull($copied, "$app entry $_id is missing"); + unset($unmatched_elements[$key]); + continue 2; + case 'infolog': + $this->assertNotNull($copied, "$app entry $_id did not get cloned"); + // Also check pm_id & info_from + $info_bo = new \infolog_bo(); + $info = $info_bo->read($copied['pe_app_id']); + $this->assertEquals($clone_id, $info['pm_id']); + + if($first_infolog) + { + $this->assertNotEquals(Link::title('projectmanager', $clone_id), $info['info_from'], 'Custom from got lost'); + $first_infolog = false; + } + else + { + $this->assertEquals(Link::title('projectmanager', $clone_id), $info['info_from']); + } + // Make sure ID is actually different - copied, not linked + $this->assertNotEquals($id, $copied['pe_app_id']); + + unset($unmatched_elements[$key]); break; default: - $this->assertNotNull($indexed_elements[$app]); - $element_count++; + $this->assertNotNull($copied, "$app entry $_id did not get linked"); + unset($unmatched_elements[$key]); break; } } - $this->assertEquals(count($this->elements), $element_count, "Incorrect number of elements"); + $this->assertCount(0, $unmatched_elements, "Incorrect number of elements"); } /** @@ -439,4 +482,4 @@ protected function checkDatasources($status = '') ); } } -} \ No newline at end of file +} From 18bdd66334c1b28b49aa1404faa831d2395a8771 Mon Sep 17 00:00:00 2001 From: nathangray Date: Tue, 23 Jan 2018 10:29:06 -0700 Subject: [PATCH 08/33] Clean up template test, infolog specific stuff moved to its own --- tests/TemplateTest.php | 52 ++++++++++++++---------------------------- 1 file changed, 17 insertions(+), 35 deletions(-) diff --git a/tests/TemplateTest.php b/tests/TemplateTest.php index 6391f337..42944df8 100644 --- a/tests/TemplateTest.php +++ b/tests/TemplateTest.php @@ -5,9 +5,9 @@ require_once realpath(__DIR__.'/../../api/tests/AppTest.php'); // Application test base -use Egroupware\Api\Config; -use Egroupware\Api\Etemplate; -use Egroupware\Api\Link; +use EGroupware\Api\Config; +use EGroupware\Api\Etemplate; +use EGroupware\Api\Link; /** @@ -93,6 +93,10 @@ public function testCreateFromTemplate() // Mock the etemplate call to get ID $this->ui->edit($content); + // Force links to run notification now, or we won't get elements since it + // usually waits until Egw::on_shutdown(); + Link::run_notifies(); + // Template contains a sub-project, which pushes pm_id up by 1 more $this->cloned_id = ((int)$this->bo->data['pm_id'])-1; $this->assertNotEquals(-1, $this->cloned_id); @@ -146,9 +150,6 @@ protected function makeProject($status = 'active') 'No apps found to use as projectmanager elements' ); - // Make one with a custom from - $this->make_infolog(true); - foreach($GLOBALS['egw_info']['apps'] as $app => $app_vals) { // if datasource can not be autoloaded, skip @@ -198,7 +199,7 @@ protected function make_calendar() /** * Make an infolog entry and add it to the project */ - protected function make_infolog($custom_from = false) + protected function make_infolog() { $bo = new \infolog_bo(); $element = array( @@ -208,15 +209,6 @@ protected function make_infolog($custom_from = false) 'pm_id' => $this->pm_id ); - if($custom_from) - { - $element['info_des'] .= "\nCustom from"; - $element += array( - 'info_from' => 'Custom from', - 'info_contact' => array('search' => 'Custom from') - ); - } - $element_id = $bo->write($element, true, true, true, true); $this->elements[] = 'infolog:'.$element_id; } @@ -381,15 +373,12 @@ protected function checkClonedElements($clone_id) { $element_bo = new \projectmanager_elements_bo(); $element_bo->pm_id = $clone_id; - $element_count = 0; $indexed_elements = array(); $unmatched_elements = $this->elements; - // First infolog has a custom from - $first_infolog = true; - foreach($element_bo->search(array('pm_id' => $clone_id), false) as $element) + foreach($element_bo->search(array('pm_id' => $clone_id), false, 'pe_id ASC') as $element) { - //echo "\tPM:".$element['pm_id'] . ' '.$element['pe_app'] . ':'.$element['pe_app_id'] . "\t".$element['pe_title']."\n"; + //echo "\tPM:".$element['pm_id'] . ' '. $element['pe_id']."\t".$element['pe_app'] . ':'.$element['pe_app_id'] . "\t".$element['pe_title']."\n".Link::title($element['pe_app'],$element['pe_app_id'])."\n"; $indexed_elements[$element['pe_app']][] = $element; } foreach($this->elements as $key => $_id) @@ -397,6 +386,7 @@ protected function checkClonedElements($clone_id) list($app, $id) = explode(':', $_id); $copied = array_shift($indexed_elements[$app]); + //echo "$_id:\tCopied element - PM:".$copied['pm_id'] . ' '.$copied['pe_app'] . ':'.$copied['pe_app_id'] . "\t".$copied['pe_title']."\n"; switch ($app) { case 'timesheet': @@ -410,21 +400,12 @@ protected function checkClonedElements($clone_id) unset($unmatched_elements[$key]); continue 2; case 'infolog': - $this->assertNotNull($copied, "$app entry $_id did not get cloned"); + $this->assertNotNull($copied, "$app entry $_id did not get copied"); // Also check pm_id & info_from $info_bo = new \infolog_bo(); - $info = $info_bo->read($copied['pe_app_id']); - $this->assertEquals($clone_id, $info['pm_id']); - - if($first_infolog) - { - $this->assertNotEquals(Link::title('projectmanager', $clone_id), $info['info_from'], 'Custom from got lost'); - $first_infolog = false; - } - else - { - $this->assertEquals(Link::title('projectmanager', $clone_id), $info['info_from']); - } + $entry = $info_bo->read($copied['pe_app_id']); + $this->assertEquals($clone_id, $entry['pm_id']); + // Make sure ID is actually different - copied, not linked $this->assertNotEquals($id, $copied['pe_app_id']); @@ -437,7 +418,8 @@ protected function checkClonedElements($clone_id) } } - $this->assertCount(0, $unmatched_elements, "Incorrect number of elements"); + // Check that we found them all + $this->assertEmpty($unmatched_elements, 'Missing copied elements ' . \array2string($unmatched_elements)); } /** From 84435580fb6e43b1165d92b5dd1f6de221f96388 Mon Sep 17 00:00:00 2001 From: nathangray Date: Mon, 29 Jan 2018 15:24:23 -0700 Subject: [PATCH 09/33] Switch phrase to one already translated - it fits better --- templates/default/elements.list.xet | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/default/elements.list.xet b/templates/default/elements.list.xet index 4391dc29..df7c4da5 100644 --- a/templates/default/elements.list.xet +++ b/templates/default/elements.list.xet @@ -173,7 +173,7 @@ return false;"/> - +