2009-10-05 07:47:26 +02:00
|
|
|
|
|
|
|
/* Agenda Views: agendaWeek/agendaDay
|
|
|
|
-----------------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
setDefaults({
|
2009-10-15 08:14:21 +02:00
|
|
|
allDaySlot: true,
|
2009-10-12 08:35:33 +02:00
|
|
|
allDayText: 'all-day',
|
2009-10-13 06:22:40 +02:00
|
|
|
firstHour: 6,
|
2009-10-05 07:47:26 +02:00
|
|
|
slotMinutes: 30,
|
|
|
|
defaultEventMinutes: 120,
|
2009-10-12 08:35:33 +02:00
|
|
|
axisFormat: 'h(:mm)tt',
|
2009-10-10 10:12:40 +02:00
|
|
|
timeFormat: {
|
|
|
|
agenda: 'h:mm{ - h:mm}'
|
|
|
|
},
|
|
|
|
dragOpacity: {
|
|
|
|
agenda: .5
|
2009-12-01 08:11:38 +01:00
|
|
|
},
|
|
|
|
minTime: 0,
|
|
|
|
maxTime: 24
|
2009-10-05 07:47:26 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
views.agendaWeek = function(element, options) {
|
|
|
|
return new Agenda(element, options, {
|
2009-12-31 03:45:39 +01:00
|
|
|
render: function(date, delta, width, height, fetchEvents) {
|
2009-10-05 07:47:26 +02:00
|
|
|
if (delta) {
|
|
|
|
addDays(date, delta * 7);
|
|
|
|
}
|
2009-11-01 00:51:30 +01:00
|
|
|
var visStart = this.visStart = cloneDate(
|
|
|
|
this.start = addDays(cloneDate(date), -((date.getDay() - options.firstDay + 7) % 7))
|
|
|
|
),
|
|
|
|
visEnd = this.visEnd = cloneDate(
|
|
|
|
this.end = addDays(cloneDate(visStart), 7)
|
|
|
|
);
|
|
|
|
if (!options.weekends) {
|
|
|
|
skipWeekend(visStart);
|
|
|
|
skipWeekend(visEnd, -1, true);
|
|
|
|
}
|
2009-10-05 07:47:26 +02:00
|
|
|
this.title = formatDates(
|
2009-11-01 00:51:30 +01:00
|
|
|
visStart,
|
|
|
|
addDays(cloneDate(visEnd), -1),
|
2009-10-10 10:12:40 +02:00
|
|
|
this.option('titleFormat'),
|
2009-10-05 07:47:26 +02:00
|
|
|
options
|
|
|
|
);
|
2009-12-31 03:45:39 +01:00
|
|
|
this.renderAgenda(
|
|
|
|
options.weekends ? 7 : 5,
|
|
|
|
this.option('columnFormat'),
|
|
|
|
width, height,
|
|
|
|
fetchEvents
|
|
|
|
);
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
views.agendaDay = function(element, options) {
|
|
|
|
return new Agenda(element, options, {
|
2009-12-31 03:45:39 +01:00
|
|
|
render: function(date, delta, width, height, fetchEvents) {
|
2009-10-05 07:47:26 +02:00
|
|
|
if (delta) {
|
|
|
|
addDays(date, delta);
|
2009-11-01 00:51:30 +01:00
|
|
|
if (!options.weekends) {
|
|
|
|
skipWeekend(date, delta < 0 ? -1 : 1);
|
|
|
|
}
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
2009-10-10 10:12:40 +02:00
|
|
|
this.title = formatDate(date, this.option('titleFormat'), options);
|
2009-10-05 07:47:26 +02:00
|
|
|
this.start = this.visStart = cloneDate(date, true);
|
|
|
|
this.end = this.visEnd = addDays(cloneDate(this.start), 1);
|
2009-12-31 03:45:39 +01:00
|
|
|
this.renderAgenda(
|
|
|
|
1,
|
|
|
|
this.option('columnFormat'),
|
|
|
|
width, height,
|
|
|
|
fetchEvents
|
|
|
|
);
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
function Agenda(element, options, methods) {
|
|
|
|
|
|
|
|
var head, body, bodyContent, bodyTable, bg,
|
|
|
|
colCnt,
|
2009-10-19 10:53:07 +02:00
|
|
|
axisWidth, colWidth, slotHeight,
|
2009-12-31 03:45:39 +01:00
|
|
|
viewWidth, viewHeight,
|
2010-01-20 04:49:15 +01:00
|
|
|
cachedEvents=[],
|
|
|
|
daySegmentContainer,
|
|
|
|
daySegments=[],
|
|
|
|
slotSegmentContainer,
|
|
|
|
slotSegments=[],
|
2009-10-05 07:47:26 +02:00
|
|
|
tm, firstDay,
|
2009-11-01 00:51:30 +01:00
|
|
|
nwe, // no weekends (int)
|
2009-10-05 07:47:26 +02:00
|
|
|
rtl, dis, dit, // day index sign / translate
|
2009-11-30 05:16:47 +01:00
|
|
|
minMinute, maxMinute,
|
2010-01-25 07:56:57 +01:00
|
|
|
colContentPositions = new HorizontalPositionCache(function(col) {
|
|
|
|
return bg.find('td:eq(' + col + ') div div');
|
|
|
|
}),
|
2009-10-05 07:47:26 +02:00
|
|
|
// ...
|
|
|
|
|
|
|
|
view = $.extend(this, viewMethods, methods, {
|
|
|
|
renderAgenda: renderAgenda,
|
|
|
|
renderEvents: renderEvents,
|
|
|
|
rerenderEvents: rerenderEvents,
|
2010-01-25 07:56:57 +01:00
|
|
|
clearEvents: clearEvents,
|
2009-10-05 07:47:26 +02:00
|
|
|
updateSize: updateSize,
|
2009-10-19 07:33:14 +02:00
|
|
|
shown: resetScroll,
|
2009-10-05 07:47:26 +02:00
|
|
|
defaultEventEnd: function(event) {
|
2009-10-10 10:12:40 +02:00
|
|
|
var start = cloneDate(event.start);
|
|
|
|
if (event.allDay) {
|
|
|
|
return start;
|
|
|
|
}
|
|
|
|
return addMinutes(start, options.defaultEventMinutes);
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
view.init(element, options);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Time-slot rendering
|
|
|
|
-----------------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
|
|
element.addClass('fc-agenda').css('position', 'relative');
|
|
|
|
if (element.disableSelection) {
|
|
|
|
element.disableSelection();
|
|
|
|
}
|
|
|
|
|
2009-12-31 03:45:39 +01:00
|
|
|
function renderAgenda(c, colFormat, width, height, fetchEvents) {
|
2009-10-05 07:47:26 +02:00
|
|
|
colCnt = c;
|
|
|
|
|
|
|
|
// update option-derived variables
|
2009-11-01 00:51:30 +01:00
|
|
|
tm = options.theme ? 'ui' : 'fc';
|
|
|
|
nwe = options.weekends ? 0 : 1;
|
2009-10-05 07:47:26 +02:00
|
|
|
firstDay = options.firstDay;
|
|
|
|
if (rtl = options.isRTL) {
|
|
|
|
dis = -1;
|
|
|
|
dit = colCnt - 1;
|
|
|
|
}else{
|
|
|
|
dis = 1;
|
|
|
|
dit = 0;
|
|
|
|
}
|
2009-12-01 08:11:38 +01:00
|
|
|
minMinute = parseTime(options.minTime);
|
|
|
|
maxMinute = parseTime(options.maxTime);
|
2009-10-05 07:47:26 +02:00
|
|
|
|
|
|
|
var d0 = rtl ? addDays(cloneDate(view.visEnd), -1) : cloneDate(view.visStart),
|
|
|
|
d = cloneDate(d0),
|
|
|
|
today = clearTime(new Date());
|
|
|
|
|
|
|
|
if (!head) { // first time rendering, build from scratch
|
|
|
|
|
|
|
|
var i,
|
|
|
|
minutes,
|
|
|
|
slotNormal = options.slotMinutes % 15 == 0, //...
|
|
|
|
|
|
|
|
// head
|
2009-10-10 10:12:40 +02:00
|
|
|
s = "<div class='fc-agenda-head' style='position:relative;z-index:4'>" +
|
2009-10-05 07:47:26 +02:00
|
|
|
"<table style='width:100%'>" +
|
2009-10-15 08:14:21 +02:00
|
|
|
"<tr class='fc-first" + (options.allDaySlot ? '' : ' fc-last') + "'>" +
|
2009-10-05 07:47:26 +02:00
|
|
|
"<th class='fc-leftmost " +
|
|
|
|
tm + "-state-default'> </th>";
|
|
|
|
for (i=0; i<colCnt; i++) {
|
|
|
|
s += "<th class='fc-" +
|
|
|
|
dayIDs[d.getDay()] + ' ' + // needs to be first
|
|
|
|
tm + '-state-default' +
|
|
|
|
"'>" + formatDate(d, colFormat, options) + "</th>";
|
|
|
|
addDays(d, dis);
|
2009-11-01 00:51:30 +01:00
|
|
|
if (nwe) {
|
|
|
|
skipWeekend(d, dis);
|
|
|
|
}
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
2009-11-01 00:51:30 +01:00
|
|
|
s += "<th class='" + tm + "-state-default'> </th></tr>";
|
2009-10-15 08:14:21 +02:00
|
|
|
if (options.allDaySlot) {
|
2009-11-01 00:51:30 +01:00
|
|
|
s += "<tr class='fc-all-day'>" +
|
2009-10-12 08:35:33 +02:00
|
|
|
"<th class='fc-axis fc-leftmost " + tm + "-state-default'>" + options.allDayText + "</th>" +
|
2009-10-10 10:12:40 +02:00
|
|
|
"<td colspan='" + colCnt + "' class='" + tm + "-state-default'>" +
|
|
|
|
"<div class='fc-day-content'><div> </div></div></td>" +
|
|
|
|
"<th class='" + tm + "-state-default'> </th>" +
|
|
|
|
"</tr><tr class='fc-divider fc-last'><th colspan='" + (colCnt+2) + "' class='" +
|
|
|
|
tm + "-state-default fc-leftmost'><div/></th></tr>";
|
|
|
|
}
|
|
|
|
s+= "</table></div>";
|
2009-10-05 07:47:26 +02:00
|
|
|
head = $(s).appendTo(element);
|
|
|
|
head.find('td').click(slotClick);
|
|
|
|
|
2010-01-20 04:49:15 +01:00
|
|
|
// all-day event container
|
|
|
|
daySegmentContainer = $("<div/>").appendTo(head);
|
|
|
|
|
2009-10-05 07:47:26 +02:00
|
|
|
// body
|
2009-11-01 00:51:30 +01:00
|
|
|
d = zeroDate();
|
2009-11-30 05:16:47 +01:00
|
|
|
var maxd = addMinutes(cloneDate(d), maxMinute);
|
|
|
|
addMinutes(d, minMinute);
|
2009-10-05 07:47:26 +02:00
|
|
|
s = "<table>";
|
2009-11-30 05:16:47 +01:00
|
|
|
for (i=0; d < maxd; i++) {
|
2009-10-05 07:47:26 +02:00
|
|
|
minutes = d.getMinutes();
|
|
|
|
s += "<tr class='" +
|
|
|
|
(i==0 ? 'fc-first' : (minutes==0 ? '' : 'fc-minor')) +
|
|
|
|
"'><th class='fc-axis fc-leftmost " + tm + "-state-default'>" +
|
|
|
|
((!slotNormal || minutes==0) ? formatDate(d, options.axisFormat) : ' ') +
|
|
|
|
"</th><td class='fc-slot" + i + ' ' +
|
2009-10-10 10:12:40 +02:00
|
|
|
tm + "-state-default'><div> </div></td></tr>";
|
2009-10-05 07:47:26 +02:00
|
|
|
addMinutes(d, options.slotMinutes);
|
|
|
|
}
|
|
|
|
s += "</table>";
|
|
|
|
body = $("<div class='fc-agenda-body' style='position:relative;z-index:2;overflow:auto'/>")
|
|
|
|
.append(bodyContent = $("<div style='position:relative;overflow:hidden'>")
|
|
|
|
.append(bodyTable = $(s)))
|
|
|
|
.appendTo(element);
|
|
|
|
body.find('td').click(slotClick);
|
|
|
|
|
2010-01-20 04:49:15 +01:00
|
|
|
// slot event container
|
|
|
|
slotSegmentContainer = $("<div/>").appendTo(bodyContent);
|
|
|
|
|
2009-10-05 07:47:26 +02:00
|
|
|
// background stripes
|
|
|
|
d = cloneDate(d0);
|
|
|
|
s = "<div class='fc-agenda-bg' style='position:absolute;z-index:1'>" +
|
|
|
|
"<table style='width:100%;height:100%'><tr class='fc-first'>";
|
|
|
|
for (i=0; i<colCnt; i++) {
|
|
|
|
s += "<td class='fc-" +
|
2009-11-29 05:43:02 +01:00
|
|
|
dayIDs[d.getDay()] + ' ' + // needs to be first
|
2009-10-05 07:47:26 +02:00
|
|
|
tm + '-state-default ' +
|
|
|
|
(i==0 ? 'fc-leftmost ' : '') +
|
|
|
|
(+d == +today ? tm + '-state-highlight fc-today' : 'fc-not-today') +
|
|
|
|
"'><div class='fc-day-content'><div> </div></div></td>";
|
|
|
|
addDays(d, dis);
|
2009-11-01 00:51:30 +01:00
|
|
|
if (nwe) {
|
|
|
|
skipWeekend(d, dis);
|
|
|
|
}
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
|
|
|
s += "</tr></table></div>";
|
|
|
|
bg = $(s).appendTo(element);
|
|
|
|
|
|
|
|
}else{ // skeleton already built, just modify it
|
|
|
|
|
2009-12-31 03:45:39 +01:00
|
|
|
clearEvents();
|
2009-10-05 07:47:26 +02:00
|
|
|
|
|
|
|
// redo column header text and class
|
|
|
|
head.find('tr:first th').slice(1, -1).each(function() {
|
|
|
|
$(this).text(formatDate(d, colFormat, options));
|
|
|
|
this.className = this.className.replace(/^fc-\w+(?= )/, 'fc-' + dayIDs[d.getDay()]);
|
|
|
|
addDays(d, dis);
|
2009-11-01 00:51:30 +01:00
|
|
|
if (nwe) {
|
|
|
|
skipWeekend(d, dis);
|
|
|
|
}
|
2009-10-05 07:47:26 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
// change classes of background stripes
|
|
|
|
d = cloneDate(d0);
|
|
|
|
bg.find('td').each(function() {
|
|
|
|
this.className = this.className.replace(/^fc-\w+(?= )/, 'fc-' + dayIDs[d.getDay()]);
|
|
|
|
if (+d == +today) {
|
|
|
|
$(this)
|
|
|
|
.removeClass('fc-not-today')
|
|
|
|
.addClass('fc-today')
|
|
|
|
.addClass(tm + '-state-highlight');
|
|
|
|
}else{
|
|
|
|
$(this)
|
|
|
|
.addClass('fc-not-today')
|
|
|
|
.removeClass('fc-today')
|
|
|
|
.removeClass(tm + '-state-highlight');
|
|
|
|
}
|
|
|
|
addDays(d, dis);
|
2009-11-01 00:51:30 +01:00
|
|
|
if (nwe) {
|
|
|
|
skipWeekend(d, dis);
|
|
|
|
}
|
2009-10-05 07:47:26 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2009-12-31 03:45:39 +01:00
|
|
|
updateSize(width, height);
|
2009-10-19 07:33:14 +02:00
|
|
|
resetScroll();
|
2009-10-05 07:47:26 +02:00
|
|
|
fetchEvents(renderEvents);
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2009-10-19 07:33:14 +02:00
|
|
|
function resetScroll() {
|
2009-11-01 00:51:30 +01:00
|
|
|
var d0 = zeroDate(),
|
2009-10-19 07:33:14 +02:00
|
|
|
scrollDate = cloneDate(d0);
|
|
|
|
scrollDate.setHours(options.firstHour);
|
2009-10-19 10:53:07 +02:00
|
|
|
var go = function() {
|
|
|
|
body.scrollTop(timePosition(d0, scrollDate) + 1); // +1 for the border
|
|
|
|
// TODO: +1 doesn't apply when firstHour=0
|
|
|
|
}
|
|
|
|
if ($.browser.opera) {
|
|
|
|
setTimeout(go, 0); // opera 10 (and earlier?) needs this
|
|
|
|
}else{
|
|
|
|
go();
|
|
|
|
}
|
2009-10-19 07:33:14 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-12-31 03:45:39 +01:00
|
|
|
function updateSize(width, height) {
|
|
|
|
viewWidth = width;
|
|
|
|
viewHeight = height;
|
2010-01-25 07:56:57 +01:00
|
|
|
colContentPositions.clear();
|
2009-10-05 07:47:26 +02:00
|
|
|
|
2010-01-25 07:56:57 +01:00
|
|
|
body.width(width);
|
2009-11-29 09:12:36 +01:00
|
|
|
body.height(height - head.height());
|
2010-01-25 07:56:57 +01:00
|
|
|
bodyTable.width('');
|
2009-10-05 07:47:26 +02:00
|
|
|
|
|
|
|
var topTDs = head.find('tr:first th'),
|
|
|
|
stripeTDs = bg.find('td'),
|
2010-01-25 07:56:57 +01:00
|
|
|
contentWidth = slotSegmentContainer.width(); // body[0].clientWidth isn't reliable here in IE6
|
|
|
|
|
2009-10-05 07:47:26 +02:00
|
|
|
bodyTable.width(contentWidth);
|
|
|
|
|
|
|
|
// time-axis width
|
2009-10-13 06:22:40 +02:00
|
|
|
axisWidth = 0;
|
2009-10-05 07:47:26 +02:00
|
|
|
setOuterWidth(
|
2009-10-10 10:12:40 +02:00
|
|
|
head.find('tr:lt(2) th:first').add(body.find('tr:first th'))
|
2009-10-05 07:47:26 +02:00
|
|
|
.width('')
|
|
|
|
.each(function() {
|
2009-10-13 06:22:40 +02:00
|
|
|
axisWidth = Math.max(axisWidth, $(this).outerWidth());
|
2009-10-19 10:53:07 +02:00
|
|
|
}),
|
2009-10-13 06:22:40 +02:00
|
|
|
axisWidth
|
2009-10-05 07:47:26 +02:00
|
|
|
);
|
|
|
|
|
|
|
|
// column width
|
2009-10-13 06:22:40 +02:00
|
|
|
colWidth = Math.floor((contentWidth - axisWidth) / colCnt);
|
2009-10-05 07:47:26 +02:00
|
|
|
setOuterWidth(stripeTDs.slice(0, -1), colWidth);
|
|
|
|
setOuterWidth(topTDs.slice(1, -2), colWidth);
|
2009-10-13 06:22:40 +02:00
|
|
|
setOuterWidth(topTDs.slice(-2, -1), contentWidth - axisWidth - colWidth*(colCnt-1));
|
2009-10-05 07:47:26 +02:00
|
|
|
|
|
|
|
bg.css({
|
|
|
|
top: head.find('tr').height(),
|
2009-10-13 06:22:40 +02:00
|
|
|
left: axisWidth,
|
|
|
|
width: contentWidth - axisWidth,
|
2009-11-29 09:12:36 +01:00
|
|
|
height: height
|
2009-10-05 07:47:26 +02:00
|
|
|
});
|
|
|
|
|
2009-10-13 06:22:40 +02:00
|
|
|
slotHeight = body.find('tr:first div').height() + 1;
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
function slotClick(ev) {
|
|
|
|
var col = Math.floor((ev.pageX - bg.offset().left) / colWidth),
|
|
|
|
date = addDays(cloneDate(view.visStart), dit + dis*col),
|
|
|
|
rowMatch = this.className.match(/fc-slot(\d+)/);
|
|
|
|
if (rowMatch) {
|
|
|
|
var mins = parseInt(rowMatch[1]) * options.slotMinutes,
|
|
|
|
hours = Math.floor(mins/60);
|
|
|
|
date.setHours(hours);
|
2009-11-30 05:16:47 +01:00
|
|
|
date.setMinutes(mins%60 + minMinute);
|
2009-10-05 07:47:26 +02:00
|
|
|
view.trigger('dayClick', this, date, false, ev);
|
|
|
|
}else{
|
|
|
|
view.trigger('dayClick', this, date, true, ev);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2009-10-10 10:12:40 +02:00
|
|
|
/* Event Rendering
|
|
|
|
-----------------------------------------------------------------------------*/
|
2009-10-05 07:47:26 +02:00
|
|
|
|
|
|
|
function renderEvents(events) {
|
2009-12-31 03:45:39 +01:00
|
|
|
view.reportEvents(cachedEvents = events);
|
2009-10-10 10:12:40 +02:00
|
|
|
var i, len=events.length,
|
|
|
|
dayEvents=[],
|
|
|
|
slotEvents=[];
|
2009-10-05 07:47:26 +02:00
|
|
|
for (i=0; i<len; i++) {
|
2009-10-10 10:12:40 +02:00
|
|
|
if (events[i].allDay) {
|
|
|
|
dayEvents.push(events[i]);
|
2009-10-05 07:47:26 +02:00
|
|
|
}else{
|
2009-10-10 10:12:40 +02:00
|
|
|
slotEvents.push(events[i]);
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
|
|
|
}
|
2010-01-20 04:49:15 +01:00
|
|
|
renderDaySegs(daySegments = stackSegs(view.sliceSegs(dayEvents, $.map(dayEvents, visEventEnd), view.visStart, view.visEnd)));
|
|
|
|
renderSlotSegs(slotSegments = compileSlotSegs(slotEvents));
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-12-31 03:45:39 +01:00
|
|
|
function rerenderEvents() {
|
|
|
|
clearEvents();
|
|
|
|
renderEvents(cachedEvents);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function clearEvents() {
|
2010-01-26 08:05:57 +01:00
|
|
|
daySegmentContainer.empty();
|
|
|
|
slotSegmentContainer.empty();
|
2009-12-31 03:45:39 +01:00
|
|
|
view._clearEvents(); // only clears the hashes
|
2009-10-10 10:12:40 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function compileSlotSegs(events) {
|
2009-11-30 05:16:47 +01:00
|
|
|
var d = addMinutes(cloneDate(view.visStart), minMinute),
|
2009-12-31 03:45:39 +01:00
|
|
|
ends = $.map(events, visEventEnd),
|
2009-10-10 10:12:40 +02:00
|
|
|
levels,
|
|
|
|
segCols = [],
|
|
|
|
i=0;
|
|
|
|
for (; i<colCnt; i++) {
|
2009-12-31 03:45:39 +01:00
|
|
|
levels = stackSegs(view.sliceSegs(events, ends, d, addMinutes(cloneDate(d), maxMinute-minMinute)));
|
2009-10-10 10:12:40 +02:00
|
|
|
countForwardSegs(levels);
|
|
|
|
segCols.push(levels);
|
2009-11-30 05:16:47 +01:00
|
|
|
addDays(d, 1, true);
|
2009-10-10 10:12:40 +02:00
|
|
|
}
|
|
|
|
return segCols;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-01-20 04:49:15 +01:00
|
|
|
|
2009-10-10 10:12:40 +02:00
|
|
|
// renders 'all-day' events at the top
|
|
|
|
|
|
|
|
function renderDaySegs(segRow) {
|
2010-01-20 04:49:15 +01:00
|
|
|
if (options.allDaySlot) {
|
2010-01-25 07:56:57 +01:00
|
|
|
_renderDaySegs(
|
|
|
|
[segRow],
|
|
|
|
view,
|
|
|
|
axisWidth,
|
|
|
|
viewWidth,
|
|
|
|
function() {
|
|
|
|
return head.find('tr.fc-all-day')
|
|
|
|
},
|
|
|
|
function(dayOfWeek) {
|
|
|
|
return axisWidth + colContentPositions.left(day2col(dayOfWeek));
|
|
|
|
},
|
|
|
|
function(dayOfWeek) {
|
|
|
|
return axisWidth + colContentPositions.right(day2col(dayOfWeek));
|
|
|
|
},
|
|
|
|
daySegmentContainer,
|
|
|
|
bootstrapDayEventHandlers
|
|
|
|
);
|
|
|
|
updateSize(viewWidth, viewHeight); // might have pushed the body down, so resize
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-10-10 10:12:40 +02:00
|
|
|
|
2009-10-05 07:47:26 +02:00
|
|
|
// renders events in the 'time slots' at the bottom
|
|
|
|
|
|
|
|
function renderSlotSegs(segCols) {
|
2010-01-25 07:56:57 +01:00
|
|
|
|
|
|
|
var event,
|
2010-01-20 04:49:15 +01:00
|
|
|
className,
|
2010-01-25 07:56:57 +01:00
|
|
|
top,
|
|
|
|
bottom,
|
|
|
|
leftmost,
|
|
|
|
availWidth,
|
|
|
|
forward,
|
|
|
|
width,
|
|
|
|
left,
|
|
|
|
eventTops=[],
|
2010-01-20 04:49:15 +01:00
|
|
|
eventLefts=[],
|
|
|
|
eventOuterWidths=[],
|
2010-01-25 07:56:57 +01:00
|
|
|
eventOuterHeights=[],
|
|
|
|
html='',
|
|
|
|
eventElements,
|
|
|
|
eventElement,
|
|
|
|
triggerRes,
|
|
|
|
eventVSides=[],
|
|
|
|
eventHSides=[],
|
|
|
|
eventTitleTops=[],
|
|
|
|
height;
|
|
|
|
|
|
|
|
// calculate desired position/dimensions, create html
|
|
|
|
eachLeaf(segCols, function(l, seg, segI, levelI, colI) {
|
|
|
|
event = seg.event;
|
|
|
|
className = 'fc-event fc-event-vert ';
|
|
|
|
if (seg.isStart) {
|
|
|
|
className += 'fc-corner-top ';
|
|
|
|
}
|
|
|
|
if (seg.isEnd) {
|
|
|
|
className += 'fc-corner-bottom ';
|
|
|
|
}
|
|
|
|
top = timePosition(seg.start, seg.start);
|
|
|
|
bottom = timePosition(seg.start, seg.end);
|
|
|
|
leftmost = axisWidth + colContentPositions.left(colI*dis + dit);
|
|
|
|
availWidth = axisWidth + colContentPositions.right(colI*dis + dit) - leftmost;
|
|
|
|
availWidth = Math.min(availWidth-6, availWidth*.95); // TODO: move this to CSS
|
|
|
|
forward = seg.forward || 0;
|
|
|
|
if (levelI) {
|
|
|
|
// indented and thin
|
|
|
|
width = availWidth / (levelI + forward + 1);
|
|
|
|
}else{
|
|
|
|
if (forward) {
|
|
|
|
// moderately wide, aligned left still
|
|
|
|
width = ((availWidth / (forward + 1)) - (12/2)) * 2; // 12 is the predicted width of resizer =
|
|
|
|
}else{
|
|
|
|
// can be entire width, aligned left
|
|
|
|
width = availWidth;
|
2010-01-20 04:49:15 +01:00
|
|
|
}
|
|
|
|
}
|
2010-01-25 07:56:57 +01:00
|
|
|
left = leftmost + // leftmost possible
|
|
|
|
(availWidth / (levelI + forward + 1) * levelI) // indentation
|
|
|
|
* dis + (rtl ? availWidth - width : 0); // rtl
|
|
|
|
eventTops[l] = top;
|
|
|
|
eventLefts[l] = left;
|
|
|
|
eventOuterWidths[l] = width;
|
|
|
|
eventOuterHeights[l] = bottom - top;
|
|
|
|
html +=
|
|
|
|
"<div class='" + className + event.className.join(' ') + "' style='position:absolute;z-index:8;top:" + top + "px;left:" + left + "px'>" +
|
|
|
|
"<a" + (event.url ? " href='" + htmlEscape(event.url) + "'" : '') + ">" +
|
|
|
|
"<span class='fc-event-time'>" + htmlEscape(formatDates(event.start, event.end, view.option('timeFormat'))) + "</span>" +
|
|
|
|
"<span class='fc-event-title'>" + htmlEscape(event.title) + "</span>" +
|
|
|
|
"<span class='fc-event-bg'/>" +
|
|
|
|
"</a>" +
|
|
|
|
((event.editable || event.editable == undefined && options.editable) && !options.disableResizing && $.fn.resizable ?
|
|
|
|
"<div class='ui-resizable-handle ui-resizable-s'>=</div>"
|
|
|
|
: '') +
|
|
|
|
"</div>";
|
|
|
|
});
|
|
|
|
slotSegmentContainer.html(html);
|
|
|
|
eventElements = slotSegmentContainer.children();
|
|
|
|
|
|
|
|
// retrieve elements, run through eventRender callback, record outer-edge dimensions
|
|
|
|
eachLeaf(segCols, function(l, seg) {
|
|
|
|
event = seg.event;
|
|
|
|
eventElement = eventElements.eq(l);
|
|
|
|
triggerRes = view.trigger('eventRender', event, event, eventElement);
|
|
|
|
if (triggerRes === false) {
|
|
|
|
eventElement.remove();
|
|
|
|
}else{
|
|
|
|
if (triggerRes && triggerRes !== true) {
|
|
|
|
eventElement.remove();
|
|
|
|
eventElement = $(triggerRes)
|
|
|
|
.css({
|
|
|
|
top: eventTops[l],
|
|
|
|
left: eventLefts[l]
|
|
|
|
})
|
|
|
|
.appendTo(slotSegmentContainer);
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
2010-01-25 07:56:57 +01:00
|
|
|
seg.element = eventElement;
|
|
|
|
eventVSides[l] = vsides(eventElement, true);
|
|
|
|
eventHSides[l] = hsides(eventElement, true);
|
|
|
|
eventTitleTops[l] = eventElement.find('span.fc-event-title').position().top;
|
|
|
|
bootstrapSlotEventHandlers(event, seg, eventElement);
|
|
|
|
view.reportEventElement(event, eventElement);
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
2010-01-25 07:56:57 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
// set all positions/dimensions at once
|
|
|
|
eachLeaf(segCols, function(l, seg) {
|
|
|
|
if (eventElement = seg.element) {
|
|
|
|
eventElement
|
|
|
|
.width(eventOuterWidths[l] - eventHSides[l])
|
|
|
|
.height(height = eventOuterHeights[l] - eventVSides[l]);
|
|
|
|
event = seg.event;
|
|
|
|
if (height - eventTitleTops[l] < 10) {
|
|
|
|
// not enough room for title, put it in the time header
|
|
|
|
eventElement.find('span.fc-event-time')
|
|
|
|
.text(formatDate(event.start, view.option('timeFormat')) + ' - ' + event.title);
|
|
|
|
eventElement.find('span.fc-event-title')
|
|
|
|
.remove();
|
|
|
|
}
|
|
|
|
view.trigger('eventAfterRender', event, event, eventElement);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
2009-12-31 03:45:39 +01:00
|
|
|
|
|
|
|
|
2010-01-20 04:49:15 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
2009-12-31 03:45:39 +01:00
|
|
|
function visEventEnd(event) { // returns exclusive 'visible' end, for rendering
|
|
|
|
if (event.allDay) {
|
|
|
|
if (event.end) {
|
|
|
|
var end = cloneDate(event.end);
|
|
|
|
return (event.allDay || end.getHours() || end.getMinutes()) ? addDays(end, 1) : end;
|
|
|
|
}else{
|
|
|
|
return addDays(cloneDate(event.start), 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (event.end) {
|
|
|
|
return cloneDate(event.end);
|
|
|
|
}else{
|
|
|
|
return addMinutes(cloneDate(event.start), options.defaultEventMinutes);
|
|
|
|
}
|
|
|
|
}
|
2010-01-25 07:56:57 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function bootstrapDayEventHandlers(event, seg, eventElement) {
|
|
|
|
var attached = false;
|
|
|
|
eventElement.mouseover(function(ev) {
|
|
|
|
if (!attached) {
|
|
|
|
view.eventElementHandlers(event, eventElement);
|
|
|
|
if (event.editable || event.editable == undefined && options.editable) {
|
|
|
|
draggableDayEvent(event, eventElement, seg.isStart);
|
|
|
|
if (seg.isEnd) {
|
|
|
|
view.resizableDayEvent(event, eventElement, colWidth);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
attached = true;
|
|
|
|
view.trigger('eventMouseover', this, event, ev);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function bootstrapSlotEventHandlers(event, seg, eventElement) {
|
|
|
|
var attached = false;
|
|
|
|
eventElement.mouseover(function(ev) {
|
|
|
|
if (!attached) {
|
|
|
|
view.eventElementHandlers(event, eventElement);
|
|
|
|
if (event.editable || event.editable == undefined && options.editable) {
|
|
|
|
var timeElement = eventElement.find('span.fc-event-time');
|
|
|
|
draggableSlotEvent(event, eventElement, timeElement);
|
|
|
|
if (seg.isEnd) {
|
|
|
|
resizableSlotEvent(event, eventElement, timeElement);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
attached = true;
|
|
|
|
view.trigger('eventMouseover', this, event, ev);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2009-10-10 10:12:40 +02:00
|
|
|
|
2009-10-05 07:47:26 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
2009-10-10 10:12:40 +02:00
|
|
|
/* Event Dragging
|
|
|
|
-----------------------------------------------------------------------------*/
|
2009-10-05 07:47:26 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
2009-10-10 10:12:40 +02:00
|
|
|
// when event starts out FULL-DAY
|
2009-10-05 07:47:26 +02:00
|
|
|
|
2009-10-10 10:12:40 +02:00
|
|
|
function draggableDayEvent(event, eventElement, isStart) {
|
2009-10-12 08:35:33 +02:00
|
|
|
if (!options.disableDragging && eventElement.draggable) {
|
|
|
|
var origPosition, origWidth,
|
|
|
|
resetElement,
|
|
|
|
allDay=true,
|
|
|
|
matrix;
|
|
|
|
eventElement.draggable({
|
|
|
|
zIndex: 9,
|
|
|
|
opacity: view.option('dragOpacity', 'month'), // use whatever the month view was using
|
|
|
|
revertDuration: options.dragRevertDuration,
|
|
|
|
start: function(ev, ui) {
|
|
|
|
view.hideEvents(event, eventElement);
|
|
|
|
view.trigger('eventDragStart', eventElement, event, ev, ui);
|
|
|
|
origPosition = eventElement.position();
|
|
|
|
origWidth = eventElement.width();
|
|
|
|
resetElement = function() {
|
|
|
|
if (!allDay) {
|
|
|
|
eventElement
|
|
|
|
.width(origWidth)
|
|
|
|
.height('')
|
|
|
|
.draggable('option', 'grid', null);
|
|
|
|
allDay = true;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
matrix = new HoverMatrix(function(cell) {
|
|
|
|
eventElement.draggable('option', 'revert', !cell || !cell.rowDelta && !cell.colDelta);
|
|
|
|
if (cell) {
|
|
|
|
if (!cell.row) { // on full-days
|
|
|
|
resetElement();
|
|
|
|
view.showOverlay(cell);
|
|
|
|
}else{ // mouse is over bottom slots
|
|
|
|
if (isStart && allDay) {
|
|
|
|
// convert event to temporary slot-event
|
|
|
|
setOuterHeight(
|
|
|
|
eventElement.width(colWidth - 10), // don't use entire width
|
2009-10-13 06:22:40 +02:00
|
|
|
slotHeight * Math.round(
|
2009-10-12 08:35:33 +02:00
|
|
|
(event.end ? ((event.end - event.start)/MINUTE_MS) : options.defaultEventMinutes)
|
|
|
|
/options.slotMinutes)
|
|
|
|
);
|
|
|
|
eventElement.draggable('option', 'grid', [colWidth, 1]);
|
|
|
|
allDay = false;
|
|
|
|
}
|
|
|
|
view.hideOverlay();
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
2009-10-12 08:35:33 +02:00
|
|
|
}else{ // mouse is outside of everything
|
2009-10-10 10:12:40 +02:00
|
|
|
view.hideOverlay();
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
2009-10-12 08:35:33 +02:00
|
|
|
});
|
|
|
|
matrix.row(head.find('td'));
|
|
|
|
bg.find('td').each(function() {
|
|
|
|
matrix.col(this);
|
|
|
|
});
|
|
|
|
matrix.row(body);
|
|
|
|
matrix.mouse(ev.pageX, ev.pageY);
|
|
|
|
},
|
|
|
|
drag: function(ev, ui) {
|
|
|
|
matrix.mouse(ev.pageX, ev.pageY);
|
|
|
|
},
|
|
|
|
stop: function(ev, ui) {
|
|
|
|
view.hideOverlay();
|
|
|
|
view.trigger('eventDragStop', eventElement, event, ev, ui);
|
|
|
|
var cell = matrix.cell,
|
|
|
|
dayDelta = dis * (
|
|
|
|
allDay ? // can't trust cell.colDelta when using slot grid
|
|
|
|
(cell ? cell.colDelta : 0) :
|
|
|
|
Math.floor((ui.position.left - origPosition.left) / colWidth)
|
|
|
|
);
|
|
|
|
if (!cell || !dayDelta && !cell.rowDelta) {
|
|
|
|
// over nothing (has reverted)
|
|
|
|
resetElement();
|
2009-10-13 06:22:40 +02:00
|
|
|
if ($.browser.msie) {
|
|
|
|
eventElement.css('filter', ''); // clear IE opacity side-effects
|
|
|
|
}
|
2009-10-12 08:35:33 +02:00
|
|
|
view.showEvents(event, eventElement);
|
|
|
|
}else{
|
2009-10-13 06:22:40 +02:00
|
|
|
eventElement.find('a').removeAttr('href'); // prevents safari from visiting the link
|
2009-10-12 08:35:33 +02:00
|
|
|
view.eventDrop(
|
|
|
|
this, event, dayDelta,
|
|
|
|
allDay ? 0 : // minute delta
|
2009-10-13 06:22:40 +02:00
|
|
|
Math.round((eventElement.offset().top - bodyContent.offset().top) / slotHeight)
|
2009-10-12 08:35:33 +02:00
|
|
|
* options.slotMinutes
|
2009-11-30 05:16:47 +01:00
|
|
|
+ minMinute
|
2009-10-12 08:35:33 +02:00
|
|
|
- (event.start.getHours() * 60 + event.start.getMinutes()),
|
|
|
|
allDay, ev, ui
|
|
|
|
);
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
|
|
|
}
|
2009-10-12 08:35:33 +02:00
|
|
|
});
|
|
|
|
}
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2009-10-10 10:12:40 +02:00
|
|
|
// when event starts out IN TIMESLOTS
|
|
|
|
|
|
|
|
function draggableSlotEvent(event, eventElement, timeElement) {
|
2009-10-12 08:35:33 +02:00
|
|
|
if (!options.disableDragging && eventElement.draggable) {
|
|
|
|
var origPosition,
|
|
|
|
resetElement,
|
|
|
|
prevSlotDelta, slotDelta,
|
|
|
|
allDay=false,
|
|
|
|
matrix;
|
|
|
|
eventElement.draggable({
|
|
|
|
zIndex: 9,
|
|
|
|
scroll: false,
|
2009-10-13 06:22:40 +02:00
|
|
|
grid: [colWidth, slotHeight],
|
2009-10-12 08:35:33 +02:00
|
|
|
axis: colCnt==1 ? 'y' : false,
|
|
|
|
opacity: view.option('dragOpacity'),
|
|
|
|
revertDuration: options.dragRevertDuration,
|
|
|
|
start: function(ev, ui) {
|
|
|
|
view.hideEvents(event, eventElement);
|
|
|
|
view.trigger('eventDragStart', eventElement, event, ev, ui);
|
|
|
|
if ($.browser.msie) {
|
|
|
|
eventElement.find('span.fc-event-bg').hide(); // nested opacities mess up in IE, just hide
|
2009-10-10 10:12:40 +02:00
|
|
|
}
|
2009-10-12 08:35:33 +02:00
|
|
|
origPosition = eventElement.position();
|
|
|
|
resetElement = function() {
|
|
|
|
// convert back to original slot-event
|
|
|
|
if (allDay) {
|
2009-10-13 06:22:40 +02:00
|
|
|
timeElement.css('display', ''); // show() was causing display=inline
|
|
|
|
eventElement.draggable('option', 'grid', [colWidth, slotHeight]);
|
2009-10-12 08:35:33 +02:00
|
|
|
allDay = false;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
prevSlotDelta = 0;
|
|
|
|
matrix = new HoverMatrix(function(cell) {
|
|
|
|
eventElement.draggable('option', 'revert', !cell);
|
|
|
|
if (cell) {
|
2009-10-15 08:14:21 +02:00
|
|
|
if (!cell.row && options.allDaySlot) { // over full days
|
2009-10-12 08:35:33 +02:00
|
|
|
if (!allDay) {
|
|
|
|
// convert to temporary all-day event
|
|
|
|
allDay = true;
|
2009-10-13 06:22:40 +02:00
|
|
|
timeElement.hide();
|
2009-10-12 08:35:33 +02:00
|
|
|
eventElement.draggable('option', 'grid', null);
|
2009-10-10 10:12:40 +02:00
|
|
|
}
|
2009-10-12 08:35:33 +02:00
|
|
|
view.showOverlay(cell);
|
|
|
|
}else{ // on slots
|
|
|
|
resetElement();
|
|
|
|
view.hideOverlay();
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
2009-10-12 08:35:33 +02:00
|
|
|
}else{
|
2009-10-10 10:12:40 +02:00
|
|
|
view.hideOverlay();
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
2009-10-12 08:35:33 +02:00
|
|
|
});
|
2009-10-15 08:14:21 +02:00
|
|
|
if (options.allDaySlot) {
|
2009-10-12 08:35:33 +02:00
|
|
|
matrix.row(head.find('td'));
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
2009-10-12 08:35:33 +02:00
|
|
|
bg.find('td').each(function() {
|
|
|
|
matrix.col(this);
|
|
|
|
});
|
|
|
|
matrix.row(body);
|
|
|
|
matrix.mouse(ev.pageX, ev.pageY);
|
|
|
|
},
|
|
|
|
drag: function(ev, ui) {
|
2009-10-13 06:22:40 +02:00
|
|
|
slotDelta = Math.round((ui.position.top - origPosition.top) / slotHeight);
|
2009-10-12 08:35:33 +02:00
|
|
|
if (slotDelta != prevSlotDelta) {
|
2009-10-13 06:22:40 +02:00
|
|
|
if (!allDay) {
|
2009-10-12 08:35:33 +02:00
|
|
|
// update time header
|
|
|
|
var minuteDelta = slotDelta*options.slotMinutes,
|
|
|
|
newStart = addMinutes(cloneDate(event.start), minuteDelta),
|
|
|
|
newEnd;
|
|
|
|
if (event.end) {
|
|
|
|
newEnd = addMinutes(cloneDate(event.end), minuteDelta);
|
|
|
|
}
|
|
|
|
timeElement.text(formatDates(newStart, newEnd, view.option('timeFormat')));
|
2009-10-10 10:12:40 +02:00
|
|
|
}
|
2009-10-12 08:35:33 +02:00
|
|
|
prevSlotDelta = slotDelta;
|
2009-10-10 10:12:40 +02:00
|
|
|
}
|
2009-10-12 08:35:33 +02:00
|
|
|
matrix.mouse(ev.pageX, ev.pageY);
|
|
|
|
},
|
|
|
|
stop: function(ev, ui) {
|
|
|
|
view.hideOverlay();
|
|
|
|
view.trigger('eventDragStop', eventElement, event, ev, ui);
|
|
|
|
var cell = matrix.cell,
|
|
|
|
dayDelta = dis * (
|
|
|
|
allDay ? // can't trust cell.colDelta when using slot grid
|
|
|
|
(cell ? cell.colDelta : 0) :
|
|
|
|
Math.floor((ui.position.left - origPosition.left) / colWidth)
|
|
|
|
);
|
|
|
|
if (!cell || !slotDelta && !dayDelta) {
|
|
|
|
resetElement();
|
|
|
|
if ($.browser.msie) {
|
|
|
|
eventElement
|
|
|
|
.css('filter', '') // clear IE opacity side-effects
|
|
|
|
.find('span.fc-event-bg').css('display', ''); // .show() made display=inline
|
|
|
|
}
|
|
|
|
eventElement.css(origPosition); // sometimes fast drags make event revert to wrong position
|
|
|
|
view.showEvents(event, eventElement);
|
|
|
|
}else{
|
|
|
|
view.eventDrop(
|
|
|
|
this, event, dayDelta,
|
|
|
|
allDay ? 0 : slotDelta * options.slotMinutes, // minute delta
|
|
|
|
allDay, ev, ui
|
|
|
|
);
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
|
|
|
}
|
2009-10-12 08:35:33 +02:00
|
|
|
});
|
|
|
|
}
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2009-10-10 10:12:40 +02:00
|
|
|
/* Event Resizing
|
|
|
|
-----------------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
// for TIMESLOT events
|
2009-10-05 07:47:26 +02:00
|
|
|
|
|
|
|
function resizableSlotEvent(event, eventElement, timeElement) {
|
2009-10-12 08:35:33 +02:00
|
|
|
if (!options.disableResizing && eventElement.resizable) {
|
|
|
|
var slotDelta, prevSlotDelta;
|
|
|
|
eventElement
|
|
|
|
.resizable({
|
2010-01-25 07:56:57 +01:00
|
|
|
handles: {
|
|
|
|
s: 'div.ui-resizable-s'
|
|
|
|
},
|
2009-10-13 06:22:40 +02:00
|
|
|
grid: slotHeight,
|
2009-10-12 08:35:33 +02:00
|
|
|
start: function(ev, ui) {
|
|
|
|
slotDelta = prevSlotDelta = 0;
|
|
|
|
view.hideEvents(event, eventElement);
|
|
|
|
if ($.browser.msie && $.browser.version == '6.0') {
|
|
|
|
eventElement.css('overflow', 'hidden');
|
|
|
|
}
|
|
|
|
eventElement.css('z-index', 9);
|
|
|
|
view.trigger('eventResizeStart', this, event, ev, ui);
|
|
|
|
},
|
|
|
|
resize: function(ev, ui) {
|
|
|
|
// don't rely on ui.size.height, doesn't take grid into account
|
2009-10-13 06:22:40 +02:00
|
|
|
slotDelta = Math.round((Math.max(slotHeight, eventElement.height()) - ui.originalSize.height) / slotHeight);
|
2009-10-12 08:35:33 +02:00
|
|
|
if (slotDelta != prevSlotDelta) {
|
2009-10-13 06:22:40 +02:00
|
|
|
timeElement.text(
|
|
|
|
formatDates(
|
|
|
|
event.start,
|
|
|
|
(!slotDelta && !event.end) ? null : // no change, so don't display time range
|
|
|
|
addMinutes(view.eventEnd(event), options.slotMinutes*slotDelta),
|
|
|
|
view.option('timeFormat')
|
|
|
|
)
|
|
|
|
);
|
2009-10-12 08:35:33 +02:00
|
|
|
prevSlotDelta = slotDelta;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
stop: function(ev, ui) {
|
|
|
|
view.trigger('eventResizeStop', this, event, ev, ui);
|
|
|
|
if (slotDelta) {
|
|
|
|
view.eventResize(this, event, 0, options.slotMinutes*slotDelta, ev, ui);
|
|
|
|
}else{
|
|
|
|
eventElement.css('z-index', 8);
|
|
|
|
view.showEvents(event, eventElement);
|
|
|
|
// BUG: if event was really short, need to put title back in span
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
2009-10-10 10:12:40 +02:00
|
|
|
}
|
2010-01-25 07:56:57 +01:00
|
|
|
});
|
2009-10-12 08:35:33 +02:00
|
|
|
}
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2009-10-10 10:12:40 +02:00
|
|
|
/* Misc
|
|
|
|
-----------------------------------------------------------------------------*/
|
2009-10-05 07:47:26 +02:00
|
|
|
|
2009-10-10 10:12:40 +02:00
|
|
|
// get the Y coordinate of the given time on the given day (both Date objects)
|
|
|
|
|
2009-11-30 05:16:47 +01:00
|
|
|
function timePosition(day, time) { // both date object. 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)) {
|
2009-10-10 10:12:40 +02:00
|
|
|
return bodyContent.height();
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
2009-10-10 10:12:40 +02:00
|
|
|
var slotMinutes = options.slotMinutes,
|
2009-11-30 05:16:47 +01:00
|
|
|
minutes = time.getHours()*60 + time.getMinutes() - minMinute,
|
2009-10-10 10:12:40 +02:00
|
|
|
slotI = Math.floor(minutes / slotMinutes),
|
2009-10-13 06:22:40 +02:00
|
|
|
tr = body.find('tr:eq(' + slotI + ')'),
|
|
|
|
td = tr.find('td'),
|
|
|
|
innerDiv = td.find('div');
|
|
|
|
return Math.max(0, Math.round(
|
2010-01-26 08:05:57 +01:00
|
|
|
innerDiv.position().top + topCorrect(td) - 1 + slotHeight * ((minutes % slotMinutes) / slotMinutes)
|
2009-10-13 06:22:40 +02:00
|
|
|
));
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
2010-01-25 07:56:57 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function day2col(dayOfWeek) {
|
|
|
|
return ((dayOfWeek - Math.max(firstDay,nwe)+colCnt) % colCnt)*dis+dit;
|
|
|
|
}
|
|
|
|
|
2009-10-05 07:47:26 +02:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-10-10 10:12:40 +02:00
|
|
|
// count the number of colliding, higher-level segments (for event squishing)
|
2009-10-05 07:47:26 +02:00
|
|
|
|
2009-10-10 10:12:40 +02:00
|
|
|
function countForwardSegs(levels) {
|
|
|
|
var i, j, k, level, segForward, segBack;
|
2009-10-05 07:47:26 +02:00
|
|
|
for (i=levels.length-1; i>0; i--) {
|
|
|
|
level = levels[i];
|
|
|
|
for (j=0; j<level.length; j++) {
|
2009-10-10 10:12:40 +02:00
|
|
|
segForward = level[j];
|
|
|
|
for (k=0; k<levels[i-1].length; k++) {
|
|
|
|
segBack = levels[i-1][k];
|
|
|
|
if (segsCollide(segForward, segBack)) {
|
|
|
|
segBack.forward = Math.max(segBack.forward||0, (segForward.forward||0)+1);
|
2009-10-05 07:47:26 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2009-10-10 10:12:40 +02:00
|
|
|
|