// Generated by CoffeeScript 1.10.0
(function() {
  var checked, colors, distance, margin, max_depth, redraw, svg, tree_url, vis, width, zip,
    indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };

  width = 1100;

  distance = 16;

  margin = 40;

  max_depth = 7;

  tree_url = 'tree.jsonld';

  colors = {
    core: '#b2182b',
    bib: '#2166ac',
    auto: '#1b7837'
  };

  checked = ['core'];

  d3.select(self.frameElement).style('height', (2 * margin) + "px");


  /* python-like zip */

  zip = function() {
    var args, shortest;
    args = [].slice.call(arguments);
    shortest = args.length === 0 ? [] : args.reduce((function(a, b) {
      if (a.length < b.length) {
        return a;
      } else {
        return b;
      }
    }));
    return shortest.map((function(_, i) {
      return args.map(function(array) {
        return array[i];
      });
    }));
  };

  svg = d3.select('body').append('svg');

  vis = svg.append('g');

  redraw = function() {
    return d3.json(tree_url, function(data) {
      var diagonal, enter_ex, extensions, extensions_data, filter_tree, height, link, links, mouseout, mouseover, node, node_enter, nodes, root, rsort, subtable, tcmp, tree;
      root = data;
      root.name = "Thing";
      extensions_data = [];
      filter_tree = function(t) {
        var c, i, indexes, j, l, len, len1, ref, ref1, ref2, ref3, results;
        indexes = [];
        if (t.children != null) {
          ref = t.children;
          for (i = j = 0, len = ref.length; j < len; i = ++j) {
            c = ref[i];
            if ((ref1 = c.layer, indexOf.call(extensions_data, ref1) < 0) && c.layer !== 'core') {
              extensions_data.push(c.layer);
            }
            if (ref2 = c.layer, indexOf.call(checked, ref2) < 0) {
              indexes.push(i);
              continue;
            }
            filter_tree(c);
          }
          ref3 = indexes.reverse();
          results = [];
          for (l = 0, len1 = ref3.length; l < len1; l++) {
            i = ref3[l];
            results.push(t.children.splice(i, 1));
          }
          return results;
        }
      };
      tcmp = function(a, b) {
        var ai, bi, ci, j, len, ref, ref1;
        ref = zip(a.children, b.children);
        for (j = 0, len = ref.length; j < len; j++) {
          ref1 = ref[j], ai = ref1[0], bi = ref1[1];
          ci = tcmp(ai, bi);
          if (ci !== 0) {
            return ci;
          }
        }
        return b.children.length - a.children.length;
      };
      rsort = function(t) {
        var c, i, j, len, ref;
        ref = t.children;
        for (i = j = 0, len = ref.length; j < len; i = ++j) {
          c = ref[i];
          if (c.children == null) {
            c.children = [];
          }
          rsort(c);
        }
        return t.children.sort(tcmp);
      };
      rsort(root);
      filter_tree(root);
      tree = d3.layout.tree().size([0, 0]);
      nodes = tree.nodes(root);
      links = tree.links(nodes);
      height = 0;
      nodes.forEach(function(n, i) {
        if ((n.parent != null) && n.parent.children[0] !== n) {
          height += distance;
        }
        if (i > 0 && nodes[i - 1].depth > n.depth) {
          height += 25;
        }
        n.x = height;
        return n.y = n.depth * (width / max_depth);
      });
      extensions = d3.select('#extensions').selectAll('.extension').data(extensions_data);
      enter_ex = extensions.enter().append('span');
      enter_ex.append('input').attr({
        "class": 'extension',
        value: function(d) {
          return d;
        },
        type: 'checkbox',
        name: 'extension'
      }).on('change', function(d) {
        if (this.checked) {
          checked.push(d);
        } else {
          checked.splice(checked.indexOf(d), 1);
        }
        return redraw();
      });
      enter_ex.append('span').text(function(d) {
        return d;
      });
      diagonal = d3.svg.diagonal().projection(function(d) {
        return [d.y, d.x];
      });
      svg.attr('width', width).attr('height', height + 2 * margin);
      vis.attr('transform', "translate(" + margin + "," + margin + ")");
      link = vis.selectAll('path.link').data(links);
      link.enter().append('path').attr('class', 'link');
      link.attr('d', diagonal);
      link.exit().remove();
      subtable = function(key, obj) {
        var k, ref, str, v;
        str = "<table>";
        ref = obj[key];
        for (k in ref) {
          v = ref[k];
          if (v instanceof Object) {
            str += "<tr><td class='key'>" + k + "</td><td class='value'>" + subtable(k, obj[key]) + "</td></tr>";
          } else {
            str += "<tr><td class='key'>" + k + "</td><td class='value'>" + v + "</td></tr>";
          }
        }
        return str + "</table>";
      };
      mouseover = function(d) {
        var kv, table;
        d3.select('#infobox').style({
          display: 'inline',
          top: (event.pageY + 25) + "px",
          left: event.pageX + "px"
        });
        table = d3.select('#infobox table');
        kv = table.selectAll('.key_value').data(Object.keys(d).filter(function(k) {
          return k !== 'children' && k !== 'parent' && k !== 'x' && k !== 'y';
        }).sort());
        kv.enter().append('tr').attr({
          "class": 'key_value'
        });
        kv.append('td').attr({
          "class": 'key'
        }).text(function(k) {
          return "" + k;
        });
        return kv.append('td').attr({
          "class": 'value'
        }).html(function(k) {
          if (k === '@context') {
            return subtable(k, d);
          } else {
            return "" + d[k];
          }
        });
      };
      mouseout = function() {
        d3.select('#infobox').style('display', 'none');
        return d3.select('#infobox table').html('');
      };
      node = vis.selectAll('g.node').data(nodes, function(d) {
        return d['@id'];
      });
      node_enter = node.enter().append('g').attr('class', 'node');
      node.attr('transform', function(d) {
        return "translate(" + d.y + "," + d.x + ")";
      });
      node_enter.append('circle').attr({
        r: 5,
        stroke: function(d) {
          if (d.children) {
            return colors[d.layer];
          }
        },
        fill: function(d) {
          if (!d.children) {
            return colors[d.layer];
          } else {
            return 'white';
          }
        }
      });
      node_enter.append('a').attr({
        "class": 'class',
        'xlink:href': function(d) {
          return 'http://schema.org/' + d.name;
        }
      }).on('mouseover', mouseover).on('mouseout', mouseout).append('text').attr({
        x: function(d) {
          if (d.children) {
            return -9;
          } else {
            return 8;
          }
        },
        dy: function(d) {
          if (d.children) {
            return -2;
          } else {
            return 3;
          }
        },
        'text-anchor': function(d) {
          if (d.children) {
            return 'end';
          } else {
            return 'start';
          }
        }
      }).text(function(d) {
        return d.name;
      });
      node.exit().remove();

      /* adapt bl.ocks.org frame to the tree */
      return d3.select(self.frameElement).transition().duration(500).style('height', (height + 2 * margin) + "px");
    });
  };

  redraw();

}).call(this);