fullcalendar-rails 1.5.4.0 → 1.6.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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);