<script type="text/javascript">
  chartsDrawing += 1;
  google.charts.setOnLoadCallback(drawChart_{{ chart_elem_id }});
  function drawChart_{{ chart_elem_id }}() {
    var data = new google.visualization.DataTable();

    // Chart options
    var options = {
      theme : 'material',
      legend: 'none',
      hAxis: { format: '', title: 'Commit number',
               minValue: {{ chart_opts.haxis.min }},
               maxValue: {{ chart_opts.haxis.max }} },
      {% if measurement.type == 'time' %}
      vAxis: { format: 'h:mm:ss' },
      {% else %}
      vAxis: { format: '' },
      {% endif %}
      pointSize: 5,
      chartArea: { left: 80, right: 15 },
    };

    // Define data columns
    data.addColumn('number', 'Commit');
    data.addColumn('{{ measurement.value_type.gv_data_type }}',
                   '{{ measurement.value_type.quantity }}');
    // Add data rows
    data.addRows([
      {% for sample in measurement.samples %}
        [{{ sample.commit_num }}, {{ sample.mean.gv_value() }}],
      {% endfor %}
    ]);

    // Finally, draw the chart
    chart_div = document.getElementById('{{ chart_elem_id }}');
    var chart = new google.visualization.LineChart(chart_div);
    google.visualization.events.addListener(chart, 'ready', function () {
      //chart_div = document.getElementById('{{ chart_elem_id }}');
      //chart_div.innerHTML = '<img src="' + chart.getImageURI() + '">';
      png_div = document.getElementById('{{ chart_elem_id }}_png');
      png_div.outerHTML = '<a id="{{ chart_elem_id }}_png" href="' + chart.getImageURI() + '">PNG</a>';
      console.log("CHART READY: {{ chart_elem_id }}");
      chartsDrawing -= 1;
      if (chartsDrawing == 0)
        console.log("ALL CHARTS READY");
    });
    chart.draw(data, options);
}
</script>

