From 0d9f12f159163a5ed4a835937df9150219c48a71 Mon Sep 17 00:00:00 2001 From: 7u83 <7u83@mail.ru> Date: Mon, 7 Dec 2020 21:04:07 +0100 Subject: [PATCH] Initial commit --- __init__.py | 19 + __openerp__.py | 42 + doc/index.rst | 9 + static/description/Web_year_cal_1.png | Bin 0 -> 33220 bytes static/description/icon.png | Bin 0 -> 4898 bytes static/description/index.html | 19 + static/description/main_screenshot.png | Bin 0 -> 145341 bytes static/src/js/fullcalendar.js | 6984 ++++++++++++++++++++++++ static/src/js/web_calendar_year.js | 39 + views/web_calendar_year.xml | 11 + 10 files changed, 7123 insertions(+) create mode 100644 __init__.py create mode 100644 __openerp__.py create mode 100644 doc/index.rst create mode 100644 static/description/Web_year_cal_1.png create mode 100644 static/description/icon.png create mode 100644 static/description/index.html create mode 100644 static/description/main_screenshot.png create mode 100644 static/src/js/fullcalendar.js create mode 100644 static/src/js/web_calendar_year.js create mode 100644 views/web_calendar_year.xml diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..190f6a5 --- /dev/null +++ b/__init__.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright (C) 2015 Onestein (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## diff --git a/__openerp__.py b/__openerp__.py new file mode 100644 index 0000000..289a569 --- /dev/null +++ b/__openerp__.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright (C) 2015 Onestein (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +{ + 'name': "Web Calendar Year", + 'images': ['static/description/main_screenshot.png'], + 'summary': """Year view on Odoo calendar""", + 'description': """ +Year calendar view +================== +Extends the default calendar widget with a year view. +""", + 'author': "Onestein", + 'website': "http://www.onestein.eu", + 'category': 'Extra Tools', + 'version': '1.0', + 'depends': ['web_calendar'], + 'data': [ + 'views/web_calendar_year.xml', + ], + 'demo': [], + 'installable': True, + 'auto_install': False, + 'application': False, +} diff --git a/doc/index.rst b/doc/index.rst new file mode 100644 index 0000000..9234a43 --- /dev/null +++ b/doc/index.rst @@ -0,0 +1,9 @@ +This module adds a year view to all Odoo calendar views for all users. + +No configuration is needed. + +| + +**Contact us:** + +When you have any remark about this module, please let us know on http://www.onestein.eu/feedback diff --git a/static/description/Web_year_cal_1.png b/static/description/Web_year_cal_1.png new file mode 100644 index 0000000000000000000000000000000000000000..6d821773b782cccc23882f5c41baec1e5e7d21dc GIT binary patch literal 33220 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 G>;DHMw8B6D literal 0 HcmV?d00001 diff --git a/static/description/icon.png b/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f322fbcf947b7d1dc1d90201b0f62427c01704ff GIT binary patch literal 4898 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 +
+

Year calendar

+

Overview throughout the year

+
+

+ For several planning tasks the month scope is too short. The year overview will give you optimal insight for planning purposes. + This is especially useful for leave requests, appraisal planning and project task planning. +

+
+ +
+
+ Year calendar +
+
+ +
+ diff --git a/static/description/main_screenshot.png b/static/description/main_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..59121711f90a65dd669fb5938f34625e57299038 GIT binary patch literal 145341 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

Al`}DAt%45X2g8_9f>cydC0wu5X9KkNbQpo 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 literal 0 HcmV?d00001 diff --git a/static/src/js/fullcalendar.js b/static/src/js/fullcalendar.js new file mode 100644 index 0000000..f574be7 --- /dev/null +++ b/static/src/js/fullcalendar.js @@ -0,0 +1,6984 @@ +/*! + * FullCalendar v1.6.4 + * Docs & License: http://arshaw.com/fullcalendar/ + * (c) 2013 Adam Shaw + */ + +/* + * Use fullcalendar.css for basic styling. + * For event drag & drop, requires jQuery UI draggable. + * For event resizing, requires jQuery UI resizable. + */ + +(function($, undefined) { + + +;; + +var defaults = { + + // display + defaultView: 'month', + aspectRatio: 1.35, + header: { + left: 'title', + center: '', + right: 'today prev,next' + }, + weekends: true, + weekNumbers: false, + weekNumberCalculation: 'iso', + weekNumberTitle: 'W', + + // editing + //editable: false, + //disableDragging: false, + //disableResizing: false, + + allDayDefault: true, + ignoreTimezone: true, + + // event ajax + lazyFetching: true, + startParam: 'start', + endParam: 'end', + + // time formats + titleFormat: { + month: 'MMMM yyyy', + week: "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", + day: 'dddd, MMM d, yyyy' + }, + columnFormat: { + month: 'ddd', + week: 'ddd M/d', + day: 'dddd M/d' + }, + timeFormat: { // for event elements + '': 'h(:mm)t' // default + }, + + // locale + isRTL: false, + firstDay: 0, + monthNames: ['January','February','March','April','May','June','July','August','September','October','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'], + dayNames: ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'], + dayNamesShort: ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'], + buttonText: { + prev: "", + next: "", + prevYear: "«", + nextYear: "»", + today: 'today', + month: 'month', + week: 'week', + day: 'day' + }, + + // jquery-ui theming + theme: false, + buttonIcons: { + prev: 'circle-triangle-w', + next: 'circle-triangle-e' + }, + + //selectable: false, + unselectAuto: true, + + dropAccept: '*', + + handleWindowResize: true + +}; + +// right-to-left defaults +var rtlDefaults = { + header: { + left: 'next,prev today', + center: '', + right: 'title' + }, + buttonText: { + prev: "", + next: "", + prevYear: "»", + nextYear: "«" + }, + buttonIcons: { + prev: 'circle-triangle-e', + next: 'circle-triangle-w' + } +}; + + + +;; + +var fc = $.fullCalendar = { version: "1.6.4" }; +var fcViews = fc.views = {}; + + +$.fn.fullCalendar = function(options) { + + + // method calling + if (typeof options == 'string') { + var args = Array.prototype.slice.call(arguments, 1); + var res; + this.each(function() { + var calendar = $.data(this, 'fullCalendar'); + if (calendar && $.isFunction(calendar[options])) { + var r = calendar[options].apply(calendar, args); + if (res === undefined) { + res = r; + } + if (options == 'destroy') { + $.removeData(this, 'fullCalendar'); + } + } + }); + if (res !== undefined) { + return res; + } + return this; + } + + options = options || {}; + + // would like to have this logic in EventManager, but needs to happen before options are recursively extended + var eventSources = options.eventSources || []; + delete options.eventSources; + if (options.events) { + eventSources.push(options.events); + delete options.events; + } + + + options = $.extend(true, {}, + defaults, + (options.isRTL || options.isRTL===undefined && defaults.isRTL) ? rtlDefaults : {}, + options + ); + + + this.each(function(i, _element) { + var element = $(_element); + var calendar = new Calendar(element, options, eventSources); + element.data('fullCalendar', calendar); // TODO: look into memory leak implications + calendar.render(); + }); + + + return this; + +}; + + +// function for adding/overriding defaults +function setDefaults(d) { + $.extend(true, defaults, d); +} + + + +;; + + +function Calendar(element, options, eventSources) { + var t = this; + + + // exports + t.options = options; + t.render = render; + t.destroy = destroy; + t.refetchEvents = refetchEvents; + t.reportEvents = reportEvents; + t.reportEventChange = reportEventChange; + t.rerenderEvents = rerenderEvents; + t.fetchAndRenderEvents = fetchAndRenderEvents; + t.changeView = changeView; + t.select = select; + t.unselect = unselect; + t.prev = prev; + t.next = next; + t.prevYear = prevYear; + t.nextYear = nextYear; + t.today = today; + t.gotoDate = gotoDate; + t.incrementDate = incrementDate; + t.formatDate = function(format, date) { return formatDate(format, date, options) }; + t.formatDates = function(format, date1, date2) { return formatDates(format, date1, date2, options) }; + t.getDate = getDate; + t.getView = getView; + t.option = option; + t.trigger = trigger; + + + // imports + EventManager.call(t, options, eventSources); + var isFetchNeeded = t.isFetchNeeded; + var fetchEvents = t.fetchEvents; + + + // locals + var _element = element[0]; + var header; + var headerElement; + var content; + var tm; // for making theme classes + var currentView; + var elementOuterWidth; + var suggestedViewHeight; + var resizeUID = 0; + var ignoreWindowResize = 0; + var date = new Date(); + var events = []; + var _dragElement; + + + + /* Main Rendering + -----------------------------------------------------------------------------*/ + + + setYMD(date, options.year, options.month, options.date); + + + function render(inc) { + if (!content) { + initialRender(); + } + else if (elementVisible()) { + // mainly for the public API + calcSize(); + _renderView(inc); + } + } + + + function initialRender() { + tm = options.theme ? 'ui' : 'fc'; + element.addClass('fc'); + if (options.isRTL) { + element.addClass('fc-rtl'); + } + else { + element.addClass('fc-ltr'); + } + if (options.theme) { + element.addClass('ui-widget'); + } + + content = $("

") + .prependTo(element); + + header = new Header(t, options); + headerElement = header.render(); + if (headerElement) { + element.prepend(headerElement); + } + + changeView(options.defaultView); + + if (options.handleWindowResize) { + $(window).resize(windowResize); + } + + // needed for IE in a 0x0 iframe, b/c when it is resized, never triggers a windowResize + if (!bodyVisible()) { + lateRender(); + } + } + + + // called when we know the calendar couldn't be rendered when it was initialized, + // but we think it's ready now + function lateRender() { + setTimeout(function() { // IE7 needs this so dimensions are calculated correctly + if (!currentView.start && bodyVisible()) { // !currentView.start makes sure this never happens more than once + renderView(); + } + },0); + } + + + function destroy() { + + if (currentView) { + trigger('viewDestroy', currentView, currentView, currentView.element); + currentView.triggerEventDestroy(); + } + + $(window).unbind('resize', windowResize); + + header.destroy(); + content.remove(); + element.removeClass('fc fc-rtl ui-widget'); + } + + + function elementVisible() { + return element.is(':visible'); + } + + + function bodyVisible() { + return $('body').is(':visible'); + } + + + + /* View Rendering + -----------------------------------------------------------------------------*/ + + + function changeView(newViewName) { + if (!currentView || newViewName != currentView.name) { + _changeView(newViewName); + } + } + + + function _changeView(newViewName) { + ignoreWindowResize++; + + if (currentView) { + trigger('viewDestroy', currentView, currentView, currentView.element); + unselect(); + currentView.triggerEventDestroy(); // trigger 'eventDestroy' for each event + freezeContentHeight(); + currentView.element.remove(); + header.deactivateButton(currentView.name); + } + + header.activateButton(newViewName); + + currentView = new fcViews[newViewName]( + $("
") + .appendTo(content), + t // the calendar object + ); + + renderView(); + unfreezeContentHeight(); + + ignoreWindowResize--; + } + + + function renderView(inc) { + if ( + !currentView.start || // never rendered before + inc || date < currentView.start || date >= currentView.end // or new date range + ) { + if (elementVisible()) { + _renderView(inc); + } + } + } + + + function _renderView(inc) { // assumes elementVisible + ignoreWindowResize++; + + if (currentView.start) { // already been rendered? + trigger('viewDestroy', currentView, currentView, currentView.element); + unselect(); + clearEvents(); + } + + freezeContentHeight(); + currentView.render(date, inc || 0); // the view's render method ONLY renders the skeleton, nothing else + setSize(); + unfreezeContentHeight(); + (currentView.afterRender || noop)(); + + updateTitle(); + updateTodayButton(); + + trigger('viewRender', currentView, currentView, currentView.element); + currentView.trigger('viewDisplay', _element); // deprecated + + ignoreWindowResize--; + + getAndRenderEvents(); + } + + + + /* Resizing + -----------------------------------------------------------------------------*/ + + + function updateSize() { + if (elementVisible()) { + unselect(); + clearEvents(); + calcSize(); + setSize(); + renderEvents(); + } + } + + + function calcSize() { // assumes elementVisible + if (options.contentHeight) { + suggestedViewHeight = options.contentHeight; + } + else if (options.height) { + suggestedViewHeight = options.height - (headerElement ? headerElement.height() : 0) - vsides(content); + } + else { + suggestedViewHeight = Math.round(content.width() / Math.max(options.aspectRatio, .5)); + } + } + + + function setSize() { // assumes elementVisible + + if (suggestedViewHeight === undefined) { + calcSize(); // for first time + // NOTE: we don't want to recalculate on every renderView because + // it could result in oscillating heights due to scrollbars. + } + + ignoreWindowResize++; + currentView.setHeight(suggestedViewHeight); + currentView.setWidth(content.width()); + ignoreWindowResize--; + + elementOuterWidth = element.outerWidth(); + } + + + function windowResize() { + if (!ignoreWindowResize) { + if (currentView.start) { // view has already been rendered + var uid = ++resizeUID; + setTimeout(function() { // add a delay + if (uid == resizeUID && !ignoreWindowResize && elementVisible()) { + if (elementOuterWidth != (elementOuterWidth = element.outerWidth())) { + ignoreWindowResize++; // in case the windowResize callback changes the height + updateSize(); + currentView.trigger('windowResize', _element); + ignoreWindowResize--; + } + } + }, 200); + }else{ + // calendar must have been initialized in a 0x0 iframe that has just been resized + lateRender(); + } + } + } + + + + /* Event Fetching/Rendering + -----------------------------------------------------------------------------*/ + // TODO: going forward, most of this stuff should be directly handled by the view + + + function refetchEvents() { // can be called as an API method + clearEvents(); + fetchAndRenderEvents(); + } + + + function rerenderEvents(modifiedEventID) { // can be called as an API method + clearEvents(); + renderEvents(modifiedEventID); + } + + + function renderEvents(modifiedEventID) { // TODO: remove modifiedEventID hack + if (elementVisible()) { + currentView.setEventData(events); // for View.js, TODO: unify with renderEvents + currentView.renderEvents(events, modifiedEventID); // actually render the DOM elements + currentView.trigger('eventAfterAllRender'); + } + } + + + function clearEvents() { + currentView.triggerEventDestroy(); // trigger 'eventDestroy' for each event + currentView.clearEvents(); // actually remove the DOM elements + currentView.clearEventData(); // for View.js, TODO: unify with clearEvents + } + + + function getAndRenderEvents() { + if (!options.lazyFetching || isFetchNeeded(currentView.visStart, currentView.visEnd)) { + fetchAndRenderEvents(); + } + else { + renderEvents(); + } + } + + + function fetchAndRenderEvents() { + fetchEvents(currentView.visStart, currentView.visEnd); + // ... will call reportEvents + // ... which will call renderEvents + } + + + // called when event data arrives + function reportEvents(_events) { + events = _events; + renderEvents(); + } + + + // called when a single event's data has been changed + function reportEventChange(eventID) { + rerenderEvents(eventID); + } + + + + /* Header Updating + -----------------------------------------------------------------------------*/ + + + function updateTitle() { + header.updateTitle(currentView.title); + } + + + function updateTodayButton() { + var today = new Date(); + if (today >= currentView.start && today < currentView.end) { + header.disableButton('today'); + } + else { + header.enableButton('today'); + } + } + + + + /* Selection + -----------------------------------------------------------------------------*/ + + + function select(start, end, allDay) { + currentView.select(start, end, allDay===undefined ? true : allDay); + } + + + function unselect() { // safe to be called before renderView + if (currentView) { + currentView.unselect(); + } + } + + + + /* Date + -----------------------------------------------------------------------------*/ + + + function prev() { + renderView(-1); + } + + + function next() { + renderView(1); + } + + + function prevYear() { + addYears(date, -1); + renderView(); + } + + + function nextYear() { + addYears(date, 1); + renderView(); + } + + + function today() { + date = new Date(); + renderView(); + } + + + function gotoDate(year, month, dateOfMonth) { + if (year instanceof Date) { + date = cloneDate(year); // provided 1 argument, a Date + }else{ + setYMD(date, year, month, dateOfMonth); + } + renderView(); + } + + + function incrementDate(years, months, days) { + if (years !== undefined) { + addYears(date, years); + } + if (months !== undefined) { + addMonths(date, months); + } + if (days !== undefined) { + addDays(date, days); + } + renderView(); + } + + + function getDate() { + return cloneDate(date); + } + + + + /* Height "Freezing" + -----------------------------------------------------------------------------*/ + + + function freezeContentHeight() { + content.css({ + width: '100%', + height: content.height(), + overflow: 'hidden' + }); + } + + + function unfreezeContentHeight() { + content.css({ + width: '', + height: '', + overflow: '' + }); + } + + + + /* Misc + -----------------------------------------------------------------------------*/ + + + function getView() { + return currentView; + } + + + function option(name, value) { + if (value === undefined) { + return options[name]; + } + if (name == 'height' || name == 'contentHeight' || name == 'aspectRatio') { + options[name] = value; + updateSize(); + } + } + + + function trigger(name, thisObj) { + if (options[name]) { + return options[name].apply( + thisObj || _element, + Array.prototype.slice.call(arguments, 2) + ); + } + } + + + + /* External Dragging + ------------------------------------------------------------------------*/ + + if (options.droppable) { + $(document) + .bind('dragstart', function(ev, ui) { + var _e = ev.target; + var e = $(_e); + if (!e.parents('.fc').length) { // not already inside a calendar + var accept = options.dropAccept; + if ($.isFunction(accept) ? accept.call(_e, e) : e.is(accept)) { + _dragElement = _e; + currentView.dragStart(_dragElement, ev, ui); + } + } + }) + .bind('dragstop', function(ev, ui) { + if (_dragElement) { + currentView.dragStop(_dragElement, ev, ui); + _dragElement = null; + } + }); + } + + +} + +;; + +function Header(calendar, options) { + var t = this; + + + // exports + t.render = render; + t.destroy = destroy; + t.updateTitle = updateTitle; + t.activateButton = activateButton; + t.deactivateButton = deactivateButton; + t.disableButton = disableButton; + t.enableButton = enableButton; + + + // locals + var element = $([]); + var tm; + + + + function render() { + tm = options.theme ? 'ui' : 'fc'; + var sections = options.header; + if (sections) { + element = $("") + .append( + $("") + .append(renderSection('left')) + .append(renderSection('center')) + .append(renderSection('right')) + ); + return element; + } + } + + + function destroy() { + element.remove(); + } + + + function renderSection(position) { + var e = $(""; + + if (showWeekNumbers) { + html += + ""; + } + + for (col=0; col" + + htmlEscape(formatDate(date, colFormat)) + + ""; + } + + html += ""; + + return html; + } + + + function buildBodyHTML() { + var contentClass = tm + "-widget-content"; + var html = ''; + var row; + var col; + var date; + + html += ""; + + for (row=0; row" + + "
" + + htmlEscape(formatDate(date, weekNumberFormat)) + + "
" + + ""; + } + + for (col=0; col" + + "
"; + + if (showNumbers) { + html += "
" + date.getDate() + "
"; + } + + html += + "
" + + "
 
" + + "
" + + "
" + + ""; + + return html; + } + + + + /* Dimensions + -----------------------------------------------------------*/ + + + function setHeight(height) { + viewHeight = height; + + var bodyHeight = viewHeight - head.height(); + var rowHeight; + var rowHeightLast; + var cell; + + if (opt('weekMode') == 'variable') { + rowHeight = rowHeightLast = Math.floor(bodyHeight / (rowCnt==1 ? 2 : 6)); + }else{ + rowHeight = Math.floor(bodyHeight / rowCnt); + rowHeightLast = bodyHeight - rowHeight * (rowCnt-1); + } + + bodyFirstCells.each(function(i, _cell) { + if (i < rowCnt) { + cell = $(_cell); + cell.find('> div').css( + 'min-height', + (i==rowCnt-1 ? rowHeightLast : rowHeight) - vsides(cell) + ); + } + }); + + } + + + function setWidth(width) { + viewWidth = width; + colPositions.clear(); + colContentPositions.clear(); + + weekNumberWidth = 0; + if (showWeekNumbers) { + weekNumberWidth = head.find('th.fc-week-number').outerWidth(); + } + + colWidth = Math.floor((viewWidth - weekNumberWidth) / colCnt); + setOuterWidth(headCells.slice(0, -1), colWidth); + } + + + + /* Day clicking and binding + -----------------------------------------------------------*/ + + + function dayBind(days) { + days.click(dayClick) + .mousedown(daySelectionMousedown); + } + + + function dayClick(ev) { + if (!opt('selectable')) { // if selectable, SelectionManager will worry about dayClick + var date = parseISO8601($(this).data('date')); + trigger('dayClick', this, date, true, ev); + } + } + + + + /* Semi-transparent Overlay Helpers + ------------------------------------------------------*/ + // TODO: should be consolidated with AgendaView's methods + + + function renderDayOverlay(overlayStart, overlayEnd, refreshCoordinateGrid) { // overlayEnd is exclusive + + if (refreshCoordinateGrid) { + coordinateGrid.build(); + } + + var segments = rangeToSegments(overlayStart, overlayEnd); + + for (var i=0; i coordinateGrid"); + var e, n, p; + headCells.each(function(i, _e) { + e = $(_e); + n = e.offset().left; + if (i) { + p[1] = n; + } + p = [n]; + cols[i] = p; + }); + p[1] = n + e.outerWidth(); + bodyRows.each(function(i, _e) { + if (i < rowCnt) { + e = $(_e); + n = e.offset().top; + if (i) { + p[1] = n; + } + p = [n]; + rows[i] = p; + } + }); + p[1] = n + e.outerHeight(); + }); + + + hoverListener = new HoverListener(coordinateGrid); + + colPositions = new HorizontalPositionCache(function(col) { + return firstRowCellInners.eq(col); + }); + + colContentPositions = new HorizontalPositionCache(function(col) { + return firstRowCellContentInners.eq(col); + }); + + + function colLeft(col) { + return colPositions.left(col); + } + + + function colRight(col) { + return colPositions.right(col); + } + + + function colContentLeft(col) { + return colContentPositions.left(col); + } + + + function colContentRight(col) { + return colContentPositions.right(col); + } + + + function allDayRow(i) { + return bodyRows.eq(i); + } + +} + +;; + + +function BasicEventRenderer() { + var t = this; + + + // exports + t.renderEvents = renderEvents; + t.clearEvents = clearEvents; + + + // imports + DayEventRenderer.call(t); + + + function renderEvents(events, modifiedEventId) { + t.renderDayEvents(events, modifiedEventId); + } + + + function clearEvents() { + t.getDaySegmentContainer().empty(); + } + + + // TODO: have this class (and AgendaEventRenderer) be responsible for creating the event container div + +} + +;; + +fcViews.agendaWeek = AgendaWeekView; + +function AgendaWeekView(element, calendar) { + var t = this; + + + // exports + t.render = render; + + + // imports + AgendaView.call(t, element, calendar, 'agendaWeek'); + var opt = t.opt; + var renderAgenda = t.renderAgenda; + var skipHiddenDays = t.skipHiddenDays; + var getCellsPerWeek = t.getCellsPerWeek; + var formatDates = calendar.formatDates; + + + function render(date, delta) { + + if (delta) { + addDays(date, delta * 7); + } + + var start = addDays(cloneDate(date), -((date.getDay() - opt('firstDay') + 7) % 7)); + var end = addDays(cloneDate(start), 7); + + var visStart = cloneDate(start); + skipHiddenDays(visStart); + + var visEnd = cloneDate(end); + skipHiddenDays(visEnd, -1, true); + + var colCnt = getCellsPerWeek(); + + t.title = formatDates( + visStart, + addDays(cloneDate(visEnd), -1), + opt('titleFormat') + ); + + t.start = start; + t.end = end; + t.visStart = visStart; + t.visEnd = visEnd; + + renderAgenda(colCnt); + } + +} + +;; + +fcViews.agendaDay = AgendaDayView; + + +function AgendaDayView(element, calendar) { + var t = this; + + + // exports + t.render = render; + + + // imports + AgendaView.call(t, element, calendar, 'agendaDay'); + var opt = t.opt; + var renderAgenda = t.renderAgenda; + var skipHiddenDays = t.skipHiddenDays; + var formatDate = calendar.formatDate; + + + function render(date, delta) { + + if (delta) { + addDays(date, delta); + } + skipHiddenDays(date, delta < 0 ? -1 : 1); + + var start = cloneDate(date, true); + var end = addDays(cloneDate(start), 1); + + t.title = formatDate(date, opt('titleFormat')); + + t.start = t.visStart = start; + t.end = t.visEnd = end; + + renderAgenda(1); + } + + +} + +;; + +setDefaults({ + allDaySlot: true, + allDayText: 'all-day', + firstHour: 6, + slotMinutes: 30, + defaultEventMinutes: 120, + axisFormat: 'h(:mm)tt', + timeFormat: { + agenda: 'h:mm{ - h:mm}' + }, + dragOpacity: { + agenda: .5 + }, + minTime: 0, + maxTime: 24, + slotEventOverlap: true +}); + + +// TODO: make it work in quirks mode (event corners, all-day height) +// TODO: test liquid width, especially in IE6 + + +function AgendaView(element, calendar, viewName) { + var t = this; + + + // exports + t.renderAgenda = renderAgenda; + t.setWidth = setWidth; + t.setHeight = setHeight; + t.afterRender = afterRender; + t.defaultEventEnd = defaultEventEnd; + t.timePosition = timePosition; + t.getIsCellAllDay = getIsCellAllDay; + t.allDayRow = getAllDayRow; + t.getCoordinateGrid = function() { return coordinateGrid }; // specifically for AgendaEventRenderer + t.getHoverListener = function() { return hoverListener }; + t.colLeft = colLeft; + t.colRight = colRight; + t.colContentLeft = colContentLeft; + t.colContentRight = colContentRight; + t.getDaySegmentContainer = function() { return daySegmentContainer }; + t.getSlotSegmentContainer = function() { return slotSegmentContainer }; + t.getMinMinute = function() { return minMinute }; + t.getMaxMinute = function() { return maxMinute }; + t.getSlotContainer = function() { return slotContainer }; + t.getRowCnt = function() { return 1 }; + t.getColCnt = function() { return colCnt }; + t.getColWidth = function() { return colWidth }; + t.getSnapHeight = function() { return snapHeight }; + t.getSnapMinutes = function() { return snapMinutes }; + t.defaultSelectionEnd = defaultSelectionEnd; + t.renderDayOverlay = renderDayOverlay; + t.renderSelection = renderSelection; + t.clearSelection = clearSelection; + t.reportDayClick = reportDayClick; // selection mousedown hack + t.dragStart = dragStart; + t.dragStop = dragStop; + + + // imports + View.call(t, element, calendar, viewName); + OverlayManager.call(t); + SelectionManager.call(t); + AgendaEventRenderer.call(t); + var opt = t.opt; + var trigger = t.trigger; + var renderOverlay = t.renderOverlay; + var clearOverlays = t.clearOverlays; + var reportSelection = t.reportSelection; + var unselect = t.unselect; + var daySelectionMousedown = t.daySelectionMousedown; + var slotSegHtml = t.slotSegHtml; + var cellToDate = t.cellToDate; + var dateToCell = t.dateToCell; + var rangeToSegments = t.rangeToSegments; + var formatDate = calendar.formatDate; + + + // locals + + var dayTable; + var dayHead; + var dayHeadCells; + var dayBody; + var dayBodyCells; + var dayBodyCellInners; + var dayBodyCellContentInners; + var dayBodyFirstCell; + var dayBodyFirstCellStretcher; + var slotLayer; + var daySegmentContainer; + var allDayTable; + var allDayRow; + var slotScroller; + var slotContainer; + var slotSegmentContainer; + var slotTable; + var selectionHelper; + + var viewWidth; + var viewHeight; + var axisWidth; + var colWidth; + var gutterWidth; + var slotHeight; // TODO: what if slotHeight changes? (see issue 650) + + var snapMinutes; + var snapRatio; // ratio of number of "selection" slots to normal slots. (ex: 1, 2, 4) + var snapHeight; // holds the pixel hight of a "selection" slot + + var colCnt; + var slotCnt; + var coordinateGrid; + var hoverListener; + var colPositions; + var colContentPositions; + var slotTopCache = {}; + + var tm; + var rtl; + var minMinute, maxMinute; + var colFormat; + var showWeekNumbers; + var weekNumberTitle; + var weekNumberFormat; + + + + /* Rendering + -----------------------------------------------------------------------------*/ + + + disableTextSelection(element.addClass('fc-agenda')); + + + function renderAgenda(c) { + colCnt = c; + updateOptions(); + + if (!dayTable) { // first time rendering? + buildSkeleton(); // builds day table, slot area, events containers + } + else { + buildDayTable(); // rebuilds day table + } + } + + + function updateOptions() { + + tm = opt('theme') ? 'ui' : 'fc'; + rtl = opt('isRTL') + minMinute = parseTime(opt('minTime')); + maxMinute = parseTime(opt('maxTime')); + colFormat = opt('columnFormat'); + + // week # options. (TODO: bad, logic also in other views) + showWeekNumbers = opt('weekNumbers'); + weekNumberTitle = opt('weekNumberTitle'); + if (opt('weekNumberCalculation') != 'iso') { + weekNumberFormat = "w"; + } + else { + weekNumberFormat = "W"; + } + + snapMinutes = opt('snapMinutes') || opt('slotMinutes'); + } + + + + /* Build DOM + -----------------------------------------------------------------------*/ + + + function buildSkeleton() { + var headerClass = tm + "-widget-header"; + var contentClass = tm + "-widget-content"; + var s; + var d; + var i; + var maxd; + var minutes; + var slotNormal = opt('slotMinutes') % 15 == 0; + + buildDayTable(); + + slotLayer = + $("
") + .appendTo(element); + + if (opt('allDaySlot')) { + + daySegmentContainer = + $("
") + .appendTo(slotLayer); + + s = + "
"); + var buttonStr = options.header[position]; + if (buttonStr) { + $.each(buttonStr.split(' '), function(i) { + if (i > 0) { + e.append(""); + } + var prevButton; + $.each(this.split(','), function(j, buttonName) { + if (buttonName == 'title') { + e.append("

 

"); + if (prevButton) { + prevButton.addClass(tm + '-corner-right'); + } + prevButton = null; + }else{ + var buttonClick; + if (calendar[buttonName]) { + buttonClick = calendar[buttonName]; // calendar method + } + else if (fcViews[buttonName]) { + buttonClick = function() { + button.removeClass(tm + '-state-hover'); // forget why + calendar.changeView(buttonName); + }; + } + if (buttonClick) { + var icon = options.theme ? smartProperty(options.buttonIcons, buttonName) : null; // why are we using smartProperty here? + var text = smartProperty(options.buttonText, buttonName); // why are we using smartProperty here? + var button = $( + "" + + (icon ? + "" + + "" + + "" : + text + ) + + "" + ) + .click(function() { + if (!button.hasClass(tm + '-state-disabled')) { + buttonClick(); + } + }) + .mousedown(function() { + button + .not('.' + tm + '-state-active') + .not('.' + tm + '-state-disabled') + .addClass(tm + '-state-down'); + }) + .mouseup(function() { + button.removeClass(tm + '-state-down'); + }) + .hover( + function() { + button + .not('.' + tm + '-state-active') + .not('.' + tm + '-state-disabled') + .addClass(tm + '-state-hover'); + }, + function() { + button + .removeClass(tm + '-state-hover') + .removeClass(tm + '-state-down'); + } + ) + .appendTo(e); + disableTextSelection(button); + if (!prevButton) { + button.addClass(tm + '-corner-left'); + } + prevButton = button; + } + } + }); + if (prevButton) { + prevButton.addClass(tm + '-corner-right'); + } + }); + } + return e; + } + + + function updateTitle(html) { + element.find('h2') + .html(html); + } + + + function activateButton(buttonName) { + element.find('span.fc-button-' + buttonName) + .addClass(tm + '-state-active'); + } + + + function deactivateButton(buttonName) { + element.find('span.fc-button-' + buttonName) + .removeClass(tm + '-state-active'); + } + + + function disableButton(buttonName) { + element.find('span.fc-button-' + buttonName) + .addClass(tm + '-state-disabled'); + } + + + function enableButton(buttonName) { + element.find('span.fc-button-' + buttonName) + .removeClass(tm + '-state-disabled'); + } + + +} + +;; + +fc.sourceNormalizers = []; +fc.sourceFetchers = []; + +var ajaxDefaults = { + dataType: 'json', + cache: false +}; + +var eventGUID = 1; + + +function EventManager(options, _sources) { + var t = this; + + + // exports + t.isFetchNeeded = isFetchNeeded; + t.fetchEvents = fetchEvents; + t.addEventSource = addEventSource; + t.removeEventSource = removeEventSource; + t.updateEvent = updateEvent; + t.renderEvent = renderEvent; + t.removeEvents = removeEvents; + t.clientEvents = clientEvents; + t.normalizeEvent = normalizeEvent; + + + // imports + var trigger = t.trigger; + var getView = t.getView; + var reportEvents = t.reportEvents; + + + // locals + var stickySource = { events: [] }; + var sources = [ stickySource ]; + var rangeStart, rangeEnd; + var currentFetchID = 0; + var pendingSourceCnt = 0; + var loadingLevel = 0; + var cache = []; + + + for (var i=0; i<_sources.length; i++) { + _addEventSource(_sources[i]); + } + + + + /* Fetching + -----------------------------------------------------------------------------*/ + + + function isFetchNeeded(start, end) { + return !rangeStart || start < rangeStart || end > rangeEnd; + } + + + function fetchEvents(start, end) { + rangeStart = start; + rangeEnd = end; + cache = []; + var fetchID = ++currentFetchID; + var len = sources.length; + pendingSourceCnt = len; + for (var i=0; i)), return null instead + return null; +} + + +function parseISO8601(s, ignoreTimezone) { // ignoreTimezone defaults to false + // derived from http://delete.me.uk/2005/03/iso8601.html + // TODO: for a know glitch/feature, read tests/issue_206_parseDate_dst.html + var m = s.match(/^([0-9]{4})(-([0-9]{2})(-([0-9]{2})([T ]([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?(Z|(([-+])([0-9]{2})(:?([0-9]{2}))?))?)?)?)?$/); + if (!m) { + return null; + } + var date = new Date(m[1], 0, 1); + if (ignoreTimezone || !m[13]) { + var check = new Date(m[1], 0, 1, 9, 0); + if (m[3]) { + date.setMonth(m[3] - 1); + check.setMonth(m[3] - 1); + } + if (m[5]) { + date.setDate(m[5]); + check.setDate(m[5]); + } + fixDate(date, check); + if (m[7]) { + date.setHours(m[7]); + } + if (m[8]) { + date.setMinutes(m[8]); + } + if (m[10]) { + date.setSeconds(m[10]); + } + if (m[12]) { + date.setMilliseconds(Number("0." + m[12]) * 1000); + } + fixDate(date, check); + }else{ + date.setUTCFullYear( + m[1], + m[3] ? m[3] - 1 : 0, + m[5] || 1 + ); + date.setUTCHours( + m[7] || 0, + m[8] || 0, + m[10] || 0, + m[12] ? Number("0." + m[12]) * 1000 : 0 + ); + if (m[14]) { + var offset = Number(m[16]) * 60 + (m[18] ? Number(m[18]) : 0); + offset *= m[15] == '-' ? 1 : -1; + date = new Date(+date + (offset * 60 * 1000)); + } + } + return date; +} + + +function parseTime(s) { // returns minutes since start of day + if (typeof s == 'number') { // an hour + return s * 60; + } + if (typeof s == 'object') { // a Date object + return s.getHours() * 60 + s.getMinutes(); + } + var m = s.match(/(\d+)(?::(\d+))?\s*(\w+)?/); + if (m) { + var h = parseInt(m[1], 10); + if (m[3]) { + h %= 12; + if (m[3].toLowerCase().charAt(0) == 'p') { + h += 12; + } + } + return h * 60 + (m[2] ? parseInt(m[2], 10) : 0); + } +} + + + +/* Date Formatting +-----------------------------------------------------------------------------*/ +// TODO: use same function formatDate(date, [date2], format, [options]) + + +function formatDate(date, format, options) { + return formatDates(date, null, format, options); +} + + +function formatDates(date1, date2, format, options) { + options = options || defaults; + var date = date1, + otherDate = date2, + i, len = format.length, c, + i2, formatter, + res = ''; + for (i=0; ii; i2--) { + if (formatter = dateFormatters[format.substring(i, i2)]) { + if (date) { + res += formatter(date, options); + } + i = i2 - 1; + break; + } + } + if (i2 == i) { + if (date) { + res += c; + } + } + } + } + return res; +}; + + +var dateFormatters = { + s : function(d) { return d.getSeconds() }, + ss : function(d) { return zeroPad(d.getSeconds()) }, + m : function(d) { return d.getMinutes() }, + mm : function(d) { return zeroPad(d.getMinutes()) }, + h : function(d) { return d.getHours() % 12 || 12 }, + hh : function(d) { return zeroPad(d.getHours() % 12 || 12) }, + H : function(d) { return d.getHours() }, + HH : function(d) { return zeroPad(d.getHours()) }, + d : function(d) { return d.getDate() }, + dd : function(d) { return zeroPad(d.getDate()) }, + ddd : function(d,o) { return o.dayNamesShort[d.getDay()] }, + dddd: function(d,o) { return o.dayNames[d.getDay()] }, + M : function(d) { return d.getMonth() + 1 }, + MM : function(d) { return zeroPad(d.getMonth() + 1) }, + MMM : function(d,o) { return o.monthNamesShort[d.getMonth()] }, + MMMM: function(d,o) { return o.monthNames[d.getMonth()] }, + yy : function(d) { return (d.getFullYear()+'').substring(2) }, + yyyy: function(d) { return d.getFullYear() }, + t : function(d) { return d.getHours() < 12 ? 'a' : 'p' }, + tt : function(d) { return d.getHours() < 12 ? 'am' : 'pm' }, + T : function(d) { return d.getHours() < 12 ? 'A' : 'P' }, + TT : function(d) { return d.getHours() < 12 ? 'AM' : 'PM' }, + u : function(d) { return formatDate(d, "yyyy-MM-dd'T'HH:mm:ss'Z'") }, + S : function(d) { + var date = d.getDate(); + if (date > 10 && date < 20) { + return 'th'; + } + return ['st', 'nd', 'rd'][date%10-1] || 'th'; + }, + w : function(d, o) { // local + return o.weekNumberCalculation(d); + }, + W : function(d) { // ISO + return iso8601Week(d); + } +}; +fc.dateFormatters = dateFormatters; + + +/* thanks jQuery UI (https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.datepicker.js) + * + * Set as calculateWeek to determine the week of the year based on the ISO 8601 definition. + * `date` - the date to get the week for + * `number` - the number of the week within the year that contains this date + */ +function iso8601Week(date) { + var time; + var checkDate = new Date(date.getTime()); + + // Find Thursday of this week starting on Monday + checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); + + time = checkDate.getTime(); + checkDate.setMonth(0); // Compare with Jan 1 + checkDate.setDate(1); + return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; +} + + +;; + +fc.applyAll = applyAll; + + +/* Event Date Math +-----------------------------------------------------------------------------*/ + + +function exclEndDay(event) { + if (event.end) { + return _exclEndDay(event.end, event.allDay); + }else{ + return addDays(cloneDate(event.start), 1); + } +} + + +function _exclEndDay(end, allDay) { + end = cloneDate(end); + return allDay || end.getHours() || end.getMinutes() ? addDays(end, 1) : clearTime(end); + // why don't we check for seconds/ms too? +} + + + +/* Event Element Binding +-----------------------------------------------------------------------------*/ + + +function lazySegBind(container, segs, bindHandlers) { + container.unbind('mouseover').mouseover(function(ev) { + var parent=ev.target, e, + i, seg; + while (parent != this) { + e = parent; + parent = parent.parentNode; + } + if ((i = e._fci) !== undefined) { + e._fci = undefined; + seg = segs[i]; + bindHandlers(seg.event, seg.element, seg); + $(ev.target).trigger(ev); + } + ev.stopPropagation(); + }); +} + + + +/* Element Dimensions +-----------------------------------------------------------------------------*/ + + +function setOuterWidth(element, width, includeMargins) { + for (var i=0, e; i=0; i--) { + res = obj[parts[i].toLowerCase()]; + if (res !== undefined) { + return res; + } + } + return obj['']; +} + + +function htmlEscape(s) { + return s.replace(/&/g, '&') + .replace(//g, '>') + .replace(/'/g, ''') + .replace(/"/g, '"') + .replace(/\n/g, '
'); +} + + +function disableTextSelection(element) { + element + .attr('unselectable', 'on') + .css('MozUserSelect', 'none') + .bind('selectstart.ui', function() { return false; }); +} + + +/* +function enableTextSelection(element) { + element + .attr('unselectable', 'off') + .css('MozUserSelect', '') + .unbind('selectstart.ui'); +} +*/ + + +function markFirstLast(e) { + e.children() + .removeClass('fc-first fc-last') + .filter(':first-child') + .addClass('fc-first') + .end() + .filter(':last-child') + .addClass('fc-last'); +} + + +function setDayID(cell, date) { + cell.each(function(i, _cell) { + _cell.className = _cell.className.replace(/^fc-\w*/, 'fc-' + dayIDs[date.getDay()]); + // TODO: make a way that doesn't rely on order of classes + }); +} + + +function getSkinCss(event, opt) { + var source = event.source || {}; + var eventColor = event.color; + var sourceColor = source.color; + var optionColor = opt('eventColor'); + var backgroundColor = + event.backgroundColor || + eventColor || + source.backgroundColor || + sourceColor || + opt('eventBackgroundColor') || + optionColor; + var borderColor = + event.borderColor || + eventColor || + source.borderColor || + sourceColor || + opt('eventBorderColor') || + optionColor; + var textColor = + event.textColor || + source.textColor || + opt('eventTextColor'); + var statements = []; + if (backgroundColor) { + statements.push('background-color:' + backgroundColor); + } + if (borderColor) { + statements.push('border-color:' + borderColor); + } + if (textColor) { + statements.push('color:' + textColor); + } + return statements.join(';'); +} + + +function applyAll(functions, thisObj, args) { + if ($.isFunction(functions)) { + functions = [ functions ]; + } + if (functions) { + var i; + var ret; + for (i=0; i getHoverListener'); return hoverListener; }; + t.getCoordinateGrid = function() { console.log('YearView > getCoordinateGrid'); return coordinateGrid; }; + + + //Exports + t.render = render; + t.renderBasic = renderBasic; + t.updateCells = updateCells; + t.updateOptions = updateOptions; + t.buildSkeleton = buildSkeleton; + t.setHeight = setHeight; + t.setWidth = setWidth; + t.dragStart = dragStart; + t.dragStop = dragStop; + t.renderDayOverlay = renderDayOverlay; + t.renderSelection = renderSelection; + t.dayBind = dayBind; + t.clearSelection = clearSelection; + t.daySelectionMousedown = daySelectionMousedown; + t.resetWidth = resetWidth; + t.reportEventChange = calendar.reportEventChange; //FIXME + t.normalizeEvent = calendar.normalizeEvent; //FIXME + + //Imports + OverlayManager.call(t); + YearEventRenderer.call(t); + SelectionManager.call(t); + + var head; + var headCells; + var body; + var bodyRows; + var bodyCells; + var bodyFirstCells; + var bodyCellTopInners; + var coordinateGrid; + var hoverListener; + var daySegmentContainer; + var initialViewWidth; + + var opt = t.opt; + var trigger = t.trigger; + var clearEvents = t.clearEvents; + var renderOverlay = t.renderOverlay; + var clearOverlays = t.clearOverlays; + var buildEventContainer = t.buildEventContainer; + var unselect = t.unselect; + var reportSelection = t.reportSelection; + var fetchAndRenderEvents = calendar.fetchAndRenderEvents; + var formatDate = calendar.formatDate; + + function render(date, delta) { + if (delta) + { + addYears(date, delta); + date.setDate(1); + } + + var start = cloneDate(date, true); + start.setDate(1); + start.setMonth(0); + var end = addYears(cloneDate(start), 1); + var visStart = cloneDate(start); + var visEnd = cloneDate(end); + var firstDay = opt('firstDay'); + var nwe = 0; + + + t.title = formatDate(start, 'yyyy'); + t.start = start; + t.end = end; + t.visStart = visStart; + t.visEnd = visEnd; + + renderBasic( 31, 31, 12, true ); + } + + function renderBasic(maxr, r, c, showNumbers) { + console.log("YearView > renderBasic"); + rowCnt = r; + colCnt = c; + updateOptions(); + + var firstTime = !body; + if ( firstTime ) + buildSkeleton(maxr, showNumbers); + else { + clearEvents(); + } + updateCells(firstTime); + } + + function buildSkeleton(maxRowCnt, showNumbers) { + console.log("YearView > buildSkeleton"); + var s; //Template + var headerClass = tm + "-widget-header"; + var contentClass = tm + "-widget-content"; + var i, j, day_nb; + var table; + day_nb = 0; + s = ""; + for (i = 0; i < colCnt; i++) + s += ""; + s += ""; + + for (i = 0; i < colCnt; i++) + s += ""; + + for (i = 0; i < maxRowCnt; i++) { + s += ""; + + for (j = 0; j < colCnt; j++) { + day_nb++; + s += ""; + } + s += ""; + } + s += "
"; + s += + "
" + + (showNumbers ? "
" : '') + + "
" + + "
 
" + + "
"; + + table = $(s).appendTo(element); + + initialViewWidth = table.width(); + + head = table.find('thead'); + headCells = head.find('th'); + body = table.find('tbody'); + bodyRows = body.find('tr'); + bodyCells = body.find('td'); + bodyFirstCells = bodyCells.filter(':first-child'); + bodyCellTopInners = bodyRows.eq(0).find('div.fc-day-content div'); + + markFirstLast(head.add(head.find('tr'))); + markFirstLast(bodyRows); + bodyRows.eq(0).addClass('fc-first'); + + dayBind(bodyCells); + buildEventContainer(); + } + + function updateCells(firstTime) { + var dowDirty = firstTime || rowCnt == 1; + var month = t.start.getMonth(); + var today = clearTime(new Date()); + var cell; + var date; + var row; + + if (dowDirty) + { + headCells.each(function(i, _cell) + { + cell = $(_cell); + + date = new Date(t.visStart.getFullYear(), i); + + cell.html(formatDate(date, 'MMMM')); + setDayID(cell, date); + }); + } + + bodyCells.each(function(i, _cell) { + cell = $(_cell); + date = indexDate(i); + + if (!date) { + cell.find('div.fc-day-number').text(''); + cell.addClass( 'fc-empty' ); + + } + else { + cell.removeClass('fc-other-month'); + if (+date == +today) { + cell.addClass(tm + '-state-highlight fc-today'); + } else { + cell.removeClass(tm + '-state-highlight fc-today'); + } + + cell.find('div.fc-day-number').text(date.getDate()); + + if (dowDirty) { + setDayID(cell, date); + } + } + }); + + bodyRows.each(function(i, _row) { + row = $(_row); + if (i < rowCnt) { + row.show(); + if (i == rowCnt-1) { + row.addClass('fc-last'); + }else{ + row.removeClass('fc-last'); + } + } else { + row.hide(); + } + }); + + } + + function indexDate(index) { + var current_col = Math.floor( index % colCnt ); + var current_row = Math.floor( index / colCnt ); + var nb_days = daysInMonth( current_col + 1, t.visStart.getFullYear()); + if (current_row >= nb_days) + return false; + else + return new Date(t.visStart.getFullYear(), current_col, current_row + 1); + } + + function _cellDate(row, col) { + return addDays(cloneDate(t.visStart), row * 7 + col * dis + dit); + } + + function daysInMonth(month, year) { + return new Date(year, month, 0).getDate(); + } + + function updateOptions() { + rtl = opt('isRTL'); + if (rtl) { + dis = -1; + dit = colCnt - 1; + }else{ + dis = 1; + dit = 0; + } + firstDay = opt('firstDay'); + nwe = opt('weekends') ? 0 : 1; + tm = opt('theme') ? 'ui' : 'fc'; + colFormat = opt('columnFormat'); + } + + function dayClick(ev) { + console.log("YearView > dayClick"); + if (!opt( 'selectable')) { + var index = parseInt(this.className.match( /fc\-day(\d+)/ )[1]); + var date = indexDate(index); + trigger('dayClick', this, date, true, ev); + } + } + + function dayBind(days) { + console.log("YearView > dayBind"); + days.click(dayClick) + .mousedown(daySelectionMousedown); + } + + function setHeight(height) { + viewHeight = height; + + var bodyHeight = viewHeight - head.height(); + var rowHeight; + var rowHeightLast; + var cell; + + if (opt('weekMode') == 'variable') { + rowHeight = rowHeightLast = Math.floor(bodyHeight / (rowCnt==1 ? 2 : 6)); + } else { + rowHeight = Math.floor(bodyHeight / rowCnt); + rowHeightLast = bodyHeight - rowHeight * (rowCnt-1); + } + + bodyFirstCells.each(function(i, _cell) { + if (i < rowCnt) { + cell = $(_cell); + } + }); + + } + + function setWidth(width) { + viewWidth = width; + colContentPositions.clear(); + colWidth = Math.floor(viewWidth / colCnt); + setOuterWidth(headCells.slice(0, -1), colWidth); + } + + function resetWidth() { + setWidth(initialViewWidth); + $('.fc-skeleton').width(initialViewWidth); + } + + function renderDayOverlay(overlayStart, overlayEnd, refreshCoordinateGrid) { + console.log("YearView > renderDayOverlay"); + if (refreshCoordinateGrid) { + coordinateGrid.build(); + } + var rowStart = overlayStart.getDate() - 1; + var colStart = overlayStart.getMonth(); + var rowEnd = overlayEnd.getDate() - 1; + var colEnd = overlayEnd.getMonth(); + if(overlayEnd.getDate() == 1) { //FIXME + colEnd--; + rowEnd = daysInMonth(overlayEnd.getMonth(), overlayEnd.getFullYear()); + } + + var lastCol = -1; + var start = cloneDate(overlayStart); + for(var i = colStart; i < colEnd; i++) { + var row = 0; + if(i == colStart) + row = rowStart; + dayBind( + renderCellOverlay(row, i, 30, i) + ); + lastCol = i; + } + if(lastCol != -1) + rowStart = 0; + + var col = (lastCol == -1) ? colStart : lastCol + 1 + dayBind( + renderCellOverlay(rowStart, col, rowEnd - 1, col) + ); + } + + function renderCellOverlay(row0, col0, row1, col1) { + console.log("YearView > renderCellOverlay"); + var rect = coordinateGrid.rect(row0, col0, row1, col1, element); + return renderOverlay(rect, element); + } + + function defaultSelectionEnd(startDate, allDay) { + return cloneDate(startDate); + } + + function daySelectionMousedown(ev) { + console.log("YearView > daySelectionMousedown"); + var cellToDate = t.cellToDate; + var getIsCellAllDay = t.getIsCellAllDay; + var hoverListener = t.getHoverListener(); + var reportDayClick = t.reportDayClick; + if (ev.which == 1 && opt('selectable')) { + unselect(ev); + var _mousedownElement = this; + var dates; + hoverListener.start(function(cell, origCell) { + clearSelection(); + if (cell && getIsCellAllDay(cell)) { + var origCellDate = new Date(t.visStart.getFullYear(), origCell.col, origCell.row + 1, 8, 0, 0, 0); + var cellDate = new Date(t.visStart.getFullYear(), cell.col, cell.row + 1, 17, 0, 0, 0); + dates = [ origCellDate, cellDate ].sort(dateCompare); + renderSelection(dates[0], dates[1], true); + } else { + dates = null; + } + }, ev); + $(document).one('mouseup', function(ev) { + hoverListener.stop(); + if (dates) { + if (+dates[0] == +dates[1]) { + reportDayClick(dates[0], true, ev); + } + reportSelection(dates[0], dates[1], true, ev); + } + }); + } + } + + + function renderSelection(startDate, endDate, allDay) { + console.log("YearView > renderSelection"); + renderDayOverlay(startDate, addDays(cloneDate(endDate), 1), true); + } + + function clearSelection() { + clearOverlays(); + } + + function reportDayClick(date, allDay, ev) { + console.log("Yearview > reportDayClick"); + var cell = dateCell(date); + var _element = bodyCells[cell.row * colCnt + cell.col]; + trigger('dayClick', _element, date, allDay, ev); + } + + function dragStart(_dragElement, ev, ui) { + hoverListener.start(function(cell) { + clearOverlays(); + if (cell) { + renderCellOverlay(cell.row, cell.col, cell.row, cell.col); + } + }, ev); + } + + function dragStop(_dragElement, ev, ui) { + var cell = hoverListener.stop(); + clearOverlays(); + if (cell) { + var d = cellDate(cell); + trigger('drop', _dragElement, d, true, ev, ui); + } + } + + function defaultEventEnd(event) { + return cloneDate(event.start); + } + + coordinateGrid = new CoordinateGrid(function(rows, cols) { + var e, n, p; + headCells.each(function(i, _e) { + e = $(_e); + n = e.offset().left; + if (i) { + p[1] = n; + } + p = [n]; + cols[i] = p; + }); + p[1] = n + e.outerWidth(); + bodyRows.each(function(i, _e) { + if (i < rowCnt) { + e = $(_e); + n = e.offset().top; + if (i) { + p[1] = n; + } + p = [n]; + rows[i] = p; + } + }); + p[1] = n + e.outerHeight(); + }); + + hoverListener = new HoverListener(coordinateGrid); + + colContentPositions = new HorizontalPositionCache(function(col) { + return bodyCellTopInners.eq(col); + }); + + function colContentLeft(col) { + return colContentPositions.left(col); + } + + function colContentRight(col) { + return colContentPositions.right(col); + } + + function dateCell(date) { + return { + row: Math.floor(dayDiff(date, t.visStart) / 7), + col: dayOfWeekCol(date.getDay()) + }; + } + + function cellDate(cell) { + return _cellDate(cell.row, cell.col); + } + + function dayOfWeekCol(dayOfWeek) { + return ((dayOfWeek - Math.max(firstDay, nwe) + colCnt) % colCnt) * dis + dit; + } + + function allDayRow(i) { + return bodyRows.eq(i); + } + + function allDayBounds(i) { + return { + left: 0, + right: viewWidth + }; + } +} + +function YearEventRenderer() { + var t = this; + + DayEventRenderer.call(t); + + // exports + t.renderEvents = renderEvents; + t.resizableDayEvent = resizableDayEvent; + t.draggableDayEvent = draggableDayEvent; + + //imports + var getDaySegmentContainer = t.getDaySegmentContainer; + var opt = t.opt; + var isEventDraggable = t.isEventDraggable; + var isEventResizable = t.isEventResizable; + var reportEventElement = t.reportEventElement; + var trigger = t.trigger; + var eventElementHandlers = t.eventElementHandlers; + var getHoverListener = t.getHoverListener; + var hideEvents = t.hideEvents; + var clearOverlays = t.clearOverlays; //Deprecated + var cellToDate = t.cellToDate; + var renderDayOverlay = t.renderDayOverlay; + var getColCnt = t.getColCnt; + var getRowCnt = t.getRowCnt; + var reportEventChange = t.reportEventChange; + var normalizeEvent = t.normalizeEvent; + var clearSelection = t.clearSelection; + var resetWidth = t.resetWidth; + var showEvents = t.showEvents; + + + function renderEvents(events, modifiedEventId) { + console.log("YearEventRenderer > renderEvents"); + //Restore width + resetWidth(); + //Create segments + var renderContainer = getDaySegmentContainer(); + renderContainer.empty(); + + var segments = _getAllSegments(events); + var elements = _renderHtml(segments) + renderContainer.append(elements); + + // report the elements to the View, for general drag/resize utilities + segmentElementEach(segments, function(segment, element) { + reportEventElement(segment.event, element); + }); + + // attach mouse handlers + attachHandlers(segments, modifiedEventId); + + // call eventAfterRender callback for each event + segmentElementEach(segments, function(segment, element) { + trigger('eventAfterRender', segment.event, segment.event, element); + }); + + //Return segments + return segments; + } + + function attachHandlers(segments, modifiedEventId) { + var segmentContainer = getDaySegmentContainer(); + + segmentElementEach(segments, function(segment, element, i) { + var event = segment.event; + if (event._id === modifiedEventId) { + bindDaySeg(event, element, segment); + } else { + element[0]._fci = i; // for lazySegBind + } + }); + + lazySegBind(segmentContainer, segments, bindDaySeg); + } + + function renderTempDayEvent(event, adjustRow, adjustTop) { + var renderContainer = getDaySegmentContainer(); + var segments = _getAllSegments([event]); + var elements = _renderHtml(segments); + renderContainer.append(elements); + + segmentElementEach(segments, function(segment, element) { + reportEventElement(segment.event, element); + }); + segmentElementEach(segments, function(segment, element) { + trigger('eventAfterRender', segment.event, segment.event, element); + }); + + return elements; + } + + function bindDaySeg(event, eventElement, segment) { + console.log("YearEventRenderer > bindDaySeg"); + if(isEventDraggable(event)) { + //t.draggableDayEvent(event, eventElement, segment); + } + + if(segment.isEnd) { + t.resizableDayEvent(event, eventElement, segment); + } + + eventElementHandlers(event, eventElement); + } + + function resizableDayEvent(event, element, segment) { + console.log("YearEventRenderer > resizableDayEvent"); + var isRTL = opt('isRTL'); + var direction = 's'; + var handle = element.find('.ui-resizable-' + direction); + var isResizing = false; + + disableTextSelection(element); + element + .mousedown(function(ev) { + ev.preventDefault(); + }) + .click(function(ev) { + if (isResizing) { + ev.preventDefault(); + ev.stopImmediatePropagation(); + } + }); + + handle.mousedown(function(ev) { + if (ev.which != 1) return; + isResizing = true; + + var hoverListener = getHoverListener(); + var dayDelta = segment.isEnd ? segment.end : segment.start; + var eventCopy; + + clearSelection(); + + $('body') + .css('cursor', direction + '-resize') + .one('mouseup', mouseup); + + trigger('eventResizeStart', this, event, ev); + hoverListener.start(function(cell, origCell) { + if (cell) { + eventCopy = $.extend({}, event); + var tempDay = cell.row + 1; + var tempMonth = cell.col; + if(segment.isEnd) { + eventCopy.end.setDate(tempDay); + eventCopy.end.setMonth(tempMonth); + } + hideEvents(eventCopy); + renderTempDayEvent(eventCopy, segment.column, segment.top); + clearOverlays(); + } + }, ev); + + function mouseup(ev) { + trigger('eventResizeStop', this, event, ev); + $('body').css('cursor', ''); + hoverListener.stop(); + clearOverlays(); + if (eventCopy) { + event.end = eventCopy.end; + normalizeEvent(event); + trigger( + 'eventResize', + ev, + event, + eventCopy.end, + 0, + function() { + reportEventChange(eventId); + } + ); + reportEventChange(event._id); + } + + setTimeout(function() { + isResizing = false; + },0); + } + }); + } + + function _getAllSegments(events) { + + var segments = []; + for (var i = 0; i < events.length; i++) { + segments = _getSegmentsForEvent(events[i], events, segments); + } + return segments; + } + + function _getSegmentsForEvent(event, events, segments) { + var renderContainer = getDaySegmentContainer(); + var firstCell = renderContainer.parent().find('.fc-skeleton tbody tr.fc-first td.fc-first'); + var cellHeight = firstCell.height(); + var initialMonthWidth = firstCell.width() - firstCell.find('.fc-day-number').width() * 2 - 5; + var startMonth = event.start.getMonth(); + var endMonth = event.start.getMonth(); + if(event.end != null) //allDay + endMonth = event.end.getMonth(); + else + event.end = event.start; + var segmentStart = event.start; + + var segmentWidth = 30; + + var segmentsToPosition = []; + for(var i = startMonth; i <= endMonth; i++) { //5:6 + var endOfMonth = new Date(2012, segmentStart.getMonth() + 1, 0); + + segmentsToPosition.push({start: segmentStart, end: (i != endMonth) ? new Date(endOfMonth) : event.end, last: i == endMonth, first: i == startMonth}); + if(startMonth != endMonth) { + endOfMonth.setDate(endOfMonth.getDate() + 1); + segmentStart = endOfMonth; + } + } + + for(var i = 0; i < segmentsToPosition.length; i++) { + var headerCell = renderContainer.parent().find('.fc-skeleton thead .month-' + (segmentsToPosition[i]['start'].getMonth() + 1)); + var startCell = renderContainer.parent().find('.fc-skeleton tbody tr.fc-date' + segmentsToPosition[i]['start'].getDate() + ' td.fc-month' + (segmentsToPosition[i]['start'].getMonth() + 1)); + var endCell = renderContainer.parent().find('.fc-skeleton tbody tr.fc-date' + segmentsToPosition[i]['end'].getDate() + ' td.fc-month' + (segmentsToPosition[i]['end'].getMonth() + 1)); + var segmentOuterHeight = (endCell[0].offsetTop - startCell[0].offsetTop < 0) ? cellHeight : endCell[0].offsetTop - startCell[0].offsetTop + cellHeight; + + //Calculate margin left collision + var marginLeft = 0; + for(var j = 0; j < segments.length; j++) { + while( + segments[j].left == startCell[0].offsetLeft + marginLeft && + ( + (segments[j].top <= startCell[0].offsetTop && segments[j].top + segments[j].outerHeight >= startCell[0].offsetTop) || + (endCell[0].offsetTop + cellHeight >= segments[j].top && endCell[0].offsetTop + cellHeight <= segments[j].top + segments[j].outerHeight) + ) + ) { + marginLeft += segmentWidth; + } + } + + var segment = { + hsides: 0, + leftCol: 0, // For collision detection, we will not use it (it's vertical) + rightCol: 0, // For collision detection, we will not use it (it's vertical) + row: 0, + event: event, + isEnd: segmentsToPosition[i].last, + isStart: segmentsToPosition[i].first, + left: startCell[0].offsetLeft + marginLeft, + top: startCell[0].offsetTop, + outerHeight: segmentOuterHeight, + outerWidth: segmentWidth, + editable: true + } + segments.push(segment); + + var cellWidth = marginLeft + segmentWidth + firstCell.find('.fc-day-number').width() * 2 + 5; + var cellWidthDiff = cellWidth - startCell.width(); + if(cellWidthDiff > 0) { + headerCell.width(cellWidth); + renderContainer.parent().find('.fc-skeleton').width(renderContainer.parent().find('.fc-skeleton').width() + cellWidthDiff); + } + } + + return segments; + } + + function _renderHtml(segments) { + var html = []; + for (var i = 0; i < segments.length; i++) { + html.push(_renderHtmlForSegment(segments[i])); + } + return html; + } + + function stripHtml(html) { + var div = $("
"); + div.append(html); + return div.text(); + } + + function _renderHtmlForSegment(segment) { + var html = ''; + var isRTL = opt('isRTL'); + var event = segment.event; + var url = event.url; + + var classNames = ['fc-event', 'fc-event-hori']; + if (isEventDraggable(event)) { + classNames.push('fc-event-draggable'); + } + if (segment.isStart) { + classNames.push('fc-event-start'); + } + if (segment.isEnd) { + classNames.push('fc-event-end'); + } + classNames = classNames.concat(event.className); + if (event.source) { + classNames = classNames.concat(event.source.className || []); + } + + if (url) { + html += "" + + "
"; + if (!event.allDay && segment.isStart) { + html += + "" + + ""; + } + html += + "" + + (event.title || '') + + "" + + "
"; + if(segment.isEnd || segment.isStart) { + html += + "
" + + "   " + //Makes the click area better for older ie versions + "
"; + } + html += ""; + var element = $(html); + segment.element = element; + return element; + } + + function draggableDayEvent(event, eventElement) { + var hoverListener = getHoverListener(); + var dayDelta; + eventElement.draggable({ + delay: 50, + opacity: opt('dragOpacity'), + revertDuration: opt('dragRevertDuration'), + start: function(ev, ui) { + trigger('eventDragStart', eventElement, event, ev, ui); + hoverListener.start(function(cell, origCell, rowDelta, colDelta) { + clearOverlays(); + var eventDuration = Math.ceil((event.end.getTime() - event.start.getTime()) / 1000 / 3600 / 24); + + var start = new Date(event.start); + start.setDate(cell.row + 1); + start.setMonth(cell.col); + + var end = new Date(event.end); + end.setDate(cell.row + 1 + eventDuration); + + console.log(eventDuration); + renderDayOverlay(start, end, false); + }, ev, 'drag'); + }, + stop: function(ev, ui) { + hoverListener.stop(); + clearOverlays(); + trigger('eventDragStop', eventElement, event, ev, ui); + if (dayDelta) { + eventDrop(this, event, dayDelta, 0, event.allDay, ev, ui); + }else{ + eventElement.css('filter', ''); + showEvents(event, eventElement); + } + } + }); + } + + function clearEvents() { + + } +} + + + +function BasicView(element, calendar, viewName) { + var t = this; + + + // exports + t.renderBasic = renderBasic; + t.setHeight = setHeight; + t.setWidth = setWidth; + t.renderDayOverlay = renderDayOverlay; + t.defaultSelectionEnd = defaultSelectionEnd; + t.renderSelection = renderSelection; + t.clearSelection = clearSelection; + t.buildEventContainer = buildEventContainer; + t.reportDayClick = reportDayClick; // for selection (kinda hacky) + t.dragStart = dragStart; + t.dragStop = dragStop; + t.defaultEventEnd = defaultEventEnd; + t.getHoverListener = function() { return hoverListener }; + t.colLeft = colLeft; + t.colRight = colRight; + t.colContentLeft = colContentLeft; + t.colContentRight = colContentRight; + t.getIsCellAllDay = function() { return true }; + t.allDayRow = allDayRow; + t.getRowCnt = function() { return rowCnt }; + t.getColCnt = function() { return colCnt }; + t.getColWidth = function() { return colWidth }; + t.getDaySegmentContainer = function() { + return daySegmentContainer; + }; + + + // imports + View.call(t, element, calendar, viewName); + OverlayManager.call(t); + SelectionManager.call(t); + BasicEventRenderer.call(t); + var opt = t.opt; + var trigger = t.trigger; + var renderOverlay = t.renderOverlay; + var clearOverlays = t.clearOverlays; + var daySelectionMousedown = t.daySelectionMousedown; + var cellToDate = t.cellToDate; + var dateToCell = t.dateToCell; + var rangeToSegments = t.rangeToSegments; + var formatDate = calendar.formatDate; + + + // locals + + var table; + var head; + var headCells; + var body; + var bodyRows; + var bodyCells; + var bodyFirstCells; + var firstRowCellInners; + var firstRowCellContentInners; + var daySegmentContainer; + + var viewWidth; + var viewHeight; + var colWidth; + var weekNumberWidth; + + var rowCnt, colCnt; + var showNumbers; + var coordinateGrid; + var hoverListener; + var colPositions; + var colContentPositions; + + var tm; + var colFormat; + var showWeekNumbers; + var weekNumberTitle; + var weekNumberFormat; + + + + /* Rendering + ------------------------------------------------------------*/ + + + disableTextSelection(element.addClass('fc-grid')); + + + function renderBasic(_rowCnt, _colCnt, _showNumbers) { + rowCnt = _rowCnt; + colCnt = _colCnt; + showNumbers = _showNumbers; + updateOptions(); + + if (!body) { + buildEventContainer(); + } + + buildTable(); + } + + + function updateOptions() { + tm = opt('theme') ? 'ui' : 'fc'; + colFormat = opt('columnFormat'); + + // week # options. (TODO: bad, logic also in other views) + showWeekNumbers = opt('weekNumbers'); + weekNumberTitle = opt('weekNumberTitle'); + if (opt('weekNumberCalculation') != 'iso') { + weekNumberFormat = "w"; + } + else { + weekNumberFormat = "W"; + } + } + + + function buildEventContainer() { + daySegmentContainer = + $("
") + .appendTo(element); + } + + + function buildTable() { + var html = buildTableHTML(); + + if (table) { + table.remove(); + } + table = $(html).appendTo(element); + + head = table.find('thead'); + headCells = head.find('.fc-day-header'); + body = table.find('tbody'); + bodyRows = body.find('tr'); + bodyCells = body.find('.fc-day'); + bodyFirstCells = bodyRows.find('td:first-child'); + + firstRowCellInners = bodyRows.eq(0).find('.fc-day > div'); + firstRowCellContentInners = bodyRows.eq(0).find('.fc-day-content > div'); + + markFirstLast(head.add(head.find('tr'))); // marks first+last tr/th's + markFirstLast(bodyRows); // marks first+last td's + bodyRows.eq(0).addClass('fc-first'); + bodyRows.filter(':last').addClass('fc-last'); + + bodyCells.each(function(i, _cell) { + var date = cellToDate( + Math.floor(i / colCnt), + i % colCnt + ); + trigger('dayRender', t, date, $(_cell)); + }); + + dayBind(bodyCells); + } + + + + /* HTML Building + -----------------------------------------------------------*/ + + + function buildTableHTML() { + var html = + "" + + buildHeadHTML() + + buildBodyHTML() + + "
"; + + return html; + } + + + function buildHeadHTML() { + var headerClass = tm + "-widget-header"; + var html = ''; + var col; + var date; + + html += "
" + + htmlEscape(weekNumberTitle) + + "
" + + "" + + "" + + "" + + "" + + "" + + "
" + opt('allDayText') + "" + + "
" + + "
 
"; + allDayTable = $(s).appendTo(slotLayer); + allDayRow = allDayTable.find('tr'); + + dayBind(allDayRow.find('td')); + + slotLayer.append( + "
" + + "
" + + "
" + ); + + }else{ + + daySegmentContainer = $([]); // in jQuery 1.4, we can just do $() + + } + + slotScroller = + $("
") + .appendTo(slotLayer); + + slotContainer = + $("
") + .appendTo(slotScroller); + + slotSegmentContainer = + $("
") + .appendTo(slotContainer); + + s = + "" + + ""; + d = zeroDate(); + maxd = addMinutes(cloneDate(d), maxMinute); + addMinutes(d, minMinute); + slotCnt = 0; + for (i=0; d < maxd; i++) { + minutes = d.getMinutes(); + s += + "" + + "" + + "" + + ""; + addMinutes(d, opt('slotMinutes')); + slotCnt++; + } + s += + "" + + "
" + + ((!slotNormal || !minutes) ? formatDate(d, opt('axisFormat')) : ' ') + + "" + + "
 
" + + "
"; + slotTable = $(s).appendTo(slotContainer); + + slotBind(slotTable.find('td')); + } + + + + /* Build Day Table + -----------------------------------------------------------------------*/ + + + function buildDayTable() { + var html = buildDayTableHTML(); + + if (dayTable) { + dayTable.remove(); + } + dayTable = $(html).appendTo(element); + + dayHead = dayTable.find('thead'); + dayHeadCells = dayHead.find('th').slice(1, -1); // exclude gutter + dayBody = dayTable.find('tbody'); + dayBodyCells = dayBody.find('td').slice(0, -1); // exclude gutter + dayBodyCellInners = dayBodyCells.find('> div'); + dayBodyCellContentInners = dayBodyCells.find('.fc-day-content > div'); + + dayBodyFirstCell = dayBodyCells.eq(0); + dayBodyFirstCellStretcher = dayBodyCellInners.eq(0); + + markFirstLast(dayHead.add(dayHead.find('tr'))); + markFirstLast(dayBody.add(dayBody.find('tr'))); + + // TODO: now that we rebuild the cells every time, we should call dayRender + } + + + function buildDayTableHTML() { + var html = + "" + + buildDayTableHeadHTML() + + buildDayTableBodyHTML() + + "
"; + + return html; + } + + + function buildDayTableHeadHTML() { + var headerClass = tm + "-widget-header"; + var date; + var html = ''; + var weekText; + var col; + + html += + "" + + ""; + + if (showWeekNumbers) { + date = cellToDate(0, 0); + weekText = formatDate(date, weekNumberFormat); + if (rtl) { + weekText += weekNumberTitle; + } + else { + weekText = weekNumberTitle + weekText; + } + html += + "" + + htmlEscape(weekText) + + ""; + } + else { + html += " "; + } + + for (col=0; col" + + htmlEscape(formatDate(date, colFormat)) + + ""; + } + + html += + " " + + "" + + ""; + + return html; + } + + + function buildDayTableBodyHTML() { + var headerClass = tm + "-widget-header"; // TODO: make these when updateOptions() called + var contentClass = tm + "-widget-content"; + var date; + var today = clearTime(new Date()); + var col; + var cellsHTML; + var cellHTML; + var classNames; + var html = ''; + + html += + "" + + "" + + " "; + + cellsHTML = ''; + + for (col=0; col" + + "
" + + "
" + + "
 
" + + "
" + + "
" + + ""; + + cellsHTML += cellHTML; + } + + html += cellsHTML; + html += + " " + + "" + + ""; + + return html; + } + + + // TODO: data-date on the cells + + + + /* Dimensions + -----------------------------------------------------------------------*/ + + + function setHeight(height) { + if (height === undefined) { + height = viewHeight; + } + viewHeight = height; + slotTopCache = {}; + + var headHeight = dayBody.position().top; + var allDayHeight = slotScroller.position().top; // including divider + var bodyHeight = Math.min( // total body height, including borders + height - headHeight, // when scrollbars + slotTable.height() + allDayHeight + 1 // when no scrollbars. +1 for bottom border + ); + + dayBodyFirstCellStretcher + .height(bodyHeight - vsides(dayBodyFirstCell)); + + slotLayer.css('top', headHeight); + + slotScroller.height(bodyHeight - allDayHeight - 1); + + // the stylesheet guarantees that the first row has no border. + // this allows .height() to work well cross-browser. + slotHeight = slotTable.find('tr:first').height() + 1; // +1 for bottom border + + snapRatio = opt('slotMinutes') / snapMinutes; + snapHeight = slotHeight / snapRatio; + } + + + function setWidth(width) { + viewWidth = width; + colPositions.clear(); + colContentPositions.clear(); + + var axisFirstCells = dayHead.find('th:first'); + if (allDayTable) { + axisFirstCells = axisFirstCells.add(allDayTable.find('th:first')); + } + axisFirstCells = axisFirstCells.add(slotTable.find('th:first')); + + axisWidth = 0; + setOuterWidth( + axisFirstCells + .width('') + .each(function(i, _cell) { + axisWidth = Math.max(axisWidth, $(_cell).outerWidth()); + }), + axisWidth + ); + + var gutterCells = dayTable.find('.fc-agenda-gutter'); + if (allDayTable) { + gutterCells = gutterCells.add(allDayTable.find('th.fc-agenda-gutter')); + } + + var slotTableWidth = slotScroller[0].clientWidth; // needs to be done after axisWidth (for IE7) + + gutterWidth = slotScroller.width() - slotTableWidth; + if (gutterWidth) { + setOuterWidth(gutterCells, gutterWidth); + gutterCells + .show() + .prev() + .removeClass('fc-last'); + }else{ + gutterCells + .hide() + .prev() + .addClass('fc-last'); + } + + colWidth = Math.floor((slotTableWidth - axisWidth) / colCnt); + setOuterWidth(dayHeadCells.slice(0, -1), colWidth); + } + + + + /* Scrolling + -----------------------------------------------------------------------*/ + + + function resetScroll() { + var d0 = zeroDate(); + var scrollDate = cloneDate(d0); + scrollDate.setHours(opt('firstHour')); + var top = timePosition(d0, scrollDate) + 1; // +1 for the border + function scroll() { + slotScroller.scrollTop(top); + } + scroll(); + setTimeout(scroll, 0); // overrides any previous scroll state made by the browser + } + + + function afterRender() { // after the view has been freshly rendered and sized + resetScroll(); + } + + + + /* Slot/Day clicking and binding + -----------------------------------------------------------------------*/ + + + function dayBind(cells) { + cells.click(slotClick) + .mousedown(daySelectionMousedown); + } + + + function slotBind(cells) { + cells.click(slotClick) + .mousedown(slotSelectionMousedown); + } + + + function slotClick(ev) { + if (!opt('selectable')) { // if selectable, SelectionManager will worry about dayClick + var col = Math.min(colCnt-1, Math.floor((ev.pageX - dayTable.offset().left - axisWidth) / colWidth)); + var date = cellToDate(0, col); + var rowMatch = this.parentNode.className.match(/fc-slot(\d+)/); // TODO: maybe use data + if (rowMatch) { + var mins = parseInt(rowMatch[1]) * opt('slotMinutes'); + var hours = Math.floor(mins/60); + date.setHours(hours); + date.setMinutes(mins%60 + minMinute); + trigger('dayClick', dayBodyCells[col], date, false, ev); + }else{ + trigger('dayClick', dayBodyCells[col], date, true, ev); + } + } + } + + + + /* Semi-transparent Overlay Helpers + -----------------------------------------------------*/ + // TODO: should be consolidated with BasicView's methods + + + function renderDayOverlay(overlayStart, overlayEnd, refreshCoordinateGrid) { // overlayEnd is exclusive + + if (refreshCoordinateGrid) { + coordinateGrid.build(); + } + + var segments = rangeToSegments(overlayStart, overlayEnd); + + for (var i=0; i= 0) { + addMinutes(d, minMinute + slotIndex * snapMinutes); + } + return d; + } + + + // get the Y coordinate of the given time on the given day (both Date objects) + function timePosition(day, time) { // both date objects. day holds 00:00 of current day + day = cloneDate(day, true); + if (time < addMinutes(cloneDate(day), minMinute)) { + return 0; + } + if (time >= addMinutes(cloneDate(day), maxMinute)) { + return slotTable.height(); + } + var slotMinutes = opt('slotMinutes'), + minutes = time.getHours()*60 + time.getMinutes() - minMinute, + slotI = Math.floor(minutes / slotMinutes), + slotTop = slotTopCache[slotI]; + if (slotTop === undefined) { + slotTop = slotTopCache[slotI] = + slotTable.find('tr').eq(slotI).find('td div')[0].offsetTop; + // .eq() is faster than ":eq()" selector + // [0].offsetTop is faster than .position().top (do we really need this optimization?) + // a better optimization would be to cache all these divs + } + return Math.max(0, Math.round( + slotTop - 1 + slotHeight * ((minutes % slotMinutes) / slotMinutes) + )); + } + + + function getAllDayRow(index) { + return allDayRow; + } + + + function defaultEventEnd(event) { + var start = cloneDate(event.start); + if (event.allDay) { + return start; + } + return addMinutes(start, opt('defaultEventMinutes')); + } + + + + /* Selection + ---------------------------------------------------------------------------------*/ + + + function defaultSelectionEnd(startDate, allDay) { + if (allDay) { + return cloneDate(startDate); + } + return addMinutes(cloneDate(startDate), opt('slotMinutes')); + } + + + function renderSelection(startDate, endDate, allDay) { // only for all-day + if (allDay) { + if (opt('allDaySlot')) { + renderDayOverlay(startDate, addDays(cloneDate(endDate), 1), true); + } + }else{ + renderSlotSelection(startDate, endDate); + } + } + + + function renderSlotSelection(startDate, endDate) { + var helperOption = opt('selectHelper'); + coordinateGrid.build(); + if (helperOption) { + var col = dateToCell(startDate).col; + if (col >= 0 && col < colCnt) { // only works when times are on same day + var rect = coordinateGrid.rect(0, col, 0, col, slotContainer); // only for horizontal coords + var top = timePosition(startDate, startDate); + var bottom = timePosition(startDate, endDate); + if (bottom > top) { // protect against selections that are entirely before or after visible range + rect.top = top; + rect.height = bottom - top; + rect.left += 2; + rect.width -= 5; + if ($.isFunction(helperOption)) { + var helperRes = helperOption(startDate, endDate); + if (helperRes) { + rect.position = 'absolute'; + selectionHelper = $(helperRes) + .css(rect) + .appendTo(slotContainer); + } + }else{ + rect.isStart = true; // conside rect a "seg" now + rect.isEnd = true; // + selectionHelper = $(slotSegHtml( + { + title: '', + start: startDate, + end: endDate, + className: ['fc-select-helper'], + editable: false + }, + rect + )); + selectionHelper.css('opacity', opt('dragOpacity')); + } + if (selectionHelper) { + slotBind(selectionHelper); + slotContainer.append(selectionHelper); + setOuterWidth(selectionHelper, rect.width, true); // needs to be after appended + setOuterHeight(selectionHelper, rect.height, true); + } + } + } + }else{ + renderSlotOverlay(startDate, endDate); + } + } + + + function clearSelection() { + clearOverlays(); + if (selectionHelper) { + selectionHelper.remove(); + selectionHelper = null; + } + } + + + function slotSelectionMousedown(ev) { + if (ev.which == 1 && opt('selectable')) { // ev.which==1 means left mouse button + unselect(ev); + var dates; + hoverListener.start(function(cell, origCell) { + clearSelection(); + if (cell && cell.col == origCell.col && !getIsCellAllDay(cell)) { + var d1 = realCellToDate(origCell); + var d2 = realCellToDate(cell); + dates = [ + d1, + addMinutes(cloneDate(d1), snapMinutes), // calculate minutes depending on selection slot minutes + d2, + addMinutes(cloneDate(d2), snapMinutes) + ].sort(dateCompare); + renderSlotSelection(dates[0], dates[3]); + }else{ + dates = null; + } + }, ev); + $(document).one('mouseup', function(ev) { + hoverListener.stop(); + if (dates) { + if (+dates[0] == +dates[1]) { + reportDayClick(dates[0], false, ev); + } + reportSelection(dates[0], dates[3], false, ev); + } + }); + } + } + + + function reportDayClick(date, allDay, ev) { + trigger('dayClick', dayBodyCells[dateToCell(date).col], date, allDay, ev); + } + + + + /* External Dragging + --------------------------------------------------------------------------------*/ + + + function dragStart(_dragElement, ev, ui) { + hoverListener.start(function(cell) { + clearOverlays(); + if (cell) { + if (getIsCellAllDay(cell)) { + renderCellOverlay(cell.row, cell.col, cell.row, cell.col); + }else{ + var d1 = realCellToDate(cell); + var d2 = addMinutes(cloneDate(d1), opt('defaultEventMinutes')); + renderSlotOverlay(d1, d2); + } + } + }, ev); + } + + + function dragStop(_dragElement, ev, ui) { + var cell = hoverListener.stop(); + clearOverlays(); + if (cell) { + trigger('drop', _dragElement, realCellToDate(cell), getIsCellAllDay(cell), ev, ui); + } + } + + +} + +;; + +function AgendaEventRenderer() { + var t = this; + + + // exports + t.renderEvents = renderEvents; + t.clearEvents = clearEvents; + t.slotSegHtml = slotSegHtml; + + + // imports + DayEventRenderer.call(t); + var opt = t.opt; + var trigger = t.trigger; + var isEventDraggable = t.isEventDraggable; + var isEventResizable = t.isEventResizable; + var eventEnd = t.eventEnd; + var eventElementHandlers = t.eventElementHandlers; + var setHeight = t.setHeight; + var getDaySegmentContainer = t.getDaySegmentContainer; + var getSlotSegmentContainer = t.getSlotSegmentContainer; + var getHoverListener = t.getHoverListener; + var getMaxMinute = t.getMaxMinute; + var getMinMinute = t.getMinMinute; + var timePosition = t.timePosition; + var getIsCellAllDay = t.getIsCellAllDay; + var colContentLeft = t.colContentLeft; + var colContentRight = t.colContentRight; + var cellToDate = t.cellToDate; + var getColCnt = t.getColCnt; + var getColWidth = t.getColWidth; + var getSnapHeight = t.getSnapHeight; + var getSnapMinutes = t.getSnapMinutes; + var getSlotContainer = t.getSlotContainer; + var reportEventElement = t.reportEventElement; + var showEvents = t.showEvents; + var hideEvents = t.hideEvents; + var eventDrop = t.eventDrop; + var eventResize = t.eventResize; + var renderDayOverlay = t.renderDayOverlay; + var clearOverlays = t.clearOverlays; + var renderDayEvents = t.renderDayEvents; + var calendar = t.calendar; + var formatDate = calendar.formatDate; + var formatDates = calendar.formatDates; + + + // overrides + t.draggableDayEvent = draggableDayEvent; + + + + /* Rendering + ----------------------------------------------------------------------------*/ + + + function renderEvents(events, modifiedEventId) { + var i, len=events.length, + dayEvents=[], + slotEvents=[]; + for (i=0; i start && eventStart < end) { + if (eventStart < start) { + segStart = cloneDate(start); + isStart = false; + }else{ + segStart = eventStart; + isStart = true; + } + if (eventEnd > end) { + segEnd = cloneDate(end); + isEnd = false; + }else{ + segEnd = eventEnd; + isEnd = true; + } + segs.push({ + event: event, + start: segStart, + end: segEnd, + isStart: isStart, + isEnd: isEnd + }); + } + } + return segs.sort(compareSlotSegs); + } + + + function slotEventEnd(event) { + if (event.end) { + return cloneDate(event.end); + }else{ + return addMinutes(cloneDate(event.start), opt('defaultEventMinutes')); + } + } + + + // renders events in the 'time slots' at the bottom + // TODO: when we refactor this, when user returns `false` eventRender, don't have empty space + // TODO: refactor will include using pixels to detect collisions instead of dates (handy for seg cmp) + + function renderSlotSegs(segs, modifiedEventId) { + + var i, segCnt=segs.length, seg, + event, + top, + bottom, + columnLeft, + columnRight, + columnWidth, + width, + left, + right, + html = '', + eventElements, + eventElement, + triggerRes, + titleElement, + height, + slotSegmentContainer = getSlotSegmentContainer(), + isRTL = opt('isRTL'); + + // calculate position/dimensions, create html + for (i=0; i" + + "
" + + "
" + + htmlEscape(formatDates(event.start, event.end, opt('timeFormat'))) + + "
" + + "
" + + htmlEscape(event.title || '') + + "
" + + "
" + + "
"; + if (seg.isEnd && isEventResizable(event)) { + html += + "
=
"; + } + html += + ""; + return html; + } + + + function bindSlotSeg(event, eventElement, seg) { + var timeElement = eventElement.find('div.fc-event-time'); + if (isEventDraggable(event)) { + draggableSlotEvent(event, eventElement, timeElement); + } + if (seg.isEnd && isEventResizable(event)) { + resizableSlotEvent(event, eventElement, timeElement); + } + eventElementHandlers(event, eventElement); + } + + + + /* Dragging + -----------------------------------------------------------------------------------*/ + + + // when event starts out FULL-DAY + // overrides DayEventRenderer's version because it needs to account for dragging elements + // to and from the slot area. + + function draggableDayEvent(event, eventElement, seg) { + var isStart = seg.isStart; + var origWidth; + var revert; + var allDay = true; + var dayDelta; + var hoverListener = getHoverListener(); + var colWidth = getColWidth(); + var snapHeight = getSnapHeight(); + var snapMinutes = getSnapMinutes(); + var minMinute = getMinMinute(); + eventElement.draggable({ + opacity: opt('dragOpacity', 'month'), // use whatever the month view was using + revertDuration: opt('dragRevertDuration'), + start: function(ev, ui) { + trigger('eventDragStart', eventElement, event, ev, ui); + hideEvents(event, eventElement); + origWidth = eventElement.width(); + hoverListener.start(function(cell, origCell) { + clearOverlays(); + if (cell) { + revert = false; + var origDate = cellToDate(0, origCell.col); + var date = cellToDate(0, cell.col); + dayDelta = dayDiff(date, origDate); + if (!cell.row) { + // on full-days + renderDayOverlay( + addDays(cloneDate(event.start), dayDelta), + addDays(exclEndDay(event), dayDelta) + ); + resetElement(); + }else{ + // mouse is over bottom slots + if (isStart) { + if (allDay) { + // convert event to temporary slot-event + eventElement.width(colWidth - 10); // don't use entire width + setOuterHeight( + eventElement, + snapHeight * Math.round( + (event.end ? ((event.end - event.start) / MINUTE_MS) : opt('defaultEventMinutes')) / + snapMinutes + ) + ); + eventElement.draggable('option', 'grid', [colWidth, 1]); + allDay = false; + } + }else{ + revert = true; + } + } + revert = revert || (allDay && !dayDelta); + }else{ + resetElement(); + revert = true; + } + eventElement.draggable('option', 'revert', revert); + }, ev, 'drag'); + }, + stop: function(ev, ui) { + hoverListener.stop(); + clearOverlays(); + trigger('eventDragStop', eventElement, event, ev, ui); + if (revert) { + // hasn't moved or is out of bounds (draggable has already reverted) + resetElement(); + eventElement.css('filter', ''); // clear IE opacity side-effects + showEvents(event, eventElement); + }else{ + // changed! + var minuteDelta = 0; + if (!allDay) { + minuteDelta = Math.round((eventElement.offset().top - getSlotContainer().offset().top) / snapHeight) + * snapMinutes + + minMinute + - (event.start.getHours() * 60 + event.start.getMinutes()); + } + eventDrop(this, event, dayDelta, minuteDelta, allDay, ev, ui); + } + } + }); + function resetElement() { + if (!allDay) { + eventElement + .width(origWidth) + .height('') + .draggable('option', 'grid', null); + allDay = true; + } + } + } + + + // when event starts out IN TIMESLOTS + + function draggableSlotEvent(event, eventElement, timeElement) { + var coordinateGrid = t.getCoordinateGrid(); + var colCnt = getColCnt(); + var colWidth = getColWidth(); + var snapHeight = getSnapHeight(); + var snapMinutes = getSnapMinutes(); + + // states + var origPosition; // original position of the element, not the mouse + var origCell; + var isInBounds, prevIsInBounds; + var isAllDay, prevIsAllDay; + var colDelta, prevColDelta; + var dayDelta; // derived from colDelta + var minuteDelta, prevMinuteDelta; + + eventElement.draggable({ + scroll: false, + grid: [ colWidth, snapHeight ], + axis: colCnt==1 ? 'y' : false, + opacity: opt('dragOpacity'), + revertDuration: opt('dragRevertDuration'), + start: function(ev, ui) { + + trigger('eventDragStart', eventElement, event, ev, ui); + hideEvents(event, eventElement); + + coordinateGrid.build(); + + // initialize states + origPosition = eventElement.position(); + origCell = coordinateGrid.cell(ev.pageX, ev.pageY); + isInBounds = prevIsInBounds = true; + isAllDay = prevIsAllDay = getIsCellAllDay(origCell); + colDelta = prevColDelta = 0; + dayDelta = 0; + minuteDelta = prevMinuteDelta = 0; + + }, + drag: function(ev, ui) { + + // NOTE: this `cell` value is only useful for determining in-bounds and all-day. + // Bad for anything else due to the discrepancy between the mouse position and the + // element position while snapping. (problem revealed in PR #55) + // + // PS- the problem exists for draggableDayEvent() when dragging an all-day event to a slot event. + // We should overhaul the dragging system and stop relying on jQuery UI. + var cell = coordinateGrid.cell(ev.pageX, ev.pageY); + + // update states + isInBounds = !!cell; + if (isInBounds) { + isAllDay = getIsCellAllDay(cell); + + // calculate column delta + colDelta = Math.round((ui.position.left - origPosition.left) / colWidth); + if (colDelta != prevColDelta) { + // calculate the day delta based off of the original clicked column and the column delta + var origDate = cellToDate(0, origCell.col); + var col = origCell.col + colDelta; + col = Math.max(0, col); + col = Math.min(colCnt-1, col); + var date = cellToDate(0, col); + dayDelta = dayDiff(date, origDate); + } + + // calculate minute delta (only if over slots) + if (!isAllDay) { + minuteDelta = Math.round((ui.position.top - origPosition.top) / snapHeight) * snapMinutes; + } + } + + // any state changes? + if ( + isInBounds != prevIsInBounds || + isAllDay != prevIsAllDay || + colDelta != prevColDelta || + minuteDelta != prevMinuteDelta + ) { + + updateUI(); + + // update previous states for next time + prevIsInBounds = isInBounds; + prevIsAllDay = isAllDay; + prevColDelta = colDelta; + prevMinuteDelta = minuteDelta; + } + + // if out-of-bounds, revert when done, and vice versa. + eventElement.draggable('option', 'revert', !isInBounds); + + }, + stop: function(ev, ui) { + + clearOverlays(); + trigger('eventDragStop', eventElement, event, ev, ui); + + if (isInBounds && (isAllDay || dayDelta || minuteDelta)) { // changed! + eventDrop(this, event, dayDelta, isAllDay ? 0 : minuteDelta, isAllDay, ev, ui); + } + else { // either no change or out-of-bounds (draggable has already reverted) + + // reset states for next time, and for updateUI() + isInBounds = true; + isAllDay = false; + colDelta = 0; + dayDelta = 0; + minuteDelta = 0; + + updateUI(); + eventElement.css('filter', ''); // clear IE opacity side-effects + + // sometimes fast drags make event revert to wrong position, so reset. + // also, if we dragged the element out of the area because of snapping, + // but the *mouse* is still in bounds, we need to reset the position. + eventElement.css(origPosition); + + showEvents(event, eventElement); + } + } + }); + + function updateUI() { + clearOverlays(); + if (isInBounds) { + if (isAllDay) { + timeElement.hide(); + eventElement.draggable('option', 'grid', null); // disable grid snapping + renderDayOverlay( + addDays(cloneDate(event.start), dayDelta), + addDays(exclEndDay(event), dayDelta) + ); + } + else { + updateTimeText(minuteDelta); + timeElement.css('display', ''); // show() was causing display=inline + eventElement.draggable('option', 'grid', [colWidth, snapHeight]); // re-enable grid snapping + } + } + } + + function updateTimeText(minuteDelta) { + var newStart = addMinutes(cloneDate(event.start), minuteDelta); + var newEnd; + if (event.end) { + newEnd = addMinutes(cloneDate(event.end), minuteDelta); + } + timeElement.text(formatDates(newStart, newEnd, opt('timeFormat'))); + } + + } + + + + /* Resizing + --------------------------------------------------------------------------------------*/ + + + function resizableSlotEvent(event, eventElement, timeElement) { + var snapDelta, prevSnapDelta; + var snapHeight = getSnapHeight(); + var snapMinutes = getSnapMinutes(); + eventElement.resizable({ + handles: { + s: '.ui-resizable-handle' + }, + grid: snapHeight, + start: function(ev, ui) { + snapDelta = prevSnapDelta = 0; + hideEvents(event, eventElement); + trigger('eventResizeStart', this, event, ev, ui); + }, + resize: function(ev, ui) { + // don't rely on ui.size.height, doesn't take grid into account + snapDelta = Math.round((Math.max(snapHeight, eventElement.height()) - ui.originalSize.height) / snapHeight); + if (snapDelta != prevSnapDelta) { + timeElement.text( + formatDates( + event.start, + (!snapDelta && !event.end) ? null : // no change, so don't display time range + addMinutes(eventEnd(event), snapMinutes*snapDelta), + opt('timeFormat') + ) + ); + prevSnapDelta = snapDelta; + } + }, + stop: function(ev, ui) { + trigger('eventResizeStop', this, event, ev, ui); + if (snapDelta) { + eventResize(this, event, 0, snapMinutes*snapDelta, ev, ui); + }else{ + showEvents(event, eventElement); + // BUG: if event was really short, need to put title back in span + } + } + }); + } + + +} + + + +/* Agenda Event Segment Utilities +-----------------------------------------------------------------------------*/ + + +// Sets the seg.backwardCoord and seg.forwardCoord on each segment and returns a new +// list in the order they should be placed into the DOM (an implicit z-index). +function placeSlotSegs(segs) { + var levels = buildSlotSegLevels(segs); + var level0 = levels[0]; + var i; + + computeForwardSlotSegs(levels); + + if (level0) { + + for (i=0; i seg2.start && seg1.start < seg2.end; +} + + +// A cmp function for determining which forward segment to rely on more when computing coordinates. +function compareForwardSlotSegs(seg1, seg2) { + // put higher-pressure first + return seg2.forwardPressure - seg1.forwardPressure || + // put segments that are closer to initial edge first (and favor ones with no coords yet) + (seg1.backwardCoord || 0) - (seg2.backwardCoord || 0) || + // do normal sorting... + compareSlotSegs(seg1, seg2); +} + + +// A cmp function for determining which segment should be closer to the initial edge +// (the left edge on a left-to-right calendar). +function compareSlotSegs(seg1, seg2) { + return seg1.start - seg2.start || // earlier start time goes first + (seg2.end - seg2.start) - (seg1.end - seg1.start) || // tie? longer-duration goes first + (seg1.event.title || '').localeCompare(seg2.event.title); // tie? alphabetically by title +} + + +;; + + +function View(element, calendar, viewName) { + var t = this; + + + // exports + t.element = element; + t.calendar = calendar; + t.name = viewName; + t.opt = opt; + t.trigger = trigger; + t.isEventDraggable = isEventDraggable; + t.isEventResizable = isEventResizable; + t.setEventData = setEventData; + t.clearEventData = clearEventData; + t.eventEnd = eventEnd; + t.reportEventElement = reportEventElement; + t.triggerEventDestroy = triggerEventDestroy; + t.eventElementHandlers = eventElementHandlers; + t.showEvents = showEvents; + t.hideEvents = hideEvents; + t.eventDrop = eventDrop; + t.eventResize = eventResize; + // t.title + // t.start, t.end + // t.visStart, t.visEnd + + + // imports + var defaultEventEnd = t.defaultEventEnd; + var normalizeEvent = calendar.normalizeEvent; // in EventManager + var reportEventChange = calendar.reportEventChange; + + + // locals + var eventsByID = {}; // eventID mapped to array of events (there can be multiple b/c of repeating events) + var eventElementsByID = {}; // eventID mapped to array of jQuery elements + var eventElementCouples = []; // array of objects, { event, element } // TODO: unify with segment system + var options = calendar.options; + + + + function opt(name, viewNameOverride) { + var v = options[name]; + if ($.isPlainObject(v)) { + return smartProperty(v, viewNameOverride || viewName); + } + return v; + } + + + function trigger(name, thisObj) { + return calendar.trigger.apply( + calendar, + [name, thisObj || t].concat(Array.prototype.slice.call(arguments, 2), [t]) + ); + } + + + + /* Event Editable Boolean Calculations + ------------------------------------------------------------------------------*/ + + + function isEventDraggable(event) { + var source = event.source || {}; + return firstDefined( + event.startEditable, + source.startEditable, + opt('eventStartEditable'), + event.editable, + source.editable, + opt('editable') + ) + && !opt('disableDragging'); // deprecated + } + + + function isEventResizable(event) { // but also need to make sure the seg.isEnd == true + var source = event.source || {}; + return firstDefined( + event.durationEditable, + source.durationEditable, + opt('eventDurationEditable'), + event.editable, + source.editable, + opt('editable') + ) + && !opt('disableResizing'); // deprecated + } + + + + /* Event Data + ------------------------------------------------------------------------------*/ + + + function setEventData(events) { // events are already normalized at this point + eventsByID = {}; + var i, len=events.length, event; + for (i=0; i