diff --git a/htdocs/includes/jsgantt/jsgantt.css b/htdocs/includes/jsgantt/jsgantt.css index 7acf9318347..78a7e83e971 100644 --- a/htdocs/includes/jsgantt/jsgantt.css +++ b/htdocs/includes/jsgantt/jsgantt.css @@ -1,53 +1,242 @@ +/* Sample CSS for jsGanttImproved v1.7.3 */ +div.gantt { font-family:tahoma, arial, verdana, Sans-serif; font-size:10px; color: #2F2F2F; } -// These are the class/styles used by various objects in GanttChart. However, Firefox has problems deciphering class style when DIVs are embedded in other DIVs. +.gantt table { border-collapse: collapse; } +.gantt td { padding: 0px; } -// GanttChart makes heavy use of embedded DIVS, thus the style are often embedded directly in the objects html. If this could be resolved with Firefox, it would +/* cell defaults */ +.gmajorheading, +.gminorheading, +.gminorheadingwkend, +.gtaskcell, +.gtaskcellwkend { height: 19px; font-size: 12px; border: #efefef 1px solid; text-align: center; cursor: default } +.gtasklist { height: 19px; min-width: 5px; max-width: 5px; width: 5px; border: #efefef 1px solid; border-right: none; } /* all three width values set just to make sure - helps resizing code */ -// make alot of the code look simpleer/cleaner without all the embedded styles +/* Additional values for some cell elements */ +.gtaskheading, +.gmajorheading, +.gminorheading { background-color: #ffffff; font-weight: bold; font-size: 9px; white-space: nowrap; } +.gtaskcellwkend, +.gminorheadingwkend { background-color: #f7f7f7; font-weight: bold; font-size: 9px; white-space: nowrap; } +td.gtaskcell { text-align: left } +td.gspanning { border-left: none; border-right: none; } +.gtaskcelldiv { position: relative; } + +/* Task list defaults */ +.gtaskheading, +.gname, +.gtaskname, +.gresource, +.gduration, +.gpccomplete, +.gstartdate, +.genddate { height: 18px; white-space: nowrap; border: #efefef 1px solid; } + +/* Additional values for some task list elements */ +.gresource, +.gduration, +.gpccomplete, +.gstartdate div, /* needed for IE8 */ +.gstartdate { text-align: center; min-width: 70px; max-width: 70px; width: 70px; font-size: 10px; } +.genddate div, /* needed for IE8 */ +.genddate { text-align: center; min-width: 70px; max-width: 70px; width: 70px; font-size: 10px; } +.gtaskheading { text-align: center; } +.gtaskname div, /* needed for IE8 */ +.gtaskname { min-width: 170px; max-width: 170px; width: 170px;/* font-size: 9px;*/ border-left: none; } + +.gselector { text-align: left; white-space: nowrap; min-width: 170px; max-width: 170px; width: 170px; } + +.gformlabel { position:relative; top:0px; cursor:pointer; border: #ffffff 1px solid; margin-left: 2px; padding-left: 2px; padding-right: 2px; } +span.gformlabel:hover, +span.gselected { background-color: #dbecff; border: #cccccc 1px solid;} + +span.gfoldercollapse { color:#000000; cursor:pointer; font-weight:bold; font-size: 12px; font-family: Courier, "Courier New", monospace; } + +.gtasktableh, +.gtasktable { border-right: #efefef 1px solid; } +.gcharttable { border: #efefef 1px solid; } /* for some reason firefox needs this */ + +/* Differentiate Group, Milestone and Ordinary task items (applied to row) */ +.ggroupitem { background-color: #fbfbfb; font-weight: bold; } +.gmileitem, +.glineitem { background-color: #ffffff; } + +/* highlight row (applied to row) */ +.gitemhighlight td { background-image: none; background-color: #fffaaa;} + +/* task bar caption text styles */ +.gmilecaption, +.ggroupcaption, +.gcaption { font-weight: normal; font-size: 9px; text-align: left; white-space: nowrap; top:1px; position: absolute; top:2px; } + +.ggroupcaption, +.gcaption { right: -126px; } + +/* Task complete %age bar shared attributes */ +.gtaskcomplete { float:left; overflow: hidden; } + +/* Task complete %age bar */ +.gtaskcomplete { height:5px; background-color:#000000; margin-top:4px; opacity:0.4; filter: alpha(opacity=40); } + +/* Milestones */ +.gmilestone { font-size: 14px; position: absolute; top: -2px; } +.gmdtop { top: 2px; overflow: hidden; width:0px; height:0px; border-bottom: 5px solid black; border-left: 5px solid transparent; border-top: 5px solid transparent; border-right: 5px solid transparent;} +.gmdbottom { top: 2px; overflow: hidden; width:0px; height:0px; border-top: 5px solid black; border-left: 5px solid transparent; border-bottom: 5px solid transparent; border-right: 5px solid transparent;} + +/* Task bar shared attributes */ +.ggroupblack, +.gtaskblue, +.gtaskred, +.gtaskgreen, +.gtaskyellow, +.gtaskpurple, +.gtaskpink { height: 13px; filter: alpha(opacity=90); opacity:0.9; margin-top: 1px; } + +/* Task bars - ggroupblack is set as the default class on the task if it is undefined */ +.ggroupblack { height: 7px; background: #000000; margin-top: 2px; } +.ggroupblackendpointleft { overflow: hidden; width:0px; height:0px; top: 2px; border-top: 4px solid black; border-left: 4px solid transparent; border-bottom: 4px solid transparent; border-right: 4px solid transparent; float: left; } +.ggroupblackendpointright { overflow: hidden; width:0px; height:0px; top: 2px; border-top: 4px solid black; border-left: 4px solid transparent; border-bottom: 4px solid transparent; border-right: 4px solid transparent; float: right; } +.ggroupblackcomplete { float:left; overflow: hidden; height:3px; filter: alpha(opacity=80); opacity:0.8; background-color:#777777; margin-top:2px; margin-bottom: 2px; } +.gtaskblue { + background: rgb(58,132,195); /* Old browsers */ + background: linear-gradient(to bottom, rgba(58,132,195,1) 0%,rgba(65,154,214,1) 20%,rgba(75,184,240,1) 40%,rgba(58,139,194,1) 70%,rgba(38,85,139,1) 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#4bb8f0', endColorstr='#3a84c3',GradientType=0 ); /* IE6-9 */ +} +.gtaskred { + background: rgb(196,58,58); /* Old browsers */ + background: linear-gradient(to bottom, rgba(196,58,58,1) 0%,rgba(211,65,65,1) 20%,rgba(239,76,76,1) 40%,rgba(196,58,58,1) 70%,rgba(135,37,37,1) 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ef4c4c', endColorstr='#c43a3a',GradientType=0 ); /* IE6-9 */ +} +.gtaskgreen { + background: rgb(80,193,58); /* Old browsers */ + background: linear-gradient(to bottom, rgba(80,193,58,1) 0%,rgba(88,209,64,1) 20%,rgba(102,237,75,1) 40%,rgba(80,193,58,1) 70%,rgba(53,132,37,1) 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#66ED4B', endColorstr='#50c13a',GradientType=0 ); /* IE6-9 */ +} +.gtaskyellow { + background: rgb(247,228,56); /* Old browsers */ + background: linear-gradient(to bottom, rgba(247,228,56,1) 0%,rgba(239,239,55,1) 20%,rgba(255,255,58,1) 40%,rgba(242,236,55,1) 70%,rgba(241,218,54,1) 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffff3a', endColorstr='#f7e438',GradientType=0 ); /* IE6-9 */ +} +.gtaskpurple { + background: rgb(193,58,193); /* Old browsers */ + background: linear-gradient(to bottom, rgba(193,58,193,1) 0%,rgba(211,65,211,1) 20%,rgba(239,76,239,1) 40%,rgba(193,58,193,1) 70%,rgba(137,38,137,1) 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ef4cef', endColorstr='#892689',GradientType=0 ); /* IE6-9 */ +} +.gtaskpink { + background: rgb(249,177,245); /* Old browsers */ + background: linear-gradient(to bottom, rgba(249,177,245,1) 0%,rgba(247,192,243,1) 20%,rgba(247,202,244,1) 40%,rgba(249,192,246,1) 70%,rgba(252,174,247,1) 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f7caf4', endColorstr='#fcaef7',GradientType=0 ); /* IE6-9 */ +} +.gtaskbluecomplete, +.gtaskredcomplete, +.gtaskgreencomplete, +.gtaskyellowcomplete, +.gtaskpurplecomplete, +.gtaskpinkcomplete { float:left; overflow: hidden; height:5px; filter: alpha(opacity=40); opacity:0.4; background-color: #000000; margin-top:4px; } + +/* Printer friendly styles - we could use these all the time but they are not as pretty! */ +/* note that "@media print" is not supported in IE6 or 7. Fully patched IE8 should be OK */ +@media print { + .ggroupblack { height:0px; border-top: 7px solid; border-color: #000000; } + .gtaskblue { height:0px; border-top: 13px solid; border-color: rgb(58,132,195); } + .gtaskred { height:0px; border-top: 13px solid; border-color: rgb(196,58,58); } + .gtaskgreen { height:0px; border-top: 13px solid; border-color: rgb(80,193,58); } + .gtaskyellow { height:0px; border-top: 13px solid; border-color: rgb(247,228,56); } + .gtaskpurple { height:0px; border-top: 13px solid; border-color: rgb(193,58,193); } + .gtaskpink { height:0px; border-top: 13px solid; border-color: rgb(249,177,245); } + + .gtaskbluecomplete, + .gtaskredcomplete, + .gtaskgreencomplete, + .gtaskyellowcomplete, + .gtaskpurplecomplete, + .gtaskpinkcomplete { height:0px; filter: alpha(opacity=40); opacity:0.4; margin-top: -9px; border-top: 5px solid; border-color: #000000; } + .ggroupblackcomplete { height: 0px; filter: alpha(opacity=80); opacity:0.8; margin-top:-5px; border-top:3px solid; border-color:#777777; } +} + +/* END Task bar styles */ +.glinev { border-left: 1px solid; width: 0px; } +.glineh { border-top: 1px solid; height: 0px; } + +.gDepFS, +.gDepSS, +.gDepSF, +.gDepFF { border-color: #26558b; } +.gDepFSArw, +.gDepSSArw { overflow: hidden; width:0px; height:0px; border-bottom: 4px solid transparent; border-left: 4px solid #26558b; border-top: 4px solid transparent; border-right: 4px solid transparent;} +.gDepFFArw, +.gDepSFArw { overflow: hidden; width:0px; height:0px; border-bottom: 4px solid transparent; border-left: 4px solid transparent; border-top: 4px solid transparent; border-right: 4px solid #26558b;} +.gCurDate { border-color: #0000ff; } +div.gtaskbarcontainer { z-index: 1; position: absolute; top: 0px } -..gantt { font-family:tahoma, arial, verdana; font-size:10px;} +.JSGanttToolTip {position: absolute; display: block; z-index: 2;} +.JSGanttToolTipcont {font-family: tahoma, arial, verdana; font-size: 10px; display: block; background: #ffffff; color: #656565} +.gTaskInfo {background: #dbecff; width: 400px; border: #656565 1px solid; border-radius: 10px; padding: 4px 6px 4px 6px; float: left;} +.gTtTitle {display: block; font-size: 12px; font-weight: bold; color: #404040; margin-left: 4px; margin-bottom: 1em;} +.gTaskLabel {font-size: 11px; font-weight: bold; color: #656565; margin-left: 4px;} +.gTaskText {position:absolute; left: 90px; padding-top: 1px; font-size: 10px; font-weight: normal; color: #656565;} +.gTaskNotes {font-size: 11px; font-weight: normal; color: #323232; padding: 0 15px; display: block;} +.gTIn {padding-top: 10px;} -..gdatehead { BORDER-TOP: #efefef 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #efefef 1px solid; HEIGHT: 18px } +.gantt { min-width: 1064px; /* 2x LC width */ } +.gchartcontainer { padding-left: 532px; /* LC width */ } +.gcontainercol { position: relative; float: left; } /* Add a max-height value here if wanted */ +.glistgrid { width: 532px; /* LC width */ margin-left: -100%; right: 532px; /* LC width */ padding-right: 0px; padding-left: 0px; padding-bottom: 0px; padding-top: 0px; background-color: #ffffff; overflow: hidden; } +.glistlbl { width: 532px; /* LC width */ margin-left: -100%; right: 532px; /* LC width */ padding-right: 0px; padding-left: 0px; padding-bottom: 0px; padding-top: 0px; background-color: #ffffff; overflow: hidden; } +.glabelfooter { clear: both; } +.ggridfooter { clear: both; } -..ghead { BORDER-TOP: #efefef 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #efefef 1px solid; WIDTH: 24px; HEIGHT: 20px } +/*.rhscrpad { width: 150px; position: absolute; top: 0px; height: 1px; }*/ -..gname { BORDER-TOP: #efefef 1px solid; FONT-SIZE: 12px; WIDTH: 18px; HEIGHT: 18px } +.gchartgrid { width: 100%; padding-right: 0px; padding-left: 0px; padding-bottom: 0px; padding-top: 0px; background-color: #ffffff; position: relative; overflow: auto; min-height: 0%; } +.gchartlbl { width: 100%; padding-right: 0px; padding-left: 0px; padding-bottom: 0px; padding-top: 0px; background-color: #ffffff; position: relative; overflow: hidden; } -..ghead A { FONT-SIZE: 10px; COLOR: #000000; TEXT-DECORATION: none } +/* Old Internet Explorer version hacks */ +.gantt { _height: 100% } /* otherwise the chart disappears! */ +div .gantt { _width: 1064px; } /* ie6 fixed width */ +div.gchartlbl, +div.gchartgrid { _width: 532px; } /* ie6 fixed width */ +div.glistlbl, +div.glistgrid { + *right: 0px; /* ie7 pulls the content too far left with the negative margin */ + _right: 532px; /* but ie6 fixed width needs this */ + _margin-left: -532px; /* ie6 fixed width */ +} +div.gchartgrid { *padding-bottom: 20px; *overflow-y: hidden; } /* variable height design, no need for vertical scroll */ +td.gmajorheading div { *overflow: hidden; } /* stops resizing fixed width columns if the text is too wide */ +td.gspanning div { *overflow: hidden; } /* stops resizing fixed width columns if the text is too wide */ -..gheadwkend A { FONT-SIZE: 10px; COLOR: #000000; TEXT-DECORATION: none } +/* border transparency tricks */ +.ggroupblackendpointleft { _border-top: 4px solid black; _border-left: 4px solid pink; _border-bottom: 4px solid pink; _border-right: 4px solid pink; _filter: chroma(color=pink); } +.ggroupblackendpointright { _border-top: 4px solid black; _border-left: 4px solid pink; _border-bottom: 4px solid pink; _border-right: 4px solid pink;_filter: chroma(color=pink); } -..gheadwkend { BORDER-TOP: #efefef 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #efefef 1px solid; WIDTH: 24px; HEIGHT: 20px; background-color: #cfcfcf } +.gmdtop { _border-left: 5px solid pink; _border-top: 5px solid pink; _border-right: 5px solid pink; _filter: chroma(color=pink);} +.gmdbottom { _border-left: 5px solid pink; _border-bottom: 5px solid pink; _border-right: 5px solid pink; _filter: chroma(color=pink);} -..gfiller { BORDER-TOP: #efefef 1px solid; BORDER-LEFT: #efefef 1px solid; WIDTH: 18px; HEIGHT: 18px } +.gDepFSArw, +.gDepSSArw { _border-bottom: 4px solid pink; _border-top: 4px solid pink; _border-right: 4px solid pink; _filter: chroma(color=pink);} +.gDepFFArw, +.gDepSFArw { _border-bottom: 4px solid pink; _border-left: 4px solid pink; _border-top: 4px solid pink; _filter: chroma(color=pink);} -..gfillerwkend { BORDER-LEFT: #efefef 1px solid; WIDTH: 18px; HEIGHT: 18px; BACKGROUND-COLOR: #cfcfcf } - -..gitem { BORDER-TOP: #cccccc 1px solid; WIDTH: 18px; HEIGHT: 18px } - -..gitemwkend { BORDER-TOP: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; WIDTH: 18px; HEIGHT: 18px } - -..gmilestone { BORDER-TOP: #efefef 1px solid; FONT-SIZE: 14px; OVERFLOW: hidden; BORDER-LEFT: #efefef 1px solid; WIDTH: 18px; HEIGHT: 18px} - -..gmilestonewkend { BORDER-TOP: #efefef 1px solid; BORDER-LEFT: #cccccc 1px solid; WIDTH: 18px; HEIGHT: 18px} - -..btn { BORDER-RIGHT: #ffffff; BORDER-TOP: #ffffff; FONT-WEIGHT: bold; FONT-SIZE: 10px; BORDER-LEFT: #ffffff; WIDTH: 12px; COLOR: #cccccc; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: #ffffff } - -..hrcomplete { BORDER-RIGHT: #000000 2px solid; PADDING-RIGHT: 0px; BORDER-TOP: #000000 2px solid; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; BORDER-LEFT: #000000 2px solid; WIDTH: 20px; COLOR: #000000; PADDING-TOP: 0px; BORDER-BOTTOM: #000000 2px solid; HEIGHT: 4px } - -..hrhalfcomplete { BORDER-RIGHT: #000000 2px solid; BORDER-TOP: #000000 2px solid; BORDER-LEFT: #000000 2px solid; WIDTH: 9px; COLOR: #000000; BORDER-BOTTOM: #000000 2px solid; HEIGHT: 4px } - -..gweekend { font-family:tahoma, arial, verdana; font-size:11px; background-color:#EEEEEE; text-align:center; } - -..gtask { font-family:tahoma, arial, verdana; font-size:11px; background-color:#00FF00; text-align:center; } - -..gday { font-family:tahoma, arial, verdana; font-size:11px; text-align:center; } - -..gcomplete { background-color:black; height:5px; overflow: auto; margin-top:4px; } - -DIV.scroll { BORDER-RIGHT: #efefef 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: #efefef 1px solid; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; OVERFLOW: hidden; BORDER-LEFT: #efefef 1px solid; WIDTH: 420px; PADDING-TOP: 0px; BORDER-BOTTOM: #efefef 1px solid; BACKGROUND-COLOR: #ffffff } - -DIV.scroll2 { position:relative; PADDING-RIGHT: 0px; overflow:auto ;overflow-x:scroll;overflow-y:hidden; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; WIDTH: 482px; PADDING-TOP: 0px; BACKGROUND-COLOR: #ffffff } +/* Workaround for odd bug in old versions of Opera - no other browser needs this */ +.glinediv {position: absolute; top: 0px; left: 0px;} +/* if using setUseSingleCell(1) the following is a suggested set of CSS3 styles to recreate the table grid - won't work on old browsers +.ggrouphour td, +.gmilehour td, +.gitemhour td { background-size: 19px 1px; background-image: linear-gradient(to left, #efefef, transparent 1px, transparent 18px); width: 100%; height: 19px; } +.ggroupday td, +.gmileday td, +.gitemday td { background-size: 19px 1px, 133px 1px; background-image: linear-gradient(to left, #efefef, transparent 1px, transparent 18px), linear-gradient(to left, #f7f7f7 39px, transparent 1px, transparent 92px); width: 100%; height: 19px; } +.ggroupweek td, +.gmileweek td, +.gitemweek td { background-size: 37px 1px; background-image: linear-gradient(to left, #efefef, transparent 1px, transparent 36px); width: 100%; height: 19px; } +.ggroupmonth td, +.gmilemonth td, +.gitemmonth td { background-size: 37px 1px; background-image: linear-gradient(to left, #efefef, transparent 1px, transparent 36px); width: 100%; height: 19px; } +.ggroupquarter td, +.gmilequarter td, +.gitemquarter td { background-size: 19px 1px; background-image: linear-gradient(to left, #efefef, transparent 1px, transparent 18px); width: 100%; height: 19px; } +*/ diff --git a/htdocs/includes/jsgantt/jsgantt.js b/htdocs/includes/jsgantt/jsgantt.js index 2447a068bf7..3360d832ec6 100644 --- a/htdocs/includes/jsgantt/jsgantt.js +++ b/htdocs/includes/jsgantt/jsgantt.js @@ -1,2315 +1,2575 @@ /* -Copyright (c) 2009, Shlomy Gantz BlueBrick Inc. All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of Shlomy Gantz or BlueBrick Inc. nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY SHLOMY GANTZ/BLUEBRICK INC. ''AS IS'' AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL SHLOMY GANTZ/BLUEBRICK INC. BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -* -* LDR Modified to replace hard coded values by i18[key] -*/ + _ ___ _____ _ _____ ____ ____ + (_) / _ \ \_ \ / ||___ | ___| |___ \ + | |/ /_\/ / /\/ | | / /|___ \ __) | + | / /_\\/\/ /_ | |_ / /_ ___) | / __/ + _/ \____/\____/ |_(_)_/(_)____(_)_____| + |__/ + jsGanttImproved 1.7.5.2 + Copyright (c) 2013-2016, Paul Geldart All rights reserved. -/** -* JSGantt component is a UI control that displays gantt charts based by using CSS and HTML -* @module jsgantt -* @title JSGantt -*/ + The current version of this code can be found at https://code.google.com/p/jsgantt-improved/ -var JSGantt; if (!JSGantt) JSGantt = {}; + * Copyright (c) 2013-2016, Paul Geldart. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Paul Geldart nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY PAUL GELDART. ''AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL PAUL GELDART BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -var vTimeout = 0; -var vBenchTime = new Date().getTime(); + This project is based on jsGantt 1.2, (which can be obtained from + https://code.google.com/p/jsgantt/) and remains under the original BSD license. + The original project license follows: -/** -* Creates a task (one row) in gantt object -* @class TaskItem -* @namespace JSGantt -* @constructor -* @for JSGantt + Copyright (c) 2009, Shlomy Gantz BlueBrick Inc. All rights reserved. -* @param pID {Number} Task unique numeric ID -* @param pName {String} Task Name -* @param pStart {Date} Task start date/time (not required for pGroup=1 ) -* @param pEnd {Date} Task end date/time, you can set the end time to 12:00 to indicate half-day (not required for pGroup=1 ) -* @param pColor {String} Task bar RGB value -* @param pLink {String} Task URL, clicking on the task will redirect to this url. Leave empty if you do not with the Task also serve as a link -* @param pMile {Boolean} Determines whether task is a milestone (1=Yes,0=No) -* @param pRes {String} Resource to perform the task -* @param pComp {Number} Percent complete (Number between 0 and 100) -* @param pGroup {Boolean} -* @param pParent {Number} ID of the parent task -* @param pOpen {Boolean} -* @param pDepend {String} Comma seperated list of IDs this task depends on -* @param pCaption {String} Caption to be used instead of default caption (Resource). -* note : you should use setCaption("Caption") in order to display the caption -* @return void -*/ -JSGantt.TaskItem = function(pID, pName, pStart, pEnd, pColor, pLink, pMile, pRes, pComp, pGroup, pParent, pOpen, pDepend, pCaption) + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Shlomy Gantz or BlueBrick Inc. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY SHLOMY GANTZ/BLUEBRICK INC. ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL SHLOMY GANTZ/BLUEBRICK INC. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +var JSGantt; if (!JSGantt) JSGantt={}; + +var vBenchTime=new Date().getTime(); + +JSGantt.isIE=function () { - -/** -* The name of the attribute. -* @property vID -* @type String -* @default pID -* @private -*/ -var vID = pID; - -/** -* @property vName -* @type String -* @default pName -* @private -*/ -var vName = pName; - -/** -* @property vStart -* @type Datetime -* @default new Date() -* @private -*/ -var vStart = new Date(); - -/** -* @property vEnd -* @type Datetime -* @default new Date() -* @private -*/ -var vEnd = new Date(); - -/** -* @property vColor -* @type String -* @default pColor -* @private -*/ -var vColor = pColor; - -/** -* @property vLink -* @type String -* @default pLink -* @private -*/ -var vLink = pLink; - -/** -* @property vMile -* @type Boolean -* @default pMile -* @private -*/ -var vMile = pMile; - -/** -* @property vRes -* @type String -* @default pRes -* @private -*/ -var vRes = pRes; - -/** -* @property vComp -* @type Number -* @default pComp -* @private -*/ -var vComp = pComp; - -/** -* @property vGroup -* @type Boolean -* @default pGroup -* @private -*/ -var vGroup = pGroup; - -/** -* @property vParent -* @type Number -* @default pParent -* @private -*/ -var vParent = pParent; - -/** -* @property vOpen -* @type Boolean -* @default pOpen -* @private -*/ -var vOpen = pOpen; - -/** -* @property vDepend -* @type String -* @default pDepend -* @private -*/ -var vDepend = pDepend; - -/** -* @property vCaption -* @type String -* @default pCaption -* @private -*/ -var vCaption = pCaption; - -/** -* @property vDuration -* @type Number -* @default '' -* @private -*/ -var vDuration = ''; - -/** -* @property vLevel -* @type Number -* @default 0 -* @private -*/ -var vLevel = 0; - -/** -* @property vNumKid -* @type Number -* @default 0 -* @private -*/ -var vNumKid = 0; - -/** -* @property vVisible -* @type Boolean -* @default 0 -* @private -*/ -var vVisible = 1; - var x1, y1, x2, y2; - - - if (vGroup != 1) - { - vStart = JSGantt.parseDateStr(pStart,g.getDateInputFormat()); - vEnd = JSGantt.parseDateStr(pEnd,g.getDateInputFormat()); - } -/** -* Returns task ID -* @method getID -* @return {Number} -*/ - this.getID = function(){ return vID }; -/** -* Returns task name -* @method getName -* @return {String} -*/ - this.getName = function(){ return vName }; -/** -* Returns task start date -* @method getStart -* @return {Datetime} -*/ - this.getStart = function(){ return vStart}; -/** -* Returns task end date -* @method getEnd -* @return {Datetime} -*/ this.getEnd = function(){ return vEnd }; - -/** -* Returns task bar color (i.e. 00FF00) -* @method getColor -* @return {String} -*/ this.getColor = function(){ return vColor}; - -/** -* Returns task URL (i.e. http://www.jsgantt.com) -* @method getLink -* @return {String} -*/ this.getLink = function(){ return vLink }; - -/** -* Returns whether task is a milestone (1=Yes,0=No) -* @method getMile -* @return {Boolean} -*/ this.getMile = function(){ return vMile }; - -/** -* Returns task dependencies as list of values (i.e. 123,122) -* @method getDepend -* @return {String} -*/ this.getDepend = function(){ if(vDepend) return vDepend; else return null }; - -/** -* Returns task caption (if it exists) -* @method getCaption -* @return {String} -*/ this.getCaption = function(){ if(vCaption) return vCaption; else return ''; }; - -/** -* Returns task resource name as string -* @method getResource -* @return {String} -*/ this.getResource = function(){ if(vRes) return vRes; else return ' '; }; - -/** -* Returns task completion percent as numeric value -* @method getCompVal -* @return {Boolean} -*/ this.getCompVal = function(){ if(vComp) return vComp; else return 0; }; - -/** -* Returns task completion percent as formatted string (##%) -* @method getCompStr -* @return {String} -*/ this.getCompStr = function(){ if(vComp) return vComp+'%'; else return ''; }; - -/** -* Returns task duration as a fortmatted string based on the current selected format -* @method getDuration -* @param vFormat {String} selected format (minute,hour,day,week,month) -* @return {String} -*/ this.getDuration = function(vFormat){ - if (vMile) - vDuration = '-'; - else if (vFormat=='hour') - { - tmpPer = Math.ceil((this.getEnd() - this.getStart()) / ( 60 * 60 * 1000) ); - if(tmpPer == 1) - vDuration = '1 '+i18n["sHour"]; - else - vDuration = tmpPer + ' '+i18n["sHours"]; - } - - else if (vFormat=='minute') - { - tmpPer = Math.ceil((this.getEnd() - this.getStart()) / ( 60 * 1000) ); - if(tmpPer == 1) - vDuration = '1 '+i18n["sMinute"]; - else - vDuration = tmpPer + ' '+i18n["sMinutes"]; - } - - else { //if(vFormat == 'day') { - tmpPer = Math.ceil((this.getEnd() - this.getStart()) / (24 * 60 * 60 * 1000) + 1); - if(tmpPer == 1) vDuration = '1 '+i18n["sDay"]; - else vDuration = tmpPer + ' '+i18n["sDays"]; - } - - //else if(vFormat == 'week') { - // tmpPer = ((this.getEnd() - this.getStart()) / (24 * 60 * 60 * 1000) + 1)/7; - // if(tmpPer == 1) vDuration = '1 Week'; - // else vDuration = tmpPer + ' Weeks'; - //} - - //else if(vFormat == 'month') { - // tmpPer = ((this.getEnd() - this.getStart()) / (24 * 60 * 60 * 1000) + 1)/30; - // if(tmpPer == 1) vDuration = '1 Month'; - // else vDuration = tmpPer + ' Months'; - //} - - //else if(vFormat == 'quater') { - // tmpPer = ((this.getEnd() - this.getStart()) / (24 * 60 * 60 * 1000) + 1)/120; - // if(tmpPer == 1) vDuration = '1 Qtr'; - // else vDuration = tmpPer + ' Qtrs'; - //} - return( vDuration ) - }; - -/** -* Returns task parent ID -* @method getParent -* @return {Number} -*/ this.getParent = function(){ return vParent }; - -/** -* Returns whether task is a group (1=Yes,0=No) -* @method getGroup -* @return {Number} -*/ this.getGroup = function(){ return vGroup }; - -/** -* Returns whether task is open (1=Yes,0=No) -* @method getOpen -* @return {Boolean} -*/ this.getOpen = function(){ return vOpen }; - -/** -* Returns task tree level (0,1,2,3...) -* @method getLevel -* @return {Boolean} -*/ this.getLevel = function(){ return vLevel }; - -/** -* Returns the number of child tasks -* @method getNumKids -* @return {Number} -*/ this.getNumKids = function(){ return vNumKid }; - /** -* Returns the X position of the left side of the task bar on the graph (right side) -* @method getStartX -* @return {Number} -*/ this.getStartX = function(){ return x1 }; - -/** -* Returns the Y position of the top of the task bar on the graph (right side) -* @method getStartY -* @return {Number} -*/ this.getStartY = function(){ return y1 }; - -/** -* Returns the X position of the right of the task bar on the graph (right side) -* @method getEndX -* @return {Int} -*/ this.getEndX = function(){ return x2 }; - -/** -* Returns the Y position of the bottom of the task bar on the graph (right side) -* @method getEndY -* @return {Number} -*/ this.getEndY = function(){ return y2 }; - -/** -* Returns whether task is visible (1=Yes,0=No) -* @method getVisible -* @return {Boolean} -*/ this.getVisible = function(){ return vVisible }; - -/** -* Set task dependencies -* @method setDepend -* @param pDepend {String} A comma delimited list of task IDs the current task depends on. -* @return {void} -*/ this.setDepend = function(pDepend){ vDepend = pDepend;}; - -/** -* Set task start date/time -* @method setStart -* @param pStart {Datetime} -* @return {void} -*/ this.setStart = function(pStart){ vStart = pStart;}; - -/** -* Set task end date/time -* @method setEnd -* @param pEnd {Datetime} -* @return {void} -*/ this.setEnd = function(pEnd) { vEnd = pEnd; }; - -/** -* Set task tree level (0,1,2,3...) -* @method setLevel -* @param pLevel {Number} -* @return {void} -*/ this.setLevel = function(pLevel){ vLevel = pLevel;}; - -/** -* Set Number of children for the task -* @method setNumKid -* @param pNumKid {Number} -* @return {void} -*/ this.setNumKid = function(pNumKid){ vNumKid = pNumKid;}; - -/** -* Set task completion percentage -* @method setCompVal -* @param pCompVal {Number} -* @return {void} -*/ this.setCompVal = function(pCompVal){ vComp = pCompVal;}; - -/** -* Set a task bar starting position (left) -* @method setStartX -* @param pX {Number} -* @return {void} -*/ this.setStartX = function(pX) {x1 = pX; }; - -/** -* Set a task bar starting position (top) -* @method setStartY -* @param pY {Number} -* @return {String} -*/ this.setStartY = function(pY) {y1 = pY; }; - -/** -* Set a task bar starting position (right) -* @method setEndX -* @param pX {Number} -* @return {String} -*/ this.setEndX = function(pX) {x2 = pX; }; - -/** -* Set a task bar starting position (bottom) -* @method setEndY -* @param pY {Number} -* @return {String} -*/ this.setEndY = function(pY) {y2 = pY; }; - -/** -* Set task open/closed -* @method setOpen -* @param pOpen {Boolean} -* @return {void} -*/ this.setOpen = function(pOpen) {vOpen = pOpen; }; - -/** -* Set task visibility -* @method setVisible -* @param pVisible {Boolean} -* @return {void} -*/ this.setVisible = function(pVisible) {vVisible = pVisible; }; - + if(typeof document.all!='undefined') + { + if ('pageXOffset' in window) return false; // give IE9 and above the benefit of the doubt! + else return true; + } + else return false; }; - - -/** -* Creates the gant chart. for example: -

var g = new JSGantt.GanttChart('g',document.getElementById('GanttChartDIV'), 'day');

- -var g = new JSGantt.GanttChart( - assign the gantt chart to a javascript variable called 'g' -'g' - the name of the variable that was just assigned (will be used later so that gantt object can reference itself) -document.getElementById('GanttChartDIV') - reference to the DIV that will hold the gantt chart -'day' - default format will be by day - -* -* @class GanttChart -* @param pGanttVar {String} the name of the gantt chart variable -* @param pDiv {String} reference to the DIV that will hold the gantt chart -* @param pFormat {String} default format (minute,hour,day,week,month,quarter) -* @return void -*/ - -JSGantt.GanttChart = function(pGanttVar, pDiv, pFormat) +JSGantt.TaskItem=function(pID, pName, pStart, pEnd, pClass, pLink, pMile, pRes, pComp, pGroup, pParent, pOpen, pDepend, pCaption, pNotes, pGantt) { -/** -* The name of the gantt chart variable -* @property vGanttVar -* @type String -* @default pGanttVar -* @private -*/ var vGanttVar = pGanttVar; -/** -* The name of the gantt chart DIV -* @property vDiv -* @type String -* @default pDiv -* @private -*/ var vDiv = pDiv; -/** -* Selected format (minute,hour,day,week,month) -* @property vFormat -* @type String -* @default pFormat -* @private -*/ var vFormat = pFormat; -/** -* Show resource column -* @property vShowRes -* @type Number -* @default 1 -* @private -*/ var vShowRes = 1; -/** -* Show duration column -* @property vShowDur -* @type Number -* @default 1 -* @private -*/ var vShowDur = 1; -/** -* Show percent complete column -* @property vShowComp -* @type Number -* @default 1 -* @private -*/ var vShowComp = 1; -/** -* Show start date column -* @property vShowStartDate -* @type Number -* @default 1 -* @private -*/ var vShowStartDate = 1; -/** -* Show end date column -* @property vShowEndDate -* @type Number -* @default 1 -* @private -*/ var vShowEndDate = 1; -/** -* Date input format -* @property vDateInputFormat -* @type String -* @default "mm/dd/yyyy" -* @private -*/var vDateInputFormat = "mm/dd/yyyy"; -/** -* Date display format -* @property vDateDisplayFormat -* @type String -* @default "mm/dd/yy" -* @private -*/var vDateDisplayFormat = "mm/dd/yy"; - var vNumUnits = 0; - var vCaptionType; - var vDepId = 1; - var vTaskList = new Array(); - var vFormatArr = new Array("day","week","month","quarter"); - var vQuarterArr = new Array(1,1,1,2,2,2,3,3,3,4,4,4); - var vMonthDaysArr = new Array(31,28,31,30,31,30,31,31,30,31,30,31); - var vMonthArr = new Array(i18n["January"],i18n["February"],i18n["March"],i18n["April"],i18n["May"],i18n["June"],i18n["July"],i18n["August"],i18n["September"],i18n["October"],i18n["November"],i18n["December"]); + var vID=parseInt(document.createTextNode(pID).data); + var vName=document.createTextNode(pName).data; + var vStart=new Date(0); + var vEnd=new Date(0); + var vGroupMinStart=null; + var vGroupMinEnd=null; + var vClass=document.createTextNode(pClass).data; + var vLink=document.createTextNode(pLink).data; + var vMile=parseInt(document.createTextNode(pMile).data); + var vRes=document.createTextNode(pRes).data; + var vComp=parseFloat(document.createTextNode(pComp).data); + var vGroup=parseInt(document.createTextNode(pGroup).data); + var vParent=document.createTextNode(pParent).data; + var vOpen=(vGroup==2)?1:parseInt(document.createTextNode(pOpen).data); + var vDepend=new Array(); + var vDependType=new Array(); + var vCaption=document.createTextNode(pCaption).data; + var vDuration=''; + var vLevel=0; + var vNumKid=0; + var vVisible=1; + var vSortIdx=0; + var vToDelete=false; + var x1, y1, x2, y2; + var vNotes; + var vParItem=null; + var vCellDiv=null; + var vGantt=(pGantt instanceof JSGantt.GanttChart)? pGantt : g; //hack for backwards compatibility + var vBarDiv=null; + var vTaskDiv=null; + var vListChildRow=null; + var vChildRow=null; + var vGroupSpan=null; - -/** -* Set current display format (minute/hour/day/week/month/quarter) -* Only the first 4 arguments are used, for example: -* -* g.setFormatArr("day","week","month"); -* -* will show 3 formatting options (day/week/month) at the bottom right of the gantt chart -* @method setFormatArr -* @return {void} -*/ this.setFormatArr = function() { - vFormatArr = new Array(); - for(var i = 0; i < arguments.length; i++) {vFormatArr[i] = arguments[i];} - if(vFormatArr.length>4){vFormatArr.length=4;} - }; -/** -* Show/Hide resource column -* @param pShow {Number} 1=Show,0=Hide -* @method setShowRes -* @return {void} -*/ this.setShowRes = function(pShow) { vShowRes = pShow; }; -/** -* Show/Hide duration column -* @param pShow {Number} 1=Show,0=Hide -* @method setShowDur -* @return {void} -*/ this.setShowDur = function(pShow) { vShowDur = pShow; }; -/** -* Show/Hide completed column -* @param pShow {Number} 1=Show,0=Hide -* @method setShowComp -* @return {void} -*/ this.setShowComp = function(pShow) { vShowComp = pShow; }; -/** -* Show/Hide start date column -* @param pShow {Number} 1=Show,0=Hide -* @method setShowStartDate -* @return {void} -*/ this.setShowStartDate = function(pShow) { vShowStartDate = pShow; }; -/** -* Show/Hide end date column -* @param pShow {Number} 1=Show,0=Hide -* @method setShowEndDate -* @return {void} -*/ this.setShowEndDate = function(pShow) { vShowEndDate = pShow; }; -/** -* Overall date input format -* @param pShow {String} (mm/dd/yyyy,dd/mm/yyyy,yyyy-mm-dd) -* @method setDateInputFormat -* @return {void} -*/ this.setDateInputFormat = function(pShow) { vDateInputFormat = pShow; }; -/** -* Overall date display format -* @param pShow {String} (mm/dd/yyyy,dd/mm/yyyy,yyyy-mm-dd) -* @method setDateDisplayFormat -* @return {void} -*/ this.setDateDisplayFormat = function(pShow) { vDateDisplayFormat = pShow; }; -/** -* Set gantt caption -* @param pType {String} -

Caption-Displays a custom caption set in TaskItem
-Resource-Displays task resource
-Duration-Displays task duration
-Complete-Displays task percent complete

-* @method setCaptionType -* @return {void} -*/ this.setCaptionType = function(pType) { vCaptionType = pType }; -/** -* Set current display format and redraw gantt chart (minute/hour/day/week/month/quarter) -* @param pFormat {String} (mm/dd/yyyy,dd/mm/yyyy,yyyy-mm-dd) -* @method setFormat -* @return {void} -*/ this.setFormat = function(pFormat){ - vFormat = pFormat; - this.Draw(); - }; -/** -* Returns whether resource column is shown -* @method getShowRes -* @return {Number} -*/ this.getShowRes = function(){ return vShowRes }; -/** -* Returns whether duration column is shown -* @method getShowDur -* @return {Number} -*/ this.getShowDur = function(){ return vShowDur }; -/** -* Returns whether percent complete column is shown -* @method getShowComp -* @return {Number} -*/ this.getShowComp = function(){ return vShowComp }; -/** -* Returns whether start date column is shown -* @method getShowStartDate -* @return {Number} -*/ this.getShowStartDate = function(){ return vShowStartDate }; -/** -* Returns whether end date column is shown -* @method getShowEndDate -* @return {Number} -*/ this.getShowEndDate = function(){ return vShowEndDate }; -/** -* Returns date input format -* @method getDateInputFormat -* @return {String} -*/ this.getDateInputFormat = function() { return vDateInputFormat }; -/** -* Returns current display format -* @method getDateDisplayFormat -* @return {String} -*/ this.getDateDisplayFormat = function() { return vDateDisplayFormat }; -/** -* Returns current gantt caption type -* @method getCaptionType -* @return {String} -*/ this.getCaptionType = function() { return vCaptionType }; -/** -* Calculates X/Y coordinates of a task and sets the Start and End properties of the TaskItem -* @method CalcTaskXY -* @return {Void} -*/ this.CalcTaskXY = function () - { - var vList = this.getList(); - var vTaskDiv; - var vParDiv; - var vLeft, vTop, vHeight, vWidth; + vNotes=document.createElement('span'); + vNotes.className='gTaskNotes'; + if (pNotes!=null) + { + vNotes.innerHTML=pNotes; + JSGantt.stripUnwanted(vNotes); + } - for(i = 0; i < vList.length; i++) - { - vID = vList[i].getID(); - vTaskDiv = document.getElementById("taskbar_"+vID); - vBarDiv = document.getElementById("bardiv_"+vID); - vParDiv = document.getElementById("childgrid_"+vID); + if (pStart!=null && pStart!='') + { + vStart=(pStart instanceof Date)?pStart:JSGantt.parseDateStr(document.createTextNode(pStart).data,vGantt.getDateInputFormat()); + vGroupMinStart=vStart; + } - if(vBarDiv) { - vList[i].setStartX( vBarDiv.offsetLeft ); - vList[i].setStartY( vParDiv.offsetTop+vBarDiv.offsetTop+6 ); - vList[i].setEndX( vBarDiv.offsetLeft + vBarDiv.offsetWidth ); - vList[i].setEndY( vParDiv.offsetTop+vBarDiv.offsetTop+6 ); - }; - }; - }; + if (pEnd!=null && pEnd!='') + { + vEnd =(pEnd instanceof Date)?pEnd:JSGantt.parseDateStr(document.createTextNode(pEnd).data,vGantt.getDateInputFormat()); + vGroupMinEnd=vEnd; + } -/** -* Adds a TaskItem to the Gantt object task list array -* @method AddTaskItem -* @return {Void} -*/ this.AddTaskItem = function(value) - { - vTaskList.push(value); - }; -/** -* Returns task list Array -* @method getList -* @return {Array} -*/ this.getList = function() { return vTaskList }; + if (pDepend!=null) + { + var vDependStr=pDepend+''; + var vDepList=vDependStr.split(','); + var n=vDepList.length; -/** -* Clears dependency lines between tasks -* @method clearDependencies -* @return {Void} -*/ this.clearDependencies = function() - { - var parent = document.getElementById('rightside'); - var depLine; - var vMaxId = vDepId; - for ( i=1; i task 2 start) -* @method drawDependency -* @return {Void} -*/ this.drawDependency =function(x1,y1,x2,y2) - { - if(x1 + 10 < x2) - { - this.sLine(x1,y1,x1+4,y1); - this.sLine(x1+4,y1,x1+4,y2); - this.sLine(x1+4,y2,x2,y2); - this.dLine(x2,y2,x2-3,y2-3); - this.dLine(x2,y2,x2-3,y2+3); - this.dLine(x2-1,y2,x2-3,y2-2); - this.dLine(x2-1,y2,x2-3,y2+2); - } - else - { - this.sLine(x1,y1,x1+4,y1); - this.sLine(x1+4,y1,x1+4,y2-10); - this.sLine(x1+4,y2-10,x2-8,y2-10); - this.sLine(x2-8,y2-10,x2-8,y2); - this.sLine(x2-8,y2,x2,y2); - this.dLine(x2,y2,x2-3,y2-3); - this.dLine(x2,y2,x2-3,y2+3); - this.dLine(x2-1,y2,x2-3,y2-2); - this.dLine(x2-1,y2,x2-3,y2+2); - } - }; - -/** -* Draw all task dependencies -* @method DrawDependencies -* @return {Void} -*/ this.DrawDependencies = function () { - - //First recalculate the x,y - this.CalcTaskXY(); - - this.clearDependencies(); - - var vList = this.getList(); - for(var i = 0; i < vList.length; i++) - { - - vDepend = vList[i].getDepend(); - if(vDepend) { - - var vDependStr = vDepend + ''; - var vDepList = vDependStr.split(','); - var n = vDepList.length; - - for(var k=0;k 0) - { - - // Process all tasks preset parent date and completion % - JSGantt.processRows(vTaskList, 0, -1, 1, 1); - - // get overall min/max dates plus padding - vMinDate = JSGantt.getMinDate(vTaskList, vFormat); - vMaxDate = JSGantt.getMaxDate(vTaskList, vFormat); - - // Calculate chart width variables. vColWidth can be altered manually to change each column width - // May be smart to make this a parameter of GanttChart or set it based on existing pWidth parameter - if(vFormat == 'day') { - vColWidth = 18; - vColUnit = 1; - } - else if(vFormat == 'week') { - vColWidth = 37; - vColUnit = 7; - } - else if(vFormat == 'month') { - vColWidth = 37; - vColUnit = 30; - } - else if(vFormat == 'quarter') { - vColWidth = 60; - vColUnit = 90; - } - - else if(vFormat=='hour') - { - vColWidth = 18; - vColUnit = 1; - } - - else if(vFormat=='minute') - { - vColWidth = 18; - vColUnit = 1; - } - - vNumDays = (Date.parse(vMaxDate) - Date.parse(vMinDate)) / ( 24 * 60 * 60 * 1000); - vNumUnits = vNumDays / vColUnit; - - - vChartWidth = vNumUnits * vColWidth + 1; - vDayWidth = (vColWidth / vColUnit) + (1/vColUnit); - - vMainTable = - '' + - ''; + this.getParent=function(){return vParent;}; + this.getGroup=function(){return vGroup;}; + this.getOpen=function(){return vOpen;}; + this.getLevel=function(){return vLevel;}; + this.getNumKids=function(){return vNumKid;}; + this.getStartX=function(){return x1;}; + this.getStartY=function(){return y1;}; + this.getEndX=function(){return x2;}; + this.getEndY=function(){return y2;}; + this.getVisible=function(){return vVisible;}; + this.getParItem=function(){return vParItem;}; + this.getCellDiv=function(){return vCellDiv;}; + this.getBarDiv=function(){return vBarDiv;}; + this.getTaskDiv=function(){return vTaskDiv;}; + this.getChildRow=function(){return vChildRow;}; + this.getListChildRow=function(){return vListChildRow;}; + this.getGroupSpan=function(){return vGroupSpan;}; + this.setStart=function(pStart){if(pStart instanceof Date)vStart=pStart;}; + this.setEnd=function(pEnd){if(pEnd instanceof Date)vEnd=pEnd;}; + this.setGroupMinStart=function(pStart){if(pStart instanceof Date)vGroupMinStart=pStart;}; + this.setGroupMinEnd=function(pEnd){if(pEnd instanceof Date)vGroupMinEnd=pEnd;}; + this.setLevel=function(pLevel){vLevel=parseInt(document.createTextNode(pLevel).data);}; + this.setNumKid=function(pNumKid){vNumKid=parseInt(document.createTextNode(pNumKid).data);}; + this.setCompVal=function(pCompVal){vComp=parseFloat(document.createTextNode(pCompVal).data);}; + this.setStartX=function(pX){x1=parseInt(document.createTextNode(pX).data);}; + this.setStartY=function(pY){y1=parseInt(document.createTextNode(pY).data);}; + this.setEndX=function(pX){x2=parseInt(document.createTextNode(pX).data);}; + this.setEndY=function(pY){y2=parseInt(document.createTextNode(pY).data);}; + this.setOpen=function(pOpen){vOpen=parseInt(document.createTextNode(pOpen).data);}; + this.setVisible=function(pVisible){vVisible=parseInt(document.createTextNode(pVisible).data);}; + this.setSortIdx=function(pSortIdx){vSortIdx=parseInt(document.createTextNode(pSortIdx).data);}; + this.setToDelete=function(pToDelete){if (pToDelete) vToDelete=true; else vToDelete=false;}; + this.setParItem=function(pParItem){if(pParItem instanceof JSGantt.TaskItem) vParItem=pParItem;}; + this.setCellDiv=function(pCellDiv){if(typeof HTMLDivElement !== 'function' || pCellDiv instanceof HTMLDivElement) vCellDiv=pCellDiv;}; //"typeof HTMLDivElement !== 'function'" to play nice with ie6 and 7 + this.setGroup=function(pGroup){vGroup=parseInt(document.createTextNode(pGroup).data);}; + this.setBarDiv=function(pDiv){if(typeof HTMLDivElement !== 'function' || pDiv instanceof HTMLDivElement)vBarDiv=pDiv;}; + this.setTaskDiv=function(pDiv){if(typeof HTMLDivElement !== 'function' || pDiv instanceof HTMLDivElement)vTaskDiv=pDiv;}; + this.setChildRow=function(pRow){if(typeof HTMLTableRowElement !== 'function' || pRow instanceof HTMLTableRowElement)vChildRow=pRow;}; + this.setListChildRow=function(pRow){if(typeof HTMLTableRowElement !== 'function' || pRow instanceof HTMLTableRowElement)vListChildRow=pRow;}; + this.setGroupSpan=function(pSpan){if(typeof HTMLSpanElement !== 'function' || pSpan instanceof HTMLSpanElement)vGroupSpan=pSpan;}; +}; - vMainTable += vLeftTable; +// function that loads the main gantt chart properties and functions +// pDiv: (required) this is a div object created in HTML +// pFormat: (required) - used to indicate whether chart should be drawn in "hour", "day", "week", "month", or "quarter" format +JSGantt.GanttChart=function(pDiv, pFormat) +{ + var vDiv=pDiv; + var vFormat=pFormat; + var vDivId=null; + var vUseFade=1; + var vUseMove=1; + var vUseRowHlt=1; + var vUseToolTip=1; + var vUseSort=1; + var vUseSingleCell=25000; + var vShowRes=1; + var vShowDur=1; + var vShowComp=1; + var vShowStartDate=1; + var vShowEndDate=1; + var vShowEndWeekDate=1; + var vShowTaskInfoRes=1; + var vShowTaskInfoDur=1; + var vShowTaskInfoComp=1; + var vShowTaskInfoStartDate=1; + var vShowTaskInfoEndDate=1; + var vShowTaskInfoNotes=1; + var vShowTaskInfoLink=1; + var vShowDeps=1; + var vShowSelector=new Array('top'); + var vDateInputFormat='yyyy-mm-dd'; + var vDateTaskTableDisplayFormat=JSGantt.parseDateFormatStr('dd/mm/yyyy'); + var vDateTaskDisplayFormat=JSGantt.parseDateFormatStr('dd month yyyy'); + var vHourMajorDateDisplayFormat=JSGantt.parseDateFormatStr('day dd month yyyy'); + var vHourMinorDateDisplayFormat=JSGantt.parseDateFormatStr('HH'); + var vDayMajorDateDisplayFormat=JSGantt.parseDateFormatStr('dd/mm/yyyy'); + var vDayMinorDateDisplayFormat=JSGantt.parseDateFormatStr('dd'); + var vWeekMajorDateDisplayFormat=JSGantt.parseDateFormatStr('yyyy'); + var vWeekMinorDateDisplayFormat=JSGantt.parseDateFormatStr('dd/mm'); + var vMonthMajorDateDisplayFormat=JSGantt.parseDateFormatStr('yyyy'); + var vMonthMinorDateDisplayFormat=JSGantt.parseDateFormatStr('mon'); + var vQuarterMajorDateDisplayFormat=JSGantt.parseDateFormatStr('yyyy'); + var vQuarterMinorDateDisplayFormat=JSGantt.parseDateFormatStr('qq'); + var vUseFullYear=JSGantt.parseDateFormatStr('dd/mm/yyyy'); + var vCaptionType; + var vDepId=1; + var vTaskList=new Array(); + var vFormatArr=new Array('hour','day','week','month','quarter'); + var vMonthDaysArr=new Array(31,28,31,30,31,30,31,31,30,31,30,31); + var vProcessNeeded=true; + var vMinGpLen=8; + var vScrollTo=''; + var vHourColWidth=18; + var vDayColWidth=18; + var vWeekColWidth=36; + var vMonthColWidth=36; + var vQuarterColWidth=18; + var vRowHeight=20; + var vTodayPx=-1; + /*var vLangs={'en': + {'format':'Format','hour':'Hour','day':'Day','week':'Week','month':'Month','quarter':'Quarter','hours':'Hours','days':'Days', + 'weeks':'Weeks','months':'Months','quarters':'Quarters','hr':'Hr','dy':'Day','wk':'Wk','mth':'Mth','qtr':'Qtr','hrs':'Hrs', + 'dys':'Days','wks':'Wks','mths':'Mths','qtrs':'Qtrs','resource':'Resource','duration':'Duration','comp':'% Comp.', + 'completion':'Completion','startdate':'Start Date','enddate':'End Date','moreinfo':'More Information','notes':'Notes', + 'january':'January','february':'February','march':'March','april':'April','maylong':'May','june':'June','july':'July', + 'august':'August','september':'September','october':'October','november':'November','december':'December','jan':'Jan', + 'feb':'Feb','mar':'Mar','apr':'Apr','may':'May','jun':'Jun','jul':'Jul','aug':'Aug','sep':'Sep','oct':'Oct','nov':'Nov', + 'dec':'Dec','sunday':'Sunday','monday':'Monday','tuesday':'Tuesday','wednesday':'Wednesday','thursday':'Thursday', + 'friday':'Friday','saturday':'Saturday','sun':'Sun','mon':'Mon','tue':'Tue','wed':'Wed','thu':'Thu','fri':'Fri','sat':'Sat'} + }; + var vLang='en';*/ + var vChartBody=null; + var vChartHead=null; + var vListBody=null; + var vChartTable=null; + var vLines=null; + var vTimer=20; + + this.setUseFade=function(pVal){vUseFade=pVal;}; + this.setUseMove=function(pVal){vUseMove=pVal;}; + this.setUseRowHlt=function(pVal){vUseRowHlt=pVal;}; + this.setUseToolTip=function(pVal){vUseToolTip=pVal;}; + this.setUseSort=function(pVal){vUseSort=pVal;}; + this.setUseSingleCell=function(pVal){vUseSingleCell=pVal*1;}; + this.setFormatArr=function() + { + var vValidFormats='hour day week month quarter'; + vFormatArr=new Array(); + for(var i=0, j=0; i1) + { + vFormatArr[j++]=arguments[i].toLowerCase(); + var vRegExp=new RegExp('(?:^|\s)'+arguments[i]+'(?!\S)', 'g'); + vValidFormats=vValidFormats.replace(vRegExp, ''); + } + } + }; + this.setShowRes=function(pVal){vShowRes=pVal;}; + this.setShowDur=function(pVal){vShowDur=pVal;}; + this.setShowComp=function(pVal){vShowComp=pVal;}; + this.setShowStartDate=function(pVal){vShowStartDate=pVal;}; + this.setShowEndDate=function(pVal){vShowEndDate=pVal;}; + this.setShowTaskInfoRes=function(pVal){vShowTaskInfoRes=pVal;}; + this.setShowTaskInfoDur=function(pVal){vShowTaskInfoDur=pVal;}; + this.setShowTaskInfoComp=function(pVal){vShowTaskInfoComp=pVal;}; + this.setShowTaskInfoStartDate=function(pVal){vShowTaskInfoStartDate=pVal;}; + this.setShowTaskInfoEndDate=function(pVal){vShowTaskInfoEndDate=pVal;}; + this.setShowTaskInfoNotes=function(pVal){vShowTaskInfoNotes=pVal;}; + this.setShowTaskInfoLink=function(pVal){vShowTaskInfoLink=pVal;}; + this.setShowEndWeekDate=function(pVal){vShowEndWeekDate=pVal;}; + this.setShowSelector=function() + { + var vValidSelectors='top bottom'; + vShowSelector=new Array(); + for(var i=0, j=0; i1) + { + vShowSelector[j++]=arguments[i].toLowerCase(); + var vRegExp=new RegExp('(?:^|\s)'+arguments[i]+'(?!\S)', 'g'); + vValidSelectors=vValidSelectors.replace(vRegExp, ''); + } + } + }; + this.setShowDeps=function(pVal){vShowDeps=pVal;}; + this.setDateInputFormat=function(pVal){vDateInputFormat=pVal;}; + this.setDateTaskTableDisplayFormat=function(pVal){vDateTaskTableDisplayFormat=JSGantt.parseDateFormatStr(pVal);}; + this.setDateTaskDisplayFormat=function(pVal){vDateTaskDisplayFormat=JSGantt.parseDateFormatStr(pVal);}; + this.setHourMajorDateDisplayFormat=function(pVal){vHourMajorDateDisplayFormat=JSGantt.parseDateFormatStr(pVal);}; + this.setHourMinorDateDisplayFormat=function(pVal){vHourMinorDateDisplayFormat=JSGantt.parseDateFormatStr(pVal);}; + this.setDayMajorDateDisplayFormat=function(pVal){vDayMajorDateDisplayFormat=JSGantt.parseDateFormatStr(pVal);}; + this.setDayMinorDateDisplayFormat=function(pVal){vDayMinorDateDisplayFormat=JSGantt.parseDateFormatStr(pVal);}; + this.setWeekMajorDateDisplayFormat=function(pVal){vWeekMajorDateDisplayFormat=JSGantt.parseDateFormatStr(pVal);}; + this.setWeekMinorDateDisplayFormat=function(pVal){vWeekMinorDateDisplayFormat=JSGantt.parseDateFormatStr(pVal);}; + this.setMonthMajorDateDisplayFormat=function(pVal){vMonthMajorDateDisplayFormat=JSGantt.parseDateFormatStr(pVal);}; + this.setMonthMinorDateDisplayFormat=function(pVal){vMonthMinorDateDisplayFormat=JSGantt.parseDateFormatStr(pVal);}; + this.setQuarterMajorDateDisplayFormat=function(pVal){vQuarterMajorDateDisplayFormat=JSGantt.parseDateFormatStr(pVal);}; + this.setQuarterMinorDateDisplayFormat=function(pVal){vQuarterMinorDateDisplayFormat=JSGantt.parseDateFormatStr(pVal);}; + this.setCaptionType=function(pType){vCaptionType=pType;}; + this.setFormat=function(pFormat) + { + vFormat=pFormat; + this.Draw(); + }; + this.setMinGpLen=function(pMinGpLen){vMinGpLen=pMinGpLen;}; + this.setScrollTo=function(pDate){vScrollTo=pDate;}; + this.setHourColWidth=function(pWidth){vHourColWidth=pWidth;}; + this.setDayColWidth=function(pWidth){vDayColWidth=pWidth;}; + this.setWeekColWidth=function(pWidth){vWeekColWidth=pWidth;}; + this.setMonthColWidth=function(pWidth){vMonthColWidth=pWidth;}; + this.setQuarterColWidth=function(pWidth){vQuarterColWidth=pWidth;}; + this.setRowHeight=function(pHeight){vRowHeight=pHeight;}; + this.setLang=function(pLang){if(vLangs[pLang])vLang=pLang;}; + this.setChartBody=function(pDiv){if(typeof HTMLDivElement !== 'function' || pDiv instanceof HTMLDivElement)vChartBody=pDiv;}; + this.setChartHead=function(pDiv){if(typeof HTMLDivElement !== 'function' || pDiv instanceof HTMLDivElement)vChartHead=pDiv;}; + this.setListBody=function(pDiv){if(typeof HTMLDivElement !== 'function' || pDiv instanceof HTMLDivElement)vListBody=pDiv;}; + this.setChartTable=function(pTable){if(typeof HTMLTableElement !== 'function' || pTable instanceof HTMLTableElement)vChartTable=pTable;}; + this.setLines=function(pDiv){if(typeof HTMLDivElement !== 'function' || pDiv instanceof HTMLDivElement)vLines=pDiv;}; + this.setTimer=function(pVal){vTimer=pVal*1;}; + this.addLang=function(pLang, pVals){ + if(!vLangs[pLang]) + { + vLangs[pLang]=new Object(); + for(var vKey in vLangs['en'])vLangs[pLang][vKey]=(pVals[vKey])?document.createTextNode(pVals[vKey]).data:vLangs['en'][vKey]; + } + }; + + this.getDivId=function(){return vDivId;}; + this.getUseFade=function(){return vUseFade;}; + this.getUseMove=function(){return vUseMove;}; + this.getUseRowHlt=function(){return vUseRowHlt;}; + this.getUseToolTip=function(){return vUseToolTip;}; + this.getUseSort=function(){return vUseSort;}; + this.getUseSingleCell=function(){return vUseSingleCell;}; + this.getFormatArr=function(){return vFormatArr;}; + this.getShowRes=function(){return vShowRes;}; + this.getShowDur=function(){return vShowDur;}; + this.getShowComp=function(){return vShowComp;}; + this.getShowStartDate=function(){return vShowStartDate;}; + this.getShowEndDate=function(){return vShowEndDate;}; + this.getShowTaskInfoRes=function(){return vShowTaskInfoRes;}; + this.getShowTaskInfoDur=function(){return vShowTaskInfoDur;}; + this.getShowTaskInfoComp=function(){return vShowTaskInfoComp;}; + this.getShowTaskInfoStartDate=function(){return vShowTaskInfoStartDate;}; + this.getShowTaskInfoEndDate=function(){return vShowTaskInfoEndDate;}; + this.getShowTaskInfoNotes=function(){return vShowTaskInfoNotes;}; + this.getShowTaskInfoLink=function(){return vShowTaskInfoLink;}; + this.getShowEndWeekDate=function(){return vShowEndWeekDate;}; + this.getShowSelector=function(){return vShowSelector;}; + this.getShowDeps=function(){return vShowDeps;}; + this.getDateInputFormat=function(){return vDateInputFormat;}; + this.getDateTaskTableDisplayFormat=function(){return vDateTaskTableDisplayFormat;}; + this.getDateTaskDisplayFormat=function(){return vDateTaskDisplayFormat;}; + this.getHourMajorDateDisplayFormat=function(){return vHourMajorDateDisplayFormat;}; + this.getHourMinorDateDisplayFormat=function(){return vHourMinorDateDisplayFormat;}; + this.getDayMajorDateDisplayFormat=function(){return vDayMajorDateDisplayFormat;}; + this.getDayMinorDateDisplayFormat=function(){return vDayMinorDateDisplayFormat;}; + this.getWeekMajorDateDisplayFormat=function(){return vWeekMajorDateDisplayFormat;}; + this.getWeekMinorDateDisplayFormat=function(){return vWeekMinorDateDisplayFormat;}; + this.getMonthMajorDateDisplayFormat=function(){return vMonthMajorDateDisplayFormat;}; + this.getMonthMinorDateDisplayFormat=function(){return vMonthMinorDateDisplayFormat;}; + this.getQuarterMajorDateDisplayFormat=function(){return vQuarterMajorDateDisplayFormat;}; + this.getQuarterMinorDateDisplayFormat=function(){return vQuarterMinorDateDisplayFormat;}; + this.getCaptionType=function(){return vCaptionType;}; + this.getMinGpLen=function(){return vMinGpLen;}; + this.getScrollTo=function(){return vScrollTo;}; + this.getHourColWidth=function(){return vHourColWidth;}; + this.getDayColWidth=function(){return vDayColWidth;}; + this.getWeekColWidth=function(){return vWeekColWidth;}; + this.getMonthColWidth=function(){return vMonthColWidth;}; + this.getQuarterColWidth=function(){return vQuarterColWidth;}; + this.getRowHeight=function(){return vRowHeight;}; + this.getChartBody=function(){return vChartBody;}; + this.getChartHead=function(){return vChartHead;}; + this.getListBody=function(){return vListBody;}; + this.getChartTable=function(){return vChartTable;}; + this.getLines=function(){return vLines;}; + this.getTimer=function(){return vTimer;}; + + this.CalcTaskXY=function() + { + var vID; + var vList=this.getList(); + var vBarDiv; + var vTaskDiv; + var vParDiv; + var vLeft, vTop, vWidth; + var vHeight=Math.floor((this.getRowHeight()/2)); + + for(var i=0; i=x2 && y1!=y2) vBend=true; + break; + } + + if (vBend) + { + this.sLine(x1,y1,x1+vShort,y1,pClass); + this.sLine(x1+vShort,y1,x1+vShort,y2-vRow,pClass); + this.sLine(x1+vShort,y2-vRow,x2-(vShort*2),y2-vRow,pClass); + this.sLine(x2-(vShort*2),y2-vRow,x2-(vShort*2),y2,pClass); + this.sLine(x2-(vShort*2),y2,x2-(1*vDir),y2,pClass); + } + else if (y1!=y2) + { + this.sLine(x1,y1,x1+vShort,y1,pClass); + this.sLine(x1+vShort,y1,x1+vShort,y2,pClass); + this.sLine(x1+vShort,y2,x2-(1*vDir),y2,pClass); + } + else this.sLine(x1,y1,x2-(1*vDir),y2,pClass); + + var vTmpDiv=this.sLine(x2,y2,x2-3-((vDir<0)?1:0),y2-3-((vDir<0)?1:0),pClass+"Arw"); + vTmpDiv.style.width='0px'; + vTmpDiv.style.height='0px'; + }; + + this.DrawDependencies=function() + { + if (this.getShowDeps()==1) + { + //First recalculate the x,y + this.CalcTaskXY(); + this.clearDependencies(); + + var vList=this.getList(); + for(var i=0; i0 && vList[i].getVisible()==1) + { + for(var k=0;k=0 && vList[vTask].getGroup()!=2) + { + if(vList[vTask].getVisible()==1) + { + if(vDependType[k]=='SS')this.drawDependency(vList[vTask].getStartX()-1,vList[vTask].getStartY(),vList[i].getStartX()-1,vList[i].getStartY(),'SS','gDepSS'); + else if(vDependType[k]=='FF')this.drawDependency(vList[vTask].getEndX(),vList[vTask].getEndY(),vList[i].getEndX(),vList[i].getEndY(),'FF','gDepFF'); + else if(vDependType[k]=='SF')this.drawDependency(vList[vTask].getStartX()-1,vList[vTask].getStartY(),vList[i].getEndX(),vList[i].getEndY(),'SF','gDepSF'); + else if(vDependType[k]=='FS')this.drawDependency(vList[vTask].getEndX(),vList[vTask].getEndY(),vList[i].getStartX()-1,vList[i].getStartY(),'FS','gDepFS'); + } + } + } + } + } + } + // draw the current date line + if (vTodayPx>=0) this.sLine(vTodayPx, 0, vTodayPx, this.getChartTable().offsetHeight-1, 'gCurDate'); + }; + + this.getArrayLocationByID=function(pId) + { + var vList=this.getList(); + for(var i=0; i0) + { + // Process all tasks, reset parent date and completion % if task list has altered + if (vProcessNeeded) JSGantt.processRows(vTaskList, 0, -1, 1, 1, this.getUseSort()); + vProcessNeeded=false; + + // get overall min/max dates plus padding + vMinDate=JSGantt.getMinDate(vTaskList, vFormat); + vMaxDate=JSGantt.getMaxDate(vTaskList, vFormat); + + // Calculate chart width variables. + if(vFormat=='day') vColWidth=vDayColWidth; + else if(vFormat=='week') vColWidth=vWeekColWidth; + else if(vFormat=='month') vColWidth=vMonthColWidth; + else if(vFormat=='quarter') vColWidth=vQuarterColWidth; + else if(vFormat=='hour') vColWidth=vHourColWidth; + + // DRAW the Left-side of the chart (names, resources, comp%) + var vLeftHeader=document.createDocumentFragment(); + + var vTmpDiv=this.newNode(vLeftHeader, 'div', vDivId+'glisthead', 'glistlbl gcontainercol'); + var vTmpTab=this.newNode(vTmpDiv, 'table', null, 'gtasktableh'); + var vTmpTBody=this.newNode(vTmpTab, 'tbody'); + var vTmpRow=this.newNode(vTmpTBody, 'tr'); + this.newNode(vTmpRow, 'td', null, 'gtasklist', '\u00A0'); + var vTmpCell=this.newNode(vTmpRow, 'td', null, 'gspanning gtaskname'); + vTmpCell.appendChild(this.drawSelector('top')); + if(vShowRes==1)this.newNode(vTmpRow, 'td', null, 'gspanning gresource', '\u00A0'); + if(vShowDur==1)this.newNode(vTmpRow, 'td', null, 'gspanning gduration', '\u00A0'); + if(vShowComp==1)this.newNode(vTmpRow, 'td', null, 'gspanning gpccomplete', '\u00A0'); + if(vShowStartDate==1)this.newNode(vTmpRow, 'td', null, 'gspanning gstartdate', '\u00A0'); + if(vShowEndDate==1)this.newNode(vTmpRow, 'td', null, 'gspanning genddate', '\u00A0'); + + vTmpRow=this.newNode(vTmpTBody, 'tr'); + this.newNode(vTmpRow, 'td', null, 'gtasklist', '\u00A0'); + this.newNode(vTmpRow, 'td', null, 'gtaskname', '\u00A0'); + if(vShowRes==1)this.newNode(vTmpRow, 'td', null, 'gtaskheading gresource', vLangs[vLang]['resource']); + if(vShowDur==1)this.newNode(vTmpRow, 'td', null, 'gtaskheading gduration', vLangs[vLang]['duration']); + if(vShowComp==1)this.newNode(vTmpRow, 'td', null, 'gtaskheading gpccomplete', vLangs[vLang]['comp']); + if(vShowStartDate==1)this.newNode(vTmpRow, 'td', null, 'gtaskheading gstartdate', vLangs[vLang]['startdate']); + if(vShowEndDate==1)this.newNode(vTmpRow, 'td', null, 'gtaskheading genddate', vLangs[vLang]['enddate']); + + vTmpDiv=this.newNode(vLeftHeader, 'div', null, 'glabelfooter'); + + var vLeftTable=document.createDocumentFragment(); + var vTmpDiv2=this.newNode(vLeftTable, 'div', vDivId+'glistbody', 'glistgrid gcontainercol'); + this.setListBody(vTmpDiv2); + vTmpTab=this.newNode(vTmpDiv2, 'table', null, 'gtasktable'); + vTmpTBody=this.newNode(vTmpTab, 'tbody'); + + for(i=0; i' + - '
' + - '
'; - - if(vShowRes !=1) vNameWidth+=vStatusWidth; - if(vShowDur !=1) vNameWidth+=vStatusWidth; - if(vShowComp!=1) vNameWidth+=vStatusWidth; - if(vShowStartDate!=1) vNameWidth+=vStatusWidth; - if(vShowEndDate!=1) vNameWidth+=vStatusWidth; - - // DRAW the Left-side of the chart (names, resources, comp%) - vLeftTable = - '
' + - '' + - ' ' + - ' '; - - if(vShowRes ==1) vLeftTable += ' ' ; - if(vShowDur ==1) vLeftTable += ' ' ; - if(vShowComp==1) vLeftTable += ' ' ; - if(vShowStartDate==1) vLeftTable += ' ' ; - if(vShowEndDate==1) vLeftTable += ' ' ; - - vLeftTable += - '' + - ' ' + - ' ' ; - - if(vShowRes ==1) vLeftTable += ' ' ; - if(vShowDur ==1) vLeftTable += ' ' ; - if(vShowComp==1) vLeftTable += ' ' ; - if(vShowStartDate==1) vLeftTable += ' ' ; - if(vShowEndDate==1) vLeftTable += ' ' ; - - vLeftTable += ''; - - for(i = 0; i < vTaskList.length; i++) + for(var k=0;k' ; - else - vLeftTable += '' ; - - vLeftTable += - ' ' + - ' ' ; - - if(vShowRes ==1) vLeftTable += ' ' ; - if(vShowDur ==1) vLeftTable += ' ' ; - if(vShowComp==1) vLeftTable += ' ' ; - if(vShowStartDate==1) vLeftTable += ' ' ; - if(vShowEndDate==1) vLeftTable += ' ' ; - - vLeftTable += ''; + this.getID=function(){return vID;}; + this.getName=function(){return vName;}; + this.getStart=function(){return vStart;}; + this.getEnd=function(){return vEnd;}; + this.getGroupMinStart=function(){return vGroupMinStart;}; + this.getGroupMinEnd=function(){return vGroupMinEnd;}; + this.getClass=function(){return vClass;}; + this.getLink=function(){return vLink;}; + this.getMile=function(){return vMile;}; + this.getDepend=function(){if(vDepend) return vDepend; else return null;}; + this.getDepType=function(){if(vDependType) return vDependType; else return null;}; + this.getCaption=function(){if(vCaption) return vCaption; else return '';}; + this.getResource=function(){if(vRes) return vRes; else return '\u00A0';}; + this.getCompVal=function(){if(vComp) return vComp; else return 0;}; + this.getCompStr=function(){if(vComp) return vComp+'%'; else return '';}; + this.getNotes=function(){return vNotes;}; + this.getSortIdx=function(){return vSortIdx;}; + this.getToDelete=function(){return vToDelete;}; + this.getDuration=function(pFormat, pLang) + { + if (vMile) + { + vDuration='-'; + } + else + { + var vTaskEnd=new Date(this.getEnd().getTime()); + var vUnits=null; + switch(pFormat) + { + case 'week': vUnits='day'; break; + case 'month': vUnits='week'; break; + case 'quarter': vUnits='month'; break; + default: vUnits=pFormat; break; } - // DRAW the date format selector at bottom left. Another potential GanttChart parameter to hide/show this selector - vLeftTable += '' + - // LDR '
'+i18n["Resource"]+''+i18n["Duration"]+'%'+i18n["Start_Date"]+''+i18n["End_Date"]+'
 '; - - for(j=1; j ' ; - else - vLeftTable += '+ ' ; - - } else { - - vLeftTable += '   '; - } - - vLeftTable += - ' ' + vTaskList[i].getName() + '' + vTaskList[i].getResource() + '' + (vTaskList[i].getStart() > 0 ? vTaskList[i].getDuration(vFormat) : '') + '' + vTaskList[i].getCompStr() + '' + (vTaskList[i].getStart() > 0 ? JSGantt.formatDateStr( vTaskList[i].getStart(), vDateDisplayFormat) : '')+ '' + (vTaskList[i].getEnd() > 0 ? JSGantt.formatDateStr( vTaskList[i].getEnd(), vDateDisplayFormat) : '') + '
  Powered by jsGantt      Format:'; - '
         '+i18n["Period"]+':   '; - - if (vFormatArr.join().indexOf("minute")!=-1) { - if (vFormat=='minute') vLeftTable += ''+i18n["sMinute"]; - else vLeftTable += ''+i18n["sMinute"]; - } - - if (vFormatArr.join().indexOf("hour")!=-1) { - if (vFormat=='hour') vLeftTable += ''+i18n["sHour"]; - else vLeftTable += ''+i18n["sHour"]; - } - - if (vFormatArr.join().indexOf("day")!=-1) { - if (vFormat=='day') vLeftTable += ''+i18n["sDay"]; - else vLeftTable += ''+i18n["sDay"]; - } - - if (vFormatArr.join().indexOf("week")!=-1) { - if (vFormat=='week') vLeftTable += ''+i18n["sWeek"]; - else vLeftTable += ''+i18n["sWeek"]; - } - - if (vFormatArr.join().indexOf("month")!=-1) { - if (vFormat=='month') vLeftTable += ''+i18n["sMonth"]; - else vLeftTable += ''+i18n["sMonth"]; - } - - if (vFormatArr.join().indexOf("quarter")!=-1) { - if (vFormat=='quarter') vLeftTable += ''+i18n["sQuarter"]; - else vLeftTable += ''+i18n["sQuarter"]; - } - -// vLeftTable += ' .'; + if ((vTaskEnd.getTime()-(vTaskEnd.getTimezoneOffset()*60000))%(86400000)==0) + { + vTaskEnd=new Date(vTaskEnd.getFullYear(), vTaskEnd.getMonth(), vTaskEnd.getDate()+1, vTaskEnd.getHours(), vTaskEnd.getMinutes(), vTaskEnd.getSeconds()); + } + var tmpPer=(JSGantt.getOffset(this.getStart(), vTaskEnd, 999, vUnits))/1000; + if(Math.floor(tmpPer)!=tmpPer) tmpPer=Math.round(tmpPer*10)/10; + switch(vUnits) + { + case 'hour': vDuration=tmpPer+' '+((tmpPer!=1)?pLang['hrs']:pLang['hr']); break; + case 'day': vDuration=tmpPer+' '+((tmpPer!=1)?pLang['dys']:pLang['dy']); break; + case 'week': vDuration=tmpPer+' '+((tmpPer!=1)?pLang['wks']:pLang['wk']); break; + case 'month': vDuration=tmpPer+' '+((tmpPer!=1)?pLang['mths']:pLang['mth']); break; + case 'quarter': vDuration=tmpPer+' '+((tmpPer!=1)?pLang['qtrs']:pLang['qtr']); break; + } + } + return vDuration; + }; - vLeftTable += '
' + - ''; + var vRightHeader=document.createDocumentFragment(); + vTmpDiv=this.newNode(vRightHeader, 'div', vDivId+'gcharthead', 'gchartlbl gcontainercol'); + this.setChartHead(vTmpDiv); + vTmpTab=this.newNode(vTmpDiv, 'table', vDivId+'chartTableh', 'gcharttableh'); + vTmpTBody=this.newNode(vTmpTab, 'tbody'); + vTmpRow=this.newNode(vTmpTBody, 'tr'); vTmpDate.setFullYear(vMinDate.getFullYear(), vMinDate.getMonth(), vMinDate.getDate()); - vTmpDate.setHours(0); + if(vFormat=='hour')vTmpDate.setHours(vMinDate.getHours()); + else vTmpDate.setHours(0); vTmpDate.setMinutes(0); + vTmpDate.setSeconds(0); + vTmpDate.setMilliseconds(0); - // Major Date Header - while(Date.parse(vTmpDate) <= Date.parse(vMaxDate)) - { - vStr = vTmpDate.getFullYear() + ''; - vStr = vStr.substring(2,4); - - - if(vFormat == 'minute') + var vColSpan=1; + // Major Date Header + while(vTmpDate.getTime()<=vMaxDate.getTime()) { - vRightTable += ''; - vTmpDate.setHours(vTmpDate.getHours()+1); - } - - if(vFormat == 'hour') - { - vRightTable += ''; - vTmpDate.setDate(vTmpDate.getDate()+1); - } - - if(vFormat == 'day') - { - vRightTable += ''; - vTmpDate.setDate(vTmpDate.getDate()+1); - } - else if(vFormat == 'week') - { - vRightTable += ''; - vTmpDate.setDate(vTmpDate.getDate()+7); - } - else if(vFormat == 'month') - { - vRightTable += ''; - vTmpDate.setDate(vTmpDate.getDate() + 1); - while(vTmpDate.getDate() > 1) - { - vTmpDate.setDate(vTmpDate.getDate() + 1); - } - } - else if(vFormat == 'quarter') - { - vRightTable += ''; - vTmpDate.setDate(vTmpDate.getDate() + 81); - while(vTmpDate.getDate() > 1) - { - vTmpDate.setDate(vTmpDate.getDate() + 1); - } - } + var vHeaderCellClass='gmajorheading'; + vCellContents=''; - } - - vRightTable += ''; - - // Minor Date header and Cell Rows - vTmpDate.setFullYear(vMinDate.getFullYear(), vMinDate.getMonth(), vMinDate.getDate()); - vNxtDate.setFullYear(vMinDate.getFullYear(), vMinDate.getMonth(), vMinDate.getDate()); - vNumCols = 0; - - while(Date.parse(vTmpDate) <= Date.parse(vMaxDate)) - { - if (vFormat == 'minute') - { - - if( vTmpDate.getMinutes() ==0 ) - vWeekdayColor = "ccccff"; - else - vWeekdayColor = "ffffff"; - - - vDateRowStr += ''; - vItemRowStr += ''; - vTmpDate.setMinutes(vTmpDate.getMinutes() + 1); - } - - else if (vFormat == 'hour') - { - - if( vTmpDate.getHours() ==0 ) - vWeekdayColor = "ccccff"; - else - vWeekdayColor = "ffffff"; - - - vDateRowStr += ''; - vItemRowStr += ''; - vTmpDate.setHours(vTmpDate.getHours() + 1); - } - - else if(vFormat == 'day' ) - { - if( JSGantt.formatDateStr(vCurrDate,'mm/dd/yyyy') == JSGantt.formatDateStr(vTmpDate,'mm/dd/yyyy')) { - vWeekdayColor = "ccccff"; - vWeekendColor = "9999ff"; - vWeekdayGColor = "bbbbff"; - vWeekendGColor = "8888ff"; - } else { - vWeekdayColor = "ffffff"; - vWeekendColor = "cfcfcf"; - vWeekdayGColor = "f3f3f3"; - vWeekendGColor = "c3c3c3"; - } - - if(vTmpDate.getDay() % 6 == 0) { - vDateRowStr += ''; - vItemRowStr += ''; - } - else { - vDateRowStr += ''; - if( JSGantt.formatDateStr(vCurrDate,'mm/dd/yyyy') == JSGantt.formatDateStr(vTmpDate,'mm/dd/yyyy')) - vItemRowStr += ''; - else - vItemRowStr += ''; - } - - vTmpDate.setDate(vTmpDate.getDate() + 1); - - } - - else if(vFormat == 'week') - { - - vNxtDate.setDate(vNxtDate.getDate() + 7); - - if( vCurrDate >= vTmpDate && vCurrDate < vNxtDate ) - vWeekdayColor = "ccccff"; - else - vWeekdayColor = "ffffff"; - - if(vNxtDate <= vMaxDate) { - vDateRowStr += ''; - if( vCurrDate >= vTmpDate && vCurrDate < vNxtDate ) - vItemRowStr += ''; - else - vItemRowStr += ''; - - } else { - vDateRowStr += ''; - if( vCurrDate >= vTmpDate && vCurrDate < vNxtDate ) - vItemRowStr += ''; - else - vItemRowStr += ''; - - } - - vTmpDate.setDate(vTmpDate.getDate() + 7); - - } - - else if(vFormat == 'month') - { - - vNxtDate.setFullYear(vTmpDate.getFullYear(), vTmpDate.getMonth(), vMonthDaysArr[vTmpDate.getMonth()]); - if( vCurrDate >= vTmpDate && vCurrDate < vNxtDate ) - vWeekdayColor = "ccccff"; - else - vWeekdayColor = "ffffff"; - - if(vNxtDate <= vMaxDate) { - vDateRowStr += ''; - if( vCurrDate >= vTmpDate && vCurrDate < vNxtDate ) - vItemRowStr += ''; - else - vItemRowStr += ''; - } else { - vDateRowStr += ''; - if( vCurrDate >= vTmpDate && vCurrDate < vNxtDate ) - vItemRowStr += ''; - else - vItemRowStr += ''; - } - - vTmpDate.setDate(vTmpDate.getDate() + 1); - - while(vTmpDate.getDate() > 1) - { - vTmpDate.setDate(vTmpDate.getDate() + 1); - } - - } - - else if(vFormat == 'quarter') - { - - vNxtDate.setDate(vNxtDate.getDate() + 122); - if( vTmpDate.getMonth()==0 || vTmpDate.getMonth()==1 || vTmpDate.getMonth()==2 ) - vNxtDate.setFullYear(vTmpDate.getFullYear(), 2, 31); - else if( vTmpDate.getMonth()==3 || vTmpDate.getMonth()==4 || vTmpDate.getMonth()==5 ) - vNxtDate.setFullYear(vTmpDate.getFullYear(), 5, 30); - else if( vTmpDate.getMonth()==6 || vTmpDate.getMonth()==7 || vTmpDate.getMonth()==8 ) - vNxtDate.setFullYear(vTmpDate.getFullYear(), 8, 30); - else if( vTmpDate.getMonth()==9 || vTmpDate.getMonth()==10 || vTmpDate.getMonth()==11 ) - vNxtDate.setFullYear(vTmpDate.getFullYear(), 11, 31); - - if( vCurrDate >= vTmpDate && vCurrDate < vNxtDate ) - vWeekdayColor = "ccccff"; - else - vWeekdayColor = "ffffff"; - - if(vNxtDate <= vMaxDate) { - vDateRowStr += ''; - if( vCurrDate >= vTmpDate && vCurrDate < vNxtDate ) - vItemRowStr += ''; - else - vItemRowStr += ''; - } else { - vDateRowStr += ''; - if( vCurrDate >= vTmpDate && vCurrDate < vNxtDate ) - vItemRowStr += ''; - else - vItemRowStr += ''; - } - - vTmpDate.setDate(vTmpDate.getDate() + 81); - - while(vTmpDate.getDate() > 1) - { - vTmpDate.setDate(vTmpDate.getDate() + 1); - } - - } - } - - vRightTable += vDateRowStr + ''; - vRightTable += '
' ; - vRightTable += JSGantt.formatDateStr(vTmpDate, vDateDisplayFormat) + ' ' + vTmpDate.getHours() + ':00 -' + vTmpDate.getHours() + ':59 ' ; - vRightTable += JSGantt.formatDateStr(vTmpDate, vDateDisplayFormat) + '' + - JSGantt.formatDateStr(vTmpDate,vDateDisplayFormat.substring(0,5)) + ' - '; - vTmpDate.setDate(vTmpDate.getDate()+6); - vRightTable += JSGantt.formatDateStr(vTmpDate, vDateDisplayFormat) + '`'+ vStr + '`'+ vStr + '`'+ vStr + '
' + vTmpDate.getMinutes() + '
  
' + vTmpDate.getHours() + '
  
' + vTmpDate.getDate() + '
 
' + vTmpDate.getDate() + '
  
  
' + (vTmpDate.getMonth()+1) + '/' + vTmpDate.getDate() + '
  
  
' + (vTmpDate.getMonth()+1) + '/' + vTmpDate.getDate() + '
  
  
' + vMonthArr[vTmpDate.getMonth()].substr(0,3) + '
  
  
' + vMonthArr[vTmpDate.getMonth()].substr(0,3) + '
  
  
Qtr. ' + vQuarterArr[vTmpDate.getMonth()] + '
  
  
Qtr. ' + vQuarterArr[vTmpDate.getMonth()] + '
  
  
'; - - // Draw each row - - for(i = 0; i < vTaskList.length; i++) - - { - - vTmpDate.setFullYear(vMinDate.getFullYear(), vMinDate.getMonth(), vMinDate.getDate()); - vTaskStart = vTaskList[i].getStart(); - vTaskEnd = vTaskList[i].getEnd(); - - vNumCols = 0; - vID = vTaskList[i].getID(); - - // vNumUnits = Math.ceil((vTaskList[i].getEnd() - vTaskList[i].getStart()) / (24 * 60 * 60 * 1000)) + 1; - vNumUnits = (vTaskList[i].getEnd() - vTaskList[i].getStart()) / (24 * 60 * 60 * 1000) + 1; - if (vFormat=='hour') - { - vNumUnits = (vTaskList[i].getEnd() - vTaskList[i].getStart()) / ( 60 * 1000) + 1; - } - else if (vFormat=='minute') - { - vNumUnits = (vTaskList[i].getEnd() - vTaskList[i].getStart()) / ( 60 * 1000) + 1; - } - - if(vTaskList[i].getVisible() == 0) - vRightTable += ''; - vRightTable += - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' ; + if(this.getCaptionType() && vCaptClass!==null) + { + switch(this.getCaptionType()) + { + case 'Caption': var vCaptionStr=vTmpItem.getCaption(); break; + case 'Resource': vCaptionStr=vTmpItem.getResource(); break; + case 'Duration': vCaptionStr=vTmpItem.getDuration(vFormat, vLangs[vLang]); break; + case 'Complete': vCaptionStr=vTmpItem.getCompStr(); break; + } + this.newNode(vTmpDiv, 'div', null, vCaptClass, vCaptionStr, 120, (vCaptClass=='gmilecaption')?12:0); + } - if( g.getCaptionType() ) { - vCaptionStr = ''; - switch( g.getCaptionType() ) { - case 'Caption': vCaptionStr = vTaskList[i].getCaption(); break; - case 'Resource': vCaptionStr = vTaskList[i].getResource(); break; - case 'Duration': vCaptionStr = vTaskList[i].getDuration(vFormat); break; - case 'Complete': vCaptionStr = vTaskList[i].getCompStr(); break; - } - //vRightTable += '
' + vCaptionStr + '
'; - vRightTable += '
' + vCaptionStr + '
'; - }; - - vRightTable += '
' ; - - } else { - - vDivStr = '
' + - '' + vItemRowStr + '
'; - vRightTable += vDivStr; - - // Draw Task Bar which has outer DIV with enclosed colored bar div, and opaque completion div - vRightTable += - '
' + - '
' + - '
' + - '
' + - '
'; - - if( g.getCaptionType() ) { - vCaptionStr = ''; - switch( g.getCaptionType() ) { - case 'Caption': vCaptionStr = vTaskList[i].getCaption(); break; - case 'Resource': vCaptionStr = vTaskList[i].getResource(); break; - case 'Duration': vCaptionStr = vTaskList[i].getDuration(vFormat); break; - case 'Complete': vCaptionStr = vTaskList[i].getCompStr(); break; - } - //vRightTable += '
' + vCaptionStr + '
'; - vRightTable += '
' + vCaptionStr + '
'; - } - vRightTable += '
' ; - - - - } + if (vTaskList[i].getTaskDiv() && vTmpDiv) + { + // Add Task Info div for tooltip + vTmpDiv2=this.newNode(vTmpDiv, 'div', vDivId+'tt'+vID, null, null, null, null, 'none'); + vTmpDiv2.appendChild(this.createTaskInfo(vTaskList[i])); + JSGantt.addTooltipListeners(this, vTaskList[i].getTaskDiv(), vTmpDiv2); + } } - vRightTable += ''; + if(!vSingleCell) vTmpTBody.appendChild(vDateRow.cloneNode(true)); - } + while(vDiv.hasChildNodes())vDiv.removeChild(vDiv.firstChild); + vTmpDiv=this.newNode(vDiv, 'div', null, 'gchartcontainer'); + vTmpDiv.appendChild(vRightHeader); + vTmpDiv.appendChild(vLeftHeader); + vTmpDiv.appendChild(vRightTable); + vTmpDiv.appendChild(vLeftTable); + this.newNode(vTmpDiv, 'div', null, 'ggridfooter'); + vTmpDiv2=this.newNode(this.getChartBody(), 'div', vDivId+'Lines', 'glinediv'); + vTmpDiv2.style.visibility='hidden'; + this.setLines(vTmpDiv2); - vMainTable += vRightTable + ''; + /* Quick hack to show the generated HTML on older browsers - add a '/' to the begining of this line to activate + var tmpGenSrc=document.createElement('textarea'); + tmpGenSrc.appendChild(document.createTextNode(vTmpDiv.innerHTML)); + vDiv.appendChild(tmpGenSrc); + //*/ + // Now all the content exists, register scroll listeners + JSGantt.addScrollListeners(this); - vDiv.innerHTML = vMainTable; + // now check if we are actually scrolling the pane + if (vScrollTo!='') + { + var vScrollDate=new Date(vMinDate.getTime()); + var vScrollPx=0; - } + if(vScrollTo.substr(0,2)=='px') + { + vScrollPx=parseInt(vScrollTo.substr(2)); + } + else + { + vScrollDate=JSGantt.parseDateStr(vScrollTo, this.getDateInputFormat()); + if(vFormat=='hour')vScrollDate.setMinutes(0,0,0); + else vScrollDate.setHours(0,0,0,0); + vScrollPx=JSGantt.getOffset(vMinDate, vScrollDate, vColWidth, vFormat); + } + this.getChartBody().scrollLeft=vScrollPx; + } - }; //this.draw + if (vMinDate.getTime()<=(new Date()).getTime() && vMaxDate.getTime()>=(new Date()).getTime()) vTodayPx=JSGantt.getOffset(vMinDate, new Date(), vColWidth, vFormat); + else vTodayPx=-1; + this.DrawDependencies(); + } + }; //this.draw -/** -* Mouseover behaviour for gantt row -* @method mouseOver -* @return {Void} -*/ this.mouseOver = function( pObj, pID, pPos, pType ) { - if( pPos == 'right' ) vID = 'child_' + pID; - else vID = 'childrow_' + pID; - - pObj.bgColor = "#ffffaa"; - vRowObj = JSGantt.findObj(vID); - if (vRowObj) vRowObj.bgColor = "#ffffaa"; - }; + this.mouseOver=function(pObj1, pObj2) + { + if (this.getUseRowHlt()) + { + pObj1.className+=' gitemhighlight'; + pObj2.className+=' gitemhighlight'; + } + }; -/** -* Mouseout behaviour for gantt row -* @method mouseOut -* @return {Void} -*/ this.mouseOut = function( pObj, pID, pPos, pType ) { - if( pPos == 'right' ) vID = 'child_' + pID; - else vID = 'childrow_' + pID; - - pObj.bgColor = "#ffffff"; - vRowObj = JSGantt.findObj(vID); - if (vRowObj) { - if( pType == "group") { - pObj.bgColor = "#f3f3f3"; - vRowObj.bgColor = "#f3f3f3"; - } else { - pObj.bgColor = "#ffffff"; - vRowObj.bgColor = "#ffffff"; - } - } - }; + this.mouseOut=function(pObj1, pObj2) + { + if (this.getUseRowHlt()) + { + pObj1.className=pObj1.className.replace(/(?:^|\s)gitemhighlight(?!\S)/g, ''); + pObj2.className=pObj2.className.replace(/(?:^|\s)gitemhighlight(?!\S)/g, ''); + } + }; + this.drawSelector=function(pPos) + { + var vOutput=document.createDocumentFragment(); + var vDisplay=false; + + for (var i=0; i=0 && vIdx'; + vTask+=''+vTaskList[vIdx].getName()+''; + vTask+=''+JSGantt.formatDateStr(vTaskList[vIdx].getStart(),vOutFrmt,vLangs[vLang])+''; + vTask+=''+JSGantt.formatDateStr(vTaskList[vIdx].getEnd(),vOutFrmt,vLangs[vLang])+''; + vTask+=''+vTaskList[vIdx].getClass()+''; + vTask+=''+vTaskList[vIdx].getLink()+''; + vTask+=''+vTaskList[vIdx].getMile()+''; + if(vTaskList[vIdx].getResource()!='\u00A0') vTask+=''+vTaskList[vIdx].getResource()+''; + vTask+=''+vTaskList[vIdx].getCompVal()+''; + vTask+=''+vTaskList[vIdx].getGroup()+''; + vTask+=''+vTaskList[vIdx].getParent()+''; + vTask+=''+vTaskList[vIdx].getOpen()+''; + vTask+=''; + var vDepList=vTaskList[vIdx].getDepend(); + for (i=0;i0)vTask+=','; + if(vDepList[i]>0)vTask+=vDepList[i]+vTaskList[vIdx].getDepType()[i]; + } + vTask+=''; + vTask+=''+vTaskList[vIdx].getCaption()+''; + + var vTmpFrag=document.createDocumentFragment(); + var vTmpDiv=this.newNode(vTmpFrag, 'div', null, null,vTaskList[vIdx].getNotes().innerHTML); + vTask+=''+vTmpDiv.innerHTML+''; + vTask+=''; + } + return vTask; + }; + if (vDiv && vDiv.nodeName.toLowerCase()=='div') vDivId=vDiv.id; }; //GanttChart - -/** -* -@class -*/ - -/** -* Checks whether browser is IE -* -* @method isIE -*/ -JSGantt.isIE = function () { - - if(typeof document.all != 'undefined') - {return true;} - else - {return false;} -}; - -/** -* Recursively process task tree ... set min, max dates of parent tasks and identfy task level. -* -* @method processRows -* @param pList {Array} - Array of TaskItem Objects -* @param pID {Number} - task ID -* @param pRow {Number} - Row in chart -* @param pLevel {Number} - Current tree level -* @param pOpen {Boolean} -* @return void -*/ -JSGantt.processRows = function(pList, pID, pRow, pLevel, pOpen) -{ - - var vMinDate = new Date(); - var vMaxDate = new Date(); - var vMinSet = 0; - var vMaxSet = 0; - var vList = pList; - var vLevel = pLevel; - var i = 0; - var vNumKid = 0; - var vCompSum = 0; - var vVisible = pOpen; - - for(i = 0; i < pList.length; i++) - { - if(pList[i].getParent() == pID) { - vVisible = pOpen; - pList[i].setVisible(vVisible); - if(vVisible==1 && pList[i].getOpen() == 0) - {vVisible = 0;} - - pList[i].setLevel(vLevel); - vNumKid++; - - if(pList[i].getGroup() == 1) { - JSGantt.processRows(vList, pList[i].getID(), i, vLevel+1, vVisible); - }; - - if( vMinSet==0 || pList[i].getStart() < vMinDate) { - vMinDate = pList[i].getStart(); - vMinSet = 1; - }; - - if( vMaxSet==0 || pList[i].getEnd() > vMaxDate) { - vMaxDate = pList[i].getEnd(); - vMaxSet = 1; - }; - - vCompSum += pList[i].getCompVal(); - - } - } - - if(pRow >= 0) { - pList[pRow].setStart(vMinDate); - pList[pRow].setEnd(vMaxDate); - pList[pRow].setNumKid(vNumKid); - pList[pRow].setCompVal(Math.ceil(vCompSum/vNumKid)); - } - -}; - -/** -* Determine the minimum date of all tasks and set lower bound based on format -* -* @method getMinDate -* @param pList {Array} - Array of TaskItem Objects -* @param pFormat {String} - current format (minute,hour,day...) -* @return {Datetime} -*/ -JSGantt.getMinDate = function getMinDate(pList, pFormat) - { - - var vDate = new Date(); - - vDate.setFullYear(pList[0].getStart().getFullYear(), pList[0].getStart().getMonth(), pList[0].getStart().getDate()); - - // Parse all Task End dates to find min - for(i = 0; i < pList.length; i++) - { - if(Date.parse(pList[i].getStart()) < Date.parse(vDate)) - vDate.setFullYear(pList[i].getStart().getFullYear(), pList[i].getStart().getMonth(), pList[i].getStart().getDate()); - } - - if ( pFormat== 'minute') - { - vDate.setHours(0); - vDate.setMinutes(0); - } - else if (pFormat == 'hour' ) - { - vDate.setHours(0); - vDate.setMinutes(0); - } - // Adjust min date to specific format boundaries (first of week or first of month) - else if (pFormat=='day') - { - vDate.setDate(vDate.getDate() - 1); - while(vDate.getDay() % 7 > 0) - { - vDate.setDate(vDate.getDate() - 1); - } - - } - - else if (pFormat=='week') - { - vDate.setDate(vDate.getDate() - 7); - while(vDate.getDay() % 7 > 0) - { - vDate.setDate(vDate.getDate() - 1); - } - - } - - else if (pFormat=='month') - { - while(vDate.getDate() > 1) - { - vDate.setDate(vDate.getDate() - 1); - } - } - - else if (pFormat=='quarter') - { - if( vDate.getMonth()==0 || vDate.getMonth()==1 || vDate.getMonth()==2 ) - {vDate.setFullYear(vDate.getFullYear(), 0, 1);} - else if( vDate.getMonth()==3 || vDate.getMonth()==4 || vDate.getMonth()==5 ) - {vDate.setFullYear(vDate.getFullYear(), 3, 1);} - else if( vDate.getMonth()==6 || vDate.getMonth()==7 || vDate.getMonth()==8 ) - {vDate.setFullYear(vDate.getFullYear(), 6, 1);} - else if( vDate.getMonth()==9 || vDate.getMonth()==10 || vDate.getMonth()==11 ) - {vDate.setFullYear(vDate.getFullYear(), 9, 1);} - - }; - - return(vDate); - - }; - - - - -/** -* Used to determine the minimum date of all tasks and set lower bound based on format -* -* @method getMaxDate -* @param pList {Array} - Array of TaskItem Objects -* @param pFormat {String} - current format (minute,hour,day...) -* @return {Datetime} -*/ -JSGantt.getMaxDate = function (pList, pFormat) -{ - var vDate = new Date(); - - vDate.setFullYear(pList[0].getEnd().getFullYear(), pList[0].getEnd().getMonth(), pList[0].getEnd().getDate()); - - - // Parse all Task End dates to find max - for(i = 0; i < pList.length; i++) - { - if(Date.parse(pList[i].getEnd()) > Date.parse(vDate)) - { - //vDate.setFullYear(pList[0].getEnd().getFullYear(), pList[0].getEnd().getMonth(), pList[0].getEnd().getDate()); - vDate.setTime(Date.parse(pList[i].getEnd())); - } - } - - if (pFormat == 'minute') - { - vDate.setHours(vDate.getHours() + 1); - vDate.setMinutes(59); - } - - if (pFormat == 'hour') - { - vDate.setHours(vDate.getHours() + 2); - } - - // Adjust max date to specific format boundaries (end of week or end of month) - if (pFormat=='day') - { - vDate.setDate(vDate.getDate() + 1); - - while(vDate.getDay() % 6 > 0) - { - vDate.setDate(vDate.getDate() + 1); - } - - } - - if (pFormat=='week') - { - //For weeks, what is the last logical boundary? - vDate.setDate(vDate.getDate() + 11); - - while(vDate.getDay() % 6 > 0) - { - vDate.setDate(vDate.getDate() + 1); - } - - } - - // Set to last day of current Month - if (pFormat=='month') - { - while(vDate.getDay() > 1) - { - vDate.setDate(vDate.getDate() + 1); - } - - vDate.setDate(vDate.getDate() - 1); - } - - // Set to last day of current Quarter - if (pFormat=='quarter') - { - if( vDate.getMonth()==0 || vDate.getMonth()==1 || vDate.getMonth()==2 ) - vDate.setFullYear(vDate.getFullYear(), 2, 31); - else if( vDate.getMonth()==3 || vDate.getMonth()==4 || vDate.getMonth()==5 ) - vDate.setFullYear(vDate.getFullYear(), 5, 30); - else if( vDate.getMonth()==6 || vDate.getMonth()==7 || vDate.getMonth()==8 ) - vDate.setFullYear(vDate.getFullYear(), 8, 30); - else if( vDate.getMonth()==9 || vDate.getMonth()==10 || vDate.getMonth()==11 ) - vDate.setFullYear(vDate.getFullYear(), 11, 31); - - } - - return(vDate); - - }; - - -/** -* Returns an object from the current DOM -* -* @method findObj -* @param theObj {String} - Object name -* @param theDoc {Document} - current document (DOM) -* @return {Object} -*/ -JSGantt.findObj = function (theObj, theDoc) - - { - - var p, i, foundObj; - - if(!theDoc) {theDoc = document;} - - if( (p = theObj.indexOf("?")) > 0 && parent.frames.length){ - - theDoc = parent.frames[theObj.substring(p+1)].document; - - theObj = theObj.substring(0,p); - - } - - if(!(foundObj = theDoc[theObj]) && theDoc.all) - - {foundObj = theDoc.all[theObj];} - - - - for (i=0; !foundObj && i < theDoc.forms.length; i++) - - {foundObj = theDoc.forms[i][theObj];} - - - - for(i=0; !foundObj && theDoc.layers && i < theDoc.layers.length; i++) - - {foundObj = JSGantt.findObj(theObj,theDoc.layers[i].document);} - - - - if(!foundObj && document.getElementById) - - {foundObj = document.getElementById(theObj);} - - - - return foundObj; - - }; - - -/** -* Change display format of current gantt chart -* -* @method changeFormat -* @param pFormat {String} - Current format (minute,hour,day...) -* @param ganttObj {GanttChart} - The gantt object -* @return {void} -*/ -JSGantt.changeFormat = function(pFormat,ganttObj) { - - if(ganttObj) - { - ganttObj.setFormat(pFormat); - ganttObj.DrawDependencies(); - } - else - {alert('Chart undefined');}; - }; - - -/** -* Open/Close and hide/show children of specified task -* -* @method folder -* @param pID {Number} - Task ID -* @param ganttObj {GanttChart} - The gantt object -* @return {void} -*/ -JSGantt.folder= function (pID,ganttObj) { - - var vList = ganttObj.getList(); - - for(i = 0; i < vList.length; i++) - { - if(vList[i].getID() == pID) { - - if( vList[i].getOpen() == 1 ) { - vList[i].setOpen(0); - JSGantt.hide(pID,ganttObj); - - if (JSGantt.isIE()) - {JSGantt.findObj('group_'+pID).innerText = '+';} - else - {JSGantt.findObj('group_'+pID).textContent = '+';} - - } else { - - vList[i].setOpen(1); - - JSGantt.show(pID, 1, ganttObj); - - if (JSGantt.isIE()) - {JSGantt.findObj('group_'+pID).innerText = '�';} - else - {JSGantt.findObj('group_'+pID).textContent = '�';} - - } - - } - } -}; - -/** -* Hide children of a task -* -* @method hide -* @param pID {Number} - Task ID -* @param ganttObj {GanttChart} - The gantt object -* @return {void} -*/ -JSGantt.hide= function (pID,ganttObj) { - var vList = ganttObj.getList(); - var vID = 0; - - for(var i = 0; i < vList.length; i++) - { - if(vList[i].getParent() == pID) { - vID = vList[i].getID(); - JSGantt.findObj('child_' + vID).style.display = "none"; - JSGantt.findObj('childgrid_' + vID).style.display = "none"; - vList[i].setVisible(0); - if(vList[i].getGroup() == 1) - {JSGantt.hide(vID,ganttObj);} - } - - } -}; - -/** -* Show children of a task -* -* @method show -* @param pID {Number} - Task ID -* @param ganttObj {GanttChart} - The gantt object -* @return {void} -*/ -JSGantt.show = function (pID, pTop, ganttObj) { - var vList = ganttObj.getList(); - var vID = 0; - - for(var i = 0; i < vList.length; i++) - { - if(vList[i].getParent() == pID) { - vID = vList[i].getID(); - if(pTop == 1) { - if (JSGantt.isIE()) { // IE; - - if( JSGantt.findObj('group_'+pID).innerText == '+') { - JSGantt.findObj('child_'+vID).style.display = ""; - JSGantt.findObj('childgrid_'+vID).style.display = ""; - vList[i].setVisible(1); - } - - } else { - - if( JSGantt.findObj('group_'+pID).textContent == '+') { - JSGantt.findObj('child_'+vID).style.display = ""; - JSGantt.findObj('childgrid_'+vID).style.display = ""; - vList[i].setVisible(1); - } - - } - - } else { - - if (JSGantt.isIE()) { // IE; - if( JSGantt.findObj('group_'+pID).innerText == '�') { - JSGantt.findObj('child_'+vID).style.display = ""; - JSGantt.findObj('childgrid_'+vID).style.display = ""; - vList[i].setVisible(1); - } - - } else { - - if( JSGantt.findObj('group_'+pID).textContent == '�') { - JSGantt.findObj('child_'+vID).style.display = ""; - JSGantt.findObj('childgrid_'+vID).style.display = ""; - vList[i].setVisible(1); - } - } - } - - if(vList[i].getGroup() == 1) - {JSGantt.show(vID, 0,ganttObj);} - - } - } -}; -/** -* Handles click events on task name, currently opens a new window -* -* @method taskLink -* @param pRef {String} - URL for window -* @param pWidth {Number} - Width of window -* @param pHeight {Number} - Height of window -* @return {void} -*/ -JSGantt.taskLink = function(pRef,pWidth,pHeight) - - { - - if(pWidth) {vWidth =pWidth;} else {vWidth =400;} - if(pHeight) {vHeight=pHeight;} else {vHeight=400;} - - // LDR To open in same window - //var OpenWindow=window.open(pRef, "newwin", "height="+vHeight+",width="+vWidth); - window.location.href=pRef - - }; - -/** -* Parse dates based on gantt date format setting as defined in JSGantt.GanttChart.setDateInputFormat() -* -* @method parseDateStr -* @param pDateStr {String} - A string that contains the date (i.e. "01/01/09") -* @param pFormatStr {String} - The date format (mm/dd/yyyy,dd/mm/yyyy,yyyy-mm-dd) -* @return {Datetime} -*/ -JSGantt.parseDateStr = function(pDateStr,pFormatStr) { - var vDate =new Date(); - vDate.setTime( Date.parse(pDateStr)); - - switch(pFormatStr) - { - case 'mm/dd/yyyy': - var vDateParts = pDateStr.split('/'); - vDate.setFullYear(parseInt(vDateParts[2], 10), parseInt(vDateParts[0], 10) - 1, parseInt(vDateParts[1], 10)); - break; - case 'dd/mm/yyyy': - var vDateParts = pDateStr.split('/'); - vDate.setFullYear(parseInt(vDateParts[2], 10), parseInt(vDateParts[1], 10) - 1, parseInt(vDateParts[0], 10)); - break; - case 'yyyy-mm-dd': - var vDateParts = pDateStr.split('-'); - vDate.setFullYear(parseInt(vDateParts[0], 10), parseInt(vDateParts[1], 10) - 1, parseInt(vDateParts[1], 10)); - break; +JSGantt.updateFlyingObj=function (e, pGanttChartObj, pTimer) { + var vCurTopBuf=3; + var vCurLeftBuf=5; + var vCurBotBuf=3; + var vCurRightBuf=15; + var vMouseX=(e)?e.clientX:window.event.clientX; + var vMouseY=(e)?e.clientY:window.event.clientY; + var vViewportX=document.documentElement.clientWidth||document.getElementsByTagName('body')[0].clientWidth; + var vViewportY=document.documentElement.clientHeight||document.getElementsByTagName('body')[0].clientHeight; + var vNewX=vMouseX; + var vNewY=vMouseY; + + if (navigator.appName.toLowerCase ()=='microsoft internet explorer') { + // the clientX and clientY properties include the left and top borders of the client area + vMouseX-=document.documentElement.clientLeft; + vMouseY-=document.documentElement.clientTop; + + var vZoomFactor=JSGantt.getZoomFactor (); + if (vZoomFactor!=1) {// IE 7 at non-default zoom level + vMouseX=Math.round (vMouseX / vZoomFactor); + vMouseY=Math.round (vMouseY / vZoomFactor); + } } + var vScrollPos=JSGantt.getScrollPositions(); + + /* Code for positioned right of the mouse by default*/ + /* + if (vMouseX+vCurRightBuf+pGanttChartObj.vTool.offsetWidth>vViewportX) + { + if (vMouseX-vCurLeftBuf-pGanttChartObj.vTool.offsetWidth<0) vNewX=vScrollPos.x; + else vNewX=vMouseX+vScrollPos.x-vCurLeftBuf-pGanttChartObj.vTool.offsetWidth; + } + else vNewX=vMouseX+vScrollPos.x+vCurRightBuf; + */ + + /* Code for positioned left of the mouse by default */ + if (vMouseX-vCurLeftBuf-pGanttChartObj.vTool.offsetWidth<0) + { + if (vMouseX+vCurRightBuf+pGanttChartObj.vTool.offsetWidth>vViewportX) vNewX=vScrollPos.x; + else vNewX=vMouseX+vScrollPos.x+vCurRightBuf; + } + else vNewX=vMouseX+vScrollPos.x-vCurLeftBuf-pGanttChartObj.vTool.offsetWidth; + + /* Code for positioned below the mouse by default */ + if (vMouseY+vCurBotBuf+pGanttChartObj.vTool.offsetHeight>vViewportY) + { + if (vMouseY-vCurTopBuf-pGanttChartObj.vTool.offsetHeight<0) vNewY=vScrollPos.y; + else vNewY=vMouseY+vScrollPos.y-vCurTopBuf-pGanttChartObj.vTool.offsetHeight; + } + else vNewY=vMouseY+vScrollPos.y+vCurBotBuf; + + /* Code for positioned above the mouse by default */ + /* + if (vMouseY-vCurTopBuf-pGanttChartObj.vTool.offsetHeight<0) + { + if (vMouseY+vCurBotBuf+pGanttChartObj.vTool.offsetHeight>vViewportY) vNewY=vScrollPos.y; + else vNewY=vMouseY+vScrollPos.y+vCurBotBuf; + } + else vNewY=vMouseY+vScrollPos.y-vCurTopBuf-pGanttChartObj.vTool.offsetHeight; + */ + + if (pGanttChartObj.getUseMove()) + { + clearInterval(pGanttChartObj.vTool.moveInterval); + pGanttChartObj.vTool.moveInterval=setInterval(function(){JSGantt.moveToolTip(vNewX, vNewY, pGanttChartObj.vTool, pTimer);},pTimer); + } + else + { + pGanttChartObj.vTool.style.left=vNewX +'px'; + pGanttChartObj.vTool.style.top=vNewY +'px'; + } +}; + +JSGantt.showToolTip=function(pGanttChartObj, e, pContents, pWidth, pTimer){ + var vTtDivId=pGanttChartObj.getDivId()+'JSGanttToolTip'; + var vMaxW=500; + var vMaxAlpha=100; + var vShowing=pContents.id; + + if(pGanttChartObj.getUseToolTip()) + { + if(pGanttChartObj.vTool==null){ + pGanttChartObj.vTool=document.createElement('div'); + pGanttChartObj.vTool.id=vTtDivId; + pGanttChartObj.vTool.className='JSGanttToolTip'; + pGanttChartObj.vTool.vToolCont=document.createElement('div'); + pGanttChartObj.vTool.vToolCont.id=vTtDivId+'cont'; + pGanttChartObj.vTool.vToolCont.className='JSGanttToolTipcont'; + pGanttChartObj.vTool.vToolCont.setAttribute('showing',''); + pGanttChartObj.vTool.appendChild(pGanttChartObj.vTool.vToolCont); + document.body.appendChild(pGanttChartObj.vTool); + pGanttChartObj.vTool.style.opacity=0; + pGanttChartObj.vTool.setAttribute('currentOpacity',0); + pGanttChartObj.vTool.setAttribute('fadeIncrement',10); + pGanttChartObj.vTool.setAttribute('moveSpeed',10); + pGanttChartObj.vTool.style.filter='alpha(opacity=0)'; + pGanttChartObj.vTool.style.visibility='hidden'; + pGanttChartObj.vTool.style.left=Math.floor(((e)?e.clientX:window.event.clientX)/2)+'px'; + pGanttChartObj.vTool.style.top=Math.floor(((e)?e.clientY:window.event.clientY)/2)+'px'; + JSGantt.addListener('mouseover', function () {clearTimeout(pGanttChartObj.vTool.delayTimeout);}, pGanttChartObj.vTool); + JSGantt.addListener('mouseout', function () {JSGantt.delayedHide(pGanttChartObj, pGanttChartObj.vTool, pTimer);}, pGanttChartObj.vTool); + } + clearTimeout(pGanttChartObj.vTool.delayTimeout); + if(pGanttChartObj.vTool.vToolCont.getAttribute('showing')!=vShowing || pGanttChartObj.vTool.style.visibility!='visible') + { + if (pGanttChartObj.vTool.vToolCont.getAttribute('showing')!=vShowing) + { + pGanttChartObj.vTool.vToolCont.setAttribute('showing',vShowing); + + pGanttChartObj.vTool.vToolCont.innerHTML=pContents.innerHTML; + // as we are allowing arbitrary HTML we should remove any tag ids to prevent duplication + JSGantt.stripIds(pGanttChartObj.vTool.vToolCont); + } + + pGanttChartObj.vTool.style.visibility='visible'; + // Rather than follow the mouse just have it stay put + JSGantt.updateFlyingObj(e, pGanttChartObj, pTimer); + pGanttChartObj.vTool.style.width=(pWidth)? pWidth+'px' : 'auto'; + if(!pWidth && JSGantt.isIE()){ + pGanttChartObj.vTool.style.width=pGanttChartObj.vTool.offsetWidth; + } + if(pGanttChartObj.vTool.offsetWidth>vMaxW){pGanttChartObj.vTool.style.width=vMaxW+'px';} + } + + if (pGanttChartObj.getUseFade()) + { + clearInterval(pGanttChartObj.vTool.fadeInterval); + pGanttChartObj.vTool.fadeInterval=setInterval(function(){JSGantt.fadeToolTip(1, pGanttChartObj.vTool, vMaxAlpha);},pTimer); + } + else + { + pGanttChartObj.vTool.style.opacity=vMaxAlpha * 0.01; + pGanttChartObj.vTool.style.filter='alpha(opacity='+vMaxAlpha+')'; + } + } +}; + +JSGantt.stripIds=function(pNode){ + for(var i=0; i=0 && pList[i].getID()==pID)vCurItem=pList[i]; + } + + for(i=0; ivMaxDate) + { + vMaxDate=pList[i].getEnd(); + vMaxSet=1; + } + + vCompSum+=pList[i].getCompVal(); + pList[i].setSortIdx(i*pList.length); + } + } + + if(pRow>=0) + { + if(pList[pRow].getGroupMinStart()!=null && pList[pRow].getGroupMinStart()vMaxDate) + { + vMaxDate=pList[pRow].getGroupMinEnd(); + } + pList[pRow].setStart(vMinDate); + pList[pRow].setEnd(vMaxDate); + pList[pRow].setNumKid(vNumKid); + pList[pRow].setCompVal(Math.ceil(vCompSum/vNumKid)); + } + + if (pID==0 && pUseSort==1) + { + JSGantt.sortTasks(pList, 0, 0); + pList.sort(function(a,b){return a.getSortIdx()-b.getSortIdx();}); + } + if (pID==0 && pUseSort!=1) // Need to sort combined tasks regardless + { + for(i=0; i0) + { + sortArr.sort(function(a,b){ var i=a.getStart().getTime()-b.getStart().getTime(); + if (i==0) i=a.getEnd().getTime()-b.getEnd().getTime(); + if (i==0) return a.getID()-b.getID(); + else return i; }); + } + + for (var j=0; j1) vDate.setDate(vDate.getDate()-1); + } + else if (pFormat=='quarter') + { + vDate.setDate(vDate.getDate()-31); + if(vDate.getMonth()==0 || vDate.getMonth()==1 || vDate.getMonth()==2) + vDate.setFullYear(vDate.getFullYear(), 0, 1); + else if(vDate.getMonth()==3 || vDate.getMonth()==4 || vDate.getMonth()==5) + vDate.setFullYear(vDate.getFullYear(), 3, 1); + else if(vDate.getMonth()==6 || vDate.getMonth()==7 || vDate.getMonth()==8) + vDate.setFullYear(vDate.getFullYear(), 6, 1); + else if(vDate.getMonth()==9 || vDate.getMonth()==10 || vDate.getMonth()==11) + vDate.setFullYear(vDate.getFullYear(), 9, 1); + } + else if (pFormat=='hour') + { + vDate.setHours(vDate.getHours()-1); + while(vDate.getHours()%6!=0) vDate.setHours(vDate.getHours()-1); + } + + if(pFormat=='hour')vDate.setMinutes(0,0); + else vDate.setHours(0,0,0); return(vDate); - }; -/** -* Display a formatted date based on gantt date format setting as defined in JSGantt.GanttChart.setDateDisplayFormat() -* -* @method formatDateStr -* @param pDate {Date} - A javascript date object -* @param pFormatStr {String} - The date format (mm/dd/yyyy,dd/mm/yyyy,yyyy-mm-dd...) -* @return {String} -*/ -JSGantt.formatDateStr = function(pDate,pFormatStr) { - vYear4Str = pDate.getFullYear() + ''; - vYear2Str = vYear4Str.substring(2,4); - vMonthStr = (pDate.getMonth()+1) + ''; - vDayStr = pDate.getDate() + ''; +// Used to determine the maximum date of all tasks and set upper bound based on format +JSGantt.getMaxDate=function (pList, pFormat) +{ + var vDate=new Date(); - var vDateStr = ""; + vDate.setTime(pList[0].getEnd().getTime()); - switch(pFormatStr) { - case 'mm/dd/yyyy': - return( vMonthStr + '/' + vDayStr + '/' + vYear4Str ); - case 'dd/mm/yyyy': - return( vDayStr + '/' + vMonthStr + '/' + vYear4Str ); - case 'yyyy-mm-dd': - return( vYear4Str + '-' + vMonthStr + '-' + vDayStr ); - case 'mm/dd/yy': - return( vMonthStr + '/' + vDayStr + '/' + vYear2Str ); - case 'dd/mm/yy': - return( vDayStr + '/' + vMonthStr + '/' + vYear2Str ); - case 'yy-mm-dd': - return( vYear2Str + '-' + vMonthStr + '-' + vDayStr ); - case 'mm/dd': - return( vMonthStr + '/' + vDayStr ); - case 'dd/mm': - return( vDayStr + '/' + vMonthStr ); - } - + // Parse all Task End dates to find max + for(var i=0; ivDate.getTime()) vDate.setTime(pList[i].getEnd().getTime()); + } + + // Adjust max date to specific format boundaries (end of week or end of month) + if (pFormat=='day') + { + vDate.setDate(vDate.getDate()+1); + + while(vDate.getDay()%7!=0) vDate.setDate(vDate.getDate()+1); + } + else if (pFormat=='week') + { + //For weeks, what is the last logical boundary? + vDate.setDate(vDate.getDate()+1); + + while(vDate.getDay()%7!=0) vDate.setDate(vDate.getDate()+1); + } + else if (pFormat=='month') + { + // Set to last day of current Month + while(vDate.getDate()>1) vDate.setDate(vDate.getDate()+1); + vDate.setDate(vDate.getDate()-1); + } + else if (pFormat=='quarter') + { + // Set to last day of current Quarter + if(vDate.getMonth()==0 || vDate.getMonth()==1 || vDate.getMonth()==2) + vDate.setFullYear(vDate.getFullYear(), 2, 31); + else if(vDate.getMonth()==3 || vDate.getMonth()==4 || vDate.getMonth()==5) + vDate.setFullYear(vDate.getFullYear(), 5, 30); + else if(vDate.getMonth()==6 || vDate.getMonth()==7 || vDate.getMonth()==8) + vDate.setFullYear(vDate.getFullYear(), 8, 30); + else if(vDate.getMonth()==9 || vDate.getMonth()==10 || vDate.getMonth()==11) + vDate.setFullYear(vDate.getFullYear(), 11, 31); + } + else if (pFormat=='hour') + { + if(vDate.getHours()==0)vDate.setDate(vDate.getDate()+1); + vDate.setHours(vDate.getHours()+1); + + while(vDate.getHours()%6!=5) vDate.setHours(vDate.getHours()+1); + } + return(vDate); }; -/** -* Parse an external XML file containing task items. -* -* @method parseXML -* @param ThisFile {String} - URL to XML file -* @param pGanttVar {Gantt} - Gantt object -* @return {void} -*/ -JSGantt.parseXML = function(ThisFile,pGanttVar){ - var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1; // Is this Chrome - - try { //Internet Explorer - xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); - } - catch(e) { - try { //Firefox, Mozilla, Opera, Chrome etc. - if (is_chrome==false) { xmlDoc=document.implementation.createDocument("","",null); } - } - catch(e) { - alert(e.message); - return; - } - } - - if (is_chrome==false) { // can't use xmlDoc.load in chrome at the moment - xmlDoc.async=false; - xmlDoc.load(ThisFile); // we can use loadxml - JSGantt.AddXMLTask(pGanttVar); - xmlDoc=null; // a little tidying - Task = null; - } - else { - JSGantt.ChromeLoadXML(ThisFile,pGanttVar); - ta=null; // a little tidying - } +// This function finds the document id of the specified object +JSGantt.findObj=function (theObj, theDoc) +{ + var p, i, foundObj; + if(!theDoc) theDoc=document; + if(document.getElementById) foundObj=document.getElementById(theObj); + return foundObj; }; -/** -* Add a task based on parsed XML doc -* -* @method AddXMLTask -* @param pGanttVar {Gantt} - Gantt object -* @return {void} -*/ -JSGantt.AddXMLTask = function(pGanttVar){ - - Task=xmlDoc.getElementsByTagName("task"); - - var n = xmlDoc.documentElement.childNodes.length; // the number of tasks. IE gets this right, but mozilla add extra ones (Whitespace) - - for(var i=0;i/gi); - - var n = ta.length; // the number of tasks. - for(var i=1;i/i); - - if(te.length> 2){var pID=te[1];} else {var pID = 0;} - pID *= 1; - - var te = Task.split(//i); - if(te.length> 2){var pName=te[1];} else {var pName = "No Task Name";} - - var te = Task.split(//i); - if(te.length> 2){var pStart=te[1];} else {var pStart = "";} - - var te = Task.split(//i); - if(te.length> 2){var pEnd=te[1];} else {var pEnd = "";} - - var te = Task.split(//i); - if(te.length> 2){var pColor=te[1];} else {var pColor = '0000ff';} - - var te = Task.split(//i); - if(te.length> 2){var pLink=te[1];} else {var pLink = "";} - - var te = Task.split(//i); - if(te.length> 2){var pMile=te[1];} else {var pMile = 0;} - pMile *= 1; - - var te = Task.split(//i); - if(te.length> 2){var pRes=te[1];} else {var pRes = "";} - - var te = Task.split(//i); - if(te.length> 2){var pComp=te[1];} else {var pComp = 0;} - pComp *= 1; - - var te = Task.split(//i); - if(te.length> 2){var pGroup=te[1];} else {var pGroup = 0;} - pGroup *= 1; - - var te = Task.split(//i); - if(te.length> 2){var pParent=te[1];} else {var pParent = 0;} - pParent *= 1; - - var te = Task.split(//i); - if(te.length> 2){var pOpen=te[1];} else {var pOpen = 1;} - pOpen *= 1; - - var te = Task.split(//i); - if(te.length> 2){var pDepend=te[1];} else {var pDepend = "";} - //pDepend *= 1; - if (pDepend.length==0){pDepend=''} // need this to draw the dependency lines - - var te = Task.split(//i); - if(te.length> 2){var pCaption=te[1];} else {var pCaption = "";} - - // Finally add the task - pGanttVar.AddTaskItem(new JSGantt.TaskItem(pID , pName, pStart, pEnd, pColor, pLink, pMile, pRes, pComp, pGroup, pParent, pOpen, pDepend,pCaption )); - }; - }; -}; -/** -* Used for benchmarking performace -* -* @method benchMark -* @param pItem {TaskItem} - TaskItem object -* @return {void} -*/ -JSGantt.benchMark = function(pItem){ - var vEndTime=new Date().getTime(); - alert(pItem + ': Elapsed time: '+((vEndTime-vBenchTime)/1000)+' seconds.'); - vBenchTime=new Date().getTime(); + for(var i=0; i=52 && vMonthStr==1) vYear--; + if (vWeekNum==1 && vMonthStr==12) vYear++; + if (vWeekNum<10) vWeekNum='0'+vWeekNum; + + vDateStr+=vYear+'-W'+vWeekNum+'-'+vDayOfWeek; + break; + default: + if (pL[pDateFormatArr[i].toLowerCase()]) vDateStr+=pL[pDateFormatArr[i].toLowerCase()]; + else vDateStr+=pDateFormatArr[i]; + break; + } + } + return vDateStr; +}; + +JSGantt.parseDateFormatStr=function(pFormatStr) +{ + var vDateStr=''; + var vComponantStr=''; + var vCurrChar=''; + var vSeparators=new RegExp('[\/\\ -.,\'":]'); + var vDateFormatArray=new Array(); + + for (var i=0; i0) project=projNode[0].getAttribute('xmlns'); + + if(project=='http://schemas.microsoft.com/project') + { + vMSP=true; + pGanttVar.setDateInputFormat('yyyy-mm-dd'); + Task=JSGantt.findXMLNode(pXmlDoc,'Task'); + if (typeof Task=='undefined')n=0; + else n=Task.length; + + var resources=JSGantt.findXMLNode(pXmlDoc,'Resource'); + if (typeof resources=='undefined'){n=0; m=0;} + else m=resources.length; + + for(i=0;i0 && uid>0) res[uid]=resname; + } + + var assignments=JSGantt.findXMLNode(pXmlDoc,'Assignment'); + if (typeof assignments=='undefined') j=0; + else j=assignments.length; + + for(i=0;i0) + { + if (resUID>0) assRes[uid]=res[resUID]; + ass[uid]=assignments[i]; + } + } + + // Store information about parent UIDs in an easily searchable form + for(i=0;i0) pars[vOutlineNumber]=uid; + if (uid>maxPID)maxPID=uid; + } + + for(i=0;i1) + { + vOutlineNumber=JSGantt.getXMLNodeValue(Task[i],'OutlineNumber',2,'0'); + pParent=pars[vOutlineNumber.substr(0, vOutlineNumber.lastIndexOf('.'))]; + } + + try {var pNotes=Task[i].getElementsByTagName('Notes')[0].childNodes[1].nodeValue; //this should be a CDATA node + } catch (error) + {pNotes ='';} + + if(typeof assRes[pID]!='undefined') var pRes=assRes[pID]; + else pRes=''; + + var predecessors=JSGantt.findXMLNode(Task[i],'PredecessorLink'); + if (typeof predecessors=='undefined') j=0; + else j=predecessors.length; + var pDepend=''; + + for(k=0;k0) + { + if (pDepend.length>0)pDepend+=','; + switch(depType) + { + case 0: pDepend+=depUID+'FF'; break; + case 1: pDepend+=depUID+'FS'; break; + case 2: pDepend+=depUID+'SF'; break; + case 3: pDepend+=depUID+'SS'; break; + default: pDepend+=depUID+'FS'; break; + } + } + } + + var pOpen=1; + var pCaption=''; + + if(pGroup>0) var pClass ='ggroupblack'; + else if(pMile>0) pClass ='gmilestone'; + else pClass ='gtaskblue'; + + // check for split tasks + + var splits=JSGantt.findXMLNode(ass[pID],'TimephasedData'); + if (typeof splits=='undefined') j=0; + else j=splits.length; + + var vSplitStart=pStart; + var vSplitEnd=pEnd; + var vSubCreated=false; + var vDepend=pDepend.replace(/,*[0-9]+[FS]F/g,''); + + for(k=0;k0) pClass ='ggroupblack'; + else if(pMile>0) pClass ='gmilestone'; + else pClass ='gtaskblue'; + } + + // Finally add the task + pGanttVar.AddTaskItem(new JSGantt.TaskItem(pID, pName, pStart, pEnd, pClass, pLink, pMile, pRes, pComp, pGroup, pParent, pOpen, pDepend, pCaption, pNotes, pGanttVar)); + } + } + } +}; + + +JSGantt.benchMark=function(pItem) +{ + var vEndTime=new Date().getTime(); + alert(pItem+': Elapsed time: '+((vEndTime-vBenchTime)/1000)+' seconds.'); + vBenchTime=new Date().getTime(); +}; + +JSGantt.getIsoWeek=function(pDate){ + // We have to compare against the monday of the first week of the year containing 04 jan *not* 01/01 + // 60*60*24*1000=86400000 + var dayMiliseconds=86400000; + var keyDay=new Date(pDate.getFullYear(),0,4,0,0,0); + var keyDayOfWeek=(keyDay.getDay()==0) ? 6 : keyDay.getDay()-1; // define monday as 0 + var firstMondayYearTime=keyDay.getTime()-(keyDayOfWeek * dayMiliseconds); + var thisDate=new Date(pDate.getFullYear(), pDate.getMonth(),pDate.getDate(),0,0,0); // This at 00:00:00 + var thisTime=thisDate.getTime(); + var daysFromFirstMonday=Math.round(((thisTime-firstMondayYearTime) / dayMiliseconds)); + var lastWeek=99; + var thisWeek=99; + + var firstMondayYear=new Date(firstMondayYearTime); + + thisWeek=Math.ceil((daysFromFirstMonday+1)/7); + + if (thisWeek<=0) thisWeek=JSGantt.getIsoWeek(new Date(pDate.getFullYear()-1,11,31,0,0,0)); + else if (thisWeek==53 && (new Date(pDate.getFullYear(),0,1,0,0,0)).getDay()!=4 && (new Date(pDate.getFullYear(),11,31,0,0,0)).getDay()!=4) thisWeek=1; + return thisWeek; +}; + +JSGantt.addListener=function (eventName, handler, control) +{ + // Check if control is a string + if (control===String(control)) control=JSGantt.findObj(control); + + if(control.addEventListener) //Standard W3C + { + return control.addEventListener(eventName, handler, false); + } + else if (control.attachEvent) //IExplore + { + return control.attachEvent('on'+eventName, handler); + } + else + { + return false; + } +}; + +JSGantt.addTooltipListeners=function(pGanttChart, pObj1, pObj2) +{ + JSGantt.addListener('mouseover', function (e) {JSGantt.showToolTip(pGanttChart, e, pObj2, null, pGanttChart.getTimer());}, pObj1); + JSGantt.addListener('mouseout', function (e) {JSGantt.delayedHide(pGanttChart, pGanttChart.vTool, pGanttChart.getTimer());}, pObj1); +}; + +JSGantt.addThisRowListeners=function(pGanttChart, pObj1, pObj2) +{ + JSGantt.addListener('mouseover', function () {pGanttChart.mouseOver(pObj1, pObj2);}, pObj1); + JSGantt.addListener('mouseover', function () {pGanttChart.mouseOver(pObj1, pObj2);}, pObj2); + JSGantt.addListener('mouseout', function () {pGanttChart.mouseOut(pObj1, pObj2);}, pObj1); + JSGantt.addListener('mouseout', function () {pGanttChart.mouseOut(pObj1, pObj2);}, pObj2); +}; + +JSGantt.addFolderListeners=function(pGanttChart, pObj, pID) +{ + JSGantt.addListener('click', function () {JSGantt.folder(pID, pGanttChart);}, pObj); +}; + +JSGantt.addFormatListeners=function(pGanttChart, pFormat, pObj) +{ + JSGantt.addListener('click', function () {JSGantt.changeFormat(pFormat, pGanttChart);}, pObj); +}; + +JSGantt.addScrollListeners=function(pGanttChart) +{ + JSGantt.addListener('scroll', function () {pGanttChart.getChartBody().scrollTop=pGanttChart.getListBody().scrollTop;}, pGanttChart.getListBody()); + JSGantt.addListener('scroll', function () {pGanttChart.getListBody().scrollTop=pGanttChart.getChartBody().scrollTop;}, pGanttChart.getChartBody()); + JSGantt.addListener('scroll', function () {pGanttChart.getChartHead().scrollLeft=pGanttChart.getChartBody().scrollLeft;}, pGanttChart.getChartBody()); + JSGantt.addListener('scroll', function () {pGanttChart.getChartBody().scrollLeft=pGanttChart.getChartHead().scrollLeft;}, pGanttChart.getChartHead()); + JSGantt.addListener('resize', function () {pGanttChart.getChartHead().scrollLeft=pGanttChart.getChartBody().scrollLeft;}, window); + JSGantt.addListener('resize', function () {pGanttChart.getListBody().scrollTop=pGanttChart.getChartBody().scrollTop;}, window); +}; diff --git a/htdocs/includes/jsgantt/jsgantt.min.js b/htdocs/includes/jsgantt/jsgantt.min.js index 2d0a23d4a0d..9ec44995993 100644 --- a/htdocs/includes/jsgantt/jsgantt.min.js +++ b/htdocs/includes/jsgantt/jsgantt.min.js @@ -1 +1,2 @@ -var JSGantt;if(!JSGantt)JSGantt={};var vTimeout=0;var vBenchTime=new Date().getTime();JSGantt.TaskItem=function(pID,pName,pStart,pEnd,pColor,pLink,pMile,pRes,pComp,pGroup,pParent,pOpen,pDepend,pCaption){var vID=pID;var vName=pName;var vStart=new Date();var vEnd=new Date();var vColor=pColor;var vLink=pLink;var vMile=pMile;var vRes=pRes;var vComp=pComp;var vGroup=pGroup;var vParent=pParent;var vOpen=pOpen;var vDepend=pDepend;var vCaption=pCaption;var vDuration='';var vLevel=0;var vNumKid=0;var vVisible=1;var x1,y1,x2,y2;if(vGroup!=1){vStart=JSGantt.parseDateStr(pStart,g.getDateInputFormat());vEnd=JSGantt.parseDateStr(pEnd,g.getDateInputFormat())}this.getID=function(){return vID};this.getName=function(){return vName};this.getStart=function(){return vStart};this.getEnd=function(){return vEnd};this.getColor=function(){return vColor};this.getLink=function(){return vLink};this.getMile=function(){return vMile};this.getDepend=function(){if(vDepend)return vDepend;else return null};this.getCaption=function(){if(vCaption)return vCaption;else return''};this.getResource=function(){if(vRes)return vRes;else return' '};this.getCompVal=function(){if(vComp)return vComp;else return 0};this.getCompStr=function(){if(vComp)return vComp+'%';else return''};this.getDuration=function(vFormat){if(vMile)vDuration='-';else if(vFormat=='hour'){tmpPer=Math.ceil((this.getEnd()-this.getStart())/(60*60*1000));if(tmpPer==1)vDuration='1 Hour';else vDuration=tmpPer+' Hours'}else if(vFormat=='minute'){tmpPer=Math.ceil((this.getEnd()-this.getStart())/(60*1000));if(tmpPer==1)vDuration='1 Minute';else vDuration=tmpPer+' Minutes'}else{tmpPer=Math.ceil((this.getEnd()-this.getStart())/(24*60*60*1000)+1);if(tmpPer==1)vDuration='1 Day';else vDuration=tmpPer+' Days'}return(vDuration)};this.getParent=function(){return vParent};this.getGroup=function(){return vGroup};this.getOpen=function(){return vOpen};this.getLevel=function(){return vLevel};this.getNumKids=function(){return vNumKid};this.getStartX=function(){return x1};this.getStartY=function(){return y1};this.getEndX=function(){return x2};this.getEndY=function(){return y2};this.getVisible=function(){return vVisible};this.setDepend=function(pDepend){vDepend=pDepend};this.setStart=function(pStart){vStart=pStart};this.setEnd=function(pEnd){vEnd=pEnd};this.setLevel=function(pLevel){vLevel=pLevel};this.setNumKid=function(pNumKid){vNumKid=pNumKid};this.setCompVal=function(pCompVal){vComp=pCompVal};this.setStartX=function(pX){x1=pX};this.setStartY=function(pY){y1=pY};this.setEndX=function(pX){x2=pX};this.setEndY=function(pY){y2=pY};this.setOpen=function(pOpen){vOpen=pOpen};this.setVisible=function(pVisible){vVisible=pVisible}};JSGantt.GanttChart=function(pGanttVar,pDiv,pFormat){var vGanttVar=pGanttVar;var vDiv=pDiv;var vFormat=pFormat;var vShowRes=1;var vShowDur=1;var vShowComp=1;var vShowStartDate=1;var vShowEndDate=1;var vDateInputFormat="mm/dd/yyyy";var vDateDisplayFormat="mm/dd/yy";var vNumUnits=0;var vCaptionType;var vDepId=1;var vTaskList=new Array();var vFormatArr=new Array("day","week","month","quarter");var vQuarterArr=new Array(1,1,1,2,2,2,3,3,3,4,4,4);var vMonthDaysArr=new Array(31,28,31,30,31,30,31,31,30,31,30,31);var vMonthArr=new Array("January","February","March","April","May","June","July","August","September","October","November","December");this.setFormatArr=function(){vFormatArr=new Array();for(var i=0;i4){vFormatArr.length=4}};this.setShowRes=function(pShow){vShowRes=pShow};this.setShowDur=function(pShow){vShowDur=pShow};this.setShowComp=function(pShow){vShowComp=pShow};this.setShowStartDate=function(pShow){vShowStartDate=pShow};this.setShowEndDate=function(pShow){vShowEndDate=pShow};this.setDateInputFormat=function(pShow){vDateInputFormat=pShow};this.setDateDisplayFormat=function(pShow){vDateDisplayFormat=pShow};this.setCaptionType=function(pType){vCaptionType=pType};this.setFormat=function(pFormat){vFormat=pFormat;this.Draw()};this.getShowRes=function(){return vShowRes};this.getShowDur=function(){return vShowDur};this.getShowComp=function(){return vShowComp};this.getShowStartDate=function(){return vShowStartDate};this.getShowEndDate=function(){return vShowEndDate};this.getDateInputFormat=function(){return vDateInputFormat};this.getDateDisplayFormat=function(){return vDateDisplayFormat};this.getCaptionType=function(){return vCaptionType};this.CalcTaskXY=function(){var vList=this.getList();var vTaskDiv;var vParDiv;var vLeft,vTop,vHeight,vWidth;for(i=0;i0){JSGantt.processRows(vTaskList,0,-1,1,1);vMinDate=JSGantt.getMinDate(vTaskList,vFormat);vMaxDate=JSGantt.getMaxDate(vTaskList,vFormat);if(vFormat=='day'){vColWidth=18;vColUnit=1}else if(vFormat=='week'){vColWidth=37;vColUnit=7}else if(vFormat=='month'){vColWidth=37;vColUnit=30}else if(vFormat=='quarter'){vColWidth=60;vColUnit=90}else if(vFormat=='hour'){vColWidth=18;vColUnit=1}else if(vFormat=='minute'){vColWidth=18;vColUnit=1}vNumDays=(Date.parse(vMaxDate)-Date.parse(vMinDate))/(24*60*60*1000);vNumUnits=vNumDays/vColUnit;vChartWidth=vNumUnits*vColWidth+1;vDayWidth=(vColWidth/vColUnit)+(1/vColUnit);vMainTable=''+'';vMainTable+=vLeftTable;vRightTable='
';if(vShowRes!=1)vNameWidth+=vStatusWidth;if(vShowDur!=1)vNameWidth+=vStatusWidth;if(vShowComp!=1)vNameWidth+=vStatusWidth;if(vShowStartDate!=1)vNameWidth+=vStatusWidth;if(vShowEndDate!=1)vNameWidth+=vStatusWidth;vLeftTable='
'+''+' '+' ';if(vShowRes==1)vLeftTable+=' ';if(vShowDur==1)vLeftTable+=' ';if(vShowComp==1)vLeftTable+=' ';if(vShowStartDate==1)vLeftTable+=' ';if(vShowEndDate==1)vLeftTable+=' ';vLeftTable+=''+' '+' ';if(vShowRes==1)vLeftTable+=' ';if(vShowDur==1)vLeftTable+=' ';if(vShowComp==1)vLeftTable+=' ';if(vShowStartDate==1)vLeftTable+=' ';if(vShowEndDate==1)vLeftTable+=' ';vLeftTable+='';for(i=0;i';vLeftTable+=' '+' ';if(vShowRes==1)vLeftTable+=' ';if(vShowDur==1)vLeftTable+=' ';if(vShowComp==1)vLeftTable+=' ';if(vShowStartDate==1)vLeftTable+=' ';if(vShowEndDate==1)vLeftTable+=' ';vLeftTable+=''}vLeftTable+=''+'
ResourceDuration% Comp.Start DateEnd Date
 ';for(j=1;j';if(vTaskList[i].getGroup()){if(vTaskList[i].getOpen()==1)vLeftTable+=' ';else vLeftTable+='+ '}else{vLeftTable+='   '}vLeftTable+=' '+vTaskList[i].getName()+''+vTaskList[i].getResource()+''+vTaskList[i].getDuration(vFormat)+''+vTaskList[i].getCompStr()+''+JSGantt.formatDateStr(vTaskList[i].getStart(),vDateDisplayFormat)+''+JSGantt.formatDateStr(vTaskList[i].getEnd(),vDateDisplayFormat)+'
  Powered by jsGantt      Format:';if(vFormatArr.join().indexOf("minute")!=-1){if(vFormat=='minute')vLeftTable+='Minute';else vLeftTable+='Minute'}if(vFormatArr.join().indexOf("hour")!=-1){if(vFormat=='hour')vLeftTable+='Hour';else vLeftTable+='Hour'}if(vFormatArr.join().indexOf("day")!=-1){if(vFormat=='day')vLeftTable+='Day';else vLeftTable+='Day'}if(vFormatArr.join().indexOf("week")!=-1){if(vFormat=='week')vLeftTable+='Week';else vLeftTable+='Week'}if(vFormatArr.join().indexOf("month")!=-1){if(vFormat=='month')vLeftTable+='Month';else vLeftTable+='Month'}if(vFormatArr.join().indexOf("quarter")!=-1){if(vFormat=='quarter')vLeftTable+='Quarter';else vLeftTable+='Quarter'}vLeftTable+='
'+'
'+''+'';vTmpDate.setFullYear(vMinDate.getFullYear(),vMinDate.getMonth(),vMinDate.getDate());vTmpDate.setHours(0);vTmpDate.setMinutes(0);while(Date.parse(vTmpDate)<=Date.parse(vMaxDate)){vStr=vTmpDate.getFullYear()+'';vStr=vStr.substring(2,4);if(vFormat=='minute'){vRightTable+='';vTmpDate.setHours(vTmpDate.getHours()+1)}if(vFormat=='hour'){vRightTable+='';vTmpDate.setDate(vTmpDate.getDate()+1)}if(vFormat=='day'){vRightTable+='';vTmpDate.setDate(vTmpDate.getDate()+1)}else if(vFormat=='week'){vRightTable+='';vTmpDate.setDate(vTmpDate.getDate()+7)}else if(vFormat=='month'){vRightTable+='';vTmpDate.setDate(vTmpDate.getDate()+1);while(vTmpDate.getDate()>1){vTmpDate.setDate(vTmpDate.getDate()+1)}}else if(vFormat=='quarter'){vRightTable+='';vTmpDate.setDate(vTmpDate.getDate()+81);while(vTmpDate.getDate()>1){vTmpDate.setDate(vTmpDate.getDate()+1)}}}vRightTable+='';vTmpDate.setFullYear(vMinDate.getFullYear(),vMinDate.getMonth(),vMinDate.getDate());vNxtDate.setFullYear(vMinDate.getFullYear(),vMinDate.getMonth(),vMinDate.getDate());vNumCols=0;while(Date.parse(vTmpDate)<=Date.parse(vMaxDate)){if(vFormat=='minute'){if(vTmpDate.getMinutes()==0)vWeekdayColor="ccccff";else vWeekdayColor="ffffff";vDateRowStr+='';vItemRowStr+='';vTmpDate.setMinutes(vTmpDate.getMinutes()+1)}else if(vFormat=='hour'){if(vTmpDate.getHours()==0)vWeekdayColor="ccccff";else vWeekdayColor="ffffff";vDateRowStr+='';vItemRowStr+='';vTmpDate.setHours(vTmpDate.getHours()+1)}else if(vFormat=='day'){if(JSGantt.formatDateStr(vCurrDate,'mm/dd/yyyy')==JSGantt.formatDateStr(vTmpDate,'mm/dd/yyyy')){vWeekdayColor="ccccff";vWeekendColor="9999ff";vWeekdayGColor="bbbbff";vWeekendGColor="8888ff"}else{vWeekdayColor="ffffff";vWeekendColor="cfcfcf";vWeekdayGColor="f3f3f3";vWeekendGColor="c3c3c3"}if(vTmpDate.getDay()%6==0){vDateRowStr+='';vItemRowStr+=''}else{vDateRowStr+='';if(JSGantt.formatDateStr(vCurrDate,'mm/dd/yyyy')==JSGantt.formatDateStr(vTmpDate,'mm/dd/yyyy'))vItemRowStr+='';else vItemRowStr+=''}vTmpDate.setDate(vTmpDate.getDate()+1)}else if(vFormat=='week'){vNxtDate.setDate(vNxtDate.getDate()+7);if(vCurrDate>=vTmpDate&&vCurrDate
'+(vTmpDate.getMonth()+1)+'/'+vTmpDate.getDate()+'
';if(vCurrDate>=vTmpDate&&vCurrDate
  
';else vItemRowStr+='
'}else{vDateRowStr+='';if(vCurrDate>=vTmpDate&&vCurrDate
  
';else vItemRowStr+='
'}vTmpDate.setDate(vTmpDate.getDate()+7)}else if(vFormat=='month'){vNxtDate.setFullYear(vTmpDate.getFullYear(),vTmpDate.getMonth(),vMonthDaysArr[vTmpDate.getMonth()]);if(vCurrDate>=vTmpDate&&vCurrDate
'+vMonthArr[vTmpDate.getMonth()].substr(0,3)+'
';if(vCurrDate>=vTmpDate&&vCurrDate
  
';else vItemRowStr+='
'}else{vDateRowStr+='';if(vCurrDate>=vTmpDate&&vCurrDate
  
';else vItemRowStr+='
'}vTmpDate.setDate(vTmpDate.getDate()+1);while(vTmpDate.getDate()>1){vTmpDate.setDate(vTmpDate.getDate()+1)}}else if(vFormat=='quarter'){vNxtDate.setDate(vNxtDate.getDate()+122);if(vTmpDate.getMonth()==0||vTmpDate.getMonth()==1||vTmpDate.getMonth()==2)vNxtDate.setFullYear(vTmpDate.getFullYear(),2,31);else if(vTmpDate.getMonth()==3||vTmpDate.getMonth()==4||vTmpDate.getMonth()==5)vNxtDate.setFullYear(vTmpDate.getFullYear(),5,30);else if(vTmpDate.getMonth()==6||vTmpDate.getMonth()==7||vTmpDate.getMonth()==8)vNxtDate.setFullYear(vTmpDate.getFullYear(),8,30);else if(vTmpDate.getMonth()==9||vTmpDate.getMonth()==10||vTmpDate.getMonth()==11)vNxtDate.setFullYear(vTmpDate.getFullYear(),11,31);if(vCurrDate>=vTmpDate&&vCurrDate
Qtr. '+vQuarterArr[vTmpDate.getMonth()]+'
';if(vCurrDate>=vTmpDate&&vCurrDate
  
';else vItemRowStr+='
'}else{vDateRowStr+='';if(vCurrDate>=vTmpDate&&vCurrDate
  
';else vItemRowStr+='
'}vTmpDate.setDate(vTmpDate.getDate()+81);while(vTmpDate.getDate()>1){vTmpDate.setDate(vTmpDate.getDate()+1)}}}vRightTable+=vDateRowStr+'';vRightTable+='
';vRightTable+=JSGantt.formatDateStr(vTmpDate,vDateDisplayFormat)+' '+vTmpDate.getHours()+':00 -'+vTmpDate.getHours()+':59 ';vRightTable+=JSGantt.formatDateStr(vTmpDate,vDateDisplayFormat)+''+JSGantt.formatDateStr(vTmpDate,vDateDisplayFormat.substring(0,5))+' - ';vTmpDate.setDate(vTmpDate.getDate()+6);vRightTable+=JSGantt.formatDateStr(vTmpDate,vDateDisplayFormat)+'`'+vStr+'`'+vStr+'`'+vStr+'
'+vTmpDate.getMinutes()+'
  
'+vTmpDate.getHours()+'
  
'+vTmpDate.getDate()+'
 
'+vTmpDate.getDate()+'
  
  
  
'+(vTmpDate.getMonth()+1)+'/'+vTmpDate.getDate()+'
  
  
'+vMonthArr[vTmpDate.getMonth()].substr(0,3)+'
  
  
Qtr. '+vQuarterArr[vTmpDate.getMonth()]+'
  
';for(i=0;i
'}vMainTable+=vRightTable+'
';vDiv.innerHTML=vMainTable}};this.mouseOver=function(pObj,pID,pPos,pType){if(pPos=='right')vID='child_'+pID;else vID='childrow_'+pID;pObj.bgColor="#ffffaa";vRowObj=JSGantt.findObj(vID);if(vRowObj)vRowObj.bgColor="#ffffaa"};this.mouseOut=function(pObj,pID,pPos,pType){if(pPos=='right')vID='child_'+pID;else vID='childrow_'+pID;pObj.bgColor="#ffffff";vRowObj=JSGantt.findObj(vID);if(vRowObj){if(pType=="group"){pObj.bgColor="#f3f3f3";vRowObj.bgColor="#f3f3f3"}else{pObj.bgColor="#ffffff";vRowObj.bgColor="#ffffff"}}}};JSGantt.isIE=function(){if(typeof document.all!='undefined'){return true}else{return false}};JSGantt.processRows=function(pList,pID,pRow,pLevel,pOpen){var vMinDate=new Date();var vMaxDate=new Date();var vMinSet=0;var vMaxSet=0;var vList=pList;var vLevel=pLevel;var i=0;var vNumKid=0;var vCompSum=0;var vVisible=pOpen;for(i=0;ivMaxDate){vMaxDate=pList[i].getEnd();vMaxSet=1};vCompSum+=pList[i].getCompVal()}}if(pRow>=0){pList[pRow].setStart(vMinDate);pList[pRow].setEnd(vMaxDate);pList[pRow].setNumKid(vNumKid);pList[pRow].setCompVal(Math.ceil(vCompSum/vNumKid))}};JSGantt.getMinDate=function getMinDate(pList,pFormat){var vDate=new Date();vDate.setFullYear(pList[0].getStart().getFullYear(),pList[0].getStart().getMonth(),pList[0].getStart().getDate());for(i=0;i0){vDate.setDate(vDate.getDate()-1)}}else if(pFormat=='week'){vDate.setDate(vDate.getDate()-7);while(vDate.getDay()%7>0){vDate.setDate(vDate.getDate()-1)}}else if(pFormat=='month'){while(vDate.getDate()>1){vDate.setDate(vDate.getDate()-1)}}else if(pFormat=='quarter'){if(vDate.getMonth()==0||vDate.getMonth()==1||vDate.getMonth()==2){vDate.setFullYear(vDate.getFullYear(),0,1)}else if(vDate.getMonth()==3||vDate.getMonth()==4||vDate.getMonth()==5){vDate.setFullYear(vDate.getFullYear(),3,1)}else if(vDate.getMonth()==6||vDate.getMonth()==7||vDate.getMonth()==8){vDate.setFullYear(vDate.getFullYear(),6,1)}else if(vDate.getMonth()==9||vDate.getMonth()==10||vDate.getMonth()==11){vDate.setFullYear(vDate.getFullYear(),9,1)}};return(vDate)};JSGantt.getMaxDate=function(pList,pFormat){var vDate=new Date();vDate.setFullYear(pList[0].getEnd().getFullYear(),pList[0].getEnd().getMonth(),pList[0].getEnd().getDate());for(i=0;iDate.parse(vDate)){vDate.setTime(Date.parse(pList[i].getEnd()))}}if(pFormat=='minute'){vDate.setHours(vDate.getHours()+1);vDate.setMinutes(59)}if(pFormat=='hour'){vDate.setHours(vDate.getHours()+2)}if(pFormat=='day'){vDate.setDate(vDate.getDate()+1);while(vDate.getDay()%6>0){vDate.setDate(vDate.getDate()+1)}}if(pFormat=='week'){vDate.setDate(vDate.getDate()+11);while(vDate.getDay()%6>0){vDate.setDate(vDate.getDate()+1)}}if(pFormat=='month'){while(vDate.getDay()>1){vDate.setDate(vDate.getDate()+1)}vDate.setDate(vDate.getDate()-1)}if(pFormat=='quarter'){if(vDate.getMonth()==0||vDate.getMonth()==1||vDate.getMonth()==2)vDate.setFullYear(vDate.getFullYear(),2,31);else if(vDate.getMonth()==3||vDate.getMonth()==4||vDate.getMonth()==5)vDate.setFullYear(vDate.getFullYear(),5,30);else if(vDate.getMonth()==6||vDate.getMonth()==7||vDate.getMonth()==8)vDate.setFullYear(vDate.getFullYear(),8,30);else if(vDate.getMonth()==9||vDate.getMonth()==10||vDate.getMonth()==11)vDate.setFullYear(vDate.getFullYear(),11,31)}return(vDate)};JSGantt.findObj=function(theObj,theDoc){var p,i,foundObj;if(!theDoc){theDoc=document}if((p=theObj.indexOf("?"))>0&&parent.frames.length){theDoc=parent.frames[theObj.substring(p+1)].document;theObj=theObj.substring(0,p)}if(!(foundObj=theDoc[theObj])&&theDoc.all){foundObj=theDoc.all[theObj]}for(i=0;!foundObj&&i-1;try{xmlDoc=new ActiveXObject("Microsoft.XMLDOM")}catch(e){try{if(is_chrome==false){xmlDoc=document.implementation.createDocument("","",null)}}catch(e){alert(e.message);return}}if(is_chrome==false){xmlDoc.async=false;xmlDoc.load(ThisFile);JSGantt.AddXMLTask(pGanttVar);xmlDoc=null;Task=null}else{JSGantt.ChromeLoadXML(ThisFile,pGanttVar);ta=null}};JSGantt.AddXMLTask=function(pGanttVar){Task=xmlDoc.getElementsByTagName("task");var n=xmlDoc.documentElement.childNodes.length;for(var i=0;i/gi);var n=ta.length;for(var i=1;i/i);if(te.length>2){var pID=te[1]}else{var pID=0}pID*=1;var te=Task.split(//i);if(te.length>2){var pName=te[1]}else{var pName="No Task Name"}var te=Task.split(//i);if(te.length>2){var pStart=te[1]}else{var pStart=""}var te=Task.split(//i);if(te.length>2){var pEnd=te[1]}else{var pEnd=""}var te=Task.split(//i);if(te.length>2){var pColor=te[1]}else{var pColor='0000ff'}var te=Task.split(//i);if(te.length>2){var pLink=te[1]}else{var pLink=""}var te=Task.split(//i);if(te.length>2){var pMile=te[1]}else{var pMile=0}pMile*=1;var te=Task.split(//i);if(te.length>2){var pRes=te[1]}else{var pRes=""}var te=Task.split(//i);if(te.length>2){var pComp=te[1]}else{var pComp=0}pComp*=1;var te=Task.split(//i);if(te.length>2){var pGroup=te[1]}else{var pGroup=0}pGroup*=1;var te=Task.split(//i);if(te.length>2){var pParent=te[1]}else{var pParent=0}pParent*=1;var te=Task.split(//i);if(te.length>2){var pOpen=te[1]}else{var pOpen=1}pOpen*=1;var te=Task.split(//i);if(te.length>2){var pDepend=te[1]}else{var pDepend=""}if(pDepend.length==0){pDepend=''}var te=Task.split(//i);if(te.length>2){var pCaption=te[1]}else{var pCaption=""}pGanttVar.AddTaskItem(new JSGantt.TaskItem(pID,pName,pStart,pEnd,pColor,pLink,pMile,pRes,pComp,pGroup,pParent,pOpen,pDepend,pCaption))}}};JSGantt.benchMark=function(pItem){var vEndTime=new Date().getTime();alert(pItem+': Elapsed time: '+((vEndTime-vBenchTime)/1000)+' seconds.');vBenchTime=new Date().getTime()}; \ No newline at end of file +var JSGantt;JSGantt||(JSGantt={});var vBenchTime=(new Date).getTime();JSGantt.isIE=function(){return"undefined"!=typeof document.all?"pageXOffset"in window?!1:!0:!1},JSGantt.TaskItem=function(t,e,n,a,o,i,s,r,l,d,u,h,c,f,p,m){var v,S,w,D,T,y=parseInt(document.createTextNode(t).data),L=document.createTextNode(e).data,N=new Date(0),G=new Date(0),M=null,J=null,k=document.createTextNode(o).data,C=document.createTextNode(i).data,I=parseInt(document.createTextNode(s).data),F=document.createTextNode(r).data,b=parseFloat(document.createTextNode(l).data),H=parseInt(document.createTextNode(d).data),x=document.createTextNode(u).data,E=2==H?1:parseInt(document.createTextNode(h).data),X=new Array,Y=new Array,O=document.createTextNode(f).data,R="",A=0,V=0,P=1,B=0,U=!1,j=null,W=null,q=m instanceof JSGantt.GanttChart?m:g,_=null,Q=null,z=null,K=null,Z=null;if(T=document.createElement("span"),T.className="gTaskNotes",null!=p&&(T.innerHTML=p,JSGantt.stripUnwanted(T)),null!=n&&""!=n&&(N=n instanceof Date?n:JSGantt.parseDateStr(document.createTextNode(n).data,q.getDateInputFormat()),M=N),null!=a&&""!=a&&(G=a instanceof Date?a:JSGantt.parseDateStr(document.createTextNode(a).data,q.getDateInputFormat()),J=G),null!=c)for(var $=c+"",tt=$.split(","),et=tt.length,nt=0;et>nt;nt++)-1!=tt[nt].toUpperCase().indexOf("SS")?(X[nt]=tt[nt].substring(0,tt[nt].toUpperCase().indexOf("SS")),Y[nt]="SS"):-1!=tt[nt].toUpperCase().indexOf("FF")?(X[nt]=tt[nt].substring(0,tt[nt].toUpperCase().indexOf("FF")),Y[nt]="FF"):-1!=tt[nt].toUpperCase().indexOf("SF")?(X[nt]=tt[nt].substring(0,tt[nt].toUpperCase().indexOf("SF")),Y[nt]="SF"):-1!=tt[nt].toUpperCase().indexOf("FS")?(X[nt]=tt[nt].substring(0,tt[nt].toUpperCase().indexOf("FS")),Y[nt]="FS"):(X[nt]=tt[nt],Y[nt]="FS");this.getID=function(){return y},this.getName=function(){return L},this.getStart=function(){return N},this.getEnd=function(){return G},this.getGroupMinStart=function(){return M},this.getGroupMinEnd=function(){return J},this.getClass=function(){return k},this.getLink=function(){return C},this.getMile=function(){return I},this.getDepend=function(){return X?X:null},this.getDepType=function(){return Y?Y:null},this.getCaption=function(){return O?O:""},this.getResource=function(){return F?F:" "},this.getCompVal=function(){return b?b:0},this.getCompStr=function(){return b?b+"%":""},this.getNotes=function(){return T},this.getSortIdx=function(){return B},this.getToDelete=function(){return U},this.getDuration=function(t,e){if(I)R="-";else{var n=new Date(this.getEnd().getTime()),a=null;switch(t){case"week":a="day";break;case"month":a="week";break;case"quarter":a="month";break;default:a=t}(n.getTime()-6e4*n.getTimezoneOffset())%864e5==0&&(n=new Date(n.getFullYear(),n.getMonth(),n.getDate()+1,n.getHours(),n.getMinutes(),n.getSeconds()));var o=JSGantt.getOffset(this.getStart(),n,999,a)/1e3;switch(Math.floor(o)!=o&&(o=Math.round(10*o)/10),a){case"hour":R=o+" "+(1!=o?e.hrs:e.hr);break;case"day":R=o+" "+(1!=o?e.dys:e.dy);break;case"week":R=o+" "+(1!=o?e.wks:e.wk);break;case"month":R=o+" "+(1!=o?e.mths:e.mth);break;case"quarter":R=o+" "+(1!=o?e.qtrs:e.qtr)}}return R},this.getParent=function(){return x},this.getGroup=function(){return H},this.getOpen=function(){return E},this.getLevel=function(){return A},this.getNumKids=function(){return V},this.getStartX=function(){return v},this.getStartY=function(){return S},this.getEndX=function(){return w},this.getEndY=function(){return D},this.getVisible=function(){return P},this.getParItem=function(){return j},this.getCellDiv=function(){return W},this.getBarDiv=function(){return _},this.getTaskDiv=function(){return Q},this.getChildRow=function(){return K},this.getListChildRow=function(){return z},this.getGroupSpan=function(){return Z},this.setStart=function(t){t instanceof Date&&(N=t)},this.setEnd=function(t){t instanceof Date&&(G=t)},this.setGroupMinStart=function(t){t instanceof Date&&(M=t)},this.setGroupMinEnd=function(t){t instanceof Date&&(J=t)},this.setLevel=function(t){A=parseInt(document.createTextNode(t).data)},this.setNumKid=function(t){V=parseInt(document.createTextNode(t).data)},this.setCompVal=function(t){b=parseFloat(document.createTextNode(t).data)},this.setStartX=function(t){v=parseInt(document.createTextNode(t).data)},this.setStartY=function(t){S=parseInt(document.createTextNode(t).data)},this.setEndX=function(t){w=parseInt(document.createTextNode(t).data)},this.setEndY=function(t){D=parseInt(document.createTextNode(t).data)},this.setOpen=function(t){E=parseInt(document.createTextNode(t).data)},this.setVisible=function(t){P=parseInt(document.createTextNode(t).data)},this.setSortIdx=function(t){B=parseInt(document.createTextNode(t).data)},this.setToDelete=function(t){U=t?!0:!1},this.setParItem=function(t){t instanceof JSGantt.TaskItem&&(j=t)},this.setCellDiv=function(t){("function"!=typeof HTMLDivElement||t instanceof HTMLDivElement)&&(W=t)},this.setGroup=function(t){H=parseInt(document.createTextNode(t).data)},this.setBarDiv=function(t){("function"!=typeof HTMLDivElement||t instanceof HTMLDivElement)&&(_=t)},this.setTaskDiv=function(t){("function"!=typeof HTMLDivElement||t instanceof HTMLDivElement)&&(Q=t)},this.setChildRow=function(t){("function"!=typeof HTMLTableRowElement||t instanceof HTMLTableRowElement)&&(K=t)},this.setListChildRow=function(t){("function"!=typeof HTMLTableRowElement||t instanceof HTMLTableRowElement)&&(z=t)},this.setGroupSpan=function(t){("function"!=typeof HTMLSpanElement||t instanceof HTMLSpanElement)&&(Z=t)}},JSGantt.GanttChart=function(t,e){var n,a=t,o=e,i=null,s=1,r=1,l=1,g=1,d=1,u=25e3,h=1,c=1,f=1,p=1,m=1,v=1,S=1,w=1,D=1,T=1,y=1,L=1,N=1,G=1,M=new Array("top"),J="yyyy-mm-dd",k=JSGantt.parseDateFormatStr("dd/mm/yyyy"),C=JSGantt.parseDateFormatStr("dd month yyyy"),I=JSGantt.parseDateFormatStr("day dd month yyyy"),F=JSGantt.parseDateFormatStr("HH"),b=JSGantt.parseDateFormatStr("dd/mm/yyyy"),H=JSGantt.parseDateFormatStr("dd"),x=JSGantt.parseDateFormatStr("yyyy"),E=JSGantt.parseDateFormatStr("dd/mm"),X=JSGantt.parseDateFormatStr("yyyy"),Y=JSGantt.parseDateFormatStr("mon"),O=JSGantt.parseDateFormatStr("yyyy"),R=JSGantt.parseDateFormatStr("qq"),A=(JSGantt.parseDateFormatStr("dd/mm/yyyy"),1),V=new Array,P=new Array("hour","day","week","month","quarter"),B=(new Array(31,28,31,30,31,30,31,31,30,31,30,31),!0),U=8,j="",W=18,q=18,_=36,Q=36,z=18,K=20,Z=-1,$=null,tt=null,et=null,nt=null,at=null,ot=20;this.setUseFade=function(t){s=t},this.setUseMove=function(t){r=t},this.setUseRowHlt=function(t){l=t},this.setUseToolTip=function(t){g=t},this.setUseSort=function(t){d=t},this.setUseSingleCell=function(t){u=1*t},this.setFormatArr=function(){var t="hour day week month quarter";P=new Array;for(var e=0,n=0;e1){P[n++]=arguments[e].toLowerCase();var a=new RegExp("(?:^|s)"+arguments[e]+"(?!S)","g");t=t.replace(a,"")}},this.setShowRes=function(t){h=t},this.setShowDur=function(t){c=t},this.setShowComp=function(t){f=t},this.setShowStartDate=function(t){p=t},this.setShowEndDate=function(t){m=t},this.setShowTaskInfoRes=function(t){S=t},this.setShowTaskInfoDur=function(t){w=t},this.setShowTaskInfoComp=function(t){D=t},this.setShowTaskInfoStartDate=function(t){T=t},this.setShowTaskInfoEndDate=function(t){y=t},this.setShowTaskInfoNotes=function(t){L=t},this.setShowTaskInfoLink=function(t){N=t},this.setShowEndWeekDate=function(t){v=t},this.setShowSelector=function(){var t="top bottom";M=new Array;for(var e=0,n=0;e1){M[n++]=arguments[e].toLowerCase();var a=new RegExp("(?:^|s)"+arguments[e]+"(?!S)","g");t=t.replace(a,"")}},this.setShowDeps=function(t){G=t},this.setDateInputFormat=function(t){J=t},this.setDateTaskTableDisplayFormat=function(t){k=JSGantt.parseDateFormatStr(t)},this.setDateTaskDisplayFormat=function(t){C=JSGantt.parseDateFormatStr(t)},this.setHourMajorDateDisplayFormat=function(t){I=JSGantt.parseDateFormatStr(t)},this.setHourMinorDateDisplayFormat=function(t){F=JSGantt.parseDateFormatStr(t)},this.setDayMajorDateDisplayFormat=function(t){b=JSGantt.parseDateFormatStr(t)},this.setDayMinorDateDisplayFormat=function(t){H=JSGantt.parseDateFormatStr(t)},this.setWeekMajorDateDisplayFormat=function(t){x=JSGantt.parseDateFormatStr(t)},this.setWeekMinorDateDisplayFormat=function(t){E=JSGantt.parseDateFormatStr(t)},this.setMonthMajorDateDisplayFormat=function(t){X=JSGantt.parseDateFormatStr(t)},this.setMonthMinorDateDisplayFormat=function(t){Y=JSGantt.parseDateFormatStr(t)},this.setQuarterMajorDateDisplayFormat=function(t){O=JSGantt.parseDateFormatStr(t)},this.setQuarterMinorDateDisplayFormat=function(t){R=JSGantt.parseDateFormatStr(t)},this.setCaptionType=function(t){n=t},this.setFormat=function(t){o=t,this.Draw()},this.setMinGpLen=function(t){U=t},this.setScrollTo=function(t){j=t},this.setHourColWidth=function(t){W=t},this.setDayColWidth=function(t){q=t},this.setWeekColWidth=function(t){_=t},this.setMonthColWidth=function(t){Q=t},this.setQuarterColWidth=function(t){z=t},this.setRowHeight=function(t){K=t},this.setLang=function(t){vLangs[t]&&(vLang=t)},this.setChartBody=function(t){("function"!=typeof HTMLDivElement||t instanceof HTMLDivElement)&&($=t)},this.setChartHead=function(t){("function"!=typeof HTMLDivElement||t instanceof HTMLDivElement)&&(tt=t)},this.setListBody=function(t){("function"!=typeof HTMLDivElement||t instanceof HTMLDivElement)&&(et=t)},this.setChartTable=function(t){("function"!=typeof HTMLTableElement||t instanceof HTMLTableElement)&&(nt=t)},this.setLines=function(t){("function"!=typeof HTMLDivElement||t instanceof HTMLDivElement)&&(at=t)},this.setTimer=function(t){ot=1*t},this.addLang=function(t,e){if(!vLangs[t]){vLangs[t]=new Object;for(var n in vLangs.en)vLangs[t][n]=e[n]?document.createTextNode(e[n]).data:vLangs.en[n]}},this.getDivId=function(){return i},this.getUseFade=function(){return s},this.getUseMove=function(){return r},this.getUseRowHlt=function(){return l},this.getUseToolTip=function(){return g},this.getUseSort=function(){return d},this.getUseSingleCell=function(){return u},this.getFormatArr=function(){return P},this.getShowRes=function(){return h},this.getShowDur=function(){return c},this.getShowComp=function(){return f},this.getShowStartDate=function(){return p},this.getShowEndDate=function(){return m},this.getShowTaskInfoRes=function(){return S},this.getShowTaskInfoDur=function(){return w},this.getShowTaskInfoComp=function(){return D},this.getShowTaskInfoStartDate=function(){return T},this.getShowTaskInfoEndDate=function(){return y},this.getShowTaskInfoNotes=function(){return L},this.getShowTaskInfoLink=function(){return N},this.getShowEndWeekDate=function(){return v},this.getShowSelector=function(){return M},this.getShowDeps=function(){return G},this.getDateInputFormat=function(){return J},this.getDateTaskTableDisplayFormat=function(){return k},this.getDateTaskDisplayFormat=function(){return C},this.getHourMajorDateDisplayFormat=function(){return I},this.getHourMinorDateDisplayFormat=function(){return F},this.getDayMajorDateDisplayFormat=function(){return b},this.getDayMinorDateDisplayFormat=function(){return H},this.getWeekMajorDateDisplayFormat=function(){return x},this.getWeekMinorDateDisplayFormat=function(){return E},this.getMonthMajorDateDisplayFormat=function(){return X},this.getMonthMinorDateDisplayFormat=function(){return Y},this.getQuarterMajorDateDisplayFormat=function(){return O},this.getQuarterMinorDateDisplayFormat=function(){return R},this.getCaptionType=function(){return n},this.getMinGpLen=function(){return U},this.getScrollTo=function(){return j},this.getHourColWidth=function(){return W},this.getDayColWidth=function(){return q},this.getWeekColWidth=function(){return _},this.getMonthColWidth=function(){return Q},this.getQuarterColWidth=function(){return z},this.getRowHeight=function(){return K},this.getChartBody=function(){return $},this.getChartHead=function(){return tt},this.getListBody=function(){return et},this.getChartTable=function(){return nt},this.getLines=function(){return at},this.getTimer=function(){return ot},this.CalcTaskXY=function(){for(var t,e,n,a,o=this.getList(),i=Math.floor(this.getRowHeight()/2),s=0;sa&&(g*=-1),o){case"SF":l*=-1,n>=t-10&&e!=a&&(r=!0),s=-1;break;case"SS":n>t?l*=-1:l=n-t-2*l;break;case"FF":n>=t&&(l=n-t+2*l),s=-1;break;default:t+10>=n&&e!=a&&(r=!0)}r?(this.sLine(t,e,t+l,e,i),this.sLine(t+l,e,t+l,a-g,i),this.sLine(t+l,a-g,n-2*l,a-g,i),this.sLine(n-2*l,a-g,n-2*l,a,i),this.sLine(n-2*l,a,n-1*s,a,i)):e!=a?(this.sLine(t,e,t+l,e,i),this.sLine(t+l,e,t+l,a,i),this.sLine(t+l,a,n-1*s,a,i)):this.sLine(t,e,n-1*s,a,i);var d=this.sLine(n,a,n-3-(0>s?1:0),a-3-(0>s?1:0),i+"Arw");d.style.width="0px",d.style.height="0px"},this.DrawDependencies=function(){if(1==this.getShowDeps()){this.CalcTaskXY(),this.clearDependencies();for(var t=this.getList(),e=0;e0&&1==t[e].getVisible())for(var i=0;o>i;i++){var s=this.getArrayLocationByID(n[i]);s>=0&&2!=t[s].getGroup()&&1==t[s].getVisible()&&("SS"==a[i]?this.drawDependency(t[s].getStartX()-1,t[s].getStartY(),t[e].getStartX()-1,t[e].getStartY(),"SS","gDepSS"):"FF"==a[i]?this.drawDependency(t[s].getEndX(),t[s].getEndY(),t[e].getEndX(),t[e].getEndY(),"FF","gDepFF"):"SF"==a[i]?this.drawDependency(t[s].getStartX()-1,t[s].getStartY(),t[e].getEndX(),t[e].getEndY(),"SF","gDepSF"):"FS"==a[i]&&this.drawDependency(t[s].getEndX(),t[s].getEndY(),t[e].getStartX()-1,t[e].getStartY(),"FS","gDepFS"))}}}Z>=0&&this.sLine(Z,0,Z,this.getChartTable().offsetHeight-1,"gCurDate")},this.getArrayLocationByID=function(t){for(var e=this.getList(),n=0;n0){B&&JSGantt.processRows(V,0,-1,1,1,this.getUseSort()),B=!1,e=JSGantt.getMinDate(V,o),t=JSGantt.getMaxDate(V,o),"day"==o?T=q:"week"==o?T=_:"month"==o?T=Q:"quarter"==o?T=z:"hour"==o&&(T=W);var y=document.createDocumentFragment(),L=this.newNode(y,"div",i+"glisthead","glistlbl gcontainercol"),N=this.newNode(L,"table",null,"gtasktableh"),G=this.newNode(N,"tbody"),M=this.newNode(G,"tr");this.newNode(M,"td",null,"gtasklist"," ");var J=this.newNode(M,"td",null,"gspanning gtaskname");J.appendChild(this.drawSelector("top")),1==h&&this.newNode(M,"td",null,"gspanning gresource"," "),1==c&&this.newNode(M,"td",null,"gspanning gduration"," "),1==f&&this.newNode(M,"td",null,"gspanning gpccomplete"," "),1==p&&this.newNode(M,"td",null,"gspanning gstartdate"," "),1==m&&this.newNode(M,"td",null,"gspanning genddate"," "),M=this.newNode(G,"tr"),this.newNode(M,"td",null,"gtasklist"," "),this.newNode(M,"td",null,"gtaskname"," "),1==h&&this.newNode(M,"td",null,"gtaskheading gresource",vLangs[vLang].resource),1==c&&this.newNode(M,"td",null,"gtaskheading gduration",vLangs[vLang].duration),1==f&&this.newNode(M,"td",null,"gtaskheading gpccomplete",vLangs[vLang].comp),1==p&&this.newNode(M,"td",null,"gtaskheading gstartdate",vLangs[vLang].startdate),1==m&&this.newNode(M,"td",null,"gtaskheading genddate",vLangs[vLang].enddate),L=this.newNode(y,"div",null,"glabelfooter");var C=document.createDocumentFragment(),A=this.newNode(C,"div",i+"glistbody","glistgrid gcontainercol");for(this.setListBody(A),N=this.newNode(A,"table",null,"gtasktable"),G=this.newNode(N,"tbody"),st=0;st=n&&(J=this.newNode(M,"td",null,at),this.newNode(J,"div",null,null,JSGantt.formatDateStr(n,H,vLangs[vLang]),T),g++),n.setDate(n.getDate()+1);else if("week"==o)t>=n&&(J=this.newNode(M,"td",null,at),this.newNode(J,"div",null,null,JSGantt.formatDateStr(n,E,vLangs[vLang]),T),g++),n.setDate(n.getDate()+7);else if("month"==o)for(t>=n&&(J=this.newNode(M,"td",null,at),this.newNode(J,"div",null,null,JSGantt.formatDateStr(n,Y,vLangs[vLang]),T),g++),n.setDate(n.getDate()+1);n.getDate()>1;)n.setDate(n.getDate()+1);else if("quarter"==o)for(t>=n&&(J=this.newNode(M,"td",null,at),this.newNode(J,"div",null,null,JSGantt.formatDateStr(n,R,vLangs[vLang]),T),g++),n.setDate(n.getDate()+81);n.getDate()>1;)n.setDate(n.getDate()+1);else if("hour"==o){for(st=n.getHours();24>st;st++)n.setHours(st),t>=n&&(J=this.newNode(M,"td",null,at),this.newNode(J,"div",null,null,JSGantt.formatDateStr(n,F,vLangs[vLang]),T),g++);n.setHours(0),n.setDate(n.getDate()+1)}}D=M,s=g*(T+1)+1,0!=u&&g*d>u&&(S=!0),this.newNode(L,"div",null,"rhscrpad",null,null,s+1);var it=document.createDocumentFragment();L=this.newNode(it,"div",i+"gchartbody","gchartgrid gcontainercol"),this.setChartBody(L),N=this.newNode(L,"table",i+"chartTable","gcharttable",null,s),this.setChartTable(N),this.newNode(L,"div",null,"rhscrpad",null,null,s+1),G=this.newNode(N,"tbody");var st=0,rt=0;for(st=0;strt;rt++)ut="day"!=o||rt%7!=4&&rt%7!=5?"gtaskcell":"gtaskcellwkend",this.newNode(M,"td",null,ut,"  ")}else if(l=r-1,V[st].getGroup()){if(l=l>U&&2*U>l?2*U:l,l=U>l?U:l,M=this.newNode(G,"tr",i+"childrow_"+w,(2==V[st].getGroup()?"glineitem gitem":"ggroupitem ggroup")+o,null,null,null,0==V[st].getVisible()?"none":null),V[st].setChildRow(M),JSGantt.addThisRowListeners(this,V[st].getListChildRow(),M),J=this.newNode(M,"td",null,"gtaskcell"),L=this.newNode(J,"div",null,"gtaskcelldiv","  "),V[st].setCellDiv(L),1==V[st].getGroup()&&(L=this.newNode(L,"div",i+"bardiv_"+w,"gtaskbarcontainer",null,l,s),V[st].setBarDiv(L),A=this.newNode(L,"div",i+"taskbar_"+w,V[st].getClass(),null,l),V[st].setTaskDiv(A),this.newNode(A,"div",i+"complete_"+w,V[st].getClass()+"complete",null,V[st].getCompStr()),this.newNode(L,"div",null,V[st].getClass()+"endpointleft"),l>=2*U&&this.newNode(L,"div",null,V[st].getClass()+"endpointright"),ft="ggroupcaption"),!S&&!dt)for(ut="",rt=0;g-1>rt;rt++)ut="day"!=o||rt%7!=4&&rt%7!=5?"gtaskcell":"gtaskcellwkend",this.newNode(M,"td",null,ut,"  ")}else if(l=0>=l?1:l,dt?L=V[st].getParItem().getCellDiv():(M=this.newNode(G,"tr",i+"childrow_"+w,"glineitem gitem"+o,null,null,null,0==V[st].getVisible()?"none":null),V[st].setChildRow(M),JSGantt.addThisRowListeners(this,V[st].getListChildRow(),M),J=this.newNode(M,"td",null,"gtaskcell"),L=this.newNode(J,"div",null,"gtaskcelldiv","  ")),L=this.newNode(L,"div",i+"bardiv_"+w,"gtaskbarcontainer",null,l,s),V[st].setBarDiv(L),A=this.newNode(L,"div",i+"taskbar_"+w,V[st].getClass(),null,l),V[st].setTaskDiv(A),this.newNode(A,"div",i+"complete_"+w,V[st].getClass()+"complete",null,V[st].getCompStr()),dt&&(ht=V[st].getParItem()),(!dt||dt&&V[st].getParItem().getEnd()==V[st].getEnd())&&(ft="gcaption"),!S&&!dt)for(ut="",rt=0;g-1>rt;rt++)ut="day"!=o||rt%7!=4&&rt%7!=5?"gtaskcell":"gtaskcellwkend",this.newNode(M,"td",null,ut,"  ");if(this.getCaptionType()&&null!==ft){switch(this.getCaptionType()){case"Caption":var ct=ht.getCaption();break;case"Resource":ct=ht.getResource();break;case"Duration":ct=ht.getDuration(o,vLangs[vLang]);break;case"Complete":ct=ht.getCompStr()}this.newNode(L,"div",null,ft,ct,120,"gmilecaption"==ft?12:0)}V[st].getTaskDiv()&&L&&(A=this.newNode(L,"div",i+"tt"+w,null,null,null,null,"none"),A.appendChild(this.createTaskInfo(V[st])),JSGantt.addTooltipListeners(this,V[st].getTaskDiv(),A))}for(S||G.appendChild(D.cloneNode(!0));a.hasChildNodes();)a.removeChild(a.firstChild);if(L=this.newNode(a,"div",null,"gchartcontainer"),L.appendChild(et),L.appendChild(y),L.appendChild(it),L.appendChild(C),this.newNode(L,"div",null,"ggridfooter"),A=this.newNode(this.getChartBody(),"div",i+"Lines","glinediv"),A.style.visibility="hidden",this.setLines(A),JSGantt.addScrollListeners(this),""!=j){var pt=new Date(e.getTime()),mt=0;"px"==j.substr(0,2)?mt=parseInt(j.substr(2)):(pt=JSGantt.parseDateStr(j,this.getDateInputFormat()),"hour"==o?pt.setMinutes(0,0,0):pt.setHours(0,0,0,0),mt=JSGantt.getOffset(e,pt,T,o)),this.getChartBody().scrollLeft=mt}Z=e.getTime()<=(new Date).getTime()&&t.getTime()>=(new Date).getTime()?JSGantt.getOffset(e,new Date,T,o):-1,this.DrawDependencies()}},this.mouseOver=function(t,e){this.getUseRowHlt()&&(t.className+=" gitemhighlight",e.className+=" gitemhighlight")},this.mouseOut=function(t,e){this.getUseRowHlt()&&(t.className=t.className.replace(/(?:^|\s)gitemhighlight(?!\S)/g,""),e.className=e.className.replace(/(?:^|\s)gitemhighlight(?!\S)/g,""))},this.drawSelector=function(t){for(var e=document.createDocumentFragment(),n=!1,a=0;a=0&&a",o+=""+V[a].getID()+"",o+=""+V[a].getName()+"",o+=""+JSGantt.formatDateStr(V[a].getStart(),i,vLangs[vLang])+"",o+=""+JSGantt.formatDateStr(V[a].getEnd(),i,vLangs[vLang])+"",o+=""+V[a].getClass()+"",o+=""+V[a].getLink()+"",o+=""+V[a].getMile()+""," "!=V[a].getResource()&&(o+=""+V[a].getResource()+""),o+=""+V[a].getCompVal()+"",o+=""+V[a].getGroup()+"",o+=""+V[a].getParent()+"",o+=""+V[a].getOpen()+"",o+="";var s=V[a].getDepend();for(n=0;n0&&(o+=","),s[n]>0&&(o+=s[n]+V[a].getDepType()[n]);o+="",o+=""+V[a].getCaption()+"";var r=document.createDocumentFragment(),l=this.newNode(r,"div",null,null,V[a].getNotes().innerHTML);o+=""+l.innerHTML+"",o+=""}return o},a&&"div"==a.nodeName.toLowerCase()&&(i=a.id)},JSGantt.updateFlyingObj=function(t,e,n){var a=3,o=5,i=3,s=15,r=t?t.clientX:window.event.clientX,l=t?t.clientY:window.event.clientY,g=document.documentElement.clientWidth||document.getElementsByTagName("body")[0].clientWidth,d=document.documentElement.clientHeight||document.getElementsByTagName("body")[0].clientHeight,u=r,h=l;if("microsoft internet explorer"==navigator.appName.toLowerCase()){r-=document.documentElement.clientLeft,l-=document.documentElement.clientTop;var c=JSGantt.getZoomFactor();1!=c&&(r=Math.round(r/c),l=Math.round(l/c))}var f=JSGantt.getScrollPositions();u=r-o-e.vTool.offsetWidth<0?r+s+e.vTool.offsetWidth>g?f.x:r+f.x+s:r+f.x-o-e.vTool.offsetWidth,h=l+i+e.vTool.offsetHeight>d?l-a-e.vTool.offsetHeight<0?f.y:l+f.y-a-e.vTool.offsetHeight:l+f.y+i,e.getUseMove()?(clearInterval(e.vTool.moveInterval),e.vTool.moveInterval=setInterval(function(){JSGantt.moveToolTip(u,h,e.vTool,n)},n)):(e.vTool.style.left=u+"px", + e.vTool.style.top=h+"px")},JSGantt.showToolTip=function(t,e,n,a,o){var i=t.getDivId()+"JSGanttToolTip",s=500,r=100,l=n.id;t.getUseToolTip()&&(null==t.vTool&&(t.vTool=document.createElement("div"),t.vTool.id=i,t.vTool.className="JSGanttToolTip",t.vTool.vToolCont=document.createElement("div"),t.vTool.vToolCont.id=i+"cont",t.vTool.vToolCont.className="JSGanttToolTipcont",t.vTool.vToolCont.setAttribute("showing",""),t.vTool.appendChild(t.vTool.vToolCont),document.body.appendChild(t.vTool),t.vTool.style.opacity=0,t.vTool.setAttribute("currentOpacity",0),t.vTool.setAttribute("fadeIncrement",10),t.vTool.setAttribute("moveSpeed",10),t.vTool.style.filter="alpha(opacity=0)",t.vTool.style.visibility="hidden",t.vTool.style.left=Math.floor((e?e.clientX:window.event.clientX)/2)+"px",t.vTool.style.top=Math.floor((e?e.clientY:window.event.clientY)/2)+"px",JSGantt.addListener("mouseover",function(){clearTimeout(t.vTool.delayTimeout)},t.vTool),JSGantt.addListener("mouseout",function(){JSGantt.delayedHide(t,t.vTool,o)},t.vTool)),clearTimeout(t.vTool.delayTimeout),(t.vTool.vToolCont.getAttribute("showing")!=l||"visible"!=t.vTool.style.visibility)&&(t.vTool.vToolCont.getAttribute("showing")!=l&&(t.vTool.vToolCont.setAttribute("showing",l),t.vTool.vToolCont.innerHTML=n.innerHTML,JSGantt.stripIds(t.vTool.vToolCont)),t.vTool.style.visibility="visible",JSGantt.updateFlyingObj(e,t,o),t.vTool.style.width=a?a+"px":"auto",!a&&JSGantt.isIE()&&(t.vTool.style.width=t.vTool.offsetWidth),t.vTool.offsetWidth>s&&(t.vTool.style.width=s+"px")),t.getUseFade()?(clearInterval(t.vTool.fadeInterval),t.vTool.fadeInterval=setInterval(function(){JSGantt.fadeToolTip(1,t.vTool,r)},o)):(t.vTool.style.opacity=.01*r,t.vTool.style.filter="alpha(opacity="+r+")"))},JSGantt.stripIds=function(t){for(var e=0;en-i&&1==t?s=n-i:a>o&&-1==t&&(s=i),o=i+s*t,e.style.opacity=.01*o,e.style.filter="alpha(opacity="+o+")",e.setAttribute("currentOpacity",o)}else clearInterval(e.fadeInterval),-1==t&&(e.style.opacity=0,e.style.filter="alpha(opacity=0)",e.style.visibility="hidden")},JSGantt.moveToolTip=function(t,e,n){var a=parseInt(n.getAttribute("moveSpeed")),o=parseInt(n.style.left),i=parseInt(n.style.top);"visible"!=n.style.visibility?(n.style.left=t+"px",n.style.top=e+"px",clearInterval(n.moveInterval)):t!=o&&e!=i?(o+=Math.ceil((t-o)/a),i+=Math.ceil((e-i)/a),n.style.left=o+"px",n.style.top=i+"px"):clearInterval(n.moveInterval)},JSGantt.getZoomFactor=function(){var t=1;if(document.body.getBoundingClientRect){var e=document.body.getBoundingClientRect(),n=e.right-e.left,a=document.body.offsetWidth;t=Math.round(n/a*100)/100}return t},JSGantt.getScrollPositions=function(){var t=window.pageXOffset,e=window.pageYOffset;if(!("pageXOffset"in window)){var n=JSGantt.getZoomFactor();t=Math.round(document.documentElement.scrollLeft/n),e=Math.round(document.documentElement.scrollTop/n)}return{x:t,y:e}},JSGantt.getOffset=function(t,e,n,a){var o=new Array(31,28,31,30,31,30,31,31,30,31,30,31),i=new Date(t.getTime()),s=new Date(e.getTime()),r=0,l=Date.UTC(i.getFullYear(),i.getMonth(),i.getDate(),i.getHours(),0,0),g=Date.UTC(s.getFullYear(),s.getMonth(),s.getDate(),s.getHours(),0,0),d=(g-l)/36e5;if("day"==a)r=Math.ceil(d/24*(n+1));else if("week"==a)r=Math.ceil(d/24*(n+1)/7);else if("month"==a){var u=12*(s.getFullYear()-i.getFullYear())+(s.getMonth()-i.getMonth()),h=new Date(s.getTime());h.setDate(i.getDate());var c=(s.getTime()-h.getTime())/864e5;r=Math.ceil(u*(n+1)+c*(n/o[s.getMonth()]))}else if("quarter"==a)u=12*(s.getFullYear()-i.getFullYear())+(s.getMonth()-i.getMonth()),h=new Date(s.getTime()),h.setDate(i.getDate()),c=(s.getTime()-h.getTime())/864e5,r=Math.ceil(u*((n+1)/3)+c*(n/90));else if("hour"==a){h=new Date(s.getTime()),h.setMinutes(i.getMinutes(),0);var f=(s.getTime()-h.getTime())/36e5;r=Math.ceil(d*(n+1)+f*n)}return r},JSGantt.processRows=function(t,e,n,a,o,i){var s=new Date,r=new Date,l=o,g=null,d=0,u=0,h=0,c=0,f=a,p=t,m=!1,v=0;for(v=0;v=0&&t[v].getID()==e&&(g=t[v]);for(v=0;vr)&&(r=t[v].getEnd(),h=1),d+=t[v].getCompVal(),t[v].setSortIdx(v*t.length)}if(n>=0&&(null!=t[n].getGroupMinStart()&&t[n].getGroupMinStart()r&&(r=t[n].getGroupMinEnd()),t[n].setStart(s),t[n].setEnd(r),t[n].setNumKid(c),t[n].setCompVal(Math.ceil(d/c))),0==e&&1==i&&(JSGantt.sortTasks(t,0,0),t.sort(function(t,e){return t.getSortIdx()-e.getSortIdx()})),0==e&&1!=i){for(v=0;v0&&o.sort(function(t,e){var n=t.getStart().getTime()-e.getStart().getTime();return 0==n&&(n=t.getEnd().getTime()-e.getEnd().getTime()),0==n?t.getID()-e.getID():n});for(var s=0;s1;)n.setDate(n.getDate()-1);else if("quarter"==e)n.setDate(n.getDate()-31),0==n.getMonth()||1==n.getMonth()||2==n.getMonth()?n.setFullYear(n.getFullYear(),0,1):3==n.getMonth()||4==n.getMonth()||5==n.getMonth()?n.setFullYear(n.getFullYear(),3,1):6==n.getMonth()||7==n.getMonth()||8==n.getMonth()?n.setFullYear(n.getFullYear(),6,1):(9==n.getMonth()||10==n.getMonth()||11==n.getMonth())&&n.setFullYear(n.getFullYear(),9,1);else if("hour"==e)for(n.setHours(n.getHours()-1);n.getHours()%6!=0;)n.setHours(n.getHours()-1);return"hour"==e?n.setMinutes(0,0):n.setHours(0,0,0),n},JSGantt.getMaxDate=function(t,e){var n=new Date;n.setTime(t[0].getEnd().getTime());for(var a=0;an.getTime()&&n.setTime(t[a].getEnd().getTime());if("day"==e)for(n.setDate(n.getDate()+1);n.getDay()%7!=0;)n.setDate(n.getDate()+1);else if("week"==e)for(n.setDate(n.getDate()+1);n.getDay()%7!=0;)n.setDate(n.getDate()+1);else if("month"==e){for(;n.getDate()>1;)n.setDate(n.getDate()+1);n.setDate(n.getDate()-1)}else if("quarter"==e)0==n.getMonth()||1==n.getMonth()||2==n.getMonth()?n.setFullYear(n.getFullYear(),2,31):3==n.getMonth()||4==n.getMonth()||5==n.getMonth()?n.setFullYear(n.getFullYear(),5,30):6==n.getMonth()||7==n.getMonth()||8==n.getMonth()?n.setFullYear(n.getFullYear(),8,30):(9==n.getMonth()||10==n.getMonth()||11==n.getMonth())&&n.setFullYear(n.getFullYear(),11,31);else if("hour"==e)for(0==n.getHours()&&n.setDate(n.getDate()+1),n.setHours(n.getHours()+1);n.getHours()%6!=5;)n.setHours(n.getHours()+1);return n},JSGantt.findObj=function(t,e){var n;return e||(e=document),document.getElementById&&(n=document.getElementById(t)),n},JSGantt.changeFormat=function(t,e){e?e.setFormat(t):alert("Chart undefined")},JSGantt.folder=function(t,e){var n=e.getList();e.getDivId();e.clearDependencies();for(var a=0;a=10&&a.length>=3){for(;a.length<5;)a.push(0);switch(e){case"mm/dd/yyyy":n=new Date(a[2],a[0]-1,a[1],a[3],a[4]);break;case"dd/mm/yyyy":n=new Date(a[2],a[1]-1,a[0],a[3],a[4]);break;case"yyyy-mm-dd":n=new Date(a[0],a[1]-1,a[2],a[3],a[4])}}return n},JSGantt.formatDateStr=function(t,e,n){for(var a="",o=t.getFullYear().toString().substring(2,4),i=t.getMonth()+1+"",s=new Array(n.january,n.february,n.march,n.april,n.maylong,n.june,n.july,n.august,n.september,n.october,n.november,n.december),r=new Array(n.sunday,n.monday,n.tuesday,n.wednesday,n.thursday,n.friday,n.saturday),l=new Array(n.jan,n.feb,n.mar,n.apr,n.may,n.jun,n.jul,n.aug,n.sep,n.oct,n.nov,n.dec),g=new Array(n.sun,n.mon,n.tue,n.wed,n.thu,n.fri,n.sat),d=0;di&&(a+="0");case"m":a+=i;break;case"mon":a+=l[t.getMonth()];break;case"month":a+=s[t.getMonth()];break;case"yyyy":a+=t.getFullYear();break;case"yy":a+=o;break;case"qq":a+="Q";case"q":a+=Math.floor(t.getMonth()/3)+1;break;case"hh":(t.getHours()%12==0?12:t.getHours()%12)<10&&(a+="0");case"h":a+=t.getHours()%12==0?12:t.getHours()%12;break;case"HH":t.getHours()<10&&(a+="0");case"H":a+=t.getHours();break;case"MI":t.getMinutes()<10&&(a+="0");case"mi":a+=t.getMinutes();break;case"pm":a+=t.getHours()<12?"am":"pm";break;case"PM":a+=t.getHours()<12?"AM":"PM";break;case"ww":JSGantt.getIsoWeek(t)<10&&(a+="0");case"w":a+=JSGantt.getIsoWeek(t);break;case"week":var u=JSGantt.getIsoWeek(t),h=t.getFullYear(),c=0==t.getDay()?7:t.getDay();u>=52&&1==i&&h--,1==u&&12==i&&h++,10>u&&(u="0"+u),a+=h+"-W"+u+"-"+c;break;default:a+=n[e[d].toLowerCase()]?n[e[d].toLowerCase()]:e[d]}return a},JSGantt.parseDateFormatStr=function(t){for(var e="",n="",a=new RegExp("[/\\ -.,'\":]"),o=new Array,i=0;i0&&(a=p[0].getAttribute("xmlns")),"http://schemas.microsoft.com/project"==a){o=!0,t.setDateInputFormat("yyyy-mm-dd"),n=JSGantt.findXMLNode(e,"Task"),i="undefined"==typeof n?0:n.length;var m=JSGantt.findXMLNode(e,"Resource");for("undefined"==typeof m?(i=0,s=0):s=m.length,r=0;s>r;r++){var v=JSGantt.getXMLNodeValue(m[r],"Name",2,""),S=JSGantt.getXMLNodeValue(m[r],"UID",1,-1);v.length>0&&S>0&&(c[S]=v)}var w=JSGantt.findXMLNode(e,"Assignment");for(l="undefined"==typeof w?0:w.length,r=0;l>r;r++){var D=JSGantt.getXMLNodeValue(w[r],"ResourceUID",1,-1);S=JSGantt.getXMLNodeValue(w[r],"TaskUID",1,-1),S>0&&(D>0&&(h[S]=c[D]),u[S]=w[r])}for(r=0;i>r;r++){if(S=JSGantt.getXMLNodeValue(n[r],"UID",1,0),0!=S)var T=JSGantt.getXMLNodeValue(n[r],"OutlineNumber",2,"0");S>0&&(f[T]=S),S>d&&(d=S)}for(r=0;i>r;r++){var y=JSGantt.getXMLNodeValue(n[r],"UID",1,0);if(0!=y){var L=JSGantt.getXMLNodeValue(n[r],"Name",2,"No Task Name"),N=JSGantt.getXMLNodeValue(n[r],"Start",2,""),G=JSGantt.getXMLNodeValue(n[r],"Finish",2,""),M=JSGantt.getXMLNodeValue(n[r],"HyperlinkAddress",2,""),J=JSGantt.getXMLNodeValue(n[r],"Milestone",1,0),k=JSGantt.getXMLNodeValue(n[r],"PercentWorkComplete",1,0),C=JSGantt.getXMLNodeValue(n[r],"Summary",1,0),I=0,F=JSGantt.getXMLNodeValue(n[r],"OutlineLevel",1,0);F>1&&(T=JSGantt.getXMLNodeValue(n[r],"OutlineNumber",2,"0"),I=f[T.substr(0,T.lastIndexOf("."))]);try{var b=n[r].getElementsByTagName("Notes")[0].childNodes[1].nodeValue}catch(H){b=""}if("undefined"!=typeof h[y])var x=h[y];else x="";var E=JSGantt.findXMLNode(n[r],"PredecessorLink");l="undefined"==typeof E?0:E.length;var X="";for(g=0;l>g;g++){var Y=JSGantt.getXMLNodeValue(E[g],"PredecessorUID",1,-1),O=JSGantt.getXMLNodeValue(E[g],"Type",1,1);if(Y>0)switch(X.length>0&&(X+=","),O){case 0:X+=Y+"FF";break;case 1:X+=Y+"FS";break;case 2:X+=Y+"SF";break;case 3:X+=Y+"SS";break;default:X+=Y+"FS"}}var R=1,A="";if(C>0)var V="ggroupblack";else V=J>0?"gmilestone":"gtaskblue";var P=JSGantt.findXMLNode(u[y],"TimephasedData");l="undefined"==typeof P?0:P.length;var B=N,U=G,j=!1,W=X.replace(/,*[0-9]+[FS]F/g,"");for(g=0;l>g;g++){var q=JSGantt.getXMLNodeValue(P[g],"Value",2,"0");q="0"+q.replace(/\D/g,""),q*=1,0==q&&!j||g+1==l&&2==C?(C=2,g+1==l&&(W=X.replace(/,*[0-9]+[FS]S/g,"")),d++,U=JSGantt.getXMLNodeValue(P[g],g+1==l?"Finish":"Start",2,""),t.AddTaskItem(new JSGantt.TaskItem(d,L,B,U,"gtaskblue",M,J,x,k,0,y,R,W,A,b,t)),j=!0,W=""):0!=q&&j&&(B=JSGantt.getXMLNodeValue(P[g],"Start",2,""),j=!1)}j&&(X=""),t.AddTaskItem(new JSGantt.TaskItem(y,L,N,G,V,M,J,x,k,C,I,R,X,A,b,t))}}}else for(n=e.getElementsByTagName("task"),i=n.length,r=0;i>r;r++)y=JSGantt.getXMLNodeValue(n[r],"pID",1,0),0!=y&&(L=JSGantt.getXMLNodeValue(n[r],"pName",2,"No Task Name"),N=JSGantt.getXMLNodeValue(n[r],"pStart",2,""),G=JSGantt.getXMLNodeValue(n[r],"pEnd",2,""),M=JSGantt.getXMLNodeValue(n[r],"pLink",2,""),J=JSGantt.getXMLNodeValue(n[r],"pMile",1,0),k=JSGantt.getXMLNodeValue(n[r],"pComp",1,0),C=JSGantt.getXMLNodeValue(n[r],"pGroup",1,0),I=JSGantt.getXMLNodeValue(n[r],"pParent",1,0),x=JSGantt.getXMLNodeValue(n[r],"pRes",2,""),R=JSGantt.getXMLNodeValue(n[r],"pOpen",1,1),X=JSGantt.getXMLNodeValue(n[r],"pDepend",2,""),A=JSGantt.getXMLNodeValue(n[r],"pCaption",2,""),b=JSGantt.getXMLNodeValue(n[r],"pNotes",2,""),V=JSGantt.getXMLNodeValue(n[r],"pClass",2),"undefined"==typeof V&&(V=C>0?"ggroupblack":J>0?"gmilestone":"gtaskblue"),t.AddTaskItem(new JSGantt.TaskItem(y,L,N,G,V,M,J,x,k,C,I,R,X,A,b,t)))},JSGantt.benchMark=function(t){var e=(new Date).getTime();alert(t+": Elapsed time: "+(e-vBenchTime)/1e3+" seconds."),vBenchTime=(new Date).getTime()},JSGantt.getIsoWeek=function(t){var e=864e5,n=new Date(t.getFullYear(),0,4,0,0,0),a=0==n.getDay()?6:n.getDay()-1,o=n.getTime()-a*e,i=new Date(t.getFullYear(),t.getMonth(),t.getDate(),0,0,0),s=i.getTime(),r=Math.round((s-o)/e),l=99;new Date(o);return l=Math.ceil((r+1)/7),0>=l?l=JSGantt.getIsoWeek(new Date(t.getFullYear()-1,11,31,0,0,0)):53==l&&4!=new Date(t.getFullYear(),0,1,0,0,0).getDay()&&4!=new Date(t.getFullYear(),11,31,0,0,0).getDay()&&(l=1),l},JSGantt.addListener=function(t,e,n){return n===String(n)&&(n=JSGantt.findObj(n)),n.addEventListener?n.addEventListener(t,e,!1):n.attachEvent?n.attachEvent("on"+t,e):!1},JSGantt.addTooltipListeners=function(t,e,n){JSGantt.addListener("mouseover",function(e){JSGantt.showToolTip(t,e,n,null,t.getTimer())},e),JSGantt.addListener("mouseout",function(e){JSGantt.delayedHide(t,t.vTool,t.getTimer())},e)},JSGantt.addThisRowListeners=function(t,e,n){JSGantt.addListener("mouseover",function(){t.mouseOver(e,n)},e),JSGantt.addListener("mouseover",function(){t.mouseOver(e,n)},n),JSGantt.addListener("mouseout",function(){t.mouseOut(e,n)},e),JSGantt.addListener("mouseout",function(){t.mouseOut(e,n)},n)},JSGantt.addFolderListeners=function(t,e,n){JSGantt.addListener("click",function(){JSGantt.folder(n,t)},e)},JSGantt.addFormatListeners=function(t,e,n){JSGantt.addListener("click",function(){JSGantt.changeFormat(e,t)},n)},JSGantt.addScrollListeners=function(t){JSGantt.addListener("scroll",function(){t.getChartBody().scrollTop=t.getListBody().scrollTop},t.getListBody()),JSGantt.addListener("scroll",function(){t.getListBody().scrollTop=t.getChartBody().scrollTop},t.getChartBody()),JSGantt.addListener("scroll",function(){t.getChartHead().scrollLeft=t.getChartBody().scrollLeft},t.getChartBody()),JSGantt.addListener("scroll",function(){t.getChartBody().scrollLeft=t.getChartHead().scrollLeft},t.getChartHead()),JSGantt.addListener("resize",function(){t.getChartHead().scrollLeft=t.getChartBody().scrollLeft},window),JSGantt.addListener("resize",function(){t.getListBody().scrollTop=t.getChartBody().scrollTop},window)}; \ No newline at end of file diff --git a/htdocs/projet/ganttchart.inc.php b/htdocs/projet/ganttchart.inc.php index 771cb7d99cc..1893415d718 100644 --- a/htdocs/projet/ganttchart.inc.php +++ b/htdocs/projet/ganttchart.inc.php @@ -78,11 +78,11 @@ function reloadGraph() { } -var g = new JSGantt.GanttChart('g', document.getElementById('GanttChartDIV'), 'day'); -/* For JSGanttImproved var g = new JSGantt.GanttChart(document.getElementById('GanttChartDIV'), 'day'); */ +//var g = new JSGantt.GanttChart('g', document.getElementById('GanttChartDIV'), 'day'); +var g = new JSGantt.GanttChart(document.getElementById('GanttChartDIV'), 'day'); -/* For JSGanttImproved if (g.getDivId() != null) */ -if (g) +if (g.getDivId() != null) +//if (g) { var booShowRessources = 1; var booShowDurations = 1; @@ -91,9 +91,9 @@ if (g) var graphFormat = "day"; g.setDateInputFormat('mm/dd/yyyy'); // Set format of input dates ('mm/dd/yyyy', 'dd/mm/yyyy', does not work with 'yyyy-mm-dd') - g.setDateDisplayFormat(''); - /* For JSGanttImproved g.setDateTaskDisplayFormat(''); */ - /* For JSGanttImproved g.setDayMajorDateDisplayFormat('dd mon'); */ + //g.setDateDisplayFormat(''); + g.setDateTaskDisplayFormat(''); + g.setDayMajorDateDisplayFormat('dd mon'); g.setShowRes(1); // Show/Hide Responsible (0/1) g.setShowDur(1); // Show/Hide Duration (0/1) g.setShowComp(1); // Show/Hide % Complete(0/1) @@ -132,7 +132,7 @@ else * Add a gant chart line * * @param string $tarr tarr - * @param Task $task Task object + * @param array $task Task object * @param Project $project_dependencies Project object * @param int $level Level * @param int $project_id Id of project @@ -148,7 +148,7 @@ function constructGanttLine($tarr,$task,$project_dependencies,$level=0,$project_ // Resources $resources = $task["task_resources"]; // Define depend (ex: "", "4,13", ...) - $depend = "\""; + $depend = ''; $count = 0; foreach ($project_dependencies as $value) { // Not yet used project_dependencies = array(array(0=>idtask,1=>idtasktofinishfisrt)) @@ -157,7 +157,7 @@ function constructGanttLine($tarr,$task,$project_dependencies,$level=0,$project_ $count ++; } } - $depend .= "\""; + // $depend .= "\""; // Define parent if ($project_id && $level < 0) $parent = 'p'.$project_id; @@ -170,9 +170,9 @@ function constructGanttLine($tarr,$task,$project_dependencies,$level=0,$project_ // Name $name=$task['task_name']; - for($i=0; $i < $level; $i++) { - $name='     '.$name; - } + /*for($i=0; $i < $level; $i++) { + $name=' - '.$name; + }*/ // Add line to gantt /* g.AddTaskItem(new JSGantt.TaskItem(1, 'Define Chart API','', '', 'ggroupblack','', 0, 'Brian', 0, 1,0,1,'','','Some Notes text',g)); @@ -199,12 +199,12 @@ function constructGanttLine($tarr,$task,$project_dependencies,$level=0,$project_
pGantt
(required) javascript JSGantt.GanttChart object from which to take settings. Defaults to "g" for backwards compatibility
*/ - $note=""; + //$note=""; $s = "\n// Add taks id=".$task["task_id"]." level = ".$level."\n"; - $s.= "g.AddTaskItem(new JSGantt.TaskItem(".$task['task_id'].",'".dol_escape_js($name)."','".$start_date."', '".$end_date."', '".$task['task_color']."', '".$link."', ".$task['task_milestone'].", '".$resources."', ".($percent >= 0 ? $percent : 0).", ".($task["task_is_group"]>0?1:0).", '".$parent."', 1, '".($depend?$depend:"")."', '".$note."'));"; + // $s.= "g.AddTaskItem(new JSGantt.TaskItem(".$task['task_id'].",'".dol_escape_js($name)."','".$start_date."', '".$end_date."', '".$task['task_color']."', '".$link."', ".$task['task_milestone'].", '".$resources."', ".($percent >= 0 ? $percent : 0).", ".($task["task_is_group"]>0?1:0).", '".$parent."', 1, '".($depend?$depend:"")."', '".$note."'));"; // For JSGanttImproved - //$s.= "g.AddTaskItem(new JSGantt.TaskItem(".$task['task_id'].",'".dol_escape_js($name)."','".$start_date."', '".$end_date."', 'gtaskblue', '".$link."', ".$task['task_milestone'].", '".$resources."', ".($percent >= 0 ? $percent : 0).", ".($task["task_is_group"]>0?1:0).", '".$parent."', 1, '".($depend?$depend:"")."', '".$note."'));"; + $s.= "g.AddTaskItem(new JSGantt.TaskItem(".$task['task_id'].",'".dol_escape_js(trim($name))."','".$start_date."', '".$end_date."', '".$task['task_css']."', '".$link."', ".$task['task_milestone'].", '".$resources."', ".($percent >= 0 ? $percent : 0).", ".($task["task_is_group"]).", '".$parent."', 1, '".($depend?$depend:$parent."SS")."', '".($percent >= 0 ? $percent.'%' : '0%')."','".$task['note']."'));"; echo $s; diff --git a/htdocs/projet/ganttview.php b/htdocs/projet/ganttview.php index b86a961bd69..29e9d0de1b4 100644 --- a/htdocs/projet/ganttview.php +++ b/htdocs/projet/ganttview.php @@ -206,8 +206,18 @@ if (count($tasksarray)>0) $task->fetch($val->id); $tasks[$taskcursor]['task_id']=$val->id; $tasks[$taskcursor]['task_parent']=$val->fk_parent; - $tasks[$taskcursor]['task_is_group']=0; - $tasks[$taskcursor]['task_milestone']=0; + $tasks[$taskcursor]['task_is_group'] = 0; + $tasks[$taskcursor]['task_css'] = 'gtaskblue'; + + if($val->fk_parent > 0 && $task->hasChildren()> 0){ + $tasks[$taskcursor]['task_is_group']=1; + $tasks[$taskcursor]['task_css'] = 'gtaskred'; + } + elseif($task->hasChildren()> 0) { + $tasks[$taskcursor]['task_is_group'] = 1; + $tasks[$taskcursor]['task_css'] = 'gtaskgreen'; + } + $tasks[$taskcursor]['task_milestone']='0'; $tasks[$taskcursor]['task_percent_complete']=$val->progress; //$tasks[$taskcursor]['task_name']=$task->getNomUrl(1); //print dol_print_date($val->date_start).dol_print_date($val->date_end).'
'."\n"; @@ -217,7 +227,7 @@ if (count($tasksarray)>0) $tasks[$taskcursor]['task_color']='b4d1ea'; $idofusers=$task->getListContactId('internal'); $idofthirdparty=$task->getListContactId('external'); - $s=''; + $s=''; if (count($idofusers)>0) { $s.=$langs->trans("Internals").': '; @@ -225,12 +235,12 @@ if (count($tasksarray)>0) foreach($idofusers as $valid) { $userstatic->fetch($valid); - if ($i) $s.=','; + if ($i) $s.=', '; $s.=$userstatic->login; $i++; } } - if (count($idofusers)>0 && (count($idofthirdparty)>0)) $s.=' - '; + //if (count($idofusers)>0 && (count($idofthirdparty)>0)) $s.=' - '; if (count($idofthirdparty)>0) { if ($s) $s.=' - '; @@ -244,18 +254,21 @@ if (count($tasksarray)>0) $i++; } } - if ($s) $tasks[$taskcursor]['task_resources']=''.$langs->trans("List").''; - /* For JSGanttImproved if ($s) $tasks[$taskcursor]['task_resources']=join(',',$idofusers); */ + //if ($s) $tasks[$taskcursor]['task_resources']=''.$langs->trans("List").''; + /* For JSGanttImproved */ + //if ($s) $tasks[$taskcursor]['task_resources']=implode(',',$idofusers); + $tasks[$taskcursor]['task_resources'] = $s; //print "xxx".$val->id.$tasks[$taskcursor]['task_resources']; + $tasks[$taskcursor]['note']=$task->note_public; $taskcursor++; } print "\n"; - if (! empty($conf->use_javascript_ajax)) + if (! empty($conf->use_javascript_ajax)) { //var_dump($_SESSION); - print '
'."\n"; + print '
'."\n"; include_once DOL_DOCUMENT_ROOT.'/projet/ganttchart.inc.php'; print '
'."\n"; } diff --git a/htdocs/projet/jsgantt_language.js.php b/htdocs/projet/jsgantt_language.js.php index 16b89fbebb3..561697fd161 100644 --- a/htdocs/projet/jsgantt_language.js.php +++ b/htdocs/projet/jsgantt_language.js.php @@ -32,44 +32,29 @@ if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML',1); if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1'); -require_once '../main.inc.php'; +require_once __DIR__.'/../main.inc.php'; // Define css type header('Content-type: text/javascript'); global $langs; ?> -var i18n = new Array(); -i18n["sMinute"]= "transnoentities("Minute") ?>"; -i18n["sMinutes"]= "transnoentities("Minutes") ?>"; -i18n["sHour"]= "transnoentities("Hour") ?>"; -i18n["sHours"]= "transnoentities("Hours") ?>"; -i18n["sDay"]= "transnoentities("Day") ?>"; -i18n["sDays"]= "transnoentities("Days") ?>"; -i18n["sWeek"] = "transnoentities("Week") ?>"; -i18n["sMonth"] = "transnoentities("Month") ?>"; -i18n["sQuarter"] = "transnoentities("Quadri") ?>"; -i18n["View"] = "transnoentities("View") ?>"; -i18n["Resource"] = "transnoentities("Resources") ?>"; -i18n["Duration"] = "transnoentities("Duration") ?>"; -i18n["Start_Date"] = "transnoentities("DateStart") ?>"; -i18n["End_Date"] = "transnoentities("DateEnd") ?>"; -i18n["Date_Format"] = "transnoentities("Format") ?>"; -i18n["January"] = "transnoentities("January") ?>"; -i18n["February"] = "transnoentities("February") ?>"; -i18n["March"] = "transnoentities("March") ?>"; -i18n["April"] = "transnoentities("April") ?>"; -i18n["May"] = "transnoentities("May") ?>"; -i18n["June"] = "transnoentities("June") ?>"; -i18n["July"] = "transnoentities("July") ?>"; -i18n["August"] = "transnoentities("August") ?>"; -i18n["September"] = "transnoentities("Septembre") ?>"; -i18n["October"] = "transnoentities("October") ?>"; -i18n["November"] = "transnoentities("November") ?>"; -i18n["December"] = "transnoentities("December") ?>"; -i18n["Quarter"] = "transnoentities("Quarter") ?>"; -i18n["Period"] = "transnoentities("Period") ?>"; - +var vLangs={'getDefaultLang(1);?>': +{'format':'transnoentities('Periodo');?>','hour':'"transnoentities('Hour'); ?>','day':'transnoentities('Day'); ?>', + 'week':'transnoentities('Week'); ?>','month':'transnoentities('Month'); ?>','quarter':'transnoentities('Quadri'); ?>', + 'hours':'transnoentities('Hours'); ?>','days':'transnoentities('Days'); ?>','weeks':'transnoentities('Weeks');?>', + 'months':'transnoentities('Months'); ?>','quarters':'transnoentities('Quadri'); ?>','hr':'Hr','dy':'transnoentities('Day'); ?>','wk':'transnoentities('Week'); ?>','mth':'transnoentities('Month'); ?>','qtr':'transnoentities('Quadri'); ?>','hrs':'transnoentities('Hours'); ?>', + 'dys':'transnoentities('Days'); ?>','wks':'transnoentities('Weeks'); ?>','mths':'transnoentities('Months'); ?>','qtrs':'transnoentities('Quadri'); ?>','resource':'transnoentities('Resources'); ?>','duration':'transnoentities('Duration'); ?>','comp':'% transnoentities('Total'); ?>', + 'completion':'transnoentities('Total'); ?>','startdate':'transnoentities('DateStart'); ?>','enddate':'transnoentities('DateEnd'); ?>','moreinfo':'transnoentities('MoreInformation'); ?>', + 'notes':'transnoentities('NotePublic'); ?>', + 'january':'transnoentities('January'); ?>','february':'transnoentities('February'); ?>','march':'transnoentities('March'); ?>','april':'transnoentities('April'); ?>','maylong':'transnoentities('May'); ?>','june':'transnoentities('June'); ?>','july':'transnoentities('July'); ?>', + 'august':'transnoentities('August'); ?>','september':'transnoentities('September'); ?>','october':'transnoentities('October'); ?>','november':'transnoentities('November'); ?>','december':'transnoentities('December'); ?>', + 'jan':'transnoentities('JanuaryMin'); ?>','feb':'transnoentities('FebruaryMin'); ?>','mar':'transnoentities('MarchMin'); ?>','apr':'transnoentities('AprilMin'); ?>','may':'transnoentities('MayMin'); ?>','jun':'transnoentities('JuneMin'); ?>','jul':'transnoentities('JulyMin'); ?>', + 'aug':'transnoentities('AugustMin'); ?>','sep':'transnoentities('SeptemberMin'); ?>','oct':'transnoentities('OctoberMin'); ?>','nov':'transnoentities('NovemberMin'); ?>','dec':'transnoentities('DecemberMin'); ?>', + 'sunday':'transnoentities('Sunday'); ?>','monday':'transnoentities('Monday'); ?>','tuesday':'transnoentities('Tuesday'); ?>','wednesday':'transnoentities('Wednesday'); ?>','thursday':'transnoentities('Thursday'); ?>','friday':'transnoentities('Friday'); ?>','saturday':'transnoentities('Saturday'); ?>', + 'sun':'transnoentities('SundayMin'); ?>','mon':'transnoentities('MondayMin'); ?>','tue':'transnoentities('TuesdayMin'); ?>','wed':'transnoentities('WednesdayMin'); ?>','thu':'transnoentities('ThursdayMin'); ?>','fri':'transnoentities('FridayMin'); ?>','sat':'transnoentities('SaturdayMin'); ?>'} +}; +var vLang='getDefaultLang(1);?>'; close();