|
|
@@ -12,6 +12,7 @@ var EventPeriod = Class.extend(EmitterMixin, {
|
|
|
stuntedReleaseCnt: 0,
|
|
|
releaseCnt: 0,
|
|
|
|
|
|
+ eventDefsByInternalId: null,
|
|
|
eventDefsById: null,
|
|
|
eventInstancesById: null,
|
|
|
eventRangesById: null,
|
|
|
@@ -22,6 +23,7 @@ var EventPeriod = Class.extend(EmitterMixin, {
|
|
|
this.end = end;
|
|
|
this.timezone = timezone;
|
|
|
this.requests = [];
|
|
|
+ this.eventDefsByInternalId = {};
|
|
|
this.eventDefsById = {};
|
|
|
this.eventInstancesById = {};
|
|
|
this.eventRangesById = {};
|
|
|
@@ -66,7 +68,7 @@ var EventPeriod = Class.extend(EmitterMixin, {
|
|
|
},
|
|
|
|
|
|
|
|
|
- purgeSource: function(source, isSilent) {
|
|
|
+ purgeSource: function(source) {
|
|
|
var _this = this;
|
|
|
|
|
|
var removeCnt = removeMatching(this.requests, function(request) {
|
|
|
@@ -80,14 +82,14 @@ var EventPeriod = Class.extend(EmitterMixin, {
|
|
|
});
|
|
|
|
|
|
if (removeCnt) {
|
|
|
- this.removeEventsBySource(source, isSilent); // might release
|
|
|
+ this.removeEventDefsBySource(source); // might release
|
|
|
}
|
|
|
|
|
|
return removeCnt;
|
|
|
},
|
|
|
|
|
|
|
|
|
- purgeAllSources: function(isSilent) {
|
|
|
+ purgeAllSources: function() {
|
|
|
if (this.requests.length) {
|
|
|
this.requests.forEach(function(request) {
|
|
|
request.status = 'cancelled';
|
|
|
@@ -95,15 +97,41 @@ var EventPeriod = Class.extend(EmitterMixin, {
|
|
|
|
|
|
this.requests = [];
|
|
|
this.pendingCnt = 0;
|
|
|
- this.removeAllEvents(isSilent); // might release
|
|
|
+ this.removeAllEventDefs(); // might release
|
|
|
}
|
|
|
},
|
|
|
|
|
|
|
|
|
- // Event Def/Instance/Range ADDING
|
|
|
+ // Event Definitions
|
|
|
// -----------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
+ getEventDefByInternalId: function(eventDefInternalId) {
|
|
|
+ return this.eventDefsByInternalId[eventDefInternalId];
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+ getEventDefsById: function(eventDefId) {
|
|
|
+ return this.eventDefsById[eventDefId] || [];
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+ iterEventDefs: function(func) {
|
|
|
+ var eventDefsById = this.eventDefId;
|
|
|
+ var id;
|
|
|
+ var eventDefs;
|
|
|
+ var i;
|
|
|
+
|
|
|
+ for (id in eventDefsById) {
|
|
|
+ eventDefs = eventDefsById[id];
|
|
|
+
|
|
|
+ for (i = 0; i < eventDefs.length; i++) {
|
|
|
+ func(eventDefs[i]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
addEventDefs: function(eventDefs) {
|
|
|
for (var i = 0; i < eventDefs.length; i++) {
|
|
|
this.addEventDef(eventDefs[i]);
|
|
|
@@ -117,6 +145,8 @@ var EventPeriod = Class.extend(EmitterMixin, {
|
|
|
var eventInstances = eventDef.buildInstances(this.start, this.end);
|
|
|
var i;
|
|
|
|
|
|
+ this.eventDefsByInternalId[eventDef.internalId] = eventDef;
|
|
|
+
|
|
|
(eventDefsById[eventDefId] || (eventDefsById[eventDefId] = []))
|
|
|
.push(eventDef);
|
|
|
|
|
|
@@ -126,115 +156,46 @@ var EventPeriod = Class.extend(EmitterMixin, {
|
|
|
},
|
|
|
|
|
|
|
|
|
- addEventInstance: function(eventInstance, eventDefId) {
|
|
|
- var eventInstancesById = this.eventInstancesById;
|
|
|
-
|
|
|
- (eventInstancesById[eventDefId] || (eventInstancesById[eventDefId] = []))
|
|
|
- .push(eventInstance);
|
|
|
-
|
|
|
- this.addEventRange(eventInstance.buildEventRange(), eventDefId);
|
|
|
- },
|
|
|
-
|
|
|
-
|
|
|
- addEventRange: function(eventRange, eventDefId) {
|
|
|
- var eventRangesById = this.eventRangesById;
|
|
|
-
|
|
|
- (eventRangesById[eventDefId] || (eventRangesById[eventDefId] = []))
|
|
|
- .push(eventRange);
|
|
|
-
|
|
|
- this.tryRelease();
|
|
|
- },
|
|
|
-
|
|
|
-
|
|
|
- // Event Def/Instance/Range REMOVING
|
|
|
- // -----------------------------------------------------------------------------------------------------------------
|
|
|
-
|
|
|
-
|
|
|
- removeEventsById: function(eventDefId) {
|
|
|
- delete this.eventDefsById[eventDefId];
|
|
|
- delete this.eventInstancesById[eventDefId];
|
|
|
-
|
|
|
- if (eventDefId in this.eventRangesById) {
|
|
|
- delete this.eventRangesById[eventDefId];
|
|
|
+ removeEventDefsById: function(eventDefId) {
|
|
|
+ var _this = this;
|
|
|
|
|
|
- this.tryRelease();
|
|
|
- }
|
|
|
+ this.getEventDefsById(eventDefId).forEach(function(eventDef) {
|
|
|
+ _this.removeEventDef(eventDef);
|
|
|
+ });
|
|
|
},
|
|
|
|
|
|
|
|
|
- removeEventsBySource: function(source, isSilent) {
|
|
|
- var eventDefsById = this.eventDefsById;
|
|
|
- var eventInstancesById = this.eventInstancesById;
|
|
|
- var eventRangesById = this.eventRangesById;
|
|
|
- var id;
|
|
|
- var removeCnt = 0;
|
|
|
-
|
|
|
- function matchEventDef(eventDef) {
|
|
|
- return eventDef.source === source;
|
|
|
- }
|
|
|
-
|
|
|
- function matchEventInstance(eventInstance) {
|
|
|
- return eventInstance.def.source === source;
|
|
|
- }
|
|
|
-
|
|
|
- function matchEventRange(eventRange) {
|
|
|
- return eventRange.eventInstance.def.source === source;
|
|
|
- }
|
|
|
-
|
|
|
- for (id in eventDefsById) {
|
|
|
- removeMatching(eventDefsById[id], matchEventDef);
|
|
|
- }
|
|
|
-
|
|
|
- for (id in eventInstancesById) {
|
|
|
- removeMatching(eventInstancesById[id], matchEventInstance);
|
|
|
- }
|
|
|
-
|
|
|
- for (id in eventRangesById) {
|
|
|
- removeCnt += removeMatching(eventRangesById[id], matchEventRange);
|
|
|
- }
|
|
|
+ removeEventDefsBySource: function(source) {
|
|
|
+ var _this = this;
|
|
|
|
|
|
- if (removeCnt && !isSilent) {
|
|
|
- this.tryRelease();
|
|
|
- }
|
|
|
+ this.iterEventDefs(function(eventDef) {
|
|
|
+ if (eventDef.source === source) {
|
|
|
+ _this.removeEventDef(eventDef);
|
|
|
+ }
|
|
|
+ });
|
|
|
},
|
|
|
|
|
|
|
|
|
- removeAllEvents: function(isSilent) {
|
|
|
- var hasAny = !$.isEmptyObject(this.eventRangesById);
|
|
|
-
|
|
|
+ removeAllEventDefs: function() {
|
|
|
+ this.eventDefsByInternalId = {};
|
|
|
this.eventDefsById = {};
|
|
|
this.eventInstancesById = {};
|
|
|
this.eventRangesById = {};
|
|
|
-
|
|
|
- if (hasAny && !isSilent) {
|
|
|
- this.tryRelease();
|
|
|
- }
|
|
|
+ this.tryRelease();
|
|
|
},
|
|
|
|
|
|
|
|
|
- // Event Def/Instance/Range GETTING
|
|
|
- // -----------------------------------------------------------------------------------------------------------------
|
|
|
+ removeEventDef: function(eventDef) {
|
|
|
+ delete this.eventDefsByInternalId[eventDef.internalId];
|
|
|
|
|
|
+ removeExact(this.eventDefsById[eventDef.id] || [], eventDef);
|
|
|
|
|
|
- getEventDefsById: function(eventDefId) {
|
|
|
- return this.eventDefsById[eventDefId] || [];
|
|
|
+ this.removeEventInstancesForDef(eventDef);
|
|
|
},
|
|
|
|
|
|
|
|
|
- iterEventDefs: function(func) {
|
|
|
- var eventDefsById = this.eventDefId;
|
|
|
- var id;
|
|
|
- var eventDefs;
|
|
|
- var i;
|
|
|
-
|
|
|
- for (id in eventDefsById) {
|
|
|
- eventDefs = eventDefsById[id];
|
|
|
-
|
|
|
- for (i = 0; i < eventDefs.length; i++) {
|
|
|
- func(eventDefs[i]);
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
+ // Event Instances
|
|
|
+ // -----------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
getEventInstances: function() { // TODO: consider iterator
|
|
|
@@ -252,6 +213,29 @@ var EventPeriod = Class.extend(EmitterMixin, {
|
|
|
},
|
|
|
|
|
|
|
|
|
+ addEventInstance: function(eventInstance, eventDefId) {
|
|
|
+ var eventInstancesById = this.eventInstancesById;
|
|
|
+
|
|
|
+ (eventInstancesById[eventDefId] || (eventInstancesById[eventDefId] = []))
|
|
|
+ .push(eventInstance);
|
|
|
+
|
|
|
+ this.addEventRange(eventInstance.buildEventRange(), eventDefId);
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+ removeEventInstancesForDef: function(eventDef) {
|
|
|
+ removeMatching(this.eventInstancesById[eventDef.id] || [], function(currentEventInstance) {
|
|
|
+ return currentEventInstance.def === eventDef;
|
|
|
+ });
|
|
|
+
|
|
|
+ this.removeEventRangesForDef(eventDef);
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+ // Event Ranges
|
|
|
+ // -----------------------------------------------------------------------------------------------------------------
|
|
|
+
|
|
|
+
|
|
|
getEventRanges: function() { // TODO: consider iterator
|
|
|
var eventRangesById = this.eventRangesById;
|
|
|
var matchingRanges = [];
|
|
|
@@ -289,6 +273,27 @@ var EventPeriod = Class.extend(EmitterMixin, {
|
|
|
},
|
|
|
|
|
|
|
|
|
+ addEventRange: function(eventRange, eventDefId) {
|
|
|
+ var eventRangesById = this.eventRangesById;
|
|
|
+
|
|
|
+ (eventRangesById[eventDefId] || (eventRangesById[eventDefId] = []))
|
|
|
+ .push(eventRange);
|
|
|
+
|
|
|
+ this.tryRelease();
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+ removeEventRangesForDef: function(eventDef) {
|
|
|
+ var removeCnt = removeMatching(this.eventRangesById[eventDef.id] || [], function(currentEventRange) {
|
|
|
+ return currentEventRange.eventInstance.def === eventDef;
|
|
|
+ });
|
|
|
+
|
|
|
+ if (removeCnt) {
|
|
|
+ this.tryRelease();
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
// Releasing and Freezing
|
|
|
// -----------------------------------------------------------------------------------------------------------------
|
|
|
|