hooking up switch up/down stuff
diff --git a/web/ons-demo/js/app.js b/web/ons-demo/js/app.js
index 8cb50ef..92dd37e 100644
--- a/web/ons-demo/js/app.js
+++ b/web/ons-demo/js/app.js
@@ -311,13 +311,10 @@
 		var dstDPID = link['dst-switch'];
 
 		var srcMap = linkMap[srcDPID] || {};
-		var dstMap = linkMap[dstDPID] || {};
 
-		srcMap[dstDPID] = true;
-		dstMap[srcDPID] = true;
+		srcMap[dstDPID] = link;
 
 		linkMap[srcDPID]  = srcMap;
-		linkMap[dstDPID]  = dstMap;
 	});
 	return linkMap;
 }
@@ -330,7 +327,7 @@
 	var linkMap = createLinkMap(model);
 //	var flowMap = createFlowMap(model);
 
-	function mouseOver(data) {
+	function mouseOverSwitch(data) {
 		if (data.highlighted) {
 			return;
 		}
@@ -370,7 +367,7 @@
 		node.moveToFront();
 	}
 
-	function mouseOut(data) {
+	function mouseOutSwitch(data) {
 		if (data.mouseDown)
 			return;
 
@@ -381,11 +378,32 @@
 		data.target = false;
 	}
 
-	function mouseDown(data) {
-		mouseOver(data);
+	function mouseDownSwitch(data) {
+		mouseOverSwitch(data);
 		data.mouseDown = true;
 	}
 
+	function mouseUpSwitch(data) {
+		if (data.mouseDown) {
+			data.mouseDown = false;
+			d3.event.stopPropagation();
+		}
+	}
+
+	function doubleClickSwitch(data) {
+		if (data.state == 'ACTIVE') {
+			var prompt = 'Deactivate ' + data.dpid + '?';
+			if (confirm(prompt)) {
+				switchDown(data);
+			}
+		} else {
+			var prompt = 'Activate ' + data.dpid + '?';
+			if (confirm(prompt)) {
+				switchUp(data);
+			}
+		}
+	}
+
 	function ringEnter(data, i) {
 		if (!data.length) {
 			return;
@@ -424,9 +442,15 @@
 			});
 
 		// setup the mouseover behaviors
-		nodes.on('mouseover', mouseOver);
-		nodes.on('mouseout', mouseOut);
-		nodes.on('mousedown', mouseDown)
+		nodes.on('mouseover', mouseOverSwitch);
+		nodes.on('mouseout', mouseOutSwitch);
+		nodes.on('mouseup', mouseUpSwitch);
+		nodes.on('mousedown', mouseDownSwitch);
+
+		// only do switch up/down for core switches
+		if (i == 2) {
+			nodes.on('dblclick', doubleClickSwitch);
+		}
 	}
 
 	// append switches
@@ -441,7 +465,7 @@
 				return data.dpid;
 			});
 		nodes.select('circle').attr('class', function (data, i)  {
-				if (data.state === 'ACTIVE') {
+				if (data.state === 'ACTIVE' && data.controller) {
 					return data.className + ' ' + controllerColorMap[data.controller];
 				} else {
 					return data.className + ' ' + 'colorInactive';
@@ -462,7 +486,7 @@
 		function clearHighlight() {
 			svg.selectAll('circle').each(function (data) {
 				data.mouseDown = false;
-				mouseOut(data);
+				mouseOutSwitch(data);
 			})
 		};
 
@@ -493,12 +517,20 @@
 				if (map && map[dstData.dpid]) {
 					var prompt = 'Remove link between ' + srcData.dpid + ' and ' + dstData.dpid + '?';
 					if (confirm(prompt)) {
-						linkDown(srcData, dstData);
+						linkDown(map[dstData.dpid]);
 					}
 				} else {
-					var prompt = 'Create link between ' + srcData.dpid + ' and ' + dstData.dpid + '?';
-					if (confirm(prompt)) {
-						linkUp(srcData, dstData);
+					map = linkMap[dstData.dpid];
+					if (map && map[srcData.dpid]) {
+						var prompt = 'Remove link between ' + dstData.dpid + ' and ' + srcData.dpid + '?';
+						if (confirm(prompt)) {
+							linkDown(map[srcData.dpid]);
+						}
+					} else {
+						var prompt = 'Create link between ' + srcData.dpid + ' and ' + dstData.dpid + '?';
+						if (confirm(prompt)) {
+							linkUp(srcData, dstData);
+						}
 					}
 				}
 			}
@@ -654,7 +686,7 @@
 	// this should never be needed
 	// controllers.exit().remove();
 
-	controllers.on('click', function (c, index) {
+	controllers.on('click', function (c) {
 		var allSelected = true;
 		for (var key in controllerColorMap) {
 			if (!d3.select(document.body).classed(controllerColorMap[key] + '-selected')) {
@@ -675,6 +707,8 @@
 		// var selected = d3.select(document.body).classed(controllerColorMap[c] + '-selected');
 		// d3.select(document.body).classed(controllerColorMap[c] + '-selected', !selected);
 	});
+
+
 }
 
 function sync(svg, selectedFlowsView) {
diff --git a/web/ons-demo/js/controller.js b/web/ons-demo/js/controller.js
index 86a7905..b61b2d4 100644
--- a/web/ons-demo/js/controller.js
+++ b/web/ons-demo/js/controller.js
@@ -1,26 +1,48 @@
-var controllerFunctions = {
-	link: function (cmd, src, dst) {
-		var url = '/proxy/gui/link/' + [cmd, src.dpid, 1, dst.dpid, 1].join('/');
-		d3.json(url, function (error, result) {		
-			if (error) {
-				alert(url + ' : ' + error.status);
-			}
-		});
-	}
+/*global d3*/
+
+function callURL(url) {
+	d3.text(url, function (error, result) {
+		if (error) {
+			alert(url + ' : ' + error.status);
+		} else {
+			console.log(result);
+		}
+	});
 }
 
 
+var controllerFunctions = {
+	l: function (cmd, link) {
+		var url = '/proxy/gui/link/' + [cmd, link['src-switch'], link['src-port'], link['dst-switch'], link['dst-port']].join('/');
+		callURL(url);
+
+	},
+	s: function (cmd, s) {
+		var url = '/proxy/gui/switch/' + [cmd, s.dpid].join('/');
+		callURL(url);
+	}
+};
+
+
 // if (parseURLParameters().mock) {
 // 	urls = mockURLs;
 // }
 
 
-function linkUp(src, dst) {
-	controllerFunctions.link('up', src, dst);
+function linkUp(link) {
+	controllerFunctions.l('up', link);
 }
 
-function linkDown(src, dst) {
-	controllerFunctions.link('down', src, dst);
+function linkDown(link) {
+	controllerFunctions.l('down', link);
+}
+
+function switchUp(s) {
+	controllerFunctions.s('up', s);
+}
+
+function switchDown(s) {
+	controllerFunctions.s('down', s);
 }
 
 function createFlow(src, dst) {
diff --git a/web/topology_rest.py b/web/topology_rest.py
index 4409893..3d0a6d3 100755
--- a/web/topology_rest.py
+++ b/web/topology_rest.py
@@ -74,12 +74,13 @@
 
 ## PROXY API (allows development where the webui is served from someplace other than the controller)##
 ONOS_GUI3_HOST="http://gui3.onlab.us:8080"
+ONOS_GUI3_CONTROL_HOST="http://gui3.onlab.us:8081"
 ONOS_LOCAL_HOST="http://localhost:8080" ;# for Amazon EC2
 
 @app.route("/proxy/gui/link/<cmd>/<src_dpid>/<src_port>/<dst_dpid>/<dst_port>")
 def proxy_link_change(cmd, src_dpid, src_port, dst_dpid, dst_port):
   try:
-    command = "curl -s %s/gui/link/%s/%s/%s/%s/%s" % (ONOS_GUI3_HOST, cmd, src_dpid, src_port, dst_dpid, dst_port)
+    command = "curl -s %s/gui/link/%s/%s/%s/%s/%s" % (ONOS_GUI3_CONTROL_HOST, cmd, src_dpid, src_port, dst_dpid, dst_port)
     print command
     result = os.popen(command).read()
   except:
@@ -89,7 +90,18 @@
   resp = Response(result, status=200, mimetype='application/json')
   return resp
 
+@app.route("/proxy/gui/switch/<cmd>/<dpid>")
+def proxy_switch_status_change(cmd, dpid):
+  try:
+    command = "curl -s %s/gui/switch/%s/%s" % (ONOS_GUI3_CONTROL_HOST, cmd, dpid)
+    print command
+    result = os.popen(command).read()
+  except:
+    print "REST IF has issue"
+    exit
 
+  resp = Response(result, status=200, mimetype='application/json')
+  return resp
 
 @app.route("/wm/core/topology/switches/all/json")
 def switches():
@@ -118,7 +130,7 @@
 
   try:
     command = "curl -s %s/wm/core/topology/links/json" % (host)
-#    print command
+    print command
     result = os.popen(command).read()
   except:
     print "REST IF has issue"