<!DOCTYPE html>
<meta charset="utf-8">

<link href="../src/d3.css" rel="stylesheet" type="text/css">

<style>

body {
  overflow-y:scroll;
  margin: 0;
  padding: 0;
}

svg {
  overflow: hidden;
}

div {
  border: 0;
  margin: 0;
}


#offsetDiv {
}


#test1 {
  margin: 0;
}


</style>

<body>

<div id="offsetDiv">
  <div id="test1" class="chartWrap">
    <svg></svg>
  </div>
</div>

<script src="../lib/d3.v2.js"></script>
<script src="../nv.d3.js"></script>
<script src="../src/tooltip.js"></script>
<script src="../src/models/legend.js"></script>
<script src="../src/models/axis.js"></script>
<script src="../src/models/scatter.js"></script>
<script src="../src/models/scatterWithLegend.js"></script>
<script>



//Format A
nv.addGraph({
  generate: function() {
      var width = nv.utils.windowSize().width - 40,
          height = nv.utils.windowSize().height - 40;

      var chart = nv.models.scatterWithLegend()
                .width(width)
                .height(height)
                .showDistX(true)
                .showDistY(true)
                .color(d3.scale.category10().range());
                //.width(width)
                //.height(height)
                //.forceX([-4,4])
                //.forceY([-4,4])
                //.margin({top: 20, right: 10, bottom: 50, left: 80})


    //chart.xaxis.tickFormat(d3.format(".02f"))

    var svg =d3.select('#test1 svg')
      .datum(randomData());


    svg.transition().duration(500)
      .attr('width', width)
      .attr('height', height)
      .call(chart)
      //.attr('width', wid0th)
      //.attr('height', height)

    return chart;
  },
  callback: function(graph) {

    graph.dispatch.on('tooltipShow', function(e) {
        var offsetElement = document.getElementById("test1"),
                left = e.pos[0] + offsetElement.offsetLeft,
                top = e.pos[1] + offsetElement.offsetTop,
                formatter = d3.format(".2f");


      /*
      var content = '<h3>' + e.series.key + '</h3>' +
                    '<p>' +
                    '<span class="value"><span class="label">x:</span><span class="val">' + formatter(e.point.x) + '</span></span><br>' +
                    '<s0pan class="value"><span class="label">y:</span><span class="val">' + formatter(e.point.y) + '</span></span>' +
                    '</p>';

      nvtooltip.show([left, top], content);
      */

      var contentX = '<strong>' + formatter(e.point.x) + '</strong>';
      var contentY = '<strong>' + formatter(e.point.y) + '</strong>';
      var height = nv.utils.windowSize().height - 40;

      nv.tooltip.show([left, height - 50], contentX, 'n', 1);
      nv.tooltip.show([5, top], contentY, 'w', 1);
    });


    graph.dispatch.on('tooltipHide', function(e) {
      nv.tooltip.cleanup();
    });

    window.onresize = function() {
     var width = nv.utils.windowSize().width - 40,
        height = nv.utils.windowSize().height - 40,
        margin = graph.margin();


      if (width < margin.left + margin.right + 20)
        width = margin.left + margin.right + 20;

      if (height < margin.top + margin.bottom + 20)
        height = margin.top + margin.bottom + 20;


      graph
        .width(width)
        .height(height);

      d3.select('#test1 svg')
        .attr('width', width)
        .attr('height', height)
        .call(graph);

      };
  }
});


function randomData() {
  var data = [],
      random = d3.random.normal();

  for (i = 0; i < 2; i++) {
    data.push({
      key: 'Group ' + i,
      values: []
    });

    for (j = 0; j < 100; j++) {
      data[i].values.push({x: random(), y: random(), size: Math.random()});
    }
  }

  return data;
}



</script>
