d3_rails 2.8.0 → 2.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. data/.DS_Store +0 -0
  2. data/README.md +27 -5
  3. data/lib/d3_rails/version.rb +1 -1
  4. data/vendor/.DS_Store +0 -0
  5. data/vendor/assets/.DS_Store +0 -0
  6. data/vendor/assets/javascripts/.DS_Store +0 -0
  7. data/vendor/assets/javascripts/d3.v2.js +99 -80
  8. data/vendor/assets/javascripts/morris.js +1 -0
  9. data/vendor/assets/javascripts/morris/.DS_Store +0 -0
  10. data/vendor/assets/javascripts/morris/Makefile +10 -0
  11. data/vendor/assets/javascripts/morris/README.md +87 -0
  12. data/vendor/assets/javascripts/morris/examples/_template.html +18 -0
  13. data/vendor/assets/javascripts/morris/examples/days.html +36 -0
  14. data/vendor/assets/javascripts/morris/examples/decimal.html +31 -0
  15. data/vendor/assets/javascripts/morris/examples/lib/example.css +13 -0
  16. data/vendor/assets/javascripts/morris/examples/lib/example.js +4 -0
  17. data/vendor/assets/javascripts/morris/examples/lib/prettify.css +1 -0
  18. data/vendor/assets/javascripts/morris/examples/lib/prettify.js +28 -0
  19. data/vendor/assets/javascripts/morris/examples/months-no-smooth.html +37 -0
  20. data/vendor/assets/javascripts/morris/examples/negative.html +35 -0
  21. data/vendor/assets/javascripts/morris/examples/non-date.html +36 -0
  22. data/vendor/assets/javascripts/morris/examples/quarters.html +53 -0
  23. data/vendor/assets/javascripts/morris/examples/timestamps.html +37 -0
  24. data/vendor/assets/javascripts/morris/examples/weeks.html +52 -0
  25. data/vendor/assets/javascripts/morris/morris.coffee +444 -0
  26. data/vendor/assets/javascripts/morris/morris.js +493 -0
  27. data/vendor/assets/javascripts/morris/morris.min.js +1 -0
  28. data/vendor/assets/javascripts/tesseract.js +1 -0
  29. data/vendor/assets/javascripts/tesseract/.gitignore +2 -0
  30. data/vendor/assets/javascripts/tesseract/LICENSE +12 -0
  31. data/vendor/assets/javascripts/tesseract/Makefile +48 -0
  32. data/vendor/assets/javascripts/tesseract/README.md +11 -0
  33. data/vendor/assets/javascripts/tesseract/index.js +1 -0
  34. data/vendor/assets/javascripts/tesseract/lib/dart/AUTHORS +9 -0
  35. data/vendor/assets/javascripts/tesseract/lib/dart/LICENSE +25 -0
  36. data/vendor/assets/javascripts/tesseract/lib/dart/dual_pivot_quicksort.dart +342 -0
  37. data/vendor/assets/javascripts/tesseract/package.json +11 -0
  38. data/vendor/assets/javascripts/tesseract/src/array.js +32 -0
  39. data/vendor/assets/javascripts/tesseract/src/bisect.js +44 -0
  40. data/vendor/assets/javascripts/tesseract/src/filter.js +19 -0
  41. data/vendor/assets/javascripts/tesseract/src/heap.js +44 -0
  42. data/vendor/assets/javascripts/tesseract/src/heapselect.js +36 -0
  43. data/vendor/assets/javascripts/tesseract/src/identity.js +3 -0
  44. data/vendor/assets/javascripts/tesseract/src/insertionsort.js +18 -0
  45. data/vendor/assets/javascripts/tesseract/src/null.js +3 -0
  46. data/vendor/assets/javascripts/tesseract/src/package.js +14 -0
  47. data/vendor/assets/javascripts/tesseract/src/permute.js +8 -0
  48. data/vendor/assets/javascripts/tesseract/src/quicksort.js +282 -0
  49. data/vendor/assets/javascripts/tesseract/src/reduce.js +19 -0
  50. data/vendor/assets/javascripts/tesseract/src/tesseract.js +663 -0
  51. data/vendor/assets/javascripts/tesseract/src/version.js +1 -0
  52. data/vendor/assets/javascripts/tesseract/src/zero.js +3 -0
  53. data/vendor/assets/javascripts/tesseract/tesseract.js +1177 -0
  54. data/vendor/assets/javascripts/tesseract/tesseract.min.js +1 -0
  55. data/vendor/assets/javascripts/tesseract/test/benchmark.js +177 -0
  56. data/vendor/assets/javascripts/tesseract/test/bisect-test.js +206 -0
  57. data/vendor/assets/javascripts/tesseract/test/heap-test.js +44 -0
  58. data/vendor/assets/javascripts/tesseract/test/permute-test.js +51 -0
  59. data/vendor/assets/javascripts/tesseract/test/select-test.js +63 -0
  60. data/vendor/assets/javascripts/tesseract/test/sort-test.js +83 -0
  61. data/vendor/assets/javascripts/tesseract/test/tesseract-test.js +655 -0
  62. data/vendor/assets/javascripts/tesseract/test/version-test.js +16 -0
  63. metadata +63 -8
