anchor.diff:      div.tab-pane(id="nodetab-{{ uuid }}")
         p Welcome to node {{ uuid }}
         div(id="{{ chartid_cpu }}",style="width:300px")
  +      div(id="{{ chartid_mem }}",style="width:300px")
  +      div(id="{{ chartid_swap }}",style="width:300px")
   append compileTemplates
     | templates.nodetab = Handlebars.compile($('#t-nodetab').html());
     | templates.nodetabpane = Handlebars.compile($('#t-nodetabpane').html());
  
positive.code:   |   
    |   // Add new tab content
    |   var cpuchartid = 'chart-nodecpu-' + node_uuid;
    |   var target = $('#navcontent div.tab-pane:last');
    |   var html = templates.nodetabpane({uuid: node_uuid, chartid_cpu: cpuchartid});
    |   target.after(html);
    |   
    |   // Setup CPU charting
  
negative.code:   |   c.data.addColumn('number', 'Idle');
    |   c.chart = new google.visualization.LineChart($('#' + cpuchartid)[0]); 
    |   c.chart.draw(c.data, c.options);
    |   
    |   // Setup Memory charting
    |   clasp.charts[memchartid] = {};
    |   var m = clasp.charts[memchartid];
    |   m.options = {
    |     title: 'Node Memory',
    |     curveType: 'function',
    |     legend: { position: 'bottom' }
    |   };
    |   m.data = new google.visualization.DataTable();
    |   m.data.addColumn('datetime', 'Time');
    |   m.data.addColumn('number', 'Free');
    |   m.data.addColumn('number', 'Used');
    |   m.chart = new google.visualization.LineChart($('#' + memchartid)[0]); 
    |   m.chart.draw(m.data, m.options);
    |   
    |   // Setup Swap charting
    |   clasp.charts[swapchartid] = {};
    |   var s = clasp.charts[swapchartid];
    |   s.options = {
    |     title: 'Node Swap',
    |     curveType: 'function',
    |     legend: { position: 'bottom' }
    |   };
    |   s.data = new google.visualization.DataTable();
    |   s.data.addColumn('datetime', 'Time');
    |   s.data.addColumn('number', 'Used');
    |   s.data.addColumn('number', 'Total');
    |   s.chart = new google.visualization.LineChart($('#' + swapchartid)[0]); 
    |   s.chart.draw(s.data, s.options);
    |  
    |   // Setup active rendering for all node charts
    |   var metricsChannelName = '/node/' + node_uuid + '/metrics';
    |   var metricsChannel = clasp.pubsub.channel(metricsChannelName);
    |   metricsChannel.addEventListener('message', function(dataObject) {
    |     console.log('Got node metrics update');
    |     console.log(dataObject);
    |     var update = $.parseJSON(dataObject.data);
    |     if (!(update.pageOut === undefined)) {
    |       // This is a swap update
    |       s.data.addRow([new Date(), update.free, update.total]);
    |       s.chart.draw(s.data, s.options);
    |     } else if (!(update.ram === undefined)) {
    |       // This is a memory update
    |       m.data.addRow([new Date(), update.freePercent, update.usedPercent]);
    |       m.chart.draw(m.data, m.options);
    |     } else {
    |       // This is a CPU update
    |       c.data.addRow([new Date(), update.sys, update.user, update.stolen, update.idle]);
    |       c.chart.draw(c.data, c.options);
    |     }
    |   });
    |    
    |   if (!clasp.metaPressed)
  