import “../core/functor”; import “../core/source”; import “../core/target”; import “../math/trigonometry”; import “arc”; import “svg”;

d3.svg.chord = function() {

var source = d3_source,
    target = d3_target,
    radius = d3_svg_chordRadius,
    startAngle = d3_svg_arcStartAngle,
    endAngle = d3_svg_arcEndAngle;

// TODO Allow control point to be customized.

function chord(d, i) {
  var s = subgroup(this, source, d, i),
      t = subgroup(this, target, d, i);
  return "M" + s.p0
    + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t)
    ? curve(s.r, s.p1, s.r, s.p0)
    : curve(s.r, s.p1, t.r, t.p0)
    + arc(t.r, t.p1, t.a1 - t.a0)
    + curve(t.r, t.p1, s.r, s.p0))
    + "Z";
}

function subgroup(self, f, d, i) {
  var subgroup = f.call(self, d, i),
      r = radius.call(self, subgroup, i),
      a0 = startAngle.call(self, subgroup, i) + d3_svg_arcOffset,
      a1 = endAngle.call(self, subgroup, i) + d3_svg_arcOffset;
  return {
    r: r,
    a0: a0,
    a1: a1,
    p0: [r * Math.cos(a0), r * Math.sin(a0)],
    p1: [r * Math.cos(a1), r * Math.sin(a1)]
  };
}

function equals(a, b) {
  return a.a0 == b.a0 && a.a1 == b.a1;
}

function arc(r, p, a) {
  return "A" + r + "," + r + " 0 " + +(a > π) + ",1 " + p;
}

function curve(r0, p0, r1, p1) {
  return "Q 0,0 " + p1;
}

chord.radius = function(v) {
  if (!arguments.length) return radius;
  radius = d3_functor(v);
  return chord;
};

chord.source = function(v) {
  if (!arguments.length) return source;
  source = d3_functor(v);
  return chord;
};

chord.target = function(v) {
  if (!arguments.length) return target;
  target = d3_functor(v);
  return chord;
};

chord.startAngle = function(v) {
  if (!arguments.length) return startAngle;
  startAngle = d3_functor(v);
  return chord;
};

chord.endAngle = function(v) {
  if (!arguments.length) return endAngle;
  endAngle = d3_functor(v);
  return chord;
};

return chord;

};

function d3_svg_chordRadius(d) {

return d.radius;

}