data/.DS_Store CHANGED
Binary file
data/README.md CHANGED
@@ -2,7 +2,9 @@
2
2
 
3
3
  **D3_Rails** is a small, lightweight gem which allows you to include any
4
4
  and all of D3 Javascripts into your 3.1 Rails application, merely by
5
- including any desired D3 files into your application.js manifest.
5
+ including any desired D3 files into your application.js manifest. You can
6
+ also include supplemental libraries to your rails app, such as 'morris.js'
7
+ and 'tesseract.js' by including them in your manifest.
6
8
 
7
9
  # About D3
8
10
 
@@ -14,8 +16,8 @@ or you can use it to build dynamic pages (like jQuery).
14
16
 
15
17
  # D3 Version
16
18
 
17
- The current release of this gem is using **D3 v=2.8** (though for convenience I have left version 2.7.5 in the gem so you can still include your modules manually since rails will compile your javascripts into one file in the end anyway)
18
- **Last Updated 2-27-2012**
19
+ The current release of this gem is using **D3 v=2.8.1** (though for convenience I have left version 2.7.5 in the gem so you can still include your modules manually since rails will compile your javascripts into one file in the end anyway)
20
+ **Last Updated 3-22-2012**
19
21
 
20
22
  # Included Javascripts
21
23
  **minified js files are not included, since the rails asset pipeline sorta necessitates the compiling (and likely minifying) your js files for production**
@@ -32,7 +34,15 @@ The current release of this gem is using **D3 v=2.8** (though for convenience I
32
34
  science.lin.js
33
35
  science.stats.js
34
36
 
35
- # D3 charting module
37
+ ## Additional modules:
38
+
39
+ There are a few additional modules/js libraries included for convenience in this gem:
40
+
41
+ morris.js
42
+ tesseract.js
43
+ d3 charting module
44
+
45
+ ## D3 charting module
36
46
 
37
47
  ** D3 charts can be be included in your rails application by including the following line in your javascripts manifest **
38
48
 
@@ -45,7 +55,19 @@ This will include the following javascripts to your application:
45
55
  chart.js
46
56
  horizon.js
47
57
  qq.js
48
-
58
+
59
+ ## Tesseract
60
+
61
+ ** Tesseract can be be included in your rails application by including the following line in your javascripts manifest **
62
+
63
+ //= require tesseract
64
+
65
+ ## Morris
66
+
67
+ ** Morris can also be included in your application with the following additional line of code for your javascripts manifest.
68
+
69
+ //= require morris
70
+
49
71
  ### Installation
50
72
 
51
73
  This gem should work out of the box. All you have to do is add the gem to your Gemfile:
@@ -1,3 +1,3 @@
1
1
  module D3Rails
2
- VERSION = "2.8.0"
2
+ VERSION = "2.8.1"
3
3
  end
Binary file
Binary file
@@ -10,7 +10,7 @@ try {
10
10
  d3_style_setProperty.call(this, name, value + "", priority);
11
11
  };
12
12
  }
