diff --git a/lib/ical/recur_expansion.js b/lib/ical/recur_expansion.js index 903906df..4f282e12 100644 --- a/lib/ical/recur_expansion.js +++ b/lib/ical/recur_expansion.js @@ -213,6 +213,21 @@ ICAL.RecurExpansion = (function() { } }, + /** + * Compare two ICAL.Time objects. When the second parameter is a timeless date + * and the first parameter is date-with-time, strip the time and compare only + * the days. + * + * @private + * @param {ICAL.Time} a The one object to compare + * @param {ICAL.Time} b The other object to compare + */ + _compare_special: function(a, b) { + if (!a.isDate && b.isDate) + return new ICAL.Time({year:a.year, month:a.month, day:a.day}).compare(b); + else return a.compare(b); + }, + /** * Retrieve the next occurrence in the series. * @return {ICAL.Time} @@ -264,9 +279,10 @@ ICAL.RecurExpansion = (function() { // check the negative rules if (this.exDate) { - compare = this.exDate.compare(this.last); + //EXDATE can be in DATE format, but DTSTART is in DATE-TIME format + compare = this._compare_special(this.last, this.exDate); - if (compare < 0) { + if (compare > 0) { this._nextExDay(); } @@ -418,10 +434,12 @@ ICAL.RecurExpansion = (function() { if (component.hasProperty('exdate')) { this.exDates = this._extractDates(component, 'exdate'); // if we have a .last day we increment the index to beyond it. + // When DTSTART is in DATE-TIME format, EXDATE is in DATE format and EXDATE is + // the date of DTSTART, _compare_special finds this out and compareTime fails. this.exDateInc = ICAL.helpers.binsearchInsert( this.exDates, this.last, - compareTime + this._compare_special ); this.exDate = this.exDates[this.exDateInc];