VulpesOS/gaia/apps/calendar/js/common/timespan.js
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

114 lines
2.4 KiB
JavaScript
Executable file

define(function(require, exports, module) {
'use strict';
function Timespan(startDate, endDate) {
this.start = startDate.valueOf();
this.end = endDate.valueOf();
}
module.exports = Timespan;
Timespan.prototype = {
isEqual: function(inputSpan) {
return (
this.start === inputSpan.start &&
this.end === inputSpan.end
);
},
/**
* If given Timespan overlaps this timespan
* return a new timespan with the overlapping
* parts removed.
*
* See tests for examples...
*/
trimOverlap: function(span) {
if (this.contains(span) || span.contains(this)) {
return null;
}
var start = span.start;
var end = span.end;
var ourEnd = this.end;
var ourStart = this.start;
var overlapsBefore = start >= ourStart && start < ourEnd;
var overlapsAfter = ourStart >= start && ourStart < end;
var newStart = span.start;
var newEnd = span.end;
if (overlapsBefore) {
newStart = ourEnd + 1;
}
if (overlapsAfter) {
newEnd = ourStart - 1;
}
return new Timespan(newStart, newEnd);
},
/**
* Checks if given time overlaps with
* range.
*
* @param {Date|Numeric|Timespan} start range or one position.
* @param {Date|Numeric} [end] do a span comparison.
*/
overlaps: function(start, end) {
var ourStart = this.start;
var ourEnd = this.end;
if (start instanceof Timespan) {
end = start.end;
start = start.start;
} else {
// start/end expected
start = (start instanceof Date) ? start.valueOf() : start;
end = (end instanceof Date) ? end.valueOf() : end;
}
return (
start >= ourStart && start < ourEnd ||
ourStart >= start && ourStart < end
);
},
/**
* When given a date checks if
* date is inside given range.
*
*
* @param {Date} date date or event.
*/
contains: function(date) {
var start = this.start;
var end = this.end;
if (date instanceof Date) {
return start <= date && end >= date;
} else if (date instanceof Timespan) {
return start <= date.start &&
end >= date.end;
} else {
return this.containsNumeric(date);
}
},
/**
* Numeric comparison assumes
* given seconds since epoch.
*
* @param {Numeric} timestamp numeric timestamp.
*/
containsNumeric: function(timestamp) {
var start = this.start;
var end = this.end;
return start <= timestamp &&
end >= timestamp;
}
};
});