<!DOCTYPE HTML>
<html>
<head>
  <link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
  <link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
  <link rel="stylesheet" href="examples.css" type="text/css"/>
  <style>
  .totals {
    font-weight: bold;
    color: gray;
    font-style: italic;
  }
  </style>
</head>
<body>
<div style="position:relative">
  <div style="width:600px;">
    <div id="myGrid" style="width:100%;height:500px;"></div>
  </div>

  <div class="options-panel">
    <h2>Demonstrates:</h2>
    <ul>
      <li>Implementing a data provider to create a totals row at the end of the grid.</li>
      <li>This is a simplification of what the DataView does. </li>
    </ul>
  </div>
    <h2>View Source:</h2>
    <ul>
        <li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example-totals-via-data-provider.html" target="_sourcewindow"> View the source for this example on Github</a></li>
    </ul>
</div>

<script src="../lib/firebugx.js"></script>

<script src="../lib/jquery-1.7.min.js"></script>
<script src="../lib/jquery-ui-1.8.16.custom.min.js"></script>
<script src="../lib/jquery.event.drag-2.2.js"></script>

<script src="../slick.core.js"></script>
<script src="../slick.editors.js"></script>
<script src="../slick.grid.js"></script>

<script>
  var grid;
  var data = [];
  var options = {
    enableCellNavigation: true,
    headerRowHeight: 30,
    editable: true
  };

  var columns = [];
  for (var i = 0; i < 10; i++) {
    columns.push({
      id: i,
      name: String.fromCharCode("A".charCodeAt(0) + i),
      field: i,
      width: 60,
      editor: Slick.Editors.Integer
    });
  }



  function TotalsDataProvider(data, columns) {
    var totals = {};
    var totalsMetadata = {
      // Style the totals row differently.
      cssClasses: "totals",
      columns: {}
    };

    // Make the totals not editable.
    for (var i = 0; i < columns.length; i++) {
      totalsMetadata.columns[i] = { editor: null };
    }


    this.getLength = function() {
      return data.length + 1;
    };

    this.getItem = function(index) {
      return (index < data.length) ? data[index] : totals;
    };

    this.updateTotals = function() {
      var columnIdx = columns.length;
      while (columnIdx--) {
        var columnId = columns[columnIdx].id;
        var total = 0;
        var i = data.length;
        while (i--) {
          total += (parseInt(data[i][columnId], 10) || 0);
        }
        totals[columnId] = "Sum:  " + total;
      }
    };

    this.getItemMetadata = function(index) {
      return (index != data.length) ? null : totalsMetadata;
    };

    this.updateTotals();
  }



  $(function () {
    for (var i = 0; i < 10; i++) {
      var d = (data[i] = {});
      d["id"] = i;
      for (var j = 0; j < columns.length; j++) {
        d[j] = Math.round(Math.random() * 10);
      }
    }

    var dataProvider = new TotalsDataProvider(data, columns);

    grid = new Slick.Grid("#myGrid", dataProvider, columns, options);

    grid.onCellChange.subscribe(function(e, args) {
      // The data has changed - recalculate the totals.
      dataProvider.updateTotals();

      // Rerender the totals row (last row).
      grid.invalidateRow(dataProvider.getLength() - 1);
      grid.render();
    });
  })
</script>
</body>
</html>