source: Dev/trunk/src/client/dojox/gantt/GanttTaskControl.js @ 529

Last change on this file since 529 was 483, checked in by hendrikvanantwerpen, 11 years ago

Added Dojo 1.9.3 release.

File size: 50.9 KB
Line 
1define([
2    "dijit/focus",
3    "dojo/_base/declare",
4        "dojo/_base/array",
5        "dojo/_base/lang",
6    "dojo/date/locale",
7        "dojo/request",
8        "dojo/on",     
9        "dojo/dom",
10        "dojo/dom-class",
11        "dojo/dom-construct",
12        "dojo/dom-style",
13        "dojo/dom-attr",
14        "dojo/dom-geometry",
15        "dojo/keys",
16        "dojo/domReady!"
17], function(focus, declare, arrayUtil, lang, locale, request, on,
18                dom, domClass, domConstruct, domStyle, domAttr, domGeometry, keys){
19        return declare("dojox.gantt.GanttTaskControl", [], {
20                constructor: function(taskInfo, project, chart){
21                        this.ganttChart = chart;
22                        this.project = project;
23                        this.taskItem = taskInfo;
24                        //control variables
25                        this.checkMove = false;
26                        this.checkResize = false;
27                        this.moveChild = false;
28                        this.maxPosXMove = -1;
29                        this.minPosXMove = -1;
30                        this.maxWidthResize = -1;
31                        this.minWidthResize = -1;
32                        this.posX = 0;
33                        this.posY = 0;
34                        this.mouseX = 0;
35                        this.taskItemWidth = 0;
36                        this.isHide = false;
37                        this.hideTasksHeight = 0;
38                        this.isExpanded = true;
39                        this.descrTask = null;
40                        this.cTaskItem = null;
41                        this.cTaskNameItem = null;
42                        this.parentTask = null;
43                        this.predTask = null;
44                        this.childTask = [];
45                        this.childPredTask = [];
46                        this.nextChildTask = null;
47                        this.previousChildTask = null;
48                        this.nextParentTask = null;
49                        this.previousParentTask = null;
50                },
51                createConnectingLinesPN: function(){
52                        var arrConnectingLinesNames = [];
53                        var lineVerticalLeft = domConstruct.create("div", {
54                                innerHTML: " ",
55                                className: "ganttTaskLineVerticalLeft"
56                        }, this.ganttChart.panelNames.firstChild);
57                        var cTaskName = this.cTaskNameItem[0], pcTaskName = this.parentTask.cTaskNameItem[0];
58                        domStyle.set(lineVerticalLeft, {
59                                height: (cTaskName.offsetTop - pcTaskName.offsetTop) + "px",
60                                top: (pcTaskName.offsetTop + 5) + "px",
61                                left: (pcTaskName.offsetLeft - 9) + "px"
62                        });
63                        var LineHorizontalLeft = domConstruct.create("div", {
64                                noShade: true,
65                                color: "#000000",
66                                className: "ganttTaskLineHorizontalLeft"
67                        }, this.ganttChart.panelNames.firstChild);
68                        domStyle.set(LineHorizontalLeft, {
69                                left: (pcTaskName.offsetLeft - 9) + "px",
70                                top: (cTaskName.offsetTop + 5) + "px",
71                                height: "1px",
72                                width: (cTaskName.offsetLeft - pcTaskName.offsetLeft + 4) + "px"
73                        });
74                        arrConnectingLinesNames.push(lineVerticalLeft);
75                        arrConnectingLinesNames.push(LineHorizontalLeft);
76                        return arrConnectingLinesNames;
77                },
78                createConnectingLinesDS: function(){
79                        var contentData = this.ganttChart.contentData.firstChild;
80                        var arrLines = [];
81                        var arrowImg = domConstruct.create("div", {
82                                className: "ganttImageArrow"
83                        });
84                        //vertical line
85                        var lineVerticalRight = document.createElement("div");
86                        //horizontal line
87                        var lineHorizontal = document.createElement("div");
88                        var posXPreviousTask = domStyle.get(this.predTask.cTaskItem[0], "left");
89                        var posYPreviousTask = domStyle.get(this.predTask.cTaskItem[0], "top");
90                        var posXChildTask = domStyle.get(this.cTaskItem[0], "left");
91                        var posYChildTask = this.posY + 2;
92                        //width task item
93                        var widthPreviousTask = parseInt(this.predTask.cTaskItem[0].firstChild.firstChild.width);
94                        if(posYPreviousTask < posYChildTask){
95                                domClass.add(lineVerticalRight, "ganttTaskLineVerticalRight");
96                                domStyle.set(lineVerticalRight, {
97                                        height: (posYChildTask - this.ganttChart.heightTaskItem / 2 - posYPreviousTask - 3) + "px",
98                                        width: "1px",
99                                        left: (posXPreviousTask + widthPreviousTask - 20) + "px",
100                                        top: (posYPreviousTask + this.ganttChart.heightTaskItem) + "px"
101                                });
102                                domClass.add(lineHorizontal, "ganttTaskLineHorizontal");
103                                domStyle.set(lineHorizontal, {
104                                        width: (15 + (posXChildTask - (widthPreviousTask + posXPreviousTask))) + "px",
105                                        left: (posXPreviousTask + widthPreviousTask - 20) + "px",
106                                        top: (posYChildTask + 2) + "px"
107                                });
108                                domClass.add(arrowImg, "ganttTaskArrowImg");
109                                domStyle.set(arrowImg, {
110                                        left: (posXChildTask - 7) + "px",
111                                        top: (posYChildTask - 1) + "px"
112                                });
113                        }else{
114                                domClass.add(lineVerticalRight, "ganttTaskLineVerticalRightPlus");
115                                domStyle.set(lineVerticalRight, {
116                                        height: (posYPreviousTask + 2 - posYChildTask) + "px",
117                                        width: "1px",
118                                        left: (posXPreviousTask + widthPreviousTask - 20) + "px",
119                                        top: (posYChildTask + 2) + "px"
120                                });
121                                domClass.add(lineHorizontal, "ganttTaskLineHorizontalPlus");
122                                domStyle.set(lineHorizontal, {
123                                        width: (15 + (posXChildTask - (widthPreviousTask + posXPreviousTask))) + "px",
124                                        left: (posXPreviousTask + widthPreviousTask - 20) + "px",
125                                        top: (posYChildTask + 2) + "px"
126                                });
127                                domClass.add(arrowImg, "ganttTaskArrowImgPlus");
128                                domStyle.set(arrowImg, {
129                                        left: (posXChildTask - 7) + "px",
130                                        top: (posYChildTask - 1) + "px"
131                                });
132                        }
133                        contentData.appendChild(lineVerticalRight);
134                        contentData.appendChild(lineHorizontal);
135                        contentData.appendChild(arrowImg);
136                        arrLines.push(lineVerticalRight);
137                        arrLines.push(arrowImg);
138                        arrLines.push(lineHorizontal);
139                        return arrLines;
140                },
141                showChildTasks: function(task, isOpen){
142                        if(isOpen){
143                                for(var i = 0; i < task.childTask.length; i++){
144                                        var cTask = task.childTask[i],
145                                                cTaskItem0 = cTask.cTaskItem[0], cTaskName0 = cTask.cTaskNameItem[0],
146                                                cTaskItem1 = cTask.cTaskItem[1], cTaskName1 = cTask.cTaskNameItem[1],
147                                                cTaskName2 = cTask.cTaskNameItem[2];
148                                        if(cTaskItem0.style.display == "none"){
149                                                cTaskItem0.style.display = "inline";
150                                                cTaskName0.style.display = "inline";
151                                                cTask.showDescTask();
152                                                task.isHide = false;
153                                                if(cTaskName2){
154                                                        cTaskName2.style.display = "inline";
155                                                        isOpen = cTask.isExpanded;
156                                                }
157                                                for(var k = 0; k < cTaskItem1.length; k++){
158                                                        cTaskItem1[k].style.display = "inline";
159                                                }
160                                                for(var k = 0; k < cTaskName1.length; k++){
161                                                        cTaskName1[k].style.display = "inline";
162                                                }
163                                                (cTask.taskIdentifier) && (cTask.taskIdentifier.style.display = "inline");
164                                                this.hideTasksHeight += this.ganttChart.heightTaskItem + this.ganttChart.heightTaskItemExtra;
165                                                if(cTask.childTask.length > 0){
166                                                        this.showChildTasks(cTask, isOpen);
167                                                }
168                                        }
169                                }
170                        }
171                },
172                hideChildTasks: function(task){
173                        for(var i = 0; i < task.childTask.length; i++){
174                                var cTask = task.childTask[i],
175                                        cTaskItem0 = cTask.cTaskItem[0], cTaskName0 = cTask.cTaskNameItem[0],
176                                        cTaskItem1 = cTask.cTaskItem[1], cTaskName1 = cTask.cTaskNameItem[1],
177                                        cTaskName2 = cTask.cTaskNameItem[2];
178                                if(cTaskItem0.style.display != "none"){
179                                        cTaskItem0.style.display = "none";
180                                        cTaskName0.style.display = "none";
181                                        cTask.hideDescTask();
182                                        task.isHide = true;
183                                        if(cTaskName2){
184                                                cTaskName2.style.display = "none";
185                                        }
186                                        for(var k = 0; k < cTaskItem1.length; k++){
187                                                cTaskItem1[k].style.display = "none";
188                                        }
189                                        for(var k = 0; k < cTaskName1.length; k++){
190                                                cTaskName1[k].style.display = "none";
191                                        }
192                                        (cTask.taskIdentifier) && (cTask.taskIdentifier.style.display = "none");
193                                        this.hideTasksHeight += (this.ganttChart.heightTaskItem + this.ganttChart.heightTaskItemExtra);
194                                        if(cTask.childTask.length > 0){
195                                                this.hideChildTasks(cTask);
196                                        }
197                                }
198                        }
199                },
200                shiftCurrentTasks: function(task, height){
201                        this.shiftNextTask(this, height);
202                        task.project.shiftNextProject(task.project, height);
203                },
204                shiftTask: function(task, height){
205                        task.posY = task.posY + height;
206                        var taskItem0 = task.cTaskItem[0], taskName0 = task.cTaskNameItem[0],
207                                taskItem1 = task.cTaskItem[1], taskName1 = task.cTaskNameItem[1],
208                                taskName2 = task.cTaskNameItem[2];
209                        taskName0.style.top = parseInt(taskName0.style.top) + height + "px";
210                        if(taskName2){
211                                taskName2.style.top = parseInt(taskName2.style.top) + height + "px";
212                        }
213                        if(task.parentTask){
214                                if(parseInt(this.cTaskNameItem[0].style.top) > parseInt(task.parentTask.cTaskNameItem[0].style.top) &&
215                                (taskName1[0].style.display != "none")){
216                                        taskName1[0].style.height = parseInt(taskName1[0].style.height) + height + "px";
217                                }else{
218                                        taskName1[0].style.top = parseInt(taskName1[0].style.top) + height + "px";
219                                }
220                                taskName1[1].style.top = parseInt(taskName1[1].style.top) + height + "px";
221                        }
222                        taskItem0.style.top = parseInt(taskItem0.style.top) + height + "px";
223                        task.descrTask.style.top = parseInt(task.descrTask.style.top) + height + "px";
224                        if(task.predTask){
225                                if(((parseInt(this.cTaskItem[0].style.top) > parseInt(task.predTask.cTaskItem[0].style.top)) ||
226                                (this.cTaskItem[0].id == task.predTask.taskItem.id)) &&
227                                taskItem1[0].style.display != "none"){
228                                        taskItem1[0].style.height = parseInt(taskItem1[0].style.height) + height + "px";
229                                }else{
230                                        taskItem1[0].style.top = parseInt(taskItem1[0].style.top) + height + "px";
231                                }
232                                taskItem1[1].style.top = parseInt(taskItem1[1].style.top) + height + "px";
233                                taskItem1[2].style.top = parseInt(taskItem1[2].style.top) + height + "px";
234                        }
235                },
236                shiftNextTask: function(task, height){
237                        if(task.nextChildTask){
238                                this.shiftTask(task.nextChildTask, height);
239                                this.shiftChildTask(task.nextChildTask, height);
240                                this.shiftNextTask(task.nextChildTask, height);
241                        }else if(task.parentTask){
242                                this.shiftNextTask(task.parentTask, height);
243                        }else if(task.nextParentTask){
244                                this.shiftTask(task.nextParentTask, height);
245                                this.shiftChildTask(task.nextParentTask, height);
246                                this.shiftNextTask(task.nextParentTask, height);
247                        }
248                },
249                shiftChildTask: function(task, height){
250                        arrayUtil.forEach(task.childTask, function(cTask){
251                                this.shiftTask(cTask, height);
252                                if(cTask.childTask.length > 0){
253                                        this.shiftChildTask(cTask, height);
254                                }
255                        }, this);
256                },
257                endMove: function(){
258                        var cTask0 = this.cTaskItem[0];
259                        var width = domStyle.get(cTask0, "left") - this.posX;
260                        var startTime = this.getDateOnPosition(domStyle.get(cTask0, "left"));
261                        startTime = this.checkPos(startTime);
262                        if(this.checkMove){
263                                width = this.ganttChart.getPosOnDate(startTime) - this.posX;
264                                this.moveCurrentTaskItem(width, this.moveChild);
265                                this.project.shiftProjectItem();
266                        }
267                        this.checkMove = false;
268                        this.posX = 0;
269                        this.maxPosXMove = -1;
270                        this.minPosXMove = -1;
271                        cTask0.childNodes[1].firstChild.rows[0].cells[0].innerHTML = "";
272                        this.adjustPanelTime();
273                        if(this.ganttChart.resource){
274                                this.ganttChart.resource.refresh();
275                        }
276                },
277                checkPos: function(startTime){
278                        var cTask0 = this.cTaskItem[0];
279                        var h = startTime.getHours();
280                        if(h >= 12){
281                                startTime.setDate(startTime.getDate() + 1);
282                                startTime.setHours(0);
283                                if((parseInt(cTask0.firstChild.firstChild.width) + this.ganttChart.getPosOnDate(startTime) > this.maxPosXMove) && (this.maxPosXMove != -1)){
284                                        startTime.setDate(startTime.getDate() - 1);
285                                        startTime.setHours(0);
286                                }
287                        }else if((h < 12) && (h != 0)){
288                                startTime.setHours(0);
289                                if((this.ganttChart.getPosOnDate(startTime) < this.minPosXMove)){
290                                        startTime.setDate(startTime.getDate() + 1);
291                                }
292                        }
293                        cTask0.style.left = this.ganttChart.getPosOnDate(startTime) + "px";
294                        return startTime;
295                },
296                getMaxPosPredChildTaskItem: function(){
297                        var posPredChildTaskItem = 0;
298                        var nextPosPredChildTaskItem = 0;
299                        for(var i = 0; i < this.childPredTask.length; i++){
300                                nextPosPredChildTaskItem = this.getMaxPosPredChildTaskItemInTree(this.childPredTask[i]);
301                                if(nextPosPredChildTaskItem > posPredChildTaskItem){
302                                        posPredChildTaskItem = nextPosPredChildTaskItem;
303                                }
304                        }
305                        return posPredChildTaskItem;
306                },
307                getMaxPosPredChildTaskItemInTree: function(task){
308                        var cTask0 = task.cTaskItem[0];
309                        var currentPos = parseInt(cTask0.firstChild.firstChild.width) + domStyle.get(cTask0, "left");
310                        var posPredChildTaskItem = 0;
311                        var nextPosPredChildTaskItem = 0;
312                        arrayUtil.forEach(task.childPredTask, function(cpTask){
313                                nextPosPredChildTaskItem = this.getMaxPosPredChildTaskItemInTree(cpTask);
314                                if(nextPosPredChildTaskItem > posPredChildTaskItem){
315                                        posPredChildTaskItem = nextPosPredChildTaskItem;
316                                }
317                        }, this);
318                        return posPredChildTaskItem > currentPos ? posPredChildTaskItem : currentPos;
319                },
320                moveCurrentTaskItem: function(width, moveChild){
321                        var taskItem = this.cTaskItem[0];
322                        this.taskItem.startTime = new Date(this.ganttChart.startDate);
323                        this.taskItem.startTime.setHours(this.taskItem.startTime.getHours() + (parseInt(taskItem.style.left) / this.ganttChart.pixelsPerHour));
324                        this.showDescTask();
325                        var cTask1 = this.cTaskItem[1];
326                        if(cTask1.length > 0){
327                                cTask1[2].style.width = parseInt(cTask1[2].style.width) + width + "px";
328                                cTask1[1].style.left = parseInt(cTask1[1].style.left) + width + "px";
329                        }
330                        arrayUtil.forEach(this.childTask, function(cTask){
331                                if(!cTask.predTask){
332                                        this.moveChildTaskItems(cTask, width, moveChild);
333                                }
334                        }, this);
335                        arrayUtil.forEach(this.childPredTask, function(cpTask){
336                                this.moveChildTaskItems(cpTask, width, moveChild);
337                        }, this);
338                },
339                moveChildTaskItems: function(task, width, moveChild){
340                        var taskItem = task.cTaskItem[0];
341                        if(moveChild){
342                                taskItem.style.left = parseInt(taskItem.style.left) + width + "px";
343                                task.adjustPanelTime();
344                                task.taskItem.startTime = new Date(this.ganttChart.startDate);
345                                task.taskItem.startTime.setHours(task.taskItem.startTime.getHours() + (parseInt(taskItem.style.left) / this.ganttChart.pixelsPerHour));
346                                var ctItem = task.cTaskItem[1];
347                                arrayUtil.forEach(ctItem, function(item){
348                                        item.style.left = parseInt(item.style.left) + width + "px";
349                                }, this);
350                                arrayUtil.forEach(task.childTask, function(cTask){
351                                        if(!cTask.predTask){
352                                                this.moveChildTaskItems(cTask, width, moveChild);
353                                        }
354                                }, this);
355                                arrayUtil.forEach(task.childPredTask, function(cpTask){
356                                        this.moveChildTaskItems(cpTask, width, moveChild);
357                                }, this);
358                        }else{
359                                var ctItem = task.cTaskItem[1];
360                                if(ctItem.length > 0){
361                                        var item0 = ctItem[0], item2 = ctItem[2];
362                                        item2.style.left = parseInt(item2.style.left) + width + "px";
363                                        item2.style.width = parseInt(item2.style.width) - width + "px";
364                                        item0.style.left = parseInt(item0.style.left) + width + "px";
365                                }
366                        }
367                        task.moveDescTask();
368                },
369                adjustPanelTime: function(){
370                        var taskItem = this.cTaskItem[0];
371                        var width = parseInt(taskItem.style.left) + parseInt(taskItem.firstChild.firstChild.width) + this.ganttChart.panelTimeExpandDelta;
372                        width += this.descrTask.offsetWidth;
373                        this.ganttChart.adjustPanelTime(width);
374                },
375                getDateOnPosition: function(position){
376                        var date = new Date(this.ganttChart.startDate);
377                        date.setHours(date.getHours() + (position / this.ganttChart.pixelsPerHour));
378                        return date;
379                },
380                moveItem: function(event){
381                        var pageX = event.screenX;
382                        var posTaskItem = (this.posX + (pageX - this.mouseX));
383                        var widthTaskItem = parseInt(this.cTaskItem[0].childNodes[0].firstChild.width);
384                        var posTaskItemR = posTaskItem + widthTaskItem;
385                        if(this.checkMove){
386                                if(((this.minPosXMove <= posTaskItem)) &&
387                                ((posTaskItemR <= this.maxPosXMove) || (this.maxPosXMove == -1))){
388                                        this.moveTaskItem(posTaskItem);
389                                }
390                        }
391                },
392                moveTaskItem: function(posX){
393                        var cTask = this.cTaskItem[0];
394                        cTask.style.left = posX + "px";
395                        cTask.childNodes[1].firstChild.rows[0].cells[0].innerHTML = this.getDateOnPosition(posX).getDate() + '.' + (this.getDateOnPosition(posX).getMonth() + 1) + '.' + this.getDateOnPosition(posX).getUTCFullYear();
396                },
397                resizeItem: function(event){
398                        if(this.checkResize){
399                                var mouseX = event.screenX;
400                                var widthTaskItem = this.taskItemWidth + (mouseX - this.mouseX);
401                                if(widthTaskItem >= this.taskItemWidth){
402                                        if((widthTaskItem <= this.maxWidthResize) || (this.maxWidthResize == -1)){
403                                                this.resizeTaskItem(widthTaskItem);
404                                        }else if((this.maxWidthResize != -1) && (widthTaskItem > this.maxWidthResize)){
405                                                this.resizeTaskItem(this.maxWidthResize);
406                                        }
407                                }else if(widthTaskItem <= this.taskItemWidth){
408                                        if(widthTaskItem >= this.minWidthResize){
409                                                this.resizeTaskItem(widthTaskItem);
410                                        }else if(widthTaskItem < this.minWidthResize){
411                                                this.resizeTaskItem(this.minWidthResize);
412                                        }
413                                }
414                        }
415                },
416                resizeTaskItem: function(width){
417                        var taskItem = this.cTaskItem[0];
418                        var countHours = Math.round(width / this.ganttChart.pixelsPerWorkHour);
419                        var trow = taskItem.childNodes[0].firstChild.rows[0],
420                                rc0 = trow.cells[0], rc1 = trow.cells[1];
421                        rc0 && (rc0.firstChild.style.width = parseInt(rc0.width) * width / 100 + "px");
422                        rc1 && (rc1.firstChild.style.width = parseInt(rc1.width) * width / 100 + "px");
423                        taskItem.childNodes[0].firstChild.width = width + "px";
424                        taskItem.childNodes[1].firstChild.width = width + "px";
425                        //resize info
426                        this.cTaskItem[0].childNodes[1].firstChild.rows[0].cells[0].innerHTML = countHours;
427                        var tcNode2 = taskItem.childNodes[2];
428                        tcNode2.childNodes[0].style.width = width + "px";
429                        tcNode2.childNodes[1].style.left = width - 10 + "px";
430                },
431                endResizeItem: function(){
432                        var taskItem = this.cTaskItem[0];
433                        if((this.taskItemWidth != parseInt(taskItem.childNodes[0].firstChild.width))){
434                                var posXL = taskItem.offsetLeft;
435                                var posXR = taskItem.offsetLeft + parseInt(taskItem.childNodes[0].firstChild.width);
436                                this.taskItem.duration = Math.round((posXR - posXL) / this.ganttChart.pixelsPerWorkHour);
437                                if(this.childPredTask.length > 0){
438                                        for(var j = 0; j < this.childPredTask.length; j++){
439                                                var cpctItem = this.childPredTask[j].cTaskItem[1],
440                                                        item0 = cpctItem[0], item2 = cpctItem[2], tcNode0 = taskItem.childNodes[0];
441                                                item2.style.width = parseInt(item2.style.width) - (parseInt(tcNode0.firstChild.width) - this.taskItemWidth) + "px";
442                                                item2.style.left = parseInt(item2.style.left) + (parseInt(tcNode0.firstChild.width) - this.taskItemWidth) + "px";
443                                                item0.style.left = parseInt(item0.style.left) + (parseInt(tcNode0.firstChild.width) - this.taskItemWidth) + "px";
444                                        }
445                                }
446                        }
447                        this.cTaskItem[0].childNodes[1].firstChild.rows[0].cells[0].innerHTML = "";
448                        this.checkResize = false;
449                        this.taskItemWidth = 0;
450                        this.mouseX = 0;
451                        this.showDescTask();
452                        this.project.shiftProjectItem();
453                        this.adjustPanelTime();
454                        if(this.ganttChart.resource){
455                                this.ganttChart.resource.refresh();
456                        }
457                },
458                startMove: function(event){
459                        this.moveChild = event.ctrlKey;
460                        this.mouseX = event.screenX;
461                        this.getMoveInfo();
462                        this.checkMove = true;
463                        this.hideDescTask();
464                },
465                showDescTask: function(){
466                        var posX = (parseInt(this.cTaskItem[0].style.left) + this.taskItem.duration * this.ganttChart.pixelsPerWorkHour + 10);
467                        this.descrTask.style.left = posX + "px";
468                        this.descrTask.innerHTML = this.objKeyToStr(this.getTaskOwner());
469                        this.descrTask.style.visibility = 'visible';
470                },
471                hideDescTask: function(){
472                        domStyle.set(this.descrTask, "visibility", "hidden");
473                },
474                buildResourceInfo: function(resourceInfo){
475                        if(this.childTask && this.childTask.length > 0){
476                                for(var i = 0; i < this.childTask.length; i++){
477                                        var cTask = this.childTask[i];
478                                        cTask.buildResourceInfo(resourceInfo);
479                                }
480                        }
481                        if(lang.trim(this.taskItem.taskOwner).length > 0){
482                                var owners = this.taskItem.taskOwner.split(";");
483                                for(var i = 0; i < owners.length; i++){
484                                        var o = owners[i];
485                                        if(lang.trim(o).length <= 0){
486                                                continue;
487                                        }
488                                        resourceInfo[o] ? (resourceInfo[o].push(this)) : (resourceInfo[o] = [this]);
489                                }
490                        }
491                },
492                objKeyToStr: function(obj, delm){
493                        var returnStr = "";
494                        delm = delm || " ";
495                        if(obj){
496                                for(var key in obj){
497                                        returnStr += delm + key;
498                                }
499                        }
500                        return returnStr;
501                },
502                getTaskOwner: function(){
503                        var tOwner = {};
504                        if(lang.trim(this.taskItem.taskOwner).length > 0){
505                                var owners = this.taskItem.taskOwner.split(";");
506                                for(var i = 0; i < owners.length; i++){
507                                        var o = owners[i];
508                                        tOwner[o] = 1;
509                                }
510                        }
511                        arrayUtil.forEach(this.childTask, function(ctask){
512                                lang.mixin(tOwner, ctask.getTaskOwner());
513                        }, this);
514                        return tOwner;
515                },
516                moveDescTask: function(){
517                        var posX = (parseInt(this.cTaskItem[0].style.left) + this.taskItem.duration * this.ganttChart.pixelsPerWorkHour + 10);
518                        this.descrTask.style.left = posX + "px";
519                },
520                getMoveInfo: function(){
521                        this.posX = parseInt(this.cTaskItem[0].style.left);
522                        var widthTaskItem = parseInt(this.cTaskItem[0].childNodes[0].firstChild.width);
523                        var posParentTaskItem = !this.parentTask ? 0 : parseInt(this.parentTask.cTaskItem[0].style.left);
524                        var posPredTaskItem = !this.predTask ? 0 : parseInt(this.predTask.cTaskItem[0].style.left) + parseInt(this.predTask.cTaskItem[0].childNodes[0].firstChild.width);
525                        var widthParentTaskItem = !this.parentTask ? 0 : parseInt(this.parentTask.cTaskItem[0].childNodes[0].firstChild.width);
526               
527                        var childPredPosX = 0;
528                        var childParentPosX = 0;
529                        var childParentPosXR = 0;
530                        if(this.childPredTask.length > 0){
531                                var posChildTaskItem = null;
532                                arrayUtil.forEach(this.childPredTask, function(cpTask){
533                                        if((!posChildTaskItem) || ((posChildTaskItem) && (posChildTaskItem > parseInt(cpTask.cTaskItem[0].style.left)))){
534                                                posChildTaskItem = parseInt(cpTask.cTaskItem[0].style.left);
535                                        }
536                                }, this);
537                                childPredPosX = posChildTaskItem;
538                        }
539                        if(this.childTask.length > 0){
540                                var posChildTaskItemR = null;
541                                arrayUtil.forEach(this.childTask, function(cTask){
542                                        if((!posChildTaskItemR) || ((posChildTaskItemR) && (posChildTaskItemR > (parseInt(cTask.cTaskItem[0].style.left))))){
543                                                posChildTaskItemR = parseInt(cTask.cTaskItem[0].style.left);
544                                        }
545                                }, this);
546                                childParentPosXR = posChildTaskItemR;
547                                var posChildTaskItem = null;
548                                arrayUtil.forEach(this.childTask, function(cTask){
549                                        if((!posChildTaskItem) || ((posChildTaskItem)
550                                        && (posChildTaskItem < (parseInt(cTask.cTaskItem[0].style.left) + parseInt(cTask.cTaskItem[0].firstChild.firstChild.width))))){
551                                                posChildTaskItem = parseInt(cTask.cTaskItem[0].style.left) + parseInt(cTask.cTaskItem[0].firstChild.firstChild.width);
552                                        }
553                                }, this);
554                                childParentPosX = posChildTaskItem;
555                        }
556                        if(!this.moveChild){
557                                if(this.childPredTask.length > 0){
558                                        if(this.maxPosXMove < childPredPosX) this.maxPosXMove = childPredPosX;
559                                }
560                                if(this.childTask.length > 0){
561                                        if((this.childPredTask.length > 0) && (this.maxPosXMove - widthTaskItem) > childParentPosXR){
562                                                this.maxPosXMove = this.maxPosXMove - ((this.maxPosXMove - widthTaskItem) - childParentPosXR);
563                                        }
564                                        if(!(this.childPredTask.length > 0)){
565                                                this.maxPosXMove = childParentPosXR + widthTaskItem;
566                                        }
567                                        this.minPosXMove = (childParentPosX - widthTaskItem);
568                                }
569                                if(posParentTaskItem > 0){
570                                        if((!(this.childPredTask.length > 0)) && (this.childTask.length > 0)){
571                                                if(this.maxPosXMove > posParentTaskItem + widthParentTaskItem){
572                                                        this.maxPosXMove = posParentTaskItem + widthParentTaskItem;
573                                                }
574                                        }
575                                        if(this.minPosXMove <= posParentTaskItem){
576                                                this.minPosXMove = posParentTaskItem;
577                                        }
578                                        if((!(this.childTask.length > 0)) && (!(this.childPredTask.length > 0))){
579                                                this.maxPosXMove = posParentTaskItem + widthParentTaskItem;
580                                        }else if((!(this.childTask.length > 0)) && (this.childPredTask.length > 0)){
581                                                if((posParentTaskItem + widthParentTaskItem) > posPredTaskItem){
582                                                        this.maxPosXMove = childPredPosX;
583                                                }
584                                        }
585                                }
586                                if(posPredTaskItem > 0){
587                                        if(this.minPosXMove <= posPredTaskItem){
588                                                this.minPosXMove = posPredTaskItem;
589                                        }
590                                }
591                                if((posPredTaskItem == 0) && (posParentTaskItem == 0)){
592                                        if(this.minPosXMove <= this.ganttChart.initialPos){
593                                                this.minPosXMove = this.ganttChart.initialPos;
594                                        }
595                                }
596                        }else{
597                                if((posParentTaskItem > 0) && (posPredTaskItem == 0)){
598                                        this.minPosXMove = posParentTaskItem;
599                                        this.maxPosXMove = posParentTaskItem + widthParentTaskItem;
600                                }else if((posParentTaskItem == 0) && (posPredTaskItem == 0)){
601                                        this.minPosXMove = this.ganttChart.initialPos;
602                                        this.maxPosXMove = -1;
603                                }else if((posParentTaskItem > 0) && (posPredTaskItem > 0)){
604                                        this.minPosXMove = posPredTaskItem;
605                                        this.maxPosXMove = posParentTaskItem + widthParentTaskItem;
606                                }else if((posParentTaskItem == 0) && (posPredTaskItem > 0)){
607                                        this.minPosXMove = posPredTaskItem;
608                                        this.maxPosXMove = -1;
609                                }
610                                if((this.parentTask) && (this.childPredTask.length > 0)){
611                                        var posChildTaskItem = this.getMaxPosPredChildTaskItem(this);
612                                        var posParentTaskItem = parseInt(this.parentTask.cTaskItem[0].style.left) + parseInt(this.parentTask.cTaskItem[0].firstChild.firstChild.width);
613                                        this.maxPosXMove = this.posX + widthTaskItem + posParentTaskItem - posChildTaskItem;
614                                }
615                        }
616                },
617                startResize: function(event){
618                        this.mouseX = event.screenX;
619                        this.getResizeInfo();
620                        this.hideDescTask();
621                        this.checkResize = true;
622                        this.taskItemWidth = parseInt(this.cTaskItem[0].firstChild.firstChild.width);
623                },
624                getResizeInfo: function(){
625                        var cTask = this.cTaskItem[0];
626                        var posParentTaskItem = !this.parentTask ? 0 : parseInt(this.parentTask.cTaskItem[0].style.left);
627                        var widthParentTaskItem = !this.parentTask ? 0 : parseInt(this.parentTask.cTaskItem[0].childNodes[0].firstChild.width);
628                        var posTaskItem = parseInt(cTask.style.left);
629                        var childPredPosX = 0;
630                        var childParentPosX = 0;
631                        if(this.childPredTask.length > 0){
632                                var posChildTaskItem = null;
633                                arrayUtil.forEach(this.childPredTask, function(cpTask){
634                                        if((!posChildTaskItem) || ((posChildTaskItem) && (posChildTaskItem > parseInt(cpTask.cTaskItem[0].style.left)))){
635                                                posChildTaskItem = parseInt(cpTask.cTaskItem[0].style.left);
636                                        }
637                                }, this);
638                                childPredPosX = posChildTaskItem;
639                        }
640                        if(this.childTask.length > 0){
641                                var posChildTaskItem = null;
642                                arrayUtil.forEach(this.childTask, function(cTask){
643                                        if((!posChildTaskItem) || ((posChildTaskItem) && (posChildTaskItem < (parseInt(cTask.cTaskItem[0].style.left) + parseInt(cTask.cTaskItem[0].firstChild.firstChild.width))))){
644                                                posChildTaskItem = parseInt(cTask.cTaskItem[0].style.left) + parseInt(cTask.cTaskItem[0].firstChild.firstChild.width);
645                                        }
646                                }, this);
647                                childParentPosX = posChildTaskItem;
648                        }
649                        this.minWidthResize = this.ganttChart.pixelsPerDay;
650                        if(this.childTask.length > 0){
651                                this.minWidthResize = childParentPosX - posTaskItem;
652                        }
653                        if((this.childPredTask.length > 0) && (!this.parentTask)){
654                                this.maxWidthResize = childPredPosX - posTaskItem;
655                        }else if((this.childPredTask.length > 0) && (this.parentTask)){
656                                var w1 = posParentTaskItem + widthParentTaskItem - posTaskItem;
657                                var w2 = childPredPosX - posTaskItem;
658                                this.maxWidthResize = Math.min(w1, w2);
659                        }else if((this.childPredTask.length == 0) && (this.parentTask)){
660                                this.maxWidthResize = posParentTaskItem + widthParentTaskItem - posTaskItem;
661                        }
662                },
663                createTaskItem: function(){
664                        this.posX = this.ganttChart.getPosOnDate(this.taskItem.startTime);
665                        var itemControl = domConstruct.create("div", {
666                                id: this.taskItem.id,
667                                className: "ganttTaskItemControl"
668                        });
669                        domStyle.set(itemControl, {
670                                left: this.posX + "px",
671                                top: this.posY + "px"
672                        });
673                        var divTaskItem = domConstruct.create("div", {className: "ganttTaskDivTaskItem"}, itemControl);
674                        var tblTaskItem = domConstruct.create("table", {
675                                cellPadding: "0",
676                                cellSpacing: "0",
677                                width: this.taskItem.duration * this.ganttChart.pixelsPerWorkHour + "px",
678                                className: "ganttTaskTblTaskItem"
679                        }, divTaskItem);
680                        var rowTblTask = tblTaskItem.insertRow(tblTaskItem.rows.length);
681                        if(this.taskItem.percentage != 0){
682                                var cellTblTask = domConstruct.create("td", {
683                                        height: this.ganttChart.heightTaskItem + "px",
684                                        width: this.taskItem.percentage + "%"
685                                }, rowTblTask);
686                                cellTblTask.style.lineHeight = "1px";
687                                var imageProgress = domConstruct.create("div", {
688                                        className: "ganttImageTaskProgressFilled"
689                                }, cellTblTask);
690                                domStyle.set(imageProgress, {
691                                        width: (this.taskItem.percentage * this.taskItem.duration * this.ganttChart.pixelsPerWorkHour) / 100 + "px",
692                                        height: this.ganttChart.heightTaskItem + "px"
693                                });
694                        }
695                        if(this.taskItem.percentage != 100){
696                                var cellTblTask = domConstruct.create("td", {
697                                        height: this.ganttChart.heightTaskItem + "px",
698                                        width: (100 - this.taskItem.percentage) + "%"
699                                }, rowTblTask);
700                                cellTblTask.style.lineHeight = "1px";
701                                var imageProgressFill = domConstruct.create("div", {
702                                        className: "ganttImageTaskProgressBg"
703                                }, cellTblTask);
704                                domStyle.set(imageProgressFill, {
705                                        width: ((100 - this.taskItem.percentage) * this.taskItem.duration * this.ganttChart.pixelsPerWorkHour) / 100 + "px",
706                                        height: this.ganttChart.heightTaskItem + "px"
707                                });
708                        }
709                        if(this.ganttChart.isContentEditable){
710                                var divTaskInfo = domConstruct.create("div", {className: "ganttTaskDivTaskInfo"}, itemControl);
711                                var tblTaskInfo = domConstruct.create("table", {
712                                        cellPadding: "0",
713                                        cellSpacing: "0",
714                                        height: this.ganttChart.heightTaskItem + "px",
715                                        width: this.taskItem.duration * this.ganttChart.pixelsPerWorkHour + "px"
716                                }, divTaskInfo);
717                                var rowTaskInfo = tblTaskInfo.insertRow(0);
718                                var cellTaskInfo = domConstruct.create("td", {
719                                        align: "center",
720                                        vAlign: "top",
721                                        height: this.ganttChart.heightTaskItem + "px",
722                                        className: "ganttMoveInfo"
723                                }, rowTaskInfo);
724                                var divTaskName = domConstruct.create("div", {className: "ganttTaskDivTaskName"}, itemControl);
725                                var divMove = domConstruct.create("div", {}, divTaskName);
726                                domConstruct.create("input", {
727                                        className: "ganttTaskDivMoveInput",
728                                        type: "text"
729                                }, divMove);
730                                domStyle.set(divMove, {
731                                        background: "#000000",
732                                        opacity: 0
733                                });
734                                domStyle.set(divMove, {
735                                        height: this.ganttChart.heightTaskItem + "px",
736                                        width: this.taskItem.duration * this.ganttChart.pixelsPerWorkHour + "px"
737                                });
738                                //Creation resize area
739                                var divResize = domConstruct.create("div", {className: "ganttTaskDivResize"}, divTaskName);
740                                domConstruct.create("input", {
741                                        className: "ganttTaskDivResizeInput",
742                                        type: "text"
743                                }, divResize);
744                                domStyle.set(divResize, {
745                                        left: (this.taskItem.duration * this.ganttChart.pixelsPerWorkHour - 10) + "px",
746                                        height: this.ganttChart.heightTaskItem + "px",
747                                        width: "10px"
748                                });
749                                this.ganttChart._events.push(
750                                        on(divMove, "mousedown", lang.hitch(this, function(event){
751                                                //start move
752                                                this.moveMoveConn = on(document, "mousemove", lang.hitch(this, function(e){
753                                                        this.checkMove && this.moveItem(e);
754                                                }));
755                                                this.moveUpConn = on(document, "mouseup", lang.hitch(this, function(){
756                                                        if(this.checkMove){
757                                                                this.endMove();
758                                                                this.ganttChart.isMoving = false;
759                                                                document.body.releaseCapture && document.body.releaseCapture();
760                                                                this.moveMoveConn.remove();
761                                                                this.moveUpConn.remove();
762                                                        }
763                                                }));
764                                                this.startMove(event);
765                                                this.ganttChart.isMoving = true;
766                                                document.body.setCapture && document.body.setCapture(false);
767                                        }))
768                                );
769                                this.ganttChart._events.push(
770                                        on(divMove, "mouseover", lang.hitch(this, function(event){
771                                                event.target && (event.target.style.cursor = "move");
772                                        }))
773                                );
774                                this.ganttChart._events.push(
775                                        on(divMove, "mouseout", lang.hitch(this, function(event){
776                                                event.target.style.cursor = "";
777                                        }))
778                                );
779                                this.ganttChart._events.push(
780                                        on(divResize, "mousedown", lang.hitch(this, function(event){
781                                                //start resize
782                                                this.resizeMoveConn = on(document, "mousemove", lang.hitch(this, function(e){
783                                                        this.checkResize && this.resizeItem(e);
784                                                }));
785                                                this.resizeUpConn = on(document, "mouseup", lang.hitch(this, function(){
786                                                        if(this.checkResize){
787                                                                this.endResizeItem();
788                                                                this.ganttChart.isResizing = false;
789                                                                document.body.releaseCapture && document.body.releaseCapture();
790                                                                this.resizeMoveConn.remove();
791                                                                this.resizeUpConn.remove();
792                                                        }
793                                                }));
794                                                this.startResize(event);
795                                                this.ganttChart.isResizing = true;
796                                                document.body.setCapture && document.body.setCapture(false);
797                                        }))
798                                );
799                                this.ganttChart._events.push(
800                                        on(divResize, "mouseover", lang.hitch(this, function(event){
801                                                (!this.ganttChart.isMoving) && (!this.ganttChart.isResizing) && event.target && (event.target.style.cursor = "e-resize");
802                                        }))
803                                );
804                                this.ganttChart._events.push(
805                                        on(divResize, "mouseout", lang.hitch(this, function(event){
806                                                !this.checkResize && event.target && (event.target.style.cursor = "");
807                                        }))
808                                );
809                        }
810                        return itemControl;
811                },
812                createTaskNameItem: function(){
813                        var divName = domConstruct.create("div", {
814                                id: this.taskItem.id,
815                                className: "ganttTaskTaskNameItem",
816                                title: this.taskItem.name + ", id: " + this.taskItem.id + " ",
817                                innerHTML: this.taskItem.name
818                        });
819                        domStyle.set(divName, "top", this.posY + "px");
820                        domAttr.set(divName, "tabIndex", 0);
821                        if(this.ganttChart.isShowConMenu){
822                                this.ganttChart._events.push(
823                                        on(divName, "mouseover", lang.hitch(this, function(event){
824                                                domClass.add(divName, "ganttTaskTaskNameItemHover");
825                                                clearTimeout(this.ganttChart.menuTimer);
826                                                this.ganttChart.tabMenu.clear();
827                                                this.ganttChart.tabMenu.show(event.target, this);
828                                        }))
829                                );
830                                this.ganttChart._events.push(
831                                        on(divName, "keydown", lang.hitch(this, function(event){
832                                                if(event.keyCode == keys.ENTER){
833                                                        this.ganttChart.tabMenu.clear();
834                                                        this.ganttChart.tabMenu.show(event.target, this);
835                                                }
836                                                if(this.ganttChart.tabMenu.isShow && (event.keyCode == keys.LEFT_ARROW || event.keyCode == keys.RIGHT_ARROW)){
837                                                        focus(this.ganttChart.tabMenu.menuPanel.firstChild.rows[0].cells[0]);
838                                                }
839                                                if(this.ganttChart.tabMenu.isShow && event.keyCode == keys.ESCAPE){
840                                                        this.ganttChart.tabMenu.hide();
841                                                }
842                                        }))
843                                );
844                                this.ganttChart._events.push(
845                                        on(divName, "mouseout", lang.hitch(this, function(){
846                                                domClass.remove(divName, "ganttTaskTaskNameItemHover");
847                                                clearTimeout(this.ganttChart.menuTimer);
848                                                this.ganttChart.menuTimer = setTimeout(lang.hitch(this, function(){
849                                                        this.ganttChart.tabMenu.hide();
850                                                }), 200);
851                                        }))
852                                );
853                                this.ganttChart._events.push(
854                                        on(this.ganttChart.tabMenu.menuPanel, "mouseover", lang.hitch(this, function(){
855                                                clearTimeout(this.ganttChart.menuTimer);
856                                        }))
857                                );
858                                this.ganttChart._events.push(
859                                        on(this.ganttChart.tabMenu.menuPanel, "keydown", lang.hitch(this, function(event){
860                                                if(this.ganttChart.tabMenu.isShow && event.keyCode == keys.ESCAPE){
861                                                        this.ganttChart.tabMenu.hide();
862                                                }
863                                        }))
864                                );
865                                this.ganttChart._events.push(
866                                        on(this.ganttChart.tabMenu.menuPanel, "mouseout", lang.hitch(this, function(){
867                                                clearTimeout(this.ganttChart.menuTimer);
868                                                this.ganttChart.menuTimer = setTimeout(lang.hitch(this, function(){
869                                                        this.ganttChart.tabMenu.hide();
870                                                }), 200);
871                                        }))
872                                );
873                        }
874                        return divName;
875                },
876                createTaskDescItem: function(){
877                        var posX = (this.posX + this.taskItem.duration * this.ganttChart.pixelsPerWorkHour + 10);
878                        var divDesc = domConstruct.create("div", {
879                                innerHTML: this.objKeyToStr(this.getTaskOwner()),
880                                className: "ganttTaskDescTask"
881                        });
882                        domStyle.set(divDesc, {
883                                left: posX + "px",
884                                top: this.posY + "px"
885                        });
886                        return this.descrTask = divDesc;
887                },
888                checkWidthTaskNameItem: function(){
889                        if(this.cTaskNameItem[0].offsetWidth + this.cTaskNameItem[0].offsetLeft > this.ganttChart.maxWidthTaskNames){
890                                var width = this.cTaskNameItem[0].offsetWidth + this.cTaskNameItem[0].offsetLeft - this.ganttChart.maxWidthTaskNames;
891                                var countChar = Math.round(width / (this.cTaskNameItem[0].offsetWidth / this.cTaskNameItem[0].firstChild.length));
892                                var tName = this.taskItem.name.substring(0, this.cTaskNameItem[0].firstChild.length - countChar - 3);
893                                tName += "...";
894                                this.cTaskNameItem[0].innerHTML = tName;
895                        }
896                },
897                refreshTaskItem: function(itemControl){
898                        this.posX = this.ganttChart.getPosOnDate(this.taskItem.startTime);
899                        domStyle.set(itemControl, {
900                                "left": this.posX + "px"
901                        });
902                        var divTaskItem = itemControl.childNodes[0];
903                        var tblTaskItem = divTaskItem.firstChild;
904                        tblTaskItem.width = (!this.taskItem.duration ? 1 : this.taskItem.duration * this.ganttChart.pixelsPerWorkHour) + "px";
905                        var rowTblTask = tblTaskItem.rows[0];
906                        if(this.taskItem.percentage != 0){
907                                var cellTblTask = rowTblTask.firstChild;
908                                cellTblTask.height = this.ganttChart.heightTaskItem + "px";
909                                cellTblTask.width = this.taskItem.percentage + "%";
910                                cellTblTask.style.lineHeight = "1px";
911                                var imageProgress = cellTblTask.firstChild;
912                                domStyle.set(imageProgress, {
913                                        width: (!this.taskItem.duration ? 1 : (this.taskItem.percentage * this.taskItem.duration * this.ganttChart.pixelsPerWorkHour / 100)) + "px",
914                                        height: this.ganttChart.heightTaskItem + "px"
915                                });
916                        }
917                        if(this.taskItem.percentage != 100){
918                                var cellTblTask = rowTblTask.lastChild;
919                                cellTblTask.height = this.ganttChart.heightTaskItem + "px";
920                                cellTblTask.width = (100 - this.taskItem.percentage) + "%";
921                                cellTblTask.style.lineHeight = "1px";
922                                var imageProgressFill = cellTblTask.firstChild;
923                                domStyle.set(imageProgressFill, {
924                                        width: (!this.taskItem.duration ? 1 : ((100 - this.taskItem.percentage) * this.taskItem.duration * this.ganttChart.pixelsPerWorkHour / 100)) + "px",
925                                        height: this.ganttChart.heightTaskItem + "px"
926                                });
927                        }
928                        if(this.ganttChart.isContentEditable){
929                                var divTaskInfo = itemControl.childNodes[1];
930                                var tblTaskInfo = divTaskInfo.firstChild;
931                                tblTaskInfo.height = this.ganttChart.heightTaskItem + "px";
932                                tblTaskInfo.width = (!this.taskItem.duration ? 1 : (this.taskItem.duration * this.ganttChart.pixelsPerWorkHour)) + "px";
933                                var rowTaskInfo = tblTaskInfo.rows[0];
934                                var cellTaskInfo = rowTaskInfo.firstChild;
935                                cellTaskInfo.height = this.ganttChart.heightTaskItem + "px";
936                                var divTaskName = itemControl.childNodes[2];
937                                var divMove = divTaskName.firstChild;
938                                divMove.style.height = this.ganttChart.heightTaskItem + "px";
939                                divMove.style.width = (!this.taskItem.duration ? 1 : (this.taskItem.duration * this.ganttChart.pixelsPerWorkHour)) + "px";
940                                //Creation resize area
941                                var divResize = divTaskName.lastChild;
942                                domStyle.set(divResize, {
943                                        "left": (this.taskItem.duration * this.ganttChart.pixelsPerWorkHour - 10) + "px"
944                                });
945                                divResize.style.height = this.ganttChart.heightTaskItem + "px";
946                                divResize.style.width = "10px";
947                        }
948                        return itemControl;
949                },
950                refreshTaskDesc: function(divDesc){
951                        var posX = (this.posX + this.taskItem.duration * this.ganttChart.pixelsPerWorkHour + 10);
952                        domStyle.set(divDesc, {
953                                "left": posX + "px"
954                        });
955                        return divDesc;
956                },
957                refreshConnectingLinesDS: function(arrLines){
958                        var arrowImg = arrLines[1];
959                        var lineVerticalRight = arrLines[0];
960                        //horizontal line
961                        var lineHorizontal = arrLines[2];
962                        var posXPreviousTask = domStyle.get(this.predTask.cTaskItem[0], "left");
963                        var posYPreviousTask = domStyle.get(this.predTask.cTaskItem[0], "top");
964                        var posXChildTask = domStyle.get(this.cTaskItem[0], "left");
965                        var posYChildTask = this.posY + 2;
966                        //width task item
967
968                        var widthPreviousTask = parseInt(this.predTask.cTaskItem[0].firstChild.firstChild.width);
969                        if(posYPreviousTask < posYChildTask){
970                                domStyle.set(lineVerticalRight, {
971                                        "height": (posYChildTask - this.ganttChart.heightTaskItem / 2 - posYPreviousTask - 3) + "px",
972                                        "left": (posXPreviousTask + widthPreviousTask - 20) + "px"
973                                });
974                                domStyle.set(lineHorizontal, {
975                                        "width": (15 + (posXChildTask - (widthPreviousTask + posXPreviousTask))) + "px",
976                                        "left": (posXPreviousTask + widthPreviousTask - 20) + "px"
977                                });
978                       
979                                domStyle.set(arrowImg, {
980                                        "left": (posXChildTask - 7) + "px"
981                                });
982                        }else{
983                                domStyle.set(lineVerticalRight, {
984                                        "height": (posYPreviousTask + 2 - posYChildTask) + "px",
985                                        "left": (posXPreviousTask + widthPreviousTask - 20) + "px"
986                                });
987                                domStyle.set(lineHorizontal, {
988                                        "width": (15 + (posXChildTask - (widthPreviousTask + posXPreviousTask))) + "px",
989                                        "left": (posXPreviousTask + widthPreviousTask - 20) + "px"
990                                });
991                                domStyle.set(arrowImg, {
992                                        "left": (posXChildTask - 7) + "px"
993                                });
994                        }
995                        return arrLines;
996                },
997                postLoadData: function(){
998                        //TODO e.g. task relative info...
999                },
1000                refresh: function(){
1001                        if(this.childTask && this.childTask.length > 0){
1002                                arrayUtil.forEach(this.childTask, function(cTask){
1003                                        cTask.refresh();
1004                                }, this);
1005                        }
1006                        //creation task item
1007                        this.refreshTaskItem(this.cTaskItem[0]);
1008                        this.refreshTaskDesc(this.cTaskItem[0].nextSibling);
1009                        //Create Connecting Lines
1010
1011                        if(this.taskItem.previousTask && this.predTask){
1012                                this.refreshConnectingLinesDS(this.cTaskItem[1]);
1013                        }
1014                        return this;
1015                },
1016                create: function(){
1017                        var containerTasks = this.ganttChart.contentData.firstChild;
1018
1019                        var previousTask = this.taskItem.previousTask;
1020                        var parentTask = this.taskItem.parentTask;
1021                        var isCParentTask = (this.taskItem.cldTasks.length > 0);
1022                        this.cTaskItem = [];
1023                        this.cTaskNameItem = [];
1024                        //creation arrTasks
1025                        if(!parentTask){
1026                                if(this.taskItem.previousParentTask){
1027                                        this.previousParentTask = this.project.getTaskById(this.taskItem.previousParentTask.id);
1028                                        var lastChildTask = this.ganttChart.getLastChildTask(this.previousParentTask);
1029                                        this.posY = parseInt(lastChildTask.cTaskItem[0].style.top)
1030                                                + this.ganttChart.heightTaskItem + this.ganttChart.heightTaskItemExtra;
1031                                        this.previousParentTask.nextParentTask = this;
1032                                }else{
1033                                        this.posY = parseInt(this.project.projectItem[0].style.top)
1034                                                + this.ganttChart.heightTaskItem + this.ganttChart.heightTaskItemExtra;
1035                                }
1036                        }
1037                        if(parentTask){
1038                                var task = this.project.getTaskById(this.taskItem.parentTask.id);
1039                                this.parentTask = task;
1040                       
1041                                if(this.taskItem.previousChildTask){
1042                                        this.previousChildTask = this.project.getTaskById(this.taskItem.previousChildTask.id);
1043                                        var lastChildTask = this.ganttChart.getLastChildTask(this.previousChildTask);
1044                                        this.posY = domStyle.get(lastChildTask.cTaskItem[0], "top")
1045                                                + this.ganttChart.heightTaskItem + this.ganttChart.heightTaskItemExtra;
1046                                        this.previousChildTask.nextChildTask = this;
1047                                }else{
1048                                        this.posY = domStyle.get(task.cTaskItem[0], "top")
1049                                                + this.ganttChart.heightTaskItem + this.ganttChart.heightTaskItemExtra;
1050                                }
1051                                task.childTask.push(this);
1052                        }
1053                        if(previousTask){
1054                                var task = this.project.getTaskById(previousTask.id);
1055                                this.predTask = task;
1056                                task.childPredTask.push(this);
1057                        }
1058                        //creation task item
1059                        this.cTaskItem.push(this.createTaskItem());
1060                        containerTasks.appendChild(this.cTaskItem[0]);
1061                        if(this.ganttChart.panelNames){
1062                                this.cTaskNameItem.push(this.createTaskNameItem());
1063                                this.ganttChart.panelNames.firstChild.appendChild(this.cTaskNameItem[0]);
1064                        }
1065                        containerTasks.appendChild(this.createTaskDescItem());
1066                        //Create Connecting Lines
1067                        var arrConnectingLines = [];
1068                        if(previousTask){
1069                                arrConnectingLines = this.createConnectingLinesDS();
1070                        }
1071                        this.cTaskItem.push(arrConnectingLines);
1072                        if(this.ganttChart.panelNames){
1073                                //Create Connecting Lines
1074                                var arrConnectingLinesNames = [];
1075                                if(parentTask){
1076                                        this.cTaskNameItem[0].style.left = domStyle.get(this.parentTask.cTaskNameItem[0], "left") + 15 + "px";
1077                                        arrConnectingLinesNames = this.createConnectingLinesPN();
1078                                }
1079                                this.checkWidthTaskNameItem();
1080                                //Identifier
1081                                this.checkPosition();
1082                                var treeImg = null;
1083                                if(isCParentTask){
1084                                        treeImg = this.createTreeImg();
1085                                }
1086                                this.cTaskNameItem.push(arrConnectingLinesNames);
1087                                this.cTaskNameItem.push(treeImg);
1088                        }
1089                        this.adjustPanelTime();
1090                        return this;
1091                },
1092                checkPosition: function(){
1093                        //task name position: check Task Identifier
1094                        if(!this.ganttChart.withTaskId){
1095                                return;
1096                        }
1097                        var pos = domGeometry.getMarginBox(this.cTaskNameItem[0], true);
1098                        if(this.taskIdentifier){
1099                                if(this.childTask && this.childTask.length > 0){
1100                                        arrayUtil.forEach(this.childTask, function(cTask){
1101                                                cTask.checkPosition();
1102                                        }, this);
1103                                }
1104                                domStyle.set(this.taskIdentifier, {
1105                                        "left": (pos.l + pos.w + 4) + "px",
1106                                        "top": (pos.t - 1) + "px"
1107                                });
1108                        }else{
1109                                this.taskIdentifier = domConstruct.create("div", {
1110                                        id: "TaskId_" + this.taskItem.id,
1111                                        className: "ganttTaskIdentifier",
1112                                        title: this.taskItem.id,
1113                                        innerHTML: this.taskItem.id
1114                                }, this.cTaskNameItem[0].parentNode);
1115                                domStyle.set(this.taskIdentifier, {
1116                                        left: (pos.l + pos.w + 4) + "px",
1117                                        top: (pos.t - 1) + "px"
1118                                });
1119                        }
1120                },
1121                createTreeImg: function(){
1122                        var treeImg = domConstruct.create("div", {
1123                                id: this.taskItem.id,
1124                                className: "ganttImageTreeCollapse"
1125                        });
1126                        domAttr.set(treeImg, "tabIndex", 0);
1127                        arrayUtil.forEach(["click", "keydown"], function(e){
1128                                this.ganttChart._events.push(
1129                                        on(treeImg, e, lang.hitch(this, function(evt){
1130                                                if(e == "keydown" && evt.keyCode != keys.ENTER){ return; }
1131                                                if(this.isExpanded){
1132                                                        domClass.remove(treeImg, "ganttImageTreeCollapse");
1133                                                        domClass.add(treeImg, "ganttImageTreeExpand");
1134                                                        this.isExpanded = false;
1135                                                        this.hideChildTasks(this);
1136                                                        this.shiftCurrentTasks(this, -this.hideTasksHeight);
1137                                                        this.ganttChart.checkPosition();
1138                                                }else{
1139                                                        domClass.remove(treeImg, "ganttImageTreeExpand");
1140                                                        domClass.add(treeImg, "ganttImageTreeCollapse");
1141                                                        this.isExpanded = true;
1142                                                        this.shiftCurrentTasks(this, this.hideTasksHeight);
1143                                                        this.showChildTasks(this, true);
1144                                                        this.hideTasksHeight = 0;
1145                                                        this.ganttChart.checkPosition();
1146                                                }
1147                                        }))
1148                                );
1149                        }, this);
1150                        this.ganttChart.panelNames.firstChild.appendChild(treeImg);
1151                        domClass.add(treeImg, "ganttTaskTreeImage");
1152                        domStyle.set(treeImg, {
1153                                left: (domStyle.get(this.cTaskNameItem[0], "left") - 12) + "px",
1154                                top: (domStyle.get(this.cTaskNameItem[0], "top") + 3) + "px"
1155                        });
1156                        return treeImg;
1157                },
1158                setPreviousTask: function(previousTaskId){
1159                        if(previousTaskId == ""){
1160                                this.clearPredTask();
1161                        }else{
1162                                var task = this.taskItem;
1163                                if(task.id == previousTaskId){
1164                                        return false;
1165                                }
1166                                var predTaskObj = this.project.getTaskById(previousTaskId);
1167                                if(!predTaskObj){
1168                                        return false;
1169                                }
1170                                var predTask = predTaskObj.taskItem;
1171                                var a1 = predTask.parentTask == null, a2 = task.parentTask == null;
1172                                if(a1 && !a2 || !a1 && a2 || !a1 && !a2 && (predTask.parentTask.id != task.parentTask.id)){
1173                                        return false;
1174                                }
1175                                //check time
1176                                var startTime = task.startTime.getTime(),
1177                                        pest = predTask.startTime.getTime(),
1178                                        pdur = predTask.duration * 24 * 60 * 60 * 1000 / predTaskObj.ganttChart.hsPerDay;
1179                                if((pest+pdur) > startTime){
1180                                        return false;
1181                                }
1182                                // remove current connection
1183                                this.clearPredTask();
1184                                if(!this.ganttChart.checkPosPreviousTask(predTask, task)){
1185                                        this.ganttChart.correctPosPreviousTask(predTask, task, this);
1186                                }
1187                                task.previousTaskId = previousTaskId;
1188                                task.previousTask = predTask;
1189                                this.predTask = predTaskObj;
1190                                predTaskObj.childPredTask.push(this);
1191                                this.cTaskItem[1] = this.createConnectingLinesDS();
1192                        }
1193                        return true;
1194                },
1195                clearPredTask: function(){
1196                        if(this.predTask){
1197                                var ch = this.predTask.childPredTask;
1198                                for(var i = 0; i < ch.length; i++){
1199                                        if(ch[i] == this){
1200                                                ch.splice(i, 1);
1201                                                break;
1202                                        }
1203                                }
1204                                for(var i = 0; i < this.cTaskItem[1].length; i++){
1205                                        this.cTaskItem[1][i].parentNode.removeChild(this.cTaskItem[1][i]);
1206                                }
1207                                this.cTaskItem[1] = [];
1208                                this.taskItem.previousTaskId = null;
1209                                this.taskItem.previousTask = null;
1210                                this.predTask = null;
1211                        }
1212                },
1213                setStartTime: function(startTime, shiftChild){
1214                        this.moveChild = shiftChild;
1215                        this.getMoveInfo();
1216                        var pos = this.ganttChart.getPosOnDate(startTime);
1217                        if((parseInt(this.cTaskItem[0].firstChild.firstChild.width) + pos > this.maxPosXMove) && (this.maxPosXMove != -1)){
1218                                this.maxPosXMove = -1;
1219                                this.minPosXMove = -1;
1220                                return false;
1221                        }
1222                        if(pos < this.minPosXMove){
1223                                this.maxPosXMove = -1;
1224                                this.minPosXMove = -1;
1225                                return false;
1226                        }
1227                        this.cTaskItem[0].style.left = pos;
1228                        var width = pos - this.posX;
1229                        this.moveCurrentTaskItem(width, shiftChild);
1230                        this.project.shiftProjectItem();
1231                        this.descrTask.innerHTML = this.objKeyToStr(this.getTaskOwner());
1232                        this.adjustPanelTime();
1233                        this.posX = 0;
1234                        this.maxPosXMove = -1;
1235                        this.minPosXMove = -1;
1236                        return true;
1237                },
1238                setDuration: function(duration){
1239                        this.getResizeInfo();
1240                        var width = this.ganttChart.getWidthOnDuration(duration);
1241                        if((width > this.maxWidthResize) && (this.maxWidthResize != -1)){
1242                                return false;
1243                        }else if(width < this.minWidthResize){
1244                                return false;
1245                        }else{
1246                                this.taskItemWidth = parseInt(this.cTaskItem[0].firstChild.firstChild.width);
1247                                this.resizeTaskItem(width);
1248                                this.endResizeItem();
1249                                this.descrTask.innerHTML = this.objKeyToStr(this.getTaskOwner());
1250                                return true;
1251                        }
1252                },
1253                setTaskOwner: function(owner){
1254                        owner = (owner == null || owner == undefined) ? "" : owner;
1255                        this.taskItem.taskOwner = owner;
1256                        this.descrTask.innerHTML = this.objKeyToStr(this.getTaskOwner());
1257                        return true;
1258                },
1259                setPercentCompleted: function(percentage){
1260                        percentage = parseInt(percentage);
1261                        if(isNaN(percentage) || percentage > 100 || percentage < 0){
1262                                return false;
1263                        }
1264                        var trow = this.cTaskItem[0].childNodes[0].firstChild.rows[0],
1265                                rc0 = trow.cells[0], rc1 = trow.cells[1];
1266                        if((percentage != 0) && (percentage != 100)){
1267                                if((this.taskItem.percentage != 0) && (this.taskItem.percentage != 100)){
1268                                        rc0.width = percentage + "%";
1269                                        rc1.width = 100 - percentage + "%";
1270                                }else if((this.taskItem.percentage == 0) || (this.taskItem.percentage == 100)){
1271                                        rc0.parentNode.removeChild(rc0);
1272                                        var cellTblTask = domConstruct.create("td", {
1273                                                height: this.ganttChart.heightTaskItem + "px",
1274                                                width: percentage + "%"
1275                                        }, trow);
1276                                        cellTblTask.style.lineHeight = "1px";
1277                                        var imageProgressFill = domConstruct.create("div", {
1278                                                className: "ganttImageTaskProgressFilled"
1279                                        }, cellTblTask);
1280                                        domStyle.set(imageProgressFill, {
1281                                                width: (percentage * this.taskItem.duration * this.ganttChart.pixelsPerWorkHour) / 100 + "px",
1282                                                height: this.ganttChart.heightTaskItem + "px"
1283                                        });
1284                               
1285                                        cellTblTask = domConstruct.create("td", {
1286                                                height: this.ganttChart.heightTaskItem + "px",
1287                                                width: (100 - percentage) + "%"
1288                                        }, trow);
1289                                        cellTblTask.style.lineHeight = "1px";
1290                                        imageProgressFill = domConstruct.create("div", {
1291                                                className: "ganttImageTaskProgressBg"
1292                                        }, cellTblTask);
1293                                        domStyle.set(imageProgressFill, {
1294                                                width: ((100 - percentage) * this.taskItem.duration * this.ganttChart.pixelsPerWorkHour) / 100 + "px",
1295                                                height: this.ganttChart.heightTaskItem + "px"
1296                                        });
1297                                }
1298                        }else if(percentage == 0){
1299                                if((this.taskItem.percentage != 0) && (this.taskItem.percentage != 100)){
1300                                        rc0.parentNode.removeChild(rc0);
1301                                        rc1.width = 100 + "%";
1302                                }else{
1303                                        domClass.remove(rc0.firstChild, "ganttImageTaskProgressFilled");
1304                                        domClass.add(rc0.firstChild, "ganttImageTaskProgressBg");
1305                                }
1306                        }else if(percentage == 100){
1307                                if((this.taskItem.percentage != 0) && (this.taskItem.percentage != 100)){
1308                                        rc1.parentNode.removeChild(rc1);
1309                                        rc0.width = 100 + "%";
1310                                }else{
1311                                        domClass.remove(rc0.firstChild, "ganttImageTaskProgressBg");
1312                                        domClass.add(rc0.firstChild, "ganttImageTaskProgressFilled");
1313                                }
1314                        }
1315                        this.taskItem.percentage = percentage;
1316                        this.taskItemWidth = parseInt(this.cTaskItem[0].firstChild.firstChild.width);
1317                        this.resizeTaskItem(this.taskItemWidth);
1318                        this.endResizeItem();
1319                        this.descrTask.innerHTML = this.objKeyToStr(this.getTaskOwner());
1320                        return true;
1321                },
1322                setName: function(name){
1323                        if(name){
1324                                this.taskItem.name = name;
1325                                this.cTaskNameItem[0].innerHTML = name;
1326                                this.cTaskNameItem[0].title = name;
1327                                this.checkWidthTaskNameItem();
1328                                this.checkPosition();
1329                                this.descrTask.innerHTML = this.objKeyToStr(this.getTaskOwner());
1330                                this.adjustPanelTime();
1331                        }
1332                }
1333        });
1334});
Note: See TracBrowser for help on using the repository browser.