672672 default :
673673 range = tools . parseDateRange ( element . dateStart , element . dateEnd ) ;
674674
675- var year = range [ 0 ] . getFullYear ( ) ;
676- var month = range [ 0 ] . getMonth ( ) ;
677- var day = range [ 0 ] ;
675+ var dateBefore = ktkGetNextDate ( range [ 0 ] , - 1 ) ;
676+ var year = dateBefore . getFullYear ( ) ;
677+ var month = dateBefore . getMonth ( ) ;
678+ var day = dateBefore ;
678679
679680 for ( var i = 0 ; i < range . length ; i ++ ) {
680681 var rday = range [ i ] ;
681-
682+
682683 // Fill years
683684 if ( rday . getFullYear ( ) !== year ) {
684685 yearArr . push (
692693 }
693694 daysInYear ++ ;
694695
695-
696696 // Fill months
697697 if ( rday . getMonth ( ) !== month ) {
698698 monthArr . push (
720720 + ' <div class="fn-label">' + settings . dow [ getDay ] + '</div></div>' ) ;
721721 } //for
722722
723-
724723 // Last year
725724 yearArr . push (
726725 '<div class="row header year" style="width: '
734733 + tools . getCellSize ( ) * daysInMonth + 'px"><div class="fn-label">'
735734 + settings . months [ month ]
736735 + '</div></div>' ) ;
737-
736+
738737 var dataPanel = core . dataPanel ( element , range . length * tools . getCellSize ( ) ) ;
739738
740739
15251524 var end = new Date ( to ) ;
15261525 var ret = [ ] ;
15271526 var i = 0 ;
1528- do {
1529- ret [ i ] = new Date ( current . getTime ( ) ) ;
1530- current . setHours ( current . getHours ( ) + scaleStep ) ;
1531- current . setHours ( Math . floor ( ( current . getHours ( ) ) / scaleStep ) * scaleStep ) ;
1527+ for ( ; ; ) {
1528+ var dayStartTime = new Date ( current ) ;
1529+ dayStartTime . setHours ( Math . floor ( ( current . getHours ( ) ) / scaleStep ) * scaleStep ) ;
1530+
1531+ if ( ret [ i ] && dayStartTime . getDay ( ) !== ret [ i ] . getDay ( ) ) {
1532+ // If mark-cursor jumped to next day, make sure it starts at 0 hours
1533+ dayStartTime . setHours ( 0 ) ;
1534+ }
1535+ ret [ i ] = dayStartTime ;
1536+
1537+ // Note that we use ">" because we want to include the end-time point.
1538+ if ( current . getTime ( ) > to . getTime ( ) ) break ;
15321539
1540+ /* BUG-2: current is moved backwards producing a dead-lock! (crashes chrome/IE/firefox)
1541+ * SEE: https://github.com/taitems/jQuery.Gantt/issues/62
15331542 if (current.getDay() !== ret[i].getDay()) {
1534- current . setHours ( 0 ) ;
1543+ current.setHours(0);
15351544 }
1545+ */
1546+
1547+ current = ktkGetNextDate ( current , scaleStep ) ;
15361548
15371549 i ++ ;
1538- } while ( current . getTime ( ) <= to . getTime ( ) ) ;
1550+ } ;
1551+
15391552 return ret ;
15401553 } ,
15411554
16831696 }
16841697
16851698 switch ( settings . scale ) {
1699+ //case "hours": this.headerRows = 5; this.scaleStep = 8; break;
16861700 case "hours" : this . headerRows = 5 ; this . scaleStep = 1 ; break ;
16871701 case "weeks" : this . headerRows = 3 ; this . scaleStep = 13 ; break ;
16881702 case "months" : this . headerRows = 2 ; this . scaleStep = 14 ; break ;
17071721 } ) ;
17081722
17091723 } ;
1710- } ) ( jQuery ) ;
1724+ } ) ( jQuery ) ;
1725+
1726+ function ktkGetNextDate ( currentDate , scaleStep ) {
1727+ for ( var minIncrements = 1 ; ; minIncrements ++ ) {
1728+ var nextDate = new Date ( currentDate ) ;
1729+ nextDate . setHours ( currentDate . getHours ( ) + scaleStep * minIncrements ) ;
1730+
1731+ if ( nextDate . getTime ( ) != currentDate . getTime ( ) ) {
1732+ return nextDate ;
1733+ }
1734+
1735+ // If code reaches here, it's because current didn't really increment (invalid local time) because of daylight-saving adjustments
1736+ // => retry adding 2, 3, 4 hours, and so on (until nextDate > current)
1737+ }
1738+ }
0 commit comments