fullcalendar-rails 1.5.4.0 → 1.6.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -31,7 +31,7 @@ See the website of the original project for the usage, or my original Rails3 exa
31
31
 
32
32
  ## Versioning
33
33
 
34
- I am going to version this gem with the version of the fullceldnar code I use, adding an extra digit if I need to release any maintenance versions of the gem itself. Therefore, since this is a first version of this gem and I'm starting by bundling version 1.5.3 of the fullcalendar code, this is version 1.5.4.0
34
+ I am going to version this gem with the version of the fullceldnar code I use, adding an extra digit if I need to release any maintenance versions of the gem itself. Therefore, since this is a first version of this gem and I'm starting by bundling version 1.5.3 of the fullcalendar code, this is version 1.6.0.0
35
35
 
36
36
 
37
37
  ## Contributing
@@ -1,5 +1,5 @@
1
1
  module Fullcalendar
2
2
  module Rails
3
- VERSION = "1.5.4.0"
3
+ VERSION = "1.6.1.0"
4
4
  end
5
5
  end
@@ -1,23 +1,20 @@
1
- /**
2
- * @preserve
3
- * FullCalendar v1.5.4
4
- * http://arshaw.com/fullcalendar/
5
- *
1
+ /*!
2
+ * FullCalendar v1.6.1
3
+ * Docs & License: http://arshaw.com/fullcalendar/
4
+ * (c) 2013 Adam Shaw
5
+ */
6
+
7
+ /*
6
8
  * Use fullcalendar.css for basic styling.
7
9
  * For event drag & drop, requires jQuery UI draggable.
8
10
  * For event resizing, requires jQuery UI resizable.
9
- *
10
- * Copyright (c) 2011 Adam Shaw
11
- * Dual licensed under the MIT and GPL licenses, located in
12
- * MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
13
- *
14
- * Date: Tue Sep 4 23:38:33 2012 -0700
15
- *
16
11
  */
17
12
 
