code: function findEmptyColumns(columns, objs, offset) {
    var emptyIndexes = [];
    for (var i = 0; i < columns.length; i++) {
      if (objs.every(function(obj) {
        if (columns[i].path.slice(-2) === '.*') {
          return false;
        }
        var val = obj.get(columns[i].path);
        return !val || val.length === 0;
      })) {
        emptyIndexes.push( (offset||0) + i);
      }
    }
    return emptyIndexes;
  }
docs: /*
  TODO
  
  datatype formating (e.g. date)
  have details display columns offscreen
  window.innerWidth < columnElement.getBoundingClientRect().right
  details needs to show path, suppress empty columns
  save hidden colunm state (html5 pushstate?)
  editor
  - fieldset based on schema tree
  - support object refs: autocomplete (how to display object "titles")
   /*
  rowspan = total depth - (current depth-1) if cell has no children
  colspan = sum of childrens colspan or 1
  
  1   2   3    <= row
  ----------
  a            rowspan=3
  b            colspan=1, rowspan=1
  b1       rowspan=2
  c            colspan=3, rowspan=1
  c1       colspan=2, rowspan=1
  c1.1
  c1.2
  c2       colspan=1, rowspan=2