/*global Gallery,Dygraph,data */
Gallery.register(
  'number-format',
  {
    name: 'Number formatting',
    setup: function(parent) {
      parent.innerHTML =
          "<p>The default formatting mimics printf with %.<i>p</i>g where <i>p</i> is" +
          "   the precision to use.  It turns out that JavaScript's toPrecision()" +
          "   method is almost but not exactly equal to %g; they differ for values" +
          "   with small absolute values (10^-1 to 10^-5 or so), with toPrecision()" +
          "   yielding strings that are longer than they should be (i.e. using fixed" +
          "   point where %g would use exponential).</p>" +

          "<p>This test is intended to check that our formatting works properly for a" +
          "   variety of precisions.</p>" +

          "<p>Precision to use (1 to 21):" +
          "  <input type='text' id='p_input' size='20'></p>" +
          "<p/>" +
          "<div id='content' style='font-family:Courier New,monospace'></div>";
    },
    run: function() {
      // Helper functions for generating an HTML table for holding the test
      // results.
      var createRow = function(columnType, columns) {
        var row = document.createElement('tr');
        for (var i = 0; i  < columns.length; i ++) {
          var th = document.createElement(columnType);
          var text = document.createTextNode(columns[i]);
          th.appendChild(text);
          row.appendChild(th);
        }
        return row;
      };

      var createHeaderRow = function(columns) {
        return createRow('th', columns);
      };

      var createDataRow = function(columns) {
        return createRow('td', columns);
      };

      var createTable = function(headerColumns, dataColumnsList) {
        var table = document.createElement('table');
        table.appendChild(createHeaderRow(headerColumns));
        for (var i = 0; i < dataColumnsList.length; i++) {
          table.appendChild(createDataRow(dataColumnsList[i]));
        }
        return table;
      };

      var updateTable = function() {
        var headers = ['Dygraph.floatFormat()', 'toPrecision()',
                       'Dygraph.floatFormat()', 'toPrecision()'];
        var numbers = [];
        var p = parseInt(document.getElementById('p_input').value, 10);

        for (var i = -10; i <= 10; i++) {
          var n = Math.pow(10, i);
          numbers.push([Dygraph.floatFormat(n, p),
                        n.toPrecision(p),
                        Dygraph.floatFormat(Math.PI * n, p),
                        (Math.PI * n).toPrecision(p)]);
        }

        // Check exact values of 0.
        numbers.push([Dygraph.floatFormat(0.0, p),
                      (0.0).toPrecision(p)]);

        var elem = document.getElementById('content');
        elem.innerHTML = '';
        elem.appendChild(createTable(headers, numbers));
      };

      document.getElementById('p_input').value = '4';
      document.getElementById('p_input').onchange = updateTable;
      updateTable();
    }
  });
