mysociety/alaveteli

View on GitHub
app/assets/javascripts/stats-graphs.js

Summary

Maintainability
A
0 mins
Test Coverage
/* From http://stackoverflow.com/a/10284006/223092 */
function zip(arrays) {
  return arrays[0].map(function(_,i){
    return arrays.map(function(array){return array[i]})
  });
}

$(document).ready(function() {
  $.each(graphs_data, function(index, graph_data) {
    var graph_id = graph_data.id,
    dataset,
    plot,
    graph_data,
    graph_div = $('#' + graph_id),
    previousPoint = null;

    if (!graph_data.x_values) {
      /* Then there's no data for this graph */
      return true;
    }

    graph_div.css('width', '700px');
    graph_div.css('height', '600px');

    dataset = [
      {'color': 'orange',
      'bars': {
        'show': true,
        'barWidth': 0.5,
        'align': 'center'
      },
      'data': zip([graph_data.x_values,
        graph_data.y_values])
      }
    ]

    if (graph_data.errorbars) {
      dataset.push({
        'color': 'orange',
        'points': {
          // Don't show these, just draw error bars:
          'radius': 0,
          'errorbars': 'y',
          'yerr': {
            'asymmetric': true,
            'show': true,
            'upperCap': "-",
            'lowerCap': "-",
            'radius': 5
          }
        },
        'data': zip([graph_data.x_values,
          graph_data.y_values,
          graph_data.cis_below,
          graph_data.cis_above])
        });
      }

      options = {
        'grid': { 'hoverable': true, 'clickable': true },
        'xaxis': {
          'ticks': graph_data.x_ticks,
          'rotateTicks': 90
        },
        'yaxis': {
          'min': 0,
          'max': graph_data.y_max
        },
        'xaxes': [{
          'axisLabel': graph_data.x_axis,
          'axisLabelPadding': 20,
          'axisLabelColour': 'black'
        }],
        'yaxes': [{
          'axisLabel': graph_data.y_axis,
          'axisLabelPadding': 20,
          'axisLabelColour': 'black'
        }],
        'series': {
          'lines': {
            'show': false
          }
        },
      }

      plot = $.plot(graph_div,
        dataset,
        options);

        graph_div.bind("plotclick", function(event, pos, item) {
          var i, pb, url, name;
          if (item) {
            i = item.dataIndex;
            pb = graph_data.public_bodies[i];
            url = pb.url;
            name = pb.name;
            window.location.href = url;
          }
        });

        /* This code is adapted from:
        http://www.flotcharts.org/flot/examples/interacting/ */

        function showTooltip(x, y, contents) {
          $('<div id="flot-tooltip">' + contents + '</div>').css({
            'position': 'absolute',
            'display': 'none',
            'top': y + 10,
            'left': x + 10,
            'border': '1px solid #fdd',
            'padding': '2px',
            'background-color': '#fee',
            'opacity': 0.80
          }).appendTo("body").fadeIn(200);
        }

        graph_div.bind("plothover", function (event, pos, item) {
          var escapedName, x, y;
          if (item) {
            if (previousPoint != item.dataIndex) {
              previousPoint = item.dataIndex;
              $("#flot-tooltip").remove();
              escapedName = $('<div />').text(
                graph_data.tooltips[item.dataIndex]).html();
                showTooltip(item.pageX,
                  item.pageY,
                  escapedName);
                }
              } else {
                $("#flot-tooltip").remove();
                previousPoint = null;
              }
            });
          });
        });