** April 8, 2013 **
- map view
- onos nodes at top
- count only active switches in header
- hook up switchctrl all and local actions
- various small ui improvements (hover feedback, flow chooser animation e.g.)
- splash screen and use vector graphics for on.lab logo
- only show "marching ants" animation when iperf data is flowing
- NOTE: the map view dynamically sizes with browser resize. so no need to refresh after resizing anymore


** April 8, 2013 **
- add explicit timeout logic so that the GUI doesn't have to be refreshed if the API misbehaves

** April 8, 2013 **
- merge from master
- fix gradually increasing latency of iperf data display

** April 4, 2013 **
- denser iperf display
- don't pop alert on command error response. just log it

** April 4, 2013 **
iperf display implemented
- scaled to 50,000,000
- update rate is every 2s
- the display does not draw until receiving 2 buffers of data (this way if there is a stale buffer it doesn't get displayed)
- duration is 10000 seconds. seems like there is no need for a button to restart?
- displaying 10s data
- if the data underruns (either because the server response is too slow or because the iperf data stops being updated) the display draws 0s
- seeing the data stall a lot (timestamp and end-time remain the same through many fetches)

** April 4, 2013 **
Fix issues:
	305 - "close x" now unselects flow. double click to delete a flow
	323 - gui now recovers on timeout errors and polls again
	324 - fixed problem with added flows not displaying
	325 - fixed logic displaying flows in topology view

** March 28, 2013 **
- add and delete flow implemented
- to add flow
	- mouse down in src edge switch
	- drag to dst edge switch
	- release/confirm to create flow
- to delete flow
	- select flow in flow chooser
	- click "close" button in flow table
	- confirm
- same "pending" style as other actions

** March 28, 2013 **
- basic flow chooser
	- click in "eye" to show full list
	- click on "eye" in full list to monitor that flow in the top slot (and show the flow in topology)
		- other flows get pushed down one slot
		- when a flow is pushed off the list, it is no longer displayed in topology
- bug fix for link disappearing after being added
- color improvements
- draw vector while linking to make it clearer what's going to happen

** March 27, 2013 **
- click onos node "eye" icon to highlight switches associated with that controller
- double click onos node else where to activate/deactivate
- double click core switch to activate/deactivate
- mouse down on switch, drag to other switch, mouse up to make link up/down
	allowed links are
		aggregation->core (link up/down)
		core->core (link up/down)
- pending states for links, switches and controllers after executing command
	object pulses until state change or timeout (12s)
- merge from upstream/master

** March 25, 2013 **
- First pass at flow chooser
	- Uses mock data
	- Select flow to show the flow in topology view
	- Selected flow currently always shows "marching ants" Once iperf is setup the movement will only be when there is iperf traffic
	- Still need to do popup flow chooser to "monitor" flows in the flow panel

** March 23, 2013 **
- Link and switch state updates dynamically
- Link direction is indicated with arrow heads

** March 22, 2013 **
- Workarounds for Chrome v25 rendering bugs
- Fixed broken proxy functionality in restapi2.py
- webui should now work when hosted from a different server than the controller (where it uses gui3.onlab.us:8080) and also when run from the same server (where it uses localhost:8080)

** March 20, 2013 **
- URL parameters control functions as follows:
	http://localhost:9000/ons-demo/index.html
		uses the ONOS_HOST defined in restapi2.py. currently http://gui3.onlab.us:8080
	http://localhost:9000/ons-demo/index.html?proxy
		uses the index.html host to proxy to ONOS_HOST (works around cross site scripting restrictions to allow the WebUI to be served from a different server than the one that hosts the controller)
	http://localhost:9000/ons-demo/index.html?mock
		uses the mock JSON responses under ons-dmo/data
- clicking a controller behavior change
	1) if all controllers are selected, deselects all controllers except the one clicked
	2) if only the clicked controller is selected, selects all controllers again
- Update configuration files to match test bed
- Update sample JSON files from test bed

** March 19, 2013 **
- aggregation switch sample data DPIDs do not match official switch config.
	- switch config hacked 00:00:00:00:00:00:01:01 ==> 00:00:00:00:00:00:01:00 etc.
- layout does not dynamically adjust when window is resized
	- refresh browser window after resizing to fix layout
