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 fetchID = 0; 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) { events = []; fetchEventSources(eventSources, callback); } // appends to the events array function fetchEventSources(sources, callback) { var savedID = ++fetchID; var queued = sources.length; var view = getView(); eventStart = cloneDate(view.visStart); // we don't need to make local copies b/c eventEnd = cloneDate(view.visEnd); // eventStart/eventEnd is only assigned/manipulated here function sourceDone(source, sourceEvents) { if (savedID == fetchID && eventStart >= view.visStart && eventEnd <= view.visEnd) { // same fetchEventSources call, and still in correct date range if ($.inArray(source, eventSources) != -1) { // source hasn't been removed since we started for (var i=0; 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