<!DOCTYPE html>
<meta charset="utf-8">
<link href="../src/nv.d3.css" rel="stylesheet" type="text/css">
<style>

body {
  overflow-y:scroll;
}

text {
  font: 12px sans-serif;
}

</style>
<body>

<svg id="test1"></svg>

<script src="../lib/d3.v3.js"></script>
<script src="../nv.d3.js"></script>
<script src="../src/models/historicalBar.js"></script>
<script src="../src/utils.js"></script>

<script> 


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

    var chart = nv.models.historicalBar()
        .padData(true)
        .width(width)
        .height(height);

    d3.select("#test1")
      .attr('width', width)
      .attr('height', height)
      .datum(sinData())
      .transition()
      .call(chart);

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

    graph.dispatch.on('elementMouseover', function(e) {
        var offsetElement = document.getElementById("chart"),
                left = e.pos[0],
                top = e.pos[1];

                /*
        var content = '<h3>' + e.label + '</h3>' +
                '<p>' +
                e.value +
                '</p>';
                */

        var content = '<p>' + e.point.y + '</p>';

        nv.tooltip.show([left, top], content, e.value < 0 ? 'n' : 's');
    });

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

    /*
    graph.dispatch.on('elementClick', function(e) {
        console.log("Bar Click",e);
    });

    graph.dispatch.on('chartClick', function(e) {
        console.log("Chart Click",e);
    });

    graph.dispatch.on('chartClick', function(e) {
        console.log('Click Switching to');
        if (td === 0) {
            d3.select("#test1")
                    .datum(testdata2)
                    .call(graph);
            td = 1;

        } else {
            d3.select("#test1")
                    .datum(testdata)
                    .call(graph);
            td = 0;
        }
      });
    */


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

      graph
        .width(width)
        .height(height)

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





//Simple test data generators

function sinAndCos() {
  var sin = [],
      cos = [];

  for (var i = 0; i < 100; i++) {
    sin.push({x: i, y: Math.sin(i/10)});
    cos.push({x: i, y: .5 * Math.cos(i/10)});
  }

  return [
    {
      values: sin,
      key: "Sine Wave",
      color: "#ff7f0e"
    },
    {
      values: cos,
      key: "Cosine Wave",
      color: "#2ca02c"
    }
  ];
}


function sinData() {
  var sin = [];

  for (var i = 0; i < 100; i++) {
    sin.push({x: i, y: Math.sin(i/10)});
  }

  return [
    {
      values: sin,
      key: "Sine Wave",
      color: "#ff7f0e"
    }
  ];
}

</script>
