EventInstanceGroup.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. var EventInstanceGroup = Class.extend({
  2. eventInstances: null,
  3. constructor: function(eventInstances) {
  4. this.eventInstances = eventInstances;
  5. },
  6. buildRenderRanges: function(constraintRange, calendar) {
  7. var eventInstances = this.eventInstances;
  8. var ranges = this.buildRanges(constraintRange, calendar);
  9. if (eventInstances.length && eventInstances[0].eventDefinition.rendering === 'inverse-background') {
  10. ranges = invertEventRanges(ranges, constraintRange, eventInstances[0]);
  11. }
  12. return ranges;
  13. },
  14. buildRanges: function(constraintRange, calendar) {
  15. var eventRanges = [];
  16. var eventInstances = this.eventInstances;
  17. var i, eventInstance;
  18. var eventRange;
  19. for (i = 0; i < eventInstances.length; i++) {
  20. eventInstance = eventInstances[i];
  21. eventRange = eventInstance.eventDateProfile.buildRange(calendar);
  22. eventRange = new EventRange(eventInstance, eventRange.startMs, eventRange.endMs);
  23. eventRange = eventRange.constrainTo(constraintRange);
  24. if (eventRange) {
  25. eventRanges.push(eventRange);
  26. }
  27. }
  28. return eventRanges;
  29. }
  30. });
  31. function invertEventRanges(eventRanges, constraintRange, ownerEventInstance) {
  32. var inverseRanges = [];
  33. var startMs = constraintRange.startMs; // the end of the previous range. the start of the new range
  34. var i, eventRange;
  35. // ranges need to be in order. required for our date-walking algorithm
  36. eventRanges.sort(compareUnzonedRanges);
  37. for (i = 0; i < eventRanges.length; i++) {
  38. eventRange = eventRanges[i];
  39. // add the span of time before the event (if there is any)
  40. if (eventRange.startMs > startMs) { // compare millisecond time (skip any ambig logic)
  41. inverseRanges.push(
  42. new EventRange(
  43. ownerEventInstance,
  44. startMs,
  45. eventRange.startMs
  46. )
  47. );
  48. }
  49. if (eventRange.endMs > startMs) {
  50. startMs = eventRange.endMs;
  51. }
  52. }
  53. // add the span of time after the last event (if there is any)
  54. if (startMs < constraintRange.endMs) { // compare millisecond time (skip any ambig logic)
  55. inverseRanges.push(
  56. new EventRange(
  57. ownerEventInstance,
  58. startMs,
  59. constraintRange.endMs
  60. )
  61. );
  62. }
  63. return inverseRanges;
  64. }