18
13
  (function($, undefined) {
19
14
 
20
15
 
16
+ ;;
17
+
21
18
  var defaults = {
22
19
 
23
20
  // display
@@ -29,6 +26,9 @@ var defaults = {
29
26
  right: 'today prev,next'
30
27
  },
31
28
  weekends: true,
29
+ weekNumbers: false,
30
+ weekNumberCalculation: 'iso',
31
+ weekNumberTitle: 'W',
32
32
 
33
33
  // editing
34
34
  //editable: false,
@@ -66,10 +66,10 @@ var defaults = {
66
66
  dayNames: ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],
67
67
  dayNamesShort: ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'],
68
68
  buttonText: {
69
- prev: ' ◄ ',
70
- next: ' ► ',
71
- prevYear: ' << ',
72
- nextYear: ' >> ',
69
+ prev: "<span class='fc-text-arrow'>&lsaquo;</span>",
70
+ next: "<span class='fc-text-arrow'>&rsaquo;</span>",
71
+ prevYear: "<span class='fc-text-arrow'>&laquo;</span>",
72
+ nextYear: "<span class='fc-text-arrow'>&raquo;</span>",
73
73
  today: 'today',
74
74
  month: 'month',
75
75
  week: 'week',
@@ -98,10 +98,10 @@ var rtlDefaults = {
98
98
  right: 'title'
99
99
  },
100
100
  buttonText: {
101
- prev: '&nbsp;&#9658;&nbsp;',
102
- next: '&nbsp;&#9668;&nbsp;',
103
- prevYear: '&nbsp;&gt;&gt;&nbsp;',
104
- nextYear: '&nbsp;&lt;&lt;&nbsp;'
101
+ prev: "<span class='fc-text-arrow'>&rsaquo;</span>",
102
+ next: "<span class='fc-text-arrow'>&lsaquo;</span>",
103
+ prevYear: "<span class='fc-text-arrow'>&raquo;</span>",
104
+ nextYear: "<span class='fc-text-arrow'>&laquo;</span>"
105
105
  },
106
106
  buttonIcons: {
107
107
  prev: 'circle-triangle-e',
@@ -111,7 +111,9 @@ var rtlDefaults = {
111
111
 
112
112
 
113
113
 
114
- var fc = $.fullCalendar = { version: "1.5.4" };
114
+ ;;
115
+
116
+ var fc = $.fullCalendar = { version: "1.6.1" };
115
117
  var fcViews = fc.views = {};
116
118
 
117
119
 
@@ -177,6 +179,8 @@ function setDefaults(d) {
177
179
 
178
180
 
179
181
 
182
+ ;;
183
+
180
184
 
181
185
  function Calendar(element, options, eventSources) {
182
186
  var t = this;
@@ -258,6 +262,9 @@ function Calendar(element, options, eventSources) {
258
262
  if (options.isRTL) {
259
263
  element.addClass('fc-rtl');
260
264
  }
265
+ else {
266
+ element.addClass('fc-ltr');
267
+ }
261
268
  if (options.theme) {
262
269
  element.addClass('ui-widget');
263
270
  }
@@ -674,6 +681,8 @@ function Calendar(element, options, eventSources) {
674
681
 
675
682
  }
676
683
 
684
+ ;;
685
+
677
686
  function Header(calendar, options) {
678
687
  var t = this;
679
688
 
@@ -747,54 +756,47 @@ function Header(calendar, options) {
747
756
  var text = smartProperty(options.buttonText, buttonName); // why are we using smartProperty here?
748
757
  var button = $(
749
758
  "<span class='fc-button fc-button-" + buttonName + " " + tm + "-state-default'>" +
750
- "<span class='fc-button-inner'>" +
751
- "<span class='fc-button-content'>" +
752
- (icon ?
753
- "<span class='fc-icon-wrap'>" +
754
- "<span class='ui-icon ui-icon-" + icon + "'/>" +
755
- "</span>" :
756
- text
757
- ) +
758
- "</span>" +
759
- "<span class='fc-button-effect'><span></span></span>" +
760
- "</span>" +
759
+ (icon ?
760
+ "<span class='fc-icon-wrap'>" +
761
+ "<span class='ui-icon ui-icon-" + icon + "'/>" +
762
+ "</span>" :
763
+ text
764
+ ) +
761
765
  "</span>"
762
- );
763
- if (button) {
764
- button
765
- .click(function() {
766
- if (!button.hasClass(tm + '-state-disabled')) {
767
- buttonClick();
768
- }
769
- })
770
- .mousedown(function() {
766
+ )
767
+ .click(function() {
768
+ if (!button.hasClass(tm + '-state-disabled')) {
769
+ buttonClick();
770
+ }
771
+ })
772
+ .mousedown(function() {
773
+ button
774
+ .not('.' + tm + '-state-active')
775
+ .not('.' + tm + '-state-disabled')
776
+ .addClass(tm + '-state-down');
777
+ })
778
+ .mouseup(function() {
779
+ button.removeClass(tm + '-state-down');
780
+ })
781
+ .hover(
782
+ function() {
771
783
  button
772
784
  .not('.' + tm + '-state-active')
773
785
  .not('.' + tm + '-state-disabled')
774
- .addClass(tm + '-state-down');
775
- })
776
- .mouseup(function() {
777
- button.removeClass(tm + '-state-down');
778
- })
779
- .hover(
780
- function() {
781
- button
782
- .not('.' + tm + '-state-active')
783
- .not('.' + tm + '-state-disabled')
784
- .addClass(tm + '-state-hover');
785
- },
786
- function() {
787
- button
788
- .removeClass(tm + '-state-hover')
789
- .removeClass(tm + '-state-down');
790
- }
791
- )
792
- .appendTo(e);
793
- if (!prevButton) {
794
- button.addClass(tm + '-corner-left');
795
- }
796
- prevButton = button;
786
+ .addClass(tm + '-state-hover');
787
+ },
788
+ function() {
789
+ button
790
+ .removeClass(tm + '-state-hover')
791
+ .removeClass(tm + '-state-down');
792
+ }
793
+ )
794
+ .appendTo(e);
795
+ disableTextSelection(button);
796
+ if (!prevButton) {
797
+ button.addClass(tm + '-corner-left');
797
798
  }
799
+ prevButton = button;
798
800
  }
799
801
  }
800
802
  });
@@ -839,6 +841,8 @@ function Header(calendar, options) {
839
841
 
840
842
  }
841
843
 
844
+ ;;
845
+
842
846
  fc.sourceNormalizers = [];
843
847
  fc.sourceFetchers = [];
844
848
 
@@ -914,6 +918,16 @@ function EventManager(options, _sources) {
914
918
  _fetchEventSource(source, function(events) {
915
919
  if (fetchID == currentFetchID) {
916
920
  if (events) {
921
+
922
+ if (options.eventDataTransform) {
923
+ events = $.map(events, options.eventDataTransform);
924
+ }
925
+ if (source.eventDataTransform) {
926
+ events = $.map(events, source.eventDataTransform);
927
+ }
928
+ // TODO: this technique is not ideal for static array event sources.
929
+ // For arrays, we'll want to process all events right in the beginning, then never again.
930
+
917
931
  for (var i=0; i<events.length; i++) {
918
932
  events[i].source = source;
919
933
  normalizeEvent(events[i]);
@@ -1227,6 +1241,8 @@ function EventManager(options, _sources) {
1227
1241
 
1228
1242
  }
1229
1243
 
1244
+ ;;
1245
+
1230
1246
 
1231
1247
  fc.addDays = addDays;
1232
1248
  fc.cloneDate = cloneDate;
@@ -1581,10 +1597,38 @@ var dateFormatters = {
1581
1597
  return 'th';
1582
1598
  }
1583
1599
  return ['st', 'nd', 'rd'][date%10-1] || 'th';
1600
+ },
1601
+ w : function(d, o) { // local
1602
+ return o.weekNumberCalculation(d);
1603
+ },
1604
+ W : function(d) { // ISO
1605
+ return iso8601Week(d);
1584
1606
  }
1585
1607
  };
1608
+ fc.dateFormatters = dateFormatters;
1609
+
1610
+
1611
+ /* thanks jQuery UI (https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.datepicker.js)
1612
+ *
1613
+ * Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
1614
+ * @param date Date - the date to get the week for
1615
+ * @return number - the number of the week within the year that contains this date
1616
+ */
1617
+ function iso8601Week(date) {
1618
+ var time;
1619
+ var checkDate = new Date(date.getTime());
1620
+
1621
+ // Find Thursday of this week starting on Monday
1622
+ checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
1623
+
1624
+ time = checkDate.getTime();
1625
+ checkDate.setMonth(0); // Compare with Jan 1
1626
+ checkDate.setDate(1);
1627
+ return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
1628
+ }
1586
1629
 
1587
1630
 
1631
+ ;;
1588
1632
 
1589
1633
  fc.applyAll = applyAll;
1590
1634
 
@@ -1953,6 +1997,8 @@ function firstDefined() {
1953
1997
  }
1954
1998
 
1955
1999
 
2000
+ ;;
2001
+
1956
2002
  fcViews.month = MonthView;
1957
2003
 
1958
2004
  function MonthView(element, calendar) {
@@ -1999,12 +2045,14 @@ function MonthView(element, calendar) {
1999
2045
  t.end = end;
2000
2046
  t.visStart = visStart;
2001
2047
  t.visEnd = visEnd;
2002
- renderBasic(6, rowCnt, nwe ? 5 : 7, true);
2048
+ renderBasic(rowCnt, nwe ? 5 : 7, true);
2003
2049
  }
2004
2050
 
2005
2051
 
2006
2052
  }
2007
2053
 
2054
+ ;;
2055
+
2008
2056
  fcViews.basicWeek = BasicWeekView;
2009
2057
 
2010
2058
  function BasicWeekView(element, calendar) {
@@ -2045,12 +2093,14 @@ function BasicWeekView(element, calendar) {
2045
2093
  t.end = end;
2046
2094
  t.visStart = visStart;
2047
2095
  t.visEnd = visEnd;
2048
- renderBasic(1, 1, weekends ? 7 : 5, false);
2096
+ renderBasic(1, weekends ? 7 : 5, false);
2049
2097
  }
2050
2098
 
2051
2099
 
2052
2100
  }
2053
2101
 
2102
+ ;;
2103
+
2054
2104
  fcViews.basicDay = BasicDayView;
2055
2105
 
2056
2106
  //TODO: when calendar's date starts out on a weekend, shouldn't happen
@@ -2082,12 +2132,14 @@ function BasicDayView(element, calendar) {
2082
2132
  t.title = formatDate(date, opt('titleFormat'));
2083
2133
  t.start = t.visStart = cloneDate(date, true);
2084
2134
  t.end = t.visEnd = addDays(cloneDate(t.start), 1);
2085
- renderBasic(1, 1, 1, false);
2135
+ renderBasic(1, 1, false);
2086
2136
  }
2087
2137
 
2088
2138
 
2089
2139
  }
2090
2140
 
2141
+ ;;
2142
+
2091
2143
  setDefaults({
2092
2144
  weekMode: 'fixed'
2093
2145
  });
@@ -2140,6 +2192,7 @@ function BasicView(element, calendar, viewName) {
2140
2192
 
2141
2193
  // locals
2142
2194
 
2195
+ var table;
2143
2196
  var head;
2144
2197
  var headCells;
2145
2198
  var body;
@@ -2152,6 +2205,7 @@ function BasicView(element, calendar, viewName) {
2152
2205
  var viewWidth;
2153
2206
  var viewHeight;
2154
2207
  var colWidth;
2208
+ var weekNumberWidth;
2155
2209
 
2156
2210
  var rowCnt, colCnt;
2157
2211
  var coordinateGrid;
@@ -2160,9 +2214,12 @@ function BasicView(element, calendar, viewName) {
2160
2214
 
2161
2215
  var rtl, dis, dit;
2162
2216
  var firstDay;
2163
- var nwe;
2217
+ var nwe; // no weekends? a 0 or 1 for easy computations
2164
2218
  var tm;
2165
2219
  var colFormat;
2220
+ var showWeekNumbers;
2221
+ var weekNumberTitle;
2222
+ var weekNumberFormat;
2166
2223
 
2167
2224
 
2168
2225
 
@@ -2173,17 +2230,17 @@ function BasicView(element, calendar, viewName) {
2173
2230
  disableTextSelection(element.addClass('fc-grid'));
2174
2231
 
2175
2232
 
2176
- function renderBasic(maxr, r, c, showNumbers) {
2233
+ function renderBasic(r, c, showNumbers) {
2177
2234
  rowCnt = r;
2178
2235
  colCnt = c;
2179
2236
  updateOptions();
2180
2237
  var firstTime = !body;
2181
2238
  if (firstTime) {
2182
- buildSkeleton(maxr, showNumbers);
2239
+ buildEventContainer();
2183
2240
  }else{
2184
2241
  clearEvents();
2185
2242
  }
2186
- updateCells(firstTime);
2243
+ buildTable(showNumbers);
2187
2244
  }
2188
2245
 
2189
2246
 
@@ -2201,124 +2258,142 @@ function BasicView(element, calendar, viewName) {
2201
2258
  nwe = opt('weekends') ? 0 : 1;
2202
2259
  tm = opt('theme') ? 'ui' : 'fc';
2203
2260
  colFormat = opt('columnFormat');
2261
+
2262
+ // week # options. (TODO: bad, logic also in other views)
2263
+ showWeekNumbers = opt('weekNumbers');
2264
+ weekNumberTitle = opt('weekNumberTitle');
2265
+ if (opt('weekNumberCalculation') != 'iso') {
2266
+ weekNumberFormat = "w";
2267
+ }
2268
+ else {
2269
+ weekNumberFormat = "W";
2270
+ }
2204
2271
  }
2205
2272
 
2206
2273
 
2207
2274
 
2208
- function buildSkeleton(maxRowCnt, showNumbers) {
2209
- var s;
2275
+ function buildEventContainer() {
2276
+ daySegmentContainer =
2277
+ $("<div style='position:absolute;z-index:8;top:0;left:0'/>")
2278
+ .appendTo(element);
2279
+ }
2280
+
2281
+
2282
+
2283
+ function buildTable(showNumbers) {
2284
+ var html = '';
2285
+ var i, j;
2210
2286
  var headerClass = tm + "-widget-header";
2211
2287
  var contentClass = tm + "-widget-content";
2212
- var i, j;
2213
- var table;
2214
-
2215
- s =
2216
- "<table class='fc-border-separate' style='width:100%' cellspacing='0'>" +
2217
- "<thead>" +
2218
- "<tr>";
2288
+ var month = t.start.getMonth();
2289
+ var today = clearTime(new Date());
2290
+ var cellDate; // not to be confused with local function. TODO: better names
2291
+ var cellClasses;
2292
+ var cell;
2293
+
2294
+ html += "<table class='fc-border-separate' style='width:100%' cellspacing='0'>" +
2295
+ "<thead>" +
2296
+ "<tr>";
2297
+
2298
+ if (showWeekNumbers) {
2299
+ html += "<th class='fc-week-number " + headerClass + "'/>";
2300
+ }
2301
+
2219
2302
  for (i=0; i<colCnt; i++) {
2220
- s +=
2221
- "<th class='fc- " + headerClass + "'/>"; // need fc- for setDayID
2303
+ cellDate = _cellDate(0, i); // a little confusing. cellDate is local variable. _cellDate is private function
2304
+ html += "<th class='fc-day-header fc-" + dayIDs[cellDate.getDay()] + " " + headerClass + "'/>";
2222
2305
  }
2223
- s +=
2224
- "</tr>" +
2225
- "</thead>" +
2226
- "<tbody>";
2227
- for (i=0; i<maxRowCnt; i++) {
2228
- s +=
2229
- "<tr class='fc-week" + i + "'>";
2306
+
2307
+ html += "</tr>" +
2308
+ "</thead>" +
2309
+ "<tbody>";
2310
+
2311
+ for (i=0; i<rowCnt; i++) {
2312
+ html += "<tr class='fc-week'>";
2313
+
2314
+ if (showWeekNumbers) {
2315
+ html += "<td class='fc-week-number " + contentClass + "'>" +
2316
+ "<div/>" +
2317
+ "</td>";
2318
+ }
2319
+
2230
2320
  for (j=0; j<colCnt; j++) {
2231
- s +=
2232
- "<td class='fc- " + contentClass + " fc-day" + (i*colCnt+j) + "'>" + // need fc- for setDayID
2233
- "<div>" +
2234
- (showNumbers ?
2235
- "<div class='fc-day-number'/>" :
2236
- ''
2237
- ) +
2238
- "<div class='fc-day-content'>" +
2239
- "<div style='position:relative'>&nbsp;</div>" +
2240
- "</div>" +
2241
- "</div>" +
2242
- "</td>";
2321
+ cellDate = _cellDate(i, j); // a little confusing. cellDate is local variable. _cellDate is private function
2322
+
2323
+ cellClasses = [
2324
+ 'fc-day',
2325
+ 'fc-' + dayIDs[cellDate.getDay()],
2326
+ contentClass
2327
+ ];
2328
+ if (cellDate.getMonth() != month) {
2329
+ cellClasses.push('fc-other-month');
2330
+ }
2331
+ if (+cellDate == +today) {
2332
+ cellClasses.push('fc-today');
2333
+ cellClasses.push(tm + '-state-highlight');
2334
+ }
2335
+
2336
+ html += "<td" +
2337
+ " class='" + cellClasses.join(' ') + "'" +
2338
+ " data-date='" + formatDate(cellDate, 'yyyy-MM-dd') + "'" +
2339
+ ">" +
2340
+ "<div>";
2341
+ if (showNumbers) {
2342
+ html += "<div class='fc-day-number'>" + cellDate.getDate() + "</div>";
2343
+ }
2344
+ html += "<div class='fc-day-content'>" +
2345
+ "<div style='position:relative'>&nbsp;</div>" +
2346
+ "</div>" +
2347
+ "</div>" +
2348
+ "</td>";
2243
2349
  }
2244
- s +=
2245
- "</tr>";
2350
+
2351
+ html += "</tr>";
2246
2352
  }
2247
- s +=
2248
- "</tbody>" +
2249
- "</table>";
2250
- table = $(s).appendTo(element);
2251
-
2353
+ html += "</tbody>" +
2354
+ "</table>";
2355
+
2356
+ lockHeight(); // the unlock happens later, in setHeight()...
2357
+ if (table) {
2358
+ table.remove();
2359
+ }
2360
+ table = $(html).appendTo(element);
2361
+
2252
2362
  head = table.find('thead');
2253
- headCells = head.find('th');
2363
+ headCells = head.find('.fc-day-header');
2254
2364
  body = table.find('tbody');
2255
2365
  bodyRows = body.find('tr');
2256
- bodyCells = body.find('td');
2257
- bodyFirstCells = bodyCells.filter(':first-child');
2258
- bodyCellTopInners = bodyRows.eq(0).find('div.fc-day-content div');
2366
+ bodyCells = body.find('.fc-day');
2367
+ bodyFirstCells = bodyRows.find('td:first-child');
2368
+ bodyCellTopInners = bodyRows.eq(0).find('.fc-day-content > div');
2259
2369
 
2260
2370
  markFirstLast(head.add(head.find('tr'))); // marks first+last tr/th's
2261
2371
  markFirstLast(bodyRows); // marks first+last td's
2262
- bodyRows.eq(0).addClass('fc-first'); // fc-last is done in updateCells
2263
-
2264
- dayBind(bodyCells);
2265
-
2266
- daySegmentContainer =
2267
- $("<div style='position:absolute;z-index:8;top:0;left:0'/>")
2268
- .appendTo(element);
2269
- }
2270
-
2372
+ bodyRows.eq(0).addClass('fc-first');
2373
+ bodyRows.filter(':last').addClass('fc-last');
2271
2374
 
2272
-
2273
- function updateCells(firstTime) {
2274
- var dowDirty = firstTime || rowCnt == 1; // could the cells' day-of-weeks need updating?
2275
- var month = t.start.getMonth();
2276
- var today = clearTime(new Date());
2277
- var cell;
2278
- var date;
2279
- var row;
2280
-
2281
- if (dowDirty) {
2282
- headCells.each(function(i, _cell) {
2283
- cell = $(_cell);
2284
- date = indexDate(i);
2285
- cell.html(formatDate(date, colFormat));
2286
- setDayID(cell, date);
2375
+ if (showWeekNumbers) {
2376
+ head.find('.fc-week-number').text(weekNumberTitle);
2377
+ }
2378
+
2379
+ headCells.each(function(i, _cell) {
2380
+ var date = indexDate(i);
2381
+ $(_cell).text(formatDate(date, colFormat));
2382
+ });
2383
+
2384
+ if (showWeekNumbers) {
2385
+ body.find('.fc-week-number > div').each(function(i, _cell) {
2386
+ var weekStart = _cellDate(i, 0);
2387
+ $(_cell).text(formatDate(weekStart, weekNumberFormat));
2287
2388
  });
2288
2389
  }
2289
2390
 
2290
2391
  bodyCells.each(function(i, _cell) {
2291
- cell = $(_cell);
2292
- date = indexDate(i);
2293
- if (date.getMonth() == month) {
2294
- cell.removeClass('fc-other-month');
2295
- }else{
2296
- cell.addClass('fc-other-month');
2297
- }
2298
- if (+date == +today) {
2299
- cell.addClass(tm + '-state-highlight fc-today');
2300
- }else{
2301
- cell.removeClass(tm + '-state-highlight fc-today');
2302
- }
2303
- cell.find('div.fc-day-number').text(date.getDate());
2304
- if (dowDirty) {
2305
- setDayID(cell, date);
2306
- }
2307
- });
2308
-
2309
- bodyRows.each(function(i, _row) {
2310
- row = $(_row);
2311
- if (i < rowCnt) {
2312
- row.show();
2313
- if (i == rowCnt-1) {
2314
- row.addClass('fc-last');
2315
- }else{
2316
- row.removeClass('fc-last');
2317
- }
2318
- }else{
2319
- row.hide();
2320
- }
2392
+ var date = indexDate(i);
2393
+ trigger('dayRender', t, date, $(_cell));
2321
2394
  });
2395
+
2396
+ dayBind(bodyCells);
2322
2397
  }
2323
2398
 
2324
2399
 
@@ -2348,13 +2423,20 @@ function BasicView(element, calendar, viewName) {
2348
2423
  }
2349
2424
  });
2350
2425
 
2426
+ unlockHeight();
2351
2427
  }
2352
2428
 
2353
2429
 
2354
2430
  function setWidth(width) {
2355
2431
  viewWidth = width;
2356
2432
  colContentPositions.clear();
2357
- colWidth = Math.floor(viewWidth / colCnt);
2433
+
2434
+ weekNumberWidth = 0;
2435
+ if (showWeekNumbers) {
2436
+ weekNumberWidth = head.find('th.fc-week-number').outerWidth();
2437
+ }
2438
+
2439
+ colWidth = Math.floor((viewWidth - weekNumberWidth) / colCnt);
2358
2440
  setOuterWidth(headCells.slice(0, -1), colWidth);
2359
2441
  }
2360
2442
 
@@ -2372,8 +2454,7 @@ function BasicView(element, calendar, viewName) {
2372
2454
 
2373
2455
  function dayClick(ev) {
2374
2456
  if (!opt('selectable')) { // if selectable, SelectionManager will worry about dayClick
2375
- var index = parseInt(this.className.match(/fc\-day(\d+)/)[1]); // TODO: maybe use .data
2376
- var date = indexDate(index);
2457
+ var date = parseISO8601($(this).data('date'));
2377
2458
  trigger('dayClick', this, date, true, ev);
2378
2459
  }
2379
2460
  }
@@ -2564,15 +2645,34 @@ function BasicView(element, calendar, viewName) {
2564
2645
 
2565
2646
 
2566
2647
  function allDayBounds(i) {
2648
+ var left = 0;
2649
+ if (showWeekNumbers) {
2650
+ left += weekNumberWidth;
2651
+ }
2567
2652
  return {
2568
- left: 0,
2653
+ left: left,
2569
2654
  right: viewWidth
2570
2655
  };
2571
2656
  }
2572
-
2657
+
2658
+
2659
+
2660
+ // makes sure height doesn't collapse while we destroy/render new cells
2661
+ // (this causes a bad end-user scrollbar jump)
2662
+ // TODO: generalize this for all view rendering. (also in Calendar.js)
2663
+
2664
+ function lockHeight() {
2665
+ setMinHeight(element, element.height());
2666
+ }
2667
+
2668
+ function unlockHeight() {
2669
+ setMinHeight(element, 1);
2670
+ }
2573
2671
 
2574
2672
  }
2575
2673
 
2674
+ ;;
2675
+
2576
2676
  function BasicEventRenderer() {
2577
2677
  var t = this;
2578
2678
 
@@ -2615,6 +2715,7 @@ function BasicEventRenderer() {
2615
2715
  function renderEvents(events, modifiedEventId) {
2616
2716
  reportEvents(events);
2617
2717
  renderDaySegs(compileSegs(events), modifiedEventId);
2718
+ trigger('eventAfterAllRender');
2618
2719
  }
2619
2720
 
2620
2721
 
@@ -2714,6 +2815,8 @@ function BasicEventRenderer() {
2714
2815
 
2715
2816
  }
2716
2817
 
2818
+ ;;
2819
+
2717
2820
  fcViews.agendaWeek = AgendaWeekView;
2718
2821
 
2719
2822
  function AgendaWeekView(element, calendar) {
@@ -2760,6 +2863,8 @@ function AgendaWeekView(element, calendar) {
2760
2863
 
2761
2864
  }
2762
2865
 
2866
+ ;;
2867
+
2763
2868
  fcViews.agendaDay = AgendaDayView;
2764
2869
 
2765
2870
  function AgendaDayView(element, calendar) {
@@ -2796,6 +2901,8 @@ function AgendaDayView(element, calendar) {
2796
2901
 
2797
2902
  }
2798
2903
 
2904
+ ;;
2905
+
2799
2906
  setDefaults({
2800
2907
  allDaySlot: true,
2801
2908
  allDayText: 'all-day',
@@ -2847,7 +2954,8 @@ function AgendaView(element, calendar, viewName) {
2847
2954
  t.getRowCnt = function() { return 1 };
2848
2955
  t.getColCnt = function() { return colCnt };
2849
2956
  t.getColWidth = function() { return colWidth };
2850
- t.getSlotHeight = function() { return slotHeight };
2957
+ t.getSnapHeight = function() { return snapHeight };
2958
+ t.getSnapMinutes = function() { return snapMinutes };
2851
2959
  t.defaultSelectionEnd = defaultSelectionEnd;
2852
2960
  t.renderDayOverlay = renderDayOverlay;
2853
2961
  t.renderSelection = renderSelection;
@@ -2903,7 +3011,10 @@ function AgendaView(element, calendar, viewName) {
2903
3011
  var colWidth;
2904
3012
  var gutterWidth;
2905
3013
  var slotHeight; // TODO: what if slotHeight changes? (see issue 650)
2906
- var savedScrollTop;
3014
+
3015
+ var snapMinutes;
3016
+ var snapRatio; // ratio of number of "selection" slots to normal slots. (ex: 1, 2, 4)
3017
+ var snapHeight; // holds the pixel hight of a "selection" slot
2907
3018
 
2908
3019
  var colCnt;
2909
3020
  var slotCnt;
@@ -2911,6 +3022,7 @@ function AgendaView(element, calendar, viewName) {
2911
3022
  var hoverListener;
2912
3023
  var colContentPositions;
2913
3024
  var slotTopCache = {};
3025
+ var savedScrollTop;
2914
3026
 
2915
3027
  var tm;
2916
3028
  var firstDay;
@@ -2918,6 +3030,9 @@ function AgendaView(element, calendar, viewName) {
2918
3030
  var rtl, dis, dit; // day index sign / translate
2919
3031
  var minMinute, maxMinute;
2920
3032
  var colFormat;
3033
+ var showWeekNumbers;
3034
+ var weekNumberTitle;
3035
+ var weekNumberFormat;
2921
3036
 
2922
3037
 
2923
3038
 
@@ -2955,6 +3070,18 @@ function AgendaView(element, calendar, viewName) {
2955
3070
  minMinute = parseTime(opt('minTime'));
2956
3071
  maxMinute = parseTime(opt('maxTime'));
2957
3072
  colFormat = opt('columnFormat');
3073
+
3074
+ // week # options. (TODO: bad, logic also in other views)
3075
+ showWeekNumbers = opt('weekNumbers');
3076
+ weekNumberTitle = opt('weekNumberTitle');
3077
+ if (opt('weekNumberCalculation') != 'iso') {
3078
+ weekNumberFormat = "w";
3079
+ }
3080
+ else {
3081
+ weekNumberFormat = "W";
3082
+ }
3083
+
3084
+ snapMinutes = opt('snapMinutes') || opt('slotMinutes');
2958
3085
  }
2959
3086
 
2960
3087
 
@@ -2972,8 +3099,15 @@ function AgendaView(element, calendar, viewName) {
2972
3099
  s =
2973
3100
  "<table style='width:100%' class='fc-agenda-days fc-border-separate' cellspacing='0'>" +
2974
3101
  "<thead>" +
2975
- "<tr>" +
2976
- "<th class='fc-agenda-axis " + headerClass + "'>&nbsp;</th>";
3102
+ "<tr>";
3103
+
3104
+ if (showWeekNumbers) {
3105
+ s += "<th class='fc-agenda-axis fc-week-number " + headerClass + "'/>";
3106
+ }
3107
+ else {
3108
+ s += "<th class='fc-agenda-axis " + headerClass + "'>&nbsp;</th>";
3109
+ }
3110
+
2977
3111
  for (i=0; i<colCnt; i++) {
2978
3112
  s +=
2979
3113
  "<th class='fc- fc-col" + i + ' ' + headerClass + "'/>"; // fc- needed for setDayID
@@ -3107,6 +3241,18 @@ function AgendaView(element, calendar, viewName) {
3107
3241
  var bodyCell;
3108
3242
  var date;
3109
3243
  var today = clearTime(new Date());
3244
+
3245
+ if (showWeekNumbers) {
3246
+ var weekText = formatDate(colDate(0), weekNumberFormat);
3247
+ if (rtl) {
3248
+ weekText = weekText + weekNumberTitle;
3249
+ }
3250
+ else {
3251
+ weekText = weekNumberTitle + weekText;
3252
+ }
3253
+ dayHead.find('.fc-week-number').text(weekText);
3254
+ }
3255
+
3110
3256
  for (i=0; i<colCnt; i++) {
3111
3257
  date = colDate(i);
3112
3258
  headCell = dayHeadCells.eq(i);
@@ -3145,6 +3291,9 @@ function AgendaView(element, calendar, viewName) {
3145
3291
  slotScroller.height(bodyHeight - allDayHeight - 1);
3146
3292
 
3147
3293
  slotHeight = slotTableFirstInner.height() + 1; // +1 for border
3294
+
3295
+ snapRatio = opt('slotMinutes') / snapMinutes;
3296
+ snapHeight = slotHeight / snapRatio;
3148
3297
 
3149
3298
  if (dateChanged) {
3150
3299
  resetScroll();
@@ -3333,10 +3482,10 @@ function AgendaView(element, calendar, viewName) {
3333
3482
  function constrain(n) {
3334
3483
  return Math.max(slotScrollerTop, Math.min(slotScrollerBottom, n));
3335
3484
  }
3336
- for (var i=0; i<slotCnt; i++) {
3485
+ for (var i=0; i<slotCnt*snapRatio; i++) { // adapt slot count to increased/decreased selection slot count
3337
3486
  rows.push([
3338
- constrain(slotTableTop + slotHeight*i),
3339
- constrain(slotTableTop + slotHeight*(i+1))
3487
+ constrain(slotTableTop + snapHeight*i),
3488
+ constrain(slotTableTop + snapHeight*(i+1))
3340
3489
  ]);
3341
3490
  }
3342
3491
  });
@@ -3377,7 +3526,7 @@ function AgendaView(element, calendar, viewName) {
3377
3526
  slotIndex--;
3378
3527
  }
3379
3528
  if (slotIndex >= 0) {
3380
- addMinutes(d, minMinute + slotIndex * opt('slotMinutes'));
3529
+ addMinutes(d, minMinute + slotIndex * snapMinutes);
3381
3530
  }
3382
3531
  return d;
3383
3532
  }
@@ -3540,9 +3689,9 @@ function AgendaView(element, calendar, viewName) {
3540
3689
  var d2 = cellDate(cell);
3541
3690
  dates = [
3542
3691
  d1,
3543
- addMinutes(cloneDate(d1), opt('slotMinutes')),
3692
+ addMinutes(cloneDate(d1), snapMinutes), // calculate minutes depending on selection slot minutes
3544
3693
  d2,
3545
- addMinutes(cloneDate(d2), opt('slotMinutes'))
3694
+ addMinutes(cloneDate(d2), snapMinutes)
3546
3695
  ].sort(cmp);
3547
3696
  renderSlotSelection(dates[0], dates[3]);
3548
3697
  }else{
@@ -3599,6 +3748,8 @@ function AgendaView(element, calendar, viewName) {
3599
3748
 
3600
3749
  }
3601
3750
 
3751
+ ;;
3752
+
3602
3753
  function AgendaEventRenderer() {
3603
3754
  var t = this;
3604
3755
 
@@ -3635,7 +3786,8 @@ function AgendaEventRenderer() {
3635
3786
  var resizableDayEvent = t.resizableDayEvent; // TODO: streamline binding architecture
3636
3787
  var getColCnt = t.getColCnt;
3637
3788
  var getColWidth = t.getColWidth;
3638
- var getSlotHeight = t.getSlotHeight;
3789
+ var getSnapHeight = t.getSnapHeight;
3790
+ var getSnapMinutes = t.getSnapMinutes;
3639
3791
  var getBodyContent = t.getBodyContent;
3640
3792
  var reportEventElement = t.reportEventElement;
3641
3793
  var showEvents = t.showEvents;
@@ -3671,6 +3823,7 @@ function AgendaEventRenderer() {
3671
3823
  setHeight(); // no params means set to viewHeight
3672
3824
  }
3673
3825
  renderSlotSegs(compileSlotSegs(slotEvents), modifiedEventId);
3826
+ trigger('eventAfterAllRender');
3674
3827
  }
3675
3828
 
3676
3829
 
@@ -3756,7 +3909,7 @@ function AgendaEventRenderer() {
3756
3909
  vsideCache={},
3757
3910
  hsideCache={},
3758
3911
  key, val,
3759
- contentElement,
3912
+ titleElement,
3760
3913
  height,
3761
3914
  slotSegmentContainer = getSlotSegmentContainer(),
3762
3915
  rtl, dis, dit,
@@ -3845,9 +3998,9 @@ function AgendaEventRenderer() {
3845
3998
  seg.vsides = val === undefined ? (vsideCache[key] = vsides(eventElement, true)) : val;
3846
3999
  val = hsideCache[key];
3847
4000
  seg.hsides = val === undefined ? (hsideCache[key] = hsides(eventElement, true)) : val;
3848
- contentElement = eventElement.find('div.fc-event-content');
3849
- if (contentElement.length) {
3850
- seg.contentTop = contentElement[0].offsetTop;
4001
+ titleElement = eventElement.find('.fc-event-title');
4002
+ if (titleElement.length) {
4003
+ seg.contentTop = titleElement[0].offsetTop;
3851
4004
  }
3852
4005
  }
3853
4006
  }
@@ -3861,7 +4014,7 @@ function AgendaEventRenderer() {
3861
4014
  eventElement[0].style.height = height + 'px';
3862
4015
  event = seg.event;
3863
4016
  if (seg.contentTop !== undefined && height - seg.contentTop < 10) {
3864
- // not enough room for title, put it in the time header
4017
+ // not enough room for title, put it in the time (TODO: maybe make both display:inline instead)
3865
4018
  eventElement.find('div.fc-event-time')
3866
4019
  .text(formatDate(event.start, opt('timeFormat')) + ' - ' + event.title);
3867
4020
  eventElement.find('div.fc-event-title')
@@ -3878,16 +4031,15 @@ function AgendaEventRenderer() {
3878
4031
  var html = "<";
3879
4032
  var url = event.url;
3880
4033
  var skinCss = getSkinCss(event, opt);
3881
- var skinCssAttr = (skinCss ? " style='" + skinCss + "'" : '');
3882
- var classes = ['fc-event', 'fc-event-skin', 'fc-event-vert'];
4034
+ var classes = ['fc-event', 'fc-event-vert'];
3883
4035
  if (isEventDraggable(event)) {
3884
4036
  classes.push('fc-event-draggable');
3885
4037
  }
3886
4038
  if (seg.isStart) {
3887
- classes.push('fc-corner-top');
4039
+ classes.push('fc-event-start');
3888
4040
  }
3889
4041
  if (seg.isEnd) {
3890
- classes.push('fc-corner-bottom');
4042
+ classes.push('fc-event-end');
3891
4043
  }
3892
4044
  classes = classes.concat(event.className);
3893
4045
  if (event.source) {
@@ -3902,19 +4054,15 @@ function AgendaEventRenderer() {
3902
4054
  " class='" + classes.join(' ') + "'" +
3903
4055
  " style='position:absolute;z-index:8;top:" + seg.top + "px;left:" + seg.left + "px;" + skinCss + "'" +
3904
4056
  ">" +
3905
- "<div class='fc-event-inner fc-event-skin'" + skinCssAttr + ">" +
3906
- "<div class='fc-event-head fc-event-skin'" + skinCssAttr + ">" +
4057
+ "<div class='fc-event-inner'>" +
3907
4058
  "<div class='fc-event-time'>" +
3908
4059
  htmlEscape(formatDates(event.start, event.end, opt('timeFormat'))) +
3909
4060
  "</div>" +
3910
- "</div>" +
3911
- "<div class='fc-event-content'>" +
3912
4061
  "<div class='fc-event-title'>" +
3913
4062
  htmlEscape(event.title) +
3914
4063
  "</div>" +
3915
4064
  "</div>" +
3916
- "<div class='fc-event-bg'></div>" +
3917
- "</div>"; // close inner
4065
+ "<div class='fc-event-bg'></div>";
3918
4066
  if (seg.isEnd && isEventResizable(event)) {
3919
4067
  html +=
3920
4068
  "<div class='ui-resizable-handle ui-resizable-s'>=</div>";
@@ -3964,7 +4112,8 @@ function AgendaEventRenderer() {
3964
4112
  var dis = opt('isRTL') ? -1 : 1;
3965
4113
  var hoverListener = getHoverListener();
3966
4114
  var colWidth = getColWidth();
3967
- var slotHeight = getSlotHeight();
4115
+ var snapHeight = getSnapHeight();
4116
+ var snapMinutes = getSnapMinutes();
3968
4117
  var minMinute = getMinMinute();
3969
4118
  eventElement.draggable({
3970
4119
  zIndex: 9,
@@ -3995,9 +4144,9 @@ function AgendaEventRenderer() {
3995
4144
  eventElement.width(colWidth - 10); // don't use entire width
3996
4145
  setOuterHeight(
3997
4146
  eventElement,
3998
- slotHeight * Math.round(
3999
- (event.end ? ((event.end - event.start) / MINUTE_MS) : opt('defaultEventMinutes'))
4000
- / opt('slotMinutes')
4147
+ snapHeight * Math.round(
4148
+ (event.end ? ((event.end - event.start) / MINUTE_MS) : opt('defaultEventMinutes')) /
4149
+ snapMinutes
4001
4150
  )
4002
4151
  );
4003
4152
  eventElement.draggable('option', 'grid', [colWidth, 1]);
@@ -4029,8 +4178,8 @@ function AgendaEventRenderer() {
4029
4178
  // changed!
4030
4179
  var minuteDelta = 0;
4031
4180
  if (!allDay) {
4032
- minuteDelta = Math.round((eventElement.offset().top - getBodyContent().offset().top) / slotHeight)
4033
- * opt('slotMinutes')
4181
+ minuteDelta = Math.round((eventElement.offset().top - getBodyContent().offset().top) / snapHeight)
4182
+ * snapMinutes
4034
4183
  + minMinute
4035
4184
  - (event.start.getHours() * 60 + event.start.getMinutes());
4036
4185
  }
@@ -4063,11 +4212,12 @@ function AgendaEventRenderer() {
4063
4212
  var hoverListener = getHoverListener();
4064
4213
  var colCnt = getColCnt();
4065
4214
  var colWidth = getColWidth();
4066
- var slotHeight = getSlotHeight();
4215
+ var snapHeight = getSnapHeight();
4216
+ var snapMinutes = getSnapMinutes();
4067
4217
  eventElement.draggable({
4068
4218
  zIndex: 9,
4069
4219
  scroll: false,
4070
- grid: [colWidth, slotHeight],
4220
+ grid: [colWidth, snapHeight],
4071
4221
  axis: colCnt==1 ? 'y' : false,
4072
4222
  opacity: opt('dragOpacity'),
4073
4223
  revertDuration: opt('dragRevertDuration'),
@@ -4101,7 +4251,7 @@ function AgendaEventRenderer() {
4101
4251
  }, ev, 'drag');
4102
4252
  },
4103
4253
  drag: function(ev, ui) {
4104
- minuteDelta = Math.round((ui.position.top - origPosition.top) / slotHeight) * opt('slotMinutes');
4254
+ minuteDelta = Math.round((ui.position.top - origPosition.top) / snapHeight) * snapMinutes;
4105
4255
  if (minuteDelta != prevMinuteDelta) {
4106
4256
  if (!allDay) {
4107
4257
  updateTimeText(minuteDelta);
@@ -4138,7 +4288,7 @@ function AgendaEventRenderer() {
4138
4288
  // convert back to original slot-event
4139
4289
  if (allDay) {
4140
4290
  timeElement.css('display', ''); // show() was causing display=inline
4141
- eventElement.draggable('option', 'grid', [colWidth, slotHeight]);
4291
+ eventElement.draggable('option', 'grid', [colWidth, snapHeight]);
4142
4292
  allDay = false;
4143
4293
  }
4144
4294
  }
@@ -4151,38 +4301,39 @@ function AgendaEventRenderer() {
4151
4301
 
4152
4302
 
4153
4303
  function resizableSlotEvent(event, eventElement, timeElement) {
4154
- var slotDelta, prevSlotDelta;
4155
- var slotHeight = getSlotHeight();
4304
+ var snapDelta, prevSnapDelta;
4305
+ var snapHeight = getSnapHeight();
4306
+ var snapMinutes = getSnapMinutes();
4156
4307
  eventElement.resizable({
4157
4308
  handles: {
4158
- s: 'div.ui-resizable-s'
4309
+ s: '.ui-resizable-handle'
4159
4310
  },
4160
- grid: slotHeight,
4311
+ grid: snapHeight,
4161
4312
  start: function(ev, ui) {
4162
- slotDelta = prevSlotDelta = 0;
4313
+ snapDelta = prevSnapDelta = 0;
4163
4314
  hideEvents(event, eventElement);
4164
4315
  eventElement.css('z-index', 9);
4165
4316
  trigger('eventResizeStart', this, event, ev, ui);
4166
4317
  },
4167
4318
  resize: function(ev, ui) {
4168
4319
  // don't rely on ui.size.height, doesn't take grid into account
4169
- slotDelta = Math.round((Math.max(slotHeight, eventElement.height()) - ui.originalSize.height) / slotHeight);
4170
- if (slotDelta != prevSlotDelta) {
4320
+ snapDelta = Math.round((Math.max(snapHeight, eventElement.height()) - ui.originalSize.height) / snapHeight);
4321
+ if (snapDelta != prevSnapDelta) {
4171
4322
  timeElement.text(
4172
4323
  formatDates(
4173
4324
  event.start,
4174
- (!slotDelta && !event.end) ? null : // no change, so don't display time range
4175
- addMinutes(eventEnd(event), opt('slotMinutes')*slotDelta),
4325
+ (!snapDelta && !event.end) ? null : // no change, so don't display time range
4326
+ addMinutes(eventEnd(event), snapMinutes*snapDelta),
4176
4327
  opt('timeFormat')
4177
4328
  )
4178
4329
  );
4179
- prevSlotDelta = slotDelta;
4330
+ prevSnapDelta = snapDelta;
4180
4331
  }
4181
4332
  },
4182
4333
  stop: function(ev, ui) {
4183
4334
  trigger('eventResizeStop', this, event, ev, ui);
4184
- if (slotDelta) {
4185
- eventResize(this, event, 0, opt('slotMinutes')*slotDelta, ev, ui);
4335
+ if (snapDelta) {
4336
+ eventResize(this, event, 0, snapMinutes*snapDelta, ev, ui);
4186
4337
  }else{
4187
4338
  eventElement.css('z-index', 8);
4188
4339
  showEvents(event, eventElement);
@@ -4214,6 +4365,8 @@ function countForwardSegs(levels) {
4214
4365
 
4215
4366
 
4216
4367
 
4368
+ ;;
4369
+
4217
4370
 
4218
4371
  function View(element, calendar, viewName) {
4219
4372
  var t = this;
@@ -4468,6 +4621,8 @@ function View(element, calendar, viewName) {
4468
4621
 
4469
4622
  }
4470
4623
 
4624
+ ;;
4625
+
4471
4626
  function DayEventRenderer() {
4472
4627
  var t = this;
4473
4628
 
@@ -4605,28 +4760,22 @@ function DayEventRenderer() {
4605
4760
  for (i=0; i<segCnt; i++) {
4606
4761
  seg = segs[i];
4607
4762
  event = seg.event;
4608
- classes = ['fc-event', 'fc-event-skin', 'fc-event-hori'];
4763
+ classes = ['fc-event', 'fc-event-hori'];
4609
4764
  if (isEventDraggable(event)) {
4610
4765
  classes.push('fc-event-draggable');
4611
4766
  }
4767
+ if (seg.isStart) {
4768
+ classes.push('fc-event-start');
4769
+ }
4770
+ if (seg.isEnd) {
4771
+ classes.push('fc-event-end');
4772
+ }
4612
4773
  if (rtl) {
4613
- if (seg.isStart) {
4614
- classes.push('fc-corner-right');
4615
- }
4616
- if (seg.isEnd) {
4617
- classes.push('fc-corner-left');
4618
- }
4619
4774
  leftCol = dayOfWeekCol(seg.end.getDay()-1);
4620
4775
  rightCol = dayOfWeekCol(seg.start.getDay());
4621
4776
  left = seg.isEnd ? colContentLeft(leftCol) : minLeft;
4622
4777
  right = seg.isStart ? colContentRight(rightCol) : maxLeft;
4623
4778
  }else{
4624
- if (seg.isStart) {
4625
- classes.push('fc-corner-left');
4626
- }
4627
- if (seg.isEnd) {
4628
- classes.push('fc-corner-right');
4629
- }
4630
4779
  leftCol = dayOfWeekCol(seg.start.getDay());
4631
4780
  rightCol = dayOfWeekCol(seg.end.getDay()-1);
4632
4781
  left = seg.isStart ? colContentLeft(leftCol) : minLeft;
@@ -4647,10 +4796,7 @@ function DayEventRenderer() {
4647
4796
  " class='" + classes.join(' ') + "'" +
4648
4797
  " style='position:absolute;z-index:8;left:"+left+"px;" + skinCss + "'" +
4649
4798
  ">" +
4650
- "<div" +
4651
- " class='fc-event-inner fc-event-skin'" +
4652
- (skinCss ? " style='" + skinCss + "'" : '') +
4653
- ">";
4799
+ "<div class='fc-event-inner'>";
4654
4800
  if (!event.allDay && seg.isStart) {
4655
4801
  html +=
4656
4802
  "<span class='fc-event-time'>" +
@@ -4812,7 +4958,7 @@ function DayEventRenderer() {
4812
4958
  var rowDivs = [];
4813
4959
  for (i=0; i<rowCnt; i++) {
4814
4960
  rowDivs[i] = allDayRow(i)
4815
- .find('td:first div.fc-day-content > div'); // optimal selector?
4961
+ .find('div.fc-day-content > div'); // optimal selector?
4816
4962
  }
4817
4963
  return rowDivs;
4818
4964
  }
@@ -4855,7 +5001,7 @@ function DayEventRenderer() {
4855
5001
  function resizableDayEvent(event, element, seg) {
4856
5002
  var rtl = opt('isRTL');
4857
5003
  var direction = rtl ? 'w' : 'e';
4858
- var handle = element.find('div.ui-resizable-' + direction);
5004
+ var handle = element.find('.ui-resizable-' + direction); // TODO: stop using this class because we aren't using jqui for this
4859
5005
  var isResizing = false;
4860
5006
 
4861
5007
  // TODO: look into using jquery-ui mouse widget for this stuff
@@ -4951,6 +5097,8 @@ function DayEventRenderer() {
4951
5097
 
4952
5098
  }
4953
5099
 
5100
+ ;;
5101
+
4954
5102
  //BUG: unselect needs to be triggered when events are dragged+dropped
4955
5103
 
4956
5104
  function SelectionManager() {
@@ -5048,6 +5196,8 @@ function SelectionManager() {
5048
5196
 
5049
5197
 
5050
5198
  }
5199
+
5200
+ ;;
5051
5201
 
5052
5202
  function OverlayManager() {
5053
5203
  var t = this;
@@ -5086,6 +5236,8 @@ function OverlayManager() {
5086
5236
 
5087
5237
  }
5088
5238
 
5239
+ ;;
5240
+
5089
5241
  function CoordinateGrid(buildFunc) {
5090
5242
 
5091
5243
  var t = this;
@@ -5132,6 +5284,8 @@ function CoordinateGrid(buildFunc) {
5132
5284
 
5133
5285
  }
5134
5286
 
5287
+ ;;
5288
+
5135
5289
  function HoverListener(coordinateGrid) {
5136
5290
 
5137
5291
 
@@ -5190,6 +5344,8 @@ function _fixUIEvent(event) { // for issue 1168
5190
5344
  event.pageY = event.originalEvent.pageY;
5191
5345
  }
5192
5346
  }
5347
+ ;;
5348
+
5193
5349
  function HorizontalPositionCache(getElement) {
5194
5350
 
5195
5351
  var t = this,
@@ -5216,5 +5372,7 @@ function HorizontalPositionCache(getElement) {
5216
5372
  };
5217
5373
 
5218
5374
  }
5219
-
5220
- })(jQuery);
5375
+
5376
+ ;;
5377
+
5378
+ })(jQuery);