"use strict";

var _ = require("lodash"),
    addLabel = require("./label/add-label"),
    util = require("./util"),
    d3 = require("./d3");

module.exports = createNodes;

function createNodes(selection, g, shapes) {
  var simpleNodes = g.nodes().filter(function(v) { return !util.isSubgraph(g, v); });
  var svgNodes = selection.selectAll("g.node")
    .data(simpleNodes, function(v) { return v; })
    .classed("update", true);

  svgNodes.selectAll("*").remove();
  svgNodes.enter()
    .append("g")
    .attr("class", "node");
  svgNodes.each(function(v) {
    var node = g.node(v),
        thisGroup = d3.select(this),
        labelGroup = thisGroup.append("g").attr("class", "label"),
        labelDom = addLabel(labelGroup, node),
        shape = shapes[node.shape],
        bbox = labelDom.node().getBBox();

    if (_.has(node, "width")) { bbox.width = node.width; }
    if (_.has(node, "height")) { bbox.height = node.height; }

    bbox.width += node.paddingLeft + node.paddingRight;
    bbox.height += node.paddingTop + node.paddingBottom;
    labelGroup.attr("transform", "translate(" +
      ((node.paddingLeft - node.paddingRight) / 2) + "," +
      ((node.paddingTop - node.paddingBottom) / 2) + ")");

    var shapeSvg = shape(d3.select(this), bbox, node);
    util.applyStyles(shapeSvg, node, "style");
    if (node.class) {
      var prevClass = thisGroup.attr("class");
      thisGroup.attr("class", node.class + (prevClass ? " " + prevClass : ""));
    }

    var shapeBBox = shapeSvg.node().getBBox();
    node.width = shapeBBox.width;
    node.height = shapeBBox.height;
  });

  svgNodes.exit().remove();

  return svgNodes;
}

@@ -809,24 +809,201 @@
 getBBox();%0A%0A
+    thisGroup.attr(%22class%22, %22node %22 +%0A                            (thisGroup.classed(%22update%22) ? %22update %22 : %22%22) +%0A                            (node.class ? node.class : %22%22));%0A%0A
     if (_.ha
@@ -1497,163 +1497,8 @@
 e%22);
-%0A    if (node.class) %7B%0A      var prevClass = thisGroup.attr(%22class%22);%0A      thisGroup.attr(%22class%22, node.class + (prevClass ? %22 %22 + prevClass : %22%22));%0A    %7D
 %0A%0A  

Rewrite styles on render in createNodes