The markup and javascript used to build this page can be found here.