GUI -- Fixed link lookup bug when removing links.
 - fixed and extended the 'startup' test scenario  to show device coming online (and links added), followed by device going offline (and links removed).

Change-Id: I58f79b5b16d37504793f36db9959f8c3c26b5261
diff --git a/web/gui/src/main/webapp/topo2.js b/web/gui/src/main/webapp/topo2.js
index 94b2e9e..701f914 100644
--- a/web/gui/src/main/webapp/topo2.js
+++ b/web/gui/src/main/webapp/topo2.js
@@ -30,6 +30,7 @@
     // configuration data
     var config = {
         useLiveData: true,
+        fnTrace: true,
         debugOn: false,
         debug: {
             showNodeXY: true,
@@ -180,6 +181,11 @@
         return config.debugOn && config.debug[what];
     }
 
+    function fnTrace(msg, id) {
+        if (config.fnTrace) {
+            console.log('FN: ' + msg + ' [' + id + ']');
+        }
+    }
 
     // ==============================
     // Key Callbacks
@@ -220,7 +226,7 @@
         var v = scenario.view,
             frame;
         if (stack.length === 0) {
-            v.alert('Error:\n\nNo event #' + evn + ' found.');
+            v.alert('Oops!\n\nNo event #' + evn + ' found.');
             return;
         }
         frame = stack.shift();
@@ -334,6 +340,7 @@
     function logicError(msg) {
         // TODO, report logic error to server, via websock, so it can be logged
         network.view.alert('Logic Error:\n\n' + msg);
+        console.warn(msg);
     }
 
     var eventDispatch = {
@@ -350,6 +357,7 @@
     };
 
     function addDevice(data) {
+        fnTrace('addDevice', data.payload.id);
         var device = data.payload,
             nodeData = createDeviceNode(device);
         network.nodes.push(nodeData);
@@ -359,6 +367,7 @@
     }
 
     function addLink(data) {
+        fnTrace('addLink', data.payload.id);
         var link = data.payload,
             lnk = createLink(link);
         if (lnk) {
@@ -370,6 +379,7 @@
     }
 
     function addHost(data) {
+        fnTrace('addHost', data.payload.id);
         var host = data.payload,
             node = createHostNode(host),
             lnk;
@@ -388,6 +398,7 @@
     }
 
     function updateDevice(data) {
+        fnTrace('updateDevice', data.payload.id);
         var device = data.payload,
             id = device.id,
             nodeData = network.lookup[id];
@@ -400,6 +411,7 @@
     }
 
     function updateLink(data) {
+        fnTrace('updateLink', data.payload.id);
         var link = data.payload,
             id = link.id,
             linkData = network.lookup[id];
@@ -412,6 +424,7 @@
     }
 
     function updateHost(data) {
+        fnTrace('updateHost', data.payload.id);
         var host = data.payload,
             id = host.id,
             hostData = network.lookup[id];
@@ -424,6 +437,7 @@
     }
 
     function removeLink(data) {
+        fnTrace('removeLink', data.payload.id);
         var link = data.payload,
             id = link.id,
             linkData = network.lookup[id];
@@ -435,6 +449,7 @@
     }
 
     function showPath(data) {
+        fnTrace('showPath', data.payload.id);
         var links = data.payload.links,
             s = [ data.event + "\n" + links.length ];
         links.forEach(function (d, i) {
@@ -883,7 +898,7 @@
         // remove from links array
         var idx = find(linkData.id, network.links);
 
-        network.links.splice(linkData.index, 1);
+        network.links.splice(idx, 1);
         // remove from SVG
         updateLinks();
     }
@@ -1058,13 +1073,12 @@
         d3.json(urlSc, function(err, data) {
             var p = data && data.params || {},
                 desc = data && data.description || null,
-                intro;
+                intro = data && data.title;
 
             if (err) {
                 view.alert('No scenario found:\n\n' + urlSc + '\n\n' + err);
             } else {
                 sc.params = p;
-                intro = "Scenario loaded: " + ctx + '\n\n' + data.title;
                 if (desc) {
                     intro += '\n\n  ' + desc.join('\n  ');
                 }