13
- d3 = {version: "2.8.0"}; // semver
13
+ d3 = {version: "2.8.1"}; // semver
14
14
  function d3_class(ctor, properties) {
15
15
  try {
16
16
  for (var key in properties) {
@@ -2041,11 +2041,11 @@ d3_selectionPrototype.transition = function() {
2041
2041
  for (var j = -1, m = this.length; ++j < m;) {
2042
2042
  subgroups.push(subgroup = []);
2043
2043
  for (var group = this[j], i = -1, n = group.length; ++i < n;) {
2044
- subgroup.push((node = group[i]) ? {node: node, delay: 0, duration: 250} : null);
2044
+ subgroup.push((node = group[i]) ? {node: node, delay: d3_transitionDelay, duration: d3_transitionDuration} : null);
2045
2045
  }
2046
2046
  }
2047
2047
 
2048
- return d3_transition(subgroups, d3_transitionInheritId || ++d3_transitionId, Date.now());
2048
+ return d3_transition(subgroups, d3_transitionId || ++d3_transitionNextId, Date.now());
2049
2049
  };
2050
2050
  var d3_selectionRoot = d3_selection([[document]]);
2051
2051
 
@@ -2173,9 +2173,9 @@ function d3_transition(groups, id, time) {
2173
2173
 
2174
2174
  if (t >= 1) {
2175
2175
  stop();
2176
- d3_transitionInheritId = id;
2176
+ d3_transitionId = id;
2177
2177
  event.end.call(node, d, i);
2178
- d3_transitionInheritId = 0;
2178
+ d3_transitionId = 0;
2179
2179
  return 1;
2180
2180
  }
2181
2181
  }
@@ -2217,14 +2217,21 @@ function d3_transitionTween(name, b) {
2217
2217
  }
2218
2218
 
2219
2219
  var d3_transitionPrototype = [],
2220
+ d3_transitionNextId = 0,
2220
2221
  d3_transitionId = 0,
2221
- d3_transitionInheritId = 0,
2222
- d3_transitionEase = d3.ease("cubic-in-out");
2222
+ d3_transitionDefaultDelay = 0,
2223
+ d3_transitionDefaultDuration = 250,
2224
+ d3_transitionDefaultEase = d3.ease("cubic-in-out"),
2225
+ d3_transitionDelay = d3_transitionDefaultDelay,
2226
+ d3_transitionDuration = d3_transitionDefaultDuration,
2227
+ d3_transitionEase = d3_transitionDefaultEase;
2223
2228
 
2224
2229
  d3_transitionPrototype.call = d3_selectionPrototype.call;
2225
2230
 
2226
- d3.transition = function() {
2227
- return d3_selectionRoot.transition();
2231
+ d3.transition = function(selection) {
2232
+ return arguments.length
2233
+ ? (d3_transitionId ? selection.transition() : selection)
2234
+ : d3_selectionRoot.transition();
2228
2235
  };
2229
2236
 
2230
2237
  d3.transition.prototype = d3_transitionPrototype;
@@ -2335,12 +2342,28 @@ d3_transitionPrototype.duration = function(value) {
2335
2342
  : (value = Math.max(1, value | 0), function(d, i, j) { groups[j][i].duration = value; }));
2336
2343
  };
2337
2344
  function d3_transition_each(callback) {
2345
+ var id = d3_transitionId,
2346
+ ease = d3_transitionEase,
2347
+ delay = d3_transitionDelay,
2348
+ duration = d3_transitionDuration;
2349
+
2350
+ d3_transitionId = this.id;
2351
+ d3_transitionEase = this.ease();
2338
2352
  for (var j = 0, m = this.length; j < m; j++) {
2339
2353
  for (var group = this[j], i = 0, n = group.length; i < n; i++) {
2340
2354
  var node = group[i];
2341
- if (node) callback.call(node = node.node, node.__data__, i, j);
2355
+ if (node) {
2356
+ d3_transitionDelay = this[j][i].delay;
2357
+ d3_transitionDuration = this[j][i].duration;
2358
+ callback.call(node = node.node, node.__data__, i, j);
2359
+ }
2342
2360
  }
2343
2361
  }
2362
+
2363
+ d3_transitionId = id;
2364
+ d3_transitionEase = ease;
2365
+ d3_transitionDelay = delay;
2366
+ d3_transitionDuration = duration;
2344
2367
  return this;
2345
2368
  }
2346
2369
  d3_transitionPrototype.transition = function() {
@@ -4026,24 +4049,10 @@ d3.svg.axis = function() {
4026
4049
  tickFormat_,
4027
4050
  tickSubdivide = 0;
4028
4051
 
4029
- function axis(selection) {
4030
- selection.each(function(d, i, j) {
4052
+ function axis(g) {
4053
+ g.each(function() {
4031
4054
  var g = d3.select(this);
4032
4055
 
4033
- // If selection is a transition, create subtransitions.
4034
- var transition = selection.delay ? function(o) {
4035
- var id = d3_transitionInheritId;
4036
- try {
4037
- d3_transitionInheritId = selection.id;
4038
- return o.transition()
4039
- .delay(selection[j][i].delay)
4040
- .duration(selection[j][i].duration)
4041
- .ease(selection.ease());
4042
- } finally {
4043
- d3_transitionInheritId = id;
4044
- }
4045
- } : Object;
4046
-
4047
4056
  // Ticks, or domain values for ordinal scales.
4048
4057
  var ticks = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments_) : scale.domain()) : tickValues,
4049
4058
  tickFormat = tickFormat_ == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments_) : String) : tickFormat_;
@@ -4052,21 +4061,21 @@ d3.svg.axis = function() {
4052
4061
  var subticks = d3_svg_axisSubdivide(scale, ticks, tickSubdivide),
4053
4062
  subtick = g.selectAll(".minor").data(subticks, String),
4054
4063
  subtickEnter = subtick.enter().insert("line", "g").attr("class", "tick minor").style("opacity", 1e-6),
4055
- subtickExit = transition(subtick.exit()).style("opacity", 1e-6).remove(),
4056
- subtickUpdate = transition(subtick).style("opacity", 1);
4064
+ subtickExit = d3.transition(subtick.exit()).style("opacity", 1e-6).remove(),
4065
+ subtickUpdate = d3.transition(subtick).style("opacity", 1);
4057
4066
 
4058
4067
  // Major ticks.
4059
4068
  var tick = g.selectAll("g").data(ticks, String),
4060
4069
  tickEnter = tick.enter().insert("g", "path").style("opacity", 1e-6),
4061
- tickExit = transition(tick.exit()).style("opacity", 1e-6).remove(),
4062
- tickUpdate = transition(tick).style("opacity", 1),
4070
+ tickExit = d3.transition(tick.exit()).style("opacity", 1e-6).remove(),
4071
+ tickUpdate = d3.transition(tick).style("opacity", 1),
4063
4072
  tickTransform;
4064
4073
 
4065
4074
  // Domain.
4066
4075
  var range = d3_scaleRange(scale),
4067
4076
  path = g.selectAll(".domain").data([0]),
4068
4077
  pathEnter = path.enter().append("path").attr("class", "domain"),
4069
- pathUpdate = transition(path);
4078
+ pathUpdate = d3.transition(path);
4070
4079
 
4071
4080
  // Stash a snapshot of the new scale, and retrieve the old snapshot.
4072
4081
  var scale1 = scale.copy(),
@@ -4235,10 +4244,11 @@ function d3_svg_axisSubdivide(scale, ticks, m) {
4235
4244
  }
4236
4245
  d3.svg.brush = function() {
4237
4246
  var event = d3_eventDispatch(brush, "brushstart", "brush", "brushend"),
4238
- x, // x-scale, optional
4239
- y, // y-scale, optional
4247
+ x = null, // x-scale, optional
4248
+ y = null, // y-scale, optional
4240
4249
  resizes = d3_svg_brushResizes[0],
4241
- extent = [[0, 0], [0, 0]]; // [x0, y0], [x1, y1]
4250
+ extent = [[0, 0], [0, 0]], // [x0, y0], [x1, y1], in pixels (integers)
4251
+ extentDomain; // the extent in data space, lazily created
4242
4252
 
4243
4253
  function brush(g) {
4244
4254
  g.each(function() {
@@ -4428,7 +4438,7 @@ d3.svg.brush = function() {
4428
4438
  // Final redraw and notify listeners.
4429
4439
  if (moved) {
4430
4440
  redraw(g);
4431
- event_({type: "brush"});
4441
+ event_({type: "brush", mode: dragging ? "move" : "resize"});
4432
4442
  }
4433
4443
  }
4434
4444
 
@@ -4469,6 +4479,7 @@ d3.svg.brush = function() {
4469
4479
 
4470
4480
  // Update the stored bounds.
4471
4481
  if (extent[0][i] !== min || extent[1][i] !== max) {
4482
+ extentDomain = null;
4472
4483
  extent[0][i] = min;
4473
4484
  extent[1][i] = max;
4474
4485
  return true;
@@ -4513,39 +4524,50 @@ d3.svg.brush = function() {
4513
4524
 
4514
4525
  // Invert the pixel extent to data-space.
4515
4526
  if (!arguments.length) {
4527
+ z = extentDomain || extent;
4516
4528
  if (x) {
4517
- x0 = extent[0][0], x1 = extent[1][0];
4518
- if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1);
4519
- if (x1 < x0) t = x0, x0 = x1, x1 = t;
4529
+ x0 = z[0][0], x1 = z[1][0];
4530
+ if (!extentDomain) {
4531
+ x0 = extent[0][0], x1 = extent[1][0];
4532
+ if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1);
4533
+ if (x1 < x0) t = x0, x0 = x1, x1 = t;
4534
+ }
4520
4535
  }
4521
4536
  if (y) {
4522
- y0 = extent[0][1], y1 = extent[1][1];
4523
- if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1);
4524
- if (y1 < y0) t = y0, y0 = y1, y1 = t;
4537
+ y0 = z[0][1], y1 = z[1][1];
4538
+ if (!extentDomain) {
4539
+ y0 = extent[0][1], y1 = extent[1][1];
4540
+ if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1);
4541
+ if (y1 < y0) t = y0, y0 = y1, y1 = t;
4542
+ }
4525
4543
  }
4526
4544
  return x && y ? [[x0, y0], [x1, y1]] : x ? [x0, x1] : y && [y0, y1];
4527
4545
  }
4528
4546
 
4529
4547
  // Scale the data-space extent to pixels.
4548
+ extentDomain = [[0, 0], [0, 0]];
4530
4549
  if (x) {
4531
4550
  x0 = z[0], x1 = z[1];
4532
4551
  if (y) x0 = x0[0], x1 = x1[0];
4552
+ extentDomain[0][0] = x0, extentDomain[1][0] = x1;
4533
4553
  if (x.invert) x0 = x(x0), x1 = x(x1);
4534
4554
  if (x1 < x0) t = x0, x0 = x1, x1 = t;
4535
- extent[0][0] = x0, extent[1][0] = x1;
4555
+ extent[0][0] = x0 | 0, extent[1][0] = x1 | 0;
4536
4556
  }
4537
4557
  if (y) {
4538
4558
  y0 = z[0], y1 = z[1];
4539
4559
  if (x) y0 = y0[1], y1 = y1[1];
4560
+ extentDomain[0][1] = y0, extentDomain[1][1] = y1;
4540
4561
  if (y.invert) y0 = y(y0), y1 = y(y1);
4541
4562
  if (y1 < y0) t = y0, y0 = y1, y1 = t;
4542
- extent[0][1] = y0, extent[1][1] = y1;
4563
+ extent[0][1] = y0 | 0, extent[1][1] = y1 | 0;
4543
4564
  }
4544
4565
 
4545
4566
  return brush;
4546
4567
  };
4547
4568
 
4548
4569
  brush.clear = function() {
4570
+ extentDomain = null;
4549
4571
  extent[0][0] =
4550
4572
  extent[0][1] =
4551
4573
  extent[1][0] =
@@ -8640,16 +8662,18 @@ d3_time_utc.prototype = {
8640
8662
  getTime: function() { return this._.getTime(); },
8641
8663
  getTimezoneOffset: function() { return 0; },
8642
8664
  valueOf: function() { return this._.valueOf(); },
8643
- setDate: function(x) { this._.setUTCDate(x); },
8644
- setDay: function(x) { this._.setUTCDay(x); },
8645
- setFullYear: function(x) { this._.setUTCFullYear(x); },
8646
- setHours: function(x) { this._.setUTCHours(x); },
8647
- setMilliseconds: function(x) { this._.setUTCMilliseconds(x); },
8648
- setMinutes: function(x) { this._.setUTCMinutes(x); },
8649
- setMonth: function(x) { this._.setUTCMonth(x); },
8650
- setSeconds: function(x) { this._.setUTCSeconds(x); },
8651
- setTime: function(x) { this._.setTime(x); }
8652
- };
8665
+ setDate: function() { d3_time_prototype.setUTCDate.apply(this._, arguments); },
8666
+ setDay: function() { d3_time_prototype.setUTCDay.apply(this._, arguments); },
8667
+ setFullYear: function() { d3_time_prototype.setUTCFullYear.apply(this._, arguments); },
8668
+ setHours: function() { d3_time_prototype.setUTCHours.apply(this._, arguments); },
8669
+ setMilliseconds: function() { d3_time_prototype.setUTCMilliseconds.apply(this._, arguments); },
8670
+ setMinutes: function() { d3_time_prototype.setUTCMinutes.apply(this._, arguments); },
8671
+ setMonth: function() { d3_time_prototype.setUTCMonth.apply(this._, arguments); },
8672
+ setSeconds: function() { d3_time_prototype.setUTCSeconds.apply(this._, arguments); },
8673
+ setTime: function() { d3_time_prototype.setTime.apply(this._, arguments); }
8674
+ };
8675
+
8676
+ var d3_time_prototype = Date.prototype;
8653
8677
  d3.time.format = function(template) {
8654
8678
  var n = template.length;
8655
8679
 
@@ -8673,15 +8697,16 @@ d3.time.format = function(template) {
8673
8697
  }
8674
8698
 
8675
8699
  format.parse = function(string) {
8676
- var date = new d3_time(1900, 0, 1),
8677
- i = d3_time_parse(date, template, string, 0);
8700
+ var d = {y: 1900, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0},
8701
+ i = d3_time_parse(d, template, string, 0);
8678
8702
  if (i != string.length) return null;
8679
- if (date.hour12) {
8680
- var hours = date.getHours() % 12;
8681
- date.setHours(date.hour12pm ? hours + 12 : hours);
8682
- }
8683
- delete date.hour12;
8684
- delete date.hour12pm;
8703
+
8704
+ // The am-pm flag is 0 for AM, and 1 for PM.
8705
+ if ("p" in d) d.H = d.H % 12 + d.p * 12;
8706
+
8707
+ var date = new d3_time();
8708
+ date.setFullYear(d.y, d.m, d.d);
8709
+ date.setHours(d.H, d.M, d.S, d.L);
8685
8710
  return date;
8686
8711
  };
8687
8712
 
@@ -8752,7 +8777,7 @@ var d3_time_parsers = {
8752
8777
  d: d3_time_parseDay,
8753
8778
  e: d3_time_parseDay,
8754
8779
  H: d3_time_parseHour24,
8755
- I: d3_time_parseHour12,
8780
+ I: d3_time_parseHour24,
8756
8781
  // j: function(d, s, i) { /*TODO day of year [001,366] */ return i; },
8757
8782
  L: d3_time_parseMilliseconds,
8758
8783
  m: d3_time_parseMonthNumber,
@@ -8789,7 +8814,7 @@ var d3_time_weekdayAbbrevRe = /^(?:sun|mon|tue|wed|thu|fri|sat)/i,
8789
8814
 
8790
8815
  function d3_time_parseMonthAbbrev(date, string, i) {
8791
8816
  var n = d3_time_monthAbbrevLookup.get(string.substring(i, i += 3).toLowerCase());
8792
- return n == null ? -1 : (date.setMonth(n), i);
8817
+ return n == null ? -1 : (date.m = n, i);
8793
8818
  }
8794
8819
 
8795
8820
  var d3_time_monthAbbrevLookup = d3.map({
@@ -8810,7 +8835,7 @@ var d3_time_monthAbbrevLookup = d3.map({
8810
8835
  function d3_time_parseMonth(date, string, i) {
8811
8836
  d3_time_monthRe.lastIndex = 0;
8812
8837
  var n = d3_time_monthRe.exec(string.substring(i, i + 12));
8813
- return n ? (date.setMonth(d3_time_monthLookup.get(n[0].toLowerCase())), i += n[0].length) : -1;
8838
+ return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i += n[0].length) : -1;
8814
8839
  }
8815
8840
 
8816
8841
  var d3_time_monthRe = /^(?:January|February|March|April|May|June|July|August|September|October|November|December)/ig;
@@ -8860,13 +8885,13 @@ function d3_time_parseLocaleTime(date, string, i) {
8860
8885
  function d3_time_parseFullYear(date, string, i) {
8861
8886
  d3_time_numberRe.lastIndex = 0;
8862
8887
  var n = d3_time_numberRe.exec(string.substring(i, i + 4));
8863
- return n ? (date.setFullYear(n[0]), i += n[0].length) : -1;
8888
+ return n ? (date.y = +n[0], i += n[0].length) : -1;
8864
8889
  }
8865
8890
 
8866
8891
  function d3_time_parseYear(date, string, i) {
8867
8892
  d3_time_numberRe.lastIndex = 0;
8868
8893
  var n = d3_time_numberRe.exec(string.substring(i, i + 2));
8869
- return n ? (date.setFullYear(d3_time_century() + +n[0]), i += n[0].length) : -1;
8894
+ return n ? (date.y = d3_time_century() + +n[0], i += n[0].length) : -1;
8870
8895
  }
8871
8896
 
8872
8897
  function d3_time_century() {
@@ -8876,44 +8901,38 @@ function d3_time_century() {
8876
8901
  function d3_time_parseMonthNumber(date, string, i) {
8877
8902
  d3_time_numberRe.lastIndex = 0;
8878
8903
  var n = d3_time_numberRe.exec(string.substring(i, i + 2));
8879
- return n ? (date.setMonth(n[0] - 1), i += n[0].length) : -1;
8904
+ return n ? (date.m = n[0] - 1, i += n[0].length) : -1;
8880
8905
  }
8881
8906
 
8882
8907
  function d3_time_parseDay(date, string, i) {
8883
8908
  d3_time_numberRe.lastIndex = 0;
8884
8909
  var n = d3_time_numberRe.exec(string.substring(i, i + 2));
8885
- return n ? (date.setDate(+n[0]), i += n[0].length) : -1;
8910
+ return n ? (date.d = +n[0], i += n[0].length) : -1;
8886
8911
  }
8887
8912
 
8888
- // Note: we don't validate that the hour is in the range [0,23].
8913
+ // Note: we don't validate that the hour is in the range [0,23] or [1,12].
8889
8914
  function d3_time_parseHour24(date, string, i) {
8890
8915
  d3_time_numberRe.lastIndex = 0;
8891
8916
  var n = d3_time_numberRe.exec(string.substring(i, i + 2));
8892
- return n ? (date.setHours(+n[0]), i += n[0].length) : -1;
8893
- }
8894
-
8895
- // Note: we don't validate that the hour is in the range [1,12].
8896
- function d3_time_parseHour12(date, string, i) {
8897
- date.hour12 = true;
8898
- return d3_time_parseHour24(date, string, i);
8917
+ return n ? (date.H = +n[0], i += n[0].length) : -1;
8899
8918
  }
8900
8919
 
8901
8920
  function d3_time_parseMinutes(date, string, i) {
8902
8921
  d3_time_numberRe.lastIndex = 0;
8903
8922
  var n = d3_time_numberRe.exec(string.substring(i, i + 2));
8904
- return n ? (date.setMinutes(+n[0]), i += n[0].length) : -1;
8923
+ return n ? (date.M = +n[0], i += n[0].length) : -1;
8905
8924
  }
8906
8925
 
8907
8926
  function d3_time_parseSeconds(date, string, i) {
8908
8927
  d3_time_numberRe.lastIndex = 0;
8909
8928
  var n = d3_time_numberRe.exec(string.substring(i, i + 2));
8910
- return n ? (date.setSeconds(+n[0]), i += n[0].length) : -1;
8929
+ return n ? (date.S = +n[0], i += n[0].length) : -1;
8911
8930
  }
8912
8931
 
8913
8932
  function d3_time_parseMilliseconds(date, string, i) {
8914
8933
  d3_time_numberRe.lastIndex = 0;
8915
8934
  var n = d3_time_numberRe.exec(string.substring(i, i + 3));
8916
- return n ? (date.setMilliseconds(+n[0]), i += n[0].length) : -1;
8935
+ return n ? (date.L = +n[0], i += n[0].length) : -1;
8917
8936
  }
8918
8937
 
8919
8938
  // Note: we don't look at the next directive.
@@ -8921,7 +8940,7 @@ var d3_time_numberRe = /\s*\d+/;
8921
8940
 
8922
8941
  function d3_time_parseAmPm(date, string, i) {
8923
8942
  var n = d3_time_amPmLookup.get(string.substring(i, i += 2).toLowerCase());
8924
- return n == null ? -1 : (date.hour12pm = n, i);
8943
+ return n == null ? -1 : (date.p = n, i);
8925
8944
  }
8926
8945
 
8927
8946
  var d3_time_amPmLookup = d3.map({