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

<link href="../src/nv.d3.css" rel="stylesheet" type="text/css">
<link href="teststyle.css" rel="stylesheet" type='text/css'>
<style>

</style>
<body>
  <h3>Test cases for Domain and Range overrides - Example of a polylinear scale</h3>
  <div style='position:relative;'>
      <div class='navigation'>
          Tests:
          <a href="lineChartTest.html">Line Chart</a>
          <a href="stackedAreaChartTest.html">Stacked Area</a>
          <a href="../examples/cumulativeLineChart.html">Cumulative Line</a>
          <a href="ScatterChartTest.html">Scatter</a>
          <a href="pieChartTest.html">Pie chart</a>
      </div>
      <div class='chart full' id='chart1'>
        Line chart: yDomain = [0,2,200], yRange = [500,50,0]
        <svg></svg>
      </div>
      <div class='chart half with-transitions' id='chart2'>
        Historical bar chart: yDomain = [0,2,130], yRange = [500,50,0]
        <svg></svg>
      </div>

      <div class='half'>
        Notes:
        The chart.yRange() and chart.xRange() properties are an advanced feature.  They are useful
        in situations where your data has wild extremes: ie, you have lots of smaller numbers, and lots of really big numbers.<br/><br/>

        Without a polylinear scale, those really big data points will overwhelm the small points.<br/><br/>

        Please look at the examples to understand how polylinear scales work.  Comment/uncomment the lines that alter yDomain and yRange
        to see the effect it has on the charts.
      </div>
  </div>

<script src="../lib/d3.v3.js"></script>
<script src="../nv.d3.js"></script>
<script src="../src/tooltip.js"></script>
<script src="../src/utils.js"></script>
<script src="../src/interactiveLayer.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/line.js"></script>
<script src="../src/models/lineChart.js"></script>
<script src="../src/models/historicalBar.js"></script>
<script src="../src/models/historicalBarChart.js"></script>
<script>

//------------ CHART 1 
lineChartConfig("chart1", sinAndCos(),true, false);
barChartConfig(dataWithSpikes());


function lineChartConfig(containerid, data, guideline, useDates, auxOptions) {
  if (auxOptions === undefined) auxOptions = {};
  if (guideline === undefined) guideline = true;
  nv.addGraph(function() {
    var chart;
    chart = nv.models.lineChart().useInteractiveGuideline(guideline);

    var fullChartHeight = 500 - chart.margin().top - chart.margin().bottom;
    chart
        .x(function(d,i) { 
          return d.x;
        })
       .yDomain([0,2,200])   //Using a polylinear scale
        .yRange([fullChartHeight,50,0])
        ;

    if (auxOptions.width) 
      chart.width(auxOptions.width);

    if (auxOptions.height)
      chart.height(auxOptions.height);

    var formatter;
    if (useDates) {
        formatter = function(d,i) {
                var now = (new Date()).getTime() - 86400 * 1000 * 365;
                now = new Date(now + d * 86400 * 1000);
                return d3.time.format('%b %d %Y')(now );
        }
    }
    else {
        formatter = d3.format(",.1f");
    }

    chart.xAxis // chart sub-models (ie. xAxis, yAxis, etc) when accessed directly, return themselves, not the parent chart, so need to chain separately
        .tickFormat(
            formatter
          );

    chart.yAxis
        .axisLabel('Voltage (v)')
        .tickFormat(d3.format(',.2f'));

    d3.select('#' + containerid + ' svg')
        .datum(data)
      .transition().duration(500)
        .call(chart);

    nv.utils.windowResize(chart.update);

    return chart;
  });
}

function barChartConfig(data) {
    nv.addGraph(function() {
      var chart = nv.models.historicalBarChart();
      var fullChartHeight = 500 - chart.margin().top - chart.margin().bottom;
      chart.color(["#ff7f0e"])
      .yDomain([0,2,130])
      .yRange([fullChartHeight,50,0])
      .transitionDuration(500)
      ;

      chart.xAxis 
      .tickFormat(d3.format(',.1f'))
      .axisLabel("Time")
      ;

       chart.yAxis
      .axisLabel('Random Number')
      .tickFormat(d3.format(',.4f'));
      d3.select("#chart2 svg")
        .datum(data)
        .transition().duration(500)
        .call(chart);

      nv.utils.windowResize(chart.update);
      return chart;
    });
}

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

  var now = (new Date()).getTime();
  for (var i = 0; i < 100; i++) {
    sin.push({x: i, y:  Math.abs(Math.sin(i/10)) }); //the nulls are to show how defined works
    cos.push({x: i, y: Math.abs(.5 * Math.cos(i/10)) });

    higherOrder.push({x: i, y: Math.cos(i) * 100 + 100});
  }

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

function dataWithSpikes() {
   var rval = [];
   for(var i =0; i < 100; i++) {

      var spike = (Math.random() > 0.9);
      rval.push({
        x: i,
        y: (spike) ? Math.random() * 100 + 30 : Math.random()
      });
   }
   return [
      {key: "Series 1",
      color : "orange",
      values: rval}
   ];
}

</script>
