Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
114 lines
2.4 KiB
JavaScript
Executable file
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;
|
|
}
|
|
};
|
|
|
|
});
|