var eventGUID = 1; function EventManager(options, eventSources) { var t = this; // exports t.fetchEvents = fetchEvents; t.refetchEvents = refetchEvents; t.isFetchNeeded = isFetchNeeded; t.addEventSource = addEventSource; t.removeEventSource = removeEventSource; t.updateEvent = updateEvent; t.renderEvent = renderEvent; t.removeEvents = removeEvents; t.clientEvents = clientEvents; t.normalizeEvent = normalizeEvent; // imports var getDate = t.getDate; var getView = t.getView; var trigger = t.trigger; var rerenderEvents = t.rerenderEvents; // locals var eventStart, eventEnd; var events = []; var loadingLevel = 0; /* Sources -----------------------------------------------------------------------------*/ eventSources.unshift([]); // first event source reserved for 'sticky' events function addEventSource(source) { eventSources.push(source); fetchEventSource(source, rerenderEvents); } function removeEventSource(source) { eventSources = $.grep(eventSources, function(src) { return src != source; }); // remove all client events from that source events = $.grep(events, function(e) { return e.source != source; }); rerenderEvents(); } /* Fetching -----------------------------------------------------------------------------*/ // Fetch from ALL sources. Clear 'events' array and populate function fetchEvents(callback) { var view = getView(); events = []; eventStart = cloneDate(view.visStart); eventEnd = cloneDate(view.visEnd); var queued = eventSources.length, sourceDone = function() { if (!--queued) { if (callback) { callback(events); } } }, i=0; for (; i eventEnd; } /* Manipulation -----------------------------------------------------------------------------*/ function updateEvent(event) { // update an existing event var i, len = events.length, e, defaultEventEnd = getView().defaultEventEnd, startDelta = event.start - event._start, endDelta = event.end ? (event.end - (event._end || defaultEventEnd(event))) // event._end would be null if event.end : 0; // was null and event was just resized for (i=0; i