import “../arrays/map”; import “../core/functor”; import “../math/trigonometry”; import “svg”;

d3.svg.symbol = function() {

var type = d3_svg_symbolType,
    size = d3_svg_symbolSize;

function symbol(d, i) {
  return (d3_svg_symbols.get(type.call(this, d, i))
      || d3_svg_symbolCircle)
      (size.call(this, d, i));
}

symbol.type = function(x) {
  if (!arguments.length) return type;
  type = d3_functor(x);
  return symbol;
};

// size of symbol in square pixels
symbol.size = function(x) {
  if (!arguments.length) return size;
  size = d3_functor(x);
  return symbol;
};

return symbol;

};

function d3_svg_symbolSize() {

return 64;

}

function d3_svg_symbolType() {

return "circle";

}

function d3_svg_symbolCircle(size) {

var r = Math.sqrt(size / π);
return "M0," + r
    + "A" + r + "," + r + " 0 1,1 0," + (-r)
    + "A" + r + "," + r + " 0 1,1 0," + r
    + "Z";

}

// TODO cross-diagonal? var d3_svg_symbols = d3.map({

"circle": d3_svg_symbolCircle,
"cross": function(size) {
  var r = Math.sqrt(size / 5) / 2;
  return "M" + -3 * r + "," + -r
      + "H" + -r
      + "V" + -3 * r
      + "H" + r
      + "V" + -r
      + "H" + 3 * r
      + "V" + r
      + "H" + r
      + "V" + 3 * r
      + "H" + -r
      + "V" + r
      + "H" + -3 * r
      + "Z";
},
"diamond": function(size) {
  var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)),
      rx = ry * d3_svg_symbolTan30;
  return "M0," + -ry
      + "L" + rx + ",0"
      + " 0," + ry
      + " " + -rx + ",0"
      + "Z";
},
"square": function(size) {
  var r = Math.sqrt(size) / 2;
  return "M" + -r + "," + -r
      + "L" + r + "," + -r
      + " " + r + "," + r
      + " " + -r + "," + r
      + "Z";
},
"triangle-down": function(size) {
  var rx = Math.sqrt(size / d3_svg_symbolSqrt3),
      ry = rx * d3_svg_symbolSqrt3 / 2;
  return "M0," + ry
      + "L" + rx +"," + -ry
      + " " + -rx + "," + -ry
      + "Z";
},
"triangle-up": function(size) {
  var rx = Math.sqrt(size / d3_svg_symbolSqrt3),
      ry = rx * d3_svg_symbolSqrt3 / 2;
  return "M0," + -ry
      + "L" + rx +"," + ry
      + " " + -rx + "," + ry
      + "Z";
}

});

d3.svg.symbolTypes = d3_svg_symbols.keys();

var d3_svg_symbolSqrt3 = Math.sqrt(3),

d3_svg_symbolTan30 = Math.tan(30 * d3_radians);