| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531 |
- setDefaults({
- weekMode: 'fixed'
- });
- 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.reportDayClick = reportDayClick; // for selection (kinda hacky)
- t.dragStart = dragStart;
- t.dragStop = dragStop;
- t.defaultEventEnd = defaultEventEnd;
- t.getHoverListener = function() { return hoverListener };
- t.colContentLeft = colContentLeft;
- t.colContentRight = colContentRight;
- t.dayOfWeekCol = dayOfWeekCol;
- t.dateCell = dateCell;
- t.cellDate = cellDate;
- t.cellIsAllDay = function() { return true };
- t.allDayRow = allDayRow;
- t.allDayBounds = allDayBounds;
- 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 clearEvents = t.clearEvents;
- var renderOverlay = t.renderOverlay;
- var clearOverlays = t.clearOverlays;
- var daySelectionMousedown = t.daySelectionMousedown;
- var formatDate = calendar.formatDate;
-
-
- // locals
-
- var head;
- var headCells;
- var body;
- var bodyRows;
- var bodyCells;
- var bodyFirstCells;
- var bodyCellTopInners;
- var daySegmentContainer;
-
- var viewWidth;
- var viewHeight;
- var colWidth;
- var weekNumberWidth;
-
- var rowCnt, colCnt;
- var coordinateGrid;
- var hoverListener;
- var colContentPositions;
-
- var rtl, dis, dit;
- var firstDay;
- var nwe; // no weekends? a 0 or 1 for easy computations
- var tm;
- var colFormat;
- var showWeekNumbers;
- var weekNumberTitle;
- var weekNumberFormat;
-
-
-
- /* Rendering
- ------------------------------------------------------------*/
-
-
- disableTextSelection(element.addClass('fc-grid'));
-
-
- function renderBasic(maxr, r, c, showNumbers) {
- rowCnt = r;
- colCnt = c;
- updateOptions();
- var firstTime = !body;
- if (firstTime) {
- buildSkeleton(maxr, showNumbers);
- }else{
- clearEvents();
- }
- updateCells(firstTime);
- }
-
-
-
- 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');
- // 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 buildSkeleton(maxRowCnt, showNumbers) {
- var s;
- var headerClass = tm + "-widget-header";
- var contentClass = tm + "-widget-content";
- var i, j;
- var table;
-
- s =
- "<table class='fc-border-separate' style='width:100%' cellspacing='0'>" +
- "<thead>" +
- "<tr>";
- if (showWeekNumbers) {
- s +=
- "<th class='fc-week-number " + headerClass + "'/>";
- }
- for (i=0; i<colCnt; i++) {
- s +=
- "<th class='fc- " + headerClass + "'/>"; // need fc- for setDayID
- }
- s +=
- "</tr>" +
- "</thead>" +
- "<tbody>";
- for (i=0; i<maxRowCnt; i++) {
- s +=
- "<tr class='fc-week" + i + "'>";
- if (showWeekNumbers) {
- s +=
- "<td class='fc-week-number " + contentClass + "'><div></div></td>";
- }
- for (j=0; j<colCnt; j++) {
- s +=
- "<td class='fc- " + contentClass + " fc-day" + (i*colCnt+j) + "'>" + // need fc- for setDayID
- "<div>" +
- (showNumbers ?
- "<div class='fc-day-number'/>" :
- ''
- ) +
- "<div class='fc-day-content'>" +
- "<div style='position:relative'> </div>" +
- "</div>" +
- "</div>" +
- "</td>";
- }
- s +=
- "</tr>";
- }
- s +=
- "</tbody>" +
- "</table>";
- table = $(s).appendTo(element);
-
- head = table.find('thead');
- headCells = head.find('th:not(.fc-week-number)');
- body = table.find('tbody');
- bodyRows = body.find('tr');
- bodyCells = body.find('td').filter(':not(.fc-week-number)');
- bodyFirstCells = bodyCells.filter(':first-child, td.fc-week-number + *'); // either first cell in each row, or immediately following week #
- bodyCellTopInners = bodyRows.eq(0).find('div.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'); // fc-last is done in updateCells
-
- dayBind(bodyCells);
-
- daySegmentContainer =
- $("<div style='position:absolute;z-index:8;top:0;left:0'/>")
- .appendTo(element);
- }
-
-
-
- function updateCells(firstTime) {
- var dowDirty = firstTime || rowCnt == 1; // could the cells' day-of-weeks need updating?
- var month = t.start.getMonth();
- var today = clearTime(new Date());
- var cell;
- var date;
- var row;
-
- if (showWeekNumbers) {
- head.find('.fc-week-number').text(weekNumberTitle);
- }
- if (dowDirty) {
- headCells.each(function(i, _cell) {
- cell = $(_cell);
- date = indexDate(i);
- cell.html(formatDate(date, colFormat));
- setDayID(cell, date);
- });
- }
-
- bodyCells.each(function(i, _cell) {
- cell = $(_cell);
- date = indexDate(i);
- if (date.getMonth() == month) {
- cell.removeClass('fc-other-month');
- }else{
- cell.addClass('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());
- cell.attr('data-date', $.fullCalendar.formatDate(date, "yyyyMMdd"));
- if (dowDirty) {
- setDayID(cell, date);
- }
- trigger('dayRender', t, date, cell);
- });
-
- bodyRows.each(function(i, _row) {
- row = $(_row);
- if (i < rowCnt) {
- if (showWeekNumbers) {
- var weekStartDate = indexDate(i*7);
- row.find('.fc-week-number > div').text(
- formatDate(weekStartDate, weekNumberFormat)
- );
- }
- row.show();
- if (i == rowCnt-1) {
- row.addClass('fc-last');
- }else{
- row.removeClass('fc-last');
- }
- }else{
- row.hide();
- }
- });
- }
-
-
-
- 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);
- setMinHeight(
- cell.find('> div'),
- (i==rowCnt-1 ? rowHeightLast : rowHeight) - vsides(cell)
- );
- }
- });
-
- }
-
-
- function setWidth(width) {
- viewWidth = width;
- 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 index = parseInt(this.className.match(/fc\-day(\d+)/)[1]); // TODO: maybe use .data
- var date = indexDate(index);
- trigger('dayClick', this, date, true, ev);
- }
- }
-
-
-
- /* Semi-transparent Overlay Helpers
- ------------------------------------------------------*/
-
-
- function renderDayOverlay(overlayStart, overlayEnd, refreshCoordinateGrid) { // overlayEnd is exclusive
- if (refreshCoordinateGrid) {
- coordinateGrid.build();
- }
- var rowStart = cloneDate(t.visStart);
- var rowEnd = addDays(cloneDate(rowStart), colCnt);
- for (var i=0; i<rowCnt; i++) {
- var stretchStart = new Date(Math.max(rowStart, overlayStart));
- var stretchEnd = new Date(Math.min(rowEnd, overlayEnd));
- if (stretchStart < stretchEnd) {
- var colStart, colEnd;
- if (rtl) {
- colStart = dayDiff(stretchEnd, rowStart)*dis+dit+1;
- colEnd = dayDiff(stretchStart, rowStart)*dis+dit+1;
- }else{
- colStart = dayDiff(stretchStart, rowStart);
- colEnd = dayDiff(stretchEnd, rowStart);
- }
- dayBind(
- renderCellOverlay(i, colStart, i, colEnd-1)
- );
- }
- addDays(rowStart, 7);
- addDays(rowEnd, 7);
- }
- }
-
-
- function renderCellOverlay(row0, col0, row1, col1) { // row1,col1 is inclusive
- var rect = coordinateGrid.rect(row0, col0, row1, col1, element);
- return renderOverlay(rect, element);
- }
-
-
-
- /* Selection
- -----------------------------------------------------------------------*/
-
-
- function defaultSelectionEnd(startDate, allDay) {
- return cloneDate(startDate);
- }
-
-
- function renderSelection(startDate, endDate, allDay) {
- renderDayOverlay(startDate, addDays(cloneDate(endDate), 1), true); // rebuild every time???
- }
-
-
- function clearSelection() {
- clearOverlays();
- }
-
-
- function reportDayClick(date, allDay, ev) {
- var cell = dateCell(date);
- var _element = bodyCells[cell.row*colCnt + cell.col];
- trigger('dayClick', _element, date, allDay, ev);
- }
-
-
-
- /* External Dragging
- -----------------------------------------------------------------------*/
-
-
- 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);
- }
- }
-
-
-
- /* Utilities
- --------------------------------------------------------*/
-
-
- 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 _cellDate(row, col) {
- return addDays(cloneDate(t.visStart), row*7 + col*dis+dit);
- // what about weekends in middle of week?
- }
-
-
- function indexDate(index) {
- return _cellDate(Math.floor(index/colCnt), index%colCnt);
- }
-
-
- function dayOfWeekCol(dayOfWeek) {
- return ((dayOfWeek - Math.max(firstDay, nwe) + colCnt) % colCnt) * dis + dit;
- }
-
-
-
-
- function allDayRow(i) {
- return bodyRows.eq(i);
- }
-
-
- function allDayBounds(i) {
- var left = 0;
- if (showWeekNumbers) {
- left += weekNumberWidth;
- }
- return {
- left: left,
- right: viewWidth
- };
- }
-
-
- }
|